上机实验四 分支结构程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上机实验四分支结构程序设计
学号: 姓名:
一.目的要求
1.掌握运用关系运算和逻辑运算表示各种条件;
2.掌握字符型变量的定义方法和输入一个字符的方法;
3.掌握if语句的3种格式和使用方法;掌握switch语句的语法规则、执行流程;
4.掌握break语句在switch语句和循环语句中的作用。
二.实验内容
【实验题1】. 程序填充:输入年份year, 判断并输出该年份是否是闰年(leap year)?如输入2000,则显示“2000 is a leap year!”,输入2100,则显示“2100 is not a leap year!”. 提示:判断年份year是闰年的条件是:
(1) 能被400整除,或者
(2) 能被4整除但不能被100整除.
如何用逻辑或“||”和逻辑与“&&”,结合求余运算“%”以及关系运算“==”和“!=”表示该条件?
源程序:
编译、连接并运行该程序:如果输入2000,则显示Input year:2000 2000 is a leap year!;如果输入2008,则显示Input year:2008 2008 is a leap year!
;如果输入2100,则显示Input year:2100 2100 is not a leap year!。
【实验题2】程序填充:输入15个字符,统计英文字母、空格、数字和其它字符的个数。
源程序如下:
/* ch是英文字母*/
other++;
}
printf("digit=%d, letter=%d, blankr=%d, other=%d\n", digit,letter,blank,other);
}
编译、连接并运行程序,输入aB 5c&d *!221?, 则结果显示:
Enter 15 characters:aB 5c&d *!221?
digit=4,letter=4,blank=3,other=4
如果删除标有/*line 5 */的语句行,并将标有/*line 3*/的语句行改写为“int i,digit=blank=letter=other=0;”,重新编译时是否正确?系统提示什么?应如何修改这一行才能保证程序的正确性?
错误,digit letter,blank,other没有定义,int i,digit=0,blank=0,letter=0,other=0
【实验题3】程序设计:输入一个三位数的整数n,判断n是否为Amstrong数。
所谓Amstrong数,是指该数的个、十、百位上的数字的立方和恰好等于该数本身,如153,370,371和407都是Amstrong数。
【分析】难点1:如何解析出一个三位数n的个位数g、十位数s、百位数b?
~~三位数n除以10,余数正好是该整数的个位数,故可以用求余运算“%”求g,即g= n%10;
~~三位数n除以100,商正好是n的百位数,故可以用整除运算“/”求b, 即b= n/100;
~~三位数n除以10,商是n的百位与十位,再将该商除以10,余数正好是n的十位数s,即s= n/10%10;
难点2:已知n的个、十、百位数g,s,b,如何判断n是否是Amstrong数?~~个、十、百位数的立方和恰好等于该数本身,数学表达式是g3+s3+b3=n, C语言表达式应写为g*g*g+s*s*s+b*b*b==n。
请编写源程序:
#include<stdio.h>
#include<math.h>
void main()
{
int n,g,s,b;
printf("input n:");
scanf("%d",&n);
g=n%10;
b=n/100;
s=n/10%10;
if(pow(g,3)+pow(b,3)+pow(s,3)==n)
printf("%d是一个Amstrong数\n",n);
else
printf("%d 不是一个Amstrong数\n",n);
}
}
编译、连接并运行该程序,输入153,结果显示:Input n:153 153是一个Amstrong数;输入289,结果显示:Input n:289 289不是一个Amstrong数;输入407,结果显示:Input n:407 407是一个
Amstrong数。
【实验题4】.阅读程序并回答问题:输入一个百分制成绩,要求输出成绩等级“A”、“B”、“C”、“D”、“E”,其中90~100分为“A”,81~89分为“B”,70~79为“C”,60~69为“D”,60分以下为“E”。
源程序如下:
#include<stdio.h>
void main()
{ int score, s;
char grade; /*line 4*/
printf("Input a score(0~100): ");
scanf("%d",&score);
s= score/10; /*line 7*/
switch(s){ /*line 8*/
case 10: grade='A'; break; /*line 9*/
case 9 : grade='A'; break; /*line 10*/
case 8 : grade='B'; break; /*line 11*/
case 7 : grade='C'; break; /*line 12*/
case 6 : grade='D'; break; /*line 13*/
default: grade='E'; break; /*line 14*/
}
putchar(grade); /*line 16*/
}
编译、连接并运行该程序,测试结果如下:
问题1:在line 4中,为何将变量grade定义为char型?
字符变量
问题2:在line 7中,运算符“/”是整除还是普通的除法?变量s与变量score是什么关系?
普通除法,S等于SCORE除以10之后取整数部分
问题3:在line 8中,switch(s)能否改为“switch(score)”?
不能
问题4:如果将line 9改写为“case 10: ”,程序是否依然能正确地将100分对应为’A’?
能
问题5:如果删除line 14中的break语句,程序是否正确?
可以
问题6:如果删除line 9~line 14中所有的break语句,程序运行结果是否正常?
不正常,每个结果皆为E
问题7:在line 16中的函数putchar(grade)的功能是什么?将该行改写为“printf(" The grade is %c \n”, grade);”程序运行时显示结果有何不同?
输出最后的结果没有不同
问题8:如果用if语句实现该程序功能,程序应如何编写?
#include<stdio.h>
void main()
{
int score,s;
printf("Input a score(0~100):");
scanf("%d",&score);
s=score/10;
if(s==10)
printf("grade=A\n");
else if(s==9)
printf("grade=A\n");
else if(s==8)
printf("grade=B\n");
else if(s==7)
printf("grade=C\n");
else if(s==6)
printf("grade=D\n");
else
printf("grade=E\n");
}
【实验题5】程序填充:在100~999中找出一个最小的符合下列条件的整数:被3、5、7、9除得到的余数
(1)1程序中for语句的循环体是什么?
if(i%3==1||i%5==3||i%7==5||i%9==7)
(2)编译、连接并运行程序,结果是:100
(3)如果题目改为求100-999之间最大的、被3、5、7、9除得到的余数分别是1、3、5、7的数,for语句应修改为if(i%3==1||i%5==3||i%7==5||i%9==7)break; 。