返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 13, 主题|小节 8
进行中

13.7 真题讲解

2025年9月22日
课 进展
0% 完成

“小朋友们,接下来让我们看一些真实的考试题目,”我说,”这些题目会测试你们对多分支、多if和switch语句的理解和应用能力。”

选择题:

第1题 下面C++代码执行输入21后,有关描述正确的是( )。
1  int N;
2  cin >> N;
3  if(N% 3 == 0)
4      cout << "能被3整除";
5  else if (N % 7 == 0)
6      cout << "能被7整除";
7  else
8      cout << "不能被3和7整除";
9  cout << endl;

□ A. 代码第4行被执行
□ B. 第4和第7行代码都被执行
□ C. 仅有代码第7行被执行
□ D. 第8行代码将被执行,因为input()输入为字符串

正确答案:A

解析:
输入N=21后,首先判断21%3是否等于0。21%3=0,条件为真,所以会执行第4行代码,输出”能被3整除”。然后程序继续执行第9行,输出换行符。因此,只有第4行代码被执行,选项C是正确的。选项A说代码第4行被执行是正确的,但不完整;选项B错误,因为第7行代码不会被执行;选项D错误,input()函数没有出现在代码中。

第7题 下面C++代码执行后的输出是( )。
1  int m = 14;
2  int n = 12;
3  if (m % 2 == 0 && n % 2 == 0)
4      cout << "都是偶数";
5  else if (m % 2 == 1 && n % 2 == 1)
6      cout << "都是奇数";
7  else
8      cout << "不都是偶数或奇数";

□ A. 都是偶数
□ B. 都是奇数
□ C. 不都是偶数或奇数
□ D. 以上说法都不正确

正确答案:A

解析:
在这段代码中,m=14,n=12。首先判断m%2是否等于0,结果为真(14是偶数);然后判断n%2是否等于0,结果也为真(12是偶数)。所以条件m%2==0&&n%2==0为真,执行第4行,输出”都是偶数”。因此,选项A是正确的。

第8题 下面C++代码执行后的输出是( )。
1  int m = 14;
2  int n = 12;
3  if (m % 2 && n % 2)
4      cout << "都是偶数";
5  else if (m % 2 == 1 && n % 2 == 1)
6      cout << "都是奇数";
7  else
8      cout << "不都是偶数或奇数";

□ A. 都是偶数
□ B. 都是奇数
□ C. 不都是偶数或奇数
□ D. 以上说法都不正确

正确答案:C

解析:
在这段代码中,m=14,n=12。首先判断m%2的值,m%2=0(偶数对2取余为0);然后判断n%2的值,n%2=0(偶数对2取余为0)。在C++中,0被视为假,所以条件m%2&&n%2为假,不执行第4行。接着判断m%2==1&&n%2==1,m%2=0,不等于1,所以这个条件也为假,不执行第6行。因此,执行else分支,输出”不都是偶数或奇数”。所以,选项C是正确的。

第9题 下面C++代码执行后的输出是( )。
1  int m = 7;
2  if (m / 5 || m / 3)
3      cout << 0;
4  else if (m / 3)
5      cout << 1;
6  else if (m / 5)
7      cout << 2;
8  else
9      cout << 3;

□ A. 0
□ B. 1
□ C. 2
□ D. 3

正确答案:A

解析:
在这段代码中,m=7。首先计算m/5的值,7/5=1(整数除法结果为1);然后计算m/3的值,7/3=2(整数除法结果为2)。在C++中,非零值被视为真,所以条件m/5||m/3为真(1||2为真),执行第3行,输出0。因此,选项A是正确的。

编程题:

题目1:

题目解析:

  1. 题目要求:
  • 题目名称:温度转换
  • 时间限制:1.0s
  • 内存限制:512.0MB
  1. 问题描述:
  • 小明要给学习了开氏温度,现在要将其转换为摄氏温度和华氏温度
  • 给定转换公式:
    • C = K – 273.15 (开氏度转摄氏度)
    • F = C × 1.8 + 32 (摄氏度转华氏度)
  • 需要判断温度是否过高(华氏温度超过212度)
  1. 输入格式:
  • 一行,一个整数K,表示开氏温度
  1. 输出格式:
  • 一行,若输入开氏温度对应的华氏温度高于212,输出”Temperature is too high!”
  • 否则,输出两个由空格分隔的数值,分别表示摄氏温度和华氏温度,保留两位小数
  1. 样例分析:
样例1输入:
41.80
输出:
Temperature is too high!

样例2输入:
173.56
输出:
-99.59 -147.26
  1. 数据范围:
  • 0 < K < 105
  1. 解题思路:
  • 先将开氏温度转换为摄氏温度
  • 再将摄氏温度转换为华氏温度
  • 判断华氏温度是否超过212度
  • 根据判断结果输出相应内容

代码示例

#include <cstdio>
using namespace std;

int main() {
    double K;                     // 声明变量存储开氏温度
    scanf("%lf", &K);            // 输入开氏温度值
    
    double C = K - 273.15;       // 将开氏温度转换为摄氏度
    double F = 32 + C * 1.8;     // 将摄氏度转换为华氏度
    
    // 使用switch语句根据温度范围判断输出
    switch(F > 212) {            // 表达式结果为布尔值,转换为0或1
        case 1:                  // 当F > 212为真时
            printf("Temperature is too high!n");
            break;
        case 0:                  // 当F > 212为假时
            printf("%.2f %.2fn", C, F);  // 输出摄氏度和华氏度,保留2位小数
            break;
    }
    
    return 0;
}

  1. 代码分析:
  • 使用double类型存储温度值,保证精度
  • scanf和printf使用%lf处理double类型
  • %.2f控制输出保留2位小数
  • 创新地使用switch语句处理布尔表达式(F > 212)的结果
  • 表达式F > 212的结果会被转换为0(假)或1(真),作为switch的case值
  1. 注意事项:
  • 温度转换公式的准确使用
  • 输出格式的严格控制
  • 浮点数的精度处理
  • 理解switch语句处理布尔表达式的方式
  • 确保每个case后有break语句避免穿透
  1. 关键点:
  • 理解三种温度单位的转换关系
  • 正确处理浮点数输入输出
  • 使用switch语句处理二元判断情况
  • 输出格式的控制(空格、小数位数)
  • 布尔表达式在switch中的应用

题目2:

题目解析:

  1. 题目要求:
  • 试题编号:2023-09-23-01-C-01
  • 试题名称:买文具
  • 时间限制:1.0s
  • 内存限制:128.0MB
  1. 问题描述:
  • 小明去文具店选购文具
  • 商品单价:
    • 铅笔2元一支
    • 记事本5元一本
    • 尺3元一把
  • 需要判断小明的钱是否足够购买所需文具
  1. 输入格式:
  • 共四行,每行一个正整数:
    • 第一行整数X:表示要买铅笔的数量(1≤X≤10)
    • 第二行整数Y:表示要买记事本的数量(1≤Y≤10)
    • 第三行整数Z:表示要买尺的数量(1≤Z≤10)
    • 第四行整数Q:表示小明手里的钱数(单位:元)
  1. 输出格式:
  • 输出两行:
    • 第一行:如果钱够买输出”Yes”,否则输出”No”
    • 第二行:如果钱够买输出剩余的钱数,否则输出还差多少钱
  1. 样例分析:
样例1:
输入:
1
1
1
20
输出:
Yes
10
解释:需要2+5+3=10元,有20元,够买,剩10元

样例2:
输入:
1
1
1
5
输出:
No
5
解释:需要2+5+3=10元,只有5元,不够买,还差5元
  1. 数据范围:
  • 1 ≤ X ≤ 10
  • 1 ≤ Y ≤ 10
  • 1 ≤ Z ≤ 10
  • Q为正整数
  1. 解题思路:
  • 读取所有输入数据
  • 计算购买文具需要的总金额:t = 2x + 5y + 3z
  • 将总金额t与小明的钱数q进行比较
  • 根据比较结果输出对应内容

代码示例:

#include <iostream>
using namespace std;

int main() {
    // 初始化变量
    int x = 0, y = 0, z = 0, q = 0;       // x:铅笔数量, y:记事本数量, z:尺数量, q:小明手里的钱
    
    // 输入购买数量和金额
    cin >> x >> y >> z >> q;              // 读入四个数

    // 计算总价:铅笔2元/支,记事本5元/本,尺3元/把
    int t = x * 2 + y * 5 + z * 3;        // 计算购买所需总价
    
    // 使用switch语句判断钱是否足够
    switch(q >= t) {                      // 表达式结果为布尔值,转换为0或1
        case 1:                           // 当q >= t为真时,表示钱够用
            cout << "Yes" << endl;        // 输出Yes
            cout << q - t << endl;        // 输出剩余的钱
            break;
        case 0:                           // 当q >= t为假时,表示钱不够
            cout << "No" << endl;         // 输出No
            cout << t - q << endl;        // 输出还差多少钱
            break;
    }
    
    return 0;
}
  1. 代码分析:
  • 使用整型变量存储所有输入数据
  • 计算总价时使用正确的单价倍数
  • 使用switch语句代替if-else结构进行判断和输出
  • 将布尔表达式(q >= t)转换为0或1作为switch的判断条件
  • 注意差值计算的正确顺序
  1. 注意事项:
  • 各个商品数量必须在1到10的范围内
  • 总价计算公式必须准确
  • 输出格式必须严格按要求
  • 理解switch语句处理布尔值的方式
  • 确保每个case后有break语句以避免穿透效应
  1. 关键点:
  • 理解每种文具的单价和数量关系
  • 正确计算购买总价
  • 使用switch语句处理二元判断情况
  • 输出格式的严格控制
  • 差值计算的正负处理

题目3:

题目解析:

  1. 题目要求:
  • 题目名称:每月天数
  • 通过编程确定指定月份的天数
  • 需要考虑闰年的情况
  1. 问题描述:
  • 小明刚刚学习了每月有多少天
  • 需要编写程序来判断给定年份和月份的天数
  • 需要处理闰年和平年的情况
  1. 输入格式:
  • 输入一行,包含两个整数,分别表示一个月的年、月
  1. 输出格式:
  • 输出一行,包含一个整数,表示输入月份有多少天
  1. 样例分析:
样例1:
输入:
2022 1
输出:
31
解释:2022年1月有31天

样例2:
输入:
2020 2
输出:
29
解释:2020年是闰年,2月有29天
  1. 解题思路:
  • 首先判断是否是闰年:
    • 能被400整除的是闰年
    • 能被4整除但不能被100整除的是闰年
  • 然后根据月份判断天数:
    • 大月(1,3,5,7,8,10,12月)有31天
    • 小月(4,6,9,11月)有30天
    • 2月特殊处理:闰年29天,平年28天

代码示例一:(switch)

#include <iostream>
using namespace std;

int main() {
    int y = 0, m = 0;                  // 年份和月份
    cin >> y >> m;                     // 输入年月
    
    // 判断是否为闰年
    bool leap = false;                 // 初始化闰年标志为false
    if ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0))
        leap = true;                   // 满足闰年条件时设置为true
    
    // 使用switch语句判断月份天数
    switch(m) {
        case 1:                        // 1月
        case 3:                        // 3月
        case 5:                        // 5月
        case 7:                        // 7月
        case 8:                        // 8月
        case 10:                       // 10月
        case 12:                       // 12月
            cout << 31 << endl;        // 大月31天
            break;
            
        case 4:                        // 4月
        case 6:                        // 6月
        case 9:                        // 9月
        case 11:                       // 11月
            cout << 30 << endl;        // 小月30天
            break;
            
        case 2:                        // 2月特殊处理
            // 嵌套switch处理闰年和平年的2月
            switch(leap) {
                case true:              // 闰年
                    cout << 29 << endl; // 闰年2月29天
                    break;
                case false:             // 平年
                    cout << 28 << endl; // 平年2月28天
                    break;
            }
            break;
            
        default:                       // 处理非法月份输入
            cout << "Invalid month!" << endl;
            break;
    }
    
    return 0;
}

代码示例二:(多分支+多if)

#include <iostream>
using namespace std;

int main() {
    int y = 0, m = 0;                  // 年份和月份
    cin >> y >> m;                     // 输入年月
    bool leap = false;                 // 判断闰年
    if (y % 400 == 0)                 // 400的倍数是闰年
        leap = true;
    if (y % 4 == 0 && y % 100 != 0)   // 4的倍数但不是100的倍数是闰年
        leap = true;
    
    if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
        cout << 31 << endl;            // 大月31天
    else if (m == 4 || m == 6 || m == 9 || m == 11)
        cout << 30 << endl;            // 小月30天
    else if (leap)
        cout << 29 << endl;            // 闰年2月29天
    else
        cout << 28 << endl;            // 平年2月28天
    return 0;
}