![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
savedata |
![]()
Сообщение
#1
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 64 Регистрация: 8.1.2011 Из: Красноярск Город: Krasnoyarsk Учебное заведение: СибГТУ Вы: студент ![]() |
почему паскаль выдает мне непонятные значения, если в теле одновременно присутствуют вычисления сумм, типа вот этого
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 |
![]()
Сообщение
#2
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
О невероятных значениях времени...
У вас как объявлены h1,h2,m1,m2..... и иже с ними? Видимо, эти цифры соответствуют небольшим отрицательным значениям. А тип, в который Вы их пишете - беззнаковый. Почему отрицательные? Потому что, например, 7h 23m 2s 11ms - 7h 23m 1s 23ms у Вас при поразрядном вычитании будет равно 0h 0m 1s -12ms. Вычитать надо с "переносом разрядов". Либо искать какую-то специальную ф-ю паскаля - я с паскалем знаком слабовато. Во FreePascal тип integer при выводе через writeln вполне корректно отображает отрицательные числа. Загадку с отрицательными s, o не разгадал - давайте точный код, тогда можно будет смотреть. |
savedata |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 64 Регистрация: 8.1.2011 Из: Красноярск Город: Krasnoyarsk Учебное заведение: СибГТУ Вы: студент ![]() |
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 |
![]()
Сообщение
#4
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 64 Регистрация: 8.1.2011 Из: Красноярск Город: Krasnoyarsk Учебное заведение: СибГТУ Вы: студент ![]() |
Цитата Загадку с отрицательными s, o не разгадал - давайте точный код, тогда можно будет смотреть. я попробовал заменить o,s:integer на o,s:real и тогда s:=s+1 и o:=o+1 он считает правильно видимо это что то связано с памятью выделенной для значений integer |
Vahappaday |
![]()
Сообщение
#5
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Вам мешало переполнение s. Для него хорошо подойдёт тип longword - и беззнаковый, и целый, и 32-битный.
Для 1000 элементов s=500499 - в word (16-бит) никак не влезает, в longint влезет. |
savedata |
![]()
Сообщение
#6
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 64 Регистрация: 8.1.2011 Из: Красноярск Город: Krasnoyarsk Учебное заведение: СибГТУ Вы: студент ![]() |
спасибо
у меня были подозрения на этот счет) |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 28.5.2025, 21:38 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru