• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Не работает чтение текстового файла

misha-mishulino

Ученик
Регистрация
12 Июн 2014
Сообщения
2
Реакции
0
Баллы
0
Не работает чтение текстового файла

всем привет. когда пытаюсь подключить внешний текстовы файл выдает вместо табличных данных то что в файле, все 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.
 

Вложения

  • abitura.txt
    abitura.txt
    182 байт · Просмотры: 512
помогите исправить
Хорошо.
Но прежде всего замечу, что такой лавины ошибок и нелепостей я давненько не видел. Поймите главное: девиз программиста - точность, аккуратность, скрупулезность. А всяких литературных эссе на тему "ну, что-то типа, авось железяка разберется и сообразит, что я имел в виду" компьютер не понимает. Абсолютно.
Ну ладно, теперь к программе.
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.
 

Вложения

  • abitura.txt
    abitura.txt
    199 байт · Просмотры: 518
благодарю вас, буду подробно изучать еще ваш код, с файлами совсем не понимал, с типизированным более менее нормально работаю, с текстовыми были проблемы, СПАСИБО )
 
Назад
Сверху