【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】

目录😋

任务描述

相关知识

一、军舰鸣放礼炮的时间间隔计算

[1. 基本原理](#1. 基本原理)

[2. 示例代码](#2. 示例代码)

二、三艘军舰的礼炮声重叠(重合)计算

[1. 基本原理](#1. 基本原理)

[2. 示例代码(求两个数的 GCD)](#2. 示例代码(求两个数的 GCD))

[3. 示例代码(求三个数的 LCM)](#3. 示例代码(求三个数的 LCM))

[4. 使用示例](#4. 使用示例)

[三、循环控制 / 跳转语句的使用](#三、循环控制 / 跳转语句的使用)

[1. 循环控制语句(for 循环)](#1. 循环控制语句(for 循环))

[2. 循环控制语句(while 循环)](#2. 循环控制语句(while 循环))

[3. 跳转语句(break 语句)](#3. 跳转语句(break 语句))

[4. 跳转语句(continue 语句)](#4. 跳转语句(continue 语句))

编程要求

测试说明

通关代码

测试结果


任务描述

**本关任务:**有 A、B、C 三艘军舰同时开始鸣放礼炮各21响。已知 A 舰每隔5秒1次,B 舰每隔6秒放1次,C 舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。


相关知识

为了完成本关任务,你需要掌握:

  1. 军舰鸣放礼炮的时间间隔计算;
  2. 三艘军舰的礼炮声重叠(重合)计算;
  3. 循环控制/跳转语句的使用。

一、军舰鸣放礼炮的时间间隔计算

1. 基本原理
  • 假设军舰鸣放礼炮的频率是固定的,例如一艘军舰每隔固定的秒数鸣放一次礼炮。如果我们知道礼炮鸣放的总时长和每次鸣放的间隔时间,就可以计算出总共鸣放的次数。在 C 语言中,可以使用简单的算术运算来实现。
  • 例如,礼炮总时长为total_time秒,每次鸣放间隔为interval秒,那么鸣放次数num_fires可以通过公式num_fires = total_time/interval + 1(如果总时长刚好是间隔时间的整数倍,需要加 1 才能得到正确的次数)来计算。
2. 示例代码
cpp 复制代码
#include <stdio.h>
int main() {
    int total_time = 60;  // 总时长(秒)
    int interval = 5;    // 间隔时间(秒)
    int num_fires = total_time/interval + 1;
    printf("礼炮鸣放次数为:%d\n", num_fires);
    return 0;
}

二、三艘军舰的礼炮声重叠(重合)计算

1. 基本原理
  • 对于三艘军舰鸣放礼炮的情况,假设每艘军舰的礼炮鸣放间隔分别为interval1interval2interval3。要找到它们礼炮声重叠的时间点,就需要找到这三个间隔时间的最小公倍数(LCM)。在 C 语言中,可以通过辗转相除法先求两个数的最大公因数(GCD),然后利用公式LCM(a, b)=a*b/GCD(a, b)来计算两个数的最小公倍数,再逐步扩展到三个数。
2. 示例代码(求两个数的 GCD)
cpp 复制代码
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}
3. 示例代码(求三个数的 LCM)
cpp 复制代码
int lcm(int a, int b, int c) {
    int ab_lcm = a * b / gcd(a, b);
    return ab_lcm * c / gcd(ab_lcm, c);
}
4. 使用示例
cpp 复制代码
#include <stdio.h>
int main() {
    int interval1 = 4;
    int interval2 = 6;
    int interval3 = 8;
    int overlap_time = lcm(interval1, interval2, interval3);
    printf("礼炮声重叠的间隔时间为:%d秒\n", overlap_time);
    return 0;
}

三、循环控制 / 跳转语句的使用

1. 循环控制语句(for 循环)
  • 基本原理for循环是一种常用的循环结构,它允许您指定一个初始化表达式、一个循环条件和一个更新表达式。语法格式为for(初始化表达式; 循环条件; 更新表达式)。初始化表达式在循环开始时执行一次,用于初始化循环变量。循环条件在每次循环迭代开始时进行检查,如果为真,则执行循环体中的代码。更新表达式在每次循环体执行完后执行,用于更新循环变量。

  • 示例代码

    cpp 复制代码
    #include <stdio.h>
    int main() {
        // 打印1到10的数字
        for (int i = 1; i <= 10; i++) {
            printf("%d ", i);
        }
        printf("\n");
        return 0;
    }
2. 循环控制语句(while 循环)
  • 基本原理while循环在循环开始时检查循环条件。只要条件为真,就会执行循环体中的代码。语法格式为while(循环条件)。循环条件是一个表达式,它返回一个布尔值(真或假)。在循环体中,通常需要包含一些能够改变循环条件的语句,否则可能会导致无限循环。

  • 示例代码

    cpp 复制代码
    #include <stdio.h>
    int main() {
        int i = 1;
        while (i <= 10) {
            printf("%d ", i);
            i++;
        }
        printf("\n");
        return 0;
    }
3. 跳转语句(break 语句)
  • 基本原理break语句用于立即跳出当前循环(forwhiledo - while)或switch语句。当程序执行到break语句时,循环或switch语句会立即终止,程序控制流将跳转到循环或switch语句后的下一条语句。

  • 示例代码(在循环中使用 break)

    cpp 复制代码
    #include <stdio.h>
    int main() {
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                break;
            }
            printf("%d ", i);
        }
        printf("\n");
        return 0;
    }
4. 跳转语句(continue 语句)
  • 基本原理continue语句用于跳过当前循环迭代的剩余部分,直接开始下一次循环迭代。当程序执行到continue语句时,循环体中continue语句之后的代码将不会被执行,而是直接跳转到循环的更新表达式(对于for循环)或循环条件检查(对于whiledo - while循环)。

  • 示例代码(在循环中使用 continue)

    cpp 复制代码
    #include <stdio.h>
    int main() {
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                continue;
            }
            printf("%d ", i);
        }
        printf("\n");
        return 0;
    }

编程要求

根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。


测试说明

平台会对你编写的代码进行测试:
预期输出:

cpp 复制代码
n=54

开始你的任务吧,祝你成功!


通关代码

cpp 复制代码
/*10. 在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共以听到几次礼炮声。*/
#include <stdio.h>
main(){
  int n=0,t;
  /************************begin***********************/

 int a = 0,b = 0, c = 0;

  for(t = 1;t <= 21 * 7;t++){
    if(t % 5 == 0 && t<=21 * 5){
      a++;
    }
    if(t % 6 == 0 && t<=21 * 6){
      b++;
    }
    if(t % 7 == 0 && t<=21 * 7){
      c++;
    }

    if(a > 0 && b > 0 && c > 0){
      n++;
      a--;
      b--;
      c--;
    }else if(a > 0 && b > 0){
      n++;
      a--;
      b--;
    }else if(a > 0 && c > 0){
      n++;
      a--;
      c--;
    }else if(b > 0 && c > 0){
      n++;
      b--;
      c--;
    }else if(a+b+c==1){
      n++;
      a=0;
      b=0;
      c=0;
    } 
  }

  /************************end************************/
printf("n=%d\n",n);
}

测试结果

相关推荐
ThetaarSofVenice9 分钟前
【Java从入门到放弃 之 final 关键字】
java·开发语言·python
黑客K-ing10 分钟前
如何安全保存用户密码及哈希算法
算法·哈希算法
最好Tony16 分钟前
深度学习blog-Meanshift均值漂移算法-最大熵模型
深度学习·算法·均值算法
赔罪18 分钟前
Java 内部类与异常类
java·开发语言·intellij-idea·myeclipse
麻瓜老宋28 分钟前
【手搓一个脚本语言】七、用C语言抽象语法树AST实现一个可交互运行的表达式计算器
c语言·开发语言·数据结构·算法
静心观复30 分钟前
Java NIO、AIO分析
java·开发语言·nio
袁庭新32 分钟前
什么是Lua协同程序?和线程有什么区别?
java·开发语言·lua·脚本语言·袁庭新·什么是lua协同程序·lua协同程序
java熊猫33 分钟前
Lua语言的多线程编程
开发语言·后端·golang
两水先木示37 分钟前
【xLua】xLua-master签名、加密Lua文件
开发语言·lua·xlua·加密lua
HUT_Tyne26539 分钟前
力扣--844.比较含退格的字符串
算法·leetcode·职场和发展