02选择结构程序设计.docx
《02选择结构程序设计.docx》由会员分享,可在线阅读,更多相关《02选择结构程序设计.docx(20页珍藏版)》请在冰豆网上搜索。
![02选择结构程序设计.docx](https://file1.bdocx.com/fileroot1/2022-11/24/f765dfe5-46b0-4f8e-9984-d11a423ade9a/f765dfe5-46b0-4f8e-9984-d11a423ade9a1.gif)
02选择结构程序设计
选择结构程序设计
作者巨同升
所谓选择结构程序,是指程序中的语句完全按照它们的排列次序执行。
顺序结构程序一般由四个部分组成:
1.定义变量部分;
2.已知变量赋值或输入部分;
3.未知变量求值部分;
4.输出结果部分。
顺序结构程序的编写方法,与求解物理题很相似。
1.变量相当于物理量,有几个物理量就定义几个变量。
并明确哪些变量是已知的,哪些变量是未知的。
2.给出已知变量的值。
若已知变量有明确的值,则用赋值语句给出;否则用输入语句获得。
3.根据已知变量与未知变量的关系,用赋值语句求得未知变量的值。
4.输出求得的未知变量的值。
选择结构程序设计
1、从键盘输入两个整数,求出最大数并输出。
解:
解法1:
⑴编程思路:
①首先定义变量,x,y存储两个整数,max存储求出的最大数。
②用输入语句输入变量x,y的值。
③若x>y,则变量max取x的值,否则取y的值。
④输出求得的变量max的值。
⑵源程序:
main()
{intx,y,max;
scanf("%d%d",&x,&y);
if(x>y)
max=x;
else
max=y;
printf("max=%d\n",max);
}
注意:
①else之后不能直接写条件,如不能写作else(x<=y),但可以写作elseif(x<=y)。
解法2:
⑴编程思路:
同解法1。
⑵源程序:
main()
{intx,y,max;
scanf("%d%d",&x,&y);
max=x>y?
x:
y;/*使用条件表达式判断求值*/
printf("max=%d\n",max);
}
2、从键盘输入一个实数,求其绝对值并输出。
解:
解法1:
⑴编程思路:
①首先定义变量,x存储该实数,y存储其绝对值。
②用输入语句输入变量x的值。
③若x>0,则变量y取x的值,否则取-x的值。
④输出求得的变量y的值。
⑵源程序:
main()
{floatx,y;
scanf("%f",&x);
if(x>=0)
y=x;
else/*否定x>=0,即x<0*/
y=-x;
printf("y=%f\n",y);
}
解法2:
⑴编程思路:
①首先定义变量x,先存储该实数,后存储其绝对值。
②用输入语句输入变量x的值。
③若x<0,则将变量x取负之后再存入x;否则x保持不变。
④输出求得的变量x的值。
⑵源程序:
main()
{floatx;
scanf("%f",&x);
if(x<0)
x=-x;
printf("y=%f\n",x);
}
3、从键盘输入x的值,求y的值并输出。
解:
解法1:
采用三条平行的if语句分别求值,每条if语句对应于一种情况(一个分支)。
⑴编程思路:
①首先定义变量x,y。
②用输入语句输入变量x的值。
③若x>0,则变量y取1;若x=0,则变量y取0;若x<0,则变量y取-1。
④输出求得的变量y的值。
⑵源程序:
main()
{floatx,y;
scanf("%f",&x);
if(x>0)
y=1;
if(x==0)/*等号不能写作=*/
y=0;
if(x<0)
y=-1;
printf("y=%f\n",y);
}
注意:
①if(x==0)不能写作if(x=0),因为后者表示赋值,x的值总为0,即条件总为假。
②在一组平行的if语句中,不管前边的if语句条件是真是假,后边的if语句总要执行。
解法2:
采用嵌套的if语句分别求值,共分为三种情况(三个分支)。
⑴编程思路:
①首先定义变量x,y。
②用输入语句输入变量x的值。
③若x>0,则变量y取1;否则若x=0,则变量y取0;否则若x<0,则变量y取-1。
④输出求得的变量y的值。
⑵源程序:
main()
{floatx,y;
scanf("%f",&x);
if(x>0)/*若满足x>0*/
y=1;
elseif(x==0)/*否定x>0,同时满足x=0*/
y=0;
else/*再否定x=0,必然是x<0*/
y=-1;
printf("y=%f\n",y);
}
注意:
①在两个嵌套的if语句中,只有前边的if语句条件是假(或者是真),后边的if语句才会执行。
4、从键盘输入三个整数,求出最大数并输出。
解:
解法1:
⑴编程思路:
①首先定义变量,a,b,c存储三个整数,max存储求出的最大数。
②用输入语句输入变量a,b,c的值。
③先求出前两个数中的最大数,并存入变量max中。
若a>b,则max取a的值,否则取b的值。
④再用第三个数与前两个数中的最大数比较,求出三个数中的最大数,并存入变量max中。
若c>max,则max取c的值,否则max保持不变。
⑤输出求得的变量max的值。
⑵源程序:
main()
{inta,b,c,max;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
max=a;
else
max=b;
if(c>max)/*该if语句与第一个if语句平行*/
max=c;
printf("max=%d\n",max);
}
解法2:
利用条件运算符求出三个数中的最大数。
⑴编程思路:
同解法1。
⑵源程序:
main()
{inta,b,c,max;
scanf("%d%d%d",&a,&b,&c);
max=a>b?
a:
b;
max=c>max?
c:
max;
printf("max=%d\n",max);
}
解法3:
⑴编程思路:
①首先定义变量,a,b,c存储三个整数,max存储求出的最大数。
②用输入语句输入变量a,b,c的值。
③若a>b同时a>c,则max取a的值。
若b>a同时b>c,则max取b的值。
若c>a同时c>b,则max取c的值。
④输出求得的变量max的值。
⑵源程序:
main()
{inta,b,c,max;
scanf("%d%d%d",&a,&b,&c);
if(a>b&&a>c)
max=a;
if(b>a&&b>c)/*或elseif(b>a&&b>c)*/
max=b;
if(c>a&&c>b)/*或elseif(c>a&&c>b)*/
max=c;
printf("max=%d\n",max);
}
注意:
①因为该程序中的三个条件是互相排斥的,即只有第一个条件为假时,才需要判断第二个条件;只有前两个条件均为假时,才需要判断第三个条件,故可以用三个嵌套的if语句进行判断。
②同时因为三个条件是相互独立、互不依赖的,故也可以用三个平行的if语句进行判断。
5、从键盘输入两个数,然后按升序输出。
解:
解法1:
⑴编程思路:
①首先定义变量,a,b存储两个数,t作为交换a,b的中间变量。
②用输入语句输入变量a,b的值。
③若a>b,则将变量a,b的值相交换,以保证a的值较小,b的值较大。
④按照先a后b顺序输出两个变量的值。
⑵源程序:
main()
{floata,b,t;
scanf("%f%f",&a,&b);
if(a>b)
{t=a;a=b;b=t;}
printf("%f,%f\n",a,b);
}
注意:
①用于交换变量a,b值的三条赋值语句,必须括起来作为一条复合语句。
即当条件为真时,三条赋值语句都执行;当条件为假时,三条赋值语句都不执行。
解法2:
⑴编程思路:
①首先定义变量a,b,用于存储两个数。
②用输入语句输入变量a,b的值。
③若a
⑵源程序:
main()
{floata,b;
scanf("%f%f",&a,&b);
if(a
printf("%f,%f\n",a,b);
else
printf("%f,%f\n",b,a);
}
6、从键盘输入三个整数,按升序排序后输出。
解:
⑴编程思路:
①首先定义变量,a,b,c存储两个数,t作为交换a,b,c的中间变量。
②用输入语句输入变量a,b,c的值。
③若a>b,则将变量a,b的值相交换,以保证a的值较小,b的值较大。
④若a>c,则将变量a,c的值相交换,以保证a的值较小,c的值较大。
此时变量a的值最小。
⑤若b>c,则将变量b,c的值相交换,以保证b的值较小,c的值较大。
此时变量a的值最小,变量b的值次之,变量c的值最大。
即a,b,c已按升序排序。
⑥输出变量a,b,c的值。
⑵源程序:
main()
{inta,b,c,t;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}/*三条赋值语句必须括起来*/
if(a>c)/*三条if语句相互平行*/
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("a=%d,b=%d,c=%d\n",a,b,c);}
注意:
①用于交换两个变量值的三条赋值语句,必须括起来作为一条复合语句。
即当条件为真时,三条赋值语句都执行;当条件为假时,三条赋值语句都不执行。
②因为后面的两个判断不应依赖于其前边判断,故必须用三个平行的if语句进行判断。
6、从键盘输入一个字符,若为小写字母,则转化为相应的大写字母,否则保持不变。
解:
解法1:
⑴编程思路:
①首先定义变量,ch1用于存储输入的字符,ch2用于存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch1。
③若ch1>='a'&&ch1<='z'(即ch1的值为小写字母),则将ch1-32(即转化为相应的大写字母)赋给ch2;否则直接将ch1赋给ch2。
④最后输出ch2的值。
⑵源程序:
#include
main()
{charch1,ch2;
ch1=getchar();/*或scanf("%c",&ch1);*/
if(ch1>='a'&&ch1<='z')/*不能写作if('a'<=ch1<='z')*/
ch2=ch1-32;
else
ch2=ch1;
putchar(ch2);/*或printf("ch2=%c\n",ch2);*/
}
注意:
①if(ch1>='a'&&ch1<='z')不能写作if('a'<=ch1<='z')。
解法2:
⑴编程思路:
①首先定义变量ch,先存储输入的字符,后存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch。
③若ch>='a'&&ch<='z'(即ch的值为小写字母),则将ch-32(即转化为相应的大写字母)再赋给ch;否则ch保持不变。
④最后输出ch的值。
⑵源程序:
#include
main()
{charch;
ch=getchar();/*或scanf("%c",&ch);*/
if(ch>='a'&&ch<='z')/*不能写作if('a'<=ch<='z')*/
ch=ch-32;
putchar(ch);/*或printf("ch=%c\n",ch);*/
}
7、从键盘输入一个字符,若为小写字母,则转化为相应的大写字母;若为大写字母,则转化为相应的小写字母,否则保持不变。
解:
解法1:
⑴编程思路:
①首先定义变量,ch1用于存储输入的字符,ch2用于存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch1。
③若ch1>='a'&&ch1<='z'(即ch1的值为小写字母),则将ch1-32(即转化为相应的大写字母)赋给ch2;否则,若ch1>='A'&&ch1<='Z'(即ch1的值为大写字母),则将ch1+32(即转化为相应的小写字母)赋给ch2;否则直接将ch1赋给ch2。
④最后输出ch2的值。
⑵源程序:
#include
main()
{charch1,ch2;
ch1=getchar();
if(ch1>='a'&&ch1<='z')
ch2=ch1-32;
else if(ch1>='A'&&ch1<='Z')/*此处else不能缺省*/
ch2=ch1+32;
else
ch2=ch1;
putchar(ch2);
}
注意:
①因为只有ch1不是小写字母时,才需要判断ch1是不是大写字母,故第二个if语句应嵌套在第一个if语句的else子句中。
②若第二个if语句与第一个if语句平行(即第二个if语句之前无else),则第二个if语句中的else仅否定第二个条件ch1>='A'&&ch1<='Z',即只要不是大写字母,ch2=ch1;都要执行。
显然与题目要求不符。
解法2:
⑴编程思路:
①首先定义变量ch,先存储输入的字符,后存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch。
③若ch>='a'&&ch<='z'(即ch的值为小写字母),则将ch-32(即转化为相应的大写字母)再赋给ch;否则,若ch>='A'&&ch<='Z'(即ch的值为大写字母),则将ch+32(即转化为相应的小写字母)再赋给ch;否则ch保持不变。
④最后输出ch的值。
⑵源程序:
#include
main()
{charch;
ch=getchar();
if(ch>='a'&&ch<='z')
ch=ch-32;
elseif(ch>='A'&&ch<='Z')/*此处else不能缺省*/
ch=ch+32;
putchar(ch);
}
注意:
①因为只有ch不是小写字母时,才需要判断ch是不是大写字母,故第二个if语句应嵌套在第一个if语句的else子句中。
②若第二个if语句与第一个if语句平行(即第二个if语句之前无else),则当输入一个小写字母(如’f’)时,先执行第一个if语句,因ch1>='a'&&ch1<='z'为真,故转化为相应的大写字母(如’F’);接着执行第二个if语句,又因此时ch1>='A'&&ch1<='Z'为真,故再转化为相应的小写字母(如’f’)。
显然与题目要求不符。
8、从键盘输入一个字符,若为小写字母,则转化为相应的大写字母;若为大写字母,则转化为相应的小写字母;否则转化为ASCII码表中的下一个字符。
解:
解法1:
⑴编程思路:
①首先定义变量,ch1用于存储输入的字符,ch2用于存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch1。
③若ch1>='a'&&ch1<='z'(即ch1的值为小写字母),则将ch1-32(即转化为相应的大写字母)赋给ch2;否则,若ch1>='A'&&ch1<='Z'(即ch1的值为大写字母),则将ch1+32(即转化为相应的小写字母)赋给ch2;否则将ch1+1(即转化为ASCII码表中的下一个字符)赋给ch2。
④最后输出ch2的值。
⑵源程序:
#include
main()
{charch1,ch2;
ch1=getchar();
if(ch1>='a'&&ch1<='z')
ch2=ch1-32;
else if(ch1>='A'&&ch1<='Z')/*此处else不能缺省*/
ch2=ch1+32;
else ch2=ch1+1;
putchar(ch2);
}
注意:
①第二个if语句应嵌套在第一个if语句的else子句中,而不能与第一个if语句平行。
解法2:
⑴编程思路:
①首先定义变量ch,先存储输入的字符,后存储转化之后的字符。
②用输入语句输入一个字符并存入变量ch。
③若ch>='a'&&ch<='z'(即ch的值为小写字母),则将ch-32(即转化为相应的大写字母)再赋给ch;否则,若ch>='A'&&ch<='Z'(即ch的值为大写字母),则将ch+32(即转化为相应的小写字母)再赋给ch;否则将ch+1(即转化为ASCII码表中的下一个字符)再赋给ch。
④最后输出ch的值。
⑵源程序:
#include
main()
{charch;
ch=getchar();
if(ch>='a'&&ch<='z')
ch=ch-32;
elseif(ch>='A'&&ch<='Z')/*此处else不能缺省*/
ch=ch+32;
else ch=ch+1;
putchar(ch);
}
注意:
①第二个if语句应嵌套在第一个if语句的else子句中,而不能与第一个if语句平行。
9、从键盘输入两个整数及一个运算符,分别求出其和差积商并输出。
(其中运算符在两个整数之间输入)
解法1:
⑴编程思路:
①首先定义变量,a,b存储两个整数,s存储两个整数的运算结果,ch存储运算符。
②用输入语句输入变量a,b,ch的值。
③若ch为加号,则s=a+b;若ch为减号,则s=a-b;若ch为乘号,则s=a*b;若ch为除号,则s=a/b。
④最后输出变量s的值。
⑵源程序:
main()
{inta,b,s;
charch;
scanf("%d%c%d",&a,&ch,&b);/*运算符在两个整数之间输入*/
if(ch=='+')s=a+b;/*单引号不可少*/
elseif(ch=='-')s=a-b;
elseif(ch=='*')s=a*b;
elseif(ch=='/')s=a/b;
printf("s=%d\n",s);
}
注意:
①因为四个判断相互排斥、互不依赖,故既可以采用嵌套的if语句进行判断,也可以采用平行的if语句进行判断。
解法2:
⑴编程思路:
同解法1。
⑵源程序:
main()
{inta,b,s;
charch;
scanf("%d%c%d",&a,&ch,&b);/*运算符在两个整数之间输入*/
if(ch=='+')s=a+b;/*单引号不可少*/
if(ch=='-')s=a-b;
if(ch=='*')s=a*b;
if(ch=='/')s=a/b;
printf("s=%d\n",s);
}
解法3:
⑴编程思路:
同解法1。
⑵源程序:
main()
{inta,b,s;
charch;
scanf("%d%c%d",&a,&ch,&b);/*运算符在两个整数之间输入*/
switch(ch)
{case'+':
s=a+b;break;/*case之后要有空格,单引号不可少*/
case'-':
s=a-b;break;
case'*':
s=a*b;break;
case'/':
s=a/b;
}
printf("s=%d\n",s);
}
10、从键盘输入一个百分制分数,将其转化为等级分输出。
解法1:
利用嵌套的if语句进行判断选择。
⑴编程思路:
①首先定义变量,score存储输入的百分制分数,ch存储转化后的等级分。
②用输入语句输入变量score的值。
③若score<=100同时score>=90,则ch赋值为'A';否则,若score>=80,则ch赋值为'B';否则,若score>=70,则ch赋值为'C';否则,若score>=60,则ch赋值为'D';否则,若score>=0,则ch赋值为'E'。
④最后输出变量ch的值。
⑵源程序:
main()
{intscore;
charch;
scanf("%d",&score);
if(score<=100&&score>=90)
ch='A';
elseif(score>=80)/*此处else不能缺省*/
ch='B';
elseif(score>=70)/*此处else不能缺省*/
ch='C';
elseif(score>=60)/*此处else不能缺省*/
ch='D';
elseif(score>=0)/*此处else不能缺省*/
ch='E';
printf("Gradeis%c\n",ch);
}
注意:
①因为后面的判断依赖于前面的判断,故必须采用嵌套的if语句进行判断。
解法2:
利用平行的if语句进行判断选择。
⑴编程思路:
①首先定义变量,score存储输入的百分制分数,ch存储转化后的等级分。
②用输入语句输入变量score的值。
③若score<=100同时score>=90,则ch赋值为'A';若score<90同时score>=80,则ch赋值为'B';若score<80同时score>=70,则ch赋值为'C';否则,若score<70同时score>=60,则ch赋值为'D';score<60同时score>=0则ch赋值为'E'。
④最后输出变量ch的值。
⑵源程序:
main()
{intscore;
charch;
scanf("%d",&score);
if(score<=100&&score>=90)
ch='A';
if(score<90&&score>=80)
ch='B';
if(score<80&&score>=70)
ch='C';
if(score<70&&score>=60)
ch='D';
if(score<60&&score>=0)
ch='E';
printf("Gradeis%c\n",ch);
}
注意:
①因为后面的判断不依赖于前面的判断,故可以采用平行的if语句进行判断。
同时由于后面的判断条件与前面的判断条件相互排斥,故也可以采用嵌套的if语句进行判断。
解法3:
利用switch语句进行判断选择。
⑴编程思路:
①首先定义变量,整型变量g存储输入的百分制分数,ch存储转化后的等级分。
②用输入语句输入变量g的值。
③通过g除以10(整除),将一个百分制分数转化为一个0到10之间的整数。
而且同一个分数段将转化为同一个整数,如90到99均转化为9。
④利用switch语句根据表达式g/10的值,跳转到相应的分支执行,求出变量ch的值。
⑤最后输出变量ch的值。
⑵源程序:
main()
{intg;/*g为整型变量*/
charch;
scanf("%d",&g);
switch(g/10)
{case10:
/*当g=100时,转到此处*/
case9:
ch='A';break;/*当g>=90且g<100时,转到此处*/
case8:
ch='B';break;/*当g>=80且g<90时,转到此处*/
case7:
ch='C';break;/*当g>=70且g<80时,转到此处*/
case6:
ch='D';break;/*当g