Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi|Pascal]Калькулятор, ()+-и числа 
V
    Опции темы
jhonyxakep
Дата 17.6.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Нужно написать программу которая будет брать из файла input.txt выражение и выводить его результат в файл output.txt

В файле input.txt могут присутствовать только ()+-
Заранее спасибо smile 
PM MAIL ICQ   Вверх
Elerond
Дата 17.6.2009, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 18.6.2007

Репутация: 2
Всего: 3



jhonyxakep, не совсем понял... в файле должно быть математическое выражение? т.е. кроме ()+- еще и числа...
--------------------
Мой блог
PM MAIL WWW   Вверх
jhonyxakep
Дата 17.6.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



например (1+2)-2 в output ответ, с учётом скобок

Добавлено через 43 секунды
ещё может-быть (1+(1+2+(1+2+3+(1+2+3+4))))-2
PM MAIL ICQ   Вверх
Gaudi
Дата 17.6.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



Операции с одинаковым приоритетом, скобки не нужны. Просто решаешь выражение справа налево.
PM MAIL   Вверх
Elerond
Дата 17.6.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 18.6.2007

Репутация: 2
Всего: 3



Gaudi, это верно конечно, но наверное от них хотят показать как они справятся с приоритетами.

Добавлено через 7 минут и 22 секунды
В общем у меня паскаля не было под рукой, вот необходимые функции на делфи... функция Calc является основной... думаю считывание с файла сам сделаешь.

Это проверка на баланс скобок и лишние символы, правда не смотрит на повторение типа "++"
Код

function ScannErrors(InputText: String): Boolean;
var
  i, n, m: Integer;
begin
  Result:=False;
  n:=0; m:=0;
  for i:=1 to Length(InputText) do begin
    if InputText[i]='(' then Inc(n);
    if InputText[i]=')' then Inc(m);
    if not (InputText[i] in [')', '(', '-', '+', '0'..'9', ' ']) then Result:=True;
  end;
  if n<>m then Result:=True;
end;


Тут функция которая считает выражения типа 1+2+3+4, т.е. то что внутри скобок
Код

function Summa(Prev: Integer; SubInputText: String; Znak: Char): Integer;
var
  i, ch: Integer;
begin
  while Pos(' ', SubInputText)>0 do
    Delete(SubInputText, Pos(' ', SubInputText), 1);
  if Znak='-' then ch:=-1 else ch:=1;
  if (Pos('+', SubInputText)=0) and (Pos('-', SubInputText)=0) then Result:=Prev+StrToInt(SubInputText)*ch else begin
    for i:=1 to Length(SubInputText) do begin
      if SubInputText[i]='+' then begin
        ch:=StrToInt(Copy(SubInputText, 1, i-1));
        Break;
      end;
      if SubInputText[i]='-' then begin
        ch:=StrToInt(Copy(SubInputText, 1, i-1));
        Break;
      end;
    end;
    if Znak='-' then ch:=ch*(-1);
    Result:=Prev+Summa(ch, Copy(SubInputText, i+1, Length(SubInputText)), SubInputText[i]);
  end;
end;


Основная функция ))
Код

function Calc(InputText: String):Integer;
var
  i, j, ch: Integer;
begin
  for i:=1 to Length(InputText) do
    if InputText[i]='(' then begin
      for j:=i+1 to Length(InputText) do begin  
        if InputText[j]='(' then Break;
        if InputText[j]=')' then begin
          ch:=Summa(0, Copy(InputText, i+1, j-i-1), '+'); 
          Delete(InputText, i, j-i+1);
          Insert(IntToStr(ch), InputText, i);
          Break;
        end;
      end;
      if InputText[j]=')' then begin
        Break;
      end;
    end;
   if Pos('(', InputText)>0 then Result:=Calc(InputText) else Result:=Summa(0, InputText, '+'); 
end;


Добавлено через 8 минут и 12 секунд
Достаточно запустить функцию Calc и будет все работать  smile 
--------------------
Мой блог
PM MAIL WWW   Вверх
jhonyxakep
Дата 17.6.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Ещё вопрос, а как нибудь можно это сделать с Рекурсией, или это не возможно?
PM MAIL ICQ   Вверх
Elerond
Дата 17.6.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 18.6.2007

Репутация: 2
Всего: 3



Если приглядеться то можно заметить, что функции Calc и Summa рекурсивные
--------------------
Мой блог
PM MAIL WWW   Вверх
jhonyxakep
Дата 17.6.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



sorry, не заметил smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.