完成下面实验内容,将程序清单或运行结果截图复制到实验文档中,以“学号+姓名+班级+实验2.doc”命名实验文档,将文档上传至课程中心。
一、 实验目的
1、 理解算法和结构化程序设计的基本概念 2、 掌握if,switch分支语句的使用
3、 掌握while语句,do…while语句,for语句的功能。 4、 掌握用循环结构实现累加、累乘、穷举等常用算法。 5、 掌握在循环结构程序中使用break语句和continue语句。 6、 锻炼调试程序的能力。
二、实验内容和实验要求
按实验指导书P148至P154的要求,完成实验3的实验内容及自测练习;按实验指导书P155至P160的要求,完成实验4的实验内容及自测练习。
1. P148-练习题1
⑴ 已知三条边a、b、c,求三角形面积。计算三角形面积的海伦公式:
areas(sa)(sb)(sc)
s1(abc) 2 ⑵ 要求
在C++中用标准函数sqrt计算平方根,此函数包含在math.h头文件中。 ⑶ 思路
该程序用到了C++中的数学标准函数sqrt。要用编译预处理命令#include,把math头文件包含进来。用cin输入流控制将三条边长输入给a、b、c 三个变量。计算后用cout输出流控制将面积输出。
⑷ 程序代码
#include int a,b,c; float s,area ; cout << \"输入三个边长:\"; 1 学号: 姓名: cin >> a >> b >> c; s =1.0/2*(a+b+c) ; area = sqrt(s*(s-a)*(s-b)*(s-c)) ; cout << \"area = \" << area << endl; return 0; } ⑸运行结果截图: 思考题及问题: ① 将程序中的“s=1.0/2*(a+b+c;”语句改为“s=1/2*(a+b+c);”,再进行编译、链接、运行,看结果如何。 1/2=0.5强制转化为1,故S恒等于(a+b+c) ② 将程序中的“area=sqrt(s*(s-a)*(s-b)*(s-c));”语句改为“area=sqrt(s(s-a)(s-b)(s-c));”,再进行编译、链接、运行,看结果如何。 错误,无法识别该语句含义 ③分析题目中,若输入(3、6、10)运行时有什么样的缺陷?修改程序保证任意输入的a,b,c的3个值均能代表三角形的三条边,求三角形的面积。 无法建立三角形却依然计算面积。 #include { s =1.0/2*(a+b+c) ; area = sqrt(s*(s-a)*(s-b)*(s-c)) ; cout << \"area = \" << area << endl;} return 0; } ④在③的基础上,若想求10个这样三角形的面积,怎么修改程序。 2. P150-练习题3 ⑴ 编程序,计算下面分段函数的值。 2x+10 (x<0) y= 8x+5 (0≤x≤10) 4x-10 (x>10) ⑵ 要求 ① 用键盘输入x的值。 ② 运行程序时,分别按x的值小于0、x的值在0到10之间、x的值大于10三种情况输入数据,检查输出的y值是否正确。 ⑶ 思路 该程序根据输入数据x的值不同,计算不同的函数表达式,并输出计算结果,显然需要采用分支结构实现,由于此分段函数只有3种情况,故可以采用if~else if~else多分支语句实现。如果情况比较多,如5种以上的情况,建议采用switch语句实现。 ⑷ 程序代码 #include 3 学号: 姓名: int main() { int x,y; cout << \"输入x的值:\"; cin >> x ; if(x<0) y=x+10; else if(x<=10) y=8*x+5; else y=4*x-10; cout << \" x= \" << x << \ return 0; } ⑸运行结果截图: 思考题及问题: 判断x的值在0~10之间可否使用表达式“0<=x<=10”?为什么?正确的表示方法是什么? 不能,使用该表达式时,该语句表示“x<=10||x>=0”即所有整数。应该为”0<=x&&x<=10” 3. P150-练习题4 ⑴ 输入并运行以下程序,分析程序的运行结果。 #include float x,y; x=2.2; y=x/2.0; y=y*2.0; if (y==2.2) cout << \"x==y\" << endl; if (x=y) cout << \"这是一个逻辑错误!\" << endl; 4 学号: 姓名: return 0; } ⑵运行结果截图: 思考题及问题: ① 为什么该程序的运行结果是输出“这是一个逻辑错误!”? 浮点数不允许判断是否相等,“x==y”的判断结果为假,不执行语句“cout<<\"x==y\"< 学号: 姓名: cout<<\"年 月:\"; cin>>year>>month; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:days=31;break; case 4: case 6: case 9: case 11:days=30;break; case 2:if (year%4==0&&year%100!=0||year%400==0) leap=1; else leap=0; if(leap) days=29; else days=28; } cout< 6 学号: 姓名: 求1—99所有奇数的和 运行结果截图: 思考题及问题: 答案: ① 将程序中的“sum=0; ”语句去掉可以吗? 不行,”sum=0:;“去除则程序运行不正常。 ② 将while循环语句改为do-while循环语句。 #include 7 学号: 姓名: 测试数据184和 36 运行结果截图: 思考题及问题: 答案: ① 将 if (m < n) { r=m; m=n; n=r; } 去掉,分别按m的值小于n的值情况输入数据,程序运行结果如下: ② 分别输入m或n的值为负数,程序运行结果如下: ③ 为什么在用辗转相除法求最大公约数时,输出结果是m,而不是r。 ④ 试将辗转相除法中的do-while循环语句,改为while循环语句实现。程序如下: 7. P153-练习题4 运行结果截图: 8 学号: 姓名: 思考题及问题: 答案: ① 如果输出10行的图形,应如何修改程序?程序代码如下: ② 如果输出图形向右平移25个字符位置,程序应该如何实现?程序代码如下: ③ 如果需将输出的两个图形并排打印,程序应如何实现?以输出图①和图②为例,应输出以下图形。(此题选做!) 9 学号: 姓名: 二、 自测练习 (P154:1、2、3、6必做,4、5选做;P160:1、2、3、4必做,5选做) 注意:解决问题的思路可以用文字描述,把解决问题的过程、步骤写出来即可,培 养大家思考的习惯,逐步锻炼编程能力。 1.自测练习一 计算机完成一项复杂的数学计算需要40,000s,编写程序,将其转换成几小时几分几秒的表示形式。 源程序文本: #include 2.自测练习二 输入三个边长,判断它们是否能构成三角形,如果不能,输出提示信息;否则判断它是直角、等边、等腰或普通三角形 提示: 1) 构成三角形的条件是:任意两边之和大于第三边。设三边为a、b和c,则条件为: (a+b)>c && (a+c)>b && (b+c)>a 2) 直角三角形条件: a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a 3) 等边三角形条件:a==b && b==c 4) 等腰三角形条件:a==b || a==c || b==c 源程序文本: #include 学号: 姓名: 3.自测练习三 编写一个程序,从键盘输入圆锥体的半径r和高度h,计算其体积。(可参考练习题2) 源程序文本: #include return 0; } 运行结果截图: 4.自测练习四 从键盘输入一个小于六位的正整数,判断它是几位数,并按照相反的顺序输出各位上的数字,例如输入2468,输出为8642。 提示:利用/和%运算符依次获取各位上的数字。设正整数为x,则个位上的数字为:x%10,而十位上的数字为:x/10%10,而百位上的数字为:x/100%10,而千位上的数字为:x/1000%10,….. 源程序文本: #include else if(a/100!=0)cout<<\"这是三位数\"< 提示: 1) 首先使a成为最大值。依次将a与b、c、d进行比较,若a小于它们,则交换它们的 值。 2) 使b成为第二大值。依次将b与c、d进行比较,若b小于它们,则交换它们的值。 3) 使c成为第三大值。将c与d进行比较,若c小于d,则交换它们的值。 按序输出a,b,c,d。 源程序文本: #include if (c 提示: 1) 方法一,利用if-else语句 2) 方法二,利用switch语句,需注意switch语句中的case只能是常整型。因此若假设 考试成绩grade一定为整型,可使用语句: switch (grade/10) { case 9: … case 8: … …… } 源程序文本: 方法一: #include