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


Ответ
 
Опции темы Опции просмотра
Старый 12.06.2014, 02:52   #1 (permalink)
misha-mishulino
Новичок
 
Регистрация: 12.06.2014
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Не работает чтение текстового файла

всем привет. когда пытаюсь подключить внешний текстовы файл выдает вместо табличных данных то что в файле, все 0. прошу помогите исправить плиз . нужно было считать с текстового файла информацию (файл прикрепил) и отсортировать ее по сумме балов. вот программа: я вас умоляю помогите исправить вместо данных одни 0, что то не то записалось. вот код:
Код:
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.
Вложения
Тип файла: txt abitura.txt (182 байт, 512 просмотров)
misha-mishulino вне форума   Ответить с цитированием

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

Тут уже были аналогичные топики, посмотрите их

Чтение файла places.sqlite
Чтение и запись из файла и в файл массива данных строковых переменных. Turbo Pascal

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

Цитата:
Сообщение от misha-mishulino Посмотреть сообщение
помогите исправить
Хорошо.
Но прежде всего замечу, что такой лавины ошибок и нелепостей я давненько не видел. Поймите главное: девиз программиста - точность, аккуратность, скрупулезность. А всяких литературных эссе на тему "ну, что-то типа, авось железяка разберется и сообразит, что я имел в виду" компьютер не понимает. Абсолютно.
Ну ладно, теперь к программе.
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.
Вложения
Тип файла: txt abitura.txt (199 байт, 518 просмотров)
Vladimir_S вне форума   Ответить с цитированием
Старый 12.06.2014, 14:10   #3 (permalink)
misha-mishulino
Новичок
 
Регистрация: 12.06.2014
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

благодарю вас, буду подробно изучать еще ваш код, с файлами совсем не понимал, с типизированным более менее нормально работаю, с текстовыми были проблемы, СПАСИБО )
misha-mishulino вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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