Помощь - Поиск - Пользователи - Календарь
Полная версия: глюк > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
savedata
почему паскаль выдает мне непонятные значения, если в теле одновременно присутствуют вычисления сумм, типа вот этого


o:=0;
s:=0;

gettime(h1,m1,s1,hund1);
while s<100
begin
inc(s);
inc(o);
end;
gettime(h2,m2,s2,hund2);

writeln('время: ',h2-h1,':',m2-m1,':',s2-s1,':'hund2-hund1);
writein('s=',s,'o=',o);

он то время выдает вот такое: 0:0:65133:7 или 0:0:0:63488
то s=-23549
то o=-12044

это не только на моем компе, и в универе...кстати такую же фигню часто выдает при заполнении массива random типа как значения от -100 до 100:

A[i]:=random(200)-100;

выдает невероятные цифры
Vahappaday
О невероятных значениях времени...
У вас как объявлены h1,h2,m1,m2..... и иже с ними?

Видимо, эти цифры соответствуют небольшим отрицательным значениям. А тип, в который Вы их пишете - беззнаковый. Почему отрицательные? Потому что, например,
7h 23m 2s 11ms
-
7h 23m 1s 23ms
у Вас при поразрядном вычитании будет равно
0h 0m 1s -12ms.
Вычитать надо с "переносом разрядов". Либо искать какую-то специальную ф-ю паскаля - я с паскалем знаком слабовато.

Во FreePascal тип integer при выводе через writeln вполне корректно отображает отрицательные числа.

Загадку с отрицательными s, o не разгадал - давайте точный код, тогда можно будет смотреть.
savedata
Program sortirovka;
Uses dos,crt;
Var A:array[1..1000] of real;
min,k:real;
s,o,j,i,t,n:integer;
h1,m1,s1,hund1,h2,m2,s2,hund2:word;
begin

clrscr;

writeln('
программа сортировки массива поиском минимального элемента');
repeat

write('
введите отличное от 0 количество элементов массива - ');
readln(n);
until n>0;
readln;

o:=0;
// Устанавливаем количество произведенных сравнений элементов между собой.
s:=0; // Устанавливаем количество произведенных обменов элементов.

writeln('исходный массив сформированный случайным образом из ',n:0,' элементов');
writeln;

randomize;
for i:=1 to n do
begin
A[i]:=random(1000);
// Задается с помощью функции Random массив.
write(A[i]:4:0);
end;

writeln;
readln;

gettime(h1,m1,s1,hund1);
// С помощью функции gettime() получаем время начала выполнения сортировки.

for j:=1 to n-1 do // Осуществляем проход по массиву
begin
min:=A[j];
for i:=j to n do
// Минимальный элемент найденный в результате прохода по массиву в следующем проходе учитываться не будет.
begin
if min>=A[i] then
// Поиск минимального элемента массива.
begin
min:=A[i];
t:=i;
end;
inc(s);
// Считаем количество сравнений элементов.
end;
if A[t]<>A[j] then
// Если в результате прохода по массиву, оказалось что минимальный элемент стоит в начале массива, то обмена производиться не будет.
begin
k:=A[j];
A[j]:=A[t];
A[t]:=k;
inc(o);
// Считаем количество обменов элементов.
end;
end;

gettime(h2,m2,s2,hund2);
// С помощью функции gettime() получаем время окончания сортировки.

writeln;
writeln('
отсортированный массив');
writeln;
for i:=1 to n do write(A[i]:4:0);
// Вывод отсортированного массива на экран.
writeln;
writeln;
writeln('
Время сортировки массива: ',h2-h1,':',m2-m1,':',s2-s1,':',hund2-hund1); // ОТ конечного времени сортировки отнимаем время ее начала, результат выводим на экран.
writeln('Количество обменов - ',o:0); // Вывод на экран количества обменов элементов.
writeln('Количество сравнений - ',s:0); // Вывод на экран количества сравнений элементов.

readln;
end.
savedata
Цитата
Загадку с отрицательными s, o не разгадал - давайте точный код, тогда можно будет смотреть.


я попробовал заменить
o,s:integer на o,s:real

и тогда s:=s+1 и o:=o+1 он считает правильно

видимо это что то связано с памятью выделенной для значений integer
Vahappaday
Вам мешало переполнение s. Для него хорошо подойдёт тип longword - и беззнаковый, и целый, и 32-битный.
Для 1000 элементов s=500499 - в word (16-бит) никак не влезает, в longint влезет.
savedata
спасибо
у меня были подозрения на этот счет)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.