题目
原问题链接
用你学过的C语言知识,设计一个番茄钟程序。要求满足如下功能:
可以设置倒计时时间
拥有倒计时效果
倒计时结束后有提醒
使用记录保存在文件中
解题思路
- 计时效果
因为程序计时部分运行时间几乎可以忽略,可以用Sleep()函数倒数计时; - 结束提醒
引入媒体库播放声音 - 保存文件
freopen("record.txt", "a", stdout);
源码
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <tchar.h> // 没这个库识别不出"_T"
#include <mmsystem.h> // MCI库,媒体控制接口
#pragma comment(lib,"Winmm.lib") //编译时自动链接 winmm 库.
int getTime(int &hours, int &minutes, int &seconds);
void record(int hours, int minutes, int seconds);
void timekeeper(int totalTimes);
void main()
{
mciSendString(_T("open \"..\\music\\结束.wav\" alias musicTip "), NULL, 0, NULL);//加载结束的声音
int hours, minutes, seconds;
int totalTimes;
totalTimes = getTime(hours, minutes, seconds);//获取倒计时
timekeeper(totalTimes);//倒计时函数
record(hours, minutes, seconds);//用文本记录结果
system("pause");
}
int getTime(int &hours, int &minutes, int &seconds) //脑子短路用成了C++ 的引用
{
int totalTimes;
printf("按如下格式输入倒计时\n");
printf("0:14:26\n");
scanf("%d:%d:%d", &hours, &minutes, &seconds);
while (hours > 24 || minutes >= 60 || seconds >= 60)//检查格式
{
printf("输入格式错误,请重新输入\n");
scanf("%d:%d:%d", &hours, &minutes, &seconds);
}
printf("按下任意键开始计时\n");
getch();
totalTimes = hours * 60 * 60 + minutes * 60 + seconds;
return totalTimes;
}
void record(int hours, int minutes, int seconds)
{
freopen("record.txt", "a", stdout);//注意“a”表示追加文本。使用 “w” 就会清空文本重新写入
printf("%02d:%02d:%02d\n", hours, minutes, seconds);
fclose(stdout);
}
void timekeeper(int totalTimes)
{
int hours, minutes, seconds;
while (1)
{
system("cls");//清屏
hours = totalTimes / 60 / 60;
minutes = (totalTimes - hours * 60 * 60) / 60;
seconds = totalTimes - hours * 60 * 60 - minutes * 60;
printf("%02d:%02d:%02d\n", hours , minutes, seconds);//打印当前剩余时间
Sleep(1000);//延时一秒
totalTimes -= 1;
if (totalTimes == 0)//计时结束
{
break;
}
}
system("cls");
printf("0:0:0\n");
mciSendString(_T("play musicTip"), NULL, 0, NULL);//播放计时结束的声音
printf("计时结束\n");
Sleep(1000);
mciSendString(_T("close musicTip"), NULL, 0, NULL);
}
执行结果
总结
遇到两个问题
freopen("record.txt", "a", stdout); 函数用完之后,就算进行了 fclose(stdout); 如果程序继续运行并试图在控制台输出字符,程序会中断。
int getTime(int &hours, int &minutes, int &seconds)
本来想用指针的,脑子一短路写错了,结果竟然没出错。
函数里 int &hours 这是定义了什么形参,还成功改变了实参的值。
查资料发现 int& 是对整型变量的引用
整型变量的引用定义,例如:
int a;
int &A=a;
引用即是一个变量的别名,例中A是a的一个别名,每一次访问A,对A的一系列操作实际上就是访问a,对a进行操作,此时的A和a在有些编译器中时同一个地址。在定义引用时必须初始化,且必须用有内存地址的对象初始化,初始化之后不可以在指向别的对象。
错误原因是我用了cpp的文件后缀,所以c++的语法是兼容的。