Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Текст программы. { Программа Лабораторной работы 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

№ вар. Требования к записям, выбираемым из файла и помещаемым в список Тип Списка Файл данных
  Средний балл выше 3 S2KI dan.dat
  Отличные оценки во всех полях S2KO dan.txt
  Первые буквы фамилий А, Б, В S0S dan.dat
  Оценки во всех полях ниже 4 баллов S0O dan.txt
  Первая оценка выше 3 S1L dan.dat
  Первая или вторая оценка выше 3 S1KI dan.txt
  Первая оценкой ниже 5, а вторая выше 3 S1KO dan.dat
  Первые буквы фамилий А, В, Е и средние оценки выше 3 S2L dan.txt
  Оценки 3 во всех полях оценок S2KI dan.dat
  Средние оценки выше 3 баллов S2KO dan.txt
  Вторая оценка выше 4, а первая выше 3 баллов S0S dan.dat
  Первая и вторая оценки выше 4 баллов S0O dan.txt
  В начало –со средней оценкой < 4 балла, в конец – прочие S0D dan.dat
  Первые буквы фамилий А, Б, В и средние оценки выше 4 S1L dan.txt
  Вторые и средние оценки выше 4 баллов S1KI dan.dat
  Первая оценка выше 3 баллов, а средняя оценка выше 3, 5 S1KO dan.txt
  Все оценки не ниже 4 баллов S2L dan.dat
  Вторая и средняя оценки выше 4 баллов S2KI dan.txt
  Средняя оценка выше 3, 5 баллов S2KO dan.dat
  Средняя оценка ниже 4, 5 и фамилии начинаются с букв А и В S0S dan.txt
  Средняя оценка выше 4 баллов и фамилии, начинаются с букв от А до К S0O dan.dat
  В начало – если первая оценка 3, в конец – если первая – 5 S0D dan.txt
  Первая оценка выше 3 балов, а средняя оценка 4 балла S1L dan.dat
  Все оценки выше 4 и фамилии начинаются с букв А - Е S1KI dan.txt
  Первая и средняя оценки выше 4 баллов S1KO dan.dat
  Все оценки ниже 5 баллов S2L dan.txt
  Первая или вторая оценка выше 4 баллов S2KI dan.dat
  Первая или средняя оценки ниже 4 баллов S2KO dan.txt
  Средняя оценка выше 4 баллов S0S dan.dat
  Все оценки выше 4 или фамилии начинаются с букв А - Е S0O dan.txt
  В начало – только с пятерками, в конец – только с тройками S0D dan.txt

Литература

  1. Бородич Ю.С., Вальвачев А.Н., Кузьмич А.И. Паскаль для персональных компьютеров: Справочне пособие. Минск: " Вышейшая школа", 1991.
  2. Епанешников А.М., Епанешников В.А. Программирование в среде Turbo Pascal 7.0 (третье издание). М.: " Диалог-МИФИ", 1996.
  3. Немнюгин С.А. Turbo Pascal: практикум. СПб.: Питер, 2001.
  4. Кнут Д. Искусство программирования для ЭВМ. /Пер. с англ.: В 3-х томах. т.3. Сортировки и поиск. М.: Мир, 1976.
  5. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся ВТУЗов (Изд. 13-е). М.: " Наука", 1986.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.013 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал