选择分支结构

if语句

1.简单if语句
if(表达式) 语句1;
其语义是先计算表达式的值,若为“真”,则执行语句1,否则跳过语句1执行if语句的下一条语句。
【例】输入3个整数x、y、z,请把这3个数由小到大输出。
算法分析:
(1)先将x与y比较,把小者放x中,大者放y中;
(2)再将x与z比较,把小者放x中,大者放z中,此数x已是三者中最小的;
(3)最后将y与z比较,大者放z中,小者放y中,此时x、y、z已按从小到大的顺序排列好。

#include<stdio.h>
int main()
{
	int a,b,c,d;
	printf("\n请输入两个整数(a,b,c):");
	scanf("%d,%d,%d",&a,&b,&c);
	if(a>b)
	{
		d=a;
		a=b;
		b=d;
	}
	if(a>c)
	{
		d=a;
		a=c;
		c=d;
	}
	if(b>c)
	{
		d=b;
		b=c;
		c=d;
	}
	printf("该3个数由小到大的顺序为:%d,%d,%d\n",a,b,c);
	return 0;
}

2.if-else语句
if-else语句的形式如下:
if (表达式)语句1;
else 语句2;
其语句是:如果表达式的值为真,则执行语句1,并跳过语句2,继续执行if语句的下一条语句;若表达式的值为假,执行语句2,然后继续执行if语句后的下一条语句。
【例1】判断给定的某一年是否是闰年。
分析:如果某年能被4整除而不能被100整除,或者能被400整除,那么该年就是闰年,否则就是平年。

#include<stdio.h>
int main()
{
	int year,leap=0;
	printf("\n请输入年份(yyyy):");
	scanf("%d",&year);
	if(year%4==0&&year%100!=0||year%100==0)
	 printf("%d年是闰年\n",year);
	else
	 printf("%d年是平年\n",year);
	return 0;
 } 

【例2】制作简单的猜数字游戏。程序运行时自动产生1~5的随机数,接着等待键盘输入猜的数字。如果猜对了,显示“猜对了”相关信息;否则显示“猜错了”相关信息。
(1)随机数产生。C语言提供srand()函数,配合rand()函数可产生介于0~32767的随机数(srand()、rand()函数均包含在stdlib.h中,time()函数包含在time.h中)。
(2)1~5的随机数。首先用rand()函数产生的随机数对5求余(rand()%5),产生0 ~4之间的整数,然后再加1,即rand()%5+1就产生1 ~5的整数。
(3)判断程序结构为二路选择结构。

#include<stdio.h>
#include<stdlib.h>                                   /*包含产生随机数的srand()、rand()函数*/ 
#include<time.h>
int main()
{
	int data,guess;
	srand((unsigned)time(NULL));                     /*做随机数产生器的种子*/ 
	data=rand()%5+1;                                 /*将随机数对5求余(rand()%5),产生0~4之间的整数,然后再加1,产生1~5的整数*/ 
	printf("请输入要猜的数字(限1~5):");
	scanf("%d",&guess);
	if (guess==data)                                 /*guess=rand();为以上面得到的种子产生0~32767的整数*/ 
	 printf("猜对了!,正确数字为 %d !\n",data);
	else
	 printf("猜错了!,正确数字为 %d !\n",data);
	return 0;
 } 

【例3】一个五位数,判断它是不是回文数,如65456是个回文数,即该数的个位与万位相同、十位与千位相同。
分析:
(1)题目要求是一个五位数,由于五位数超过了int类型的范围,所以应该用long int类型,那么在输入时一定要用对应的“%ld”格式。
(2)判断输入的数是否为五位数,即是否在10000~100000。
(3)分解出该数的每一位数(万位、千位、十位和个位),然后按要求进行判断,即个位与万位相同、十位与千位相同。

#include<stdio.h>
int main()
{
	long x;
	int ge,shi,qian,wan;
	printf("\n请输入一个五位数:");
	scanf("%ld",&x);
	if(x>=10000&&x<100000)
	{
		wan=x/10000;                              /*分解出万位*/
		qian=x%10000/1000;                        /*分解出千位*/
		shi=x%100/10;                             /*分解出十位*/
		ge=x%10;                                  /*分解出个位*/
		if(ge==wan&&shi==qian)
		 printf("该数是回文数!\n");
		else
		 printf("该数不是回文数!\n"); 
	}
	else
	{
		printf("抱歉,该数不是一个五位数!\n");
		int exit(1);                              /*出错退出*/ 
	}
	return 0;
 } 

exit()函数的原型如下:void exit(程序状态值);
功能:结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当程序状态值为0时,表示程序正常退出;为非0值时,表示程序出错退出。
【例4】输入一个三角形的三边长A、B、C,然后判断此三角形是否为直角三角形。
分析:
(1)满足三角形边长的基本条件为:边长不能为负数,且两边之和必须大于第三边。
(2)直角三角形的三边长应满足A^2+B ^2=C或A ^2+C ^2=B ^2或B ^2+C ^2=A ^2其中之一。
(3)C语言提供pow(a,b)函数可返回a^b的值,该函数包含在头文件math.h中。

#include<stdio.h>
#include<math.h>                                                                                              /*包含pow(a,b)函数*/ 
int main()
{
	int A,B,C;
	printf("请输入三角形的三个边长(A,B,C):");
	scanf("%d,%d,%d",&A,&B,&C);
	if(A<0||B<0||C<0)                                                                                         /*边长不为负数*/ 
	{
		printf("抱歉,边长不能为负数!");
		int exit(1);                                                                                          /*出错退出*/ 
	}
	if(A+B<=C||A+C<=B||B+C<=A)                                                                                /*三角形任意两边和大于第三边*/ 
	{
		printf("抱歉,三角形任意边之和应该大于第三边!");
		int exit(1);                                                                                          /*出错退出*/ 
	}
	if((pow(A,2)+pow(B,2))==pow(C,2)||(pow(A,2)+pow(C,2))==pow(B,2)||(pow(B,2)+pow(C,2))==pow(A,2))           /*C语言pow(a,b)函数可返回a^b的值*/ 
	 printf("是直角三角形!\n");
	else
	 printf("不是直角三角形!\n");
	return 0;
 } 

3.if-else-if语句
当有多个分支选择时,可采用if-else-if语句,其一般形式如下。
if(表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;

else if(表达式n-1) 语句n-1;
else 语句n;
其语义是:依次判断表达式1至n-1的值,当表达式中某个值为逻辑真是,则执行其相应的语句,然后跳到整个if语句之外继续执行后续语句。如果所有的表达式均为假,则执行语句n,然后继续执行后续语句。if-else-if语句的执行过程如图所示。

【例1】假设一年四季中春季为2~4月,夏季为5 ~7月,秋季为8 ~10月,冬季为11 ~次年1月。编写程序,根据输入的月份打印出所属的季节。

#include<stdio.h>
int main()
{
	int a;
	printf("请输入月份(1~12):");
	scanf("%d",&a);
	if(a>=2&&a<=4)
	 printf("现在是春季!");
	else if(a>=5&&a<=7)
	 printf("现在是夏季!");
	else if(a>=8&&a<=10)
	 printf("现在是秋季!");
	else if(a==11||a==12||a==1)
	 printf("现在是冬季!");
	return 0;
 }

【例2】编写程序,要求判别键盘输入字符的类别。
分析:根据输入字符的ASCII码来判断类型。由附录I中的ASCII码表可知ASCII码值小于32的为控制字符,在’0’(48)和’9’(57)之间的字符为数字,在’A’(65)和’Z’(90)之间的字符为大写字母,在’a’(97)和’z’(122)之间的字符为小写字母,其余归为其他字符。这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。

#include<stdio.h>
int main()
{
	char c;
	printf("\n请输入一个字符:\n");
	c=getchar();                          /*从键盘上读入字符直到回车结束*/ 
	if(c<32)
	 printf("这是一个控制字符!\n");
	else if(c>='0'&&c<='9')               /*也可以用ASCII码值进行判断。即也可写为if(c>=48&&c<=57),只是前者程序的可读性更强*/ 
	 printf("这是一个数字!\n");
	else if(c>='A'&&c<='Z')
	 printf("这是一个大写字母!\n");
	else if(c>='a'&&c<='z')
	 printf("这是一个小写字母!\n");
	else
	 printf("这是其他字符!\n");
	return 0;
}

【例3】给不多于五位的正整数,求出它的位数并按逆序打印出各位数字。

#include<stdio.h>
int main()
{
	long x;
	int wan,qian,bai,shi,ge;
	printf("请输入一个不多于五位的正整数:");
	scanf("%ld",&x);
	if(x>100000)
	{
		printf("\n抱歉,该数已超过五位数!");
	    int exit(1);
	}
	else if(x<0)
	{
		printf("\n抱歉,该数不是正数!");
		int exit(1);
	}
	else
	{
		wan=x/10000;                                //分解出万位
		qian=x%10000/1000;                          //分解出千位
		bai=x%1000/100;                             //分解出百位
		shi=x%100/10;                               //分解出十位
		ge=x%10;                                    //分解出个位
		if(wan!=0)
		 printf("该数有五位,个位:%d,十位:%d,百位:%d,千位:%d,万位:%d\n",ge,shi,bai,qian,wan);
		else if(qian!=0)
		 printf("该数有四位,个位:%d,十位:%d,百位:%d,千位:%d\n",ge,shi,bai,qian);
		else if(bai!=0)
		 printf("该数有三位,个位:%d,十位:%d,百位:%d\n",ge,shi,bai);
		else if(shi!=0)
		 printf("该数有二位,个位:%d,十位:%d\n",ge,shi);
		else if(ge!=0)
		 printf("该数有一位,个位:%ld\n",ge);
		else
		 printf("该数为0.");
	}
	return 0;
 }

if语句的嵌套
当if语句中执行语句又是if语句时,则构成了if语句嵌套的情形。其一般形式可表示如下。
if(表达式)
if语句;
或者:
if(表达式) if语句;
else if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:
if(表达式1)
if(表达式2) 语句1;
else 语句2;
为了避免二义性,C语言规定,else总是与在它前面、据它最近、且尚未匹配的if配对。强烈建议:将内嵌的if语句一律用花括号括起来。
【例】有一个函数如下:
y=x+1 (x<10)
y=x^2 (10<=x<20)
y=6x+9 (x>=20)
编写一个程序,输入任意x值,输出对应的y值。
方法一:

#include<stdio.h>
int main()
{
	float x,y;
	printf("\n请输入x:");
	scanf("%f",&x);
	if(x<10)
	 y=x+1;
	else if(x>=10&&x<20)
	 y=x*x;
	else if(x>=20)
	 y=6*x+9;
	printf("y=%f\n",y);
	return 0;
 }

方法二(改进)

#include<stdio.h>
#include<math.h>
int main()
{
	float x,y;
	printf("\n请输入x:");
	scanf("%f",&x);
	if(x<10)
	 y=x+1;
	else if(x<20)
	 y=pow(x,2);
	else
	 y=6*x+9;
	printf("y=%f\n",y);
	return 0;
 } 

switch语句

switch语句的一般形式
switch(表达式)
{
case 常量1: 语句1;
case 常量2: 语句2;

case 常量n: 语句n;
defauly: 语句n+1;
}
其语义是:首先计算switch后圆括号内表达式的值,然后用该值逐个与case后面的常量值进行比较。当与某个case后的常量值想等时,则执行该case后的语句,然后顺序执行后面所有的case后的语句。如果圆括号内表达式的值与所有case后的常量值均不相等时,如果存在default则执行其后的语句序列,否则什么都不做。
【例1】理解switch语句的执行过程。

#include<stdio.h>
int main()
{
	int j=10;
	switch(j)
	{
		case 9:j+=1;
		case 10:j+=2;
		case 11:j+=3;
		default:j+=4;
	}
	printf("j=%d\n",j);
	return 0;
 } 

分析:首先得到j=10,所以用10和case后的常量比较发现相同的便执行其后的语句j+=2,然后不再进行比较,顺序执行后面所有case后的语句j+=3,j+=4,所以运行结果如下。

j=19

switch-break语句
switch(表达式)
{
case 常量1: 语句1;break;
case 常量2: 语句2;break;

case 常量n: 语句n;break;
default: 语句n+1;break;
}
其语义为:首先计算表达式的值,若该值与某个case后面的常量值相等,则执行其后的语句序列。遇到break语句时,跳出整个switch结构。如果表达式的值与所有常量值都不相等,若存在default则执行其后的语句序列,否则什么也不做。将【例1】修改如下。

#include<stdio.h>
int main()
{
	int j=10;
	switch(j)
	{
		case 9:j+=1;break;
		case 10:j+=2;break;
		case 11:j+=3;break;
		default:j+=4;break;
	}
	printf("j=%d\n",j);
	return 0;
 }

运行结果:

j=12

在使用switch语句时还应注意以下几点。
(1)在case后的各常量表达式的值不能相同,否则会出现错误。
(2)在case后,允许有多个语句,可以不用{}括起来。
(3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果(前提是每个case语句中都存在break语句)。
(4)default子句可以省略不用。
switch语句的嵌套
【例】理解switch语句嵌套结构并分析其执行过程。

#include<stdio.h>
int main()
{
	int a=1,b=0;
	switch(a)
	{
		case 1:switch(b)
		{
			case 0:printf("***");break;
			case 1:printf("@@@");break;
		}
		case 2:printf("$$$");break;
		default:printf("###");	
	}
	return 0;
 }

分析:首先得到a=1,那么执行对应的case 1之后的语句,又是一个switch语句。先得到b=0,执行相应的case 0语句,打印“***”之后碰到break,跳出其所在的switch语句,即switch(b)。然后顺序执行case 2之后的语句,打印“$$$”之后碰到break,跳出所在的switch(a),进而程序结束。
运行结果:

***$$$

选择分支结构程序举例

【例1】查询自动贩卖机中商品的价格。假设自动贩卖机中出售6种商品:绿茶、可乐、芬达、矿泉水、爆米花和瓜子,售价分别为4元、3.5元、3元、1.5元、5元和2.5元。

#include<stdio.h>
int main()
{
	int a;
	printf("\n  ******自动贩卖机查询系统******\n");
	printf("查询价格请按商品前的序号,按0退出查询。\n");
	printf("             1.绿茶\n");
	printf("             2.可乐\n");
	printf("             3.芬达\n");
	printf("             4.矿泉水\n");
	printf("             5.爆米花\n");
	printf("             6.瓜子\n");
	printf("             0.退出\n");
	printf("您要查询:");
	scanf("%d",&a);
	switch(a)
	{
		case 1:printf("绿茶: 4元/瓶");break;
		case 2:printf("可乐: 3.5元/瓶");break;
		case 3:printf("芬达: 3元/瓶");break;
		case 4:printf("矿泉水: 1.5元/瓶");break;
		case 5:printf("爆米花: 5元/杯");break;
		case 6:printf("瓜子: 2.5元/袋");break;
		case 0:return 0;
	}
	printf("\n");
	return 0;
 }

运行结果:

您要查询:1
绿茶:4元/瓶
您要查询:5
爆米花:5元/杯

【例2】某地出租车的收费方法为:起步价7元,最多可行驶3公里(不包含3公里);3~8公里(不包含8公里)按1.7元/公里计算(不足1公里,按1公里计算);8公里以后按2.0元/公里计算(不足1公里,按1公里计算)。编写程序,输入所行使里程数,计算并输出车费。

#include<stdio.h>
int main()
{
	double a,b;
	printf("请输入公里数:");
	scanf("%lf",&a);
	if(a<0)
	{
		printf("抱歉,格式出错!"); 
	}
	else
	{
		if(a<3)          b=7;
		else if(a<8)     b=7+((int)(a-2+1))*1.7;                       /*不足1公里的部分按照1公里计算,即为(a-2+1)。(int)定义(a-2+1)部分为整型,即舍弃小数部分*/ 
		else             b=7+5*1.7+((int)(a-7+1))*2.0;    
	}
	printf("您的出租车费用为:%8.2lf元。\n",b);                        //%8.2lf表示,输出的宽度为8,输出2为小数// 
	return 0;
}

运行结果:

请输入公里数:0
抱歉,出错!
请输入公里数:3.2
您的出租车费用为:10.40元

【例3】求ax^2+bx+c=0方程的解。
分析:求解此方程的解,应该考虑到各种可能的情况。
当a=0时,不是二次方程,没有二次方根,否则:
(1)当b^2-4ac=0时,方程有两个相等的实根。
(2)当b^2-4ac>0时,方程有两个不相等的实根。
(3)当b^2-4ac<0时,方程有两个共轭的复根。

#include<stdio.h>
#include<math.h>
int main()
{
	float a,b,c,disc,x1,x2,realpart,imagpart;
	printf("\n请输入方程的3个系数:(a=,b=,c=)\n");
	scanf("a=%f,b=%f,c=%f",&a,&b,&c);
	if(fabs(a)<=1e-6) printf("该方程没有二次方根。\n");                  /*在怕判断disc是否为0时,由于此值为实数,而实数在计算和储存时会存在一定误差,
	因此不能直接进行if(disc==0)的判断,所以在这里是用判别disc的绝对值(fabs(disc))是否小于一个很小的数(10^6),如果小于此数,就近似认为disc等于0.*/ 
	else disc=b*b-4*a*c;
	if(fabs(disc)<=1e-6)
	 printf("该方程有两个相等的实根:x1=x2=%8.4f\n",-b/(2*a));           //%8.4f表示,输出的宽度为8,输出4位小数// 
	else if(disc>1e-6)
	{
		x1=(-b+sqrt(disc))/(2*a);
		x2=(-b-sqrt(disc))/(2*a);
		printf("该方程有两个不相等的实根:\n x1=%8.4f,x2=%8.4f\n",x1,x2);
	 } 
	 else
	 {
	 	realpart=-b/(2*a);
	 	imagpart=sqrt(-disc)/(2*a);
	 	printf("该方程有两个复根:\n");
	 	printf("x1=%8.af+%8.4fi\n",realpart,imagpart);
	 	printf("x2=%8.4f-%8.4fi\n",realpart,imagpart);
	 }
	return 0;
}

运行结果:

a=0,b=1,c=1
该方程没有二次方根
a=1,b=2,c=1
该方程有两个相等的实根:x1=x2=-1.0000
a=2,b=6,c=1
该方程有两个不相等的实根:x1=-0.1771,x2=-2.8229
a=1,b=2,c=2
该方程有两个复根:
x1=-1.0000+1.0000i
x2=-1.0000-1.0000i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值