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

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

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

> калькулятор, Все сделала кроме ограничения
Liba
сообщение 30.10.2004 10:55
Сообщение #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.


Спасибо!!!!
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 16)
volvo
сообщение 30.10.2004 13:06
Сообщение #2


Гость






Liba

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

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

Код

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


Сообщение отредактировано: volvo - 30.10.2004 14:56
 К началу страницы 
+ Ответить 
Liba
сообщение 30.10.2004 21:29
Сообщение #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;



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


Гость






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

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


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

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

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


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


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


Гость






Oleg_Z

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


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

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

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


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


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


Гость






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

Цитата
Oleg_Z

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


Гость






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


Гость






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

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


Гость






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


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

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

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


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

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


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


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

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

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


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


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


Гость






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


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

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

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


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.11.2004 0:25
Сообщение #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:
 К началу страницы 
+ Ответить 
Guest
сообщение 19.11.2004 0:27
Сообщение #17


Гость






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

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

 



- Текстовая версия 20.07.2025 6:10
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"