分支结构(if、switch)
文章目录
基础知识
C程序里的3种结构:
1.顺序 2.分支(选择) 3.循环
C语言执行程序的特点:
C语言是面向过程的,代码的执行顺序是一步接着一步的,因此在看代码的时候,我们要把自己当成CPU,一步一步往下走。
if 语句
if 语句:既是条件语句又是判断语句
if的三种基本结构
//1.
if(表达式) //表达式如果成立,也就是非0,那么就执行if后面的语句
{
语句;
}
//否则不进去执行
if(表达式)
语句1;
语句2;
语句3;
//注意:不打花括号,上面的if语句实际上是这个样子的,也就是说只有语句1是在if判断条件成立后的执行语句内。
if(表达式)
{
语句1;
}
语句2;
语句3;
//2.
if(表达式) //如果....
{
语句1;
}
else //否则.....
{
语句2;
}
//如果表达式成立 那么执行语句1
//否则就执行语句2
//3.
if(表达式1)
{}
else if(表达式2)
{}
else if(表达式3)
{}...
else
{}
//先判断表达式1,成立就进去执行
//注意:执行完后,不会再判断后面if里表达式,因为后面if前面都有一个else,因此,if else只能进去一个。
//如果不成立则判断表达式2,表达式2不成立判断表达式3
题目:字符判断
练习题1:从键盘输入一个字符,判断它是否是字母,如果是的那么就打印yes,否则就打印no
//从键盘输入一个字符,判断它是否是字母
#include<stdio.h>
int main()
{
char c;
scanf("%c",&c);
if((c>='A' && c<='Z')||(c>='a' && c<='z'))
printf("yes\n");
else
printf("no\n");
return 0;
}
题目:字符转数字
练习题2: 从键盘输入多个字符(数字字符) ,进行一个加法运算,需要考虑输入字符是字母的情况。
如:
输入9 8
输出 17
// 从键盘输入多个字符(数字字符) ,判断输入字符是否合法进行一个加法运算
#include<stdio.h>
int main()
{
char a,b;
char c;
scanf("%c %c",&a,&b);
if(('0'<=a && a<='9')&&('0'<=b && b<='9'))
{
c = (a - '0') + (b - '0');
printf("%d\n",c);
}
else
printf("输入错误!\n");
return 0;
}
/*scanf:
scanf语句怎么写的就怎么输入,不要换行输入
应为回车键也会当做一个字符读入
如果实在想要换行输入,就在scanf输入语句后面添加一句
getchar();用于获取输入的最后一个字符,像下面这样
scanf("%c",&a);
getchar();
scanf("%c",&b);
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)
从缓冲区读走一个字符,相当于清除缓冲区 */
题目:最大最小值
练习题3: 从键盘输入三个数,输出其中的最大值与最小值
//从键盘输入三个数,输出其中的最大值与最小值
#include<stdio.h>
#define P 0
#define MAX(a,b) (a)>(b)? a : b
#define MIN(a,b) (a)<(b)? a : b
int main()
{
#if P
//常规做法
int a,b,c,max,min;
printf("请输入需要比较的三个数:");
scanf("%d %d %d",&a,&b,&c);
if(a>b)
{
max = a;
min = b;
}
else
{
max = b;
min = a;
}
if(max < c)
max = c;
else if(c < min)
min = c;
printf("最大值为:%d,最小值为:%d\n",max,min);
#endif
//改进后
int a,b,c;
printf("请输入需要比较的三个数:");
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",MAX(MAX(a, b), c));
printf("%d\n",MIN(MIN(a, b), c));
return 0;
}
宏定义:
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
(1) 简单的宏定义: #define <宏名> <字符串>
例: #define PI 3.1415926
(2) 带参数的宏定义 #define <宏名> (<参数表>) <宏体>
例:#define area(x) x*x
题目:三角形判定
练习题4: 输入三个整数,判断这三个整数是否能组成三角形,能打印yes
//判断输入的三个数能否形成三角形
//三角形成立条件:1.三边都大于0
//2.任意两边之和大于第三边或任意两边之差小于第三边
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if((a+b)>c && (a+c)>b && (b+c)>a)
printf("yes\n");
else
printf("no!\n");
return 0;
}
/*法二:
int a,b,c;
if(abs(a-b)<c && abs(a-c)<b && abs(b-c)<a)
printf("yes!\n");
else
printf("no!\n");
*/
题目:2个数的排列输出
练习题5:输入两个数,从大到小依次输出
//输入两个数,按大小顺序输出
#include<stdio.h>
int main()
{
int a,b;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
printf("%d>%d\n",(a>b)?a:b,(a<b)?a:b);
return 0;
}
/*法二:
int a,b,temp;
if(a>b)
{
//交换a,b
temp = a;
a = b;
b = temp;
}
printf("%d<%d",a,b);
*/
题目:3个数的排列输出
练习题6:输入三个数,从大到小依次输出
/*题目:输入三个数,按从大到小排列好输出
思路:a,b先进行比较,使其大小是a<b,如若不是,
交换a,b的值,同理a再和c比较,使a<c,此时a<b且a<c,
再比较b,c,使b<c,就可得a<b<c*/
#include<stdio.h>
int main()
{
int a,b,c,temp;
scanf("%d %d %d",&a,&b,&c);
if(a>b)
{
temp = a;
a = b;
b = temp;
}
if(a>c)
{
temp = a;
a = c;
c = temp;
}
if(b>c)
{
temp = b;
b = c;
c = temp;
}
printf("%d>%d>%d\n",c,b,a);
return 0;
}
switch语句
易错点:
case后面只能是常量或常量表达式。
用法:
switch(表达式)
{
case 常量表达式1:
语句1; //可以是复合语句
case 常量表达式2:
语句2; //可以是复合语句
case 常量表达式3:
语句3; //可以是复合语句
case 常量表达式4:
语句4; //可以是复合语句
.......
default:
语句n;
}
依次往下面执行的原理:
表达式的值先要求出来,然后去和下面的常量表达式去比较*
匹配到表达式几 那么就从这里开始往下面执行
注意:如果匹配上常量表达式1
那么它执行的时候会将下面的所有的语句全部执行
语句1;
语句2;
语句3;
…
语句n;
直到执行到break或把switch里面的所有语句都执行完了才会跳出是switch
case可以共用语句
switch()
{
case 1:
case 2:
case 3:
语句;
}
题目:成绩等级判定
练习题1:判断成绩等级
90以上就是优秀
80~90良好
70~80一般
60~70合格
60以下不合格
//判断成绩等级
#include<stdio.h>
void fun(int n);
int main()
{
int n;
printf("请输入学生成绩:");
scanf("%d",&n);
if(n>100)
printf("成绩输入有误!\n");
else
fun(n);
return 0;
}
void fun(int n)
{
switch (n/10)
{
case 10:
case 9:
printf("优秀\n");break;
case 8: printf("良好\n");break;
case 7: printf("一般\n");break;
case 6: printf("合格\n");break;
default:printf("不合格\n");break;
}
}
题目:薪水提成计算
练习题2: 一个公司里面得薪水组成有提成这个环节
如果业绩是0 ~ 100000 提成5%
10w ~ 20w 提成是6%
20w ~ 40w 提成是8%
40w ~ 60w 提成是10%
60w ~ 80w 提成是12%
80w ~ 100w 提成是15%
100w以上的是20%
例:业绩110w 提成 = (110w-100w)*0.2 + 20w * 0.15 + 20w * 0.12 +20w * 0.1 + …+ 10w * 0.05
/*计算提成
思路:从大到小往下判断,如果业绩大于100w,那也一定大于80w*/
//方法1:使用if
#include<stdio.h>
#define P 0
int count(int money);
int main()
{
int money;
printf("请输入业绩:");
scanf("%d",&money);
printf("%d\n",count(money));
return 0;
}
int count(int money)
{
int tc;
if(money>1000000)
{
tc += (money - 1000000) * 0.2;
money = money - 1000000;
}
if(money>800000)
{
tc += (money - 800000) * 0.15;
money = money - 800000;
}
if(money>600000)
{
tc += (money - 600000) * 0.12;
money = money - 600000;
}
if(money>400000)
{
tc += (money - 400000) * 0.1;
money = money - 400000;
}
if(money>200000)
{
tc += (money - 200000) * 0.08;
money = money - 2000000;
}
if(money>100000)
{
tc += (money - 100000) * 0.06;
money = money - 100000;
}
if(money<100000)
{
tc += money * 0.05;
}
return tc;
}
//方法2:使用switch解决提成问题
#include<stdio.h>
int count(int money);
int main()
{
int money;
printf("请输入业绩:");
scanf("%d",&money);
printf("%d\n",count(money));
return 0;
}
int count(int money)
{
int tc;
switch (money/100000)
{
default:
case 10:
tc += (money-1000000)*0.2;
money = money -1000000;
case 9:
case 8:
tc += (money-800000)*0.15;
money = money -800000;
case 7:
case 6:
tc += (money-600000)*0.12;
money = money -600000;
case 5:
case 4:
tc += (money-400000)*0.1;
money = money -400000;
case 3:
case 2:
tc += (money-200000)*0.06;
money = money -200000;
case 1:
tc += money*0.05;
break;
}
return tc;
}