C语言第四章-选择结构程序设计

第四章 选择结构程序设计

1、什么是算术运算?什么是关系运算?什么是逻辑运算?

算术运算:
算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。

其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果有多级运算存在,则应先进行高级运算,再进行低一级的运算。
C语言中的算熟运算符包括:+、-、*、/、++、--、% 等种类。

如果只存在同级运算;则从左至右的顺序进行;如果算式中有括号,则应先算括号里边,再按上述规则进行计算。

示例:$ (1 + 1)^{2} * 4+5 * 3$

解析:

先进行括号内运算1+1,然后进行乘方运算得到结果4.
接下来与4相乘,得到结果16
因为乘法优先级大于加法,因此先进行5*3,得到结果15
最终相加得到结果31
结果:31

关系运算:

关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),而在C语言中,关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。

常见的关系运算符包括:<、<=、>、>=、==、!= 等种类。

其中,前4种关系运算符(<、<=、>、>= )的优先级别相同,后2种(==、!=)也相同。而前4种高于后2种。

例如, > 优先于 == 。而 > 与 < 优先级相同。
并且,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符(=)。

逻辑运算:

在逻辑代数中,有与、或、非三种基本逻辑运算。表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。

常见的逻辑运算符包括:&&、||、! 等种类

&&: 与是双目运算符,要求有两个运算对象,表示两个运算对象都成立,则结果为真,否则结果为假。

例如:(a<b) && (x>y),表示(a<b)和(x>y)同时成立则为真。

||:是双目运算符,要求有两个运算对象,表示两个运算对象只要任意一个成立,则结果为真,否则结果为假。

例如:(a<b) && (x>y),表示(a<b)和(x>y)两个对象中任意一个成立则结果为真。

**!**是单目运算符,只要求有一个运算对象,表示取运算对象反义,运算对象为真则结果为假,运算对象结果为假则结果为真。

例如:!(a>b),表示(a>b)成立时结果为假,不成立时结果为真。

若在一个逻辑表达式中包含多个逻辑运算符,则优先次序为: ! > && > ||。当然若一个逻辑表达式中包含括号括起来的子逻辑,则优先括号内的子逻辑判断。

示例:

(1>2)||(2>3)&&(4>3) 结果为0
!(1>2)||(2>3)&&(4>3)结果为1

*******注:&&优先级大于||,((2>3)&&(4>3))无法同时成立,则结果为假,然后与(1>2)结果进行逻辑或运算,两者都为假因此第一次结果为假。 而第二次!优先级最高,先对(1>2)的结果取逻辑非,得到结果为真,因此结果为真。

2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
答案:

在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。

逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。

对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值为1

2.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。

逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。

对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值为1

3.写出下面各逻辑表达式的值。设a=3,b=4,c=5。

(1)a + b > c && b == c
解析: 3+4>5 优先3+4得到结果7,因此7>5结果为真; 4==5为假,一真一假逻辑与最终结果为假。答案: 0

(2)a || b + c && b - c
解析: 优先算术运算4+5得到7,非0则为真,4-5得到-1,非0则为真,接下来逻辑与判断,最终逻辑或判断。答案: 1

(3)!(a > b) && !c || 1
解析 : !优先级最高,!(3>4)最终结果为真,!5为假; 其次 &&,真&&假得到假,最终||,1为真,假或真为真。答案: 1

(4)!(x = a) && (y = b) && 0
解析: 这里&&优先级最低是最后一个逻辑运算,因此不管如何,最终&&0,则肯定为假.答案: 假-0

(5)!(a + b) + c - 1 && b + c / 2
解析: 在vs中优先对(a+b)取非得到0,0+5-1结果为4,因此最终为真(此题涉及不同平台结果不同的问题,因为在有的平台下编译器会优先算术运算,则最终取非得到结果为假)。答案: 1

解题思路:

关系运算符的优先级高于赋值运算符,但是低于算术运算符;
&&表示两边条件同为真则成立,||表示两边条件任意一个为真则成立,!取条件反义。
逻辑运算符优先级: ! > && > ||
有括号优先括号。

4.有3个整数a, b, c,由键盘输入,输出其中最大的数

方法一:
#include<stdio.h>

int main()
{
	int a,b,c,max_number;
	scanf("%d %d %d",&a,&b,&c);
	if (a>b)
	{
		if(a>c)
		{
			max_number = a; //a>c,a>b
		}
		else
		{
			max_number = c; //c>a>b
		}
	}
	else //b>a
	{
		if(b>c)
		{
			max_number = b; //b>c,b>a
		}
		else
		{
			max_number = c; //c>b>a
		}
	}
	printf("a,b,c中最大的数max_number为:%d",max_number);
}

image

方法二:
#include<stdio.h>

int main()
{
	int a,b,c,temp,max_number;
	printf("请输入3个整数:\n"); 
	scanf("%d,%d,%d",&a,&b,&c);
	temp = (a>b)?a:b;  //如果a>b,值为a,否则为b
	max_number = (temp>c)?temp:c;
	printf("最大的整数为:%d",max_number);
	return 0; 
}

image

5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。

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

int main()
{
	float a,a_sqrt;
	printf("请输入一个小于1000的正数a:\n");
	scanf("%f",&a);
	while (a<=0 || a>=1000)
	{
		printf("输入的数不是小于1000的正数a,请重新输入:\n");
		scanf("%f",&a);
	 	if (a<=0 || a>=1000)
	 	{
	 		continue;
	 	}
	 	else
	 	{
	 		break;
	 	}
	}
	a_sqrt = sqrt(a);
	printf("输入a的平方根为:%f\n",a_sqrt);
	return 0; 
}

image

其实好像while里面的if判断可有可无,不影响。

6.有一个函数,编写程序,输入x的值,输出y相应的值。
image

#include<stdio.h>

int main()
{
	float x,y;
	
	while(1)
	{
		printf("请输入x的值:\n");
		scanf("%f",&x);
		if (x<1)
		{
			y=x;
		}
		else if(x>=1||x<10)
		{
			y=2*x-1;
		}
		else
		{
			y=3*x-11;
		}
		printf("输出y的值为:%f\n",y);
	}
	return 0;
}

image

image

略。。

8.给出一百分制成绩,要求输出成绩等级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,8089分为’B’,7079分为’C’ ,60~69分为’D’ ,60分以下为’E’。

方法一:
#include<stdio.h>

int main()
{
	float score;
	char score_grade;
	while(1)
	{
		printf("请输入百分制成绩(0-100):\n");
		scanf("%f",&score);
		if (score>100||score<0)
		{
			printf("请输入正确的成绩\n"); 
		}
		else
		{
			if(score>=90)
			{
				score_grade = 'A';
			}
			else if(score>=80)
			{
				score_grade = 'B';
			}
			else if(score>=70)
			{
				score_grade = 'C';
			}
			else if(score>=60)
			{
				score_grade = 'D';
			}
			else
			{
				score_grade = 'E';
			}
			printf("百分制成绩为:%f,对应的输出成绩等级为:%c",score,score_grade);
		}
		
	}
	return 0;
}

image

方法二:用switch方法,因为原来的python没有这种方法,后来最新的版本才有的,所以一直不习惯使用switch。
#include<stdio.h>

int main()
{
	float score;
	char score_grade;
	printf("请输入学生成绩:\n");
	scanf("%f",&score);
	while(score>100||score<0)
	{
		printf("输入的成绩有误,请重新输入:\n");
		scanf("%f",&score);
	} 
	switch((int)(score/10))
	{
		case 10:
		case 9: score_grade='A';break;
		case 8: score_grade='B';break;
		case 7: score_grade='C';break;
		case 6: score_grade='D';break;
		case 5:
		case 4:
		case 3:
		case 2:
		case 1: 
		case 0: score_grade='E';break;
	}
	printf("成绩是%5.1f。相应的等级是:%c\n",score,score_grade);
	return 0;
}

image

9.给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。

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

int how_many_digit(number) //求出几位数
{
    int digit_number;
    if(number<10)
    {
        digit_number=1;
    }
    else if(number<100)
    {
        digit_number=2;
    } else if(number<1000)
    {
        digit_number=3;
    }
    else if(number<10000)
    {
        digit_number=4;
    }
    else
    {
        digit_number=5;
    }
    return digit_number;
}

void print_each_digit(number_digit,number) //分别输出每一位数字
{
    int digit,j;
    j = number_digit;
    for(int i=1;i<=j;i++) //多少位就需要输出多少次
    {
        digit = number / pow(10,number_digit-1);
        printf("%d ", digit);
        number = number % (int)pow(10,number_digit-1);
        number_digit=number_digit-1;
    }
}

void reverse_output(number_digit,number) //按逆序输出各位数字,例如原数为321,应输出123
{
    int digit,j;
    int a[5];
    j = number_digit;
    printf("\n");
    for(int i=0;i<=j-1;i++) //多少位就需要输出多少次
    {
        digit = number / pow(10,number_digit-1);
        a[i] = digit;
        number = number % (int)pow(10,number_digit-1);
        number_digit=number_digit-1;
    }
    printf("逆序输出为:\n");
    for(int i=j-1;i>=0;i--)
    {
        printf("%d",a[i]);
    }
}

int main()
{
    int number;
    int number_digit;
    while(1)
    {
        printf("请输入一位不少于5位的正整数");
        scanf("%d",&number);
        if(number<1||number>99999)
        {
            printf("输入的数有误,请重新输入");
            continue;
        }
        else
        {
            number_digit= how_many_digit(number);
            printf("number是%d位数\n",number_digit);
            print_each_digit(number_digit,number);
            reverse_output(number_digit,number);
            break;
        }
    }
    return 0;
}

image

书本方法

#include <stdio.h>

int main()
{
    int num,indiv,ten,hundred,thousand,ten_thousand,place;//分别代表个位、十位、百位、千位、万位和位数
    printf("请输入一个正整数(0~99999)");
    scanf("%d",&num);
    if(num>9999)
        place=5;
    else if(num>999)
        place=4;
    else if(num>99)
        place=3;
    else if(num>9)
        place=2;
    else
        place=1;
    printf("位数:%d\n",place);
    printf("每位数字为:");
    ten_thousand = num/10000;
    thousand = (int)(num-ten_thousand*10000)/1000;
    hundred = (int)(num-ten_thousand*10000-thousand*1000)/100;
    ten = (int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
    indiv = (int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
    switch(place)
    {
        case 5:
            printf("%d %d %d %d %d",ten_thousand,thousand,hundred,ten,indiv);
            printf("\n反序数字为:");
            printf("%d %d %d %d %d\n",indiv,ten,hundred,thousand,ten_thousand);
            break;
        case 4:
            printf("%d %d %d %d",thousand,hundred,ten,indiv);
            printf("\n反序数字为:");
            printf("%d %d %d %d\n",indiv,ten,hundred,thousand);
            break;
        case 3:
            printf("%d %d %d",hundred,ten,indiv);
            printf("\n反序数字为:");
            printf("%d %d %d %d\n",indiv,ten,hundred);
            break;
        case 2:
            printf("%d %d",ten,indiv);
            printf("\n反序数字为:");
            printf("%d %d %d %d\n",indiv,ten);
            break;
        case 1:
            printf("%d",indiv);
            printf("\n反序数字为:");
            printf("%d\n",indiv);
            break;
    }
    return 0;
}

image

怎么说呢,看起来好像是书本的代码简单,但是数字量大的时候,比如几十位,书本代码的局限性就出来了,不够通用。但我的还是比较复杂,或许会有更好的方法。

10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7. 5%。200000<I≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提成;400000<<I≤600000元时,高于400000元的部分按3%提成;600000<1≤1000000时,高于600000元的部分按1.5%提成;I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:(1) 使用if语句编写程序。(2) 使用switch语句编写程序。

方法一:if方法
#include <stdio.h>

int main()
{
    float profit, prize;
    printf("请输入当月的利润:\n");
    scanf("%f",&profit);
    if(profit<=100000)
    {
        prize = profit*(0.1);
    } else if(profit<=200000)
    {
        prize = 100000*(0.1) + (profit-100000)*(0.075);
    } else if(profit<=400000)
    {
        prize = 100000*(0.1) + 100000*(0.075) + (profit-200000)*(0.05);
    } else if(profit<=600000)
    {
        prize = 100000*(0.1) + 100000*(0.075) + 200000*(0.05) + (profit-400000)*(0.03);
    } else if(profit<=1000000)
    {
        prize = 100000*(0.1) + 100000*(0.075) + 200000*(0.05) + 200000*(0.03) + (profit-600000)*0.015;
    } else
    {
        prize = 100000*(0.1) + 100000*(0.075) + 200000*(0.05) + 200000*(0.03) + 400000*(0.015) + (profit-1000000)*(0.01);
    }
    printf("利润为%f,对应的奖金为%f",profit,prize);
}

image

方法二:使用switch语句

#include <stdio.h>
int main()
{
    double I, salary = 0;
    printf("enter performance:");
    scanf_s("%lf", &I);
    if (I < 0) {
        printf("请输入一个正数\n");
        system("pause");
        return -1;
    }
    double salary1 = 100000 * 0.1;//大于100000时0~100000的奖金
    double salary2 = (200000 - 100000) * 0.075 + salary1;//大于200000时0~20万的奖金
    double salary3 = (400000 - 200000) * 0.05 + salary2;//大于400000时0~40万的奖金
    double salary4 = (600000 - 400000) * 0.03 + salary3;//大于600000时0~60万的奖金
    double salary5 = (1000000 - 600000) * 0.015 + salary4;//大于1000000时0~100万的奖金
    int grade = I / 100000;
    switch(grade) {
        case 0:
            salary = I * 0.1; break;
        case 1:
            salary = salary1 + (I - 100000) * 0.075; break;
        case 2://会顺序执行到下一个break处
        case 3:
            salary = salary2 + (I - 200000) * 0.05; break;
        case 4:
        case 5:
            salary = salary3 + (I - 400000) * 0.03; break;
        case 6:
        case 7:
        case 8:
        case 9:
            salary = salary4 + (I - 600000) * 0.015; break;
        default:
            salary = salary5 + (I - 1000000) * 0.01; break;
    }
    printf("salary:%f\n", salary);
    system("pause");
    return 0;
}

其实差别就在于,对于switch语句来说,要把各种情况通过除法转化为case 常量进行选择。
其他都不满足的时候,就会执行到default。default可有可无。

11.输入4个整数,要求按由小到大的顺序输出。

#include <stdio.h>

int find_min(x,y)
{
    int min;
    if (x<y)
        min = x;
    else
        min = y;
    return min;
}

int main()
{
    int a,b,c,d;
    int min1,min2,min3;
    printf("请输入4个整数:\n");
    scanf("%d %d %d %d",&a,&b,&c,&d);

    min1 = find_min(a,b);
    min2 = find_min(c,d);
    min1 = find_min(min1,min2);
    if (min1==b)
    {
        b=a;
        a=min1;
    } else if(min1==c)
    {
        c=a;
        a=min1;
    } else if(min1==d)
    {
        d=a;
        a=min1;
    }

    min2 = b;
    min3 = find_min(c,d);
    min2 = find_min(min2,min3);
    if(min2==c)
    {
        c=b;
        b=min2;
    } else if(min2==d)
    {
        d=b;
        b=min2;
    }

    min3 = find_min(c,d);
    if(min3==d)
    {
        d=c;
        c=min3;
    }
    printf("四个数字从小到大输出为:%d,%d,%d,%d\n",a,b,c,d);
    return 0;
}

image

我的方法虽然是实现了,但多少是有点乱,书上的方法更好:
书上的方法:

#include <stdio.h>
int main()
{
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int tmp;
    //找到最小的数
    if (a > b) {
        tmp = a; a = b; b = tmp; // a>b两个数据交换,则给a存储小的b
    }
    if (a > c) {
        tmp = a; a = c; c = tmp;
    }
    if (a > d) {
        tmp = a; a = d; d = tmp;
    }
    //找到第二小的数,不需要和最小的数比较
    if (b > c) {
        tmp = b; b = c; c = tmp;
    }
    if (b > d) {
        tmp = b; b = d; d = tmp;
    }
    //找到第三小的数据,不需要和第一和第二小比较
    if (c > d) {
        tmp = c; c = d; d = tmp;
    }
    printf("%d %d %d %d\n", a, b, c, d);
    system("pause");
    return 0;
}

image

image

#include <stdio.h>

int condition1(float x,float y)
{
    int result;
    if (((x-2)*(x-2)+(y-2)*(y-2))<=1)
        result = 1;
    else
        result = 0;
    printf("\nresult1:%d\n",result);
    return result;
}

int condition2(float x,float y)
{
    int result;
    if (((x+2)*(x+2)+(y-2)*(y-2))<=1)
        result = 1;
    else
        result = 0;
    printf("result2:%d\n",result);
    return result;
}
int condition3(float x,float y)
{
    int result;
    if (((x+2)*(x+2)+(y+2)*(y+2))<=1)
        result = 1;
    else
        result = 0;
    printf("result3:%d\n",result);
    return result;
}
int condition4(float x,float y)
{
    int result;
    if (((x-2)*(x-2)+(y+2)*(y+2))<=1)
        result = 1;
    else
        result = 0;
    printf("result4:%d\n",result);
    return result;
}

int main()
{
    float x,y;
    int height;
    printf("请输入坐标:\n");
    scanf("%f %f",&x,&y);
    printf("输入的坐标为x=%f,y=%f\n",x,y);
    if (condition1(x,y)|| condition2(x,y)|| condition3(x,y)|| condition4(x,y))
        height = 10;
    else
        height = 0;
    printf("(%f,%f)坐标对应的高度是:%d",x,y,height);
    return 0;
}

image

书上的思想是类似的,只是我的代码把各个情况模块化编程了。

posted @ 2022-04-02 20:36  JaxonYe  阅读(485)  评论(0编辑  收藏  举报