当前位置:首页 >> 数学 >> 实验2 (1)参考答案

实验2 (1)参考答案


实验 2

用 C++实现面向过程的程序设计(1)
参看答案

1、 完成下列实验并按照要求写出相关程序和分析
(1) 阅读并上机实现课本 P16 “1.44 VC++6 下的 C++程序实现实例”的内容,学习单文 件和多文件程序的实现方法。 答:(略) (2) 建立一个单文件程序,文件名为 exp1_1.cpp,文件内

容如下: #include <iostream> using namespace std; void swap (int x,int y); int main( ) { int x=10,y=20; cout<<"Before swap, x="<<x<<" y="<<y<<endl; swap (x,y); cout<<"After swap, x="<<x<<" y="<<y<<endl; return 0 ; } void swap (int x,int y) { int t=x; x=y; y=t; } ① 首先在本地盘上建立一个自己学号的目录,然后进入编程环境(本教材中默认为 VC++6.0) ,在此编辑源文件,然后再编译、链接并运行程序,观察自己目录下生成文件夹 和文件的情况,观察运行结果。 ? 程序编译(compile)后生成文件: .dsp 文件 :VC 开发环境生成的工程文件,文本格式。 .ncb 文件 : 是 NCB “No Compile Browser” 的缩写, 其中存放了供 ClassView、 WizardBar 和 Component Gallery 使用的信息,由 VC 开发环境自动生成。无编译浏览文件。当自动 完成功能出问题时可以删除此文件。编译工程后会自动生成), .plg 文件:编译信息文件,编译时的 error 和 warning 信息文件 生成文件夹 debug 和文件: .OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。 .PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已 经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程 的速度。 .idb 文件:记录了哪些文件是修改过的,需要重新编译的。(对于 VC60 编译的文件是 VC60.IDB)
1

.PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快 调试过程的速度。记录了程序有关的一些数据和调试信息。 ? 程序连接(builde)后又生成文件: .ILK:连接过程中生成的一种中间文件,只供 LINK 工具使用。 .exe:可执行程序 ? 运行结果为: Before swap, x=10 y=20 After swap, x=10 y=20 Press any key to continue ? 关闭上述程序工作空间或退出 VC++6.0,会生成文件: .dsw:VC 开发环境生成的项目文件,用来把多个工程组织到一个项目中,文本格式。 .dsp 文件、.ncp 文件、.opt 文件更新 ② 根据调试器的使用方法,对以上程序的运行进行单步跟踪。注意:在运行到语句 swap (x,y);时使用 F11 键(Step Into)跟踪,观察 swap 函数执行的每一步各变量的变化情况;其 余语句处使用 F10 键(Step Over)跟踪,记录实际参数 x、y 的内存地址&x、&y,以及 x、 y 在调用 swap 函数前后的变化情况;记录形式参数 x、y 的内存地址&x、&y,注意与实际 参数的地址是否相等,以及形式参数 x、y 在调用 swap 函数过程中的变化情况,解释实际 参数未能发生交换的原因。 ? ? 实际参数 x、y 的地址分别为:0x0012ff44, 0x0012ff40, 运行到 swap (x,y);时,形 式参数 x、y 的地址分别为:0x0012feec, 0x0012fef0, 实参和形参的地址不同。 实际参数 x、 在调用 swap 函数前后的没有变化。 y 实际参数未能发生交换的原因是 swap 函数的参数是“传值” ,即只传递“实参值”到形式参数,交换的是形式参数的值,不 会影响实际参数的值。

③ 将上述程序代码中函数原型声明及函数定义首部的 void swap (int x,int y)修改为 void swap (int &x,int &y),再次运行程序,观察运行结果。 ? 修改程序后运行的结果表明实际参数的值发生了交换。

④ 采用与第② 步同样的方法作单步跟踪,记录实际参数 x、y 的内存地址&x、&y,以及 x、 y 在调用 swap 函数前后的变化情况;记录形式参数 x、y 的内存地址&x、&y,注意与实 际参数的地址是否相等,以及形式参数 x、y 在调用 swap 函数过程中的变化情况,解释 实际参数发生了交换的原因。 ? 修改程序后运行的结果表明实际参数的值发生了交换,这是因为 swap 函数的参数是 “传地址” 实参的地址传递给了形参, , 形式参数 x、 的地址: y 0x0012ff44, 0x0012ff40 等同于实际参数的地址,所以交换形式参数的值就等同于交换了实际参数的值。

⑤ 在上一步的基础上,将函数原型声明及函数定义首部的 void swap (int &x,int &y)修改为 int& swap (int &x,int &y),同时在该函数体的最后增加一条 return y;语句,在主函数中将调 用语句 swap (x,y);修改为 swap (x,y)=100;,观察程序的运行结果,理解引用作为函数返回 值的特殊用法。 ? 修改程序后运行的结果为:

2

Before swap, x=10 y=20 After swap, x=20 y=100 Press any key to continue 说明当引用作为函数返回值类型时,返回的是 y 的地址,作为地址的式子 swap (x,y)可 以放到赋值语句的左部,因此,语句 swap (x,y)=100;给 y 重新赋值为 100,所以最后的 输出结果是 y 的值变成了 100. ⑥ 再将上述代码中函数原型声明及函数定义首部的 int& swap (int &x,int &y) 修改为 void swap (int *x,int *y), 同时将函数体内的第一条语句 int t=x;修改为 int *t=x;并将 return y;从函 数体内删除,主函数中的调用语句由 swap (x,y)=100; 修改为 swap (&x,&y);,再次运行程 序,观察运行结果。 ? 修改程序后运行的结果为: Before swap, x=10 y=20 After swap, x=10 y=20 Press any key to continue

⑦ 采用与第② 步同样的方法作单步跟踪,记录实际参数 x、y 的内存地址&x、&y,以及 x、 y 在调用 swap 函数前后的变化情况;记录形式参数 x、y 的内存地址值在调用 swap 函数过 程中的变化情况,解释实际参数未发生交换的原因。 ? ? 实际参数 x、y 的地址分别为:0x0012ff44, 0x0012ff40, 运行到 swap (x,y);时,形 式参数 x、y 的地址分别为:0x0012feec, 0x0012fef0, 实参和形参的地址不同。 实际参数 x、y 在调用 swap 函数前后的值没有变化。实际参数值未能发生交换的原因 是 swap 函数体中,进行了形式参数的交换(形式参数的值是地址) ,没有对形参指向 的地址内容进行交换,所以不会影响实际参数的值。

⑧ 在上一步的基础上,不修改函数原型,仍以指针作形式参数,修改 swap 函数的代码, 使实际参数能发生值的交换。 ? 修改函数原型为: void swap (int *x,int *y) { int t=*x; *x=*y; *y=t; } 完成了实际参数值的交换。 (3) 完 成 课 本 P23 example2_01.cpp 程 序 、 P27 example2_04.cpp 程 序 、 P29 example2_05.cpp 程序、 P30 example2_06.cpp 程序、 P31 example2_07.cpp 程序、 P32 example2_08_1.cpp 程序、P34 example2_09.cpp 程序的“思考与练习” 答:(略)见《面向对象程序设计及 C++实验指导(第 2 版) 》中相关内容

2、写出下列程序的功能和运行结果
(1) #include <iostream> #include <cmath>
3

using namespace std; bool is_prime(int n);//函数声明 void print_prime(int n, int count);//函数声明 int main() { int i,n,count=1; cout << "请输入一个正整数:"; cin >> n; //从键盘输入一个正整数 if (n < 2) return -1; cout << 2 << ","; //输出第一个素数; for (i=3; i<n; i+=2) { if (is_prime(i)) { count++; print_prime(i, count); } } cout << endl; return 0; } bool is_prime(int n) { int i,j; for (i=2, j=sqrt(n); i<=j; i++) if (n%i == 0) return false; return true; } void print_prime(int n, int count) { cout << n << ','; if (count % 6 == 0) cout << endl; } 答:该程序的运行结果为: 请输入一个正整数:22 2,3,5,7,11,13, 17,19, Press any key to continue 该程序的功能是输出小于给定正整数 n(n≥2)的所有素数,以每行 6 个素数的格式输出。 其中函数 is_prime(i)的功能是判断 i 是否为素数, 如果是, 则返回 TRUE, 否则返回 FLASE.。 函数 print_prime(int n, int count)的功能是输出 n 的值, 并在 count 的值为 6 的倍数时输出 换行。 (2) #include <iostream.h> #include <iomanip.h> int get_volume(int length, int width = 2, int height = 3); int main() {int x = 10, y = 12, z = 15;

4

cout << "The volume of box (" ; cout << ") is "<<get_volume(x, y, z) <<"."<< endl; cout << "The volume of box (" ; cout << ") is "<<get_volume(x, y) <<"."<< endl; cout << "The volume of box (" ; cout << ") is "<<get_volume(x) <<"."<< endl; cout << "The volume of box (" ; cout << ") is "<<get_volume(x,7) <<"."<< endl; cout << "The volume of box (" ; cout << ") is "<<get_volume(5,5,5) <<"."<< endl; return 0; } int get_volume(int length, int width, int height) { cout<<setw(5)<<length <<setw(5)<<width<<setw(5)<<height<<' '; return length * width * height; } 答:该程序的运行结果为: The volume of box ( 10 12 15 ) is 1800. The volume of box ( 10 12 3 ) is 360. The volume of box ( 10 2 3 ) is 60. The volume of box ( 10 7 3 ) is 210. The volume of box ( 5 5 5 ) is 125. Press any key to continue 该程序的功能是计算给定长、 高长度的箱子体积。 宽、 其中计算体积的函数 get_volume 中的参数有默认形参值 int width = 2, int height = 3 (3) #include <iostream.h> struct stu { int num; char *name; char sex; float score; }boy[5]={{101,"Zhou ping",'M',45},{102,"Zhang ping",'M',62.5}, {103,"Liou fang",'F',92.5},{104,"Cheng ling",'F',87}, {105,"Wang ming",'M',58} }; void main() {stu *ps; cout<<"No\tName\t\tSex\tScore\t"<<endl; for(ps=boy;ps<boy+5;ps++) cout<<ps->num<<"\t"<<ps->name<<"\t"<<ps->sex<<"\t"<< ps->score<<endl; } 答:该程序的运行结果为:

5

No Name Sex Score 101 Zhou ping M 45 102 Zhang ping M 62.5 103 Liu fang F 92.5 104 Cheng ming F 87 105 Wang ming M 58 Press any key to continue 该程序的功能是按照水平制表的格式 使用指针调用结构体数组 boy, 输出 5 个结构体 数组下标变量的内容,包含编号、姓名、性别和成绩的学生信息。

3、

约瑟夫(Josephus)问题。

有 N 个小孩围坐成一圈,从某个小孩开始顺时针报数,报到 M 的小孩从圈子离开, 然后,从下一个小孩开始重新报数,每报到 M,相应的小孩从圈子离开,最后一个离开圈 子的小孩为胜者,问胜者是哪一个小孩? 分析:采用一个一维数组 in_circle 来表示小孩围成一圈: bool in_circle[N]; in_circle[i]为 true 表示编号为 i 的小孩在圈子里。 圈子中 i 的下一个位置 j=(i+1)%N //变量 num_of_children_remained 表示圈中剩下的小孩数目,其初始值为 N //变量 count 来对成功的报数进行计数 //变量 index 表示要报数的前一个小孩的下标 找出胜者编号的程序如下: #include <iostream> using namespace std; const int N=20,M=5; int main() { bool in_circle[N]; int num_of_children_remained,index; //初始化数组 in_circle。 for (index=0; index<N; index++) in_circle[index] = true; //开始报数 index = N-1; //从编号为 0 的小孩开始报数,index 为前一个小孩的下标。 num_of_children_remained = N; //报数前的圈子中小孩个数 while (num_of_children_remained > 1) { int count = 0; while (count < M) //对成功的报数进行计数。 { index = (index+1)%N; //计算要报数的小孩的编号。 if (in_circle[index]) count++; //如果编号为 index 的小孩在圈子中,该报数为成功的报数。 } in_circle[index] = false; //小孩离开圈子。

6

num_of_children_remained--; //圈中小孩数减 1。 } //找最后一个小孩 for (index=0; index<N; index++) if (in_circle[index]) break; cout << "The winner is No." << index << ".\n"; return 0; }

要求:修改这个程序,使得输出结果为每个小孩的编号和离开次序。 答:约瑟夫(Josephus)问题 程序修改如下: (修改部分为红色)
#include <iostream> using namespace std; const int N=20,M=5; int main() { bool in_circle[N]; int num_of_children_remained,index; //初始化数组 in_circle。 for (index=0; index<N; index++) in_circle[index] = true; //开始报数 index = N-1; //从编号为 0 的小孩开始报数,index 为前一个小孩的下标。 num_of_children_remained = N; //报数前的圈子中小孩个数 int m=0;//增加一个变量 m 用来累加离开圈子的小孩顺序 while (num_of_children_remained > 1) { int count = 0; while (count < M) //对成功的报数进行计数。 { index = (index+1)%N; //计算要报数的小孩的编号。 if (in_circle[index]) count++; //如果编号为 index 的小孩在圈子中,该报数为成功的报数。 } in_circle[index] = false; //小孩离开圈子。 m=m+1;//一个小孩离开时,m 加 1 cout<<"第"<<m<<"个离开的小孩编号是"<<index<<endl; //输出小孩的离开次序和小孩(编号) 。 num_of_children_remained--; //圈中小孩数减 1。 } //找最后一个小孩 for (index=0; index<N; index++) if (in_circle[index]) break; cout << "The winner is No." << index << ".\n";

7

return 0; }

运行结果为: 第 1 个离开圈子的小孩编号是 4. 第 2 个离开圈子的小孩编号是 9. 第 3 个离开圈子的小孩编号是 14. 第 4 个离开圈子的小孩编号是 19. 第 5 个离开圈子的小孩编号是 5. 第 6 个离开圈子的小孩编号是 11. 第 7 个离开圈子的小孩编号是 17. 第 8 个离开圈子的小孩编号是 3. 第 9 个离开圈子的小孩编号是 12. 第 10 个离开圈子的小孩编号是 0. 第 11 个离开圈子的小孩编号是 8. 第 12 个离开圈子的小孩编号是 18. 第 13 个离开圈子的小孩编号是 10. 第 14 个离开圈子的小孩编号是 2. 第 15 个离开圈子的小孩编号是 16. 第 16 个离开圈子的小孩编号是 15. 第 17 个离开圈子的小孩编号是 1. 第 18 个离开圈子的小孩编号是 7. 第 19 个离开圈子的小孩编号是 13. The winner is No.6.
8

Press any key to continue

9


更多相关文档:

matlab2012实验1参考答案

matlab2012实验1参考答案_其它_高等教育_教育专区。报告名称:MATLAB 试验一 数值...2 报告解答报告名称:MATLAB 试验一 数值计算 姓名: 学号: 专业: 班级: MATLAB...

有机思考题答案(1-2学期完整版)

有机思考题答案(1-2学期完整版)_理学_高等教育_教育专区。咖啡因 1、用升华...如: O OH CH 3 C =CHCOOEt CH 3 C CH 2COOEt 实验证明方法: (1)用...

数学实验(MATLAB版韩明版)2.1-2.4部分答案

数学实验(MATLAB版韩明版)2.1-2.4部分答案_数学_自然科学_专业资料。欢迎大家参考~~其中有些没做~~请见谅!!!练习2.1 画出下列常见曲线的图形(其中 a=1,b...

《C++程序设计1》实验5-2参考答案、程序

《C++程序设计 1》实验 5-2 参考程序与答案(1)填空题 1. 存储字符’a’和字符串”a”分别需要占用__1__和__2__个字节。 2. 空串的长度为__0__,存储...

实验2-1

3页 5财富值 实验1,2 暂无评价 6页 2财富值 2.1 实验 暂无评价 2页 5财富值 2.1实验 暂无评价 12页 免费 实验2 (1)参考答案 暂无评价 9页 免费喜欢...

2[1].最新基尔霍夫定律和叠加原理的验证(实验报告答案)

2[1].最新基尔霍夫定律和叠加原理的验证(实验报告答案)_物理_自然科学_专业资料。最新2013 实验二一、实验目的 最新基尔霍夫定律和叠加原理的验证 1.验证基尔霍...

实验1-2顺序表和链表基本操作_参考答案

实验1-2顺序表和链表基本操作_参考答案_理学_高等教育_教育专区。实验 12:线性表的应用参考代码实验预备知识 1.复习 C 中编写函数的相关内容。 2.复习...

实验2(1)

3页 5财富值 实验1,2 暂无评价 6页 2财富值 2.1 实验 暂无评价 2页 5财富值 2.1实验 暂无评价 12页 免费 实验2 (1)参考答案 暂无评价 9页 免费喜欢...

MATLAB程序设计与应用(第二版)课后实验答案

Matlab 课后实验答案 实验一 MATLAB 运算基础 1. 先求下列表达式的值,然后显示 MATLAB 工作空间的使用情况并保存全部变量。 (1) z1 ? 2sin 850 1 ? e2 1...

实验2.1

3页 5财富值 实验1,2 暂无评价 6页 2财富值 2.1 实验 暂无评价 2页 5财富值 2.1实验 暂无评价 12页 免费 实验2 (1)参考答案 暂无评价 9页 免费喜欢...
更多相关标签:
实验六数组参考答案 | 随堂1加1参考答案数学 | 随堂1加1参考答案 | 随堂1加1参考答案英语 | 参考答案 | 五年级孟建平参考答案 | 名校课堂参考答案图片 | 托福口语参考答案 |
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com