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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 17:39   #1
Женька Good
Форумчанин
 
Регистрация: 15.03.2011
Сообщений: 126
По умолчанию Pascal. Записи

У меня такое задание:
Посчитать доходы и убытки из данных взятых из текстового документа и записать ответы в другой...
я написал программу:
Код:
Program Xme1ez_stroki;
Uses CRT;
Const n=10;
Type prod=Record
     Naimen:String[20];
     c_zak,c_prod:real;
     Zakup, Pro:integer;
     end;

var a1:prod;

   c,prib, ubyt:real;
    i:integer;
    f1,f2:text;
Begin
CLRSCR;
assign(f1,'c:\base.txt');Reset(f1);
assign(f2,'c:\rez.txt');Rewrite(f2);
prib:=0;
c:=0;
Ubyt:=0;

 while not eof(f1) do
   With a1 do
   begin
     Read(f1,naimen, c_zak, c_prod, zakup, pro);

     Write(f1,naimen, c_zak, c_prod, zakup, pro);
     c:=c_zak*zakup-c_prod*pro;
     If c>=0 then
     writeln(f2,prib:0:1)
     else writeln(f2,ubyt:0:1);
   end;

Writeln;
Close(f1);Close(f2);
readln;
end.
Перед строкой
Код:
Read(f1,naimen, c_zak, c_prod, zakup, pro)
выбивает ошибку 106 Invalid numeric format
что делать? помогите плизззз


вот тест из текстового документа, откуда беру данные:

Romashka 19.5 16 30 14
S Tminom 29.99 25 30 13
Ovsyanoe 18 26 30 13
Shokoladnoe 35 41.5 25 31
Buratino 19.8 16 30 26
Zefirnoe 25 34 30 12
Pesochnoe 25 30 35 15
Karamelnoe 14 20 30 26
Lisichka 21 29 26 19
Lastochka 16.9 25 25 18

Последний раз редактировалось Женька Good; 23.11.2011 в 17:44.
Женька Good вне форума Ответить с цитированием
Старый 24.11.2011, 07:37   #2
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Я так подразумеваю, что string[20] считает из файла именно 20 строк, даже если название содержит в себе меньше символов, таким образом он отсечет часть чисел, а затем при попытке считать число курсор будет находиться на тексте
Тут есть два варианта - либо название писать в отдельной строке, либо считывать строку целиком и затем разбивать ее на составляющие
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 24.11.2011, 08:15   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Zer0
Я так подразумеваю, что string[20] считает из файла именно 20 строк, даже если название содержит в себе меньше символов,
вы чуть-чуть опечатались. string[20] - считывает конечно же 20 символов...
впрочем, дальше из контекста вашего сообщения это понятно.

p.s. есть ещё третий вариант - исходный текстовый файл должен быть подготовлен так, чтобы наименование (naimen) содержало РОВНО 20 символов, ни символом больше, ни символом меньше! Для этого его нужно справа дополнить пробелами до нужного размера.

Впрочем, вариант со считыванием целиком строки и разбором её на элементы мне лично кажется и более удобным (с практической точки зрения), и более универсальным.. я бы реализовал именно его.


вот, примерно так:
Код:
Program Xme1ez_stroki;
Uses CRT;
Const n=10;
Type prod=Record
     Naimen:String[20];
     c_zak,c_prod:real;
     Zakup, Pro:integer;
     end;

var a1:prod;

    c : real;
    i : integer;
    f1,f2:text;
    s : string;
    k, kErr : integer;
Begin
CLRSCR;
assign(f1,'c:\base.txt');Reset(f1);
assign(f2,'c:\rez.txt');Rewrite(f2);

 while not eof(f1) do
   With a1 do
   begin
     Readln(f1,s);

     k := Pos(' ',s);
     if k<=1 then Continue; {в строке нет нужной информации, просто игнорируем эту строчку}
     naimen := Copy(s,1,k-1);
     delete(s,1,k);
     while (Length(s)>0) and (Copy(s,1,1)=' ') do Delete(s,1,1);

     k := Pos(' ',s);
     if k<=1 then Continue; {в строке нет нужной информации, просто игнорируем эту строчку}
     val(Copy(s,1,k-1), c_zak, kErr);
     if kErr>0 then Continue; {ошибка в задании числа c_zak - игнорируем строчку}
     delete(s,1,k);
     while (Length(s)>0) and (Copy(s,1,1)=' ') do Delete(s,1,1);

     k := Pos(' ',s);
     if k<=1 then Continue; {в строке нет нужной информации, просто игнорируем эту строчку}
     val(Copy(s,1,k-1), c_prod, kErr);
     if kErr>0 then Continue; {ошибка в задании числа  c_prod - игнорируем строчку}
     delete(s,1,k);
     while (Length(s)>0) and (Copy(s,1,1)=' ') do Delete(s,1,1);


     k := Pos(' ',s);
     if k<=1 then Continue; {в строке нет нужной информации, просто игнорируем эту строчку}
     val(Copy(s,1,k-1), zakup, kErr);
     if kErr>0 then Continue; {ошибка в задании числа zakup - игнорируем строчку}
     delete(s,1,k);
     while (Length(s)>0) and (Copy(s,1,1)=' ') do Delete(s,1,1);

     while (Length(s)>1) and (Copy(s,Length(s),1)=' ') do Delete(s,Length(s),1);
     val(s, pro, kErr);
     if kErr>0 then Continue; {ошибка в задании числа pro - игнорируем строчку}

     Write(f2,naimen, ' ', c_zak:0:3, ' ', c_prod:0:3, ' ', zakup, ' ', pro);

     c:=c_zak*zakup-c_prod*pro;
     If c>=0
       then writeln(f2,' Прибыль ', c:0:3)
       else writeln(f2,' Убыток ', abs(c):0:3);
   end;

Close(f1);Close(f2);
Writeln('Done.');
readln;
end.

Последний раз редактировалось Serge_Bliznykov; 24.11.2011 в 09:02.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal, Записи Nastik Помощь студентам 3 06.07.2010 10:42
Pascal - Записи Kris92 Помощь студентам 4 06.07.2010 10:30
Pascal - Записи Ikari Shinji Помощь студентам 1 10.06.2010 00:24
[Pascal] Записи Дмитрий230192 Помощь студентам 2 02.03.2010 21:55