《C++程序设计实验指导书.doc》由会员分享,可在线阅读,更多相关《C++程序设计实验指导书.doc(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+程序设计实验指导书前前 言言C+程序设计是软件工程、网络工程专业的一门专业基础课程,是程序设计的基础。通过 C+程序设计实验课,巩固学生对课堂上学习的编程基础知识的理解,培养学生逐步建立编程思路,树立编程思想,同时加强逻辑思维能力和程序调试的实践能力的培养。该实验课主要进行 C+语言结构化程序设计、面向对象程序设计的编程实践。学生学习编写程序,上机实验是最佳的途径之一。因此,实验环节的好坏是学生能否学好C+程序设计的关键。为了更好地配合学生实验,特编写实验指导书。一、实验目的更好的理解 C+程序的基本语法,掌握常见的程序设计方法,能够利用 C+语言解决常见的问题,培养程序设计、程序调试能力
2、。二、实验要求1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据及预期输出数据。2、独立完成或在指导教师的帮助下,完成实验项目,得出正确的实验结果。3、遵守实验室规章制度、不缺席、按时上、下机。4、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣 10 分。5、实验项目有一次未完成,扣 5 分,两次以上未完成者,平时成绩以零分记,不允许参加期末考试。三、实验环境 VC+6.0 或其它 C+集成环境四、说明1、所有实验项目布置在在线评测系统平台(Online Judge System)上,校内访问IP:59.73.73
3、.133,每位学生需实名注册账号,并将完成的实验项目在平台上提交,平台能够实现自动评测。2、各个实验项目中列出的实验只是其中的一部分,要求学生必须完成。在线评测系统平台上的其它实验项目也必须完成 80%以上,否则实验不合格。 五、参考书目C+程序设计实验指导书,集体编写,辽宁科技大学软件学院C+程序设计,余苏宁主编,高等教育出版社,2004 年 1 月C+语言程序设计(第四版),郑莉,董江舟编著,清华大学出版社,2010 年 7 月C+面向对象程序设计,陈维兴,陈昕编著,人民邮电出版社,2010 年 10 月C+程序设计,谭浩强编著,清华大学出版社,2004 年 6 月C+语言程序设计教程,
4、杨进才,沈显君,刘蓉编著,清华大学出版社,2006 年 9 月目 录前 言.1实验一 控制语句(1).2实验二 控制语句(2).3实验三 控制语句(3).3实验四 数组编程.3实验五 指针编程.4实验六 函数编程(1).4实验七 函数编程(2).5实验八 类与对象编程(1).5实验九 类与对象编程(2).6实验十一 面向对象编程(2).7实验十二 类模板编程.7实验十三 I/O 流编程.8附录:在线评测系统练习题汇总.81 控制结构 .82 函数 .183 数组与指针 .214 面向对象部分练习 .255 继承与派生.29实验一实验一 控制语句(控制语句(1)实验类型:设计性 实验要求:必修实
5、验学时: 2 学时【实验目的】 1、熟悉集成开发环境 Visual C+,在此环境下能够创建 C+程序。 2、熟练使用 if 语句和 switch 语句编程,同时进一步学习基本数据类型的定义和使用。【实验内容】 1、已知分段函数:通过键盘任意输入一个 x,输出函数值的结果。 提示:C+函数 pow(x,y)表示数学表达式 xy2、输出任意一个年份及月份,输出该月的天数。 1,3,5,7,8,10,12 月份,每月 31 天;4,6,9,11 月份,每月 30 天;2 月份,若年份为闰年, 则 29 天,否则为平年 28 天。闰年的条件判断详见第二章例题。实验二实验二 控制语句(控制语句(2)实
6、验类型:设计性 实验要求:必修实验学时: 2 学时【实验目的】 1、 熟练掌握 while 循环和 for 循环语句的编程。 2、 进一步学习基本数据类型的定义和使用。 【实验内容】 1、输入一个算术表达式,可以实现求两个整数的加、减、乘、除和取余运算。提示: 可以利用 switch 语句实现。 2、输入一个数,判断是否为完数。提示:完数:一个数如果恰好等于除它本身外的因 子之和,这个数就称为完数。实验三实验三 控制语句(控制语句(3)实验类型:设计性 实验要求:必修实验学时: 2 学时【实验目的】 1、熟练掌握三种结构混合使用的复杂编程。 2、进一步学习基本数据类型的定义、使用和数据输出格式
7、的设计。 【实验内容】 1、求 1000 以内所有完数。 2、计算数列 1/1-1/2+1/3-+1/n,n 值由用户自己输入。实验四实验四 数组编程数组编程实验类型:设计性 实验要求:必修实验学时: 2 学时【实验目的】 1、掌握数组的概念,并弄清数组的存储结构。 2、掌握一维数组的定义、赋值和输入/输出的方法。 3、学会与数组有关的算法。 【实验内容】 1、输入一个字符串,求串长,要求自己编程实现,不允许使用求串长函数。 2、输入 10 个数,将指定数据 x 删除(x 由键盘输入)后在输出结果。 3、输入 10 名学生成绩,将最高分与最低分位置互换。 4、输入 3*3 矩阵的元素,然后求对
8、角线元素之和。实验五实验五 指针编程指针编程实验类型:设计性 实验要求:必修实验学时: 2 学时【实验目的】 1、掌握指针的概念、指针变量的定义、使用以及指针的运算。 2、学会使用数组的指针和指向数组的指针变量。 【实验内容】 1、输入 10 个数据存储于一维数组中,找到其中的最大值、最小值,然后将其位置互换后再输出结果。 2、在 10 整数的数组中查找一个指定的元素 x,存在则给出元素所在下标,否则给出 失败信息。 3、输入 10 个数,实现在指定下标 pos 处插入数据 x。实验六实验六 函数编程(函数编程(1)实验类型:设计性 实验要求:必修实验学时: 2 学时【实验目的】 1、掌握函数
9、的定义。 2、了解函数原型(函数声明)与函数定义的区别与联系。 3、掌握函数调用的基本方法和返回值的用法。 4、弄清值调用和引用调用在传递参数时的区别。 【实验内容】 1、主函数中输入 10 个成绩,编写函数求平均分,并在主函数中调用并输出结果。 2、主函数中输入一个整数,编写函数判断是否为素数,并在主函数中调用并输出结果。3、输入 10 个数据存储到数组中,实现查找一个指定数据 x 的数组下标,要求查找部 分写为函数形式实验七实验七 函数编程(函数编程(2)实验类型:设计性 实验要求:必修实验学时: 2 学时【实验目的】 1、掌握函数调用的基本方法和返回值的用法。 2、掌握用递归函数解决实际
10、问题。 3、掌握函数的参数传递。 【实验内容】 1、输入一个正整数,逆序输出它的各个数位。例如:输入 123,输出 321。要求利用 递归函数实现。 2、编写函数判断是否为素数,在主函数中利用该函数输出 100-200 之间所有素数。 3、用函数实现将一个数组中元素逆序存放并输出。 提示: (1)利用指针做逆序存放,可以定义两个指针变量*p,*q(2)令 p 指向数组的第 1 个元素,即 p=a (3)令 q 指向数组的最后一个元素,即 q=a+n-1 (4)在 p0,则 y=1;若 x=0,则 y=0;否则,y=-1。最后输出 y。 输入-5 输出-1 输入 0 输出 0 输入 4 输出 1
11、测试: 输入 50 输出 1选择 11:对号入座 有 4 种水果,单价分别是 3.1 元/公斤,2.50 元/公斤,4.10 元/公斤,10.20 元/公斤,编号分 别为 1,2,3,4。要求从键盘中输入水果的编号,输出该水果的单价。如果输入不正确的编号,显示单价为 0。 输入 1 输出 3.1 输入 2 输出 2.5 输入 3 输出 4.1 输入 4 输出 10.2 输入 5 输出 0测试: 输入 6 输出 0选择 12:第几天 编写一道程序,输入三个正整数,表示某年某月某日,判断这一天是这一年的第几天? 输入 2013 7 12 输出 193 输入 2012 5 15 输出 136测试:
12、输入 2012 3 5 输出 65选择 13:是否及格 输入一个学生的数学成绩(正整数) ,如果它低于 60,输出“Fail”,否则,输出“Pass”。 输入 65 输出 Pass 输入 50 输出 Fail测试: 输入 90 输出 Pass选择 14:最小值 输入四个整数,输出其中的最小值。输入 1 2 3 4 输出 1输入 2 1 4 3 输出 1输入 2 3 1 4 输出 1输入 3 2 4 1 输出 1测试:输入 13 12 14 11 输出 11选择 15:回文数 输入一个 5 位数,判断它是不是回文数。 输入 12321 输出 YES输入 12345 输出 NO测试: 输入 365
13、63 输出 YES选择 16:字母转换 编写程序,要求输入一个字母,若为大写字母,将其转换成相应小写字母输出,否则,原 样输出该字母。 输入 A 输出 a 输入 g 输出 g 输入 9 输出 9测试: 输入 T 输出 t选择 17:体重 编写一个程序,输入某人的身高(cm)以及体重(kg) ,按照以下标准对他(她)的体型 做测试:(1)标准体重=身高-110;(2)超过标准体重 5kg(不含 5kg)的为“过胖” ; (3)低于标准体重 5kg(不含 5kg)的为“过瘦” (3)既不超过标准体重多于 5kg,也不 低于标准体重多于 5kg 的为“标准” 输入 175 75 输出 过胖 输入 1
14、75 60 输出 标准 输入 175 55 输出 过瘦测试: 输入 180 80 输出 过胖选择 18:加法 从键盘上输入 2 个加数,再输入答案,如果正确,显示“right”,否则显示“error” 输入 3 5 8 输出 right 输入 3 5 9 输出 error测试 输入 13 15 28 输出 right选择 19:网费 编写一个程序来计算一个月的上网费用,计算方法如下:若上网时间50 小时,网费每 小时 2.5 元。要求输入该月上网小时数,显示该月总的上网费用。 输入 8 输出 30 输入 30 输出 90 输入 60 输出 150测试: 输入 50 输出 150循环 01:最大
15、数 写一个程序,可以输入一批正数,输入 0 时结束循环,并且输出最大的正数。 输入 39 28 5 63 18 27 0 输出 63 测试: 输入 153 26 963 28 75 90 156 0 输出 963循环 02:素数 输入正数 n,判断 n 是否为素数。若为素数则输出 1,否则输出 0。 (提示:素数是指只可 以被 1 和其本身整除的正数(1 除外) )输入 10 输出 0 输入 7 输出 1 测试: 输入 9 输出 0循环 03:数列求和 输入一个正整数 n,计算前 n 项之和:1+1/4+1/7+1/10.+1/(3*n-2)(保留 2 位小数) 。 输入 5 输出 1.57
16、输入 4 输出 1.49 测试 输入 10 输出 1.81循环 04:西瓜卖几天 n 个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完? 输入:西瓜个数,输出:天数 输入 10 输出 2 输入 50 输出 4 测试 输入 120 输出 5循环 05:成绩判定 输入一个正整数 repeat (0=2),编写一个程序,输入 n(=0),如果 F(n)能被 3 整除则输出一个“yes”,否则输 出一个“no”。 输入 8 输出 yes 输入 6 输出 no测试 输入 12 输出 yes循环 16:计算奇偶数 求 N(3) ,调用 move 函数实现移动。 输入 1 2 3 4
17、 5 输出 4 5 1 2 3 测试 输入 1 2 3 4 5 6 7 8 输出 4 5 6 7 8 1 2 3编写一个函数 length,求一个字符串的长度。从键盘中多个一个字符串,调用 length()函数, 输出字符串长度的平均值(保留 1 位小数) 。输入格式,第一个整数 n 为字符串个数,后续 为 n 个字符串。 输入 3 world hello C+输出 4.3 测试 输入 4 University Science Technology LiaoNing 输出 8.8使用指针编写 strcat()函数,即实现两个字符串的首尾连接(将第二个字符串接到第一个字 符串的后面) ,函数返回
18、连接后的字符串。从键盘输入两个字符串,输出连接后和字符串。 输入 University Science 输出 UniversityScience 测试 输入 hello world 输出 helloworld编写一个字符串比较函数 strcmp,两个字符串相同时,函数返回 0;两个函数不同时,函 数返回第一个不同字符的 ASCII 码差值。如两个字符串 ad 和 abc,第一个不同的字符时 d 和 b,二者的差值为 100-98=2,函数返回值为 2。从键盘中输入两个字符串,调用 strcmp 进行函数比较,并输出比较后结果。 输入 hello helloworld 输出-126 测试 输入
19、hello world 输出-58编写一个函数,实现在字符串的每两个字符之间都插入一个字符,如原串为 abcd,插入字 符为 h 则新串为 ahbhchd。在主函数中输入原串及插入字符,调用该函数实现字符串转换, 并输出转换后的新串。 输入 hello w 输出 hwewlwlwo 测试 输入 world h 输出 whohrhlhd4 面向对象部分练习面向对象部分练习1、 定义一个 CPoint 类,私有数据成员为点坐标 x,y(double) ,成员函数为构造函数 CPoint(实现 x,y 值的初始化) ,输出点坐标的函数 Display,主函数中定义 Point 类 对象,输入点坐标值
20、调用 Display 输出点坐标。 输入 10 25.5 输出 (10,25.5) 测试: 输入 12.5 22.7 输出 (12.5,22.7)2、定义一个三角形类 CTriangle,三个 double 型数据成员 a、b 和 c 表示三角形的三条边, 写出构造函数,判断三条边是否构成三角形的函数 IsTriangle,成员函数 GetPerimeter 返 回三角形的周长,成员函数 GetArea 返回三角形的面积,main 函数中定义两个三角形类 对象 T1,T2,若均能构成三角形,则计算两个三角形面积之和和周长之差,否则输出 failure。 输入:3 4 5 6 8 10 输出:3
21、0 -12 输入:3 4 5 6 7 8 输出:26.3332 -9 输入:1 2 0 3 4 5 输出:failure 测试: 输入:4 5 6 7 8 9 输出:36.7544 -93、定义一个长方形类 CRectangle,两个 double 型数据成员 a、b 示长方形的长与宽,写出 构造函数,成员函数 GetArea 返回长方形的面积,main 函数中定义两个类对象 R1,R2, 判断两个长方形面积的大小。 输入 3.5 2.0 1.8 1.1 输出 71.91 输入 1.5 1.1 3.3 2 输出 1.65xyr; /圆心的点坐标及圆的半径Circle C(x,y,r); C.D
22、isplay(); /输出圆心点坐标,圆的半径,圆的面积,圆的周长return 0; 输入:1.5 2.6 1.8 输出:Center:Point(1.5,2.6) Radius:1.8 Area:10.1736 Perimeter:11.304输入:0 0 1 输出:Center:Point(0,0) Radius:1 Area:3.14 Perimeter:6.28输入:5.6 8.7 2 输出:Center:Point(5.6,8.7) Radius:2 Area:12.56 Perimeter:12.562、 Person 类派生大学生 CollegeStu 类(1)。设计一个 Per
23、son 类,其属性包括姓名 name 和身份证号 id,其中 name 为指针类型,id 为整型,编写成员函数:构造函数 Person、Display 函数(显示数据成员信息)和析构函数;由 Person 类派生出大学生类 CollegeStu,其属性有专业 subject(指针类型) ,C+程序设计课程成绩 score(double 型) ,编写构造函数(实现数据初始化) 、输出函数 Display(包括 name,id,subject,score) 。main 的代码如下:(不允许改动)int main() char name81,subject81; int id;double scor
24、e; cinnameidsubjectscore; CollegeStu cs(name,id,subject,score); cs.Display(); return 0; 输入:Zhangsan 2 Computer 89.5 输出:Name:Zhangsan ID:2 Subject:Computer C+ Score:89.5 输入:Liuhui 2 Computer 88 输出:Name:Liuhui ID:2 Subject:Computer C+ Score:883、 Person 类派生大学生 CollegeStu 类(2)。设计一个 Person 类,其属性包括姓名 name
25、 和身份证号 id,其中 name 为指针类型,id 为整型,编写成员函数:构造函数 Person、Display 函数(显示数据成员信息)和析构函数;由 Person 类派生出大学生类 CollegeStu,其属性有专业 subject(指针类型) ,C+程序设计课程成绩 score(double 型) ,编写构造函数(实现数据初始化) 、输出函数 Display(只输出 subject,score) 。 main 的代码如下:(不允许改动)int main() char name81,subject81; int id; double score; cinnameidsubjectscor
26、e; /输入学生的姓名、id 号、专业、成绩CollegeStu cs(name,id,subject,score); cs.Person:Display(); /输出姓名,id cs.Display(); /输出专业、成绩return 0; 输入:Lixu 5 Software 87.5 输出:Name:Lixu ID:5 Subject:SoftwareC+ Score:87.5输入:Liuhui 2 Computer 88 输出:Name:Liuhui ID:2 Subject:Computer C+ Score:884、 基类、派生类的构造与析构的顺序 已知 Base 为基类,定义如下
27、(不允许增加其它成员函数):class Base private: int b; public: Base(int); Base(); ; Derived 为派生类,定义如下(不允许增加其它成员函数):class Derived:public Base private: int d; public: Derived(int,int); Derived(); ; main 的代码如下(不允许改动):int main() int a,b; cinab; Derived dr(a,b); return 0; 请完成 Base 类和 Derived 类的构造函数和析构函数,能够根据输入获取相应的输出。
28、 输入:1 3 输出:Base 1 says hello Derived 3 says hi Derived 3 says byeBase 1 says goodbye 输入:3 5 输出:Base 3 says hello Derived 5 says hi Derived 5 says bye Base 3 says goodbye输入:2 6 输出:Base 2 says hello Derived 6 says hi Derived 6 says bye Base 2 says goodbye5、 有序数组 SortArray 类 1 由 Array 类派生出有序数组 SortArra
29、y 类,SortArray 类中实现有序数组的插入。 已知 Array 类的定义如下(不允许增加成员函数):class Array public: Array(); /构造函数,初始化为空数组(length 置为 0) int Length(); /获取数组的实际长度 double Get(int pos); /获取 data 中下标为 pos 的元素的值 void Insert(int pos, double x); /在下标 pos 处插入 x void Display(); /输出线性表private: double dataMaxSize; /存储元素(MaxSize 为常量) int
30、 length; /数组的实际长度;SortArray 类定义如下(不允许增加成员函数):class SortArray:private Array public: SortArray(); int Length(); /获取数组的实际长度 double Get(int pos); /获取 data 中下标为 pos 的元素的值 void Display(); /输出线性表 void Insert(double x); /递增有序数组中插入 x,使序列仍有序; 请实现 Array 类和 SortArray 类的成员函数, main 中输入若干个实数,以 0 结束,利用 SortArray 类中
31、的 Insert 函数将它们插入 data 中,得到有序序列,再利用 Display 函数输出有序序列。代码如下(不允许修改):int main() SortArray sa; double num; while(1) cinnum; if(fabs(num)size; SortArray sa(size); double num; while(1) cinnum; if(fabs(num)powerseatload; StationWagon sw(power,seat,load); sw.Display(); return 0; 输入:108 3 10 输出:StationWagon: P
32、ower:108 Seat:3 Load:10输入:120 5 12 输出:StationWagon: Power:120 Seat:5 Load:12 Press any key to continue 8、 虚函数问题 请以点类 Point 为基类派生出一个圆类 Circle。Point 类的数据成员为 x、y(私有属性, 存储点的横纵坐标) ,成员函数有构造函数 Point(实现对数据成员 x、y 的初始化) 、输出 函数 Display(输出点坐标) ;圆类 Circle 的数据成员为 r(私有属性,存储圆的半径,圆 心的点坐标通过继承点类 Point 加以实现) ,成员函数有构造函数
33、 Circle、计算圆的面积 函数 Area、计算圆的周长函数 Perimeter 和输出函数 Display,其中构造函数实现基类和 圆类的数据成员的初始化,Display 函数实现圆心坐标、圆的半径、圆的面积(利用 Area 函数实现)和圆的周长(利用 Perimeter 函数实现)的输出。实现 Point 类和 Circle 类的 定义及成员函数。主函数的代码(不允许改动)如下:int main() double x,y,r; cinxyr; /圆心的点坐标及圆的半径Point *p; p=new Point(x,y); p-Display(); p=new Circle(x,y,r);
34、 p-Display(); return 0; 说明:圆周率 PI 的取值为 3.14 提示:Display 应设计为虚函数输入:0 0 1 输出:Point(0,0) Circles center:Point(0,0) Radius:1 Area:3.14 Perimeter:6.28 输入:10 12.6 1.5 输出:Point(10,12.6) Circles center:Point(10,12.6) Radius:1.5 Area:7.065 Perimeter:9.42 输入:10.5 12.8 2 输出:Point(10.5,12.8) Circles center:Point
35、(10.5,12.8) Radius:2 Area:12.56 Perimeter:12.569、 抽象类 1 定义一个抽象类 Shape,应用抽象类 Shape 派生圆类 circle、圆的内接正方形类 In_Square 和圆的外切正方形类 Ex_Square。main 中利用指向抽象类的指针实现求圆、圆 的内接正方形和圆的外切正方形的面积和周长。请实现各个类的成员函数,已知各类的定 义及 main 中的代码如下(不允许修改):class Shape public: Shape();virtual double Area()=0; virtual double Perimeter() =
36、0; ; class Circle:public Shape public: Circle(double rr); double Radius(); double Area(); double Perimeter(); private: double r; /圆的半径;class In_Square:public Circle public: In_Square(double rr); double Area(); double Perimeter(); ; class Ex_Square:public Circle public: Ex_Square(double x); double Ar
37、ea(); double Perimeter(); ; int main() Shape *ptr; double r; cinr; ptr=new Circle(r); coutArea()Perimeter()Area()Perimeter()Area()Perimeter()rab; Shape *ptr=new Circle(r),new Rectangle(a,b); for(int i=0;iArea()Perimeter(), +, -的运算符重载 已知 Complex 类的定义(不允许添加)及 main 中的代码(不允许改动)如下:class Complex public: C
38、omplex(double r=0,double i=0); Complex operator +(const Complex Complex operator -(const Complex friend ostream void Display(); private: double real; double imag; ; int main() Complex c1,c2,c3; cinc1c2; cout、 (istream /运算符重载private: double dataMaxSize; /存储元素,MaxSize 为常量,需先定义 int length; /顺序表实际长度; in
39、t main()Array a; cina; couta; return 0; 请完成 Array 类中的成员函数,使之能够通过运算符重载实现数组中数据的输入和输出。 数据的输入格式为:第一个数是数组中的数据个数,之后为数组中的数据值。 输入:5 2.3 5.6 7.98 6.5 6.32 输出:Length:5 Data:2.3 5.6 7.98 6.5 6.32 输入:0 输出:Length:0 Data:输入:3 2 4 1 输出:Length:3 Data:2 4 1测试: 输入:7 5 6 7.8 9.8 3 4 5.6 输出:Length:7 Data:5 6 7.8 9.8 3 4 5.6 13、通过文件流进行文件的操作:创建,复制,合并等 (1)创建文件 从键盘输入 n 个 double 类型数值,并将这 n 个数值保存到 file.dat 二进制文件中。 输入格式:第一个为整数 n,后续为 n 个 double 数值。 (2)读取文件 已知二进制文件 file.dat 文件中存储一组 double 类型数值,请读取该文件中所有数值, 并输出。 (3)复制文件 已知二进制文件 file.dat 文件中存储一组 double 类型数值,请读取该文件中所有数值, 并存储到 file.bak 文件中。
限制150内