当前位置:   article > 正文

C语言运算符、if语句、switch语句关系及逻辑表达式、break的用法、学生成绩的ABCDE分等级问题、分段函数求值_a++<3 && c--!=0

a++<3 && c--!=0

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

1. 关系运算符:

在这里插入图片描述

2. 逻辑运算符

在这里插入图片描述

3. 位运算符

在这里插入图片描述
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011

二、 if语句的三种形式(单分双分多分支),以及if语句的嵌套;

1. 单分支:
if (boolean_expression)
{
	/*如果布尔表达式为真将执行的语句*/
}
  • 1
  • 2
  • 3
  • 4
2. 双分支:
if (boolean_expression)
{
/*如果布尔表达式为真将执行的语句*/
}
else
{
/*如果布尔表达式为假将执行的语句*/
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
3. 多分支
if (boolean_expression 1)
{
/*当布尔表达式1为真时执行*/
}
else if( boolean_expression 2) 
{
/*当布尔表达式2为真时执行*/
}
else if( boolean_expression 3)
{
/*当布尔表达式3为真时执行*/
} 
else
{
/*当上面条件都不为真时执行*/
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
4. if语句的嵌套
if( boolean_expression 1) 
{
	/*当布尔表达式1为真时执行*/
	if(boolean_expression 2)
	{
		/*当布尔表达式2为真时执行*/
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、switch语句的形式

switch(expression) {
	case constant-expression :
	      statement(s);
	break;
	/*可选的*/
	case constant-expression :
	      statement(s);
	break;
	/*可选的*/
	/*您可以有任意数量的case语句*/
	default:
	/*可选的*/
	statement(s);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

四、关系及逻辑表达式的运算规则的应用

1. if示例1:
/*  关系及逻辑表达式运算规则  */
#include "stdio.h"
void main( ) {
	int a=3,b=5,c=8;
	if(a++<3 && c--!=0)  b=b+1;
	printf("a=%d\tb=%d\tc=%d\n",a,b,c);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

程序运行截图:
在这里插入图片描述
注意该程序中的条件判断表达式a++<3 && c- -!=0是一个逻辑表达式,关系表达式a++<3的值为假,因此后一部分c- -!=0就不再计算。首先a=3,并不是比3小,为假,a先增值1变成4后,后面是&&,直接结束if语句,此时,a=4,b仍然是5,c仍然是8。

2. if示例2:

比较下列各部分运行结果

#include "stdio.h"
void main( ) {
	int a=3,b=5,c=8;
	if(a++<3 && c--!=0)  b=b+1;
	printf("a=%d\tb=%d\tc=%d\n",a,b,c);
	a=3,b=5,c=8;
	if(c--!=0 && a++<3)  b=b+1;
	printf("a=%d\tb=%d\tc=%d\n",a,b,c);
	a=3,b=5,c=8;
	if(a++<3 || c--!=0)  b=b+1;
	printf("a=%d\tb=%d\tc=%d\n",a,b,c);
	a=3,b=5,c=8;
	if(c--!=0 || a++<3)  b=b+1;
	printf("a=%d\tb=%d\tc=%d\n",a,b,c);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行截图:
在这里插入图片描述
第一个输出结果首先a=3,并不是比3小,为假,a先增值1变成4后,后面是&&,直接结束if语句,此时,a=4,b仍然是5,c仍然是8
第二个输出结果,一开始,c=8非0为真,此时c变成7,然后判断&&后面,a=3,并不比3小为假,a立即变成4,整个if判断语句为假,直接结束,此时a=4,b=5,c=7
第三个输出结果,一开始,a=3,并不比3小,为假,a马上变成4,后面是‖,继续判断,c=8非0为真,c马上变成7,整个if判断语句为真,执行后面的命令,b=b+1,即b=6,最终结果,a=4,b=6,c=7
第四个输出结果,一开始c=8,非0为真,c马上变成7,后面是‖,不要继续判断了,整个if判断语句为真,执行后面的命令,即b=b+1,b变成6,最终结果a=3,b=6,c=7

3. if-else语句示例1:

这是一个用于奇偶判断的包含if-else语句:

#include<stdio.h>
int main() {
	int a=10;
	if(a%2==0)
	     printf("偶数!"); 
	else
		 printf("奇数!");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

10能够被2整除,结果为0,所以运行一下,可以看见输出“偶数!”

4. if-else语句示例2:

这是直接用主函数编写程序,实现找到三个数中最大的一个数,并输出。

#include <stdio.h>
int main() {
	int a,b,c,max;
	scanf("a=%d,b=%d,c=%d",&a,&b,&c);
	if(a>=b)
	        max=a; 
	else
	        max=b;
	if(c>max)
	        max=c;
	/*这里先对a和b进行比较,找到最大值,先赋值给max,再将max和c比较*/
	printf("max=%d",max);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里要注意,输入的时候需要输入“a=4,b=5,c=6,”不能直接输入abc的值
结果为“max=6”

5. if语句的嵌套使用示例:

这里是通过对abc三个变量值的判断实现不同操作对swt赋值,一定要仔细看if-else的逻辑

#include <stdio.h>
int main() {
	int a,b,c;
	int s,w,t;
	s=w=t=0;
	a=-1;
	b=3;
	c=3;
	if(c>0)
	        s=a+b;
	/*这里是单独的一个if语句,和下面的没关系*/
	if(a<=0) {
		if(b>0)
			if(c<=0)
			    w=a-b;
				/*当a<=0且b>0且c<=0时的操作*/
	} else  
	/*对a<=0的否定情况*/
	if(c>0)
		w=a+b; else
	    t=c;
	printf("%d %d %d",s,w,t);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

结果输出是2 0 0
因为c>0,所以s=a+b=2;由a=-1,但是c>0,所以不进入w=a-b中,也不进入对“a<=0”的else语句中,直接结束程序,输出2 0 0

五、case语句中break语句的作用

不含break的情况
/* 不含break的switch */
#include "stdio.h"                       
void main( ) {
	int a,m=0,n=0,k=0;
	scanf("%d",&a);
	switch(a) {
		case  1: m++;
		case  2: 			
		   case  3: n++;
		case  4:				
		   case  5: k++;
	}
	printf("%d,%d,%d\n",m,n,k);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行截图:
在这里插入图片描述
一开始,输入a=3,switch进行case3,即n+1变成1,没有break,继续后面的命令,k增值1变成1,m自始至终没变,最终输出结果就是0 1 1

含有break的情况
/* 含break的switch */
#include "stdio.h"
void main( ) {
	int a,m=0,n=0,k=0;
	scanf("%d",&a);
	switch(a) {
		case 1: m++;
		break;
		case 2:
		case 3: n++;
		break;
		case 4:
		case 5: k++;
	}
	printf("%d,%d,%d\n",m,n,k);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行截图:

在这里插入图片描述

一开始,a输入成3,进行case3,n增值1,变成1,break直接结束switch,其他值都没有发生变化,最终结果就是0 1 0

六、多分支语句应用

1. 学生成绩的分类问题:

输入某学生的成绩,经处理后给出学生的等级,等级分类如下:
90分以上(包括90): A
80至90分(包括80):B
70至80分(包括70):C
60至70分(包括60):D
60分以下: E

#include<stdio.h>
void main() {
	float score;
	scanf("%f",&score);
	if(score>=90) printf("A"); 
	else  if(score>=80) printf("B"); 
		else  if(score>=70) printf("C"); 
			else  if(score>=60) printf("D"); 
				else  printf("E");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行截图:
在这里插入图片描述
在这里插入图片描述

2.用switch语句实现上述的分类问题
#include <stdio.h>

int main()
{
    int s;
    char ch;
    printf("input a student grade:");
    scanf("%d",&s);
    s=s/10;
    /*结果返回整数,获取成绩的十位的数字,用于判断成绩区间*/
    if(s<0||s>10)
        printf("\ninput error!");
	/*增加了一个错误输入的提示*/
    else
    {
        switch(s)
        {
            case 10:
            case 9: ch='A';break;
            case 8: ch='B';break;
            case 7: ch='C';break;
            case 6: ch='D';break;
            default: ch='E';
            /*对于60分以下的所有成绩选择E等级*/
        }
        printf("\n分数折算成等级:%c",ch);
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所有的成绩都可以正确换算

回顾一下没有break;把所有的break语句去掉,再分别输入100、92、80、70、60、50观察输出的结果。

switch(s)
        {
            case 10:
            case 9: ch='A';
            case 8: ch='B';
            case 7: ch='C';
            case 6: ch='D';
            default: ch='E';
            /*对于60分以下的所有成绩选择E等级*/
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

对于所有的输入,结果都是’E’;因为case语句只是决定switch语句的进入位置,比如s=8,虽然可以正确地将ch赋值为B,但是没有break语句作为程序出口,跳出switch选择语句,所以程序就从case:8处进入,执行完所有的语句至结束,最后ch被赋值为‘E’

3.编程实现被3或者5整除的数

编程序,输入一个数,判断它能否被3或者被5整除。如至少能被这两个数中的一个整除,则将此数打印出来,否则不打印。

这个程序设计很简单,主要就是一个if判断条件的书写

#include <stdio.h>
int main() {
	int a;
	printf("请输入待判断的值:");
	scanf("%d",&a);
	if(a%3==0||a%5==0)
	/*判断它能否被3或者被5整除*/
	        printf("%d能被3或5整除",a);
	/*否则不打印,没有else语句操作*/
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

4.编程实现分段函数求值,用if语句实现从键盘输入x的值(要求为实型),根据公式计算并输出x和y的值。

在这里插入图片描述

#include<stdio.h>
#include<math.h>
/*导入一个用于使用pow(),sqrt()函数的库,提高开发效率*/
int main() {
	float x;
	/*浮点型提高计算结果精度*/
	scanf("%f",&x);
	if(x<2)
	        printf("y=%f",x); 
	        /*情况一*/
	else if(x<6)
	        printf("y=%f",pow(x,2)+1); 
	        /*情况二*/
	else if(x<10)
	        printf("y=%f",sqrt(x+1)); 
	        /*情况三*/
	else
	        printf("y=%f",1/(x+1));
	        /*情况四*/
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这个程序用if语句实现很容易,如果使用switch语句则会出现对于输入的x值需要加工处理才能放在switch()的括号里面。

但是这道题因为所给问题的特殊性可以有下面的解决办法:

#include<stdio.h>
#include<math.h>

int main()
{
    float x;
    scanf("%f",&x);
    if(x<0)
        printf("y=%f",x);
    /*先用一个if语句对x<0的情况单独处理,筛选出x>=0的其他情况*/
    else
        switch ((int)x)
        /*将浮点型数据转化为int整数型,如果是0-10之间的x值,则int(x)的值是0-10之间的某一个整数数字,则可以直接用case:int(x)分不同情况,对于x>10的情况放在default处理*/
        {
            case 0:printf("y=%f",x);break;
            case 1:printf("y=%f",x);break;
            /*0 <= x < 2 */
            case 2:printf("y=%f",pow(x,2)+1);break;
            case 3:printf("y=%f",pow(x,2)+1);break;
            case 4:printf("y=%f",pow(x,2)+1);break;
            case 5:printf("y=%f",pow(x,2)+1);break;
            /*2 <= x < 6 */
            case 6:printf("y=%f",sqrt(x+1));break;
            case 7:printf("y=%f",sqrt(x+1));break;
            case 8:printf("y=%f",sqrt(x+1));break;
            case 9:printf("y=%f",sqrt(x+1));break;
            /*6 <= x < 10 */
            default:printf("y=%f",1/(x+1));
            /*x >= 10 */
        }
        
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

可以运行实现一下,这里就不演示了,虽然也可以达到和if语句一样的效果,但是工作量无疑增加了不少,所以对于问题选择有效的解决办法可以降低很多工作量,代码可读性也可以提高很多!

七、总结:

  1. C程序中表示比较运算的等号用“==”表示,赋值运算符用“=”表示,不能将赋值号“=”用于比较运算。
  2. 控制表达式是指任何合法的C语言表达式(不只限于关系或逻辑表达式),只要表达式的值为“非零”,则为“真”,“零”则为“假”
  3. 在if语句的嵌套结构中,else与if的配对原则是:每个else总是与同一个程序在前面出现而且距它最近的一个尚未配对的if构成配对关系。
  4. case及后面的常量表达式,实际仅是起标号作用。控制表达式的值与某个情况常量一旦匹配,那么,在执行下面语句的过程中,只要不遇到break语句,就一直执行下去,而不再判别是否匹配。允许出现多个“case”与一组语句相对应的情况。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/390107
推荐阅读
相关标签
  

闽ICP备14008679号