#include <stdio.h>
#include <time.h> //时间函数
#include <conio.h> //字符模式函数
#include <stdlib.h>
#include <windows.h>
#include <mmsystem.h> //与多媒体有关 #pragma comment(lib,"winmm.lib") //将 winmm.lib作为附加的库文件链接到目标可执行文件中typedef struct date
{int hour;int min;int sec;int month;int day;int year;
}Date; //定义日期结构体 void display_time();   //总体显示时间
void start_timer();     //开始计时
void pause_timer();     //暂停计时
void reset_timer();     //重置计时器
void set_alarm();       //设置闹钟
void reset_alarm();     //重置闹钟
void checking_time(int hour, int min , int sec); //检查闹钟设置时间
void world_clock(); //显示世界时钟
void cal_worldtime(Date country,int diff,int i); //计算世界时间
void countdown_timer(); //设置倒计时
void reset_countdown(); //重置倒计时
void exit_program(); //退出程序
void gotoxy(int x,int y); //光标定位
void dians(); //绘制点号
void draw_numb(int x,int shu); //绘制数字
void draws(char wei,int shu); //绘制时分秒
void show_time(); //电子显示时间 struct tm *curtime;  //结构体tm,结构指针curtime,可指向当前日期,time.h中定义
time_t t;               //时间类型变量t,time.h中定义int timer_running = 0; //计时器运行标志
int pause_timers = 0; //是否暂停的标志
int countdown_running = 0; //倒计时是否设置成功
int flag_setcountdown = 0; //设置倒计时时正确输入个数
int start_time = 0;  //计时器开始时间
int pause_time = 0; //暂停时的时间
int total_time = 0; //总耗时
int flag_wrongtime = 0; //是否错误设定闹钟时间
int flag_setalarm = 0; //设定闹钟时正确输入个数
int alarm_set = 0; //是否设置了闹钟
int alarm_hours, alarm_minutes, alarm_seconds; //闹钟时间
int countdown_hour,countdown_min,countdown_sec; //倒计时设置的时分秒
int endhour,endmin,endsec; //倒计时结束时的时间
Date london,newyork,moscow,tokyo,paris,los,sydney,toronto; //世界各国日期结构体
char coun[8][20]={"London","Newyork","Moscow","Tokyo","Paris","Los","Sydney","Toronto"}; //国家名称 int Month[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}}; //非闰年和闰年各月天数 int main()
{while (1){ //打印菜单printf("Clock Program\n");printf("Press 't' to start or continue timer (开始计时器)\n");printf("Press 'p' to pause timer (暂停计时器)\n");printf("Press 'r' to reset timer or alarm or countdown timer (重置计时器或闹钟或倒计时)\n");printf("Press 'a' to set alarm (设置闹钟)\n");printf("Press 's' to watch the world clock (查看世界时钟)\n");printf("Press 'd' to set countdown timer (设置倒计时)\n");printf("Press 'x' to exit program (退出)\n\n");  display_time(); //电子显示当前时间 if (kbhit()) //是否有键盘输入 {char input = getch();switch (input){case 't':case 'T':  if (timer_running == 0){printf("\nStart timer\n");  start_timer(); //启动计时器}break;case 'r':case 'R':if(pause_timers == 1 || timer_running == 1){printf("\nReset Timer\n");  reset_timer(); //重置计时器pause_timers = 0;}else if(alarm_set == 1){printf("\nReset the Alarm\n");  reset_alarm(); //重置闹钟}else if(countdown_running == 1){printf("\nReset the Countdown Timer\n");  reset_countdown(); //重置倒计时}else{printf("\nAlarm or timer or countdown are not yet in use, cannot be reset\n"); //无法重置 Sleep(2000);}break;case 'p':case 'P':  if (timer_running == 1){printf("Pause timer\n"); pause_timer(); //暂停计时器pause_timers=1;printf("Total timing:%ds \n",total_time);printf("Press 't' to continue timer or 'r' to reset timer\n");while(1){if(kbhit()){break; //有键盘输入时才关闭页面,防止页面刷新 }}}else{printf("\nThe timer did not start, cannot pause\n");Sleep(1500);}break;case 'a':case 'A':if (alarm_set == 0){printf("\nSet alarm (24-hour clock, format: HH MM SS)\n");set_alarm(); //设置闹钟 checking_time(alarm_hours, alarm_minutes, alarm_seconds); //检查闹钟设置时间是否有错 if(flag_wrongtime == 1) //闹钟设置时间有错的情况 {printf("Wrong!!! press 'a' again to set alarm\n");alarm_set = 0;reset_alarm(); //重置闹钟时间 fflush(stdin); //清空输入缓冲区,将上一次的输入读走 Sleep(1500); //暂停1.5s,方便用户看清 }if(flag_wrongtime == 0) //正确输入的情况 {printf("Alarm set for %02d:%02d:%02d\n", alarm_hours, alarm_minutes, alarm_seconds);Sleep(1500);}}else if(alarm_set == 1) //已经设置过闹钟 {printf("\nThe alarm has been set for %02d:%02d:%02d\n", alarm_hours, alarm_minutes, alarm_seconds);printf("If you want to reset the alarm, press 'r'\n");Sleep(2500);}break;case 's':case 'S': world_clock(); //显示世界时间printf("\nPress Enter Key to go back to the main page\n");while(1){if(kbhit()){  break; //按回车键回到主页面 }}  break;case 'd':case 'D':if(countdown_running == 0){countdown_timer(); //设置倒计时 countdown_running = 1;}else{printf("\nThe countdown has been set for %dHour %dMin %dSec\n",countdown_hour,countdown_min,countdown_sec);printf("If you want to reset the countdown timer, press 'r'\n");Sleep(2500);}break;case 'x':case 'X':exit_program(); //退出程序 break;default: //输入错误时 退出当次循环 break;}}Sleep(100); //隔0.1s刷新一次 system("cls");//清屏}
}void display_time() //总体显示时间并检查计时器、闹钟、倒计时
{show_time(); //电子显示时间char key;if (alarm_set==1 && curtime->tm_hour==alarm_hours && curtime->tm_min==alarm_minutes && curtime->tm_sec==alarm_seconds){ //闹钟时间到 printf("\nAlarm! Alarm! Alarm!\n");//PlaySound(TEXT("alarm.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //播放音乐 printf("Press Enter key to pause the alarm or Press 'c' to add 5 minutes\n"); //按回车停止闹钟或'c'键延长5分钟 key=getch();if(key=='c'){alarm_minutes=alarm_minutes+5;if(alarm_minutes>=60) {alarm_minutes=alarm_minutes%60; //分钟大于60时时钟加1 alarm_hours=alarm_hours+1;alarm_hours=alarm_hours%24;}printf("The alarm has been delayed 5 minutes, will run at %02d:%02d:%02d\n",alarm_hours,alarm_minutes,alarm_seconds);Sleep(2500);}else{alarm_set=0;return;}}if (timer_running == 1){ //计时器在运行时 int elapsed_time = (clock() - start_time) / 1000;//将毫秒转换为秒printf("\n");printf("\nTimer: %02d:%02d:%02d\n", (elapsed_time + total_time) / 3600, ((elapsed_time + total_time) % 3600) / 60, (elapsed_time + total_time) % 60);}if (countdown_running==1 && curtime->tm_hour==endhour && curtime->tm_min==endmin && curtime->tm_sec==endsec){ //倒计时结束时 printf("\nThe time is up!!! The time is up!!!\n");//PlaySound(TEXT("countdown.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //播放音乐 printf("Press Enter key to pause the Countdown Timer\n"); //按回车退出计时器 while(1){if(kbhit()){break;}}countdown_running=0;}
}void start_timer() //开始计时
{timer_running = 1;start_time = clock();
}void pause_timer() //暂停计时
{timer_running = 0;pause_time = clock();total_time += (pause_time - start_time) / 1000;
}void reset_timer() //重置计时器
{timer_running = 0;start_time = 0;pause_time = 0;total_time = 0;Sleep(1000);
}void set_alarm() //设置闹钟
{flag_setalarm = scanf("%d %d %d", &alarm_hours, &alarm_minutes, &alarm_seconds);alarm_set = 1;return;
}void reset_alarm() //重置闹钟
{alarm_set = 0;alarm_hours = 0;alarm_minutes = 0;alarm_seconds = 0;Sleep(1000);
}void checking_time(int hour, int min , int sec) //检查闹钟设置时间是否有误
{if(hour<0 || hour>24 || min<0 || min>60 || sec<0 || sec>60){flag_wrongtime = 1;return;}if(flag_setalarm!=3){flag_wrongtime = 1;return;}flag_wrongtime = 0;
}void world_clock()  //世界时钟london,newyork,moscow,tokyo,paris,los,sydney,toronto;
{cal_worldtime(london,-7,0);cal_worldtime(newyork,-12,1);cal_worldtime(moscow,-5,2);cal_worldtime(tokyo,+1,3);cal_worldtime(paris,-6,4);cal_worldtime(los,-15,5);cal_worldtime(sydney,+2,6);cal_worldtime(toronto,-12,7);
}void cal_worldtime(Date country,int diff,int i) //计算每个地区的时间
{int flag=0;if((curtime->tm_year%4==0 && curtime->tm_year%100!=0) || curtime->tm_year%400==0 ){//闰年的情况 flag=1;}country.hour=curtime->tm_hour+diff;country.min=curtime->tm_min;country.sec=curtime->tm_sec;country.day=curtime->tm_mday;country.month=curtime->tm_mon+1;country.year=curtime->tm_year+1900;if(curtime->tm_hour+diff<0) //北京时间加时差小时数小于0 {country.day=curtime->tm_mday-1; //天数减1 country.hour=curtime->tm_hour+24+diff; //小时数补上24 if(curtime->tm_mday-1<1) //天数小于1号 {country.day=(flag==1) ? Month[0][curtime->tm_mon-1] : Month[1][curtime->tm_mon-1]; //天数为前一月最后一天 country.month=curtime->tm_mon; //月数减1 if(country.month<1) //月数不够减 {country.month=12; country.day=Month[0][11];country.year=curtime->tm_year+1900-1; //年数减1 }}}else if(curtime->tm_hour+diff>24) //北京时间加时差小时数大于24  {country.day=curtime->tm_mday+1; //天数加1 country.hour=curtime->tm_hour-24+diff; //小时数减24 if(curtime->tm_mday+1 > ((flag==1) ? Month[0][curtime->tm_mon] : Month[1][curtime->tm_mon])) //天数超过当月天数 {country.month=curtime->tm_mon+2; //月份数加1 country.day=1;if(country.month>12) //月份数超过12{country.month=1;country.day=1;country.year=curtime->tm_year+1900+1; //年数加1 }}}printf("\n%s time: %d/%d/%d %02d:%02d:%02d\n",coun[i],country.year,country.month,country.day,country.hour,country.min,country.sec);
}void countdown_timer() //启动倒计时
{printf("\nPlease enter the time you want to count down (format: HH MM SS)\n");while((flag_setcountdown = scanf("%d %d %d",&countdown_hour,&countdown_min,&countdown_sec))!=3) //输入有误时 {printf("Wrong!!! Please set countdown time again\n");fflush(stdin); //清空输入缓冲区,将上一次的输入读走}printf("countdown %dHour %dMin %dSec\n",countdown_hour,countdown_min,countdown_sec);endsec=(curtime->tm_sec+countdown_sec)%60; //倒计时结束时秒数 endmin=(curtime->tm_min+countdown_min+ (curtime->tm_sec+countdown_sec)/60 )%60; //倒计时结束时分数endhour=curtime->tm_hour+countdown_hour+(curtime->tm_min+countdown_min+ (curtime->tm_sec+countdown_sec)/60 )/60; //倒计时结束时小时数endhour=endhour%24;printf("the countdown timer will end at %02d:%02d:%02d\n",endhour,endmin,endsec);Sleep(3000);
}void reset_countdown() //重置计时器
{countdown_hour=0;countdown_min=0;countdown_sec=0;countdown_running=0;Sleep(1000);
}void exit_program() //退出程序
{//PlaySound(NULL, NULL, 0); //播放音乐 exit(0);
}void gotoxy(int x,int y)   //光标定位函数
{COORD coord; //表示字符在控制台屏幕上的坐标的结构体 coord.X=x; //横坐标coord.Y=y; //纵坐标SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); //定位光标位置//参数1:句柄(通过GetStdHandle()函数获得句柄)参数2:位置(结构体类型)
}void dians() //绘制时间之间的点号
{int x=8;gotoxy(x*3,11);printf(" **");gotoxy(x*3,12);printf(" **");gotoxy(x*3,14);printf(" **");gotoxy(x*3,15);printf(" **");gotoxy(x*6,11);printf(" **");gotoxy(x*6,12);printf(" **");gotoxy(x*6,14);printf(" **");gotoxy(x*6,15);printf(" **");
}void draw_numb(int x,int shu)
{ //判断0-9的数据,通过gotoxy显示出来if(shu==0){ //绘制数字0 gotoxy(x,9);printf("*****");gotoxy(x,10);printf("*   *");gotoxy(x,11);printf("*   *");gotoxy(x,12);printf("*   *");gotoxy(x,13);printf("*   *");gotoxy(x,14);printf("*   *");gotoxy(x,15);printf("*   *");gotoxy(x,16);printf("*   *");gotoxy(x,17);printf("*****");}if(shu==1){ //绘制数字1gotoxy(x,9);printf("  *  ");gotoxy(x,10);printf("  *  ");gotoxy(x,11);printf("  *  ");gotoxy(x,12);printf("  *  ");gotoxy(x,13);printf("  *  ");gotoxy(x,14);printf("  *  ");gotoxy(x,15);printf("  *  ");gotoxy(x,16);printf("  *  ");gotoxy(x,17);printf("  *  ");}if(shu==2){ //绘制数字2gotoxy(x,9);printf("*****");gotoxy(x,10);printf("    *");gotoxy(x,11);printf("    *");gotoxy(x,12);printf("    *");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("*    ");gotoxy(x,15);printf("*    ");gotoxy(x,16);printf("*    ");gotoxy(x,17);printf("*****");}if(shu==3){ //绘制数字3gotoxy(x,9);printf("*****");gotoxy(x,10);printf("    *");gotoxy(x,11);printf("    *");gotoxy(x,12);printf("    *");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("    *");gotoxy(x,15);printf("    *");gotoxy(x,16);printf("    *");gotoxy(x,17);printf("*****");}if(shu==4){ //绘制数字4gotoxy(x,9);printf("*   *");gotoxy(x,10);printf("*   *");gotoxy(x,11);printf("*   *");gotoxy(x,12);printf("*   *");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("    *");gotoxy(x,15);printf("    *");gotoxy(x,16);printf("    *");gotoxy(x,17);printf("    *");}if(shu==5){ //绘制数字5gotoxy(x,9);printf("*****");gotoxy(x,10);printf("*    ");gotoxy(x,11);printf("*    ");gotoxy(x,12);printf("*    ");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("    *");gotoxy(x,15);printf("    *");gotoxy(x,16);printf("    *");gotoxy(x,17);printf("*****");}if(shu==6){ //绘制数字6gotoxy(x,9);printf("*****");gotoxy(x,10);printf("*    ");gotoxy(x,11);printf("*    ");gotoxy(x,12);printf("*    ");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("*   *");gotoxy(x,15);printf("*   *");gotoxy(x,16);printf("*   *");gotoxy(x,17);printf("*****");}if(shu==7){ //绘制数字7gotoxy(x,9);printf("*****");gotoxy(x,10);printf("    *");gotoxy(x,11);printf("    *");gotoxy(x,12);printf("    *");gotoxy(x,13);printf("    *");gotoxy(x,14);printf("    *");gotoxy(x,15);printf("    *");gotoxy(x,16);printf("    *");gotoxy(x,17);printf("    *");}if(shu==8){ //绘制数字8gotoxy(x,9);printf("*****");gotoxy(x,10);printf("*   *");gotoxy(x,11);printf("*   *");gotoxy(x,12);printf("*   *");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("*   *");gotoxy(x,15);printf("*   *");gotoxy(x,16);printf("*   *");gotoxy(x,17);printf("*****");}if(shu==9){ //绘制数字9gotoxy(x,9);printf("*****");gotoxy(x,10);printf("*   *");gotoxy(x,11);printf("*   *");gotoxy(x,12);printf("*   *");gotoxy(x,13);printf("*****");gotoxy(x,14);printf("    *");gotoxy(x,15);printf("    *");gotoxy(x,16);printf("    *");gotoxy(x,17);printf("*****");}
}void draws(char wei,int shu)
{//定义了6个位置 分别是小时的个位十位,分钟的个位十位和秒钟的个位十位int x=8;if(wei=='1'){draw_numb(x*1,shu);   //调用draw_numb函数把x*1(表示第几个位置数),shu(表示要显示的数字)调过去}                      //x*1表示第一个位置 即小时的十位 if(wei=='2'){draw_numb(x*2,shu); //绘制小时的个位}if(wei=='3'){draw_numb(x*4,shu); //绘制分钟的十位 }if(wei=='4'){draw_numb(x*5,shu); //绘制分钟的个位}if(wei=='5'){draw_numb(x*7,shu); //绘制秒钟的十位}if(wei=='6'){draw_numb(x*8,shu); //绘制秒钟的个位}
}void show_time()
{//system("color 9");  //可以改变颜色dians();                           //将两个点绘制出来t=time(0);                           //获取当前的秒数,参数为0则函数返回值即为结果curtime=localtime(&t);             //得到当前系统时间/if((double)curtime->tm_hour<=12)  //午前的处理/{gotoxy(1,13);                  //绘制AM printf("AM ");if((double)curtime->tm_hour<10) draws('1',0);   //十点之前在小时数前加零draws('1',((int)curtime->tm_hour)/10);      //绘制小时的十位draws('2',((int)((double)curtime->tm_hour))%10); //绘制小时的个位}else                              //午后的处理{gotoxy(1,13);printf("PM ");                   //绘制PMif((double)curtime->tm_hour-12<10) draws('1',0);//输入0draws('1',(int)curtime->tm_hour/10);        //绘制小时的十位draws('2',((int)((double)curtime->tm_hour))%10);  //绘制小时的个位}if((double)curtime->tm_min<10)          //时钟小于10添加0 {draws('3',0);} draws('3',(int)curtime->tm_min/10);      //绘制分钟的十位 draws('4',(int)curtime->tm_min%10);      //绘制分钟的个位 if((double)curtime->tm_sec<10){draws('5',0);                      //时钟小于10添加0}draws('5',(int)curtime->tm_sec/10);        //绘制秒钟的十位draws('6',(int)curtime->tm_sec%10);       //绘制秒钟的个位
}

小白一个,不喜勿喷。

C语言电子闹钟(显示时间、计时器、闹钟、倒计时、世界时钟)C语言大作业相关推荐

  1. 60秒计时器的仿真电路_DS1302的电子万年历,时间、闹钟可调,带温度农历显示,原理图、仿真和代码...

    获取设计资源,请见文末说明~ 设计要求 1.显示公历年.月.日.星期.时.分.秒: 2.可随时调校年.月.日.时.分.秒: 3.能显示农历时间,并能标明平润年: 4.具有闹钟设定提醒功能: 5.能够显 ...

  2. c语言数码管显示时间,求数码管设计时钟表(C语言) 电子时钟?

    数码管设计时钟表(C语言) 2008-05-30 00:45 声明: 实钟程序刚写成,通过实验板验证.正确无误.但还程序还没最优化.希望有高手看到提宝贵意见,本人感激不尽. ;采用AT51的8位电子钟 ...

  3. JavaScript编程(小练习处理,显示时间,与倒计时)

    今天再来解决JavaScript的编程题,让我们开启我们我们的编程能力,如果此文章能给你帮助,不要忘了评论与点赞哦.小编在这里先谢谢了. 1.水王数的求解,使用JavaScript编写. 水王数:在一 ...

  4. c语言程序sqrt显示错误,帮忙看一下这个c语言程序哪不对 提示说是sqrt找不到标示符 运行环境vs2005...

    先说明下"all:"和"clean:".这两个语句类似于:if (arg=="all") then.... 和 if (arg==" ...

  5. 学生成绩管理系统(C语言实现)大作业不会?快来看看吧!

    目录 一,简述 二,注意 三,代码 1.结构体及函数声明 menu函数 in函数(录入) search_函数(查询) del函数(删除) modify函数(修改) insert函数(插入) show函 ...

  6. 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc

    电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...

  7. 【FPGA】数码管电子时钟(可设置时间和闹钟)

    目录 前言 一丶需求分析 1.设置时间 2.设置闹钟 二丶工程源码 1.counter 2.seg_driver 3.key_debounce 4.beep 5.顶层模块 三丶模块原理图 四丶管脚信息 ...

  8. 【蓝桥杯嵌入式】【STM32】7_RTC之实时时间显示和硬件闹钟设置

    文章目录 1.RTC的三个可用时钟源 2.RTC框图 3.写代码前需要知道的一些标志位 4.配置流程 5.源代码 6.关于设置闹钟这件事  6.1.配置流程  6.2.实验源代码   下载工程文件: ...

  9. C51做闹钟:用1602显示时间,到时间,蜂鸣器响或者灯亮,按K4停止

    C51做闹钟:用1602显示时间,到点时间,蜂鸣器响或者灯亮,按K4停止 小灯亮 #include <reg51.h>sbit k4=P3^3;sbit led = P2^1;sbit r ...

最新文章

  1. Oracle日常巡检
  2. LINUX - pthread_detach()与pthread_join()
  3. 机器学习Sklearn实战——KNN算法
  4. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  5. JavaSE(二十六)——多线程之模拟龟兔赛跑
  6. echarts格式化tooltip数据
  7. django-oscar的物流状态pending修改以及分析源码解决报错:The new status 'xxx' is not valid for this order
  8. java语言介绍 —(1)
  9. 编译器错误 CS1026
  10. Android系统信息获取 之四:系统语言信息获取
  11. 数据科学包7- pandas高级内容之分组运算
  12. 自定义优先队列的元素权重
  13. 在QGraphicsScene中嵌入QWidget
  14. 图书馆占座系统(三)
  15. linux alsa 不创建声卡能否创建pcm设备,Linux ALSA声卡驱动之一:声卡的创建
  16. Swiper参数说明(swiper参数配置)
  17. zxing二维码的使用
  18. leetcode-174-地下城游戏
  19. RPA中国流程自动化产业峰会火热报名中...
  20. android游戏开发原理及关键技术

热门文章

  1. 实验室管理系统lims的设计与实现
  2. Win10系统无法正常关闭护眼模式怎么办?
  3. 经常性收入、MRR、ARR 的定义和计算方法
  4. 腾讯服务器微信分身,微信最新功能,这些使用功能你用上了吗?支持微信分身登录!...
  5. SpringBoot整合Redis实现购物车功能
  6. 2017百度前端技术学院习题-06
  7. Python学习笔记之入门基础
  8. 北理宋文杰:时空域下智能车辆未知区域自主导航技术(附视频)
  9. 从零开始学统计 01 | 神奇的正态分布
  10. 那些著名网站的90年代