Помощь - Поиск - Пользователи - Календарь
Полная версия: калькулятор
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Liba
Надо поставить огрничения на ответ....т.е. например при сложение a=100 в=30
а максимум может быть 100.......Это как пример так я знаю что есть максимально число это 32600 с чем то и -32600 с чем-то(я точно не знаю)так вот надо для всех операций сделать огарничение....не понимаю как......

Код
program Project4;
{$APPTYPE CONSOLE}
uses
 SysUtils;

var a,b,c     :Real;    //Операнды
   operator  :Char;    //Оператор
   prodolgit :Char;    //Флаг,показывающий запускать калькулятор или нет
   Err       :Boolean; //Флаг,показывающий ошибку ввода оператора
   i         :Integer; //Переменная цикла
begin
 prodolgit:='y';
 While prodolgit='y' do
 begin{of while}
    Err:=false;
    Write('Vvedite a: ');
    Readln(a);
    Write('Vvedite operator: ');
    Readln(operator);
    Write('Vvedite b: ');
    Readln(b);
    case operator of
    '+':
        c:=a+b;
    '-':
        c:=a-b;
    '*':
        c:=a*b;
    '/':
       begin{of '/'}
        If b=0 then
         begin{of if }
          Writeln('Delit na nol nelzya!!!!');
          Err:=true;
         end {of if}
        else
         C:=a/b;
       end{of '/'};
    '^':
        begin{of ^}
         If b=0 then
          c:=1
         else
          If b>1 then
          begin
           c:=1;
           For i:=1 to round(b) do
           Begin{of for}
            c:=c*a;
           end{of for};
          end
          else
          If b<1 then
          begin
          b:=b*(-1);
           c:=1;
           For i:=1 to round(b) do
           Begin{of for}
            c:=c*a;
           end{of for};
           c:=1/c;
          end;
        end{of ^}
    else
     begin{of else}
      Writeln('Ohibka!!!!!');
      Err:=true;
     end;{of else}
    end;{of case}
    If Err=false then
     Writeln('Otvet: ', c:5:2);
     Writeln;
    Write('Hotite eche vospolzovatsya calcylyatorom?(y/n) ');
    Readln(prodolgit);
    Writeln;
 end;{of while}
end.


Спасибо!!!!
volvo
Liba

Уточните, пожалуйста, что должно произойти в случае выхода результата за заданные рамки...

P.S.
Возможно имеется в виду, как избежать переполнения?
Обычно для того, чтобы избежать ошибок переполнения, тип результата достаточно сделать более емким, чем тип операндов:

Код

Var
 a, b: Double;
 c: Extended; { теперь переполнения произойти не должно }
Liba
например так....

Код
'+': begin
       Repeat
       If abs(a)>32768 then b
       begin
        writeln('Chislo a previsaet dopustimoe znachenie. Vvedite dr. chislo');
        Readln(a);
        z:=1;
       end {if}
       else z:=0;
        If abs((a/2)+(b/2))>32768/2   then
        begin
          Writeln('Chislo b previsaet dopustimoe znachenie. Vvedite dr. chislo');
          Readln(b);
          z:=1;
        end {if}
        else z:=0;
        until z=0;
           Writeln('a+b=',a+b);
       end;



а вот как все это в мою программу вставить,....
volvo
Но зачем это нужно? Каков смысл ограничения? Если в вышеприведенный код ввести a = 32760 и b = 100, будет выдано сообщение о превышении числом b допустимого значения blink.gif
Altair
Может имелось ввиду ограничение такое, что бы не возникала ошибка переполнения ? То есть при вводу в INTEGER числа 650000, программа не вылетала по RUN-TIME-ERROR, а цивилизованно сообщала об ошибке ? smile.gif
volvo
Oleg_Z

Она не пользуется целочисленными типами...
Altair
Да, только посмотрел код ....
тогда я тоже не понимаю, зачем ограничение.... blink.gif
Liba
нам так сказал препод..........

Цитата
Oleg_Z

Да,точно на переполнение....
Liba
Ну так как это вставить????в мою программку???
volvo
Цитата
Ну так как это вставить

Ну может нам объяснят смысл этой "вставки"? Дело в том, что переполнения в приведенной программе произойти просто не может, так как не используются целочисленные типы ... А чтобы переполнить Real нужно очень постараться...
Liba
Тгогда я не правильно написала программу и нгадо поменять Real на Integer,а как вставить эту часть программы в мою?
Altair
Цитата
Тгогда я не правильно написала программу и нгадо поменять Real на Integer

lol.gif lol.gif
Это назывется - если нет проблемм, я их себе сделаю :D lol.gif
Altair
Тогда просто директива кажется есть для отключения проверки на переполнение.. забыл какая.. никогда этим не пользуюсь smile.gif :D
Liba
А что мне делать тогда...........он сказал с этим написать..............(((
Altair
Скажи ему то, что мы тут сказали!
можешь прямо отпечатать, я за свои слова отвечаю... smile.gif :P
и покажи ему это! :P :yes:
volvo
Liba

Если уж очень хочется поработать с типом Integer - приведу возможный алгоритм проверки на переполнение...
Ваш код:

       Repeat
      If abs(a)>32768 then b
      begin
       writeln('Chislo a previsaet dopustimoe znachenie. Vvedite dr. chislo');
       Readln(a); { ????? }
       z:=1;
      end {if}
      else z:=0;
       If abs((a/2)+(b/2))>32768/2   then
       begin
         Writeln('Chislo b previsaet dopustimoe znachenie. Vvedite dr. chislo');
         Readln(b);
         z:=1;
       end {if}
       else z:=0;
       until z=0;


не имеет смысла, по очень простой причине: посмотрите туда, где я поставил знаки вопроса. А что будет, если пользователь введет туда число, скажем, 40000? Оно запишется с ошибкой, и "а" будет равно (-25536). Так что этот способ смысла не имеет... Я бы сделал ввод чисел в строку, а потом из строки вытаскивал число, проверяя его на переполнение.
Но зачем это нужно, если программа и так работает? (Кстати, если поменять Real на Integer, программа начнет вылетать при вводе значений с плавающей точкой)
В общем, не заморачивайтесь с этим, оставьте все как есть :yes:

Oleg_Z
:p9:
Guest
спасибочки)))))
ростается все это воспроизвести преподу))))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.