Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2013, 18:32   #1
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию Паскаль. Работа с файлами + динамический массив записей.

Нужна помощь с исправлением пары ошибок.
Дан типизированный файл записей с информацией о вступительном тестировании: абитуриент, баллы по первому предмету, баллы по второму предмету, баллы по третьему предмету. Вывести список абитуриентов на экран. Вывести в текстовый файл список абитуриентов, упорядоченный по общему количеству набранных баллов.
Код:
Program l4_z1_8;
uses crt;
type Tstudent = record
                fam:     string[10];
                firstB:  integer;
                secondB: integer;
                thirdB:  integer;
                sumB:    integer;
end;

const
   PathToFiles = 'F:\PABC\lab_4_z1\';
   Nmax=100;

type Pstudent = ^Tstudent;
var  A: array[1..Nmax] of Pstudent;
     F1,F2: file of Tstudent;
     n,i,j,temp: integer;
     ved: Tstudent;
     
Begin
  //New(Pstudent);
  Assign(F1,PathToFiles + 'File_1.dat');
  Rewrite(F1);
  
  Write('Сколько записей вы хотите записать в файл?? ');
  Readln(n);
  
  if n>0 then begin
    Seek(F1, FileSize(F1));
    for i:=1 to n do begin
      with ved do begin
        Write('Фамилия абитуриента: '); Readln(A[i]^.fam);
        Write('Балл по первому предмету: '); Readln(A[i]^.firstB);
        Write('Балл по второму предмету: '); Readln(A[i]^.secondB);        
        Write('Балл по третьему предмету: '); Readln(A[i]^.thirdB);
        A[i]^.sumB:=A[i]^.firstB+A[i]^.secondB+A[i]^.thirdB;
      end;
      Write(F1,ved);
    end;
    Close(F1);
  end;

  Reset(F1);
  WriteLn('Содержимое файла: ');
  WriteLn('---------------------------------------------------------------');
  while not eof(F1) do begin
    with ved do begin
      for i:=1 to n do begin                                                                      
        read(F1,ved);
        WriteLn(A[i]^.fam:15,' | ',A[i]^.firstB:15,' | ',A[i]^.secondB:15,' | ',A[i]^.thirdB:15,' | ',A[i]^.sumB:15);
      end;
    end;
  end;
  Close(F1);
  
  Reset(F1);
  Assign(F2,PathToFiles+ 'File_2.txt');
  Rewrite(F2);
  
  while not eof(F1) do begin
    with ved do begin
        read(F1,ved);                                                                            
        write(F2,ved);
    end;
  end;
  close(F1);
  
  reset(F2);
  for i:=1 to n-1 do                                                                 
    for j:=n-1 downto i do
      if A[j]^.sumB > A[j+1]^.sumB then begin
        temp:=A[j];                                                                       //Меняем местами только указатели, записи остаются на своих местах
        A[j]:=A[j+1];
        A[j+1]:=temp;
      end;
      
  for i:=1 to n do
    writeln(A[i]^.fam:15,' | ',A[i]^.firstB:15,' | ',A[i]^.secondB:15,' | ',A[i]^.thirdB:15);
  Close(F2);
  //Dispose(Pstudent);
End.
Первая проблема заключается в использовании процедуры NEW, появляется ошибка: "Ожидалось выражение", как я понимаю, ошибка из-за того, что указатель описан в type, т.к. решая задачу с динамическим массивом и делая на него указатель в Var, подобной проблемы не возникало.
И вторая проблема с дополнительной переменной Temp для сортировки, т.к. я меняю местами только указатели, и соответственно не могу присвоить какой либо переменной значение ^record.
Паскаль ABC, насколько я знаю на турбо паскале можно сделать подобную сортировку через дополнительную переменную.

Последний раз редактировалось H4t; 01.04.2013 в 18:43.
H4t вне форума Ответить с цитированием
Старый 01.04.2013, 22:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ошибка из-за того, что указатель описан в type
Не указатель в типе, а попытка передать тип как параметр.
New(A) должно отработать нормально, потому что А - переменная.
Цитата:
т.к. я меняю местами только указатели
Ну логично. Ошибка в том что Temp должен быть типа Pstudent, а не integer. Тогда цикл должен отработать нормально.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.04.2013, 22:48   #3
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не указатель в типе, а попытка передать тип как параметр.
New(A) должно отработать нормально, потому что А - переменная.

Ну логично. Ошибка в том что Temp должен быть типа Pstudent, а не integer. Тогда цикл должен отработать нормально.
New(A) не получится сделать, т.к. эта процедура для указателя, а им является именно Pstudent. Про Temp исправил, только еще появилась ошибка: "»*Попытка разыменовать нулевой указатель (lab_4_z1(var4).pas, строка 39)", там где вводится фамилия абитуриента, там же идет запись поля с индексом 1, не понятна суть ошибки..
H4t вне форума Ответить с цитированием
Старый 01.04.2013, 22:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
New(A) не получится сделать,
А, ну да. Ну тогда
Код:
    for i:=1 to n do begin New(A[i]);
      with ved do begin
        Write('Фамилия абитуриента: '); Readln(A[i]^.fam);
        Write('Балл по первому предмету: '); Readln(A[i]^.firstB);
        Write('Балл по второму предмету: '); Readln(A[i]^.secondB);        
        Write('Балл по третьему предмету: '); Readln(A[i]^.thirdB);
        A[i]^.sumB:=A[i]^.firstB+A[i]^.secondB+A[i]^.thirdB;
      end;
      Write(F1,ved);
    end;
Цитата:
не понятна суть ошибки..
А ты его не создаешь
См. как я тебе цикл написал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2013, 00:17   #5
H4t
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 31
По умолчанию

Большое спасибо
H4t вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Динамический массив при работе с нетипизированными файлами Arrow_S Помощь студентам 10 06.04.2012 22:19
массив записей, паскаль Parada Помощь студентам 4 12.05.2011 16:11
динамический массив в Паскаль LastBreath Помощь студентам 16 11.05.2010 16:11
Динамический массив записей Alexeytur Общие вопросы Delphi 2 04.03.2010 10:10
Паскаль. Динамический массив KORT Паскаль, Turbo Pascal, PascalABC.NET 2 29.09.2007 23:08