C Programming学习笔记【谭浩强老师编】(第四章选择结构程序设计)02 逻辑运算符和逻辑表达式

在这里插入图片描述



一、逻辑运算符和逻辑表达式

在这里插入图片描述优先次序:!(非)→&&(与)→‖(或), 即“!”为三者中最高的; 逻辑运算符中的“&&”和“‖”低于关系运算符,“!”高于算术运算符
在这里插入图片描述在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。

在这里插入图片描述举个小例子
判别用year表示的某一年是否闰年,可以用一个逻辑表达式来表示。闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除,如2008。②能被400整除,如2000。

(year % 4 == 0 && year % 100 != 0) ‖ year % 400 == 0 

在这里插入图片描述

二、条件运算符和条件表达式

在这里插入图片描述表达式1 ? 表达式2 : 表达式3

条件运算符的执行顺序: 先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。

在这里插入图片描述在这里插入图片描述

举例2.1

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

#include <stdio.h>
int main()
{
	char ch;
	scanf("%c",&ch);
	ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
	printf("%c\n",ch);
	return 0;
}

在这里插入图片描述

三、选择结构的嵌套

在这里插入图片描述

if与else的配对关系。
else总是与它上面的最近的未配对的if配对。
在这里插入图片描述
编程序者把else写在与第1个if(外层if)同一列上,意图是使else与第1个if对应,但实际上else是与第2个if配对,因为它们相距最近。

如果if与else的数目不一样,为实现程序设计者的思想,可以加花括号来确定配对关系。
在这里插入图片描述

举例3.1

在这里插入图片描述在这里插入图片描述
算法步骤

S1:输入x
S2:若x<0,则y=-1
S3:否则
S4:若x=0,则y=0
S5:否则(即x>0),则y=1
S6:输出y

方法1.无嵌套

#include <stdio.h>
int main()
{
	int x,y;
	scanf("%d",&x);
	if(x<0) y=-1;
	if(x==0) y=0;
	if(x>0) y=1;
	printf("x=%d,y=%d\n",x,y);
	return 0;
}

方法2.嵌套

#include <stdio.h>
int main()
{
	int x,y;
	scanf("%d",&x);
	if(x<0)
		y=-1;
	else 
		if(x==0) y=0;
		else y=1;
		printf("x=%d,y=%d\n",x,y);
	return 0;
}

方法3嵌套

#include <stdio.h>
int main()
{
	int x,y;
	scanf("%d",&x);
	if(x>=0)
		if(x>0) y=1;
		else    y=0;
	else 		y=-1;
	printf("x=%d,y=%d\n",x,y);
	return 0;
}

在这里插入图片描述

四、用switch语句实现多分支结构

switch(表达式)
{
case 常量1 : 语句1
case 常量2 : 语句2
⋮ ⋮ ⋮
case 常量n : 语句n
default : 语句n+1
}
(1) 括号内的“表达式”,其值的类型应为整数类型(包括字符型)。
(2) 花括号内是一个复合语句,内包含多个以关键字case开头的语句行和最多一个以default开头的行。case后面跟一个常量(或常量表达式),它们和default都是起标号作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。
(3) 可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句。
(4) 各个case标号出现次序不影响执行结果。
(5) 每一个case常量必须互不相同;否则就会出现互相矛盾的现象。
(6) case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。因此,一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构。最后一个case子句(今为default子句)中可不加break语句。
(7) 在case子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。
(8) 多个case标号可以共用一组执行语句。

举例4.1

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

#include <stdio.h>
int main()
{
	char grade;
	scanf("%c",&grade);
	printf("Your score:");
	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("enter data error!\n");
	}
	return 0;
}

举例4.2

用switch语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个′A′或′a′字符,就会执行A操作,输入一个′B′或′b′字符,就会执行B操作。

#include <stdio.h>
int main()
{	void action1(int,int),action2(int,int);	//函数声明A,B操作
	char ch;
	int a=15,b=23;
	ch=getchar();
	switch(ch)
	{ 	case 'a':
		case 'A': action1(a,b);break;		//调用action1函数,执行A操作
		case 'b':
		case 'B': action2(a,b);break;		//调用action2函数,执行B操作default:  putchar('\a');			 //如果输入其他字符,发出警告
	}
	return 0;
}

void action1(int x,int y)		//执行加法的函数设为A操作
{	printf("x+y=%d\n",x+y);
}

void action2(int x,int y)		//执行乘法的函数设为B操作
{	printf("x*y=%d\n",x*y);
}

在这里插入图片描述

五、选择结构程序综合举例

选择结构程序综合举例5.1

写一程序,判断某一年是否为闰年。
在这里插入图片描述
判别用year表示的某一年是否闰年,可以用一个逻辑表达式来表示。闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除,如2008。②能被400整除,如2000。

方法1

#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;
}

方法2

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

注意:仔细分析方法2
在这里插入图片描述

选择结构程序综合举例5.2

求ax2+bx+c=0方程的解
在这里插入图片描述

#include <stdio.h>
#include <math.h>
int main()
{	double a,b,c,disc,x1,x2,realpart,imagpart;
	scanf("%lf,%lf,%lf",&a,&b,&c);
	printf("The equation ");
	if(fabs(a)<=1e-6)
		printf("is not a quadratic\n");
	else
	{	disc=b*b-4*a*c;
		if(fabs(disc)<=1e-6)
			printf("has two equal roots:%8.4f\n",-b/(2*a));
		else
			if(disc>1e-6)
			{	x1=(-b+sqrt(disc))/(2*a);
				x2=(-b-sqrt(disc))/(2*a);
				printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
			}
			else
			{	realpart=-b/(2*a);			//realpart是复根的实部
				imagpart=sqrt(-disc)/(2*a);	//imagpart是复根的虚部
				printf("has complex roots:\n");
				printf("%8.4f+%8.4fi\n",realpart,imagpart);	//输出一个复数
				printf("%8.4f-%8.4fi\n",realpart,imagpart);	//输出另一个复数
			}
	}
	return 0;
} 

在这里插入图片描述

选择结构程序综合举例5.3

运输公司对用户计算运输费用。路程越远,运费越低。标准如下:
s<250没有折扣
250≤s< 5002%折扣
500≤s< 10005%折扣
1000≤s< 20008%折扣
2000≤s< 300010%折扣
3000≤s15%折扣
p:每吨每千米货物的基本运费
w:货物重量
s:运输距离
d:折扣
f:总运费
f=pws*(1-d)

#include <stdio.h>
int main()
{ 	int c,s;
	float p,w,d,f;
	printf("please enter price,weight,discount:");//提示输入的数据
	scanf("%f,%f,%d",&p,&w,&s);		//输入单价、重量、距离 
	if(s>=3000) c=12;  //3000km以上为同一折扣
	else c=s/250;//3000km以下各段折扣不同,c的值不相同
	switch(c)
	{	case 0: d=0;break;			//c=0,代表250km以下,折扣d=0
		case 1: d=2;break;			//c=1,代表250~500km以下,折扣d=2%
		case 2: 
		case 3: d=5;break;			//c=2和3,代表500~1000km,折扣d=5% 
		case 4: 
		case 5:      
		case 6: 
		case 7: d=8;break;			//c=4~7,代表1000~2000km,折扣d=8%
		case 8:  
		case 9:    
		case 10:   
		case 11: d=10;break;		//c=8~11,代表2000~3000km,折扣d=10% 
		case 12: d=15;break;		//c12,代表3000km以上,折扣d=15%
	}
	f=p*w*s*(1-d/100);			//计算总运费
	printf("freight=%10.2f\n",f);		//输出总运费,取两位小数
	return 0;
}

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值