|
第5章 C语言控制结构 |
|
在C语言中,控制结构实际上就是一段特殊的功能代码。而该功能代码可以根据用户所设定的条件,以实现相应的功能。通过控制结构,用户可以很方便地控制程序的运行顺序和运行结果。在本章中,将详细地讲解条件编译结构、循环结构、选择结构以及嵌套使用控制结构等相关的基础知识和使用方法。
条件编译结构是用户最常用的控制结构。用户可以根据所给定的条件,来设定是否执行相应的代码段,其中包括if结构、if……else结构等。在本节中,将介绍这些常用条件编译结构的原型、作用以及使用方法等。
if结构是在编程时,常用的一种条件编译结构。该条件编译结构能够根据用户所给定条件的真假性,决定相应的代码段是否可以执行。在本小节中,将介绍if结构的相关知识以及使用方法。
1. if结构原型
用户在使用if结构之前,应当首先熟悉一下该结构的使用原型。通常情况下,在C语言中,if结构的使用原型如下:
if(iftrue) //对条件进行判断
{
statement //将被执行的代码段
…… //省略部分代码
}
在该结构的使用原型中,其参数iftrue表示了所指定的条件。如果该条件为true,则将执行if结构后面的代码段,并实现相应的功能。如果该条件为false,则将跳过if结构中的代码段而去执行该结构后面的其他代码段,即执行上面代码中的代码段statement。
在该条件结构的使用原型中,其控制条件iftrue不仅是一个简单的BOOL类型值,还是一个表达式。如果该表达式的结果为true,则指定的代码段也会被执行。
注意 在C语言中,BOOL表示布尔类型。在程序中,使用布尔类型定义变量时,则该类型的变量取值只能够有两个,分别为true和false,即“真”和“假”。
当然,用户也可以根据上面的文字描述,画出与if条件编译结构功能执行相关的流程图,如图5.1所示。
如图5.1所示,当程序执行到if条件编译结构中时,会对用户所指定的控制条件进行判断。若该条件为true,则程序将执行if结构中的代码段statement。否则,示例程序将跳过if结构中的代码段继续执行。
图 5.1 if条件编译结构功能执行流程图
注意 在if条件编译结构中,程序主要是根据用户所指定的条件,对相关的代码段进行选择性地执行。利用这一特点,用户可以实现很多相关的功能。
2. 使用if条件结构
当用户对if结构的使用原型熟悉以后,就可以在程序中熟练地使用该条件结构编写程序实现相应的功能。在本小节中,将介绍if条件结构的主要的功能和相应的使用方法。
例如,在下面的示例中,用户将通过if结构对变量a的值是否等于10进行判断。如果该变量值为10,则程序将输出提示语。具体的代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
int a=10; //定义并初始化整型变量a
…… //省略部分代码
if(a==10) //对变量a的值进行条件编译
{
printf("用户定义的变量a等于10\n"); //输出提示语
…… //省略部分代码
}
return 0; //程序正常结束
}
在示例代码中,首先自定义了一个整型变量a,并将其初始化为10,并使用if结构对表达式“a==10”进行判断。如果该表达式成立,则将返回true;否则,将返回false。
注意 在if结构中,若判断条件为表达式时,只要该条件表达式成立,都将返回true。否则,将返回false。这样,if结构就可以根据表达式所返回的值进行判断,是否执行该结构中的代码段。
而在示例程序中,由于已经指定了变量a的值为10。所以,在if结构中,条件表达式“a==10”是成立的,并将返回true。
在if结构中,由于其条件参数值将返回true。所以,程序将执行if结构中的代码段。即在屏幕中输出相应的提示语,如图5.2所示。
注意 在示例程序中,主要是为了使用户熟悉if结构的使用方法。所以,在if结构中根据条件的真假,直接输出了一串提示语。而在实际使用时,可以将相应的功能代码放置到if结构中,进行执行即可。
如果将程序中的变量a的值初始化为其他数值后,条件表达式“a==10”将会返回false。因此,程序将不会再执行if结构中的代码段。即屏幕中什么信息都不会显示出来,如图5.3所示。
图 5.2 程序运行结果
图 5.3 条件为“false”时的运行结果
在C语言中,if结构除了可以使用表达式作为条件以外,还可以直接使用布尔变量作为控制条件。例如,在程序中定义一个布尔类型的变量b,并将其初始化为true。这样,就可以根据该变量的值进行判断,是否执行特定的代码段。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
bool b=true; //定义并初始化布尔变量b
…… //省略部分代码
if(b) //对变量b的值进行条件编译
{
printf("用户定义的变量b的值为true\n"); //输出提示语
…… //省略部分代码
}
return 0; //程序正常结束
}
在上面的代码中,读者应当能够发现if的参数被直接指定为布尔变量b。此时,由于变量b的值已经被初始化为true。所以,当程序运行之后,将会执行if结构中的代码段。即输出用户所指定的提示语,如图5.4所示。
图 5.4 程序运行结果
如图5.4所示,程序运行后输出了用户所指定的提示语。那么,这就表示前面的判断是正确的。实际上,用户还可以将程序中的布尔变量b使用表达式表示,也就是将if结构中的参数修改为“b==true”,修改后的程序运行结果如图5.4所示。
注意 在进行实际编程时,布尔类型的变量本身就可以作为if结构中的控制条件。当然,前提是必须在使用之前就对其进行了初始化。
if……else条件编译结构是对if结构的一种扩展,并且功能和使用方法也都是相同的。但是,if……else条件编译结构的使用范围更广一些。在该结构中,用户可以同时编写出控制条件分别为true和false时所需要执行的代码段。并可以根据其指定的控制条件,对两段代码进行选择执行。那么,在这一小节中,将介绍if……else结构的原型和使用方法等。
1. if……else结构原型
if……else结构的使用原型与if结构是相似的。同样,用户在使用if……else结构前,也需要了解一下该结构的使用原型,具体如下:
if(iftrue) //对条件进行判断
{
statement1 //将被执行的代码段1
…… //省略部分代码
}
else
{
statement 2 //将被执行的代码段2
…… //省略部分代码
}
在该条件编译结构的使用原型中,当参数iftrue的值为true时,将执行功能代码段statement1;否则,程序将执行功能代码段statement2。
注意 if……else结构所执行的代码是根据所设定的条件进行选择的。当然,也可以将该条件编译结构解释为“如果……那么……”。这样,方便读者对该结构的理解。
如果用户将if……else条件结构的运行原理用流程图表示,则可以更为直观地理解该结构的具体使用方法,如图5.5所示。
图 5.5 if……else结构的运行原理
如图5.5所示,当用户指定的控制条件为false时,程序将跳过if结构中的代码段,而执行else结构中的代码段。这样,用户就可以通过修改控制条件,实现代码段执行顺序的控制。
注意 用户在使用if……else结构时,必须同时为该结构编写两段功能代码。否则,将不能够最大限度地发挥其作用。
2. 使用if……else结构
通过前面小节的学习,用户已经了解了if……else结构的使用原型及其执行的顺序。那么,在这一小节中,将通过编写示例程序具体讲解该结构的功能实现方法。
例如,用户在程序中,定义了一个字符型变量ch,再将其初始化为a,并通过使用if……else结构对变量ch的值进行判断。若该变量的值为a,则输出提示语“使用if……else结构成功”;否则,将输出提示语“使用if……else结构不成功”。具体的代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
char ch='a'; //定义并初始化字符变量ch
…… //省略部分代码
if(ch=='a') //对变量ch的值进行条件编译
{
printf("使用if……else结构成功\n"); //输出提示语
}
else
{
printf("使用if……else结构不成功\n"); //输出提示语
}
return 0; //程序正常结束
}
在代码中,用户通过使用if……else结构对已定义的字符变量ch进行判断,并根据字符变量ch的值不同,将输出不同的提示语,如图5.6所示。
如果需要跳过if结构中的代码段,执行else结构中的代码段,则可以将字符变量ch修改为其他字符,即“char ch=’b’;”。修改后的程序运行结果如图5.7所示。
图 5.6 if……else结构使用结果
图 5.7 if……else结构的其他使用结果
注意 当用户需要将单个字符赋给一个字符型变量时,必须使用一对单引号将字符包含起来。
if……else结构可以实现非常多的功能,并且使用起来也很方便。例如,在示例程序中,用户可以通过使用if……else结构对一个学生的姓名、成绩等信息进行判断,并输出相应的提示信息。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
char ch='L'; //定义并初始化字符变量ch
int score=90; //定义整型变量表示成绩,并初始化
if(ch=='L') //对变量ch的值进行条件编译
{
printf("该学生的姓名为:%c\n",ch); //输出学生姓名
}
else
{
printf("不能查询该学生的姓名\n"); //输出提示语
}
if(score==90) //对学生成绩进行判断
{
printf("该学生的成绩为:%d\n",score); //输出学生成绩
}
else
{
printf("不能查询该学生的成绩\n"); //输出提示语
}
return 0; //程序正常结束
}
在上面的代码中,在主函数中分别定义并初始化了字符变量ch和整型变量score,这两个变量主要用于表示学生姓名和学生成绩。程序所需要的变量定义成功后,用户将使用两个if……else结构对学生姓名和成绩分别进行条件判断,并且输出相应的提示信息,如图5.8所示。
图 5.8 学生信息判断运行结果
注意 在示例程序中,代码段“if(ch=='L')”表示对字符变量ch是否等于字符L进行判断。若相同,则将返回true。
实际上,if……else结构和if结构的功能与使用方法是非常相似的。用户将if……else结构进行简化之后,可以实现与if结构相同的功能。
循环结构是C语言中,除了条件编译结构以外的另一种很重要的控制结构。通过循环结构,用户可以重复实现某些功能,其中包括while循环结构、do……while循环结构以及for循环结构等。在本节中,将主要讲解循环结构的使用原型以及使用方法等。
while循环结构是指将根据用户所设定的控制条件,确定是否对循环体中的代码段重复执行。通过使用该循环结构,用户可以使某些重要的功能实现重复执行。在本小节中,将主要介绍while循环结构的原型及其使用方法等。
1. while循环结构原型
在C语言中,while循环结构也是根据用户所设定控制条件的真假进行功能实现的。该循环结构的使用原型如下:
while(istrue) //对用户设定的条件进行判断
{
功能代码段 //用户编写的功能代码段
…… //省略部分代码
}
在上面的代码中,while结构的参数istrue将决定编写的功能代码是否会被执行。当参数istrue的值为true时,则功能代码段将被执行。否则,功能代码段将被跳过。其执行流程如图5.9所示。
图 5.9 while循环流程图
注意 while循环结构与前面所介绍的if结构一样,其参数可以为表达式或者一个布尔变量。
2. 使用while循环结构
例如,使用while循环结构对学生的成绩进行判断。如果该学生的成绩大于60,则输出其姓名以及提示信息。否则,将直接输出“考试不及格”的提示信息。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数
{
int score1=80; //定义整型变量score1和score2,表示成绩
int score2=50;
char name='L'; //定义字符变量,表示学生姓名
int loop=0; //定义循环变量
loop=score1; //进行赋值
while(loop>60) //判断学生成绩是否大于60
{
printf("该学生姓名为:%c\n",name); //如果成绩大于60,说明学生的成绩合格
printf("考试成绩合格,成绩为:%d\n",loop); //输出学生姓名和合格成绩
loop=score2; //将第二门成绩赋给循环变量loop
}
printf("该学生第二门成绩不合格!\n"); //输出提示语
return 0; //程序正常结束
在示例程序中,用户分别定义并初始化两门成绩,并将其中一门成绩赋给循环变量loop。通过使用while循环结构对循环变量的值进行判断。如果该值大于60,则说明成绩合格;否则,成绩不合格。当用户对第一门成绩判断完成后,应当在while结构的功能代码中添加代码“loop=score2;”表示将第二门成绩继续赋给循环变量loop。这样,while循环结构就会对成绩依次进行判断并执行功能代码,如图5.10所示。
图 5.10 while循环结构程序运行结果
注意 如果while循环结构的控制条件为false时,程序将跳过while结构中的功能代码,继续执行。用户可以通过这种方法使一个运行中的while循环停止。
如果用户直接将while循环结构的参数设定为一个布尔变量,也可以实现相同的功能。例如,在程序中,定义一个布尔变量bol,并将其初始化为true。通过while循环结构对该变量进行判断,并输出循环次数。具体的代码如下:
#include<stdio.h> //包含头文件
main() //主函数
{
bool bol=true; //定义并初始化一个布尔变量
int i=0; //定义并初始化循环次数标识变量
while(bol) //判断该布尔变量是否为true
{
i+=1; //使循环次数加1
printf("已经循环:%d\n",i); //输出while循环的总次数
…… //省略部分代码
}
return 0; //程序正常结束
}
上面的代码编译成功后,运行结果如图5.11所示。
如图5.11所示,由于while循环结构的参数bol始终为true,所以当程序运行时会不断地输出该循环结构的运行次数。
图 5.11 程序运行结果
注意 用户在调试、运行该程序时,应当在代码中添加循环停止功能的代码,例如,getchar()等,其主要目的是为了防止程序进入死循环。
do……while循环结构与while循环结构具有相同的功能,都是根据用户所设定的条件,决定是否执行相应的代码段。其不同点在于,在do……while循环结构中,不论其参数值是不是true,其功能代码段都会至少被执行一次。在本小节中,将讲解do……while循环结构的使用原型及其使用方法等。
1. do……while循环结构使用原型
do……while循环结构的功能代码是放在do结构中的,而条件参数则放在while中。其具体的使用原型如下:
do //do……while循环结构
{
…… //循环功能的代码段
}while(istrue) //对用户指定的条件参数进行判断
在代码中,如果参数istrue为true时,则功能代码段将被循环执行。否则,功能代码段将只被执行一次,如图5.12所示。
图 5.12 do……while循环结构执行流程图
注意 用户根据do……while循环结构的这一特点,可以将某些功能进行试探性地执行。若发现错误,则跳出循环即可。这样,可以方便实现用户的功能。
2. 使用do……while循环结构
为了验证do……while循环结构的功能代码至少会被执行一次,用户可以在其功能代码段中添加一行输出提示信息的代码,并且将while的参数设置为false。如果程序运行后,输出了指定的提示语,则表示验证成功;否则,验证失败。其具体的代码如下:
#include<stdio.h> //包含头文件
main() //主函数
{
do
{
…… //省略部分代码
printf("测试成功!\n"); //输出提示语
}while(false); //设置条件为false
return 0; //程序正常返回
}
在示例代码中,用户使用了输出指定提示语的方法,对do……while循环结构的运行特点进行验证。程序运行结果如图5.13所示。程序运行之后输出了用户指定的提示语,也就说明验证是成功的。此时,用户还可以将示例代码中while结构的参数修改为true,即“while(true)”。再次运行程序,其结果如图5.14所示。
图 5.13 测试程序运行结果
图 5.14 测试程序运行结果
如图5.14所示,由于用户已经将while结构的参数修改为true。所以,程序将循环执行其功能代码,即不断地输出指定的提示语。
注意 一般情况下,用户可以将一些需要进行数学运算或逻辑运算的功能代码放置到do……while循环结构中执行,这样会大幅提高程序的运行效率。
在C语言中,for循环结构是所有循环结构中功能最丰富的一个。在该循环结构中,用户可以指定循环条件的初始化值、最大限值和步进值。在本小节中,将介绍for循环结构的使用原型及其使用方法等。
1. for循环结构使用原型
在for循环结构中,包含三个重要的参数。其具体的使用原型如下:
for(a;b;c) //for循环结构
{
…… //省略部分代码
循环功能代码
}
在for循环结构的原型中,参数a表示循环条件的初始值,参数b表示循环条件的最大限值,参数c表示循环条件的步进值。而循环功能代码则会严格按照用户指定的循环次数执行。
注意 如果循环条件是在for循环结构以外进行初始化的,则参数a可以不指定。如果用户没有设置参数b,则表示循环条件没有最大值。实际上,用户也可以不用设置参数c。
2. 使用for循环结构
在for循环结构中,可以先定义循环条件的初始化值、最大值和步进值。例如,用户在程序中,使用for循环结构连续输出10个字符串“学习C语言编程!”。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
char ch[20]={"学习C语言编程!"}; //定义并初始化字符数组
int i=0; //定义并初始化循环条件
for(;i<10;i++) //for循环开始
{
printf("%s\n",ch); //输出字符数组中的数据
}
return 0; //程序正常结束
}
在实例程序中,用户首先定义并初始化字符数组变量ch和循环条件变量i,并通过使用for循环结构根据指定循环条件的初始值、最大值以及步进值实现循环输出字符数组的功能。程序运行结果如图5.15所示。
图 5.15 for循环输出字符数组
如图5.15所示,程序运行后会连续输出10个字符串,即“学习C语言编程!”。通过实例程序的运行结果,可以很直观地理解for循环结构的具体功能和使用方法。
注意 在for循环结构体中,其循环条件的初始化位置可以放置到for循环结构使用之前。但是,循环条件变量在定义时,必须进行初始化操作。
在for循环结构中,还可以将循环条件的步进值进行相应的修改。具体的代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
…… //省略部分代码
int i=0; //定义并初始化循环条件
for(;i<10;) //修改后的for循环结构
{
printf("%s\n",ch); //输出字符数组中的数据
i+=2; //修改循环条件的步进值
}
return 0; //程序正常结束
}
在修改后的实例程序中,用户将for循环结构体中的步进值已经删除,并在循环结构体的代码中添加一行代码“i+=2”,表示步进值将以2为单位实现步进操作。这样,程序运行后,所输出的字符串个数将会减半,如图5.16所示。
图 5.16 修改后的程序运行结果
注意 用户在使用for循环结构体时,可以按照其编码习惯对其中的循环条件值的表达式进行编写。
如果用户需要从正在运行的循环代码中跳出循环体而执行其他的代码,则可以使用关键字continue和break实现终止循环结构的功能。在本节中,将讲解关键字continue和break的功能及其使用方法。
关键字break常被用于循环功能代码中,其主要作用是跳出并终止循环结构的运行。在本小节中,将主要讲解该关键字的使用方法。
在进行实际编程时,break的使用方法非常简单,具体代码如下:
main() //主函数
{
…… //省略部分代码
for(int i=0;i<10;i++) //for循环结构
{
…… //省略部分循环代码
break; //终止并跳出循环结构
}
…… //省略部分代码
}
在上面的代码中,用户在一个for循环结构中使用关键字break,并实现终止循环的功能。这样,程序就会继续执行后面的代码。
例如,在实例程序中使用关键字break实现循环终止的功能,并根据代码的执行情况输出相应的提示语。具体的代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
for(int i=0;i<10;i++) //for循环结构体
{
if(i==4) //判断是否循环了4次
{
printf("已经循环执行了4次!\n"); //输出提示语
break; //跳出循环
}
else //否则,将继续执行for循环结构体
{
printf("循环继续执行!\n"); //输出提示语
}
}
printf("已经跳出循环体!\n"); //输出提示语
return 0; //程序正常结束
}
在主函数中,使用一个for循环结构实现10次循环并输出提示语“循环继续执行!”。但是,当循环4次以后,使用关键字break终止了该循环,并输出提示语“已经循环执行了4次!”。当该循环被终止后,将输出提示语“已经跳出循环体!”,如图5.17所示。
图 5.17 程序运行结果
注意 只能够在循环结构体中,使用关键字break实现循环终止的功能。否则,将不能够实现用户预期的目的。
除了可以使用关键字break实现终止循环功能外,还可以使用关键字continue实现相似的功能。但是,continue的具体功能比较丰富,即终止用户所指定的本次循环,但不会跳出循环结构,从而可以继续执行下一个循环。在本小节中,将主要讲解关键字continue的使用方法。
关键字continue一般需要用于多个循环结构中,才能够发挥其作用,具体的使用代码如下:
main() //主函数
{
…… //省略部分代码
for(int i=0;i<10;i++) //for循环结构
{
…… //省略部分循环代码
continue; //终止并跳出循环结构
}
for(int i=0;i<10;i++) //for循环结构
{
…… //省略部分代码
}
…… //省略部分代码
}
上面的代码分别使用了两个for循环结构体来表示关键字continue的功能。在代码中,可以省略的部分添加上自定义代码,例如输出一些提示语等。并可编译程序,在运行结果中,就可以看到关键字continue的作用并体会其中的使用原理。
例如,用户在实例程序中,同样是使用两个for循环结构来验证关键字continue的使用。其中,在第一个for循环结构中,对循环次数进行判断,若已经循环了4次,则将输出字符串“continue前循环了4次”。否则,将继续循环。这样,当程序循环4次以后,关键字continue就会使程序跳出第一个for循环,而执行第二个for循环中的代码,即输出提示语“continue后的循环”。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数
{
char ch[]={"continue前循环了4次"}; //定义并初始化字符数组
char ch1[]={"continue后的循环"};
for(int i=0;i<10;i++) //第一个for循环结构
{
if(i==4) //判断循环次数是否为4
{
printf("%s\n",ch); //输出提示语
continue; //终止但不跳出循环结构
printf("%s\n","执行continue后的提示"); //输出提示语
}
else //若循环次数不为4
{
printf("%s\n","继续输出字符串"); //输出字符串
}
}
for(int i1=0;i1<10;i1++) //第二个for循环结构
{
printf("%s\n",ch1); //输出字符串
}
return 0; //程序正常结束
}
在代码中,程序会将第一个for循环结构中的循环次数和功能代码全部执行。这是因为关键字continue只会跳出本次循环,而不会跳出整个循环。所以,当循环4次以后,程序将跳出并且继续执行循环代码。为了使用户能够深入理解continue的作用,所以在程序中将输出提示语“执行continue后的提示”来验证其具体的作用,如图5.18所示。
图 5.18 程序运行结果
如图5.18所示,在程序的运行结果中,用户没有看到输出字符串“执行continue后的提示”,这也就说明了continue的功能只是终止本次循环,而不是整个循环。
注意 在实例程序中,可以利用continue的特殊功能实现一些重要的功能。例如,在一些重要操作中,终止某些特定的动作或者功能循环等。
在C语言中,选择结构又可以被称为开关语句。一般用于需要根据多个条件,执行不同的功能代码时进行使用。例如,一个学校需要根据学生不同的考试分数,对其进行评级等相关操作。在本节中,将介绍选择结构的使用原型,并详细讲解选择结构的使用方法。
在C语言中,关键字switch表示开关,即根据用户所指定的条件,执行不同的功能代码。在实际使用时,switch必须与case配合使用。在本小节中,将介绍switch……case的使用原型及其相应的功能。
1. switch……case使用原型
当用户在使用switch……case选择结构实现功能之前,必须熟悉该结构的使用原型。switch……case的具体使用原型如下:
switch(开关条件) //switch……case使用原型
{
case条件1: //条件1
……; //功能代码1
case条件2: //条件2
……; //功能代码2
case条件3: //条件3
……; //功能代码3
default: //默认情况下
……; //默认执行代码
}
在使用原型中,switch参数的“开关条件”表示所指定的判断条件,而case的参数则表示具体的判断条件值。若case中的参数值与switch中的参数值相同,则程序将执行指定的功能代码。如果在程序中,没有与switch条件参数值相同的case语句,程序将默认执行default中的功能代码段,其流程图如图5.19所示。
图 5.19 switch……case开关结构流程图
注意 在实际编程时,用户可以将一些没有考虑到的条件所对应的功能代码放在default代码段中执行。这样,用户就可以尽可能地避免出现程序运行错误。
2. switch……case使用实例
在本小节中,为了能够深入地理解switch……case选择结构的使用方法,将根据该结构的使用原型编写一个实例程序对其进行详细介绍。
例如,在一个学校中,将根据学生的考试成绩对其进行评级。若考试成绩在60分以下,则为不及格。若考试成绩在60~80分,则为良好。若考试成绩在80分以上,则为优。并且将根据不同的评级,输出不同的提示语。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
int scor[6]={0}; //定义并初始化整型数组
int bool=0; //定义并初始化判断条件值
for(int i=0;i<6;i++) //for循环用于输入成绩
{
printf("请用户输入第%d个成绩:\n",i); //输出提示语
scanf("%d",&scor[i]); //接收用户输入的数据
}
for(int i1=0;i1<6;i1++) //for循环用于值判断
{
if(scor[i1]<60) //若成绩小于60,则将条件值设置为1
{
bool=1;
}
else //否则,继续判断
{
if(scor[i1]>60) //若成绩大于60
{
if(scor[i1]<80) //并且小于80,则将条件值设置为2
{
bool=2;
}
}
if(scor[i]>80) //若成绩大于80,则将条件值设置为3
{
bool=3;
}
}
switch(bool) //根据条件值进行判断
{
case 1: //若成绩小于60者
{
printf("第%d个学生成绩不及格\n",i1); //输出提示语
break; //跳出循环
}
case 2: //若成绩大于60并小于80者
{
printf("第%d个学生成绩良好\n",i1); //输出提示语
break; //跳出循环
}
case 3: //若成绩大于80者
{
printf("第%d个学生成绩优异\n",i1); //输出提示语
break; //跳出循环
}
default: //默认情况下
printf("不能判断学生的分数等级"); //输出提示语
break;
}
}
}
在上面的代码中,首先利用一个for循环结构循环接收输入的学生成绩,并将其保存在整型数组scor中。然后,再通过一个for循环对整型数组scor中的值进行判断。如果其值小于60,则将条件值设置为1。如果整型数组值大于60而小于80,则将条件值设置为2。如果整型数组值大于80,则将条件值设置为3。这样,用户就可以使用switch……case选择结构根据条件值,对不同的分数段进行统计输出。
注意 在本实例中,主要是对不同分数段的学生成绩进行判断后,输出该学生成绩的相应评级情况。而关键字break的功能十分强大,用户利用该关键字可以直接跳出循环体,而执行循环结构后面的代码。
将上面的代码进行编译、运行,其运行结果如图5.20所示。
图 5.20 程序运行结果
如图5.20所示,当程序运行之后,用户可以循环输入6个成绩。当输入完成后,程序会根据用户输入的学生成绩进行级别划分,并输出相应的提示语。
用户可以使用switch……case选择结构,根据不同的条件值实现不同的功能。不仅可以增强编码灵活性,还可以使代码尽可能地简单。但是,在实际操作时,对于用户没有预见到的一些判断条件而言,应当尽可能使用代码段default进行默认情况处理。若该选择结构中没有默认处理功能的代码,则程序在运行时,可能会出现无法预料的错误而导致程序异常终止。
在本小节中,主要介绍了switch……case选择结构的使用原型及其功能。并且通过实例程序的编写,详细地讲解了该选择结构的具体使用方法。通过本小节的学习,读者应当能够熟练掌握switch……case选择结构的功能实现方法。
嵌套结构是指用户在程序中,使用多个简单的控制结构实现同一功能时,其相互包含使用的一种功能结构。例如,用户在if……else结构中使用for循环或者while循环等。在本节中,将讲解C语言嵌套结构的使用方法。
在C语言中,if控制结构是可以实现嵌套功能的。其具体的嵌套格式如下:
if(判断条件) //if结构开始
{
if(判断条件) //嵌套一个if选择结构
{
…… //省略部分代码
}
…… //省略部分代码
}
在if结构的嵌套使用中,用户将一个if结构嵌套在另一个if结构中使用。其目的在于对多个条件进行判断,并使用不同的代码段实现不同的功能。例如,对一个学生的年龄进行判断,如果该学生年龄小于18岁,则判断其为未成年人。若其年龄大于18岁而小于30岁,则判断其为青年人。具体代码如下:
#include<stdio.h> //包含头文件
main() //主函数开始
{
int age=0; //定义并初始化年龄变量
printf("请用户输入学生年龄\n"); //输出提示语
scanf("%d",&age); //获取用户的输入
if(age<18) //判断年龄使用小于18
{
printf("该学生为未成年人!\n"); //输出提示语
}
if(age>18) //判断年龄是否大于18
{
if(age<30) //判断年龄是否小于30
{
printf("该学生为青年人!\n"); //输出提示语
}
}
return 0; //程序正常结束
}
在实例代码中,首先使用一个if结构判断输入的年龄是否小于18岁。如果是,则输出提示语“该学生为未成年人”。否则,继续进行判断。
而在第二个if结构中,首先判断学生年龄是否大于18岁。如果是,则使用第三个if结构判断其是否小于30岁。这样,就可以精确地判断该学生是否为青年人。
该实例代码主要是讲解if结构的嵌套使用方法及其功能,该程序运行结果如图5.21所示。如果用户输入的年龄为16,程序经过判断,会输出提示语“该学生为未成年人!”,如图5.22所示。
图 5.21 程序运行结果
图 5.22 程序运行结果
除了可以嵌套使用if结构外,还可以对if……else进行嵌套使用。其使用格式如下:
if(判断条件) //if结构开始
{
if(判断条件) //嵌套一个if选择结构
{
…… //省略部分代码
}
else //否则执行其他代码
{
…… //省略部分代码
}
}
else //否则执行其他代码
{
…… //省略部分代码
}
在上面的使用格式中,在if结构体中,嵌套使用了一个if……else结构。其主要作用是对用户指定的判断条件进行细致的分解、判断。例如,在很多学生信息中,需要查找到姓名为“王磊”,并且性别为“男”的学生信息。此时,就需要使用到嵌套的if……else结构。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
#include<string.h> //包含字符串处理头文件
main() //主函数开始
{
char sz1[10]="王磊"; //定义并初始化字符数组
char sz2[5]="男"; //定义并初始化
int age=21; //定义并初始化年龄
if(strcmp(sz1,"王磊")==0) //判断姓名是否相同
{
if(strcmp(sz2,"男")==0) //判断性别是否相同
{
printf("数据库查找完毕!\n"); //输出相关信息
printf("查找到该学生信息如下:\n"); //输出提示语
printf("姓名:%s\n",sz1); //输出查找到的学生信息
printf("性别:%s\n",sz2);
printf("年龄:%d\n",age);
}
else //如果没有查找到相同性别的学生
{
printf("数据库中没有男性的%s:\n",sz1); //输出提示语
}
}
else //如果没有查找到相同姓名的学生
{
printf("数据库中没有查找到该学生的相关信息!\n");
}
return 0; //程序正常关闭
}
在实例代码中,首先定义并初始化与学生相关的信息,并通过第一个if结构对学生的姓名进行判断。如果该学生是需要查找的学生,则继续使用if结构对该学生的性别进行判断。若性别是相同的,则说明该学生是需要查找的。这样,就可以将查找到的该学生信息输出。否则,将输出字符串“数据库中没有男性的该学生”。
如果在第一个if结构中,判断数据库中并无指定学生的姓名。则程序将输出提示字符串“数据库中没有查找到该学生的相关信息”,程序运行结果如图5.23所示。
图 5.23 程序运行结果
注意 实例代码中,代码段“strcmp(sz2,”男”)”表示对指定的两个字符串进行比较。如果两个字符串相同,则该函数将返回0。否则,该函数将返回非零值。使用该函数时,需要在程序中添加头文件“string.h”。否则,该函数调用时将出现错误。
在C语言中,while循环结构也可以被用于嵌套循环中。该循环结构嵌套后的功能主要是对循环后的信息或者变量值进行进一步的循环处理。其具体的嵌套使用格式如下:
while(循环条件) //循环开始
{
…… //省略部分循环功能代码
while(循环条件) //嵌套while循环
{
…… //省略部分嵌套循环功能代码
}
}
在while循环嵌套中,需要为该循环结构分别指定两个循环条件。在循环运行的过程中,可以使用关键字break退出循环或终止循环。
例如,在一个班中,所有的学生都进行了选课。现在,老师需要统计一下学生的选课情况,具体的统计规则是首先过滤出选修C语言课程的学生,再在这些学生中过滤出选修该课程的男学生有多少人。具体的代码如下:
#include<stdio.h> //包含相关的头文件
#include<string.h>
main() //主函数开始
{
char sz[]="C语言"; //定义并初始化字符数组
char szname[30]="王磊\n李明\n王涛"; //定义并初始化字符数组
char sex[]={"男"};
while(strcmp(sz,"C语言")==0) //通过第一个while循环判断选修C语言课程的学生
{
printf("查找到选修%s的男学生信息如下所示:\n",sz);
while(strcmp(sex,"男")==0) //判读选修该课程的男学生
{
printf("学生姓名如下所示:\n"); //输出提示语
printf("%s\n",szname); //输出学生姓名
break; //跳出while循环
}
printf("已经跳出第二个while循环了!:\n"); //输出提示语
break; //跳出循环
}
return 0;
}
在实例代码中,第一个while循环以选修C语言课程为循环条件,查找选修改课程的所有学生,并通过第二个while循环将选修改课程的男学生输出。这样,就可以通过两个while循环结构实现对目标数据的过滤功能。程序运行结果如图5.24所示。
图 5.24 程序运行结果
在程序中,可以看到第二个while循环结束时,使用了关键字break。其主要作用在于使程序跳出第二个while循环结构而继续执行第一个while循环结构。
注意 关键字break只会作用于该关键字所在的循环结构,而不是整个循环结构。
在本小节中,读者可以将前面所使用到的if、if……else以及while嵌套结构进行相互结合,实现更为强大的功能。通过嵌套使用这些结构,可以更加深入地理解这些结构的使用方法及其功能。
可以在一个while循环结构中,使用if、if……else结构对其循环条件等变量进行判断,或者是实现跳出while循环的功能。例如,可以在while循环中,输出数据库中的学生信息。但是当查找到学生姓名为“王磊”,并且性别为“女”的学生时,程序需要停止循环并输出该学生的详细信息。具体代码如下:
#include<stdio.h> //包含头文件
#include<string.h>
main() //主函数开始
{
char na[]="王磊"; //定义并初始化字符数组
char sex[]="女";
char name[]="王磊\n女\n攀枝花学院\n应用电子技术\n"; //定义并初始化学生信息字符数组
while(1) //while循环结构
{
if(strcmp(na,"王磊")==0) //判断学生姓名是否为王磊
{
if(strcmp(sex,"女")==0) //判断姓名为王磊的学生是否是女性
{
printf("该学生的相关信息如下所示:\n"); //输出提示语
printf("%s",name); //输出字符串
break; //跳出while循环
}
else //如果没有查询到女性的学生王磊
{
printf("数据库中没有女性的学生王磊\n"); //输出提示语
break;
}
}
else //如果没有查找到学生王磊
{
printf("数据库中没有叫王磊的学生\n"); //输出提示语
break;
}
}
return 0; //程序正常结束
}
在实例代码中,使用了一个while循环结构,并且将其循环条件设置为1,表示将无限循环。在循环过程中,使用if……else结构对查询到的学生姓名和学生性别分别进行判断。如果学生姓名为“王磊”,则继续对其性别进行判断。若其性别为“女”,则表示该学生为用户需要查找的学生。此时,程序将输出该学生的详细信息。否则,程序将提示没有查找到指定的学生。程序运行后的结果如图5.25所示。
如图5.25所示,程序运行后,将输出查询到的指定学生的相关信息。
图 5.25 程序运行结果
注意 当用户将while循环结构中的循环条件设置为1后,表示该循环将无限循环下去直到用户使用关键字break终止并跳出该循环为止。但是在一般情况下,用户最好是不要将其循环条件设置为1,因为无限循环容易导致程序运行出现失控的情况,从而影响应用程序。
在C语言中,输出控制结构是指可以使用一些特定的控制符对数据进行对应的格式化以后,再进行输出显示。这样,用户可以方便地实现格式化数据的输出。在本节中,将介绍常用的一些输出控制符及其相应的功能。
在C语言中,为了使输出的数据能够便于控制,可以使用特定的输出控制符进行格式化。在实际编程时,常用的输出控制符包括转义字符和数据类型输出控制符。在本小节中,将介绍这些常用输出控制符的功能及其使用方法。
1. 转义字符
转义字符是指C语言中能够实现特定功能的输出控制字符。例如,用户在前面实例中常用的控制符“\n”,表示换行符。在本小节中,将主要介绍转义字符的功能和使用方法。
常用的C语言转义字符及其功能如表5.1所示。
例如,需要在程序中实现不断响铃的功能,则可以使用转义字符“\a”。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
int i=0; //定义并初始化一个整型变量i
while(i<10) //while循环10次
{
i+=1; //使变量i自加1
printf("响铃第%d声\n",i); //输出响铃次数
printf("\a"); //响铃
}
printf("响铃结束\n",i); //输出提示语
return 0; //程序正常结束
}
在实例程序中,使用一个while结构循环输出响铃及其相应的次数。其中循环变量i的作用是控制响铃的次数。在循环结构中使用代码段“i+=1;”可以使循环不断地进行直到变量i的值等于10为止,即循环了10次。程序运行成功以后,用户可以听到计算机发出的蜂鸣声。在程序的运行界面中,还可以看到输出的响铃次数,如图5.26所示。
图 5.26 程序运行结果
注意 如果用户需要使蜂鸣声更明显,可以将while循环结构中的循环次数修改得更多一些。例如,将代码段“while(i<10)”修改为“while(i<100)”。
还可以使用水平制表符“\t”实现输出数据的格式化操作。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
int i=0; //定义并初始化一个整型变量i
while(i<10) //while循环10次
{
i+=1; //使变量i自加1
printf("\t"); //输出水平制表符
printf("制表符测试!\n",i); //输出字符数据
}
printf("数据输出结束\n",i); //输出提示语
return 0; //程序正常结束
}
实例代码的主要功能是将输出的数据在水平方向上进行制表控制,其运行结果如图5.27所示。
图 5.27 程序运行结果
注意 在实际使用中,必须使用双引号将对应的转义字符括起来,并且使用函数printf实现输出功能。
2. 数据类型输出控制符
在C语言中,数据类型输出控制符包括格式控制符和格式字符。其中,最为常用的格式控制符是“%”。因此,在本小节中,将主要介绍格式字符的功能和使用方法。常用的格式字符如表5.2所示。
如表5.2所示,用户可以使用表中列出的常用格式字符对输出的数据进行格式化操作。
例如,可以使用表5.2中所列出的常用格式字符,实现相应的数据输出功能。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数
{
int i=12; //定义并初始化整数i
char s='L'; //定义并初始化字符
char sz[]="攀枝花学院"; //定义并初始化字符数组
printf("输出有符号的十进制整数:%d\n",i); //输出有符号的十进制整数
printf("输出无符号的八进制数:%o\n",i); //输出无符号的八进制数
printf("输出无符号的十六进制数:%x\n",i); //输出无符号的十六进制数
printf("输出无符号的十进制数:%u\n",i); //输出无符号的十进制数
printf("输出单字符:%c\n",s); //输出单字符
printf("输出字符串:%s\n",sz); //输出一个字符串
printf("数据输出结束\n",i); //输出提示语
return 0; //程序正常结束
}
在实例程序中,用户分别定义并初始化三个不同类型的变量,再使用不同的格式控制字符对这些变量输出格式进行相应的控制。程序运行后,将在界面中输出不同的数据,如图5.28所示。
图 5.28 程序运行结果
注意 在实例代码中,用户初始化单字符时,需要使用单引号对初始化字符括起来。而在初始化字符串时,必须使用双引号对初始化字符串括起来。
通过前面一个小节对常用的格式化输出控制符的介绍,读者应该熟悉了这些格式化输出控制符的使用方法。因此,在本小节中,将通过编写实例程序复习这些输出控制符的作用及其功能。
例如,将前面所介绍过的所有输出控制符应用于实例程序中,实现相应的功能。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
int i=0; //定义并初始化一个整型变量i
while(i<10) //while循环10次
{
i+=1; //使变量i自加1
printf("响铃第%d声\n",i); //输出响铃次数
printf("\a"); //响铃
printf("\t"); //输出水平制表符
printf("制表符测试!\n",i); //输出字符数据
}
printf("响铃结束\n",i); //输出提示语
int i1=12; //定义并初始化整数i
char s='L'; //定义并初始化字符
char sz[]="攀枝花学院"; //定义并初始化字符数组
printf("输出有符号的十进制整数:%d\n",i1); //输出有符号的十进制整数
printf("输出无符号的八进制数:%o\n",i1); //输出无符号的八进制数
printf("输出无符号的十六进制数:%x\n",i1); //输出无符号的十六进制数
printf("输出无符号的十进制数:%u\n",i1); //输出无符号的十进制数
printf("输出单字符:%c\n",s); //输出单字符
printf("输出字符串:%s\n",sz); //输出一个字符串
printf("数据输出结束\n",i); //输出提示语
return 0; //程序正常结束
}
在实例程序中,使用while结构循环10次,实现计算机响铃和水平制表格式,并以各种不同的数据输出格式输出指定的数据。程序运行后的结果如图5.29所示。
当用户运行程序时,会听到计算机连续响铃10次并在程序界面中输出响铃的次数等。通常情况下,用户可以在程序重要的位置使用响铃控制符“\a”,使计算机响铃并提示用户。
图 5.29 程序运行结果
在本章中,主要向用户讲解了C语言中常用的条件编译结构、循环结构、选择结构、嵌套结构以及输出控制结构等相关的功能和使用方法。并且还详细讲解了关键字break和continue的使用方法及其功能。
本章重点在于读者需要熟练掌握C语言常用控制结构的使用原型和使用方法,其难点在于如何使用关键字break和continue控制代码的执行情况。
通过本章的学习,读者能够熟悉C语言控制结构的功能。在第6章中,将介绍C语言函数的定义、调用等基础知识。
1. 定义字符变量ch,并且从输入流中获取字符。使用if……else结构对变量ch的值进行判断。如果该变量值为字符“a”,则输出“YES”。否则,输出“NO”。
2. 定义一个字符数组ch,然后使用while循环结构实现循环,获取3个字符并保存到字符数组中进行输出。其中,若用户输入了字符“E”或者“e”则退出循环。
3. 将上面第2题中的功能使用for循环结构实现。
4. 使用switch……case结构对用户输入的信息进行判断,如果信息为1,则输出字符串“学生”。如果信息为2,则输出字符串“老师”。如果输入的信息为其他值,则输出字符串“不能够确定”。