1.流程图
椭圆形:表示流程的开始或结束,通常标注"Start"或"End"
矩形:表示处理步骤或操作,如变量赋值、数学运算等
菱形:表示条件判断或分支结构,对应C语言的if/switch语句
箭头线:表示控制流方向,连接各个操作步骤
平行四边形:表示输入/输出操作,如scanf/printf语句
2.顺序结构
顺序结构是程序设计中最简单的控制结构,代码按照从上到下的顺序依次执行,每一条语句执行且仅执行一次,没有分支或循环。它是所有程序的基础组成部分。
顺序结构的特点
-
- 线性执行:语句按书写顺序逐条执行,前一条语句执行完毕后才会执行下一条。
- 无跳转:没有条件判断或循环,执行路径固定。
- 示例代码片段
a=5; b=10; sum=a+b; printf("%d",sum);
3.分支结构if
if语句用于条件判断,基本语法如下:
if (condition) {
// 条件为真时执行的代码
}
if-else语句
当需要处理条件不成立的情况时,可以使用if-else结构:
if (condition) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
else if多条件判断
对于多个条件的判断,可以使用else if:
if (condition1) {
// 条件1为真时执行的代码
} else if (condition2) {
// 条件2为真时执行的代码
} else {
// 其他情况执行的代码
}
嵌套if语句
if语句可以嵌套使用,处理更复杂的逻辑:
if (condition1) {
if (condition2) {
// 两个条件都为真时执行的代码
}
}
条件表达式必须用括号括起来,即使只有一条语句也建议使用大括号增加可读性。在嵌套if-else时需注意else与最近的if匹配问题,可通过合理使用大括号避免歧义。
4.分支结构Switch
Switch语句是一种多分支选择结构,用于根据表达式的值跳转到不同的代码块执行。基本语法如下:
switch (表达式) {
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
// 更多case...
default:
默认语句;
}
表达式与case的匹配规则
Switch的表达式必须是整型或枚举类型(如int
、char
)。
Case标签必须是常量表达式,且值必须唯一。表达式结果会与case标签依次比较,匹配成功后执行对应代码块。
Break语句的作用
Break用于退出当前Switch结构。若缺少break,程序会继续执行下一个case的语句(称为“穿透”现象),直到遇到break或Switch结束。
switch (x) {
case 1:
printf("1");
// 无break,继续执行case 2
case 2:
printf("2"); // x=1时会输出"12"
break;
}
Default分支的用法
Default分支是可选的,当所有case均不匹配时执行。通常用于处理非法或意外输入。
switch (grade) {
case 'A':
printf("优秀");
break;
case 'B':
printf("良好");
break;
default:
printf("无效成绩");
}
穿透现象的应用
故意省略break可实现多个case共享同一段代码。例如处理连续范围的值:
switch (score / 10) {
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
// 其他分段...
}
注意事项
- Case标签不能是变量或非常量表达式(如
case x+1:
无效)。 - Switch嵌套时,内层Switch的break仅退出当前层。
- 避免在case内定义变量(需用花括号形成块作用域)。
switch (a) {
case 1: {
int b = 10; // 必须用花括号
printf("%d", b);
break;
}
}
5.循环结构for
for循环的语法结构如下:
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体
}
初始化表达式在循环开始前执行一次,通常用于设置循环变量的初始值。条件表达式在每次循环迭代前进行判断,如果为真则执行循环体。更新表达式在每次循环迭代后执行,通常用于更新循环变量。
for循环的执行流程
- 执行初始化表达式,设置循环变量的初始值。
- 判断条件表达式是否为真,若为真则进入循环体,否则退出循环。
- 执行循环体中的代码。
- 执行更新表达式,改变循环变量的值。
- 回到第2步,继续判断条件表达式。
for循环的嵌套
for循环可以嵌套使用,用于处理多维数据或多重循环逻辑。例如:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d, %d\n", i, j);
}
}
for循环的变体
for循环的三个表达式可以灵活调整,甚至省略。例如,初始化表达式可以放在for循环之前:
int i = 0;
for (; i < 5; i++) {
printf("%d\n", i);
}
条件表达式也可以省略,但需在循环体内设置退出条件以避免无限循环:
for (int i = 0; ; i++) {
if (i >= 5) break;
printf("%d\n", i);
}
for循环与数组遍历
for循环常用于遍历数组,通过循环变量作为数组索引:
int arr[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d\n", arr[i]);
}
for循环的注意事项
- 循环变量的作用域仅限于for循环内部(C99及以上版本支持)。
- 避免在循环体内修改循环变量,否则可能导致逻辑错误。
- 注意循环条件的边界情况,防止数组越界或无限循环。
6.循环结构while
while循环的语法结构:
while (condition) {
// 循环体语句
}
condition为循环条件,当条件为真(非零)时执行循环体。循环体可以是单条语句或代码块。
while循环的执行流程
程序先判断condition是否为真。如果为真,执行循环体语句,执行完毕后再次判断condition。这个过程重复进行,直到condition为假(零)时跳出循环。
while循环的特点
while循环是一种入口条件循环,意味着循环体可能一次都不执行(如果初始条件即为假)。循环体中通常包含改变循环条件的语句,否则可能造成无限循环。
while循环的常见应用场景
适用于不确定循环次数的情况,例如读取用户输入直到满足特定条件、处理链表等数据结构、实现游戏主循环等。
while循环的注意事项
要确保循环条件最终能变为假,避免无限循环。在循环体中应有改变循环条件的语句。对于需要至少执行一次的情况,可考虑使用do-while循环。
例:
#include <stdio.h>
int main() {
int count = 0;
while (count < 5) {
printf("Count is %d\n", count);
count++;
}
return 0;
}
此示例会输出0到4的数字,每次循环增加count的值,直到不满足count<5的条件。
while与for循环的对比
while循环更适用于不确定循环次数的情况,而for循环更适合明确循环次数的情况。两种循环可以相互转换,但各有其适用的场景。
7.跳转语句
C语言中的跳转语句允许程序控制流无条件转移到指定位置,主要包括break
、continue
、goto
和return
四种。这些语句在特定场景下优化代码结构或实现特定逻辑。
break语句
break
语句用于立即终止所在循环(for
、while
、do-while
)或switch
语句的执行,控制流跳转到循环或switch
之后的代码。
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当i等于5时跳出循环
}
printf("%d ", i);
}
// 输出:0 1 2 3 4
continue语句
continue
语句跳过当前循环的剩余部分,直接进入下一次循环的条件判断(for
、while
、do-while
)。
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue; // 跳过i等于2时的循环体
}
printf("%d ", i);
}
// 输出:0 1 3 4
goto语句
goto
语句无条件跳转到同一函数内定义的标签处。需谨慎使用,避免破坏代码结构。
int i = 0;
start:
printf("%d ", i);
i++;
if (i < 5) goto start; // 跳转到标签"start"
// 输出:0 1 2 3 4
return语句
return
语句终止当前函数的执行并返回指定值(若函数有返回值)。若无返回值,可单独使用return;
。
int add(int a, int b) {
return a + b; // 返回两数之和
}
注意事项
break
和continue
仅作用于最内层循环。goto
可能导致代码难以维护,通常推荐使用结构化控制语句替代。return
的返回值类型需与函数声明匹配。