Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Однонаправленный список (Студенты)

Автор: Наташа 13.10.2007 7:49

Помогите, пожалуйста, не могу никак найти ошибку. Замучалась, вроде всё правильно, но на четвёртом блоке программа сбивается.

М
Наташа, используй теги, пожалуйста (выделить текст, выбрать нужный тег в меню CODE). А вообще, такие большие тексты лучше прикреплять файлами.
-- Lapp



program Spisok;
uses crt;
type
oc=record
mat,ang,inf,alg,fiz:integer;
end;
tsp=^sp;
sp=record
next:tsp;
name:string[15];
voz:integer;
pol:char;
ocen:oc;
end;
var
head,head1,pl,pr:tsp;
k,n,m,i,u,j,g:integer;
yl,yr:tsp;
s:string;
MASS:array [1..100] of integer;
f1:text;
sl,sc,sr:tsp;
{1***********************}
begin
n:=6;
k:=0;
g:=0;
pr:=nil;
assign(f1,'stu.txt');
reset(f1);
if n=0 then writeln('” ©« stu.txt Їгбв') else for i:=1 to n do
begin
if k=0 then
begin
k:=k+1;
new(head);
readln(f1,head^.name); write(head^.name,' ');
readln(f1,head^.voz); write(head^.voz,' ');
readln(f1,head^.pol); write(head^.pol,' ');
readln(f1,head^.ocen.mat); write(head^.ocen.mat,' ');
readln(f1,head^.ocen.ang); write(head^.ocen.ang,' ');
readln(f1,head^.ocen.inf); write(head^.ocen.inf,' ');
readln(f1,head^.ocen.alg); write(head^.ocen.alg,' ');
readln(f1,head^.ocen.fiz); writeln(head^.ocen.fiz);
new(pr);
head^.next:=pr;
pl:=head;
end
else
begin
readln(f1,pr^.name); write(pr^.name,' ');
readln(f1,pr^.voz); write(pr^.voz,' ');
readln(f1,pr^.pol); write(pr^.pol,' ');
readln(f1,pr^.ocen.mat); write(pr^.ocen.mat,' ');
readln(f1,pr^.ocen.ang); write(pr^.ocen.ang,' ');
readln(f1,pr^.ocen.inf); write(pr^.ocen.inf,' ');
readln(f1,pr^.ocen.alg); write(pr^.ocen.alg,' ');
readln(f1,pr^.ocen.fiz); writeln(pr^.ocen.fiz);
if i<n then
begin
pl:=pr;
new(pr);
pl^.next:=pr;
end
else pr^.next:=nil;
end;
end;
pl:=nil;
{2***********************}
new(pr);
pr:=head;
pr^.next:=head^.next;
i:=0;
for i:=1 to n do
begin
if pr^.voz<=17 then
begin
writeln('(1) ');
write(pr^.name);
write(pr^.voz);
write(pr^.pol);
write(pr^.ocen.mat);
write(pr^.ocen.ang);
write(pr^.ocen.inf);
write(pr^.ocen.alg);
writeln(pr^.ocen.fiz);
break;
end
else
begin
if (pr^.voz<=15)or(pr^.voz>=80) then Writeln('ЋиЁЎ®з­л© ў®§а бв ў ЇЁбЄҐ');
if i = n then
begin
Writeln('‘в㤥­в®ў 17 «Ґв Ё ¬« ¤иҐ ­Ґв ў бЇбЄҐ');
break;
end
else
begin
pr:=pr^.next;
end;
end;
end;
pr:=nil;
{3************************}
new(sl);
sl:=head;
sr:=sl^.next;k:=0;
if (head^.pol='m') then
Begin
new(sc);
sc:=head;
head:=sl^.next;

end
else
while (sr<>nil) do
if (sr^.pol='m') then
Begin
sl^.next:=sr^.next;
dispose(sr);
sl:=nil;
end
else
begin
sl:=sr;
sr:=sr^.next; k:=k+1;
end;

{4************************}
if k<>n then n:=n-1 else writeln('Њг¦зЁ­ ­Ґв ў бЇЁбЄҐ');
new(pl);
new(pr);
new(head1);
pr:=head;
pr^.next:=head^.next;
i:=0;
for i:=1 to n do
begin
if i<>1 then pr:=pr^.next;
mass[i]:=(pr^.ocen.mat + pr^.ocen.ang + pr^.ocen.inf + pr^.ocen.alg + pr^.ocen.fiz);
writeln(mass[i]);
end;
pr:=nil;
for i:=1 to n do
begin
m:=0;
for j:=1 to n do
begin
if mass[j]>m then
begin
k:=j;
m:=mass[j];
end;
end;
writeln(k);

pr:=head;

while j<=(k-1) do
Begin
sr:=pr^.next;
pr:=sr;
j:=j+1;
end;
write(pr^.name);
write(pr^.voz);
write(pr^.pol);
write(pr^.ocen.mat);
write(pr^.ocen.ang);
write(pr^.ocen.inf);
write(pr^.ocen.alg);
writeln(pr^.ocen.fiz);

if i=1 then head1:=pr
else
if i<n then
if i=2 then
begin pl:=pr; head1^.next:=pl;
end
else
if g=0 then
begin new(sl); sl:=pr; pl^.next:=sl; g:=g+1;
end
else
begin new(pl); pl:=pr; sl^.next:=pl; g:=g-1;
end
else
begin
if g=0 then pl^.next:=pr else sl^.next:=pr;
pr^.next:=nil;
end;
mass[k]:=0;
end;
head:=head1;
head^.next:=head1^.next;
head1:=nil;

{5************************}
new(pr);
pr:=head;
pr^.next:=head^.next;
for i:=1 to n do
begin
write(pr^.name);
write(pr^.voz);
write(pr^.pol);
write(pr^.ocen.mat);
write(pr^.ocen.ang);
write(pr^.ocen.inf);
write(pr^.ocen.alg);
writeln(pr^.ocen.fiz);
if i = n then
begin
break;
end
else
begin
pr:=pr^.next;
end;
end;
pr:=nil;

{*************************}
close(f1);
readln;
end.



Прикрепленные файлы
Прикрепленный файл  stu.txt ( 270 байт ) Кол-во скачиваний: 228

Автор: Наташа 13.10.2007 7:51

Вот условие задачи:

Информация о студенте состоит из его фамилии, возраста (число лет), пола и успеваемости (оценки по пяти предметам). Ввести информацию о группе студентов, представляя ее в виде связанного одностороннего списка. Один элемент списка содержит информацию об одном студенте.
А). Найти студента первого по порядку студента, возраст которого менее 17 лет.
Б). Удалить из списка первого по порядку мужчину.
В). Переупорядочить данный список по убыванию суммы оценок каждого студента по всем предметам.

Автор: Lapp 13.10.2007 13:56

Работа с динамической памятью требует очень большой аккуратности.
Вот, например, у тебя бывают строки типа таких:

     pr:=head;
pr^.next:=head^.next;

Зачем это? после выполнения первой из них, вторая имеет не больше смысла, чем a:=a

В результате такого вот присваивания ты портишь себе head (записываешь nil в его next). Это происходит в строчке 190. Ты там работаешь с pr^, но это на самом деле есть head^, поскольку pr=head.

При работе со списками будь максимально внимательна. И используй отладчик smile.gif

Автор: volvo 13.10.2007 14:40

Кстати, Наташа, есть 2 вопроса:

во-первых, почему не выделить чтение одной записи из файла в отдельную процедуру? (тем самым ты избежишь дублирования кода - у тебя же целый кусок из 8 строк в точности повторяется 2 раза, плюс проверки разные не нужные можно будет убрать...)

А во-вторых - откуда такое стремление не выделять память по мере необходимости (перед тем, как читать из файла - запрашиваешь New()), а брать память для n+1-го шага на n-ом (заранее)? Структура программы от этого лучше не становится...

(про то что можно запихать все оценки в массив из 5 элементов и еще больше структурировать программу я пока не говорю, это - если захочешь - потом).

Автор: Наташа 14.10.2007 13:17

Спасибо ребята, я нашла ошибку, теперь всё работает!



Код
program Spisok;
uses crt;
type
   oc=record
    mat,ang,inf,alg,fiz:integer;
   end;
   tsp=^sp;
   sp=record
    next:tsp;
    name:string[15];
    voz:integer;
    pol:char;
    ocen:oc;
   end;
var
  head,head1,pl,pr:tsp;
  k,n,m,i,u,j,g:integer;
  yl,yr:tsp;
  s:string;
  MASS:array [1..100] of integer;
  f1:text;
  sl,sc,sr:tsp;
{1***********************}
begin
   n:=6;
   k:=0;
   g:=0;
   pr:=nil;
   assign(f1,'stu.txt');
   reset(f1);
   if n=0 then writeln('” ©« stu.txt Їгбв') else for i:=1 to n do
  begin
    if k=0 then
   begin
     k:=k+1;
     new(head);
    readln(f1,head^.name); write(head^.name,' ');
    readln(f1,head^.voz); write(head^.voz,' ');
    readln(f1,head^.pol); write(head^.pol,' ');
    readln(f1,head^.ocen.mat); write(head^.ocen.mat,' ');
    readln(f1,head^.ocen.ang); write(head^.ocen.ang,' ');
    readln(f1,head^.ocen.inf); write(head^.ocen.inf,' ');
    readln(f1,head^.ocen.alg); write(head^.ocen.alg,' ');
    readln(f1,head^.ocen.fiz); writeln(head^.ocen.fiz);
     new(pr);
     head^.next:=pr;
     pl:=head;
   end
    else
   begin
    readln(f1,pr^.name); write(pr^.name,' ');
    readln(f1,pr^.voz); write(pr^.voz,' ');
    readln(f1,pr^.pol); write(pr^.pol,' ');
    readln(f1,pr^.ocen.mat); write(pr^.ocen.mat,' ');
    readln(f1,pr^.ocen.ang); write(pr^.ocen.ang,' ');
    readln(f1,pr^.ocen.inf); write(pr^.ocen.inf,' ');
    readln(f1,pr^.ocen.alg); write(pr^.ocen.alg,' ');
    readln(f1,pr^.ocen.fiz); writeln(pr^.ocen.fiz);
    if i<n then
     begin
       pl:=pr;
       new(pr);
       pl^.next:=pr;
     end
    else pr^.next:=nil;
   end;
  end;
   pr:=nil;
   pl:=nil;
{2***********************}
     pr:=head;
     i:=0;
  for i:=1 to n do
   begin
     if pr^.voz<=17 then
    begin
      writeln('(1) ');
      write(pr^.name);
      write(pr^.voz);
      write(pr^.pol);
      write(pr^.ocen.mat);
      write(pr^.ocen.ang);
      write(pr^.ocen.inf);
      write(pr^.ocen.alg);
      writeln(pr^.ocen.fiz);
      break;
    end
     else
    begin
      if (pr^.voz<=15)or(pr^.voz>=80) then Writeln('ЋиЁЎ®з­л© ў®§а бв ў ЇЁбЄҐ');
      if i = n then
     begin
       Writeln('‘в㤥­в®ў 17 «Ґв Ё ¬« ¤иҐ ­Ґв ў бЇбЄҐ');
       break;
     end
      else
     begin
       pr:=pr^.next;
     end;
    end;
   end;
     pr:=nil;
{3************************}
  writeln('(2) ');
  sl:=head;
  sr:=head^.next;
  k:=0;
  if (head^.pol='m') then
    Begin
     dispose(head);
     head:=sr;
     sc:=nil;
     sl:=nil; sr:=nil;
    end
  else
    while (sr<>nil) do
     if (sr^.pol='m') then
      Begin
        sl^.next:=sr^.next;
        dispose(sr);
        sl:=nil;
        sr:=nil;
      end
     else
      begin
       sl:=sr;
       sr:=sr^.next; k:=k+1;
      end;
  sl:=nil;
  sr:=nil;
{4************************}
     writeln('(3) ');
     if k<>n then n:=n-1 else writeln('Њг¦зЁ­ ­Ґв ў бЇЁбЄҐ');
     pr:=head;
     i:=0;
  for i:=1 to n do
   begin
     if i<>1 then pr:=pr^.next;
     mass[i]:=(pr^.ocen.mat + pr^.ocen.ang + pr^.ocen.inf + pr^.ocen.alg + pr^.ocen.fiz);
   end;
     pr:=nil;
  for i:=1 to n do
   begin
    m:=0;
    for j:=1 to n do
     begin
      if mass[j]>m then
       begin
         k:=j;
         m:=mass[j];
       end;
     end;
    pr:=head;
    j:=0;
    while (j<(k-1)) do
      Begin
       pr:=pr^.next;
       j:=j+1;
      end;
    sr:=pr;
    new(pr);
    pr^:=sr^;
    if i=1 then
      begin
        head1:=pr;
        pr:=nil;
      end
    else
     if i<n then
        if i=2 then
         begin pl:=pr; head1^.next:=pl; pr:=nil;
         end
        else
         if g=0 then
          begin sl:=pr; pl^.next:=sl; g:=g+1; pr:=nil;
          end
         else
          begin pl:=pr; sl^.next:=pl; g:=g-1; pr:=nil;
          end
     else
      begin
        if g=0 then pl^.next:=pr else sl^.next:=pr;
        pr^.next:=nil;
      end;
    mass[k]:=0;
   end;
     head:=head1;
     head1:=nil;
     sl:=nil;
     sr:=nil;
     pl:=nil;
     pr:=nil;
{5************************}
   pr:=head;
  for i:=1 to n do
   begin
      write(pr^.name);
      write(pr^.voz);
      write(pr^.pol);
      write(pr^.ocen.mat);
      write(pr^.ocen.ang);
      write(pr^.ocen.inf);
      write(pr^.ocen.alg);
      writeln(pr^.ocen.fiz);
    if i = n then
     begin
       break;
     end
    else
     begin
       pr:=pr^.next;
     end;
   end;
     pr:=nil;

{*************************}
   close(f1);
   readln;
end.