Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Консольный калькулятор

Автор: Kolu4ka 4.11.2005 15:35

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

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

Автор: volvo 4.11.2005 15:44

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

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

Автор: Kolu4ka 4.11.2005 15:57

Цитата
что кто-то будет делать все задание полностью...

а мне и не надо полностью....Я же говорю, простой калькулятор я написала...
Просто я не знаю что такое командная строка в паскале blush.gif
Значит, это все в функциях ParamStr и ParamCount? Спасибо, я попробую huh.gif
Если сдам эту работу, то с меня большая шоколадка! !flowers.gif

Автор: volvo 4.11.2005 16:23

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 4.11.2005 20:09

blink.gif
Родите меня обратно!!! Неужели все так сложно....
Ох, спасибо большое....Терь бы разобраться...

Автор: Altair 5.11.2005 4:12

Kolu4ka, мы тут посовещались и подумали, что немного напугали тебя слова

Цитата
обрабатывает пока только "+" и "-"

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