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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2014, 02:12   #1
fallen1124
 
Регистрация: 16.01.2014
Сообщений: 5
По умолчанию Помоги решить ошибку программы по сортировке массивов.

Задача: вывести на экран информацию о студенте его фамилию и имя, а так же три оценки по модулям. Отсортировать прямым выбором и записать в файл. В части кода, когда идет перезапись в поле writln высвечивается ошибка Program4.pas(42) : Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта. Помоги решить проблему пожалуйста.

Код:
program lr6;
const n=20;
type   Tstudent = record
                 key : integer;
                 name: string[30];
                 mod1: integer;
                 mod2: integer;
                 mod3: integer;
end;
var
p : array [1..n] of Tstudent;
g:Tstudent;
   f: text;
   i: integer;
     procedure sort;
     var i,j,k : integer; x:Tstudent; 
     begin
          for i:=1 to n-1 do begin
             k:=i;
             for j:=i+1 to n do
               if p[j].mod2<p[k].mod2 then
                k:=j; 
                
                  if k<>i then begin 
                  x:=p[i];
           p[i]:=p[k]; 
           p[k]:=x;
           end; end;
     end;
     begin
     assign (f,'C:\FPC\2.6.0\1234.txt');
     reset(f);
          while not Eof(f) do begin
          readln(f, g.name);
          writeln(g.name); end;
          close(f); read();
     sort;
     assign (f,'C:\FPC\2.6.0\1234.txt');
     rewrite(f);
     for i:=1 to n do begin
     read ( p[i].name);
     write(f, p[i]);
     close(f); end;
end.

Последний раз редактировалось Stilet; 19.01.2014 в 11:19.
fallen1124 вне форума Ответить с цитированием
Старый 19.01.2014, 02:33   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Может быть в конце вместо
Код:
write(f, p[i]);
вот так
Код:
write(f, p[i].name);
type_Oleg вне форума Ответить с цитированием
Старый 19.01.2014, 02:42   #3
fallen1124
 
Регистрация: 16.01.2014
Сообщений: 5
По умолчанию

Нет все равно пишет что ссылка не указывает на экземпляр объекта...
fallen1124 вне форума Ответить с цитированием
Старый 19.01.2014, 03:03   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Reset - открывает существующий файл, ReWrite - создает новый и открывает для записи, а если есть такой файл - уничтожает и создает пустой.

И может быть, использовать не текстовый файл, а типизированный - file of Tstudent ?

Непонятно:
- имеется исходный файл или надо создать, вводя с клавиатуры данные? Если имеется, то какого типа ( текстовый, типизированный)?
- как отсортировать (по .key или по .name или по оценкам .mod1 .. )?
- после сортировки в какой файл записать? В исходный, вместо старых записей, или в новый файл ?

Последний раз редактировалось type_Oleg; 19.01.2014 в 03:32.
type_Oleg вне форума Ответить с цитированием
Старый 19.01.2014, 03:30   #5
fallen1124
 
Регистрация: 16.01.2014
Сообщений: 5
По умолчанию

Если поменять тип переменной то при открытии файла в поле read(f, g) появляется ошибка Program4.pas(34) : Ошибка времени выполнения: Чтение после конца потока невозможно.
Исходный файл есть со всей информацией. Текстовый файл по заданию сказано. Отсортировать ключом mod2. И записать в исходный файл.

Последний раз редактировалось fallen1124; 19.01.2014 в 03:36.
fallen1124 вне форума Ответить с цитированием
Старый 19.01.2014, 12:21   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, вы читаете из файла ТОЛЬКО имя:
Цитата:
Код:
while not Eof(f) do begin
          readln(f, g.name);
...
а нужно читать строчку и потом её парсить (разбирать на отдельные элементы)
Это если Вы не ошибаетесь и Вам действительно нужно читать именно ТЕКСТОВЫЙ файл (а не типизированный, что было бы многократно эффективней и удобней).


во-вторых, читать нужно в массив P. Вы в него ничего не прочитали, а потом пытаетесь его сортировать.

в-третьих, прочитаться может число записей ОТЛИЧНОЕ от 20. Нужно фиксировать в переменной, сколько у Вас реально записей в массиве и дальше сортировать/обрабытывать/выводить только это количество.

в-четвёртых, операция - read ( p[i].name) - полностью БЕССМЫСЛЕНА (это ввод значения с клавиатуры)!

ну и в пятых, в пост #4 type_Oleg задал ряд уточняющих вопросов. Ответьте на них (для себя в первую очередь)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.01.2014, 14:55   #7
fallen1124
 
Регистрация: 16.01.2014
Сообщений: 5
По умолчанию

Я понимаю что легче типизированный использовать, но требуют именно текстовой. Я просто не понимаю как организовать запись в файл, и чтобы процедура работала, потому что когда я отдельно делаю с вводом с клавиатуры сортировка работает..
fallen1124 вне форума Ответить с цитированием
Старый 19.01.2014, 15:12   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

И что?..я не увидел у Вас в сообщении вопроса.

Да Вы и на поставленные Вам вопросы не отвечаете...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.01.2014, 15:17   #9
fallen1124
 
Регистрация: 16.01.2014
Сообщений: 5
По умолчанию

я ответил на все вопросы в посте #5
Исходный файл есть со всей информацией. Текстовый файл по заданию сказано. Отсортировать ключом mod2. И записать в исходный файл.

У меня вопрос состоит в следующем, как мне организовать запись в файл отсортированный массив, и мне еще непонятно что это значит

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

во-вторых, читать нужно в массив P. Вы в него ничего не прочитали, а потом пытаетесь его сортировать.

в-третьих, прочитаться может число записей ОТЛИЧНОЕ от 20. Нужно фиксировать в переменной, сколько у Вас реально записей в массиве и дальше сортировать/обрабытывать/выводить только это количество.
[/COLOR][/I]...
Я исправил свой текст как мог и выводит в файл только нули, с чем это связано?
const n=20;
type tst = record
key : integer;
name: string[30];
mod1: integer;
mod2: integer;
mod3: integer;
end;
st = array [1..n] of tst;
var
t:st;
f,f1:text;
tmp:tst;
i:integer;
s:string[30];
procedure sort( var t:st; i:integer);
var j,k : integer;
begin
for i:=1 to n-1 do begin
k:=i;
tmp:=t[k];
for j:=i+1 to n do
if t[j].mod2<tmp.mod2 then begin
k:=j;
tmp:=t[k] end;
t[k]:=t[i];
t[i]:=tmp;
end; end;
begin
assign (f,'C:\FPC\2.6.0\1234.txt');
reset(f);
while not Eof (f) do begin
readln(f, s);
writeln(s);
end;
sort(t,i);
assign (f1,'C:\FPC\2.6.0\12345.txt');
rewrite(f1);
for i:=1 to n do begin
read(t[i].name);
writeln(f1, t[i]);
end;
close(f1);
end.

Последний раз редактировалось fallen1124; 19.01.2014 в 22:35.
fallen1124 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здравствуйте,помоги решить задачи на массив. Зухра89 Помощь студентам 0 10.02.2012 23:11
требуется написать программу по сортировке числовых массивов в паскале Antoxa93 Помощь студентам 4 29.04.2011 20:47
О сортировке массивов в C++ Frame1992 Помощь студентам 6 28.10.2009 16:50
[Turbo Pascal] Помогите найти ошибку в сортировке, пожалуйста. Pork6 Помощь студентам 3 08.10.2008 21:29
Люди помоги решить задачку плиззззз!!!! mad777 Фриланс 3 03.06.2008 12:34