12.06.2014, 02:52 | #1 (permalink) |
Новичок
Регистрация: 12.06.2014
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Не работает чтение текстового файла
Код:
const n = 4; type student = record N: byte; prizv: string; alg: real; bal: 6..15; matan,prog,os:2..5 end; var f:text; i,j: integer; code:integer; tabl: array[1..n] of student; v:student; s:string; {$R-} begin Assign(f,'d:\abitura.txt'); reset(f); writeln('VVedi dani stydentiv'); for i := 1 to n do with tabl[i] do begin writeln('vvedi prizv'); readln(f,prizv); writeln('vvedi predmet1'); readln(f,s); val(s,matan,code); writeln('vvedi predmet2'); readln(f,s); val(s,prog,code); writeln('vvedi predmet 3'); readln(f,s); val(s,os,code); end; for i:=1 to n do with tabl[ i ] do begin bal:=matan+prog+os; end; writeln('------------------------------------------------------'); writeln('| Surname| Matematuchnuy | Programyvannya | OS | summa '); writeln('| | analis | | | '); writeln('--------------------------------------------------------'); for i:=1 to n do with tabl[i] do begin writeln('|',prizv:10,'|',matan:15,'|',prog:16,'|',os:4,'|' , bal:5, '|'); writeln('-----------------------------------------------------------------'); end; writeln('vidcortovano'); j:=0; while j<=n do begin for i:=1 to n-1 do if tabl[i].bal<tabl[i+1].bal then begin v:=tabl[i]; tabl[i]:=tabl[i+1]; tabl[i+1]:=v; end; inc(j); end; writeln('------------------------------------------------------'); writeln('| Surname| Matematuchnuy | Programyvannya | OS | summa '); writeln('| | analis | | | '); writeln('--------------------------------------------------------'); for i:=1 to n do with tabl[i] do begin writeln('|',prizv:10,'|',matan:15,'|',prog:16,'|',os:4,'|' , bal:5, '|'); writeln('-----------------------------------------------------------------'); end; Close(f); readln; end. |
12.06.2014, 02:52 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Тут уже были аналогичные топики, посмотрите их Чтение файла places.sqlite Чтение и запись из файла и в файл массива данных строковых переменных. Turbo Pascal |
12.06.2014, 09:44 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Хорошо.
Но прежде всего замечу, что такой лавины ошибок и нелепостей я давненько не видел. Поймите главное: девиз программиста - точность, аккуратность, скрупулезность. А всяких литературных эссе на тему "ну, что-то типа, авось железяка разберется и сообразит, что я имел в виду" компьютер не понимает. Абсолютно. Ну ладно, теперь к программе. 1. Зачем в файле данных последняя графа (сумма)? Программа ее сосчитает сама, значит в текстовом файле ей делать нечего. 2. Первая строка текстового файла - заголовок. Его небходимо при считывании данных пропустить, чего у Вас не сделано. Для этого после Reset(f); нужно вставить Readln(f); 3. Число студентов, заданных константой (4), не соответствует числу строк в файле (3). Возникает ошибка. И что Вы делаете? Командой $R- Вы просто маскируете ошибку, а то, что при этом возможно "налезание" одних данных на другие при внутренней разметке памяти - Вам, извините, пофиг. Нет, не пойдет. Не надо подобного варварства. В том варианте программы, который я Вам предложу в конце, число студентов заранее не определено, задано лишь максимальное количество. 4. Поля записи - безобразно-неряшливы. Что за Alg, например? 5. Теперь приступим к анализу процесса считывания данных. Тут вообще такой кошмар, что только за голову хватаешься. Ошибка на ошибке. а) Ну зачем Вы оставляете экранный вывод строк-комментариев для консольного ввода, если данные считываются из файла?! Убрать! б) Вы определяете поле Prizv, как открытую строку, и наивно полагаете, что, дойдя до конца фамилии, компьютер "сообразит", что нужно остановиться? Уверяю Вас, и не подумает, а прочешет всю строку целиком до последнего значащего символа. Проблема снимается заданием типа поля Prizv в виде строки ограниченной длины. в) Дальше - всё интереснее и интереснее. Вместо того, чтобы считывать оценки прямо в числовом формате, Вы их пытаетесь считывать в виде строк, причем опять же неограниченной длины! Зачем такие сложности? 6. Что за метод упорядочения Вы применили? По-моему, весьма сомнительный. Во всяком случае, я такого не знаю, поэтому (на всякий случай) заменил обычным "пузырьком". Нет, я не утверждаю, что это неправильно, может быть так и можно. Если преподы с вас требуют упорядочивать именно так - исправьте. Уф, ну, вроде, в первом приближении - всё. Текст исправленной и отлаженной программы выкладываю, исправленный файл прилагаю. Код:
const Nmax=20; type student = record prizv: string[16]; ball: Array[1..3] of byte; sum:byte; end; var f:text; i,j,n: integer; code:integer; tabl: array[1..Nmax] of student; v:student; s:string; begin Assign(f,'d:\abitura.txt'); reset(f); Readln(f); n:=0; Repeat Inc(n); with tabl[n] do begin read(f,prizv); for j:=1 to 3 do read(f,ball[j]); readln(f); end; Until EoF(f); Close(f); for i:=1 to n do with tabl[i] do begin sum:=0; for j:=1 to 3 do sum:=sum+ball[j]; end; writeln('-----------------------------------------------------------------'); writeln('| Surname | Matematuchnuy | Programyvannya | OS | summa '); writeln('| | analis | | | '); writeln('-----------------------------------------------------------------'); for i:=1 to n do with tabl[i] do begin writeln('|',prizv:16,'|',ball[1]:15,'|',ball[2]:16,'|',ball[3]:4,'|' , sum:8, '|'); writeln('-----------------------------------------------------------------'); end; writeln; writeln('vidcortovano'); for j:=1 to n-1 do for i:=1 to n-j do if tabl[i].sum<tabl[i+1].sum then begin v:=tabl[i]; tabl[i]:=tabl[i+1]; tabl[i+1]:=v; end; writeln('-----------------------------------------------------------------'); writeln('| Surname | Matematuchnuy | Programyvannya | OS | summa '); writeln('| | analis | | | '); writeln('-----------------------------------------------------------------'); for i:=1 to n do with tabl[i] do begin writeln('|',prizv:16,'|',ball[1]:15,'|',ball[2]:16,'|',ball[3]:4,'|' , sum:8, '|'); writeln('-----------------------------------------------------------------'); end; readln end. |
12.06.2014, 14:10 | #3 (permalink) |
Новичок
Регистрация: 12.06.2014
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
благодарю вас, буду подробно изучать еще ваш код, с файлами совсем не понимал, с типизированным более менее нормально работаю, с текстовыми были проблемы, СПАСИБО )
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|