当前位置:首页 >> 数学 >> 实验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


更多相关文档:

2vfp实验教程习题答案(1)

2vfp实验教程习题答案(1)_其它_高等教育_教育专区。2011大学生VF考试 ...m else ?n Endif Return 第六章 1.选择题 DBCDA CACCD 2 (1) option...

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

《C++程序设计1》实验5-2参考答案、程序_司法考试_资格考试/认证_教育专区。《C++程序设计 1》实验 5-2 参考程序与答案(1)填空题 1. 存储字符’a’和字符串...

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

有机思考题答案(1-2学期完整版)_理学_高等教育_教育专区。咖啡因 1、用升华...4、能否用本实验的方法由乙醇和 2-丁醇制备乙基仲丁基醚?你认为用什么方法比较...

matlab2012实验1参考答案

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

MATLAB)课后实验答案

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

matlab2013实验3参考答案

matlab2013实验2参考答案... matlab2013实验4参考答案...1/2 相关文档推荐 ...报告名称:MATLAB 试验三 计算可视化 姓名: 学号: 专业: 班级: MATLAB 实验三 ...

大学vb上机及课后习题答案实验1-2

大学vb上机及课后习题答案大学vb上机及课后习题答案隐藏>> 实验1.1.1 标签 计算机等级考试 True 三号 1 实验 1.1.2 2000 200 1 2 等级考试 实验 1.1.3...

C实验报告1参考答案

C实验报告1参考答案_IT认证_资格考试/认证_教育专区。《高级语言程序设计》实验...试纠正程序中存在的错误,以 实现其功能。程序以文件名 sy1_2.c 保存。 #...

实验1及实验2

实验内容 1. 编写一个 C 程序,求一个圆的面积。 2. 编写程序求任意三个数...免费在线作业答案大工15... 暂无评价 5页 5下载券 公开课实验探究1—氧气的...

1.2练习(解答题)_图文

(1)实验的亲本中,父本是 ___ ,母本是 ___ .(2)操作① 叫 ___ ,操作...参考答案与试题解析一、解答题(共 6 小题) (选答题,不自动判卷) 1.如图...
更多相关标签:
网站地图

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