第4章 选择结构程序的设计

【例1】:在【例3.5】的基础上,我们将这个例题改为了用if语句来进行判断“b²-4ac<0”还是“b²-4ac≥0”。

代码如下:

#include <stdio.h>
#include <math.h>											//程序中要调用求平方根的函数sqrt
int main ()
{
	double a,b,c,disc,x1,x2,p,q;							//disc用来存放判别式(b * b-4ac)的值
	printf("请输入三个数:\n");
	scanf("%lf%lf%lf",&a,&b,&c);							//输入双精度浮点型变量的值要用格式声明“%lf”
	disc = b*b-4*a*c;
	if(disc<0)												//若b2-4ac<0
	{
		printf("该一元二次方程没有实根\n");					//输出“此方程没有实根”
	}
	else													//若b2-4ac≥0
	{
		p=-b/(2.0*a);
		q=sqrt(disc)/(2.0*a);
		x1 = p+q;									
		x2=p-q;												//求出方程的两个根
		printf("实根是:x1=%7.2f\nx2=%7.2f\n",x1,x2);		//输出方程的两个根
	}
	return 0;
}

输入两种情况
运行结果如下:
情况一

在这里插入图片描述
情况二
在这里插入图片描述

【例2.1】:输入两个实数,按由大到小的顺序输出这两个数。

代码如下:

#include <stdio.h>
int main ()
{
	float a,b,t;
	printf("请输入两个数:\n");
	scanf("%f%f",&a,&b);
	printf("这两个数是:%f,%f\n",a,b);
	if(a>b)
	{							//将a和b的值互换
		t = a;
		a = b;
		b = t;
	}
	printf("%5.2f,%5.2f\n",a,b);
	return 0;
}

运行结果如下:
在这里插入图片描述

【例2.2】输入一个数,判断这个数是几位数,并输出它的各个位置的数,最后逆序

代码如下

#include<stdio.h>
int main ()
{
	int a,b,c;
	int sum;
	printf("请输入一个数:");
	scanf("%d",&sum);
	a=sum/100;//取相应数的百位
	b=(sum%100)/10;//取相应数的十位
	c=sum%10;//取相应数的个位
	if(a!=0)//判断,如果百位数字(a)不为0,则输入的数是个三位数
	{
		printf("这是一个三位数");
		printf("百分位是%d,十分位是%d,个分位是%d\n",a,b,c);
		printf("逆序后的数是%d%d%d\n",c,b,a); 
	}
	else
		if(a==0&&b!=0)//判断,百位为0,十位不为0,则输入的数是两位数
		{
			printf("这是一个两位数\n");
			printf("十分位是%d,个分位是%d\n",b,c);
			printf("逆序后的数是%d%d\n",c,b);
		}
		else
			if((a==0&&b==0)&&c!=0)//判断,百位和十位都为0,则输入的数是个位数
			{
				printf("这是一个个位数\n");
				printf("个位是%d\n",c);
				printf("逆序后的数是%d\n",c);
			}
	return 0;
}

运行结果如下
在这里插入图片描述

【例4.3】 输入三个数,要求按由小到大的顺序输出。

代码如下:

#include <stdio.h>
int main()
{
    int a,b,c,t;    /*定义4个基本整型变量a、b、c、t*/
    printf("Please input a,b,c:\n");    /*双引号内的普通字符原样输出并换行*/
    scanf("%d,%d,%d",&a,&b,&c);    /*输入任意3个数*/
    if(a>b)    /*如果a大于b,借助中间变量t实现a与b值的互换*/
    {
        t = a;
        a = b;
        b = t;
    }
    if(a>c)    /*如果a大于c,借助中间变景t实现a与c值的互换*/
    {
        t = a;
        a = c;
        c = t;
    }
    if(b>c)    /*如果b大于c,借助中间变量t实现b与c值的互换*/
    {
        t = b;
        b = c;
        c = t;
    }
    printf("The order of the number is:\n");
    printf("%d,%d,%d",a,b,c);    /*输出函数顺序输出a、b、c的值*/
    return 0;
}

运行结果如下:
在这里插入图片描述

4.3关系运算符和关系表达式

4.3.1 关系运算符及其优先次序
运算符主要有
1. “<”,(小于)
2. “>”,(大于)
3. “<=”,(小于等于)
4. “>=”,(大于等于)
5. “==”,(等于等于)
6. “!=”。(不等于)
其中,前四种关系运算符的优先级相同,后2种也相同。前四种高于后两种。

4.4 逻辑运算符和逻辑表达式

4.4.1 逻辑运算符及其优先次序

	有3种逻辑运算符,与(AND),或(OR),非(NOT)。

与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
在这里插入图片描述

“&&”和“||”低于关系运算符,“!”高于算术运算符。

按照运算符的优先顺序可以得出:
a>b && c>d 等价于 (a>b)&&(c>d)
!b==c||d<a 等价于 ((!b)==c)||(d<a)
a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
逻辑运算的值

逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:

  1. 与运算(&&)
    参与运算的两个量都为真时,结果才为真,否则为假。例如:
    5>0 && 4>2
    由于5>0为真,4>2也为真,相与的结果也为真。

  2. 或运算(||)
    参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
    5>0||5>8
    由于5>0为真,相或的结果也就为真。

  3. 非运算(!)
    参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
    !(5>0)
    的结果为假。

虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:
由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:
5||0的值为“真”,即为1。
逻辑表达式

逻辑表达式的一般形式为:
表达式 逻辑运算符 表达式
其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:
(a&&b)&&c
根据逻辑运算符的左结合性,上式也可写为:
a&&b&&c
逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
以下是逻辑运算的真值表:
在这里插入图片描述

4.4.2 逻辑表达式

以下是逻辑运算的真值表:
在这里插入图片描述

【例4.4】输入一个字符,判别它是否为大写字母,如果是,将它转换为小写字母;如果不是,不转换。然后输出最后得到的字符。

#include <stdio.h>
int main ()
{
	char ch;
	printf("请输入一个字母:\n");
	scanf("%c",&ch);
	if(ch>='A'&&ch<='Z')				//判断语句,用if来判断输入的字母是否在'A'到'Z'之间
	{
		ch=ch+32;						//一个字母的大小写的ASCII代码之间相差32
		printf("输出的字母是:%c\n",ch);
	}
	else
	{
		printf("输出的字母是:%c\n",ch);
	}
	return 0;
}

或者是这样:

#include <stdio.h>
int main ()
{
	char ch;
	printf("请输入一个字母:\n");
	scanf("%c",&ch);
	ch = (ch>='A'&&ch<='Z')?(ch+32):ch;	/*此表达式的意思就是对ch最后会是什么字母进行判断
										  如果前面的条件成立则输出(ch+32)如果不成立就
										  输出ch的值*/
	printf("最后得到的字母是:%c\n",ch);
	return 0;
}

可以看到,条件表达式相当于一个不带关键字if的if语句,用它处理简单的选择结构可使程序简洁。

【例4.5】 有一阶跃函数编写一个程序,输入一个x的值,要求输出相应的y值。

在这里插入图片描述
代码如下:

#include <stdio.h>
int main ()
{
	float x,y;
	printf("请输入X的值:\n");
	scanf("%f",&x);
	if(x<0)
	{
		y = -1;
	}
	else
		if(x==0)
		{
			y = 0;
		}
		else 
		{
			y = 1;
		}
		printf("最后输出的值是:%f\n",y);
		return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【例4.6】 要求按照考试成绩的等级输出百分制数段,A等为85分以上,B等为70到84分,C等为60到69分,D等为60分以下。成绩的等级由键盘输入。

代码如下:

#include <stdio.h>
int main ()
{
	char grade;
	scanf("%c",&grade);
	printf("你的成绩:");
	switch(grade)
	{
		case'A':printf("85到100\n");break;
		case'B':printf("70到84\n");break;
		case'C':printf("60到69\n");break;
		case'D':printf("<60\n");break;
		default:printf("输入的成绩有误!\n");
	}
	return 0;
}

运行结果如下:
在这里插入图片描述

【例4.7】 写一段程序,判断某一年是否是闰年。

代码如下:

#include <stdio.h>
int main ()
{
	int year,leap;
	printf("enter year:");
	scanf("%d",&year);
	if(year%4==0)
	{
		if(year%100==0)
		{
			if(year%400==0)
					leap=1;
				else
					leap=0;
		}
		else
			leap=1;
	}
	else
		leap=0;
	if(leap)
		printf("%d is ",year);
	else
		printf("%d is not ",year);
	printf("a leap year.\n");
	return 0;
	

}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值