导图社区 c语言程序设计第三章选择结构
c语言程序设计第三章选择结构的思维导图,包含用if语句实现选择结构、 if的嵌套、if...else的配对原则、if 的程序设计专题、switch结构等。
编辑于2021-10-25 19:33:44c语言程序设计第三章 选择结构
分为二选一与多选一
3.1 用if语句实现选择结构
三种格式及执行过程
常用的三种格式是单分支,双分支和多分支。
单分支if(表达式)语句1;
双分支 if(表达式)语句1;else 语句2;
多分支if条件语句的格式是: if(表达式)语句1;else if(表达式2)语句2; if(表达式3)语句3;else if(表达式n)语句n;else 语句 n+1;
if语句的功能是判断所给的条件,选择执行其中一个操作。if语句的第一种形式if(表达式)语句1;
表达式可以是任意类型合法的表达式,取其值的逻辑值(非零为真,零为假)这里的语句是指:c语句的五大句型之一
注意 1 if 或else只能控制其后的一条语句。2 if(x)等价于 if(x!=0) if(!)
if(x)解释
假设 x 等于0,则该表达式为假
假设 x 为非零值,则该表达式为真。即if (x)等价于if(x!=0)
if(!x)解释
假设 x 取0值,则表达式x为真
假设 x 取!0值时,则表达式!x为假,
即if(!x)等价于if(x==0)
3.2 if的嵌套
if(表达式1){if(表达式2)语句1;else 语句2;} else
if (表达式){if(表达式2)语句1;else 语句2;} else {if(表达式3)语句3; else语句4;}
3.3 if...else的配对原则
else总是和它上面的,离它最近的,且尚未配对的 if 来配对
3.4 if 的程序设计专题
1 求一个数的绝对值
#include <stdio.h> main (){ int a,y; scanf("%d",&a); if(a>0) y=a; else y=a*-1; printf("绝对值为%d",y); }
#include <stdio.h> main (){ int a,y; scanf("%d",&a); if(a>0) y=a; else y=a*-1; printf("绝对值为%d",y); }
2 将用户输入的字母进行大小写转换。
#include <stdio.h> main (){ char ch; ch=getchar(); if(ch>='A'&&ch<='Z') ch+=32; else ch-=32; putchar(ch); }
#include <stdio.h> main (){ char ch; ch=getchar(); if(ch>='A'&&ch<='Z') ch+=32; else ch-=32; putchar(ch); }
3 判断某一年是否为闰年 闰年成立的条件为:能被4整除不能被100整除 或者能被400整除。
#include <stdio.h> main() { int x,y; scanf("%d",&x); y=x%4; if(x%4==0&&x%100!=0||x%400==0) printf("%d年是闰年",x); else printf("%d年不是闰年",x); }
#include <stdio.h> main() { int x,y; scanf("%d",&x); y=x%4; if(x%4==0&&x%100!=0||x%400==0) printf("%d年是闰年",x); else printf("%d年不是闰年",x); }
4 判断一个数是否为水仙花数 水仙花数是指: 各个位的立方之和恰好等于该数。
#include <stdio.h> main() { int x,y,z,q; scanf("%d",&q); x=q/100; y=(q%100)/10; z=q%10; printf("%d %d %d\n",x,y,z); if(x*x*x+y*y*y+z*z*z==q) printf("%d是水仙花数",q); else printf("%d不是水仙花数",q); }
#include <stdio.h> main() { int x,y,z,q; scanf("%d",&q); x=q/100; y=(q%100)/10; z=q%10; printf("%d %d %d\n",x,y,z); if(x*x*x+y*y*y+z*z*z==q) printf("%d是水仙花数",q); else printf("%d不是水仙花数",q); }
5 有一函数 y={x x<0 ; 2x-1 0< = x <10 ;3x-11 x>10 写一程序 输入x值,输出y
方法1 #include <stdio.h> main() { double x,y; scanf("%lf",&x); if(x>10){ y=3*x-11; printf("%lf",y);} else if(x>=0){ y=2*x-1; printf("%lf",y);} else if(x<0){ y=x; printf("%lf",y);} }
#include <stdio.h> main() { double x,y; scanf("%lf",&x); if(x>10){ y=3*x-11; printf("%lf",y);} else if(x>=0){ y=2*x-1; printf("%lf",y);} else if(x<0){ y=x; printf("%lf",y);} }
6 求三个数的最大值和最小值
第一种 #include <stdio.h> main (){ int a,b,c,max,min; scanf("%d%d%d",&a,&b,&c); max=a; min=a; if(a>b) min=b; else max=b; if(a>c) min=c; else max=c; if(b>c) min=b; else max=c; printf("max=%d min=%d",max,min); } 第二种 #include <stdio.h> main (){ int a,b,c,d; scanf("%d%d%d",&a,&b,&c); if(a>b) ; else {d=b;b=a;a=d;}; if(b>c) ; else {d=b;b=c;c=d;}; if(a>c) ; else {d=c;c=a;a=d;}; printf("%d,%d,%d",a,b,c); }
最值得算法———打擂台算法
设某一个为擂主,常设第一个数为擂主
后续的种子选手依次与擂主进行比较。
第一种 #include <stdio.h> main (){ int a,b,c,max,min; scanf("%d%d%d",&a,&b,&c); max=a; min=a; if(a>b) min=b; else max=b; if(a>c) min=c; else max=c; if(b>c) min=b; else max=c; printf("max=%d min=%d",max,min); } 第二种 #include <stdio.h> main (){ int a,b,c,d; scanf("%d%d%d",&a,&b,&c); if(a>b) ; else {d=b;b=a;a=d;}; if(b>c) ; else {d=b;b=c;c=d;}; if(a>c) ; else {d=c;c=a;a=d;}; printf("%d,%d,%d",a,b,c); }
从键盘上输入3个整数,输出较小的两个数之和。
#include <stdio.h> main (){ int a,b,c,d,e; scanf("%d%d%d",&a,&b,&c); d=a; //d为最大 if(b>d) d=b; if(c>d) d=c; if(a>d) d=a; e=a+b+c-d; printf("最小两数之和为%d",e); }
#include <stdio.h> main (){ int a,b,c,d,e; scanf("%d%d%d",&a,&b,&c); d=a; //d为最大 if(b>d) d=b; if(c>d) d=c; if(a>d) d=a; e=a+b+c-d; printf("最小两数之和为%d",e); }
输入三个数,将其从小到大排列
#include <stdio.h> main (){ int a,b,c,d; scanf("%d%d%d",&a,&b,&c); if(a>b) ; else {d=b;b=a;a=d;}; if(b>c) ; else {d=b;b=c;c=d;}; if(a>c) ; else {d=c;c=a;a=d;}; printf("%d,%d,%d",a,b,c); }
#include <stdio.h> main (){ int a,b,c,d; scanf("%d%d%d",&a,&b,&c); if(a>b) ; else {d=b;b=a;a=d;}; if(b>c) ; else {d=b;b=c;c=d;}; if(a>c) ; else {d=c;c=a;a=d;}; printf("%d,%d,%d",a,b,c); }
给出一个百分制成绩,要求输出其相应的等级。规定:90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
#include <stdio.h> main(){ int a; scanf("%d",&a); switch(a/10){ case 9: printf("%d的等级为A\n",a);break; case 8: printf("%d的等级为B\n",a);break; case 7: printf("%d的等级为C\n",a);break; case 6: printf("%d的等级为D\n",a);break; case 5: printf("%d的等级为E\n",a);break; } }
#include <stdio.h> main(){ int a; scanf("%d",&a); switch(a/10){ case 9: printf("%d的等级为A\n",a);break; case 8: printf("%d的等级为B\n",a);break; case 7: printf("%d的等级为C\n",a);break; case 6: printf("%d的等级为D\n",a);break; case 5: printf("%d的等级为E\n",a);break; } }
输入年,月,日,计算并输出该天是对应年份的第几天。
#include <stdio.h> main(){ int a,b,c,d,e; scanf("%d%d%d",&a,&b,&c); //d=(a%4==0&&a%100!=0||x%400==0?29:28); if(a%4==0&&a%100!=0||a%400==0) d=29;else d=28; switch(b){ case 1: e=c;printf("%d\n",e);break; case 2: e=31+c;printf("%d\n",e);break; case 3: e=31+d+c;printf("%d\n",e);break; case 4: e=31+d+31+c;printf("%d\n",e);break; case 5: e=31+d+31+30+c;printf("%d\n",e);break; case 6: e=31+d+31+30+31+c;printf("%d\n",e);break; case 7: e=31+d+31+30+31+30+c;printf("%d\n",e);break; case 8: e=31+d+31+30+31+30+31+c;printf("%d\n",e);break; case 9: e=31+d+31+30+31+30+31+31+c;printf("%d\n",e);break; case 10: e=31+d+31+30+31+30+31+31+30+c;printf("%d\n",e);break; case 11: e=31+d+31+30+31+30+31+31+30+31+c;printf("%d\n",e);break; case 12: e=31+d+31+30+31+30+31+31+30+31+30+c;printf("%d\n",e);break; } } 精简版 #include <stdio.h> main(){ int year,month,day,days=0,d2;//days表示满月天数 scanf("%d%d%d",&year,&month,&day); d=(year%4==0&&year%100!=0||year%400==0?29:28); switch(month-1){ case 11: days=days+30; case 10: days=days+31; case 9: days=days+30; case 8: days=days+31; case 7: days=days+31; case 6: days=days+30; case 5: days=days+31; case 4: days=days+30; case 3: days=days+31; case 2: days=days+d2; case 1: days=days+31;
#include <stdio.h> main(){ int a,b,c,d,e; scanf("%d%d%d",&a,&b,&c); //d=(a%4==0&&a%100!=0||x%400==0?29:28); if(a%4==0&&a%100!=0||a%400==0) d=29;else d=28; switch(b){ case 1: e=c;printf("%d\n",e);break; case 2: e=31+c;printf("%d\n",e);break; case 3: e=31+d+c;printf("%d\n",e);break; case 4: e=31+d+31+c;printf("%d\n",e);break; case 5: e=31+d+31+30+c;printf("%d\n",e);break; case 6: e=31+d+31+30+31+c;printf("%d\n",e);break; case 7: e=31+d+31+30+31+30+c;printf("%d\n",e);break; case 8: e=31+d+31+30+31+30+31+c;printf("%d\n",e);break; case 9: e=31+d+31+30+31+30+31+31+c;printf("%d\n",e);break; case 10: e=31+d+31+30+31+30+31+31+30+c;printf("%d\n",e);break; case 11: e=31+d+31+30+31+30+31+31+30+31+c;printf("%d\n",e);break; case 12: e=31+d+31+30+31+30+31+31+30+31+30+c;printf("%d\n",e);break; } } 精简版 #include <stdio.h> main(){ int year,month,day,days=0,d2;//days表示满月天数 scanf("%d%d%d",&year,&month,&day); d=(year%4==0&&year%100!=0||year%400==0?29:28); switch(month-1){ case 11: days=days+30; case 10: days=days+31; case 9: days=days+30; case 8: days=days+31; case 7: days=days+31; case 6: days=days+30; case 5: days=days+31; case 4: days=days+30; case 3: days=days+31; case 2: days=days+d2; case 1: days=days+31;
3.5switch结构
switch(表达式) { case 常量表达式1:语句1;(break;) case 常量表达式2:语句2;(break;) case 常量表达式3:语句3;(break;) case 常量表达式4:语句4;(break;) case 常量表达式n:语句n;(break;) default:语句n+1; }
switch表达式的值,是case后面常量表达式的可能取值
switch后的表达式值的类型一般为整型或字符型
case子句后的常量必须为简单的整型或字符型常量
当执行完一个分支的执行语句后若没有遇到break,程序将无条件的继续执行后面所有的分支语句直到遇到break后,程序将退出所在的switch结构。
switch语句可以嵌套