Вывести на экран ФИО тех студентов две оценки у которых 3 - Free Pascal
Формулировка задачи:
Составить список из 15 студентов, для каждого указать ФИО и оценки с 4 экзаменов. Составить программу , которая будет вводить данные для каждого студента заносить их в список и делать обработку (Вывести на экран ФИО тех студентов две оценки у которых 3)
Прощу прощение за ошибку в описании темы , там не двоих с тройками, а тех у кого 2 оценки с экзаменов тройки.
Решение задачи: «Вывести на экран ФИО тех студентов две оценки у которых 3»
textual
Листинг программы
uses crt;
const n=5;{15 количество студентов}
nazvanie:array[1..4] of string=('математика','физика','химия','информатика');
type otmetki=array[1..4] of byte;
student=record
name:string;
ot:otmetki;
end;
ukaz=^s;
s=record
inf:student;
next:ukaz;
end;
var u,hv,tmp:ukaz;
i,j,k:integer;
procedure vivod(head:ukaz);
var tmp:ukaz;
i:integer;
begin
write('+');
for i:=1 to 5 do write('-----------+');writeln;
write('| фамилия |');
for i:=1 to 4 do write(nazvanie[i]:11,'|');writeln;
write('+');
for i:=1 to 5 do write('-----------+');writeln;
tmp:=head;
while tmp<>nil do
begin
with tmp^.inf do
begin
write('|',name:11,'|');
for i:=1 to 4 do write(ot[i]:11,'|');writeln;
end;
tmp:=tmp^.next
end;
write('+');
for i:=1 to 5 do write('-----------+');writeln;
end;
begin
clrscr;
u:=nil;
new(u);
u^.next:=nil;
with u^.inf do
begin
writeln('1 студент');
write('Фамилия: ');readln(name);
for i:=1 to 4 do
begin
write(nazvanie[i],': ');
readln(ot[i]);
end
end;
clrscr;
hv:=u;
for i:=2 to n do
begin
new(tmp);
hv^.next:=tmp;
tmp^.next:=nil;
with tmp^.inf do
begin
writeln(i,' студент');
write('Фамилия: ');readln(name);
for j:=1 to 4 do
begin
write(nazvanie[j],': ');readln(ot[j]);
end;
end;
hv:=tmp;
clrscr;
end;
writeln('все студенты');
vivod(u);
writeln('студенты у которых за экзамены две оценки: 3');
tmp:=u;
while tmp<>nil do
begin
k:=0;
with tmp^.inf do
begin
for i:=1 to 4 do if ot[i]=3 then inc(k);
if k=2 then writeln(name)
end;
tmp:=tmp^.next
end;
readln
end.
Объяснение кода листинга программы
- В начале кода объявлены основные переменные:
- n - количество студентов (5);
- nazvanie - массив из 4 строк, содержащих названия предметов (математика, физика, химия, информатика);
- otmetki - массив из 4 байтов, содержащих оценки студентов;
- student - тип записи, представляющий одного студента (имя и оценки);
- ukaz - указатель на тип записи student;
- s - тип записи, представляющий связный список студентов;
- u, hv, tmp - указатели на тип записи s;
- i, j, k - целочисленные переменные для цикла;
- procedure vivod(head:ukaz) - процедура вывода информации о студентах на экран;
- var tmp:ukaz; - временная переменная для хранения текущего элемента списка;
- begin - начало блока кода;
- writeln('все студенты'); - вывод информации о всех студентах;
- readln('Фамилия: ') - ввод фамилии студента;
- readln(ot[i]:11) - ввод оценок студента;
- if k=2 then writeln(name) - вывод фамилии студента, если у него две оценки 3.
- Код начинается с инициализации переменных и создания первого студента:
- clrscr - очистка экрана;
- u:=nil;
- new(u) - выделение памяти под первого студента;
- u^.next:=nil;
- with u^.inf do - начало блока кода для первого студента;
- writeln('1 студент'); - вывод информации о первом студенте;
- readln(name) - ввод фамилии первого студента;
- readln(ot[i]:11) - ввод оценок первого студента.
- Затем код создает остальных студентов и выводит информацию о них:
- for i:=2 to n do - цикл создания остальных студентов;
- new(tmp) - выделение памяти под текущего студента;
- hv^.next:=tmp - добавление текущего студента в список;
- with tmp^.inf do - начало блока кода для текущего студента;
- writeln(i,' студент'); - вывод информации о текущем студенте;
- readln(name) - ввод фамилии текущего студента;
- readln(ot[i]:11) - ввод оценок текущего студента.
- После этого код проверяет оценки всех студентов и выводит фамилии тех, у кого две оценки 3:
- tmp:=u;
- while tmp<>nil do - цикл по всем студентам;
- begin
- k:=0;
- with tmp^.inf do - начало блока кода для текущего студента;
- for i:=1 to 4 do if ot[i]=3 then inc(k);
- if k=2 then writeln(name);
- end;
- tmp:=tmp^.next;
- readln.