• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите поправить программу. Pascal ABC

  • Автор темы Автор темы samoha
  • Дата начала Дата начала

samoha

Ученик
Регистрация
29 Май 2015
Сообщения
6
Реакции
0
Баллы
0
Помогите поправить программу. Pascal ABC

Всем доброго времени суток!
Есть такое условие задачи
Создайте файл, содержащий записи о 10 студентах из 3 групп.
Выведите на экран максимальный балл по 2-му предмету в каждой из 3 групп.
Получилось так:
Код:
type student=record
             name:string[10];
             group:integer;
             marks:array[1..5] of 2..5;
             end;
             
var f:file of student;
    gr:array[1..3] of integer;
    st:student;
    i,j,k:byte;
    x,max,ans:integer;
begin

writeln('Создать файл заново или открыть существующий? (1-создать, 2-открыть)');
repeat
readln(ans);
until ans in [1..2];
if (ans=1) then begin
assign(f,'student.txt');
rewrite(f);
gr[1]:=355;
gr[2]:=255;
gr[3]:=155;
for i:=1 to 3 do
 begin
  writeln('Введите 10 записей о студентах группы ',gr[i],':');
  j:=0;
  repeat
  j:=j+1;
  writeln('Студент ',j);
  with st do
   begin
    write('Фамилия: ');readln(name);
    group:=gr[i];
    writeln(' Введите 5 оценок студента от 2 до 5');
    for k:=1 to 5 do
    repeat
     write('  Оценка ',k,' ');
     readln(marks[k]);
    until marks[k] in [2..5];
    write(f,st);
   end;
  until j=10;
 end;
 close(f);
 end;

if (ans=2) then begin
writeln('Продолжить? Да(1)/Нет(2)');
 repeat
 readln(ans);
 until ans in [1..2];
while ans<>2 do begin
repeat
writeln('Выберите номер группы (1-3)');
readln(k);
until k in [1..3];
x:=gr[k];
writeln('Максимальный балл студентов группы  ',x,' по второму предмету');
while not eof(f) do
 begin
  reset(f);
  read(f,st);
  if st.group=x then
   begin
   max:=0;
    for i:=1 to 5 do
    if st.marks[2]>max then max:=st.marks[2];
   end;
   writeln(max);
   close(f);
 end;
 end;

 end;

readln
end.
Я попытался реализовать её без goto, но получилось не очень. Файл создаётся, после его заполнения программа завершается. Максимальную оценку не выводит, также не могу понять как программу зациклить на показ оценок из групп.
Заранее спасибо!
 
Максимальную оценку не выводит, также не могу понять как программу зациклить на показ оценок из групп.
Конечно, потому что куча ошибок. Вот, можно, например, так (отлажено):
Код:
Const
 N=2; {number of students in group}
type student=record
              name:string[10];
              group:integer;
              marks:array[1..5] of byte;
             end;

var
 f:file of student;
 gr:array[1..3] of integer;
 st:student;
 i,j,k:byte;
 x,max,ans:integer;

Begin
 gr[1]:=355;
 gr[2]:=255;
 gr[3]:=155;
 write('Create new file or open existing? (1-create, 2-open) ');
 repeat
  readln(ans);
 until ans in [1..2];
 if (ans=1) then
  begin
   assign(f,'student.inf');
   rewrite(f);
   for i:=1 to 3 do
    begin
     writeln('Enter ',N,' records containing data about the sudents of ',gr[i],' group:');
     for j:=1 to N do
      begin
       writeln('Student ',j);
       with st do
        begin
         write('Surname: ');
         readln(name);
         group:=gr[i];
         writeln(' Enter his/her 5 marks from 2 to 5');
         for k:=1 to 5 do
         repeat
          write('  Mark ',k,' ');
          readln(marks[k]);
         until marks[k] in [2..5];
        end;
       write(f,st);
      end;
    end;
   close(f);
  end
 else
  begin
   assign(f,'student.inf');
   repeat
    writeln('Continue? Yes(1)/No(2)');
    repeat
     readln(ans);
    until ans in [1..2];
    if ans=1 then
     begin
      Reset(f);
      writeln('Choose the number of group (1-3)');
      repeat
       readln(k);
      until k in [1..3];
      x:=gr[k];
      write('Maximal mark of students of group ',x,' in second subject: ');
      max:=0;
      while not eof(f) do
       begin
        read(f,st);
        if (st.group=x) and (st.marks[2]>max) then max:=st.marks[2];
       end;
      writeln(max);
      close(f);
     end;
   until ans=2;
  end;
End.
Особое внимание хочу обратить вот на что. Вы задаете поле Marks, как массив диапазонов. В то же время Вы пытаетесь контролировать корректность ввода оценки. Но! Если Вы введете, например, 1 или 6, то программа не дойдет до вашего Until, а тут же вылетит. Поэтому я исправил тип массива поля на Byte - тогда всё нормально.
Количество студентов в группе я задаю с помощью константы N. Для отладки поставил 2, можете исправить на 10, а я не намерен посвящать остаток жизни вводу данных по 30 лоботрясам.
Не стОит заведомо типизированному файлу давать расширение .txt. Не, ну можно, конечно - но зачем?!
Ну и еще там куча всяко-разных мелочей.
 
О да, какой же кривой код был... Спасибо вам огромное, все мои ошибки теперь понятны!
 
Назад
Сверху