Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 2
Регистрация: 30.04.2010
Сообщений: 11
1

Один и тот же код работает по-разному

28.11.2011, 19:23. Показов 1585. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Составила программу, программа работает, выдаёт верное решение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
n,i,j,k,r:integer;
min:array[1..10000]of integer;
begin
readln(n);
if sqrt(n)=trunc(sqrt(n))then min[n]:=1 else
begin
for i:=1 to n do
min[i]:=i;
for i:=1 to n do
for j:=1 to trunc(sqrt(i))do
begin
r:=i-sqr(j);
k:=min[r]+1;
if k<min[i] then min[i]:=k;
end;
end;
writeln(min[n]);
readln;
end.
Например, ввожу 128, получаю 2. Это правильный ответ.
Для n=108, ответ 3
Приятельница скопировала у меня эту программу, допустив единственное отличие: в объявлении переменных переставила местами переменные k и r.
То есть написала
Pascal
1
2
var
n,i,j,r,k:integer;
Итог поразительный! Программа для некоторых данных выдаёт неверные результаты!
Для n=128 ответ =5
для n=108 ответ 4
Всё остальное проверено досимвольно, всё верно, более того, неверная программа после перестановки переменных во второй строке работает ВЕРНО!!!
Это кто-нибудь может объяснить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2011, 19:23
Ответы с готовыми решениями:

Один и тот же код по разному работает
Доброго времени суток, уважаемые товарищи! Решил написать код, заполняющий диагональ двумерной...

Один и тот же код, но работает по разному
Один и тот же код но работает по разному. Если запускать код по шагам отрабатывает на все 100%, а...

Один и тот же код на Си и Паскале работает по-разному!
Задача: найти в массиве наидлиннейшую цепочку отрицательных элементов, вырезать её и вставить в...

Почему в WEB приложении и в обычном один и тот же код по разному работает?
static Boolean Auth(String data) { String dbURL =...

11
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2011, 19:25 2
Так конечно, переменная к зависит от r, если ее переставить вперед, то r не определено, по умолчанию всегда=0.
0
0 / 0 / 2
Регистрация: 30.04.2010
Сообщений: 11
28.11.2011, 19:28  [ТС] 3
Не сочтите за тупость, поясните, причём здесь объявление переменных?
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
28.11.2011, 19:36 4
Puporev, у тебя не сходится. k стоит впереди, но программа правильно работает.
И вообще, с каких пор результат стал зависеть от порядка перечисления переменных в var?
Может паскаль кривой?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.11.2011, 19:40 5
Цитата Сообщение от Puporev Посмотреть сообщение
Так конечно, переменная к зависит от r, если ее переставить вперед, то r не определено, по умолчанию всегда=0.
Бред. Паскаль - компилируемый язык. Поэтому сначала создаются все переменные, а потом уже запускается исполнение. И значения по той же причине не зависят от деклараций.
0
0 / 0 / 2
Регистрация: 30.04.2010
Сообщений: 11
28.11.2011, 19:51  [ТС] 6
Нет, Паскаль у меня не кривой, а стандартный ТР-7, но на всякий случай скопировала Паскаль из рекомендуемого здесь, запустила в нём - результат идентичный. Вывод ужасен:

результат работы программы зависит от порядка перечисления имён переменных при их объявлении.
Это как-то можно объяснить?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2011, 20:04 7
кот Бегемот,Я почему-то подумал что переставили
Pascal
1
2
r:=i-sqr(j);
k:=min[r]+1;
А так конечно девичий бред.

Добавлено через 5 минут
Здесь
Pascal
1
2
r:=i-sqr(j);
k:=min[r]+1;
вообще неверно написано, r может быть меньше 1 и выход за диапазон, в Турбо Паскале при выключенном Range Error может любую хрень выкинуть, и объявление переменных тут вообще не при чем.
1
0 / 0 / 2
Регистрация: 30.04.2010
Сообщений: 11
28.11.2011, 20:09  [ТС] 8
Цитата Сообщение от Puporev Посмотреть сообщение
А так конечно девичий бред.
Вот скопируйте, попробуйте, убедитесь и извинитесь.

Добавлено через 5 минут
Цитата Сообщение от Puporev Посмотреть сообщение
Здесь
Pascal
1
2
r:=i-sqr(j);
k:=min[r]+1;
вообще неверно написано, r может быть меньше 1 и выход за диапазон, в Турбо Паскале при выключенном Range Error может любую хрень выкинуть, и объявление переменных тут вообще не при чем.
Исправляется просто:
заменяем начальное значение i на 0
for i:=0 to n do
min[i]:=i;
и теперь min[0] существует, за диапазон мы не выходим, но это не решает проблемы
0
54 / 54 / 43
Регистрация: 11.12.2009
Сообщений: 110
28.11.2011, 20:09 9
Действительно, если поменять местами переменные в объявлении, то выдает другой результат
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2011, 20:16 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Напишите так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
n,i,j,k,r:integer;
min:array[0..10000]of integer;
begin
readln(n);
if sqrt(n)=trunc(sqrt(n))then min[n]:=1 else
begin
for i:=1 to n do
min[i]:=i;
for i:=1 to n do
for j:=1 to trunc(sqrt(i))do
begin
r:=i-sqr(j);
k:=min[r]+1;
if k<min[i] then min[i]:=k;
end;
end;
writeln(min[n]);
end.
и хоть как меняйте переменные
0
0 / 0 / 2
Регистрация: 30.04.2010
Сообщений: 11
28.11.2011, 20:17  [ТС] 11
Да. Видимо, связано с выходом за пределы массива.
Подправила объявление массива и начальное значение, - всё заработало
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
n,i,j,k,r:integer;
min:array[0..10000]of integer;
begin
readln(n);
if sqrt(n)=trunc(sqrt(n))then min[n]:=1 else
begin
for i:=0 to n do
min[i]:=i;
for i:=1 to n do
for j:=1 to trunc(sqrt(i))do
begin
r:=i-sqr(j);
k:=min[r]+1;
if k<min[i] then min[i]:=k;
end;
end;
writeln(min[n]);
readln;
end.
Но вопрос остался: почему при одном порядке объявлений решение верное, а при другом - нет?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2011, 20:18 12
Вечно вместо того чтобы подумать, включить проверку, пошаговую детализацию, начинают про чудеса, глючный Паскаль и прочее...
0
28.11.2011, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2011, 20:18
Помогаю со студенческими работами здесь

Один и тот же код выполняется по-разному
имеется код если его выполнять в visual studio 2010 то он выполняется по разному, иногда выводит ...

Один и тот же рекордсет - но работает по разному
Один и тот же рекордсет - но работает по разному. В чем причина ? Cм. текст ниже. ...

Один и тот же внешний жесткий диск по разному работает на двух похожих ноутбуках
Один и тот же внешний жесткий диск по разному работает на двух похожих ноутбуках. От чего это...

Text-align: justify один код работает по разному
Имеется код, выравнивающий гориз-е меню с помощью text-align: justify....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru