返回 课程

信奥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课 循环(计数、求和、求乘积)
    7 主题|小节
  17. 第17课 循环进阶(While+)
  18. 第18课 do-while及while其他用法
  19. 第19课 For循环基础
  20. 第20课 For循环进阶
课 9, 主题|小节 2
进行中

9.1 输入的魔法世界

2025年12月1日
课 进展
0% 完成

“小朋友们,”我微笑着说,”今天我们要学习如何让计算机理解我们输入的各种信息!”

小明举手问道:”小C老师,输入数据有什么讲究吗?”

9.1.1 cin的类型魔法

// 整数输入
int num;
cin >> num;       // 输入整数

// 小数输入
double score;     // 可以精确保存更多小数位
cin >> score;     // 输入小数

float price;      // 精度较double低一些
cin >> price;     // 输入单精度小数

// 字符输入
char grade;
cin >> grade;     // 输入单个字符,如'A'、'B'等

// 多个变量连续输入
int a, b;
double x;
char op;
cin >> a >> b >> x >> op;  // 一次输入多个不同类型的值

[图片:展示cin的输入流程和各种数据类型]

练习题:

  1. 选择题:下列哪个cin语句是正确的?
    A. cin << a;
    B. cin >> “a”;
    C. cin >> a;
    D. cin >> ‘a’;

正确答案:C
解析:cin使用>>运算符,将输入值存入变量中。

  1. 判断题:cin >> a >> b;等价于分别写两行cin >> a;和cin >> b;。

正确答案:√
解析:cin可以连续读取多个值,效果与分别读取相同。

  1. 选择题:下面哪种输入方式能正确读取一个字符?
    A. cin << ch;
    B. cin > ch;
    C. cin >> ch;
    D. cin := ch;

正确答案:C
解析:cin使用>>运算符读取数据,其他选项都是错误的语法。

  1. 判断题:使用cin输入数据时,不同类型的数据之间必须用逗号隔开。

正确答案:×
解析:cin输入数据时可以用空格或回车分隔,不需要逗号。

cin输入类型转换:

// 类型转换示例
float f;
cin >> f;      // 输入小数
int n = int(f); // 将小数转换为整数(舍去小数部分)

double d = 3.14;
int m = (int)d; // C风格类型转换

练习题:

  1. 选择题:执行以下代码后变量a的值是多少?
float f = 5.8;
int a = (int)f;

A. 5
B. 6
C. 5.8
D. 程序报错

正确答案:A
解析:将float类型转换为int类型时,会舍去小数部分。

  1. 判断题:cin >> f;语句中,如果输入5+2,f的值将是7。

正确答案:×
解析:cin读取表达式时会将其视为字符串,不会计算表达式的值。

9.1.2 scanf的格式魔法

// 整数输入
int a;
scanf("%d", &a);    // %d 用于整数,&取地址

// 小数输入
float f;
scanf("%f", &f);    // %f 用于单精度小数
double d;
scanf("%lf", &d);   // %lf 用于双精度小数(注意是lf不是f)

// 字符输入
char c;
scanf("%c", &c);    // %c 用于字符

// 带格式的输入
int hour, minute;
scanf("%d:%d", &hour, &minute);  // 可以识别冒号分隔的时间格式

// 多个变量的混合输入
int x, y;
char op;
double value;
scanf("%d%d %c%lf", &x, &y, &op, &value);  // 注意空格的使用

[图片:展示scanf的格式说明符和示例]

💡 scanf格式说明符速查表
| 格式符 | 类型 | 示例 |
| —— | ———- | ———– |
| %d | 整数 | -123, 456 |
| %f | 单精度小数 | 3.14 |
| %lf | 双精度小数 | 3.141592653 |
| %c | 字符 | ‘A’, ‘1’ |

练习题:

  1. 选择题:读取双精度小数应该使用哪个格式说明符?
    A. %d
    B. %f
    C. %lf
    D. %c

正确答案:C
解析:%lf专门用于读取double类型的双精度小数。

  1. 判断题:scanf(“%d%d”, &a, &b)中的两个%d之间必须有空格。

正确答案:×
解析:格式串中的%d之间可以没有空格,输入时数据可以用空格或回车分隔。

scanf格式化输入的更多细节:

// 格式化输入高级用法
int a, b;
scanf("%d+%d", &a, &b);    // 可以识别带加号的输入,如"5+3"
scanf("%d-%d", &a, &b);    // 可以识别带减号的输入,如"8-3"
scanf("%d,%d", &a, &b);    // 可以识别逗号分隔的输入,如"4,5"

练习题:

  1. 选择题:对于scanf(“%d+%d”, &x, &y)语句,以下哪种输入是正确的?
    A. 3 + 5
    B. 3+5
    C. 3 5
    D. 3,5

正确答案:B
解析:格式字符串中的字符必须与输入完全匹配。

  1. 判断题:scanf(“%d,%d”, &a, &b)语句只能读取用逗号分隔的两个数。

正确答案:√
解析:格式字符串指定了输入必须包含逗号,不能用其他分隔符。

算术运算的优先级说明:

// 运算优先级示例
int a = 5, b = 3, c = 2;
int result = a + b * c;     // 先乘后加
int result2 = (a + b) * c;  // 使用括号改变优先级

练习题:

  1. 选择题:表达式 15 / 2 * 3 + 4 的结果是多少?
    A. 15
    B. 18
    C. 26.5
    D. 27

正确答案:B
解析:按照运算优先级,先算除法和乘法(从左到右),再算加法。

  1. 判断题:在整数除法中,5/22 与 5/(22)的结果相同。

正确答案:×
解析:前者等于4,后者等于1,因为整数除法会舍去小数部分。

9.1.3 输入的类型转换魔法

// 1. float类型的精确输入
float f;
cin >> f;       // 可以输入小数,如3.14
cout << f;      // 原样输出,保持精度

// 2. 科学计数法输入
float sci;
cin >> sci;     // 可以输入2e-1这样的科学计数法
cout << sci;    // 输出0.2

// 3. 整数和小数的转换
float num;
cin >> num;           // 输入小数
int converted = num;  // 自动转换为整数(舍去小数部分)

[图片:展示不同类型数据的输入转换过程]

练习题:

  1. 选择题:在C++中,对float型变量f,cin >> f;如果输入2e-1,f的值是多少?
    A. 0.02
    B. 0.2
    C. 2
    D. 20

正确答案:B
解析:2e-1是科学计数法,表示2×10^(-1),等于0.2。

  1. 判断题:float型变量经过cin输入后,再赋值给int型变量,小数部分会四舍五入。

正确答案:×
解析:float转int会直接舍去小数部分,不会进行四舍五入。

9.1.4 特殊输入处理

// 1. 连续数字的输入
int a, b;
cin >> a >> b;          // 可以用空格或回车分隔
cout << a + b << "n";  // 输出它们的和

// 2. scanf的特殊格式
int x, y;
scanf("%d+%d", &x, &y);  // 可以识别5+2这样的输入
printf("%dn", x + y);   // 输出它们的和

// 3. 混合类型输入
int n;
float f;
scanf("%d%f", &n, &f);   // 整数和小数的混合输入

[图片:展示不同输入方式的示例]

练习题:

  1. 选择题:以下哪个scanf语句能正确读取”12,34″这样的输入?
    A. scanf(“%d%d”, &a, &b);
    B. scanf(“%d,%d”, &a, &b);
    C. scanf(“%d-%d”, &a, &b);
    D. scanf(“%d.%d”, &a, &b);

正确答案:B
解析:只有B选项中的格式字符串包含了逗号分隔符,可以匹配输入中的逗号。

  1. 判断题:scanf(“%d”, &N)语句中,如果输入的是字符而不是数字,程序会报错。

正确答案:×
解析:程序不会直接报错,但会导致输入失败,N的值不会被正确赋值。

9.1.5 表达式输入处理

// 1. 简单表达式处理
int i;
cin >> i;             // 如果输入5+2
cout << i << "n";    // 只会读取5,+2会留在输入缓冲区

// 2. 格式化表达式输入
int a, b;
char op;
scanf("%d%c%d", &a, &op, &b);  // 可以读取"5+2"这样的输入
// 注意:a存储5,op存储'+',b存储2

// 3. 数值范围处理
int large_num;
scanf("%d", &large_num);  // 输入要在int范围内

[图片:展示表达式输入的处理流程]

练习题:

  1. 选择题:执行以下代码:
int x;
cin >> x;  // 输入5+2
cout << x;

输出结果是:
A. 7
B. 5
C. 2
D. 报错

正确答案:B
解析:cin遇到非数字字符会停止读取,因此只会读入5。

  1. 判断题:scanf(“%d%d”, &a, &b)可以直接读取形如”5+2″的表达式并将5和2分别存入a和b。

正确答案:×
解析:没有指定分隔符的scanf会使用空白字符作为分隔,无法正确处理”5+2″这样的输入。