c++1095: 时间间隔(多实例测试) (字符串和字符以及数字的转换)

问题描述:

题目描述

从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示。要求程序定义如下两个函数,并在main()中调用这两个函数实现相应的功能

/*三个形参分别为为用于表示一个时间点的时、分、秒,函数返回对应的秒。*/

int HmsToS(int h, int m, int s); 

/* 形参s表示一个时间段的长度,单位是秒,该函数将该时间段转换为对应的“小时:分钟:秒” 格式输出 */

void PrintTime(int s);

输入

输入数据有多组。每组输入包括两行。第一行为时间点1,第二行为时间点2,时间点均以“HH:MM:SS”的格式输入。测试数据保证时间点1早于时间点2。

输出

对应每组数据,有一行输出,以“HH:MM:SS”的格式输出时间间隔。注意不足两位要补占位符0。格式参看输入输出。

代码实现:

#include <iostream>
using namespace std;
#include<string>
string division(string string1,string string2)//时间上做减法
{
    int hour1,hour2,minute1,minute2,second1,second2;
    int length=8;
    for(int i=0;i<length;i++)
    {
        hour1=(string1[0]-'0')*10+(string1[1]-'0');//12:01:12
         minute1=(string1[3]-'0')*10+(string1[4]-'0');
          second1=(string1[6]-'0')*10+(string1[7]-'0');
          hour2=(string2[0]-'0')*10+(string2[1]-'0');
         minute2=(string2[3]-'0')*10+(string2[4]-'0');
          second2=(string2[6]-'0')*10+(string2[7]-'0');
    }
    int time1,time2;//全部转化为秒
    time1=second1+minute1*60+hour1*60*60;
    time2=second2+minute2*60+hour2*60*60;
    int low_time=time2-time1;

    //作差之后的结果
    int hour3=low_time/3600;
    int minute3=(low_time-hour3*3600)/60;
    int second3=low_time%60;
/*
    cout<<hour3<<endl;
    cout<<minute3<<endl;
    cout<<second3<<endl;
*/
    //将作差之后的结果转化为字符串
    string string_hour3,string_minute3,string_second3;
    if(hour3<10&&hour3>=0)
    {
        if(hour3!=0)//代表第一个数是0.第二个数不是0
        {
             string_hour3.push_back('0');
            char temp='0'+hour3;
            string_hour3.push_back(temp);
        }
       else//两个数都是0
       {
            string_hour3.push_back('0');
            string_hour3.push_back('0');
       }
    }
    else
    {
        string_hour3=to_string(hour3);
    }
    if(minute3<10&&minute3>=0)
    {
        if(minute3!=0)
        {
             string_minute3.push_back('0');
            char temp='0'+minute3;
            string_minute3.push_back(temp);
        }
        else
        {
             string_minute3.push_back('0');
              string_minute3.push_back('0');
        }

    }
    else
    {
        string_minute3=to_string(minute3);
    }
    if(second3<10&&second3>=0)
    {
        if(second3!=0)
        {
             string_second3.push_back('0');
            char temp='0'+second3;
            string_second3.push_back(temp);
        }
        else
        {
             string_second3.push_back('0');
              string_second3.push_back('0');
        }

    }
    else
    {
        string_second3=to_string(second3);
    }
    /*
     cout<<string_hour3<<endl;
    cout<<string_minute3<<endl;
    cout<<string_second3<<endl;
*/
    string result=string_hour3+":"+string_minute3+":"+string_second3;
    return result;

}

string computer() {
    string a, b;
    if (!(cin >> a >> b)) { // 检查输入流状态
        return "-1"; // 返回一个特殊值
    }
    string result=division(a,b);
    return result;
}

int main() {
    bool flag = true;

    while (flag) {
        string result = computer();
        if (result == "-1") { // 如果返回特殊值,表示输入流出现了错误,例如我们输入的ctrl+c
            flag = false; // 结束循环
        } else {
            cout << result << endl;
        }
    }
    return 0;
}

效果展示:

输入ctrl+z退出循环:

代码解析:

(1)外层无限循环

    while (flag) {
        string result = computer();
        if (result == "-1") { // 如果返回特殊值,表示输入流出现了错误,例如我们输入的ctrl+c
            flag = false; // 结束循环
        } else {
            cout << result << endl;
        }
    }

(2)输入两个数据,并看有没有输入ctrl+z

string computer() {
    string a, b;
    if (!(cin >> a >> b)) { // 检查输入流状态
        return "-1"; // 返回一个特殊值
    }
    string result=division(a,b);
    return result;
}

(3)提取输入的时间字符串中的“小时”“分钟”和“秒”

核心思想就是将字符串提出字符,将字符转换为数字:

 int hour1,hour2,minute1,minute2,second1,second2;
    int length=8;
    for(int i=0;i<length;i++)
    {
        hour1=(string1[0]-'0')*10+(string1[1]-'0');//12:01:12
         minute1=(string1[3]-'0')*10+(string1[4]-'0');
          second1=(string1[6]-'0')*10+(string1[7]-'0');
          hour2=(string2[0]-'0')*10+(string2[1]-'0');
         minute2=(string2[3]-'0')*10+(string2[4]-'0');
          second2=(string2[6]-'0')*10+(string2[7]-'0');
    }

(4)将字符串1,字符串2的时间全部转化为秒

    int time1,time2;//全部转化为秒
    time1=second1+minute1*60+hour1*60*60;
    time2=second2+minute2*60+hour2*60*60;

(5)作差,并求出对应的“小时”,“分钟”,“秒钟”的数字

 int low_time=time2-time1;

    //作差之后的结果
    int hour3=low_time/3600;
    int minute3=(low_time-hour3*3600)/60;
    int second3=low_time%60;

(6)将结果数字转化为字符串

    //将作差之后的结果转化为字符串
    string string_hour3,string_minute3,string_second3;
    if(hour3<10&&hour3>=0)
    {
        if(hour3!=0)//代表第一个数是0.第二个数不是0
        {
             string_hour3.push_back('0');
            char temp='0'+hour3;
            string_hour3.push_back(temp);
        }
       else//两个数都是0
       {
            string_hour3.push_back('0');
            string_hour3.push_back('0');
       }
    }
    else
    {
        string_hour3=to_string(hour3);
    }
    if(minute3<10&&minute3>=0)
    {
        if(minute3!=0)
        {
             string_minute3.push_back('0');
            char temp='0'+minute3;
            string_minute3.push_back(temp);
        }
        else
        {
             string_minute3.push_back('0');
              string_minute3.push_back('0');
        }

    }
    else
    {
        string_minute3=to_string(minute3);
    }
    if(second3<10&&second3>=0)
    {
        if(second3!=0)
        {
             string_second3.push_back('0');
            char temp='0'+second3;
            string_second3.push_back(temp);
        }
        else
        {
             string_second3.push_back('0');
              string_second3.push_back('0');
        }

    }
    else
    {
        string_second3=to_string(second3);
    }
    /*
     cout<<string_hour3<<endl;
    cout<<string_minute3<<endl;
    cout<<string_second3<<endl;
*/
    string result=string_hour3+":"+string_minute3+":"+string_second3;
    return result;

好啦,希望能够帮助到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值