題目
原問題鏈接
用你學(xué)過的C語言知識,設(shè)計一個番茄鐘程序。要求滿足如下功能:
可以設(shè)置倒計時時間
擁有倒計時效果
倒計時結(jié)束后有提醒
使用記錄保存在文件中
解題思路
- 計時效果
因為程序計時部分運行時間幾乎可以忽略,可以用Sleep()函數(shù)倒數(shù)計時; - 結(jié)束提醒
引入媒體庫播放聲音 - 保存文件
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\\結(jié)束.wav\" alias musicTip "), NULL, 0, NULL);//加載結(jié)束的聲音
int hours, minutes, seconds;
int totalTimes;
totalTimes = getTime(hours, minutes, seconds);//獲取倒計時
timekeeper(totalTimes);//倒計時函數(shù)
record(hours, minutes, seconds);//用文本記錄結(jié)果
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);//打印當(dāng)前剩余時間
Sleep(1000);//延時一秒
totalTimes -= 1;
if (totalTimes == 0)//計時結(jié)束
{
break;
}
}
system("cls");
printf("0:0:0\n");
mciSendString(_T("play musicTip"), NULL, 0, NULL);//播放計時結(jié)束的聲音
printf("計時結(jié)束\n");
Sleep(1000);
mciSendString(_T("close musicTip"), NULL, 0, NULL);
}
執(zhí)行結(jié)果
獲取用戶輸入
動態(tài)的倒計時
結(jié)束會“滴”的一聲
成功計時完畢才會記錄結(jié)果
總結(jié)
遇到兩個問題
freopen("record.txt", "a", stdout); 函數(shù)用完之后,就算進行了 fclose(stdout); 如果程序繼續(xù)運行并試圖在控制臺輸出字符,程序會中斷。
int getTime(int &hours, int &minutes, int &seconds)
本來想用指針的,腦子一短路寫錯了,結(jié)果竟然沒出錯。
函數(shù)里 int &hours 這是定義了什么形參,還成功改變了實參的值。
查資料發(fā)現(xiàn) int& 是對整型變量的引用
整型變量的引用定義,例如:
int a;
int &A=a;
引用即是一個變量的別名,例中A是a的一個別名,每一次訪問A,對A的一系列操作實際上就是訪問a,對a進行操作,此時的A和a在有些編譯器中時同一個地址。在定義引用時必須初始化,且必須用有內(nèi)存地址的對象初始化,初始化之后不可以在指向別的對象。
錯誤原因是我用了cpp的文件后綴,所以c++的語法是兼容的。