Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Текст программы. { Программа Лабораторной работы N 9
Program Lab_9; { Программа Лабораторной работы N 9 Динамические переменные. Списки. Вариант N 31. А.Я.Умненькая, ст. гр. Я-007} TYPE data = record {описатель структуры данных студента} Name: string[15]; { поле для Фамилии И.О.} Bal1, Bal2: integer; {поля баллов за 2 семестра} SrBal: real; {поле для среднего балла } end; Pd=^Dek; {описатель указателей на вершины дека} Dek= record { описатель звена дека} P1: Pd; {поле указателя следующего звена от начала} P2: Pd; {поле указателя следующего звена от конца } Student: data; { поле данных студента} end; VAR Docum: data; {рабочая структура данных о студенте } DN, DK: Pd; { указатели на начало и конец дека } Fin, Fout: text; {Файлы входных данных и результатов работы} k: integer; { количество элементов дека} Procedure GetStud(Var F: text; var St: data); {процедура чтения одной записи файла и формирования данных студента} Var P, i: integer; Begin i: =0; P: =0; St.Name: ='---------------'; поле фамилии заполняем строкой из прочерков максимальной длины while P< 2 do {пока не прочтем второй пробел } begin inc(i); read(F, St.Name[i]); {читаем из файла по символу в поле имени } if St.Name[i]=' ' then P: =P+1; { подсчет пробелов} end; St.Name: =Copy(St.Name, 1, i); { Из полной строки поля фамилии вырезаем подстроку по второй пробел (включительно) и заносим обратно в поле фамилии } readln(F, St.Bal1, St.Bal2, St.SrBal); { остаток записи файла читаем в поля оценок } End; Procedure PutDek(Var NK, KN: Pd; Inf: data; Beg: boolean); {процедура добавления элемента в дек с заказанного конца} Var U: Pd; Begin New(U); U^.Student: =Inf; U^.P1: =nil; U^.P2: =nil; if NK=nil then { если дек перед этим был пуст } KN: =U else if Beg then { если добавляем в начало } begin U^.P1: =NK; NK^.P2: =U; end else { если добавляем в конец } begin U^.P2: =NK; NK^.P1: =U; end; NK: =U; End; Procedure DelDek(Var NK, KN: Pd; var Inf: data; Beg: boolean); {процедура выбора элемента из заказанного конца дека } Var U: Pd; Begin U: =NK; Inf: =U^.Student; if NK=KN then { если в деке был всего один элемент} begin { делаем дек пустым} KN: =nil; NK: =nil; end else if Beg then { если удаление из начала } begin NK: =U^.P1; NK^.P2: =nil; end else { если удаление из конца } begin NK: =U^.P2; NK^.P1: =nil; end; Dispose(U); { собственно освобождение памяти от элемента } End; Procedure ReadFile(Var F: text; Var DekN, DekK: Pd; var N: integer); { чтение файла с заполнением дека } Var Stud: data; Begin N: =0; While Not Eof(F) do begin GetStud(F, Stud); N: =N+1; if (Stud.Bal1=5) and (Stud.Bal2=5) then PutDek(DekN, DekK, Stud, TRUE) else if (Stud.Bal1=3) and (Stud.Bal2=3) then PutDek(DekK, DekN, Stud, FALSE) else { если данные не заносим в дек } N: =N-1; end; End; Procedure WriteFile(Var F: text; Var NK, KN: Pd; N: integer); { процедура распечатки дека в выводной файл с удалением дека} Var i: integer; Stud: data; Begin Writeln(F, '|--------------------------------------', '--------------|'); Writeln(F, '| N | Фамилия И.О. | 1-й балл | 2-й ', 'балл | Ср.балл |'); For i: =1 to N do begin Writeln(F, '|---|----------------|----------|----', '------|---------|'); DelDek(NK, KN, Stud, TRUE); WriteLn(F, '|', i: 2, ' | ', Stud.Name: 15, '|', Stud.Bal1: 6, ' |', Stud.Bal2: 6, ' |', Stud.SrBal: 6: 1, ' |'); end; Writeln(F, '|--------------------------------------', '--------------|'); End; BEGIN { ОСНОВНАЯ ПРОГРАММА } Assign(Fin, 'Dan.txt'); Reset(Fin); Assign(Fout, 'Umnik9.res'); ReWrite(Fout); DN: =nil; DK: =nil; k: =0; ReadFile(Fin, DN, DK, k); Close(Fin); With Docum do begin Bal1: =k; Bal2: =0; SrBal: =0.0; Name: ='Список типа S0D'; end; PutDek(DN, DK, Docum, TRUE); { добавление в начало дека записи со сводной информацией. } DelDek(DN, DK, Docum, TRUE); {Выбор из дека сводной информации для печати } Writeln(Fout, Docum.Name: 20, ' из ', Docum.Bal1, ' строк'); WriteFile(Fout, DN, DK, k); {печать дека в файл с удалением элементов дека} close(Fout); End. Варианты заданий Таблица 33. Варианты заданий лабораторной работы № 9
Литература
|