Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.03.2009, 20:23
Юрис 2009 Юрис 2009 вне форума
Прохожий
 
Регистрация: 15.03.2009
Сообщения: 16
Репутация: -3
Восклицание Написать программу на Delphi 7

Составить программу которая проверяла бы не приводит ли суммирование двух целых чисел A и B к переполнению(т.е. к результату большему, чем 32767). Если будет переполнение, то сообщить об этом, иначе вывести сумму этих чисел. Напишите пожалуйста программу полностью. Заранее спасибо!!!!
Ответить с цитированием
  #2  
Старый 15.03.2009, 20:32
Аватар для tormoz
tormoz tormoz вне форума
Прохожий
 
Регистрация: 15.03.2009
Сообщения: 3
Репутация: 10
По умолчанию

var
x,y: Integer;
begin
if x+y>32767 then
ShowMessage('Ошибка')
else
ShowMessage(IntToStr(x+y))
end;
Запихнеш в процедуру и всё
Ответить с цитированием
  #3  
Старый 15.03.2009, 23:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

1. В дельфи Integer уже давно в диапазоне -2147483648..2147483647
2. Надо еще обрабатывать ситуацию с отрицательным числом.
а посему надо наверное так:
Код:
var
x,y: Integer;
begin
if (x+y>High(Integer)) or (x+y<Low(Integer)) then
ShowMessage('Ошибка')
else
ShowMessage(IntToStr(x+y))
end;
Ответить с цитированием
  #4  
Старый 15.03.2009, 23:54
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

Цитата:
Сообщение от Страдалецъ
1. В дельфи Integer уже давно в диапазоне -2147483648..2147483647
2. Надо еще обрабатывать ситуацию с отрицательным числом.
а посему надо наверное так:
Код:
var
x,y: Integer;
begin
if (x+y>High(Integer)) or (x+y<Low(Integer)) then
ShowMessage('Ошибка')
else
ShowMessage(IntToStr(x+y))
end;

Этот код нерабочий.
Т.к при попытке сложить x+y сумма записывается опять в Integer, а то что не влезло - обрезается. Поэтому данное условие всегда будет возвращать False;

Необходимо вручную преобразовывать один из арументов в Int64 тогда и сумма будет Int64
Код:
if (Int64(x)+y>High(Integer)) or (Int64(x)+y<Low(Integer)) then
  ShowMessage('Ошибка')
 else
  ShowMessage(IntToStr(x+y))
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
  #5  
Старый 16.03.2009, 14:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Да с приведением суммы я чего-то не предусмотрел. Тут вы правы.
Ответить с цитированием
  #6  
Старый 17.03.2009, 08:56
Act Act вне форума
Новичок
 
Регистрация: 01.11.2008
Сообщения: 72
Репутация: 10
По умолчанию

Код:
Try
  X:= A + B;
  ShowMessage(IntToStr(X));
 Except
  ShowMessage('Overflow');
 end;
Можно так попробовать
Ответить с цитированием
  #7  
Старый 17.03.2009, 10:16
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Сообщение от Act
Код:
Try
  X:= A + B;
  ShowMessage(IntToStr(X));
 Except
  ShowMessage('Overflow');
 end;
Можно так попробовать
Этот код не имеет смысла, т.к. IntToStr(X), в данном случае, не вызовет события Except.

Как уже говорилось, нужно использовать Int64:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  x: Int64;
  A, B: Integer;
begin
  X:= A + B;
  if ABS(x) > MaxInt then ShowMessage('Overflow') else ShowMessage('Ok');
end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #8  
Старый 17.03.2009, 11:21
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Еще можно проверять по такому же принципу, как проверяет процессор:
Код:
z:=x+y;
if ( (x>0) and (y>0) and (z<0) ) or ( (x<0) and (y<0) and (z>0) )then
  ShowMessage('Overflow')
else
  ShowMessage(IntToStr(z));
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #9  
Старый 18.03.2009, 09:45
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Господа!
Вы забыли про такой 2-х байтовый Integer как SmallInt
Тогда вся задача решается следующим образом:
Код:
var
D1,D2,D3:SmallInt;
begin
D1:=32767;
D2:=0;
D3:=D1+D2;
if D3<0 then
 begin
  ShowMessage('Overflow');
  Exit;
 end;
ShowMessage(IntToStr(D3));
end;
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #10  
Старый 18.03.2009, 14:21
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Цитата:
Сообщение от Thrasher
Господа!
Вы забыли про такой 2-х байтовый Integer как SmallInt
я не забыл) мой способ универсальный)

Кстати вот для беззнаковых:
Код:
z:=x+y;
if (z<x) or (z<y) then
  ShowMessage('Overflow')
else
  ShowMessage(IntToStr(z));
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter