知识点#
3.1 程序的基本结构#
- @ 程序结构图
- ![[白板/P4 程序结构.canvas|P4 程序结构]]
3.1.1 C 语言的语句#
[!tip] C 语言语句
- @ 语句: C 语言程序的基本执行单位,以分号
;结尾- % 语句分类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
语句的书写规则#
- ! 一行可以写多个语句,每个语句以
;结尾 - ! 一个语句可以分多行写(当一行代码过长时)
printf("断点停止在\
这里\n"); // 语句分多行书写
3.1.2 程序的三种基本结构#
[!tip] 结构化程序设计
- @ 结构化程序设计: 使程序结构清晰、可读性强,提高程序设计的质量
- % 三种基本结构:
- 顺序结构
- 选择结构
- 循环结构
1. 顺序结构#
- @ 顺序结构: 先执行 A 操作,再执行 B 操作
- ! 语句从上到下、从左到右逐条执行
printf("1\n");
printf("2\n");
printf("3\n"); // 输出: 1 2 3
2. 选择结构#
- @ 选择结构: 根据条件 P 选择执行 A 或 B 操作
- ! 条件为真执行 A,条件为假执行 B
if(3 > 1)
printf("3 > 1\n"); // 这行被执行
else
printf("3 < 1\n"); // 这行不会被执行
多分支选择结构#
- %
k与k1,k2, …,kn比较,选择执行对应的操作 - % 典型语句:
switch语句
int k = 5;
switch(k) {
case 1:
printf("k = 1\n"); // 不会被执行
break;
case 2:
printf("k = 2\n"); // 不会被执行
break;
case 5:
printf("k = 5\n"); // 会被执行
break;
}
3. 循环结构#
当型循环结构 (while)#
- @ 当型循环: 先判断条件 P,再决定是否执行 A 操作
- ! 条件 P 为真时反复执行 A,直到条件为假
int icount = 5;
while(icount >= 0) {
printf("icount = %d\n", icount); // 5,4,3,2,1,0
icount = icount - 1;
}
直到型循环结构 (do-while)#
- @ 直到型循环: 先执行一次 A 操作,再判断条件 P
- ! 至少执行一次 A 操作
- ! 条件 P 为真时继续执行 A
int icount = 5;
do {
printf("icount = %d\n", icount); // 5,4,3,2,1,0
icount = icount - 1;
} while(icount >= 0);
3.1.3 赋值语句的特殊写法#
[!warning] 注意
- ! 赋值表达式可以被包含在其他表达式中
- ! 但不推荐这种写法,程序清晰性和易读性更重要
int x;
printf("x = 8的值是%d\n", x = 8); // x = 8的值是8
int a = 3, b = 5, t = 1;
if((a = b) > 0)
t = a; // 执行后 a = 5
printf("a = %d\n", a); // a = 5
3.2 数据的输出与数据的输入#
- @ 输入输出图
- ![[白板/P5 输入输出.canvas|P5 输入输出]]
3.2.1 数据的输出#
1. putchar 函数#
[!tip] putchar 函数
- @ putchar: 向屏幕输出一个字符
- 格式:
putchar(c);c可以是字符型变量或整型变量
#include <stdio.h>
int main() {
char a, b, c;
a = 'F'; b = 'A'; c = 'T';
putchar(a); // F
putchar(b); // A
putchar(c); // T
putchar('\n'); // 换行
a = 97; // 字符a的ASCII码
b = 98; // 字符b的ASCII码
putchar(a); // a
putchar('\n'); // 换行
putchar(b); // b
return 0;
}
#include 命令说明#
- !
#include <stdio.h>- 在系统目录中寻找头文件 - !
#include "stdio.h"- 先在当前目录寻找,再到系统目录 - % 系统头文件用
<>,自定义头文件用""
2. printf 函数#
[!tip] printf 函数
- @ printf: 向屏幕输出若干个任意类型数据
- 格式:
printf(格式控制字符串, 输出表列);- 格式控制字符串包含:
- 原样输出的普通字符
- 格式字符 (
%d,%f,%c等)
printf 格式字符#
| 格式字符 | 含义 | 示例 |
|---|---|---|
%d | 十进制整数 | printf("%d", 10); → 10 |
%o | 八进制数 | printf("%o", 15); → 17 |
%x | 十六进制数 | printf("%x", 15); → f |
%u | 无符号十进制 | printf("%u", 100); → 100 |
%c | 字符 | printf("%c", 'a'); → a |
%s | 字符串 | printf("%s", "CHINA"); → CHINA |
%f | 浮点数 | printf("%f", 2.15+3.12); → 5.270000 |
格式字符详细说明#
%d 十进制整数
int a = 10;
printf("a = %d\n", a); // a = 10
%o 八进制数
- ! 输出的数字不能是负数
int abc = 15;
printf("abc = %o\n", abc); // abc = 17 (八进制)
%x 十六进制数
- ! 输出的数字不能是负数
int abc = 15;
printf("abc = %x\n", abc); // abc = f (十六进制)
%u 无符号十进制
- ! 用于输出
unsigned类型数据 - ! 无符号类型表示的数据范围比有符号类型大 1 倍
short aaa = -10000;
printf("aaa = %u\n", aaa); // aaa = 4294957296 (意外值)
printf("aaa = %d\n", aaa); // aaa = -10000 (正确)
%c 字符
- ! 整数范围 0-255 可以用字符形式输出(ASCII码)
int a = 97;
printf("%c\n", a); // a (输出ASCII码对应的字符)
char c = 'a';
printf("%d\n", c); // 97 (输出字符对应的ASCII码)
%s 字符串
printf("中国的英文拼写是%s\n", "CHINA"); // 中国的英文拼写是CHINA
%f 浮点数
float x = 2.15f, y = 3.12f;
printf("%f\n", x + y); // 5.270000
float abc = 0.789058f;
printf("%.4f\n", abc); // 0.7891 (小数点后4位)
printf("%f\n", abc); // 0.789058
printf 注意事项#
- ! 格式字符要与输出的数据类型相匹配
- ! 输出
%的三种方法:
printf("5%%\n"); // 5% (两个%输出一个%)
printf("%c\n", '%'); // %
printf("%%s\n"); // %s
3.2.2 数据的输入#
[!warning] 注意
- ! 数据输入不常用,实际项目中一般不从键盘输入数据
- ! 输入错误可能导致程序异常
1. getchar 函数#
[!tip] getchar 函数
- @ getchar: 等待用户从键盘输入一个字符
- 格式:
getchar();- 按 Enter 键后程序才继续执行
char c;
c = getchar(); // 等待输入
putchar(c); // 输出输入的字符
printf("%c", getchar()); // 直接输出输入的字符
getchar 的特殊用途#
- ! 可用于防止黑色执行窗口一闪而过
- ! 放在
main函数最后一行,等待用户输入
getchar 的注意事项#
- ! 用户输入字符后按回车,实际输入了两个字符
- ! 第二次
getchar()会读取回车符 - ! 建议整个程序只使用一次
getchar()
2. scanf 函数#
[!tip] scanf 函数
- @ scanf: 格式化输入函数,从键盘输入任意类型数据
- 格式:
scanf(格式控制字符串, 地址表列);- ! 参数必须是变量的地址,使用
&运算符
#pragma warning(disable:4996) // 忽略scanf安全警告
int a, b, c;
scanf("%d%d%d", &a, &b, &c); // 输入三个整数
printf("a + b + c = %d", a + b + c);
scanf 输入格式#
- ! 多个数据之间用空格、回车、Tab键分隔
- ! 不能用逗号分隔(除非格式字符串中有逗号)
// 格式字符串中有逗号,输入时也要用逗号
scanf("%d,%d,%d", &a, &b, &c); // 输入: 1,2,3
// 格式字符串中有冒号,输入时也要用冒号
scanf("%d:%d:%d", &a, &b, &c); // 输入: 1:2:3
scanf 注意事项#
| 注意点 | 说明 |
|---|---|
| 地址运算符 | 参数必须用 &,不要丢掉 |
| 验证输入 | 建议在 scanf 后立即 printf 验证 |
| 输入结束 | 按回车结束输入,未输完数据会出错 |
| 实用性 | 学习有价值,实际工作几乎无实用价值 |
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
// 验证输入是否正确
printf("从scanf得到的三个变量值为%d, %d, %d\n", a, b, c);
printf("a + b + c = %d", a + b + c);

