天花板編程手把手計劃-第1期-第8天-打卡

題目

原問題鏈接
用你學(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++的語法是兼容的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • 上一篇中的課后練習(xí)大家普遍反映太簡單了。其實,麻雀雖小,五臟俱全。今天我們來看看它的解法。 1. 題目 請編程實現(xiàn)...
    天花板閱讀 1,625評論 2 17
  • 簡介 C++98/03的設(shè)計目標:一、比C語言更適合系統(tǒng)編程(且與C語言兼容)。二、支持數(shù)據(jù)抽象。三、支持面向?qū)ο?..
    認真學(xué)計算機閱讀 5,514評論 0 53
  • 我們與他們 把生活中突如其來的事情都看做自己應(yīng)該做的,看成為了我們的事業(yè)而忙碌。而非把工作看成他們的、別人該做的事...
    大橙子5996閱讀 271評論 0 0
  • 第五章 平等大愛無偏私 天地不仁,以萬物為芻狗;「圣人」不仁,以百姓為芻狗。天地之間,其猶橐鑰乎。虛而不屈,動而愈...
    愛相續(xù)閱讀 1,205評論 0 0

友情鏈接更多精彩內(nèi)容