鱼C论坛

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

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

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

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

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

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

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

using namespace std;
mutex olock;

//获取光标位置
COORD getxy() {
        CONSOLE_SCREEN_BUFFER_INFO info;
        HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
        GetConsoleScreenBufferInfo(hscr, &info);
        return info.dwCursorPosition;
}

//设置光标位置
void gotoxy(int x, int y) {
        COORD coord = { x,y };
        HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hscr, coord);
}

//字符串转整数
int s2i(string s) {
        stringstream ss(s);
        int ret;
        ss >> ret;
        return ret;
}

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

        time_t now = time(0);
        time_t target = time(0) + delay;
        while (target > now) {
                Sleep(1000);
                now = time(0);
                olock.lock();
                COORD coord = getxy();
                gotoxy(coord0.X, coord0.Y);
                cout << "闹钟已设置:剩余" << target - now << "秒     \n";
                gotoxy(coord.X, coord.Y);
                olock.unlock();
        }
        olock.lock();
        COORD coord = getxy();
        gotoxy(coord0.X, coord0.Y);
        cout << "闹钟时间到!!      \n";
        gotoxy(coord.X, coord.Y);
        olock.unlock();
}

int main() {
        string s;
        cin >> s;
        while (s != "quit") {
                if (s.substr(0, 9) == "setclock:") {
                        int t = s2i(s.substr(9, -1));
                        if (t > 0) {
                                thread thr(SetClock, t);
                                thr.detach();
                        }
                        else {
                                cout << "你不能设置时长为:" << t << "的闹钟" << endl;
                        }
                }
                else {
                        cout << "oops!\n";
                }
                cin >> s;
        }
}
 
想知道小甲鱼最近在做啥?请访问 -> 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:"+时间 设置闹钟
#include<iostream>
#include<thread>
#include<mutex>
#include<time.h>
#include<windows.h>
#include<sstream>
#include<string>

using namespace std;
mutex olock;

//获取光标位置
COORD getxy() {
        CONSOLE_SCREEN_BUFFER_INFO info;
        HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
        GetConsoleScreenBufferInfo(hscr, &info);
        return info.dwCursorPosition;
}

//设置光标位置
void gotoxy(int x, int y) {
        COORD coord = { x,y };
        HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hscr, coord);
}

//字符串转整数
int s2i(string s) {
        stringstream ss(s);
        int ret;
        ss >> ret;
        return ret;
}

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

        time_t now = time(0);
        time_t target = time(0) + delay;
        while (target > now) {
                Sleep(1000);
                now = time(0);
                olock.lock();
                COORD coord = getxy();
                gotoxy(coord0.X, coord0.Y);
                cout << "闹钟已设置:剩余" << target - now << "秒     \n";
                gotoxy(coord.X, coord.Y);
                olock.unlock();
        }
        olock.lock();
        COORD coord = getxy();
        gotoxy(coord0.X, coord0.Y);
        cout << "闹钟时间到!!      \n";
        gotoxy(coord.X, coord.Y);
        olock.unlock();
}

int main() {
        string s;
        cin >> s;
        while (s != "quit") {
                if (s.substr(0, 9) == "setclock:") {
                        int t = s2i(s.substr(9, -1));
                        if (t > 0) {
                                thread thr(SetClock, t);
                                thr.detach();
                        }
                        else {
                                cout << "你不能设置时长为:" << t << "的闹钟" << endl;
                        }
                }
                else {
                        cout << "oops!\n";
                }
                cin >> s;
        }
}
 
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-16 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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