10讲学会C语言之第三讲:分支结构


前言

大家好,我是卷卷。本节课讲分支结构:if else和switch语句。主要有四个部分:简单的猜数游戏,四则运算,自动售货机,作业。(讨论q群号744931080,教程资源在群内)


一、简单的猜数游戏

例1:输入你所猜的整数。假定1-100内。与计算机产生的被猜数比较,若相等显示猜中。若不等显示与被猜数的大小关系。首先定义一个整型变量m,初始化为一个值作为被猜数,然后定义一个整型变量n作为输入的数。输入要猜的数n,用if else结构判定。对于m和n相等,小于,大于的三种情况都给出相应的提示。本题的重点是if else结构。我们来看一下代码:

#include<stdio.h>
int main(){
	int m=37,n;
	printf("请输入你要猜的数:");
	scanf("%d",&n);
	if(m==n){
		printf("恭喜你猜中啦!\n");
	}else{
		if(m<n)
			printf("太大啦!\n");
		else
			printf("太小啦!\n");
	}
	return 0;
}

首先定义一个变量m,我们给它赋一个初始值。这个初始值对程序员是没有什么意义的,但对于用户来说他是不知道的,所以这个数值对用户来说是随机的。输入正整数以后用if else结构判定。我们可以看到else里面还嵌套了一个if else结构。if里面可以嵌套多个if或者if else。else里面也是一样,但是只要有else出现,必须有if,即if可以单独出现,else不可以单独出现。如果只有else,没有if就会是这样的:在这里插入图片描述
编译器说“else without a previous if”。就是说else必须有一个if,所以只要有else必有if。然后是判定:

	if(m==n){
		printf("恭喜你猜中啦!\n");
	}else{
		if(m<n)
			printf("太大啦!\n");
		else
			printf("太小啦!\n");
	}

如果两者相等则输出提示。如果m小于n,则输出太大,反之输出太小。我们运行一下:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就是本题的讲解了。

例2:输入一个整数,判断该数是奇数还是偶数。首先定义一个整型变量n,输入n,若n模2为0,说明是偶数,反之为奇数。本题的重点还是if else结构。代码:

#include<stdio.h>
int main(){
	int n;
	printf("请输入一个数:");
	scanf("%d",&n);
	if(n%2){
		printf("它是奇数\n");
	}else{
		printf("它是偶数\n");
	}
	return 0;
}

if里面,如果n模2为0那就代表假,如果非0那就代表真。这一点上节课已经讲过,希望大家牢记。我们试一下:在这里插入图片描述
在这里插入图片描述

例3:输入一个正整数n,再输入n个学生的成绩,计算平均分,并统计不及格成绩的学生人数。首先定义一个整型变量n,其次定义一个浮点型变量grade表示成绩。计算平均分除了人数,还需要总分,所以定义浮点型变量sum初始化为0,用于累加成绩。再定义一个整型变量count用于累加不及格人数。先输入n,再利用for循环循环n次,每次输入成绩,累加总分,不及格人数,最后输出它们即可。代码:

#include<stdio.h>
int main(){
	int n,count=0;
	double grade,total=0;
	printf("请输入一个数:");
	scanf("%d",&n);
	printf("请输入这%d个学生的成绩:\n",n);
	for(int i=1;i<=n;i++){
		printf("第%d个学生成绩:",i);
		scanf("%lf",&grade);
		total+=grade;
		if(grade<60)
			count++;//计数器+1  
	}
	printf("平均成绩:%.2f,不及格人数:%d\n",total/n,count);
	return 0;
}

count代表不及格人数,total代表总分,grade代表成绩。核心是for循环,首先输入成绩,然后总分累加成绩。如果成绩小于60,count就累加1,这个我想大家没有问题。最后输出即可。注意输出的是平均成绩,所以总分要除以人数。运行结果:在这里插入图片描述
再补充下多分支结构。判定小于60的代码也可以写为这样:

		if(grade>=100){
		}else if(grade>=80){
		}else if(grade>=60){	
		}else
			count++;

首先判定grade是否大于等于100,如果不是,后面的所有判定都基于这个判定之上的。也就是后面的所有判定都是小于100里的,然后再判定是否大于等于80。如果不是,后面的所有判定都是基于小于80的。再判定是否大于等于60,如果不是,最后剩下的就是小于60的情况。这就是else if的意义,其实不难发现else if也等于else里面加一个if。这两者是等效的,这就是本题的讲解了。

二、四则运算

例4:求解简单的四则运算表达式。输入一个形式如操作数,运算符,操作数的四则运算表达式,输出运算结果。首先定义两个整型变量num1和num2表示操作数,一个字符型变量op表示运算符。输入表达式,利用多分支结构判定op,并输出相应的运算结果即可。代码:

#include<stdio.h>
int main(){
	double num1,num2;
	char op;
	scanf("%lf%c%lf",&num1,&op,&num2);
	if(op=='+')
		printf("=%.2f\n",num1+num2);
	else if(op=='-')
		printf("=%.2f\n",num1-num2);
	else if(op=='*')
		printf("=%.2f\n",num1*num2);
	else if(op=='/')
		printf("=%.2f\n",num1/num2);
	else
		printf("未知的符号!\n");
	return 0;
}

多分支结构中,如果是加号,输出和。如果是减号,输出差。以此类推,如果不是这些符号,给出提示。我们试一下:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来补充字符及输入与输出,逻辑运算。除了用scanf输入字符之外,getchar函数也可以输入字符,只不过只接收一个字符。putchar函数也可以输出字符,只不过也仅输出一个字符。它们的调用形式是这样的:

	op=getchar();
	putchar(op);

我们来试一下:在这里插入图片描述
这是接收1个字符并输出这个字符。接下来是逻辑运算符。两个与号,即“&&”,表示与,且的逻辑关系。两个竖杠,即“||”表示或。比如说a&&b,只有a和b都为真时候结果才为真。a||b,只有a和b的结果都为假时结果才为假。上节课讲过,在C/C++程序中,0代表假,非0代表真。我们来试一下:在这里插入图片描述
这就是运算结果了。第一个因为有0所以结果为假,第二个都是非零数,结果为真。第三个只有一个为假,结果还是真。第四个是两个假,结果为假。其实只要记住这两句话就可以了:与是只有a和b都为真结果才为真,或是只有a和b都为假结果才为假。这就是本题的全部讲解了。

例5:输入10个字符,统计其中英文字母,数字字符和其他字符的字数。定义整型变量letter等于0,number等于0,other等于0,分别用于统计字母数,数字数和其他字符数。定义字符变量ch表示字符,利用for循环,每轮循环输入ch。判定并累加相应的整型变量,最后输出这三个整型变量即可。本题的重点是字符判定。我们来看一下代码:

#include<stdio.h>
int main(){
	int letter=0,number=0,other=0;
	char ch;
	printf("请输入10个字符:\n");
	for(int i=1;i<=10;i++){
		ch=getchar();
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			letter++;
		else if(ch>='0'&&ch<='9')
			number++;
		else
			other++;
	}
	printf("字母%d个,数字%d个,其它%d个\n",
	letter,number,other);
	return 0;
}

重点是循环体的内容,这里用了新的输入方式。if判定,然后累加对应的变量即可。在第一讲,我给大家说过,英文字母和数字,在ASC码表中都是连续升序排列的,所以可以夹在中间判定。注意,判定在a到b之间不是这样写的:a<=x<=b。这样写是错误的,要这样写:a<=x&&x<=b。它的意思是a小于等于x,同时x小于等于b,也就是判定前后两者是否同时成立。这一点可能是初学者的易错点,我再强调一遍,a<=x<=b,这样连写是错误的,一定要加上逻辑运算符。这点希望大家牢记。最后输出这三个变量即可,我们验证一下:在这里插入图片描述
这就是正确结果了。

三、自动售货机

例6:查询自动售货机中商品的价格,假设自动售货机出售四种商品:薯片,爆米花,巧克力和可乐,售价分别是每份3.0元2.5元,4.0元和3.5元。在屏幕上显示以下菜单:
                1.选择薯片
                2.选择爆米花
                3.选择巧克力
                4.选择可乐
                0.退出
用户可以连续查询商品的价格,当查询次数超过5次时自动退出查询,不到5次时,用户可以选择退出。当用户输入编号1-4,显示相应商品的价格,保留一位小数。输入0,退出查询。输入其他编号,显示价格为0。定义整型变量option用于选择,定义浮点型变量price代表价格。利用for循环,循环5次。每次显示菜单和输入提示,输入编号后用switch语句判定,每个case给price变量赋值,然后输出price。本题的重点自然是switch语句。代码:

#include<stdio.h>
int main(){
	int option;
	double price;
	printf("自动售货机菜单:\n");
	for(int i=0;i<5;i++){
		printf("1.选择薯片\n");
		printf("2.选择爆米花\n");
		printf("3.选择巧克力\n");
		printf("4.选择可乐\n");
		printf("0.退出\n");
		printf("选择编号:");
		scanf("%d",&option);
		if(option==0)
			break; //不是退出if,而是退出整个循环 ! 
		switch(option){//将option作为一个变量识别 
			case 1:
			price=3;break;//退出switch 
			case 2:price=2.5;break;
			case 3:price=4.0;break;
			case 4:price=3.5;break;
			default:price=0;break;
		}
		printf("价格为%.1f\n",price);
	}
	printf("欢迎下次光临!\n");
	return 0;
}

首先option是整数,price是小数。然后显示菜单,输入选项。如果选项为0,则立即用break退出循环。注意这里不是退出if,而是退出整个循环。我再强调一遍,这里的break不是退出if,而是退出整个循环。break的作用不是退出当前一轮的循环,也不是退出if,而是立即退出整个循环,也就是直接跳到了花括号的后面。接下来就是switch语句:

		switch(option){//将option作为一个变量识别 
			case 1:
			price=3;break;//退出switch 
			case 2:price=2.5;break;
			case 3:price=4.0;break;
			case 4:price=3.5;break;
			default:price=0;break;
		}

switch圆括号里面的内容是用来识别的。它将option作为一个变量来识别,然后在循环体内写上case。case加数字加冒号就相当于if的圆括号里加数字:

			if(optipon==1){
				
			}
			case 1:

它们基本是等效的,但是冒号后是没有边界的,如果不加break的话就会继续执行后面的case,这样结果就错了。所以要用break语句及时退出switch。所以这里break的作用是退出switch,也就是break有两个作用,第一个作用是退出整个循环,第二个作用是退出switch。每一个case给price赋值,如果上述情况都不是,就写default,这个相当于else。最后输出价格即可。我们来试一下:在这里插入图片描述
在这里插入图片描述
这就是本题的运行结果了。

最后一道例题:输入一个形式如操作数,运算符,操作数的四则运算表达式,用switch语句判定并输出运算结果。要求对除数为0的情况给出提示。本题很简单,就不作详细分析了。代码:

#include<stdio.h>
int main(){
	double num1,num2;
	char op;
	printf("请输入表达式:");
	scanf("%lf%c%lf",&num1,&op,&num2);
	switch(op){
		case '+':printf("=%.2f\n",num1+num2);break;
		case '-':printf("=%.2f\n",num1-num2);break;
		case '*':printf("=%.2f\n",num1*num2);break;
		case '/':
			if(!num2)
				printf("除数不能为0!\n");
			else
				printf("=%.2f\n",num1/num2);
			break;
		default:printf("未知的符号!\n");break;
	}
	return 0;
}

本题就是把if else结构改为switch结构。注意这里的感叹号表示取反,如果遇到非0的数,取反后就会变为0,如果遇到零取反后就会变为1。这就是例题的全部讲解了。

四、作业

作业部分:7个例题加上5个练习题,总共12道题。练习1和练习2:在这里插入图片描述
第一题很简单,就不讲了。第二题中,“精确到整数”中的整数,可以是向上取整也可以是向下取整。所以我们要看具体的样例,根据输出样例,答案是向上取整。因为这里原本是66.6%输出是67%,所以是向上取整。我们先来看一下x怎么算,显然x是一个整数。假设车速为car,限速为limit。由于它们都是整数,所以算百分比时要强制转换为小数,则百分比为int x =1.0* (car - limit)/limit* 100,这样就得到了精确的百分比。如果要向上取整就只能加0.5:int x =1.0* (car - limit)/limit*100+0.5。或者用一个叫做ceil的函数也行,它是math库函数里面的,用于向上取整。得到x的表达式后,本题就没什么难的了。练习3和练习4:在这里插入图片描述
练习3要注意一下,超起步里程后10公里,这个10公里是总的距离,而不是13公里。下面同理,超过10公里以上是总距离超过10公里,而不是超过13公里。然后停止收费这里,不足5分钟则不收费刚好符合除号的含义,直接把费用除以5即可。比如说4除以5,向下取整以后就是0,因为小于5的数相除以后,得到的都是零点几,然后取整数部分自然是0,不收费。这样,这题也就没什么难的了。练习4一看规则就知道很简单,用分支结构判定即可,用if或者switch都可以。最后一题:在这里插入图片描述
这里会要用到一个公式。我在这里给出了一个提示,原题是没有的。这个其实就是海伦公式,只要知道了这个公式,这题也就没什么难的了。好了,这就是本讲的全部内容啦。我们下讲见!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中的分支结构是通过switch语句实现的。switch语句是一种用于进行多路选择判断的结构。它通过一个整型表达式作为选择条件,根据不同的情况执行相应的语句块。 switch语句的基本格式如下: switch (整型变量表达式) { case 常量1: 语句块1; break; case 常量2: 语句块2; break; case 常量3: 语句块3; break; ... case 常量n: 语句块n; break; default: 语句; break; } 在switch语句中,整型变量表达式的值会与每个case后面的常量进行比较,如果匹配成功,则执行对应的语句块。如果没有匹配成功的常量,可以使用default关键字来执行默认的语句块。每个case后面的break关键字用于结束当前的语句块,避免继续执行下一个case的语句块。 总结起来,switch语句是C语言中一种非常常用的分支结构,它根据整型变量表达式的值进行多路选择,并执行与之对应的语句块。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言学习——分支语句之switch语句](https://blog.csdn.net/weixin_45743453/article/details/128598886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言之初识 switch 多分支结构](https://blog.csdn.net/weixin_45332776/article/details/115824499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值