天花板编程手把手计划-第1期-第8天-打卡

2017-05-26  本文已影响0人  Hans941

题目

原问题链接
用你学过的C语言知识,设计一个番茄钟程序。要求满足如下功能:

可以设置倒计时时间
拥有倒计时效果
倒计时结束后有提醒
使用记录保存在文件中

解题思路

源码

#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++的语法是兼容的。

上一篇 下一篇

猜你喜欢

热点阅读