Помощь - Поиск - Пользователи - Календарь
Полная версия: Самый обычный калькулятор
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Kolyancz
Задача вообщем то не сложная, только не могу придумать как написать одну штуку...

Вводится число 2
На экране число 2

Вводится знак +
На экране число 2

Вводится число 5
На экране число 5

Нажимается Enter
На экране число 7...

Вот так вот...
У кого-нибудь есть идеи??? wink.gif
volvo
2 переменные (вещественные лучше всего, чтобы не было проблем, скажем, с делением) для хранения операндов, и одна (символьная) для хранения операции... Дальше -

readln(x1); { <--- читаем первое число }
readln(op); { <--- берем ЗНАК операции }
readln(x2); { <--- второе число }

case op of
  '+': writeln(x1 + x2);
  '-' : writeln(x1 - x2);
  { и так далее }
end;

T i m e
Ну если тебе надо только с плюсом, то код можно такой:
Код
Program Vremya_02_03_07;
var x,y:byte;
begin
readln(x);
readln;
readln(y);
writeln(x+y);
readln;
end.

volvo
Цитата(T i m e @ 2.03.2007 13:42)
код можно такой:
Код
Program Vremya_02_03_07;
var x,y:byte;
begin
read(x);
read;
read(y);
writeln(x+y);
readln;
end.

Я предупреждал? Предупреждал... Получите "-1", распишитесь...

Объясняю: если вводишь число <enter> знак <enter> число <enter>, то вместо знака "+" читается #13, соответственно получаем "сдвиг" между тем, что вводим, и тем, что ожидает программа, результат - "invalid numeric format"

Если <число><знак><число> <enter> - то в числовую переменную пытаешься прочесть строку, как результат - "invalid numeric format"... Проверяй то, что выкладываешь !!!
T i m e
Да... там с readln всё прокатывало, я проверял...
Потом чё то взбрендело на read исправить... зачем не заню даже... unsure.gif
Минус 1 так минус 1 - мне не жалко раз заслужил... mega_chok.gif
Ладно... в общем я отредактировал... с readln там всё работает.
Kolyancz
Ребят вы не поняли...
Я не знаю как описать опирацию считывания кнопки с цифрой...
Мне нужно что бы после нажатия 2 (двойки) сразу считывался следующий знак(+,-,*,/) , а не 2 (двойка), потом Enter, потом считывание знака...
Возьмите обычный калькулятор за 10 рублей и посмотрите принцип действия...

Если будут идеи, пишите...
Спасибо...
Алена
Это?
uses crt;
var
  first, second, ch: char;

begin
  first := readkey; write(first);
  ch := readkey; write(ch);
  second := readkey; write(second);

  readkey;

  write('=');
  case ch of
    '+': writeln(ord(first) + ord(second) - 2 * ord('0'));
    '-': writeln(ord(first) - ord(second));
    '*': writeln((ord(first) - ord('0')) * (ord(second) - ord('0')));
    '/': writeln((ord(first) - ord('0')) / (ord(second) - ord('0')));
  end;

end.
работает только с однозначными числами, нужны двухзначные - возьми калькулятор за 20 рублей, и посчитай...
Kolyancz
Есть у кого-нибудь калькулятор за 20 рублей???)))
а то 10 рублевый не работает... ;(


Хочу, что бы двухзначные циферки тоже работали...;(;(;(
Malice
Так нельзя разве:
var k,i,j:integer;
z:char;
s:string;
begin
clrscr;
i:=0; j:=0;
readln(s);
k:=1; while ((pos(s[k],'+-/*')=0) and (k<length(s))) do inc (k);
val(copy(s,1,k-1),i,j);
z:=s[k];
val(copy(s,k+1,255),j,k);
case z of
'+': k:=i+j;
'-': k:=i-j;
'/': k:=i div j;
'*': k:=i*j;
end;
writeln;
writeln(i,' ',z,' ',j,'=',k);
end.

?
Проверки только на корректность нужны..
TarasBer
Такой вариант (калькулятор за 25 рублей)?
Бакспэйс не работает - это есть только в калькуляторах за 30 рублей.

program Calc;

uses
  CRT;

var
  N1: extended;
  N2: extended;
  Op: char;
  Key, ScanKey: char;

procedure GetKeys;
begin
  Key := ReadKey;
  if Key = #0 then
    ScanKey := ReadKey
  else
    ScanKey := #0;
end;

procedure GetNumber(var N: extended);
var
  WasPoint: boolean;
  Order: integer;
  DN: extended;
  Minus: boolean;
begin
  N := 0;
  Order := 0;
  DN := 1;
  WasPoint := False;
  if Key = '-' then begin
    Write(Key);
    GetKeys;
    Minus := True;
  end else
    Minus := False;
  repeat
    if Key in ['0' .. '9'] then begin
      Write(Key);
      if WasPoint then begin
        if (Order < 20) then begin
          DN := DN / 10;
          N := N + DN * (byte(Key) - 48);
          Inc(Order);
        end;
      end else if (N < 1E+20) then
        N := N * 10 + byte(Key) - 48
    end;
    if (Key in ['.', ',']) and not WasPoint then begin
      Write(Key);
      WasPoint := True;
    end;
    GetKeys;
  until Key in ['+', '-', '*', '/', '^', 'v', 'l', '=', #13];
  if Minus then
    N := -N;
  WriteLn;
end;

procedure GetOp;
begin
  if Key in ['=', #13] then
    repeat
      GetKeys;
    until Key in ['+', '-', '*', '/', '^', 'v', 'l'];
  repeat
    op := Key;
    WriteLn(op);
    GetKeys;
  until Key in ['0' .. '9', '.', ',', '-'];
end;

begin
  repeat
    GetKeys;
    GetNumber(N1);
    GetOp;
    GetNumber(N2);
    case op of
      '+': WriteLn(N1 + N2: 0: 30);
      '-': WriteLn(N1 - N2: 0: 30);
      '*': WriteLn(N1 * N2: 0: 30);
      '/': if Abs(N2) > 1E-30 then
          WriteLn(N1 / N2: 0: 30)
        else
          WriteLn('ERROR');
      '^': if (N1 > 1E-30) and (N2 < 50) then
          WriteLn(Exp(N2 * Ln(N1)): 0: 30)
        else
          WriteLn('ERROR');
      'v': if (N1 > 1E-30) and (Abs(N2) > 0.02) then
          WriteLn(Exp(Ln(N1) / N2): 0: 30)
        else
          WriteLn('ERROR');
      'l': if (N1 > 1E-30) and (N2 > 1E-30) then
          WriteLn(Ln(N1) / Ln(N2): 0: 30)
        else
          WriteLn('ERROR');
    end;
  until Abs(N2) < 1E-30;
end.


Операции: +, -, *, /, ^ (степень), v (корень), l (логарифм одного по основанию другого).
Для выхода из программы введите вторым числом ноль.
-Саня-
народ хелп плиз мне для коледжа калкулятор нужен дз задали помогите плиз !help.gif
Ozzя
-Саня-
Эту тему перечитай еще раз. rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.