|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Написать программу на Delphi 7
Составить программу которая проверяла бы не приводит ли суммирование двух целых чисел A и B к переполнению(т.е. к результату большему, чем 32767). Если будет переполнение, то сообщить об этом, иначе вывести сумму этих чисел. Напишите пожалуйста программу полностью. Заранее спасибо!!!!
|
#2
|
||||
|
||||
var
x,y: Integer; begin if x+y>32767 then ShowMessage('Ошибка') else ShowMessage(IntToStr(x+y)) end; Запихнеш в процедуру и всё |
#3
|
||||
|
||||
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
|
||||
|
||||
Цитата:
Этот код нерабочий. Т.к при попытке сложить 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
|
||||
|
||||
Да с приведением суммы я чего-то не предусмотрел. Тут вы правы.
|
#6
|
|||
|
|||
Код:
Try X:= A + B; ShowMessage(IntToStr(X)); Except ShowMessage('Overflow'); end; |
#7
|
||||
|
||||
Цитата:
Как уже говорилось, нужно использовать 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
|
||||
|
||||
Еще можно проверять по такому же принципу, как проверяет процессор:
Код:
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
|
||||
|
||||
Господа!
Вы забыли про такой 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
|
||||
|
||||
Цитата:
Кстати вот для беззнаковых: Код:
z:=x+y; if (z<x) or (z<y) then ShowMessage('Overflow') else ShowMessage(IntToStr(z)); РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |