Помощь - Поиск - Пользователи - Календарь
Полная версия: Консольный калькулятор
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Kolu4ka
Здавствуйте, я новенькая на этом форуме, еще даже тольком не освоилась...
Поискала вот в задачах, но так и не нашла, конечно может так искала плохо...
В общем, мне надо написать программу "Консольный калькулятор". А я даже не понимаю толком, что это такое... unsure.gif Простой калькулятор я написала... Вот, что нам задали....
Задание
Разработать программу, вычисляющую простейшие математические операции. Тип операции и операнды передаются через командную строку программы. Никакого другого ввода не должно быть. Вывод результата осуществляется на экран.
Формат командной строки
В квадратных скобках указываются необязательные параметры. Параметры в командной строке указываются через пробел.
Для вычисления выражения:
ИмяПрограммы ./опреация операнд1 [операнд2]…[операндN]
Максимальное количество опрендов – 5.
Для получения информации о программе и возможных параметрах
ИмяПрограммы /?
Параметры командной строки
/sum - Считается сумма всех операндов.
/mul - Считается произведение всех операндов
/div - Считается частное всех операндов. (Операнд1/Операнд2/…/ОперандN)
/sub - Считается разность всех операндов. (Операнд1 - Операнд2 - … - ОперандN)
/avg - Считается среднее арифметическое операндов
/min - Находится минимум из операндов
/max - Находится максимум из операндов
/? - при запуске программы с данным ключом производится вывод информации
Ошибки
Программа должна обрабатывать ошибки и выдавать пользователю сообщение, в следующих ситуациях:
• Неизвестная операция
• Нечисловой операнд
• Отсутствие операндов
• Слишком много операндов
• Деление на ноль. Программа не должна аварийно завершаться!

Воть, а я не наю, как это сделать.... blush.gif Заранее благодарна!
volvo
Цитата
Воть, а я не наю, как это сделать.... blush.gif Заранее благодарна!

Что ИМЕННО вызывает затруднения? Калькуляторов на форуме есть куча, возьми любой из них и просто добавь обработку командной строки (см. функции ParamStr и ParamCount). А ЗА тебя я не думаю, что кто-то будет делать все задание полностью... no1.gif
Kolu4ka
Цитата
что кто-то будет делать все задание полностью...

а мне и не надо полностью....Я же говорю, простой калькулятор я написала...
Просто я не знаю что такое командная строка в паскале blush.gif
Значит, это все в функциях ParamStr и ParamCount? Спасибо, я попробую huh.gif
Если сдам эту работу, то с меня большая шоколадка! !flowers.gif
volvo
To: Kolu4ka
Ну, вот тебе пример программы (обрабатывает пока только "+" и "-"):
Type
  OperFunc = Function(Var Error: Boolean;
             X, Y: Real): Real;

function _add(var err: boolean;
         a, b: real): real; far;
begin
  err := false;
  _add := a + b;
end;
function _sub(var err: boolean;
         a, b: real): real; far;
begin
  err := false;
  _sub := a - b;
end;

function DoOperation(f: OperFunc): real;
var
  X, _result: real;
  sVal: string;
  p, ErrorCode: integer;
  isError: Boolean;
begin
  _result := 0;
  for p := 2 to ParamCount do begin
    sVal := ParamStr(p);
    writeln(sVal);
    Val(sVal, X, ErrorCode);
    If ErrorCode <> 0 Then Begin
      WriteLn('illegal parameter #', p, ' . Stopped. ');
      Halt(101);
    End;
    _result := f(isError, _result, X);
    If isError Then Begin
      Writeln('Division by zero !!!');
      Halt(100);
    End;
  end;
  DoOperation := _result;
end;

var
  sOper: string;
  _result: real;
  i: integer;
  found: boolean;

const
  n = 8;
  opers: Array[1 .. n] of string =
    ('/sum',
     '/mul',
     '/div',
     '/sub',
     '/avg',
     '/min',
     '/max',
     '/?' );
  tips: array[1 .. n] of string =
    (
      'Считается сумма всех операндов.',
      'Считается произведение всех операндов.',
      'Считается частное всех операндов.',
      'Считается разность всех операндов.',
      'Считается среднее арифметическое операндов',
      'Находится минимум из операндов',
      'Находится максимум из операндов',
      'Данное сообщение...'
    );

begin
  if ParamStr(1) = '/?' then begin
    for i := 1 to n do
      writeln(opers[i] + ': ' + tips[i]);
    Halt(100);
  end;

  if paramcount < 3 then writeln('not enough parameters')
  else begin
    sOper := paramstr(1);

    i := 1; found := false;
    while (i < n) and (not found) do
      if opers[i] = sOper then found := True else inc(i);

    if not found then writeln('error in parameter: ' + sOper)
    else begin

      { main cycle: }
      case i of
        1: _result := DoOperation(_add);
        4: _result := DoOperation(_sub);
      end;
      writeln('result = ', _result:10:5);

    end;

  end;
end.

rolleyes.gif
Kolu4ka
blink.gif
Родите меня обратно!!! Неужели все так сложно....
Ох, спасибо большое....Терь бы разобраться...
Altair
Kolu4ka, мы тут посовещались и подумали, что немного напугали тебя слова
Цитата
обрабатывает пока только "+" и "-"

на самом деле можешь оценивать прогу почти как готовую, для обработки всего остального понадобиться дописать тебе где-то десяток строк... give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.