C语言问题;

CloudStrifers 2011-05-11 11:58:46
找出从0点到12点之间,时针,分针,秒针重合的时刻
...全文
295 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
keshuichonglx 2011-05-13
  • 打赏
  • 举报
回复
没关系,向你学了些东西。我的想法很粗糙,以秒为单位,判断每个指针走一圈需要的秒数,那么从这一圈开始无论是分针还是时针走过的秒数为分子,走一圈需要的秒数为分母,就是这一圈该指针走过一圈的几分之几,这个数再除以1/60,但是假设只有60的点可供每个指针停留,所以只取这个的商就行了,没除尽的排除不考虑。就是这样...
赵4老师 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nencc 的回复:]
引用 5 楼 zhao4zhong1 的回复:
每12小时时针和分针重合11次
每24小时时针和分针重合22次

时针速度:5°/3600秒
分针速度:360°/3600秒
秒针速度:360°/60秒

时针3600秒(一小时),是走一格而不是5°,那一格是30°。
[/Quote]
谢谢斧正!
nencc 2011-05-12
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <windows.h>
#define HUDU(a) ((a)*3.1415926/180)
#define R 100
#define r 4
char szAppName[]="NENC";
HINSTANCE hInst;
HWND hWnd;
class _Clock
{
public:
char szBuffer[128];
POINT pt;//位置坐标
float fH;//时
float fM;//分
float fS;//秒
RECT rt;
void run(int n){};
void run(float f)
{
fS+=f;
if((fS>=60)||(fS<0))
{
fS+=60;
while(fS>=60)fS-=60;
fM+=f>0?1:-1;
if((fM>=60)||(fM<0))
{
fM+=60;
while(fM>=60)fM-=60;
fH+=f>0?1:-1;
if((fH>=24)||(fH<0))
{
fH+=24;
while(fH>=24)fH-=24;
}
}
}
}
virtual void Draw(HDC hdc)
{
POINT pt1;
float fJiaoDu=0;
Ellipse(hdc,pt.x-R,pt.y-R,pt.x+R,pt.y+R);
for (int i=0;i<60;i++)
{
pt1.x=pt.x+(R-r)*sin(HUDU(fJiaoDu));
pt1.y=pt.y-(R-r)*cos(HUDU(fJiaoDu));
fJiaoDu+=6;
if(i%5==0)
SelectObject(hdc,GetStockObject(BLACK_BRUSH));
else
SelectObject(hdc,GetStockObject(WHITE_BRUSH));
Ellipse(hdc,pt1.x-r,pt1.y-r,pt1.x+r,pt1.y+r);
}
wsprintf(szBuffer,"%02d:%02d:%02d",(int)fH,(int)fM,(int)fS);
TextOut(hdc,pt.x,pt.y-R-25,szBuffer,strlen(szBuffer));
}
RECT* Rect(){SetRect(&rt,pt.x-R,pt.y-R,pt.x+R,pt.y+R);return &rt;};
};
class _c1:public _Clock//机械式
{
public:
void Draw(HDC hdc)
{
_Clock::Draw(hdc);
float fJiaoDu;
POINT pt1;
HPEN hPen;
hPen=CreatePen(1,4,0xff00);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=fM*6+fS/10;
pt1.x=pt.x+R*4/5*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*4/5*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//分
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"分针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-75,szBuffer,strlen(szBuffer));
hPen=CreatePen(1,6,0xff);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=fH*30+fM/2+fS/120;
pt1.x=pt.x+R*17/30*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*17/30*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//时
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"时针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-100,szBuffer,strlen(szBuffer));
fJiaoDu=fS*6;
pt1.x=pt.x+(R-r)*sin(HUDU(fJiaoDu));
pt1.y=pt.y-(R-r)*cos(HUDU(fJiaoDu));
hPen=CreatePen(1,2,0xff0000);
hPen=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//秒
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"秒针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-50,szBuffer,strlen(szBuffer));
}
};

class _c2:public _Clock//秒跳式
{
public:
void Draw(HDC hdc)
{
_Clock::Draw(hdc);
float fJiaoDu;
POINT pt1;
HPEN hPen;
hPen=CreatePen(1,4,0xff00);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=fM*6+fS/10;
pt1.x=pt.x+R*4/5*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*4/5*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//分
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"分针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-75,szBuffer,strlen(szBuffer));
hPen=CreatePen(1,6,0xff);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=fH*30+fM/2+fS/120;
pt1.x=pt.x+R*17/30*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*17/30*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//时
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"时针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-100,szBuffer,strlen(szBuffer));
fJiaoDu=(int)fS*6;
pt1.x=pt.x+(R-r)*sin(HUDU(fJiaoDu));
pt1.y=pt.y-(R-r)*cos(HUDU(fJiaoDu));
hPen=CreatePen(1,2,0xff0000);
hPen=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//秒
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"秒针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-50,szBuffer,strlen(szBuffer));
}
};
class _c3:public _Clock//分跳式
{
public:
void Draw(HDC hdc)
{
_Clock::Draw(hdc);
float fJiaoDu;
POINT pt1;
HPEN hPen;
hPen=CreatePen(1,4,0xff00);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=(int)fM*6;
pt1.x=pt.x+R*4/5*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*4/5*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//分
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"分针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-75,szBuffer,strlen(szBuffer));
hPen=CreatePen(1,6,0xff);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=fH*30+fM/2+fS/120;
pt1.x=pt.x+R*17/30*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*17/30*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//时
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"时针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-100,szBuffer,strlen(szBuffer));
fJiaoDu=(int)fS*6;
pt1.x=pt.x+(R-r)*sin(HUDU(fJiaoDu));
pt1.y=pt.y-(R-r)*cos(HUDU(fJiaoDu));
hPen=CreatePen(1,2,0xff0000);
hPen=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//秒
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"秒针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-50,szBuffer,strlen(szBuffer));
}
};
class _c4:public _Clock//时跳式
{
public:
void Draw(HDC hdc)
{
_Clock::Draw(hdc);
float fJiaoDu;
POINT pt1;
HPEN hPen;
hPen=CreatePen(1,4,0xff00);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=(int)fM*6;
pt1.x=pt.x+R*4/5*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*4/5*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//分
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"分针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-75,szBuffer,strlen(szBuffer));
hPen=CreatePen(1,6,0xff);
hPen=(HPEN)SelectObject(hdc,hPen);
fJiaoDu=(int)fH*30;
pt1.x=pt.x+R*17/30*sin(HUDU(fJiaoDu));
pt1.y=pt.y-R*17/30*cos(HUDU(fJiaoDu));
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//时
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"时针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-100,szBuffer,strlen(szBuffer));
fJiaoDu=(int)fS*6;
pt1.x=pt.x+(R-r)*sin(HUDU(fJiaoDu));
pt1.y=pt.y-(R-r)*cos(HUDU(fJiaoDu));
hPen=CreatePen(1,2,0xff0000);
hPen=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,pt.x,pt.y,NULL);
LineTo(hdc,pt1.x,pt1.y);//秒
DeleteObject(SelectObject(hdc,hPen));
sprintf(szBuffer,"秒针度数:%.2f",fJiaoDu);
TextOut(hdc,pt.x,pt.y-R-50,szBuffer,strlen(szBuffer));
}
};
_Clock *pClock[4];
LRESULT WINAPI WndPro(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lparam);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst=hInstance;
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_QUESTION);
wc.hInstance=hInstance;
wc.lpfnWndProc=WndPro;
wc.lpszClassName=szAppName;
wc.lpszMenuName=NULL;
wc.style=CS_VREDRAW|CS_HREDRAW;
RegisterClass(&wc);
hWnd=CreateWindow(szAppName,szAppName,WS_SYSMENU,
0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),
NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
char *pc[4]=
{
"连续","秒针单步","分针单步","时针单步"
};
LRESULT WINAPI WndPro(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lparam)
{
HDC hdc;
PAINTSTRUCT ps;
static HDC hdcMem;
static HBITMAP hBitMap;
static int cx,cy;
int i;
float f;
POINT ptMouse;
char szBuffer[12];
switch(msg)
{
case WM_CREATE:
hdcMem=CreateCompatibleDC(NULL);
pClock[0]=new _c1;
pClock[1]=new _c2;
pClock[2]=new _c3;
pClock[3]=new _c4;
SetTimer(hWnd,1,20,NULL);
break;
case WM_TIMER:
PatBlt(hdcMem,0,0,cx,cy,WHITENESS);
f=0.1;
for (i=0;i<4;i++)
{
pClock[i]->Draw(hdcMem);
TextOut(hdcMem,pClock[i]->pt.x,pClock[i]->pt.y+R,pc[i],strlen(pc[i]));

pClock[i]->run(f);
}
hdc=GetDC(hWnd);
BitBlt(hdc,0,0,cx,cy,hdcMem,0,0,SRCCOPY);
ReleaseDC(hWnd,hdc);
break;
case WM_SIZE:
cx=LOWORD(lparam);
cy=HIWORD(lparam);
for (i=0;i<4;i++)
{
pClock[i]->pt.x=cx/5*(i+1);
pClock[i]->pt.y=cy*3/4;
pClock[i]->Rect();
}
hdc=GetDC(hWnd);
hBitMap=CreateCompatibleBitmap(hdc,cx,cy);
SelectObject(hdcMem,hBitMap);
SelectObject(hdcMem,GetStockObject(WHITE_BRUSH));
SetTextAlign(hdcMem,TA_CENTER);
ReleaseDC(hWnd,hdc);
break;
case WM_LBUTTONDOWN:
ptMouse.x=LOWORD(lparam);
ptMouse.y=HIWORD(lparam);
break;
case WM_RBUTTONDOWN:
ptMouse.x=LOWORD(lparam);
ptMouse.y=HIWORD(lparam);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,msg,wParam,lparam);
}
flysnowhite 2011-05-12
  • 打赏
  • 举报
回复
每12小时重合11次,换算成时分秒就得到具体时间。
当然,这是假定时针、分针、秒针是连续均匀运行的情况下得到的。
否则,结果就是每12小时重合一次了。
keshuichonglx 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 nencc 的回复:]
第二行:01:05:05,1小时,5分5秒,1小时整时,时针指向5的位置,但是1小时零五分五秒,时针会往后稍微走一点,按照一分钟分针走6°,60分钟,时针走30°来算,分针走5分钟,时针应该还走了2.5°。故此时刻三针不会重合。
后面各行输出均不在重合时刻
[/Quote]
大哥,求求你,钟表每个针每一圈只有60个点可以停留的,只能这么算了,照你的说法秒这个单位根本不够用的
keshuichonglx 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 nencc 的回复:]
10楼代码运行结果分析
No.1->00:00:00
No.2->01:05:05
No.3->02:10:10
No.4->03:16:16
No.5->04:21:21
No.6->05:27:27
No.7->06:32:32
No.8->07:38:38
No.9->08:43:43
No.10->09:49:49
No.11->10:54:54
No.12->11……
[/Quote]
大哥,求求你,钟表每个针每一圈只有60个点可以停留的,只能这么算了,照你的说法秒这个单位根本不够用的
nencc 2011-05-12
  • 打赏
  • 举报
回复
由于秒针周期是60秒,分针周期是3600秒,时针周期是12小时,这三个的周期的最小公倍数就是12小时,只有12小时才会真正完全重合一次。
其中每个小时,分针会和时针重合一次,但他们重合时,秒针却与他们不相重合,一下是得到各小时分针与时针重合时秒针所在的位置。(按1°为分辨率)
因为秒针走10秒,分针走1°,秒针运行步长为10秒。
时间:00:00:00;时分针此时角度值:000
时间:01:05:20;时分针此时角度值:032
时间:02:10:50;时分针此时角度值:065
时间:03:16:20;时分针此时角度值:098
时间:04:21:40;时分针此时角度值:130
时间:05:27:10;时分针此时角度值:163
时间:06:32:40;时分针此时角度值:196
时间:07:38:10;时分针此时角度值:229
时间:08:43:30;时分针此时角度值:261
时间:09:49:00;时分针此时角度值:294
时间:10:54:30;时分针此时角度值:327
时间:11:59:50;时分针此时角度值:359
时间:12:00:00;时分针此时角度值:000
nencc 2011-05-12
  • 打赏
  • 举报
回复
我必须向10楼的提出道歉了,对不起。
其实一开始我犯了一个逻辑上的错误,直到后来才发现。
我本以为每个小时时针,分针,和秒针必定有一次重合时间的,哪怕这个时间不是在整秒上面,所以我很想找出这12个确切的重合时间,哪怕秒数精确到小数点后两位,哪怕他们重合的度数相差0.5度以内。所以我尝试写了许多代码,但我的程序却始终得不到12个时间值,越精确计算度数,越是得不到时间值。。。
直到后来才发现,它们是三者重合,而不是两者重合那么简单,而这三者确切的重合周期是12小时。也就是说,0点到12点之间,只有0点整,和12点整这两个时刻是完全重合的。
22楼的结果是按照秒针一次走10秒,指针角度精度为1°,计算的时针和分针每个小时重合时间,此时时针和分针是重合的,但是秒针却不在重合处,而等秒针走到重合处时,分针又会走了一些角度,从而导致三者不能重合,它们三个运行周期最小公倍数只能是是12小时。

10楼的代码是简洁的,而且得到的“大约重合时间”是精确的,只是但看代码,看了几遍我还是没能理解你的阶梯思路和思想。我经常反对直接看代码,看别人代码往往是难懂的,所以我更喜欢方法和思想的交流。10楼能否解释一下你解此题的核心思想是什么样的?谢谢
nencc 2011-05-12
  • 打赏
  • 举报
回复
此程序模拟四种类型钟表运行,第一种机械式运行,第二种秒针单步跳动,其余机械运转,第三种秒针分针均单步跳动,时针机械运转,第四种全部单步跳动。
以下是11个答案的截图。看上去四种表指针都没有重合。
1
2
3
4
5
6
7
8
9
10
11
keshuichonglx 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 nencc 的回复:]
由于秒针周期是60秒,分针周期是3600秒,时针周期是12小时,这三个的周期的最小公倍数就是12小时,只有12小时才会真正完全重合一次。[/Quote]
我承认你很猛,但是你觉得这是楼主要的答案吗?我们只能假设每个指针只有60个点可以停留,而且不足一分钟分针不会前进...
CloudStrifers 2011-05-11
  • 打赏
  • 举报
回复
求代码啊!
  • 打赏
  • 举报
回复
是求代码还是求思路?
ouyh12345 2011-05-11
  • 打赏
  • 举报
回复
遍历吧
nencc 2011-05-11
  • 打赏
  • 举报
回复
10楼代码运行结果分析
No.1->00:00:00
No.2->01:05:05
No.3->02:10:10
No.4->03:16:16
No.5->04:21:21
No.6->05:27:27
No.7->06:32:32
No.8->07:38:38
No.9->08:43:43
No.10->09:49:49
No.11->10:54:54
No.12->11:59:59
第二行:01:05:05,1小时,5分5秒,1小时整时,时针指向5的位置,但是1小时零五分五秒,时针会往后稍微走一点,按照一分钟分针走6°,60分钟,时针走30°来算,分针走5分钟,时针应该还走了2.5°。故此时刻三针不会重合。
后面各行输出均不在重合时刻
CloudStrifers 2011-05-11
  • 打赏
  • 举报
回复
嗯,明白了,谢谢了。
[Quote=引用 11 楼 keshuichonglx 的回复:]

这个代码楼主满意吗?
[/Quote]
KPRF2009 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]
每12小时时针和分针重合11次
每24小时时针和分针重合22次

时针速度:5°/3600秒
分针速度:360°/3600秒
秒针速度:360°/60秒
转换为同向追及问题计算。
[/Quote]


+1
void_Function 2011-05-11
  • 打赏
  • 举报
回复
10楼 正解

但是还有没有更简单的方法呢
magang233 2011-05-11
  • 打赏
  • 举报
回复
不错啊
keshuichonglx 2011-05-11
  • 打赏
  • 举报
回复
这个代码楼主满意吗?
keshuichonglx 2011-05-11
  • 打赏
  • 举报
回复

#define SEC_12HOUR (12 * 60 * 60)
#define SEC_60MIN (60 * 60)
#define SEC_1MIN (60)

int main(int argc, char* argv[])
{
DWORD num(0) ;
DWORD dwsec(0) ;
DWORD desec_hour , dwdec_min , dwsec_sec ;
for ( dwsec = 0 ; dwsec < SEC_12HOUR ; dwsec ++ )
{
dwsec_sec = dwsec%SEC_1MIN ;
dwdec_min = (dwsec%SEC_60MIN)/(SEC_60MIN/60) ;
desec_hour= dwsec/(SEC_12HOUR/60) ;
if ( (desec_hour == dwdec_min) && (dwsec_sec == dwdec_min) )
{
num ++ ;
printf( "No.%d->%02d:%02d:%02d\n" , num ,
dwsec/(60*60) , (dwsec%SEC_60MIN)/60 , dwsec%SEC_1MIN ) ;
}
}
return 0;
}
加载更多回复(5)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧