前言
大家好,我是卷卷。本节课讲分支结构: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都可以。最后一题:
这里会要用到一个公式。我在这里给出了一个提示,原题是没有的。这个其实就是海伦公式,只要知道了这个公式,这题也就没什么难的了。好了,这就是本讲的全部内容啦。我们下讲见!