目录
前言
一个程序应包括对数据的描述和对数据处理的描述。对数据的描述,即数据结构。对数据处理的描述,即算法,算法是为解决一个问题而采取的方法和步骤。我们中学学数学都画过流程图,流程图也是方法和步骤的体现。关于程序运行的步骤和方法,就是接下来我们要学习的程序运行结构。
一、程序流程结构概述
C语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。这三种结构都具有一个入口和一个出口。
顺序结构:程序按顺序执行,不发生跳转。
选择结构:依据是否满足条件,有选择的执行相应功能。
循环结构:依据条件是否满足,循环多次执行某段代码。
这些基本结构可以组合使用,形成复杂的程序流程。通过合理地使用这些结构,可以有效地组织和管理程序的逻辑,使其能够解决各种复杂的问题。
二、顺序结构
顺序结构是结构化程序设计的三种基本结构中最简单的。它可以独立存在,也可以出现在选择结构或循环结构中,整个程序都存在顺序结构。在顺序结构中,函数、一段程序或者语句是按照出现的先后顺序执行的。
比如求ax^2+bx+c=0方程的解。a、b、c由键盘输入,且b^2-4ac>0。画出它的求解流程,它的流程就是顺序的。
三、选择结构
选择结构的作用是根据条件选择性地执行某些代码段,例如,当某个条件满足时执行一段代码,否则执行另一段代码。下面陆续介绍有哪些选择结构语句。
3.1 if语句
if 语句形式是通过对表达式进行判断,然后根据判断的结果选择是否进行相应的操作。
if 语句的一般形式:
if (表达式) 语句;
注:if 语句括号中的表达式,就是要进行判断的条件,而后面语句部分对应的操作,如果括号中的表达式为真值,那么就执行后面语句的操作。
下面是代码示例:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a > b)
{
printf("%d\n", a);
}
return 0;
}
3.2 if-else语句
除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另外一段代码,语言中是利用else 语句来完成的。单 if 结构在解决这个问题中判断了两次,if-else 结构仅判断一次。
一般形式为:
if(表达式) 语句块 1;
else 语句块2;
代码示例如下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a > b)
{
printf("%d\n", a);
}
else
{
printf("%d\n", b);
}
return 0;
}
3.3 if-else if-else语句
利用if 和else 关键字的组合可以实现 if else if 语句,这是对一系列互斥的条件进行检验。
一般形式为:
if (表达式1) 语句1;
else if (表达式2)语句2;
elseif (表达式3) 语句3;
elseif (表达式4) 语句4;
......
else if(表达式n) 语句n;
else 语句n
#include <stdio.h>
int main()
{
unsigned int a;
scanf("%u", &a);
if (a < 10)
{
printf("个位\n");
}
else if (a < 100)
{
printf("十位\n");
}
else if (a < 1000)
{
printf("百位\n");
}
else
{
printf("很大\n");
}
return 0;
}
3.4 三目运算符
C语言中的三目运算符,也称为条件运算符,是一个三元运算符,它可以根据一个条件的真假来决定返回两个值中的哪一个。
三目运算符的语法如下:
condition ? expression1 : expression2
其中,condition 是一个条件表达式,如果该表达式的值为真(非零),则返回 expression1 的值;如果该表达式的值为假(0),则返回 expression2 的值。由此我们也可以使用它作为选择结构。代码示例如下
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c;
if (a > b)
{
c = a;
}
else
{
c = b;
}
printf("c1 = %d\n", c);
a = 1;
b = 2;
c = ( a > b ? a : b );
printf("c2 = %d\n", c);
return 0;
}
3.5 switch-case 语句
if 语句可以处理分支选择语句,但是如果需要处理的问题比较多,或者分支比较多时用if 语句的嵌套虽然可以处理,但会使用程序过于繁琐,可读性差。这就可以使用另外一种能够处理多路分支问题的选择语句:switch-case 语句
switch-case 语句的一般形式为:
switch(整型表达式)
{
case 数值1:语句1;break;
case 数值2:语句2;break;
… … … …
case 数值n:语句n;break;
default :语句n+1
}
(1) switch 后面括号内的表达式只能是整数或字符或者枚举。
注意:
在某些编程语言如Python中,switch语句的括号内可以是任何可比较的类型,而不仅仅是整数。同时例如JavaScript中的switch语句可以接受字符串类型的表达式。总的来说,switch后面括号内的表达式类型主要取决于你使用的编程语言和其语法规则。
(2) 当表达式的值与某一个 case 后面的常量表达式的值相等时,就执行此 case 后面的语句,若所有的 case 中的常量表达式的值都没有与表达式的值匹配的,就执行 default后面的语句。
(3) 每一个case的常量表达式的值必须互不相同;否则就会出现相互矛盾的现象。
(4) 各个 case和default 的出现次序不影响执行结果。
(5) 执行完一个 case 后面的语句后,流程控制转移到下一个 case 继续执行
(6) break 语语使得执行完case 语句后跳出 switch 语句。如果没有 break 语句,程序将与下一个 case 语句匹配,直到遇到 break 为止。
(7) 多个case可以共用一组执行语句。
(8) 在使用case 进行语句时,不要忘记 case 的条件只能是常量或者常量表达式。
代码示例:
#include <stdio.h>
int main()
{
char c;
c = getchar();
switch (c) //参数只能是整型变量
{
case '1':
printf("OK\n");
break;//switch遇到break就中断了
case '2':
printf("not OK\n");
break;
default://如果上面的条件都不满足,那么执行default
printf("are u ok?\n");
}
return 0;
}
3.6 if和switch的优缺点比较
if语句的优缺点:
1) 使用 if 结构可以实现较为复杂的逻辑判断。
2) 用switch 结构能够实现的结构,使用if 结构都可以实现。
3) 分支较少的情况使用 if 结构更简单。
4) 分支较多的情况下使用 if 结构会使程序结构变得复杂。
5) 如果 if 嵌套层次过深,也容易使程序结构变得复杂。
switch 语句的优缺点:
1) 没有复杂的逻辑判断,程序结构简单。
2) 对于分支很多的情况,特别适合用 switch 结构。
3) switch 结构只能基于一个整数值进行分支选择。
4) switch 只能判断是否相等,不能判断在某一区间的值。
5) 虽然使用switch 语句编写的程序有规律,可读性强,但是由于switch 语句不能根据表达式的取值范围作出选择,所以使用时也有很大的局限性。
四、循环结构
C语言的循环结构是程序设计中非常重要的部分,它使得程序能够重复执行一段代码,增强了程序的效率和灵活性。循环结构的作用主要有以下几点:
1)重复执行:循环结构可以使得代码块被重复执行,这在进行一些重复的任务,如打印输出、数据统计、文件读写等操作时非常有用。
2)简化代码:通过使用循环结构,可以将一些需要重复执行的代码块进行简化,减少代码的冗余,提高代码的可读性和可维护性。
3)提高效率:循环结构可以避免重复编写相同的代码,减少程序的运行时间,提高程序的执行效率。
4)实现复杂逻辑:通过结合循环结构和条件语句,可以实现一些复杂的逻辑操作,如排序、查找、统计等。
5)处理大量数据:在处理大量数据时,使用循环结构可以简化代码,提高程序的执行效率,同时也可以减少程序员的编码工作量。
接下来陆续介绍各种循环语句结构。
4.1 while语句
while循环:这种循环结构会一直执行,直到满足某个条件。一般的语法如下:
while (条件) {
// 循环体
}
while语句的执行过程是:
当条件成立时执行循环体中的语句,然后再次判断条件,重复上述过程,直到条件不成立结束循环。
while语句的特点是:当一开始条件就不成立时,一次也不执行循环语句。
示例代码:
int i = 0;
while (i < 10) {
printf("%d\n", i);
i++;
}
上述代码编译运行将打印出0到9的数字。
4.2 do-while语句
do-while循环:这种循环结构与while循环类似,不过它会至少执行一次循环体,然后再检查条件。
一般的语法如下:
do {
// 循环体
} while (条件);
do-while语句的执行过程:
执行循环体中的语句,然后判断条件,条件成立再执行循环体;
重复上述过程,直到条件不成立时结束循环
do-while语句的特点:当一开始条件就不成立时,已经执行了一次循环语句。
此外特别注意while(条件)后面的分号不要省。
代码示例:
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 10);
这将打印出0到9的数字。与while循环的区别在于,即使条件一开始就不满足,do-while循环也会至少执行一次循环体。
4.3 for语句
for语句的一般形式:
for (表达式1;条件;表达式2){
语句;
}
for语句的执行过程是:
第一步执行表达式1,
第二步判断条件,
第三步当条件成立时执行循环体中的语句和表达式2,
然后重复第二、三步直到条件不成立结束循环。
由此特别注意他们之间的先后执行关系。
运行流程如下图
for语句可以改写成while语句形式:
表达式1;
while (条件)
{
语句;
表达式2;
}
示例代码:
#include <stdio.h>
int main()
{
int i;
int sum = 0;
for (i = 0; i <= 100; i++)
{
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
在循环结构的设计中,特别需要注意的是:避免死循环。循环体中必须有改变条件的语句,并且可以使程序执行到某一时刻不满足这个条件而结束循环。
当然循环语句之间可以互相嵌套
#include <stdio.h>
int main()
{
int num = 0;
int i, j, k;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
for (k = 0; k < 10; k++)
{
printf("hello world\n");
num++;
}
}
}
printf("num = %d\n", num);
return 0;
}
关于循环 for(表达式1; 表达式2; 表达式3) 有几点重要说明:
表达式的省略问题:
1)for 语句的一般形式中的“表达式1”可以省略,此时应在 for 语之前给循环变量赋初值。
2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。
3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。
4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。
表达式的填写问题:
1)表达式 1 可以是设置循环变量初值得赋值表达式,也可以是与循环变量无关的其他表达式。
2)表达式 2一般是关系表达式或逻辑表达式,但也可以是任意表达式,只要其值为非零,就执行循环体。
3)表达式3一般是修改循环变量的语句,但也可以是任意表达式。
关于循环结构的简单总结
1)三种循环一般情况可以互相代替,一般在知道循环次数的时候,使用 for 循环,不知道循环次数的时候使用 while 循环。
2)do-while 语句先执行循环体,再判断循环控制条件,循环体至少也要执行一次。
3)while和for 语句先判断循环控制条件,再执行循环体,所以循环体可能一次也不执行。
五、跳转语句
5.1 break 语句
在switch条件语句和循环语句中都可以使用break语句:
1)当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。
2)当它出现在循环语句中,作用是跳出当前内循环语句,执行后面的代码。
3)当它出现在嵌套循环语句中,跳出最近的内循环语句,执行后面的代码。
代码示例:
#include <stdio.h>
int main()
{
int i = 0;
while (1)
{
i++;
printf("i = %d\n", i);
if (i == 10)
{
break; //跳出while循环
}
}
int flag = 0;
int m = 0;
int n = 0;
for (m = 0; m < 10; m++)
{
for (n = 0; n < 10; n++)
{
if (n == 5)
{
flag = 1;
break; //跳出for (n = 0; n < 10; n++)
}
}
if (flag == 1)
{
break; //跳出for (m = 0; m < 10; m++)
}
}
return 0;
}
5.2 continue语句
在循环语句中,如果希望立即终止本次循环,并执行下一次循环,此时就需要使用continue语句。
break和continue的区别如下图所示
代码示例:
#include<stdio.h>
int main()
{
int sum = 0; //定义变量sum
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 0) //如果i是一个偶数,执行if语句中的代码
{
continue; //结束本次循环
}
sum += i; //实现sum和i的累加
}
printf("sum = %d\n", sum);
return 0;
}
5.3 goto语句
无条件跳转,不过建议少用
代码示例:
#include <stdio.h>
int main()
{
goto End; //无条件跳转到End的标识
printf("aaaaaaaaa\n");
End:
printf("bbbbbbbb\n");
return 0;
}