实验三选择结构程序设计(2学时)
目的要求
(1)掌握C语言的条件选择结构的编程(if、switch语句)。
(2)了解C语言表示逻辑量的方法(0代表逻辑假,1代表逻辑真)。
(3)学会正确的使用逻辑运算符和逻辑表达式。
(4)通过简单程序的编写进一步熟悉、巩固所学的理论知识。
上机内容
一般示例
【例1】下面的程序读入任意两个整数x、y,然后将两个数中的大数保存在x中,小数保存在y中。你能将程序中的空行补充完整吗?
# include <stdio.h>
void main( )
{
int x,y,t;
printf(input x,y:);
scanf (%d,%d , ) ;
if (x<y)
{
;
;
;
}
printf (result:%d\t%d\n,x,y);
}
【小提示】本题中要用到2个数的交换算法。这是一种常用算法,希望你能够理解、记住并加以灵活运用。
【例2】已知三个数a,b,c,找出最大值放于max中。
分析:由已知可得在变量定义时定义四个变量a,b,c和max,a,b,c是任意输入的三个数,max是用来存放结果最大值的。第一次比较a和b,把大数存入max中,因a,b都可能是大值,所以用if语句中if-else 形式。第二次比较max和c,把最大数存入max中,用if语句的第一种形式if形式。max即为a,b,c中的最大值。
#include stdio.h
void main()
{
int a,b,c,max;/*define four integer varibles*/
scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
if (a >= b)
max = a;/*a>=b*/
else
max = b;/*a<b*/
if (c > max)
max = c;/*c is the max*/
printf(max=%d, max);
}
若分别输入下列数据,分析程序的执行顺序并写出运行结果
【例3】输入某学生的成绩,经处理后给出学生的等级,等级分类如下:
90分以上(包括90): A
80至90分(包括80):B
70至80分(包括70):C
60至70分(包括60):D
60分以下:E
【方法一】用if嵌套
分析:由题意知如果某学生成绩在90分以上,等级为A;否则,如果成绩大于80分,等级为B;否则,如果成绩大于70分,等级为C;否则,如果成绩大于60分为D;否则,如果成绩小于60分,等级为E;但当我们输入成绩时也可能输错,出现小于0或大于100,这时也要做处理,输出出错信息。因此,再用if嵌套前,应先判断输入的成绩是否在0~100之间。
#includestdio.h
void main()
{
intscore;
chargrade;
printf(\nplease input a student score:);
scanf(%d,&score);
if (score>100 || score<0)
printf(\ninput error!);
else
{ if(score >= 90)
grade = 'A';
else
{ if( score >= 80)
grade = 'B';
else
{ if(score>=70)
grade='C';
else
{ if (score >= 60)
grade = 'D';
else grade = 'E';
}
}
}
printf(\nthe student grade:%c,grade);
}
}
输入测试数据,调试程序。测试数据要覆盖所有路径,注意临界值,例如此题中得100分,60分,0分以及小于0和大于100的数据。
【方法二】用switch语句
分析:switch 语句是用于处理多分支的语句。注意,case后的表达式必须是一个常量表达式,所以在以用switch语句之前,必须把0~100之间的成绩分别化成相关的常量。所有A(除100以外),B,C,D类的成绩的共同特点是十位数相同,此外都是E类。则由此可得把score除十取整,化为相应的常数。
#includestdio.h
void main()
{
int g,s;
char ch;
printf(\ninput a student grade:);
scanf(%d,&g);
s = g / 10;
if(s < 0 || s > 10)
printf(\ninput error!);
else
{
switch (s)
{
case 10:
case 9:ch = 'A';break;
case 8:ch = 'B';break;
case 7:ch = 'C';break;
case 6:ch = 'D';break;
default: ch = 'E';
}
printf(\nthe student scort:%c,ch);
}
}
输入测试数据,同【方法一】一样调试程序并写出结果。
【思考】通过本题,你能将if 语句和switch语句的用法好好总结一下吗?好好学习编程,将来,老师希望能用你编的程序来判定咱们班同学的成绩!
编程作业
1.本题是要练习短路求值。
int a = 0,b = 0,x;
x = 0 && (a = b = 777);
printf(“%d %d %d\n”,a,b,x);
x = 777 || (a = ++ b);
printf(“%d %d %d\n”,a,b,x);
![]() |
这段程序将输出什么?首先手工模拟运行,得到结果,然后编写一个测试程序,进行检验。
【思考】教材中有很多相关知识点的小程序段,你会编程进行测试、运行吗?通过自己编程来测试这些小程序段,你会理解的更深刻,掌握的更牢固!
2.鸡兔同笼
一个笼子里关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数nFeets(nFeets<32768),问笼子里面至少有多少只动物,至多有多少只动物?
【小提示】这是一个简单的计算问题。解决简单计算问题的基本过程包括将一个用自然语言描述的实际问题抽象成一个实际问题,继而编程实现计算过程,并将计算结果还原成对原来问题的解答。因此,首先要读懂问题,搞清输入和输出数据的含义,并通过输入输出的实际数据来验证自己的理解是否正确。
![]() | ![]() |
3.编写程序,根据输入的x,求下面的分段函数的值。
![]() | ![]() |
选做题
1.自守数(同构数)是其平方后尾数等于该数自身的自然数。例如:
25*25=62576*76=5776
任意输入一个自然数,判断是否自守数并输出:如:
25 yes 25*25=625
【思考】你考虑过如何求出一个给定的自然数N(如N=100)以内的所有的同构数吗?该怎样实现呢?学习了下一章循环之后,你就可以编出功能更加强大的程序了!不过,你得先把前面的基础打好!
2.某托儿所收2岁到6岁的孩子,2岁、3岁孩子进小班(Lower class);4岁孩子进中班(Middle class);5岁、6岁孩子进大班(Higher class)。编写程序(用switch语句),输入孩子年龄,输出年龄及进入的班号。如:输入:3,输出:age:3,enter Lower class。
3.给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字,例如原数为321,应输出123。(习题5.7)
好的编程习惯
1.稍复杂的表达式中要积极使用括号,以免优先级理解上的混乱以及二义性。
n = k++ + j; /*not good*/
n = (k++) + j; /*good*/
2.不很容易理解的表达式应分几行写。如:
n = (k++) + j;
应该写成:
n = k + j;
k++;
3.嵌套的if – else 语句要多使用{ }。