7-9 大笨钟

7-9 大笨钟_第1张图片

 

分数 10

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

输入格式:

输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:

根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm.  Too early to Dang.

其中hh:mm是输入的时间。

输入样例1:

19:05

输出样例1:

DangDangDangDangDangDangDangDang

输入样例2:

07:05

输出样例2:

Only 07:05.  Too early to Dang.

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

我的答案:

首先,为了解决这个问题,我们需要确定两个条件:

  1. 当前的时间是否在笨钟的敲钟时间范围内(即12:01至23:59)。
  2. 如果在范围内,我们需要确定笨钟敲几下。

接下来是C语言和C++的实现。

C语言实现:

#include 

int main() {
    int hh, mm;
    scanf("%d:%d", &hh, &mm);

    if (hh < 12 || (hh == 12 && mm == 0)) {
        printf("Only %02d:%02d.  Too early to Dang.\n", hh, mm);
    } else {
        if (mm > 0) hh++; // 如果分钟大于0,则钟声数增加1
        for (int i = 12; i < hh; i++) {
            printf("Dang");
        }
    }
    return 0;
}

C++:

#include 
#include 

using namespace std;

int main() {
    int hh, mm;
    char ch;
    cin >> hh >> ch >> mm;

    if (hh < 12 || (hh == 12 && mm == 0)) {
        cout << "Only " << setw(2) << setfill('0') << hh << ":" << setw(2) << setfill('0') << mm << ".  Too early to Dang." << endl;
    } else {
        if (mm > 0) hh++; // 如果分钟大于0,则钟声数增加1
        for (int i = 12; i < hh; i++) {
            cout << "Dang";
        }
    }
    return 0;
}

总结:

从这道题目“大笨钟”中,我们可以学习到以下几点:

1. **字符串处理**:通过对输入字符串的处理,我们可以提取和转换时间数据。

2. **条件逻辑**:根据题目的描述,我们需要判断当前时间是否在特定的时间范围内,以决定是敲钟还是输出一个特定的消息。

3. **循环**:题目要求输出“Dang”多次,这需要用到循环。

4. **格式化输出**:题目中的某些输出格式要求可以使用标准库中的格式化工具,如`setw`和`setfill`,来进行处理。虽然这道题目的解答中并没有使用到,但知道这些工具的存在和如何使用它们是有帮助的。

5. **问题分解**:解决这个问题需要将其分解为几个较小的子问题,如:
   - 如何从字符串中解析出小时和分钟?
   - 如何判断当前时间是否在敲钟的时间范围内?
   - 如何决定敲多少下钟?

6. **实际应用**:虽然这是一个编程练习题,但它模仿了现实生活中的一个场景。通过这样的题目,我们可以了解如何使用编程来模拟或解决实际生活中的问题。

7. **细节注意**:例如,要确保正确地处理分钟数,因为即使已经超过了某个整点,钟声的次数仍然会增加。

总之,这道题目提供了对字符串处理、条件逻辑和循环的实践,同时也展示了如何将现实生活的场景转化为编程问题。

学到了什么新东西?

`#include ` 是 C++ 标准库的一个头文件,它提供了一系列的输入/输出操作符,用于格式化I/O操作。使用这个头文件,你可以更方便地控制输出的格式,如设置宽度、填充、精度、数字的基数格式等。

这里是该头文件中一些常用的操作符和它们的描述:

1. **setw(int)**:设置输出字段宽度。
   ```cpp
   cout << setw(5) << 123;  // 输出:"  123"
   ```

2. **setfill(char)**:设置填充字符。
   ```cpp
   cout << setw(5) << setfill('0') << 123;  // 输出:"00123"
   ```

3. **setprecision(int)**:设置浮点数的输出精度。
   ```cpp
   cout << setprecision(3) << 3.14159;  // 输出:"3.14"
   ```

4. **fixed**:使浮点数以固定小数位数形式输出。
   ```cpp
   cout << fixed << setprecision(3) << 3.14159;  // 输出:"3.142"
   ```

5. **showpoint**:总是显示小数点。

6. **showpos**:正数前面显示`+`号。

7. **left/right/internal**:控制输出字段中的对齐方式。

在你给出的问题中,`setw`和`setfill`被用于确保小时和分钟总是以两个数字的形式输出,即使它们的值小于10。

7-9 大笨钟_第2张图片

 

你可能感兴趣的:(PTA课后练习,算法,c++)