第四章 循环结构程序设计
第一节 循环结构程序设计基础
概述
在C语言中,循环结构是程序设计中的重要组成部分,它能够让程序重复执行某段代码,从而有效解决许多需要重复操作的问题。本节将系统介绍循环结构的基本概念、工作原理及三种主要循环结构的使用方法。学习本节内容后,考生能够理解循环的核心思想,掌握for、while、do-while三种循环语句的语法及应用,能够设计并调试简单的循环程序,具备为复杂问题设计循环解决方案的能力。
学习目标:
- 理解循环结构的作用和基本概念
- 掌握三种循环语句的语法和使用方法
- 能够编写和分析循环控制的程序
- 识别循环中的常见错误并加以修正
- 了解循环在实际编程中的应用场景
核心概念
循环结构(Loop Structure):程序中重复执行某段代码的结构。通过条件判断控制重复次数或终止条件。
循环体(Loop Body):循环结构中被重复执行的代码块。
循环条件(Loop Condition):决定是否继续执行循环体的判断表达式。
循环变量(Loop Variable):用于控制循环次数的变量,通常在循环条件中起作用。
死循环(Infinite Loop):循环条件永远为真,导致程序无法正常结束的循环。
三种循环结构:
- for循环:适合已知循环次数的场景
- while循环:适合循环次数不确定,先判断后执行的场景
- do-while循环:适合至少执行一次循环体的场景
原理分析
循环结构是通过程序控制流程实现代码的重复执行。程序在进入循环时,会判断循环条件是否满足:
- for循环:初始化循环变量,判断条件,执行循环体,更新循环变量,重复判断,直到条件不满足。
- while循环:先判断条件,条件成立则执行循环体,循环体结束后再次判断。
- do-while循环:先执行循环体,然后判断条件,条件成立继续循环,否则退出。
循环结构的本质是控制程序流程的跳转和条件判断,实现代码块的重复执行。合理设置循环变量和循环条件是避免死循环和确保程序正确运行的关键。
详细内容
1. for循环
for循环是C语言中最常用的循环结构之一,适合执行次数已知的重复任务。其基本语法格式为:
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体
}
- 初始化表达式:通常用于定义和初始化循环控制变量,只执行一次。
- 条件表达式:每次循环开始前判断,结果为真则执行循环体,否则结束循环。
- 更新表达式:每次循环体执行完毕后执行,通常用于改变循环变量。
示例:计算1到10的整数和
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
printf("Sum = %d\n", sum);
分析:
- 初始化i=1
- 判断i是否小于等于10
- 将i累加到sum
- i自增1
- 重复上述步骤
注意事项:
- 循环变量类型需与初始值匹配
- 条件表达式应避免写成赋值语句
- 更新表达式中不要遗漏变量的改变,避免死循环
2. while循环
while循环适合循环次数不确定,需要先判断循环条件的情况。基本语法格式:
while (条件表达式) {
// 循环体
}
程序先判断条件是否为真,若为真则执行循环体,循环体执行完后再判断条件,直到条件为假结束循环。
示例:输入多个正整数,计算它们的总和,输入负数结束
int sum = 0, num;
printf("请输入正整数,输入负数结束\n");
scanf("%d", &num);
while (num >= 0) {
sum += num;
scanf("%d", &num);
}
printf("总和为:%d\n", sum);
分析:
- 先输入一个数,判断是否为非负
- 若条件满足,累加到sum
- 再次输入数字,判断条件
- 直到输入负数,条件不满足,结束循环
注意事项:
- 循环条件必须有可能变为假,否则死循环
- 循环体内应包含改变循环条件的代码
3. do-while循环
do-while循环保证循环体至少执行一次,适合先执行后判断的场景。基本语法格式:
do {
// 循环体
} while (条件表达式);
循环体先执行一次,然后判断条件是否成立,若成立则继续循环。
示例:菜单驱动程序,用户输入选项,直到选择退出
int choice;
do {
printf("请输入选项(1-继续,0-退出):");
scanf("%d", &choice);
if (choice == 1) {
printf("继续执行程序\n");
}
} while (choice != 0);
printf("程序结束\n");
分析:
- 无论如何,循环体至少执行一次
- 通过条件判断决定是否继续循环
注意事项:
- 循环条件中避免赋值错误
- 确保循环体内能改变条件,防止死循环
实例分析
实例一:计算阶乘(for循环应用)
背景:计算给定正整数n的阶乘n!,即12...*n。
代码:
#include <stdio.h>
int main() {
int n, i;
unsigned long long factorial = 1;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n < 0) {
printf("错误:请输入非负整数\n");
} else {
for (i = 1; i <= n; ++i) {
factorial *= i;
}
printf("%d! = %llu\n", n, factorial);
}
return 0;
}
分析:
- 使用for循环从1累乘到n
- 变量factorial类型为unsigned long long以存储大数
- 输入检测防止负数
结论:for循环适合已知循环次数的问题,代码结构清晰简洁。
实例二:用户输入数字求和(while循环应用)
背景:用户连续输入若干正整数,输入负数结束,计算所有正整数的和。
代码:
#include <stdio.h>
int main() {
int num, sum = 0;
printf("请输入正整数,输入负数结束:\n");
scanf("%d", &num);
while (num >= 0) {
sum += num;
scanf("%d", &num);
}
printf("输入数字的总和为:%d\n", sum);
return 0;
}
分析:
- 先输入数,再判断是否继续循环
- 循环体内累加数值
- 负数终止循环
结论:while循环适合循环次数不确定,需先判断条件的场景。
实例三:菜单操作(do-while循环应用)
背景:实现一个简单菜单,用户选择操作,选择退出时结束程序。
代码:
#include <stdio.h>
int main() {
int choice;
do {
printf("菜单:\n1. 继续\n0. 退出\n请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("继续执行操作\n");
break;
case 0:
printf("退出程序\n");
break;
default:
printf("无效选择,请重新输入\n");
}
} while (choice != 0);
return 0;
}
分析:
- 循环体至少执行一次,显示菜单
- 根据用户输入执行不同操作
- 选择0时结束循环
结论:do-while适合先执行循环体,后判断退出条件的场景。
常见误区
- 循环条件写成赋值
错误:for(i=0; i=10; i++) 这是赋值而非判断,循环条件永远为真导致死循环。
正确:for(i=0; i<10; i++)
- 忘记更新循环变量
错误:
int i=0;
while (i<10) {
printf("%d\n", i);
// i未更新,死循环
}
正确:在循环体内增加i++。
- 循环体空语句导致逻辑错误
错误:
for(i=0; i<10; i++);
printf("%d\n", i);
分号导致循环体为空,printf语句不在循环内。
正确:去掉分号。
- 循环条件永远为真,造成死循环
例如while(1)且无退出机制。除非故意设计无限循环,否则应确保循环条件会变为假。
- 循环变量范围错误
如循环条件写成i<=10但实际数组下标为0~9,容易导致数组越界。
应用场景
- 数据统计:统计一组数据的总和、平均值、最大或最小值等
- 遍历数组:访问数组或字符串中的每个元素
- 菜单驱动程序:用户交互选择操作,循环直到用户退出
- 条件控制的输入处理:反复输入数据直到满足退出条件
- 模拟重复计算过程:如迭代计算、数值逼近等
知识拓展
嵌套循环:循环内部包含另一循环,用于处理二维数组、矩阵等复杂数据结构。
循环控制语句:break用于提前退出循环,continue跳过本次循环继续下一次。
循环优化技巧:避免不必要的循环计算,减少循环体内复杂操作提升效率。
递归与循环的对比:递归通过函数调用自身实现重复,循环通过控制结构实现。
无限循环的合理应用:如操作系统中的主循环,需配合退出条件和事件处理。
总结回顾
本节重点介绍了循环结构的基本概念及三种主要循环语句:for、while、do-while。理解循环的核心思想是程序设计的基础,掌握循环语法及运行机制是顺利通过全国计算机等级考试二级C语言程序设计的重要内容。通过实例,学生不仅能正确编写循环程序,也能避免常见错误,如死循环、循环变量未更新等问题。循环结构广泛应用于各类程序设计,熟练掌握将大大提升编程能力和程序效率。
祝您学习顺利,掌握循环结构编程技能!