![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Наташа |
![]()
Сообщение
#1
|
|||
Гость ![]() |
Помогите, пожалуйста, не могу никак найти ошибку. Замучалась, вроде всё правильно, но на четвёртом блоке программа сбивается.
program Spisok; Прикрепленные файлы ![]() |
|||
Наташа |
![]()
Сообщение
#2
|
Гость ![]() |
Вот условие задачи:
Информация о студенте состоит из его фамилии, возраста (число лет), пола и успеваемости (оценки по пяти предметам). Ввести информацию о группе студентов, представляя ее в виде связанного одностороннего списка. Один элемент списка содержит информацию об одном студенте. А). Найти студента первого по порядку студента, возраст которого менее 17 лет. Б). Удалить из списка первого по порядку мужчину. В). Переупорядочить данный список по убыванию суммы оценок каждого студента по всем предметам. |
Lapp |
![]()
Сообщение
#3
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Работа с динамической памятью требует очень большой аккуратности.
Вот, например, у тебя бывают строки типа таких: pr:=head; Зачем это? после выполнения первой из них, вторая имеет не больше смысла, чем a:=a В результате такого вот присваивания ты портишь себе head (записываешь nil в его next). Это происходит в строчке 190. Ты там работаешь с pr^, но это на самом деле есть head^, поскольку pr=head. При работе со списками будь максимально внимательна. И используй отладчик ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Кстати, Наташа, есть 2 вопроса:
во-первых, почему не выделить чтение одной записи из файла в отдельную процедуру? (тем самым ты избежишь дублирования кода - у тебя же целый кусок из 8 строк в точности повторяется 2 раза, плюс проверки разные не нужные можно будет убрать...) А во-вторых - откуда такое стремление не выделять память по мере необходимости (перед тем, как читать из файла - запрашиваешь New()), а брать память для n+1-го шага на n-ом (заранее)? Структура программы от этого лучше не становится... (про то что можно запихать все оценки в массив из 5 элементов и еще больше структурировать программу я пока не говорю, это - если захочешь - потом). |
Наташа |
![]()
Сообщение
#5
|
Гость ![]() |
Спасибо ребята, я нашла ошибку, теперь всё работает!
Код 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. |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 6:58 |