0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 8
1

Арифметическое переполнение

19.07.2010, 09:40. Показов 20195. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня проблема: все программы выдают арифметическое переполнение. В универе дали методичку перевести паскаль в асм, но проблема в том что те примеры на паскале - дают арифметическое переполнение. сборка: school pak. вот один из примеров.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
program primer;
uses crt;
var n:word; i,k: array [1..1000] of word;
BEGIN
n:=34;
i[n]:=587;
k[n]:=19;
while i[n] > 199 do
if ((i[n] + k[n]) div 11) = 5
  then i[n]:=i[n] - k[n]
  else k[n]:=k[n]*k[n]+(i[n] div 2);
writeln('i[n]=',i[n], 'k[n]=',k[n]);
end.
в чем ошибка!???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2010, 09:40
Ответы с готовыми решениями:

Арифметическое переполнение
Арифметическое переполнение в чем проблема не могу понять помогите const nn=16; type mas=array of...

Арифметическое переполнение
Ребят, пишет " Арифметическое переполнение ", в чем ошибка?program lab04;...

Подскажите где ошибка. Выдаёт арифметическое переполнение?
program z1; USES crt; const N= 10; var x: array of integer; i: integer; y: array of integer;...

Переполнение
Var z, k, temp, MaxExtended:extended; n, i:integer; Begin k:=13; z:=15; ...

17
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 10:36 2
О каком переполнении идет речь?

Запустите программу, чтобы она показывала результаты на каждом шаге:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program primer;
uses crt;
var n:word; i,k: array [1..1000] of word;
BEGIN
n:=34;
i[n]:=587;
k[n]:=19;
while i[n] > 199 do
begin
   if ((i[n] + k[n]) div 11) = 5
     then i[n]:=i[n] - k[n]
     else k[n]:=k[n]*k[n]+(i[n] div 2);
 
writeln(\'i[n]=\',i[n], \'  k[n]=\',k[n]);
end;
 
writeln(\'i[n]=\',i[n], \'k[n]=\',k[n]);
end.
У меня повторяются одни и те же значения и програма бесконечно зацикливается...
0
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
19.07.2010, 10:41 3
Так и есть, арифметическое переполнение)) не врет.

после первого прохода k[n] = 654, а i[n] = 587.
а потом, при втором проходе мы пытаемся сделать
Pascal
1
else k[n]:=k[n]*k[n]+(i[n] div 2);
в результате k[n] должно стать равно 428303, что больше максимального значения, хранимого переменной типа WORD в 0,65336404616076944785556835256699 раза. Отсюда и ошибка.
0
156 / 158 / 93
Регистрация: 01.01.2010
Сообщений: 398
19.07.2010, 10:43 4
уже все написали, но от себя добавлю, что school pak иногда подтупливает без причины.
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 11:12 5
Цитата Сообщение от Jabbson Посмотреть сообщение
Так и есть, арифметическое переполнение)) не врет.

после первого прохода k[n] = 654, а i[n] = 587.
а потом, при втором проходе мы пытаемся сделать
Pascal
1
else k[n]:=k[n]*k[n]+(i[n] div 2);
в результате k[n] должно стать равно 428303, что больше максимального значения, хранимого переменной типа WORD в 0,65336404616076944785556835256699 раза. Отсюда и ошибка.
Вот результаты выполнения программы (это начало, а потом зацикливается с постоянными значениями):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
i[n]=587  k[n]=654
i[n]=587  k[n]=34793
i[n]=587  k[n]=37686
i[n]=587  k[n]=4233
i[n]=587  k[n]=27254
i[n]=587  k[n]=61321
i[n]=587  k[n]=6262
i[n]=587  k[n]=22409
i[n]=587  k[n]=26742
i[n]=587  k[n]=6025
i[n]=587  k[n]=59510
i[n]=587  k[n]=6025
i[n]=587  k[n]=59510
i[n]=587  k[n]=6025
i[n]=587  k[n]=59510
i[n]=587  k[n]=6025
А что там должно быть... Но оно вот так.
Попробуйте запустить сами!

P.S. Паскаль ограничивает значения переменных по их типу.
0
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
19.07.2010, 11:52 6
o-user, не говорите ерунды, посчитайте руками.

Вот посмотрите как это происходит при отладке:
http://www.swfcabin.com/open/1279523648
0
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 8
19.07.2010, 12:58  [ТС] 7
Спасибо. Значит все-таки ошибка в самом задании?? Просто уже второй пример пытаюсь выполнить "в живую", как написано в книге, и все одинаково - переполнение.

А вот по этому примеру вообще выдает ошибку: ошибочная переменная контролирующая for.
подскажите плиз что за фигня такая.. и как мне убрать ошибку, чтоб хоть один пример заработал.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
program variant2;
uses crt;
var n:word; j,k: array [1..1000] of word;
BEGIN
n:=23;
j[n]:=2;
for k[n]:=$AFA downto 9 do
    if((k[n] div 4)=3) or (k[n] mod 100=0)
    then j[n]:=j[n] * k[n] + k[n] * k[n]
    else j[n]:=j[n]+k[n];
writeln('j[n]=',j[n]);
end.
ps/ Jabbson, как сделать такое пошаговое выполнение с просмотром результата??
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 13:17 8
Цитата Сообщение от Jabbson Посмотреть сообщение
o-user, не говорите ерунды, посчитайте руками.

Вот посмотрите как это происходит при отладке:
http://www.swfcabin.com/open/1279523648
Вообще-то я написал.
Считают мозгом, а не руками.
Запустите программу прежде чем писать!
0
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
19.07.2010, 15:04 9
Цитата Сообщение от jeckie Посмотреть сообщение
ps/ Jabbson, как сделать такое пошаговое выполнение с просмотром результата??
Отладка - в меню Debug - F7 (с заходом в подпрограммы) и F8 (без захода)

Цитата Сообщение от o-user Посмотреть сообщение
Считают мозгом, а не руками.
Ну так я и подумал, что Вы наверное мозгом считали, поэтому и предложил попробовать руками.

Особо недоверчивым запускаю программу:
http://www.swfcabin.com/open/1279534267

k[n] = 0 --> k[n] = 19 --> после else k[n] = 654 --> при втором else k[n]= 654*654+(587 div 2) = 654 * 654 +293 = 428009, что больше допустимого в WORD.

Добавлено через 14 минут
Цитата Сообщение от jeckie Посмотреть сообщение
for k[n]:=$AFA downto 9 do
не работает из-за k[n]
0
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 8
20.07.2010, 07:29  [ТС] 10
Цитата Сообщение от Jabbson Посмотреть сообщение
не работает из-за k[n]
Jabbson, если не сложно подскажи как исправить. в pascal'e 6 лет ничего не писал, да и тогда не очень умел.
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,182
20.07.2010, 07:45 11
Зачем переменные j,k объявлены как массивы? Ведь нет же никаких массивов и в помине.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
program variant2;
uses crt;
var  j,k:word;
BEGIN
j:=2;
for k:=$AFA downto 9 do
if((k div 4)=3) or (k mod 100=0)
then j:=j * k + k * k
else j:=j+k;
writeln('j=',j);
readln
end.
Добавлено через 2 минуты
Если нужно создать 2 массива размерностью 23, то нужно организовать внешний цикл типа
Pascal
1
2
for i:=1 to n do
 begin
и здесь уже вычислять k[i],j[i].
1
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
20.07.2010, 11:24 12
Цитата Сообщение от jeckie Посмотреть сообщение
как исправить
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
 program variant2;
uses crt;
var i:integer; n:word; j,k: array [1..1000] of word;
BEGIN
n:=23;
j[n]:=2;
for i:=$AFA downto 9 do
    if((k[n] div 4)=3) or (k[n] mod 100=0)
    then j[n]:=j[n] * k[n] + k[n] * k[n]
    else j[n]:=j[n]+k[n];
writeln('j[n]=',j[n]);
end.
Ну вот так например ошибки уже не будет.
уточню, что то, что делает сама программа - это уже другой вопрос, она очень долго и нудно совершает действия с нулями. и дает нулевой результат. Но так, она хотя бы это делает
1
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 8
20.07.2010, 11:53  [ТС] 13
Спасибо, Jabbson. Не знаю, то ли программа теперь выполняет, что от меня хотели в методичке, но все равно спасибо. Я так понял, что так как написано в книге, полная чушь выходит?? (хочу удостовериться, просто чтобы сказать это преподам).
0
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
20.07.2010, 12:01 14
полная чушь выходит?? (хочу удостовериться, просто чтобы сказать это преподам)
То, как было написано нигде и никогда работать не будет, а вот преподам так говорить не стоит, они всегда очень нежно и чутко относятся к своим методичкам. Лучше дать расплывчатое впечатление о прочитанном материале, типа "я вот тут прочитал, но не уверен, что правильно понял, не могли бы Вы, пожалуйста, объяснить смысл этой глубоко-философской записи?", ну или что-то в этом роде.
0
156 / 158 / 93
Регистрация: 01.01.2010
Сообщений: 398
20.07.2010, 12:08 15
Цитата Сообщение от Jabbson Посмотреть сообщение
"я вот тут прочитал, но не уверен, что правильно понял, не могли бы Вы, пожалуйста, объяснить смысл этой глубоко-философской записи?
Чтобы получить удивленное пожимание плечами?
0
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
20.07.2010, 12:09 16
Цитата Сообщение от DeLuxe Посмотреть сообщение
Чтобы получить удивленное пожимание плечами?
Ну так скажем, чтобы ходить сдавать экзамен только один раз ))))
были у нас индивиды, приходили и начинали обкладывать методичку разными плохими вещами,
сдавали долго, с чувством с толком, и расстановкой. И не было важно, что они в действительности были чуть ли не лучшими по предмету. Когда преподаватель действительно хочет, чтобы ты сдавал долго - сдавать будешь долго )))
0
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 8
20.07.2010, 12:49  [ТС] 17
Цитата Сообщение от Jabbson Посмотреть сообщение
То, как было написано нигде и никогда работать не будет, а вот преподам так говорить не стоит, они всегда очень нежно и чутко относятся к своим методичкам. Лучше дать расплывчатое впечатление о прочитанном материале, типа "я вот тут прочитал, но не уверен, что правильно понял, не могли бы Вы, пожалуйста, объяснить смысл этой глубоко-философской записи?", ну или что-то в этом роде.
Ну, да понятно. просто надо быть уверенным, в том что он мне не скажет тут же что я дурак и ничего не понимаю, а эта методичка просто "супер" книга. ))
ps/ спасиб всем.
0
Эксперт по компьютерным сетям
5901 / 3358 / 1036
Регистрация: 03.11.2009
Сообщений: 10,009
20.07.2010, 13:06 18
Ну тогда ты можешь попросить компьютер с TP, вбить программу и показать на
Error 97: Invalid FOR control variable (как вариант - Error: Illegal counter variable)
и сказать, что управляющая переменная цикла должна быть переменной порядкового перечисляемого типа. Я думаю, возразить будет нечего.
0
20.07.2010, 13:06
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2010, 13:06
Помогаю со студенческими работами здесь

Почему происходит переполнение?
Только учусь паскалю так что имейте ввиду если не знаю чего-то элементарного. Вобщем вот код с...

найти ошибку(переполнение.)
Задание во вложении. На 11 строке выдает переполнение. Или ,если не сможите увидеть...

Вещественное переполнение, исправить код
помогите пожалуйста, при решении данной матрицы 3 2 10 -7 ...

Арифметическое переполнение
Люди помогите пожалуйста найти ошибку, сколько не мучал не могу понять где ошибка, uses DOS,...

Арифметическое переполнение
при запуске программы пишет про арифметическое переполнение,как от этого избавиться? вот код:...

Арифметическое переполнение
program massiv; uses crt; const n=20; var mas : array of integer; i : integer; begin...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как узнать директорию bash-скрипта из самого bash-скрипта
InfoMaster 20.01.2025
При разработке bash-скриптов одной из важных задач является определение директории, в которой находится исполняемый скрипт. Это критически важно для корректной работы с файлами, загрузки конфигураций. . .
В чем разница между let и var в JavaScript
InfoMaster 20.01.2025
JavaScript прошел длинный путь эволюции с момента своего создания в 1995 году. Одним из важнейших аспектов развития языка стало совершенствование механизмов объявления и управления переменными. . . .
Эффективная работа со строками в Go
InfoMaster 20.01.2025
Язык программирования Go предлагает уникальный подход к работе со строками, который существенно отличается от многих других языков программирования. В Go строки представляют собой неизменяемые. . .
Как проверить, что отображение (map) содержит ключ в Go
InfoMaster 20.01.2025
Отображения (maps) в языке программирования Go представляют собой мощные структуры данных, которые позволяют хранить пары ключ-значение и обеспечивают быстрый доступ к данным по уникальным. . .
Как организовать домашнее хранилище фильмов с общим доступом для всей семьи
InfoMaster 20.01.2025
Преимущества домашнего медиасервера В современном мире, где цифровой контент стал неотъемлемой частью нашей жизни, организация домашнего медиасервера становится все более актуальной задачей. . . .
Перспективы развития жестких дисков: есть ли у них будущее?
InfoMaster 20.01.2025
История и эволюция жестких дисков История развития жестких дисков начинается в 1956 году, когда компания IBM представила первое устройство для хранения данных на магнитных пластинах - IBM 350. . .
Распознавание изображений (компьютерное зрение) на C++
InfoMaster 20.01.2025
Введение в компьютерное зрение и основы работы с изображениями Компьютерное зрение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, позволяющую. . .
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru