您的当前位置:首页正文

c++ 实验二

2022-11-06 来源:爱go旅游网
学号: 姓名:

完成下面实验内容,将程序清单或运行结果截图复制到实验文档中,以“学号+姓名+班级+实验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,求三角形面积。计算三角形面积的海伦公式:

areas(sa)(sb)(sc)

s1(abc) 2 ⑵ 要求

在C++中用标准函数sqrt计算平方根,此函数包含在math.h头文件中。 ⑶ 思路

该程序用到了C++中的数学标准函数sqrt。要用编译预处理命令#include,把math头文件包含进来。用cin输入流控制将三条边长输入给a、b、c 三个变量。计算后用cout输出流控制将面积输出。

⑷ 程序代码

#include using namespace std; #include \"cmath\" int main() {

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 using namespace std; #include \"cmath\" int main() { int a,b,c; float s,area ; cout << \"输入三个边长:\"; cin >> a >> b >> c; if(a+b<=c||b+c<=a||a+c<=b) cout<<\"无法组成三角形\"<学号: 姓名:

{ 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 using namespace std;

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 using namespace std; int main() {

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\"<运行结果截图: #include using namespace std; int main() { int year,month,days,leap; 5

学号: 姓名:

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 using namespace std; int main() { int n,sum; n=1; sum=0; do{sum=sum+n; n=n+2; } while(n<=99); cout<<\"sum=\"<读程序、分析程序的结果:

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 using namespace std; int main() {int x,h,m,s; cout<<\"输入时间(秒)\"<>x; h=x/3600; m=(x%3600)/60; s=x-3600*h-60*m; cout<学号: 姓名:

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 using namespace std; int main() { int a,b,c; cout<<\"请输入三个数:\"; cin>>a>>b>>c; if ((a+b)>c && (a+c)>b && (b+c)>a) {cout<<\"能构成三角形\"<11

学号: 姓名:

3.自测练习三

编写一个程序,从键盘输入圆锥体的半径r和高度h,计算其体积。(可参考练习题2)

源程序文本: #include using namespace std; int main() {float V,r,h; cout<<\"依次输入r,h\"<>r>>h; V=(3.14*r*r)*h*1/3; cout<<\"V=\"<学号: 姓名:

return 0; } 运行结果截图: 4.自测练习四

从键盘输入一个小于六位的正整数,判断它是几位数,并按照相反的顺序输出各位上的数字,例如输入2468,输出为8642。

提示:利用/和%运算符依次获取各位上的数字。设正整数为x,则个位上的数字为:x%10,而十位上的数字为:x/10%10,而百位上的数字为:x/100%10,而千位上的数字为:x/1000%10,…..

源程序文本: #include using namespace std; int main() {int a,A,B,C,D,E; cin>>a; A=a/10000%10; B=a/1000%10; C=a/100%10; D=a/10%10; E=a%10; { if(a/10000!=0) cout<<\"这是五位数\"<学号: 姓名:

else if(a/100!=0)cout<<\"这是三位数\"<设整型变量a、b、c、d分别存放从键盘输入的4个整数。编写C++程序,按从大到小排列这4个数,使a成为最大值,d成为最小值,并且按序输出这4个数。

提示:

1) 首先使a成为最大值。依次将a与b、c、d进行比较,若a小于它们,则交换它们的

值。

2) 使b成为第二大值。依次将b与c、d进行比较,若b小于它们,则交换它们的值。 3) 使c成为第三大值。将c与d进行比较,若c小于d,则交换它们的值。 按序输出a,b,c,d。 源程序文本: #include using namespace std; int main() {int a,b,c,d,e; cin>>a>>b>>c>>d; if(a学号: 姓名:

if (c输入某学生的考试成绩,如果在90分以上,输出“优秀”;80~89分输出“良好”;70~79分输出“中等”;60~69分输出“及格”;60分以下输出“不及格”。

提示:

1) 方法一,利用if-else语句

2) 方法二,利用switch语句,需注意switch语句中的case只能是常整型。因此若假设

考试成绩grade一定为整型,可使用语句: switch (grade/10) { case 9: … case 8: … …… }

源程序文本: 方法一: #include using namespace std; int main() {int g; cin>>g; if(g>=90) cout<<\"优秀\"<=80) cout<<\"良好\"<=70)cout<<\"中等\"<=60)cout<<\"及格\"<学号: 姓名:

return 0; } 方法二: #include using namespace std; int main() {int a; char g; cout<<\"输入成绩:\"; cin>>a; switch(a/10) { case 10: case 9:g='A';break; case 8:g='B';break; case 7:g='C';break; case 6:g='D';break; default:g='E';break; } cout<<\"成绩为\"<P147的自测练习题1:输入并运行以下程序,分析程序的运行结果。

16

学号: 姓名:

#include using namespace std; int main() { int a=5; double x=0.0; float f=10; char c=’\\141’;

cout << sizeof(char) <<\",\"<运行结果截图:

8.自测练习8

P147的自测练习题2:输入并运行以下程序,分析程序的运行结果。

#include using namespace std;

17

学号: 姓名:

int main()

{ int a=6,b=6;

cout << a <<\",\"<< ++a << \"\\n\"; cout << b <<\",\"<< b++ << \"\\n\";

return 0; }

运行结果截图: 9.p160-自测练习一

编写一个程序,统计输出各位数之和为9,且能被5整除的五位数的个数。 注意:表述“n能被5整除”的条件表达式唯一吗?试写出2种以上。

解决问题的思路: 方法1: 方法2: 源程序文本: 方法1:#include using namespace std; int main() {int i,j,k,l,m,t=0; for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) for(l=0;l<=9;l++) for(m=0;m<=9;m++) 18

学号: 姓名:

if(((10000*i+1000*j+100*k+10*l+m)%5==0)&&(i+j+k+l+m)==9) t++; cout<<\"各位数之和为9,且能被5整除的五位数的个数为:\"<编写一个程序,求s=1+(1+2)+(1+2+3)+„+(1+2+3+„+n)的值。 解决问题的思路:

源程序文本: #include using namespace std; int main() {int j,i,t; int s=0; cin>>t; for(i=1;i<=t;i++) for(j=1;j<=i;j++) s=s+j; 19

学号: 姓名:

cout<编写一个程序,求s=4!+6!+8!。 解决问题的思路:

源程序文本: #include using namespace std; int main() {int i,n,s; int a=1,b=1,c=1; for(n=2;n<=2;n++) for(i=1;i<=n;i++) a=a*i; for(n=2;n<=3;n++) for(i=1;i<=n;i++) b=b*i; 20

学号: 姓名:

for(n=2;n<=4;n++) for(i=1;i<=n;i++) c=c*i; s=a+b+c; cout<编写一个程序,求出1~1000之间的所有完全数。所谓完全数是指:该数的各因子之和正好等于该数本身,如6=1+2+3。

解决问题的思路: 源程序文本: #include using namespace std; int main() { int i,j,n; for(n=1;n<=1000;n++) { 21

学号: 姓名:

j=0; for(i=1;i计算π的近似值,π的计算公式为:

224262(2n)2 2133557(2n1)(2n1)要求:精度为10-5,并输出n的大小

解决问题的思路: 构建函数

源程序文本:

22

学号: 姓名:

#include #include using namespace std; float cjh(int x); int main() { int i = 0; float s1=1. ,s2=2. ; while(fabs(s2-s1)>1.0e-5) { i++; s1= cjh(i); s2= cjh(i+1); } cout<<\"π=\"<学号: 姓名:

四、程序调试练习

以下程序存在错误。有的是逻辑错误,有的是语法错误。利用VC编程环境对程序进行调试,找到错误并改正。

程序1:程序功能:编写程序,求100个自然数的和。即: s=1+2+3+ … +100;运行下列程序后,能否得到正确结果。(提示:利用VC的调试功能跟踪运行定位运行错误!)

#include

using namespace std; int main( ) {

int n,sum; n=1; sum=0;

while (n<=100); sum=sum+n; n ++;

cout <<\"sum=\"<分析错误原因,改正: While 语句后括号不加 “;” 。Sum=sum+n后改为“,” #include using namespace std; int main( ) { int n,sum; n=1; sum=0; while (n<=100) sum=sum+n, 24

学号: 姓名:

n ++; cout <<\"sum=\"<程序2:程序功能:对任意的10个正整数求和,并输出结果。

#include using namespace std; int main( ) {

int n,sum;

for (n=1,s=0; n<10; n++ ) { cin >>x; if (x<0) break; s+=x; }

cout<<”10个正整数之和为:”<不能出正常结果,分析错误原因,并改正: sum全改为s,使之有定义。 从n=0开始循环,才够循环10次。 If语句缺少else转折。 #include using namespace std; int main( ) { int n,sum,x; for (n=0,sum=0; n<10; n++ ) { cin >>x; if (x<0) break; else sum+=x; } cout<<\"10个正整数之和为:\"<学号: 姓名:

程序3:判断任意输入的三个数,判断它们是否能构成三角形,如果不能,输出提示信息;否则判断它是直角、等边、等腰或普通三角形

#include using namespace std; int main() {

int a,b,c;

cout<<\"请输入三个数:\"; cin>>a>>b>>c;

if ((a+b)>c && (a+c)>b && (b+c)>a)

cout<<\"能构成三角形\"; {

if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a) cout<<\"它是直角三角形\"; else if(a==b && b==c) cout<<\"它是等腰三角形\"; else if(a==b || a==c || b==c) cout<<\"它是等边三角形\"; } else

cout<<\"不能构成三角形\"; return 0; }

改正后代码如下:

#include using namespace std; int main() { int a,b,c; cout<<\"请输入三个数:\"; cin>>a>>b>>c; if ((a+b)>c && (a+c)>b && (b+c)>a) {cout<<\"能构成三角形\"<学号: 姓名:

if(a==b || a==c || b==c) cout<<\"它是等边三角形\"<27

因篇幅问题不能全部显示,请点此查看更多更全内容