IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> калькулятор, Все сделала кроме ограничения
сообщение
Сообщение #1


Гость






Надо поставить огрничения на ответ....т.е. например при сложение 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.


Спасибо!!!!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Liba

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

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

Код

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


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






например так....

Код
'+': 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;



а вот как все это в мою программу вставить,....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Но зачем это нужно? Каков смысл ограничения? Если в вышеприведенный код ввести a = 32760 и b = 100, будет выдано сообщение о превышении числом b допустимого значения blink.gif

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Может имелось ввиду ограничение такое, что бы не возникала ошибка переполнения ? То есть при вводу в INTEGER числа 650000, программа не вылетала по RUN-TIME-ERROR, а цивилизованно сообщала об ошибке ? smile.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Oleg_Z

Она не пользуется целочисленными типами...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






нам так сказал препод..........

Цитата
Oleg_Z

Да,точно на переполнение....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Ну так как это вставить????в мою программку???
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
Ну так как это вставить

Ну может нам объяснят смысл этой "вставки"? Дело в том, что переполнения в приведенной программе произойти просто не может, так как не используются целочисленные типы ... А чтобы переполнить Real нужно очень постараться...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Тгогда я не правильно написала программу и нгадо поменять Real на Integer,а как вставить эту часть программы в мою?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
Тгогда я не правильно написала программу и нгадо поменять Real на Integer

lol.gif lol.gif
Это назывется - если нет проблемм, я их себе сделаю :D lol.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Тогда просто директива кажется есть для отключения проверки на переполнение.. забыл какая.. никогда этим не пользуюсь smile.gif :D


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






А что мне делать тогда...........он сказал с этим написать..............(((
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Скажи ему то, что мы тут сказали!
можешь прямо отпечатать, я за свои слова отвечаю... smile.gif :P
и покажи ему это! :P :yes:


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






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:
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






спасибочки)))))
ростается все это воспроизвести преподу))))
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.09.2025 20:14
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name