Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 07.06.2015, 15:32   #1 (permalink)
samoha
Новичок
 
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите поправить программу. 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, но получилось не очень. Файл создаётся, после его заполнения программа завершается. Максимальную оценку не выводит, также не могу понять как программу зациклить на показ оценок из групп.
Заранее спасибо!
samoha вне форума   Ответить с цитированием

Старый 07.06.2015, 15:32
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Скорее всего проблему будет решать намного легче, если набраться информации отсюда

Помогите доделать программу в Pascal
Помогите написать программу на Pascal

Старый 07.06.2015, 19:17   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от samoha Посмотреть сообщение
Максимальную оценку не выводит, также не могу понять как программу зациклить на показ оценок из групп.
Конечно, потому что куча ошибок. Вот, можно, например, так (отлажено):
Код:
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. Не, ну можно, конечно - но зачем?!
Ну и еще там куча всяко-разных мелочей.
Vladimir_S вне форума   Ответить с цитированием
Старый 07.06.2015, 19:34   #3 (permalink)
samoha
Новичок
 
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

О да, какой же кривой код был... Спасибо вам огромное, все мои ошибки теперь понятны!
samoha вне форума   Ответить с цитированием
Старый 07.06.2015, 19:47   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от samoha Посмотреть сообщение
О да, какой же кривой код был... Спасибо вам огромное, все мои ошибки теперь понятны!
Исправил во второй части путь к файлу: это у меня они на диске D.
Vladimir_S вне форума   Ответить с цитированием
Старый 07.06.2015, 19:55   #5 (permalink)
samoha
Новичок
 
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Исправил во второй части путь к файлу: это у меня они на диске D.
Да, тоже заметил
Но это всё мелочи
samoha вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:54.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.