Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для Negor
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289

непонятки с программой. код ведёт себя по разному

29.03.2010, 16:16. Показов 1088. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предыстория - нужно нарисовать часы, которые бы показывали реальное время;
Всё шло хорошо до того момента, как секундная стрелка переходила с 59 в 0. Она вела себя неадекватно - отставала градуса на 4; При переходе на метку 15 сек всё становилось хорошо и ломалось опять при переходе с 59 в 0;
Прогнав программу в отладчике обнаружил что действительно при расчёте секунд от 0 до 15 некорректно определяются координаты конца линии для секундной стрелки(пересчёт из полярной в декартову систему координат)
НО!!!! Если взять и скопировать пересчёт в новую программу - всё считает нормально. Где косяк?
Вот участок перегона системы координат
Pascal
1
2
x:=round(180*cos((oldsec*6-90)*3.14/180));
y:=round(180*sin((oldsec*6-90)*3.14/180));
вот весь код

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
program clock;
uses crt, graph, windos;
Var grDriver : Integer;
    grMode : Integer;
    ErrCode : Integer;
    i:integer;
    x, y:integer;
    clock_radius:integer;
    hour, min, sec, dsec, oldsec, oldmin, oldhour:word;
    buff, strh, strm, strs:string;
 
Function IntToStr(I : Longint) : String;
{ ЏаҐ®Ўа*§®ўлў*Ґв §**зҐ*ЁҐ вЁЇ* Integer ў бва®Єг }
Var S : String [11];
Begin
 Str(I, S);
 IntToStr:=S;
End;
 
Begin
 grDriver:=Detect;
 InitGraph(grDriver, grMode, 'egavga.bgi');
 ErrCode:=GraphResult;
 If ErrCode = grOk Then
  Begin
   { ѓа*дЁЄ* }
   clock_radius:=GetMaxY div 2-10;
   Circle(GetMaxX div 2, GetMaxY div 2, clock_radius);
   MoveTo(GetMaxX div 2, GetMaxY div 2);
   for i:=0 to 59 do
   begin
        SetColor(black);
        x:=round((Clock_radius-30)*cos(i*6*3.14/180));
        y:=round((Clock_radius-30)*sin(i*6*3.14/180));
        LineRel(x , y);
        SetColor(green);
        x:=round(-20*cos(i*6*3.14/180));
        y:=round(-20*sin(i*6*3.14/180));
        LineRel(x, y);
        MoveTo(GetMaxX div 2, GetMaxY div 2);
   end;
       repeat
         {gettime(hour, min, sec, dsec);}
         inc(sec);
         if sec=60 then sec:=0;
         if sec<>oldsec then
           begin
             {Steret staroe}
             SetColor(black);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(180*cos((oldsec*6-90)*3.14/180));
             y:=round(180*sin((oldsec*6-90)*3.14/180));
             LineRel(x,y);
             outtextxy(GetMaxX div 2-20, GetMaxY div 2+100, IntToStr(hour)+':'+IntToStr(min)+':'+IntToStr(oldsec));
             oldsec:=sec;
 
             {risovat novoe}
             SetLineStyle(0, 0, 0);
             SetColor(Yellow);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(180*cos((sec*6-90)*3.14/180));
             y:=round(180*sin((sec*6-90)*3.14/180));
             LineRel(x,y);
             SetColor(red);
             outtextxy(GetMaxX div 2-20, GetMaxY div 2+100, IntToStr(hour)+':'+IntToStr(min)+':'+IntToStr(sec));
           end;
         if min<>oldmin then
           begin
             {stiraem staruju minutnuju strelku}
             SetLineStyle(0, 0, 3);
             SetColor(black);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(150*cos(oldmin*6*3.14/180));
             y:=round(150*sin(oldmin*6*3.14/180));
             LineRel(x, y);
             {risuem novuju minutnuju strelku}
             SetColor(Red);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(150*cos(min*6*3.14/180));
             y:=round(150*sin(min*6*3.14/180));
             LineRel(x, y);
             oldmin:=min;
           end;
         if hour<>oldhour then
           begin
             {stiraem staruju minutnuju strelku}
             SetLineStyle(0, 0, 3);
             SetColor(black);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(100*cos(oldhour*6*3.14/180));
             y:=round(100*sin(oldhour*6*3.14/180));
             LineRel(x, y);
             {risuem novuju minutnuju strelku}
             SetColor(Green);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(100*cos(hour*6*3.14/180));
             y:=round(100*sin(hour*6*3.14/180));
             LineRel(x, y);
             oldhour:=hour;
           end;
       until keypressed;
   CloseGraph;
  End
 Else WriteLn('ЋиЁЎЄ* Ё*ЁжЁ*«Ё§*жЁЁ Ја*дЁЄЁ:', GraphErrorMsg(ErrCode));
End.
Буду рад любой помощи. Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2010, 16:16
Ответы с готовыми решениями:

Итератор по разному себя ведет в цикле
Есть такой кусочек кода: string findKey (string key) { for (auto it = sectionList.begin(); it != sectionList.end(); it++) ...

Qt ведет себя по разному с разными компиляторами
Вот пара примеров. С MinGW нормально работают следующие команды: rect.moveCenter(QDesktopWidget().availableGeometry().center()); и ...

Регулярка ведет себя по разному, на разных компьютерах
Имеется вот такой код. Задача: подсветить искомые слова. $string = &quot;Using testing this tool a trader can with one operation hold test...

10
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
29.03.2010, 18:29
Используйте вместо 3.14 функцию Pi:
Pascal
1
2
x:=round(180*cos((oldsec*6-90)*Pi/180));
y:=round(180*sin((oldsec*6-90)*Pi/180));
0
 Аватар для Negor
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
29.03.2010, 23:50  [ТС]
К сожалению не помогло
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.03.2010, 08:23
Мне кажется в принципе неверно использовать конечный цикл
Pascal
1
for i:=0 to 59 do
для бесконечного процесса. В конце каждого цикла накапливается ошибка за счет округлений.
Вот правильно организованный цикл на примере секундной стрелки.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
uses crt,graph;
var gd,gm,x0,y0,r,a,x,y:integer;
    x1,y1:real;
    c:char;
begin
gd:=0;
initgraph(gd,gm,'');
x0:=getmaxX div 2;
y0:=getmaxY div 2;
r:=100;
setcolor(2);
circle(x0,y0,r);
setcolor(12);
line(x0,y0,x0,y0-r+5);
setcolor(15);
outtextXY(250,30,'Press Enter...');
readln;
outtextXY(250,50,'Vyhod Esc...');
a:=0;
repeat
  x:=x0+round((r-5)*sin(a*pi/180));
  y:=y0-round((r-5)*cos(a*pi/180));
  setcolor(12);
  line(x0,y0,x,y);
  delay(1000);
  setcolor(0);
  line(x0,y0,x,y);
  a:=a+6;
if keypressed then c:=readkey;
until c=#27;
end.
0
 Аватар для Negor
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 00:59  [ТС]
Так в моей программе конечный цикл лиш рисует циферблат. А выводом стрелок занимается
repat until keypressed;
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
08.04.2010, 06:09
Цитата Сообщение от Negor Посмотреть сообщение
А выводом стрелок занимается
repat until keypressed;
Ничего подобного, этот цикл лишь отвечает за выход из программы.
0
 Аватар для Negor
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 19:36  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
Ничего подобного, этот цикл лишь отвечает за выход из программы.
С чего бы? Код в первом посте. Там вычисление угла стрелок и их отрисовка.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
08.04.2010, 19:41
Negor, С бугра виднее. Удачи!
0
 Аватар для Negor
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 19:59  [ТС]
Чего вы грубите? В теле цикла идут вычисления, что не так?
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
08.04.2010, 20:10
А никто и грубит. Я Вам показал как нужно делать, Вы утверждаете, что Ваша кривая программа написана на самом высоком уровне, поэтому мне просто остается согласиться и пожелать Вам дальнейших успехов. Не понимаю только зачем было что-то спрашивать.
0
 Аватар для Negor
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 20:33  [ТС]
Давайте попробуем сначала

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
   for i:=0 to 59 do
   begin
        SetColor(black);
        x:=round((Clock_radius-30)*cos(i*6*3.14/180));
        y:=round((Clock_radius-30)*sin(i*6*3.14/180));
        LineRel(x , y);
        SetColor(green);
        x:=round(-20*cos(i*6*3.14/180));
        y:=round(-20*sin(i*6*3.14/180));
        LineRel(x, y);
        MoveTo(GetMaxX div 2, GetMaxY div 2);
   end;
Этот участок кода рисует 59 рисочек по кругу - метки часов и минут

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
repeat
         {gettime(hour, min, sec, dsec);}
         inc(sec);
         if sec=60 then sec:=0;
         if sec<>oldsec then
           begin
             {Steret staroe}
             SetColor(black);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(180*cos((oldsec*6-90)*3.14/180));
             y:=round(180*sin((oldsec*6-90)*3.14/180));
             LineRel(x,y);
             outtextxy(GetMaxX div 2-20, GetMaxY div 2+100, IntToStr(hour)+':'+IntToStr(min)+':'+IntToStr(oldsec));
             oldsec:=sec;
 
             {risovat novoe}
             SetLineStyle(0, 0, 0);
             SetColor(Yellow);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(180*cos((sec*6-90)*3.14/180));
             y:=round(180*sin((sec*6-90)*3.14/180));
             LineRel(x,y);
             SetColor(red);
             outtextxy(GetMaxX div 2-20, GetMaxY div 2+100, IntToStr(hour)+':'+IntToStr(min)+':'+IntToStr(sec));
           end;
         if min<>oldmin then
           begin
             {stiraem staruju minutnuju strelku}
             SetLineStyle(0, 0, 3);
             SetColor(black);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(150*cos(oldmin*6*3.14/180));
             y:=round(150*sin(oldmin*6*3.14/180));
             LineRel(x, y);
             {risuem novuju minutnuju strelku}
             SetColor(Red);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(150*cos(min*6*3.14/180));
             y:=round(150*sin(min*6*3.14/180));
             LineRel(x, y);
             oldmin:=min;
           end;
         if hour<>oldhour then
           begin
             {stiraem staruju minutnuju strelku}
             SetLineStyle(0, 0, 3);
             SetColor(black);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(100*cos(oldhour*6*3.14/180));
             y:=round(100*sin(oldhour*6*3.14/180));
             LineRel(x, y);
             {risuem novuju minutnuju strelku}
             SetColor(Green);
             MoveTo(GetMaxX div 2, GetMaxY div 2);
             x:=round(100*cos(hour*6*3.14/180));
             y:=round(100*sin(hour*6*3.14/180));
             LineRel(x, y);
             oldhour:=hour;
           end;
       until keypressed;
Это цикл с пост условием. Выход из цикла будет выполене если пользователь нажмёт какую либо клавишу. До этого момента программа считывает время и если оно отличается от предыдущего, заранее сохранённого значения, отрисовывает одну из трёх стрелок.

Теперь о совете поста 4. Если я добавлю в код, приведённый в этом посте, отрисовку меток, отрисовку стрелок по текущему времени, то структура программы будет такой же что и у меня. Я допускаю, что не понял вашей идеи. Если вы так считаете, я прошу вас более подробно описать свою точку зрения. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2010, 20:33
Помогаю со студенческими работами здесь

Одна таблица стилей ведет себя по разному в браузерах
Иными словами. Писал под оперу, все нормально. В експлорер и мозилла уже кнопки местами.. только в опере так, как задумывалось. Хотелось бы...

Std::forward_list по-разному ведет себя с компиляторами gcc и vc++
Есть такой код: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;forward_list&gt; using namespace std; void show(const...

Компонент TImage ведет себя по разному под 98 и 2000!
Очень странная штука с TImage ! Программа сделана в Borland C++Builder5 - 'родной брат делфи' под Windows 98 или Windows 2000 и имеет...

Простой POST-запрос к веб-сервису по-разному себя ведет
Добрый день, ребята! Есть простой веб-сервис, запускаемый локально как приложение ASP NET Core. Есть клиент написанный как консольное...

Почему флеш приложение по разному себя ведет в разных браузерах
Доброго времени суток! Я во flash'е вообще полный ноль, пишу на С++. Вот написал бота для одной онлайн игры, написанной на флеше. И...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru