顺序结构程序不能满足实际问题的要求。有时需要在满足某一条件的情况下才去执行一些语句,如果条件不满足的时候,程序会执行另一些语句;有时会在满足某一条件的情况下反复执行一些语句。C 语言提供了if~else 语句实现条件选择结构,switch~case 语句实现等值选择结构,while、do~while 和for语句实现重复执行循环体。
语法:
if~else 结构的执行过程: 首先要对给定的条件表达式进行计算,如果计算结果是 1,则执行语句 1,语句 1 通常被称为 if分支(真分支) ;否则执行语句2,语句2 通常被称为 else 分支(假分支)。
其中,条件表达式既可以是逻辑表达式、关系表达式,也可以是任何合法的 C 语言表达式。
/* Description: 输入一个五位正整数, 要求顺序打印出各位数字。 */
#include
void main( void )
{
int num;
int a, b, c, d, e;
printf("Input a integer number (10000-99999):");
scanf("%d", &num);
if( num > 99999 || num < 10000 )
printf("Error input!\n");
else
{
e = num % 10; num /= 10;
d = num % 10; num /= 10;
c = num % 10; num /= 10;
b = num % 10; num /= 10;
a = num;
printf("Each digit is %2d%2d%2d%2d%2d\n",a, b, c, d, e);
}
}
/* Description: 从键盘输入一个年份, 要求判断出它是否是平年 */
#include
void main( void )
{
int year;
printf("请输入一个年份:");
scanf("%d", &year );
if( ( ( year % 100 != 0 ) && ( year % 4 != 0 ) ) ||
( ( year % 100 == 0 ) && ( year % 400 != 0 ) ) )
printf("%d 年是平年。\n", year );
else
printf("%d 年是闰年。\n", year );
}
判断闰年:年份能被4整除但不能被100整除;或者能被400整除。
((year % 100 !=0) && (year%4 ==0)) || (year%400 ==0)
或者:
((year % 100 !=0) && (!(year%4)) || (!(year%400))
判断平年:年份不能被4整除;或者能被100整除但不能被400整除。
(year%4 != 0 ) || (( year%100==0)&&( year%400!=0))
或者
(year%4) || !( year%100) && (year%400)
语法:
if(条件表达式1)
if(条件表达式2)
语句1;
else
语句2;
else
if(条件表达式3)
语句3;
else
语句4;
C 语言规定:else 总是与它前面最近的且无 else 配对的 if 配对。
例如:用 C 语言的选择结构实现符号函数 sign(x):从键盘输入一个浮点数 x,要求输出它的符号。 sign(x)是一个分段函数:
#include
void main( void )
{
double x;
short sign;
printf("Input x:");
scanf("%lf", &x);
if( x>=0 )
if( x>0 )
sign =1;
else
sign =0;
else
sign =-1;
printf("sign(%lf)=%d\n", x, sign);
}
例如:用 else 分支嵌套 if-else 结构实现下述功能,从键盘输入一个一元二次方程ax2+bx+c=0的三个系数a、b、c,要求计算并打印出方程的实数根:
#include
#include //需要调用到sqrt( )函数
void main( void )
{
double a, b, c, deta, deta2, root1, root2;
printf("请输入一元二次方程的三个系数a, b, c:");
scanf("%lf,%lf,%lf", &a, &b, &c );
deta = b*b-4*a*c;
if(deta<0)
printf("方程没有实数根。\n");
else if(deta==0)
printf("方程有两个相等的根: %lf\n", -b/2/a );
else
{
deta2 = sqrt( deta );
root1 = ( - b + deta2 ) / 2 / a;
root2 = ( - b - deta2 ) / 2 / a;
printf("Root1= %lf Root2=%lf\n", root1, root2 );
}
}
语法:
switch(整型表达式)
{
case 常量表达式 1:
[语句组 1;
[break;]]
case 常量表达式 2:
[语句组 2;
[break;]]
…
case 常量表达式 n:
[语句组 n;
[break;]]
default:
[语句组 n;]
}
switch~case 结构的执行过程:
计算整型数值表达式的值,并逐个与其后的各常量表达式的值进行比较,当表达式的值与某个常量表达式的值相等时,先执行其后的语句组,若该 case 分支最后有 break 语句,则中止 switch~case 结构,转到switch~case 结构后的程序顺序执行;
若该case 分支没有break语句,则继续执行下一个case 分支。若整型数值表达式的值与所有case 后的常量表达式的值均不相等,则执行default分支。
其中各常量表达式的值必须是整型,字符型或者枚举类型。
各语句组允许有多条语句,不需要加“{}” 。若语句组 i为空,该case 分支又没有break 语句,则直接执行下一个case 分支。
例如:用 switch~case 结构编写一个能进行四则运算的计算器程序:用户输入运算数和四则运算符,程序计算并输出结果:
#include
void main( void )
{
float a, b; char op;
printf("请输入一个四则运算表达式(eg:1.5/2.5):");
scanf("%f%c%f", &a, &op, &b );
switch(op)
{
case '+':
printf("%f + %f =%f\n", a, b, a + b); break;
case '-':
printf("%f - %f =%f\n", a, b, a - b); break;
case '*':
printf("%f * %f =%f\n", a, b, a * b); break;
case '/':
if(b) //相当于if(b!=0)
printf("%f / %f =%f\n", a, b, a / b);
else
printf("除数不能为0\n"); break;
default:
printf("错误的运算符!\n");
}
}
例如:用 switch~case 结构编程实现输入一个百分制成绩,将其转换成五级记分制成绩并输出结果。具体转换标准为:100~90 分→等级A,80~89 分→等级B,70~79 分→等级C,60~69 分→等级D,60 分以下→等级E。
#include
void main( void )
{
int score;
printf("请输入一个百分制成绩:");
scanf("%d", &score );
switch(score / 10 )
{
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("E\n");
break;
default:
printf("输入的成绩错误!\n");
}
}
while 语句先判断给定的条件是否成立,在条件成立的前提下重复执行循环体,所以被称为“当型”循环控制语句。
while 语句的一般形式为:
while( 条件表达式 )
语句;
其中被称为循环体的语句部分是一条语句。如果需要在循环体内执行多条
语句,可使用复合语句:
while( 条件表达式 )
{
语句;
…
}
while 语句的执行过程: 先计算while 后面的条件表达式,如果其值为真,则执行一次循环体;再次计算 while 后面的条件表达式,如果其值仍然为真,则再执行一次循环体;如此反复,直到while 后面的条件表达式的值为假,结束while 语句,程序开始顺序执行循环结构后面的语句。
while 语句的特点是: 先判断,后执行,若一开始条件表达式就不成立,则循环体一次也不执行。
【例 】 用while 循环结构编程求 1+2+…+100 的和。
#include
void main( void )
{
int i, sum;
i=1, sum=0;
while( i <= 100 )
sum = sum+i, i++;
printf("1+2+…+100=%d\n", sum);
}
do~while 语句也是 C 语言的 “当型” 循环控制结构, 不过它和 while 语句有所不同, do~while 语句先执行一次循环体,然后才判断给定的条件是否成立,在条件成立的前提下重复执行循环体。
do~while 语句的一般形式为:
do
语句;
while( 条件表达式 )
循环体只能是一条语句。如果需要在循环体内执行多条语句,可使用复合语句:
do
{
语句;
……
} while( 条件表达式 )
执行过程: 先执行一次循环体,再计算 while后面的条件表达式,如果其值为真,则重复执行一次循环体;然后再次计算 while 后面的条件表达式,如此反复,直到条件表达式不再成立,结束 do~while 语句,程序开始顺序执行循环结构后面的语句。
do~while 语句的特点 是先执行,后判断,若一开始条件表达式就不成立,则循环体也要执行一次。
例如:用 do~while循环结构编程求 300 以内所有能被 9 整除的数。程序的输出格式如下:
#include
void main( void )
{
int i=1, j=0;
printf(" 300以内能被9整除的数有:\n");
do
{
if( !(i%9) ) // 等价 if( i%9==0 )
{
printf("%5d,", i);
j++;
if( !(j%6) )
printf("\n");
}
}while( ++i<300 );
printf("\n");
}
for 语句是循环控制结构中使用最为灵活、最为广泛的一种循环控制语句。for 语句既适用于已知循环次数的情况,也可以用于只知循环结束条件不知道循环次数的情况。for语句可以完全取代前两种循环控制语句。
for语句的一般形式为:
for(初始化表达式1; 条件表达式2; 增量表达式3)
语句4;
for语句其执行过程如下:
(1)首先计算初始化表达式1;
(2)然后计算条件表达式2,若条件表达式为真,则转到第3步执行;否则转到第5步执行;
(3)执行循环体3;
(4)计算增量表达式4,然后转到第2步,进行循环;
(5)退出循环,顺序执行 for循环后的下一条语句。
例题:for循环实现求 1+2+……+100的和!
#include
void main( void )
{
int i, sum=0;
for(i=1;i<=100;i++)
sum=sum+i;
printf("%d\n", sum);
}
【例 】 用 for循环结构编程打印出所有的“水仙花数” 。
#include
void main( void )
{
short a, b, c, i;
printf("水仙花数:");
for(i=100; i<=999; i++)
{
a=i%10; //个位
b=i%100/10; //十位
c=i/100; //百位
if(i==a*a*a+b*b*b+c*c*c)
printf("%5d,",i);
}
printf("\n");
}
C 语言中三种循环控制语句 while、do~while 和 for。三者基本上可以互相替代,但在实际应用中还是存在一些细微的差别。
(1)循环变量赋初值:使用 while、do~while 语句编程,必须保证在 while、do~while语句之前完成循环变量赋初值;for语句可以在初始化表达式中给循环变量赋初值。
(2)循环条件:while、do~while 语句均在 while 后面指定循环条件;for 语句在条件表达式中指定。
(3)循环体的执行:while 和 for语句都是先判断后执行,在条件不成立的情况下,循环体一次也不执行;do~while 语句是先执行后判断,循环体至少执行一次。
(4)循环变量递增:while、do~while 语句一般在循环体内增减循环变量,最终导致循环结束;for语句在增量表达式中改变循环变量的值。
(5)退出循环,顺序执行循环语句后的下一条语句。
在实际应用中,可根据具体情况选用不同的语句:
(1)如果是计数型循环或循环次数在执行循环之前就已确定,一般选用 for 语句;如果循环次数不确定,或是由循环体的执行情况方能确定的,一般选用 while 语句或者do~while语句,此时的循环条件表达式往往比较复杂,使用 for语句会导致程序晦涩难懂。
(2)当循环体至少要执行一次时,选用 do~while 语句;反之,如果循环体可能一次也不执行,选用 while 语句或者 for语句。