鱼C论坛

 找回密码
 立即注册
查看: 1658|回复: 12

[已解决]用C++做一个带有计时闹钟功能的计算器

[复制链接]
发表于 2019-7-19 16:51:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有没有大神给点思路啥的。
最佳答案
2019-7-30 16:37:38
本帖最后由 Croper 于 2019-7-30 16:45 编辑

利用thread制作的,不会影响正常输入,甚至可以同时运行多个的闹钟,输入"setclock:"+时间 设置闹钟
  1. #include<iostream>
  2. #include<thread>
  3. #include<mutex>
  4. #include<time.h>
  5. #include<windows.h>
  6. #include<sstream>
  7. #include<string>

  8. using namespace std;
  9. mutex olock;

  10. //获取光标位置
  11. COORD getxy() {
  12.         CONSOLE_SCREEN_BUFFER_INFO info;
  13.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  14.         GetConsoleScreenBufferInfo(hscr, &info);
  15.         return info.dwCursorPosition;
  16. }

  17. //设置光标位置
  18. void gotoxy(int x, int y) {
  19.         COORD coord = { x,y };
  20.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  21.         SetConsoleCursorPosition(hscr, coord);
  22. }

  23. //字符串转整数
  24. int s2i(string s) {
  25.         stringstream ss(s);
  26.         int ret;
  27.         ss >> ret;
  28.         return ret;
  29. }

  30. void SetClock(int delay) {
  31.         olock.lock();
  32.         COORD coord0 = getxy();
  33.         cout << "闹钟已设置:剩余" << delay << "秒    \n";
  34.         olock.unlock();

  35.         time_t now = time(0);
  36.         time_t target = time(0) + delay;
  37.         while (target > now) {
  38.                 Sleep(1000);
  39.                 now = time(0);
  40.                 olock.lock();
  41.                 COORD coord = getxy();
  42.                 gotoxy(coord0.X, coord0.Y);
  43.                 cout << "闹钟已设置:剩余" << target - now << "秒     \n";
  44.                 gotoxy(coord.X, coord.Y);
  45.                 olock.unlock();
  46.         }
  47.         olock.lock();
  48.         COORD coord = getxy();
  49.         gotoxy(coord0.X, coord0.Y);
  50.         cout << "闹钟时间到!!      \n";
  51.         gotoxy(coord.X, coord.Y);
  52.         olock.unlock();
  53. }

  54. int main() {
  55.         string s;
  56.         cin >> s;
  57.         while (s != "quit") {
  58.                 if (s.substr(0, 9) == "setclock:") {
  59.                         int t = s2i(s.substr(9, -1));
  60.                         if (t > 0) {
  61.                                 thread thr(SetClock, t);
  62.                                 thr.detach();
  63.                         }
  64.                         else {
  65.                                 cout << "你不能设置时长为:" << t << "的闹钟" << endl;
  66.                         }
  67.                 }
  68.                 else {
  69.                         cout << "oops!\n";
  70.                 }
  71.                 cin >> s;
  72.         }
  73. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-19 21:35:13 | 显示全部楼层
首先,你需要明确你的需求,你到底要什么功能,
如果要像系统自带的计算器一样的界面,那么至少要了解一部分windows sdk编程或者mfc
计时,可以使用time.h中的time(0)获取当前时间,并使用localtime函数转化为容易识别的格式,
如果要跟精确,可以使用<window.h>中的timeGetTime(毫秒级)或<chrono>中的system_clock.now()(1/10微秒级),
闹钟,使用playsound播放声音或直接beep

你要什么功能自己去组合,我说的这些都能很容易搜到教程,怎么完成就看你自己了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 14:52:45 | 显示全部楼层
Croper 发表于 2019-7-19 21:35
首先,你需要明确你的需求,你到底要什么功能,
如果要像系统自带的计算器一样的界面,那么至少要了解一部 ...

好哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-29 12:10:43 | 显示全部楼层
直接用Qt做图形界面,然后编写具体实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-30 11:14:07 | 显示全部楼层
回忆浅离 发表于 2019-7-29 12:10
直接用Qt做图形界面,然后编写具体实现

我可以单独程序做一个闹钟,单独做一个计算器,但我怎么使得这两个功能同时实现呢?就程序运行就会显示时间,我可以设置一个闹钟提示警告,同时不妨碍我计算器功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-30 11:16:23 | 显示全部楼层
Croper 发表于 2019-7-19 21:35
首先,你需要明确你的需求,你到底要什么功能,
如果要像系统自带的计算器一样的界面,那么至少要了解一部 ...

我可以单独程序做一个闹钟,单独做一个计算器,我怎么使得这两个功能同时实现呢?就程序运行就会显示时间,我可以设置一个闹钟到点提示警告,同时不妨碍我计算器功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-30 12:14:42 | 显示全部楼层
内裤里有糖吃 发表于 2019-7-30 11:14
我可以单独程序做一个闹钟,单独做一个计算器,但我怎么使得这两个功能同时实现呢?就程序运行就会显示时 ...

这个好办,利用Qt库直接达到当前时间,然后通过Qt开设定时器每秒更新时间,而计算器可以通过按键+信号与槽机制实现数据的计算并显示在上面两者互不冲突,一个界面就能实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-30 12:15:19 | 显示全部楼层
回忆浅离 发表于 2019-7-30 12:14
这个好办,利用Qt库直接达到当前时间,然后通过Qt开设定时器每秒更新时间,而计算器可以通过按键+信号与 ...

得到,打错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-30 12:19:34 | 显示全部楼层

闹钟的话也可以设置,要通过Qt库开启声音机制,不过要自己设定闹钟铃声,Qt库不提供铃声,并且在更新时间地方判断设置时间是否等于当前时间,如果等于,可以直接在这个定时器里设置响铃,或者通过信号与槽机制,在更新时间这里将信号传递出去,在槽函数实现响铃处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-30 13:34:27 | 显示全部楼层
回忆浅离 发表于 2019-7-30 12:19
闹钟的话也可以设置,要通过Qt库开启声音机制,不过要自己设定闹钟铃声,Qt库不提供铃声,并且在更新时间 ...

我用的<time.h><window.h>,可不可以直接在程序上入手。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-30 15:56:59 | 显示全部楼层
最好的方法是利用<thread>库新建进程处理闹钟的各项工作,这样可以保证不冲突,
如果你是做的windows下的,那么也可以SetTimer()然后响应WM_TIMER事件,
不然你就自己模拟信号机制,建立一个缓冲区保存输入和时间消息,把核心逻辑和输入输出分开,不过这样整个程序估计都得重新设计;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-30 16:37:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-7-30 16:45 编辑

利用thread制作的,不会影响正常输入,甚至可以同时运行多个的闹钟,输入"setclock:"+时间 设置闹钟
  1. #include<iostream>
  2. #include<thread>
  3. #include<mutex>
  4. #include<time.h>
  5. #include<windows.h>
  6. #include<sstream>
  7. #include<string>

  8. using namespace std;
  9. mutex olock;

  10. //获取光标位置
  11. COORD getxy() {
  12.         CONSOLE_SCREEN_BUFFER_INFO info;
  13.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  14.         GetConsoleScreenBufferInfo(hscr, &info);
  15.         return info.dwCursorPosition;
  16. }

  17. //设置光标位置
  18. void gotoxy(int x, int y) {
  19.         COORD coord = { x,y };
  20.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  21.         SetConsoleCursorPosition(hscr, coord);
  22. }

  23. //字符串转整数
  24. int s2i(string s) {
  25.         stringstream ss(s);
  26.         int ret;
  27.         ss >> ret;
  28.         return ret;
  29. }

  30. void SetClock(int delay) {
  31.         olock.lock();
  32.         COORD coord0 = getxy();
  33.         cout << "闹钟已设置:剩余" << delay << "秒    \n";
  34.         olock.unlock();

  35.         time_t now = time(0);
  36.         time_t target = time(0) + delay;
  37.         while (target > now) {
  38.                 Sleep(1000);
  39.                 now = time(0);
  40.                 olock.lock();
  41.                 COORD coord = getxy();
  42.                 gotoxy(coord0.X, coord0.Y);
  43.                 cout << "闹钟已设置:剩余" << target - now << "秒     \n";
  44.                 gotoxy(coord.X, coord.Y);
  45.                 olock.unlock();
  46.         }
  47.         olock.lock();
  48.         COORD coord = getxy();
  49.         gotoxy(coord0.X, coord0.Y);
  50.         cout << "闹钟时间到!!      \n";
  51.         gotoxy(coord.X, coord.Y);
  52.         olock.unlock();
  53. }

  54. int main() {
  55.         string s;
  56.         cin >> s;
  57.         while (s != "quit") {
  58.                 if (s.substr(0, 9) == "setclock:") {
  59.                         int t = s2i(s.substr(9, -1));
  60.                         if (t > 0) {
  61.                                 thread thr(SetClock, t);
  62.                                 thr.detach();
  63.                         }
  64.                         else {
  65.                                 cout << "你不能设置时长为:" << t << "的闹钟" << endl;
  66.                         }
  67.                 }
  68.                 else {
  69.                         cout << "oops!\n";
  70.                 }
  71.                 cin >> s;
  72.         }
  73. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-7-31 10:24:45 | 显示全部楼层
Croper 发表于 2019-7-30 16:37
利用thread制作的,不会影响正常输入,甚至可以同时运行多个的闹钟,输入"setclock:"+时间 设置闹钟

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表