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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 00:41   #1
Student1992
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 16
По умолчанию чтение из файла математического выражения

добрый день, в файле имеется математическое выражение, типа 1+2-3+4 и так далее.
При попытке считать его и сразу же найти выражение программа вылетает, при попытке считать посимвольно. столкнулся с проблемой, что число например 123 считывается отдельно, т.е. по цифрам 1 потом 2 потом 3
Код:
program filereader;
uses crt;
var
f:text;
file_symbol:char;
sum,number:integer;
begin
     assign(f,'1.txt');
     reset(f);
     while not eof(f) do begin
            read(f,file_symbol);
            writeln(file_symbol);

     end;
end.
была идея считать строку и дальше ее разбирать, но как-то не очень.
Код:
program filereader;
uses crt;
var
f:text;
file_string,help_string:string;
number,sum,i:integer;
begin
assign(f,'1.txt');
reset(f);
read(f,file_string);
for i:=1 to length(file_string) do
begin
     if (file_string[i]<>'+') and (file_string[i]<>'-') then begin help_string:=help_string+file_string[i]; end;
end;
writeln(help_string);
end.
кто как решал данную задачу?
Student1992 вне форума Ответить с цитированием
Старый 13.11.2011, 02:32   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Если у тебя в выражении могут быть только целые и только + и -, то можно как-то вот так сделать
Код:
s:= 0;
a:= 0;
z:= 1;
while not EoL do begin
  read(c);
  case c in
    '0'..'9': a:= a*10+Ord(c)-48;
    '-': z:= -1;
    '+': begin
      s:= s*10+a*z;
      a:= 0;
      z:= 1
    end;
    ' ':;
    else begin
      writeln('character "',c,'" is not permitted');
      halt
    end
  end
end;
s:= s+a*z;
writeln(s);
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 13.11.2011 в 08:45. Причина: ошибка
TinMan вне форума Ответить с цитированием
Старый 13.11.2011, 03:41   #3
Student1992
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 16
По умолчанию

Код:
  case c in
    '0'..'9': a:= a*10+Ord(c)-48;
    '-': z:= -1;
    '+': begin
      s:= s+a*z;
      a:= 0;
      z:= 1
    end;
    ' ':;
    else begin
      writeln('character "',c,'" is not permitted');
      halt
т.е. вы тут получив символ смотри число это или нет, а дальше уже прибавляете его к сумме?
И еще вопрос, тогда как он отреагирует например на число 5162?
Student1992 вне форума Ответить с цитированием
Старый 13.11.2011, 08:47   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Я извиняюсь, посмотрел сейчас и нашел ошибку. s перед сложением надо домножать на 10 (исправлено).
Теперь должен нормально отреагировать.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 13.11.2011, 16:28   #5
Student1992
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 16
По умолчанию

извините, а какого типа переменная с
и что это за конструкция:
Код:
while not EoL do begin
  read(c);
я просто не видел еще такого)
Student1992 вне форума Ответить с цитированием
Старый 14.11.2011, 02:40   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Упс! Еще одна ошибка.. Не EoL, а EoLn. Извиняюсь, исправил выше.

В данном случае c имеет тип char (символьный).
Код:
var
  c: char;
EoLn(f) - End of Line, это функция, которая возвращает true, когда при чтении текстового файла f достигнут конец очередной строки (чтобы перейти на следующую, надо употрелить readln(f)). Она находится в модуле System, так что не требует подключения модуля (модуль System всегда подключен). Если она вызвана без скобок (как в этом случае), то подразумевается стандартный ввод (клавиатура). Она аналочична функции EoF (потому я и забываю постоянно последнюю буковку)).

Эта конструкция означает буквально: продолжать выполнять тело цикла до конца вводимой строки.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решение математического выражения akum905 Общие вопросы C/C++ 0 12.11.2011 00:04
Вычислить значение математического выражения для заданных данных Rusak723 Паскаль, Turbo Pascal, PascalABC.NET 3 08.06.2011 17:53
Чтение файла lapo4ka1368 Общие вопросы C/C++ 0 07.04.2010 17:15
Cоздание дерева математического выражения CilCatblack Общие вопросы C/C++ 3 20.04.2009 14:22
Чтение из Edit1 выражения Rusl92 Общие вопросы Delphi 11 11.04.2008 18:01