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

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

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

Author24 — интернет-сервис помощи студентам
Предыстория - нужно нарисовать часы, которые бы показывали реальное время;
Всё шло хорошо до того момента, как секундная стрелка переходила с 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2010, 16:16
Ответы с готовыми решениями:

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

Qt ведет себя по разному с разными компиляторами
Вот пара примеров. С MinGW нормально работают следующие команды:...

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

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

10
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
29.03.2010, 18:29 2
Используйте вместо 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
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
29.03.2010, 23:50  [ТС] 3
К сожалению не помогло
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
30.03.2010, 08:23 4
Мне кажется в принципе неверно использовать конечный цикл
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
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 00:59  [ТС] 5
Так в моей программе конечный цикл лиш рисует циферблат. А выводом стрелок занимается
repat until keypressed;
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
08.04.2010, 06:09 6
Цитата Сообщение от Negor Посмотреть сообщение
А выводом стрелок занимается
repat until keypressed;
Ничего подобного, этот цикл лишь отвечает за выход из программы.
0
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 19:36  [ТС] 7
Цитата Сообщение от Puporev Посмотреть сообщение
Ничего подобного, этот цикл лишь отвечает за выход из программы.
С чего бы? Код в первом посте. Там вычисление угла стрелок и их отрисовка.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
08.04.2010, 19:41 8
Negor, С бугра виднее. Удачи!
0
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 19:59  [ТС] 9
Чего вы грубите? В теле цикла идут вычисления, что не так?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
08.04.2010, 20:10 10
А никто и грубит. Я Вам показал как нужно делать, Вы утверждаете, что Ваша кривая программа написана на самом высоком уровне, поэтому мне просто остается согласиться и пожелать Вам дальнейших успехов. Не понимаю только зачем было что-то спрашивать.
0
57 / 56 / 10
Регистрация: 29.03.2010
Сообщений: 289
08.04.2010, 20:33  [ТС] 11
Давайте попробуем сначала

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
08.04.2010, 20:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2010, 20:33
Помогаю со студенческими работами здесь

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

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

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

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


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

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