面向对象程序设计实验报告模板
面向对象的实验报告
一、实验目的1. 理解面向对象编程的基本概念,如类、对象、继承、封装、多态等。
2. 掌握面向对象编程的基本语法和常用操作。
3. 通过实验加深对面向对象编程的理解和应用。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C#三、实验内容1. 定义一个简单的类,并创建对象实例。
2. 在类中定义属性和方法,并演示其使用。
3. 使用继承实现类的扩展。
4. 使用封装保护类的内部数据。
5. 使用多态演示不同对象间的动态类型转换。
四、实验步骤1. 定义一个名为“Person”的类,包含以下属性和方法:- 属性:姓名(Name)、年龄(Age)、性别(Gender)- 方法:打印个人信息(PrintInfo)2. 创建“Person”类的对象实例,并演示属性和方法的使用。
3. 定义一个名为“Student”的类,继承自“Person”类,并添加以下属性和方法: - 属性:学号(StudentID)- 方法:打印学生信息(PrintStudentInfo)4. 创建“Student”类的对象实例,并演示属性和方法的使用。
5. 定义一个名为“Employee”的类,继承自“Person”类,并添加以下属性和方法:- 属性:工号(EmployeeID)、职位(Position)- 方法:打印员工信息(PrintEmployeeInfo)6. 创建“Employee”类的对象实例,并演示属性和方法的使用。
7. 定义一个名为“Manager”的类,继承自“Employee”类,并添加以下属性和方法:- 属性:部门(Department)- 方法:打印经理信息(PrintManagerInfo)8. 创建“Manager”类的对象实例,并演示属性和方法的使用。
9. 使用多态演示不同对象间的动态类型转换。
五、实验结果与分析1. 创建“Person”类和对象实例,并演示属性和方法的使用。
面向对象设计原则实验报告实验01
面向对象设计原则实验报告1.1实验目的1. 通过实例深入理解和掌握所学的面向对象设计原则。
2.熟练使用面向对象设计原则对系统进行重构。
3.熟练绘制重构后的结构图(类图)。
1.2实验内容1.在某绘图软件中提供了多种大小不同的画笔(Pen),并且可以给画笔指定不同颜色,某设计人员针对画笔的结构设计了如图1-1所示的初始类图。
通过仔细分析,设计人员发现该类图存在非常严重的问题,即如果需要增加一种新的大小或颜色的笔,就需要增加很多子类,例如增加一种绿色的笔,则对应每一种大小的笔都需要增加一支绿色笔,系统中类的个数急剧增加。
试根据依赖倒转原则和合成复用原则对该设计方案进行重构,使得增加新的大小或颜色的笔都较为方便,请绘制重构之后的结构图(类图)。
2.在某公司财务系统的初始设计方案中存在如图1-2所示的Employee类, 该类包含员工编号(ID),姓名(name),年龄(age).性别(gender)、薪水(salary)、每月工作时数( workHoursPerMonth),每月请假天数(leaveDaysPerMonth)等属性。
该公司的员工包括全职和兼职两类,其中每月工作时数用于存储兼职员工每个月工作的小时数,每月请假天数用于存储全职员工每个月请假的天数。
系统中两类员工计算工资的万法也不一样,全职员工按照工作日数计算工资﹐兼职员工按照工.作时数计算上资﹐内此在 Employee 类中提供了两个方法calculateSalaryByDays()和calculateSalaryByHours(),分别用于按照大数和时数计算工资,此外,还提供了方法displaySalary()用于显示工资。
试采用所学面向对象设计原则分析图1-2中Employee类存在的问题并对其进行重构绘制重构之后的类图。
3.在某图形界面中存在如下代码片段,组件类之间有较为复杂的相互引用关系:如果在上述系统中增加一个新的组件类,则必须修改与之交互的其他组件类的源代码,将导致多个类的源代码需要修改。
面向对象设计原则实验报告实验02
设计模式(2)实验报告一、实验目的1.结合实例,熟练绘制设计模式结构图。
2.结合实例,熟练使用 Java 语言实现设计模式。
3.通过本实验,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些设计模式。
二、实验要求1.结合实例,绘制设计模式的结构图。
2.使用 Java 语言实现设计模式实例,代码运行正确。
三、实验内容1.迭代器模式设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理。
绘制对应的类图并编程模拟实现。
2.适配器模式某 OA 系统需要提供一个加密模块,将用户机密信息(例如口令、邮箱等)加密之后再存储在数据库中,系统已经定义好了数据库操作类。
为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。
试使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。
要求绘制相应的类图并编程模拟实现,需要提供对象适配器和类适配器两套实现方案。
3.模板方式模式和适配器模式在某数据挖掘工具的数据分类模块中,数据处理流程包括 4 个步骤,分别是:①读取数据;②转换数据格式;③调用数据分类算法;④显示数据分类结果。
对于不同的分类算法而言,第①步、第②步和第④步是相同的,主要区别在于第③ 步。
第③步将调用算法库中已有的分类算法实现,例如朴素贝叶斯分类(Naive Bayes)算法、决策树(DecisionTree)算法、K 最近邻(K-NearestNeighbor , KNN)算法等。
现采用模板方法模式和适配器模式设计该数据分类模块,绘制对应的类图并编程模拟实现。
4.工厂方法模式在某网络管理软件中,需要为不同的网络协议提供不同的连接类,例如针对 POP3 协议的连接类 POP3Connection、针对 IMAP 协议的连接类 IMAPConnection 、针对 HTTP 协议的连接类 HTTPConnection 等。
C++面向对象程序设计》实验报告
《C++面向对象程序设计》实验内容实验1 C++程序设计初步1.实验目的(1)了解在C++编译系统(Visual C++6.0)上如何编辑、编译、连接和运行一个C++程序。
(2)通过运行简单的C++程序, 初步了解C++源程序的结构和特点。
(3)掌握简单C++程序的编写和调试方法。
(4)掌握重载函数的定义方法。
(5)能正确使用引用型变量。
2.实验内容和步骤(1)在Visual C++环境下编译和运行C++程序①先进入Visual C++6.0环境。
②在自己指定的子目录中建立一个名为test.cpp的新文件。
③从键盘输入以下程序int main(){int a,b;c=a+b;cout>> “a+b=”>>a+b;}选择Build→Compile test.cpp命令, 对此源程序进行编译。
观察和分析编译信息。
⑤根据编译信息指出的错误, 修改程序。
再进行编译, 如果还有错, 再重复此过程, 直到编译不出错为止。
⑥选择Build→Build test.exe命令, 对程序进行连接, 如果不出错, 就会生成可执行程序test.exe。
⑦选择Build→Execute test.exe命令, 执行可执行程序test.exe。
观察屏幕的变化。
在输出窗口应显示程序运行结果。
⑧分析结果是否正确, 如果不正确或认为输出格式不理想, 可以修改程序, 然后重新执行以上④和⑧步骤。
改过后的程序:#include<iostream>using namespace std;int add(int x,int y){int z;z=x+y;return(z);}int main(){int a,b,c;cin>>a>>b;c=add(a,b);cout<<"a+b="<<c<<endl;return 0;}实验2 C++对C的扩充(2)编一个程序, 用来求2个或3个正整数中的最大数。
java面向对象实验报告
java面向对象实验报告《Java面向对象实验报告》摘要:本实验报告旨在探讨Java面向对象编程的基本概念和实践方法。
通过实验,我们将学习如何创建类、对象、封装、继承和多态等面向对象的特性,并通过实际代码演示这些概念的应用。
本报告将详细介绍实验过程和结果,并总结所得到的经验和教训。
一、实验目的1. 了解面向对象编程的基本概念和原则2. 掌握Java语言中类、对象、封装、继承和多态的使用方法3. 通过实验加深对面向对象编程的理解和掌握二、实验环境1. Java开发环境:Eclipse/IntelliJ IDEA等2. Java SDK版本:1.8及以上三、实验内容1. 创建一个简单的Java类2. 创建对象并调用对象方法3. 实现类的封装和访问控制4. 实现类的继承和方法重写5. 实现类的多态四、实验步骤1. 创建一个名为Person的Java类,包含姓名和年龄两个私有属性,并提供公有的get和set方法进行访问和修改。
2. 创建一个名为Student的子类,继承Person类,并重写父类的get方法。
3. 创建一个名为Teacher的子类,继承Person类,并重写父类的get方法。
4. 创建一个名为Main的主类,实例化Person、Student和Teacher对象,并调用其方法进行测试。
五、实验结果1. 成功创建了Person、Student和Teacher三个类,并实现了类的封装、继承和多态。
2. 通过测试,验证了类的封装和访问控制的有效性。
3. 通过测试,验证了类的继承和方法重写的有效性。
4. 通过测试,验证了类的多态的有效性。
六、实验总结通过本次实验,我深刻理解了面向对象编程的重要性和优势,掌握了Java语言中面向对象编程的基本概念和实践方法。
在今后的学习和工作中,我将继续加强对面向对象编程的理解和应用,不断提高自己的编程水平。
七、实验感想通过本次实验,我对Java面向对象编程有了更深入的了解,也更加熟练地掌握了面向对象编程的基本概念和实践方法。
面向对象程序设计》C实验报告-32页精选文档
《面向对象程序设计》实验报告学院:专业:班级学号:姓名:学期:教师:实验一 C++基础练习实验目的和要求1.掌握C++程序的基本格式与规范,学会编写简单的C++程序。
2.理解C++程序结构的特点。
3.熟悉C++程序基本的输入和输出操作。
4.掌握C++数据类型常量和变量以及修饰符的使用方法。
5.掌握函数定义、函数调用和函数说明的方法。
6.熟悉作用域运算符的功能和基本使用方法。
7.掌握C++内存的动态分配与释放方法。
8.理解引用的概念,掌握引用的使用方法。
实验内容和步骤1. 调试如下的代码并回答问题。
#include <iostream.h>void main()//First c++ programchar name[10];cout<<"please input your name:";cin>>name;cout<<"welcome "<<name<<endl;(1)C++的注释和C有何不同?答:C语言的注释有一种,用/*……….*/作为注释分界符号C++除保留了这种注释方式之外,还提供了一种更有效的注释方式,该注释以“//”开始,到行尾结束。
(2)C++的输入和输出所使用的函数及其相应头文件与C有何不同?答:在C中进行输入输出操作时,常使用函数scanf和printf。
C++除了可以照常使用这两个函数进行输入输出外,还增加了标准输入流对象cin和标准输出流对象cout来进行输入和输出。
Iostream是C++系统定义的一个头文件,在这个文件中声明了程序所需要的输入和输出操作的有关信息。
在C语言中头文件中用“.h”作为后缀,如stdio.h、math.h等。
2. 单步调试如下的代码并回答问题。
#include <iostream.h>inline int f(int x){ return 2*x*x+4*x+5; }inline double f(double x){ return 2*x*x+4*x+5; }void main(){ int x=5;double y=5.2;cout<<f(x)<<endl;cout<<f(y)<<endl;(1)inline的含义和作用是什么?答:含义:在函数说明前冠以关键字“inline”,该函数就被声明为内联函数,每当程序中出现对该函数的调用时C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参。
面向对象程序设计课程实验报告
出口参数:无
功能:用s初始化p指空栈
intsize (const STACK *constp)
入口参数:无
出口参数:int max
功能:返回p指得栈得最大元素个数max
int howMany (const STACK*const p)
入口参数:无
出口参数:intpos
7。2用户使用说明书ﻩ39
7.3源代码ﻩ39
实验一。面向过程得整型栈编程
1、需求分析
1.1题目要求
整型栈就是一种先进后出得存储结构,对其进行得操作通常包括判断栈就是否为空、向栈顶添加一个整型元素、出栈等、整型栈类型及其操作函数采用非面向对象得纯C语言定义,请将完成上述操作得所有函数采用面向过程得方法编程,然后写一个main函数对栈得所有操作函数进行测试、
2.系统设计
2。1概要设计
函数结构图见图1.1
图1.1
总体流程图见图1。2
图1、2
2.2详细设计
voidinitSTACK(STACK*constp,int m)
入口参数:int m
出口参数:无
功能:初始化栈,可存m个元素
void initSTACK(STACK *constp, constSTACK&s)
6.过程与体会15
6.1遇到得主要问题与解决方法ﻩ15
6.2课程设计得体会ﻩ15
7、源码与说明ﻩ15
7。1文件清单及其功能说明ﻩ15
7、2用户使用说明书15
7、3源代码15
实验三.基于算符重载得整型栈编程19
1。需求分析ﻩ19
1、1题目要求19
1、2需求分析19
2、系统设计20
面向对象课程设计实验报告
河南科技大学课程设计说明书课程名称面向对象程序课程设计题目贪吃蛇游戏程序设计院系信息工程学院班级计11*班学生姓名指导教师日期 2013.3.3~2013.3.17课程设计任务书课程设计报告文档题目:贪吃蛇游戏程序设计一.引言1.编写目的:通过本课程设计,巩固面向对象程序设计的基本概念、原理和技术,学会使用java语言进行简单程序的开发,将理论与实际相结合,完成一个小型程序的设计与实现,并在此基础上强化自己的实践意识,提高其实际动手能力和创新能力。
2.定义:对话框控件ID、所用及其描述控件ID 描述JFrame JPanel 用来放置整个主界面用来放置蛇身可以移动的范围newGame用来开始游戏的按钮stopGame用来停止游戏的按钮dialog用来弹出结算信息的对话框Label button Dialog中用来显示最终分数Dialog中用来关闭对话框nThread用来控制蛇身自动移动的线程3.参考资料:《java面向对象编程》,孙卫琴,2006,电子工业出版社《可视化程序设计》邱勇、肖春宝、白秀玲2011 清华出版社二.任务的描述1.目标:根据贪吃蛇游戏的运行状况进行需求分析,抽象贪吃蛇游戏运行时的算法,设计贪吃蛇游戏运行程序及人机交互界面。
2.功能描述:3.性能描述(1)数据精确度:比较精确。
(2)时间特性:蛇身的移动最开始是0.5秒,随着等级的提升,速度会变得更快,直到蛇死亡。
4.运行环境:装有Windows操作系统的计算机5.条件与限制:只能在装有Windows操作系统的计算机,装有eclipse和配置有JDK的环境中可以运行。
三.任务设计1.类的划分:(1)类1:snakemain主要功能是构造贪吃蛇游戏的主界面,Snakemain()构造出贪吃蛇游戏的主界面void Main()创建出贪吃蛇运动的窗口(2)类2:snakewin()功能是绘制贪吃蛇游戏的主界面,包括游戏结束弹出的对话框snakewin()该类的构造函数void paintComponent(Graphics g)绘制包括蛇身,分数等void eat()蛇身吃蛇块void move(int x,int y)蛇头移动void Othermove()蛇身移动void minyes(int x,int y)对蛇头是否死亡的判定void maxyes(int x,int y)蛇头死亡的各种条件void keyPressed(KeyEvent e)响应键盘被敲击时的事件void actionPerformed(ActionEvent e)响应鼠标点击的事件void run()蛇身自行移动的线程(3)类3:snakeAct主要作用是创建包括蛇头,蛇身,食物块int getX()取得对象左上角的横坐标void setX()设置对象左上角的横坐标int getY()取得对象左上角的纵坐标void setY()设置对象左上角的纵坐标2.类的继承接口等关系类snakeMain继承自JFrame类snakeWin继承自JPanel,同时实现了ActionListener, KeyListener, Runnable等接口。
2022面向对象程序设计实验报告范文
2022面向对象程序设计实验报告范文面向对象(C++)程序设计实验1实验名称:类和对象的定义实验学时:2学时实验目的:熟练掌握C++中类和对象的基本概念。
熟练掌握类和对象的定义方法。
实验要求:在VC++运行环境下,参考教科书中的示例程序,完成下列操作:1.编写程序,定义一个Peron类,数据成员有:name[]、age、e某、core;成员函数有diplay(),并定义两个Peron类的对象,要求将两个对象的name[]、age、e某、core值通过diplay()函数显示出来。
写出实验报告,并分析结果。
注意事项:实验中注意数组的赋值问题。
面向对象(C++)程序设计实验2实验名称:构造函数和析构函数实验学时:2学时实验目的:熟练掌握C++中构造函数和析构函数的基本概念。
熟练掌握构造函数和析构函数在程序中的使用方法。
实验要求:在VC++运行环境下,参考教科书中的示例程序,完成下列操作:1.编写程序,定义一个Peron类,数据成员有:name[]、age、e某、core;成员函数有diplay(),并定义两个Peron类的对象,将两个对象的name[]、age、e某、core值通过diplay()函数显示出来。
要求用构造函数对数据成员初始化,并用析构函数表示两个对象的消失。
写出实验报告,并分析结果。
注意事项:实验中注意构造函数与析构函数的特点。
面向对象(C++)程序设计实验3实验名称:引用和复制构造函数实验学时:2学时实验目的:熟练掌握C++中引用的基本概念和用法。
熟练掌握复制构造函数在程序中的运用。
实验要求:在VC++运行环境下,参考教科书中的示例程序,完成下列操作:1.编写程序:使用两个参数(一个引用参数,一个传值参数),在函数调用中使两个形参值各扩大10倍,输出各形参和实参值,并分析输出结果。
2.完善下列程序:#includeclaTP{public:TP(int某,inty){某=某;Y=y;}TP(TP&p);~TP(){cout<intdip某(){return某;}intdipY(){returnY;}private:};voidmain(){TPP1(5,7);TPP2(P1);cout<在复制构造函数中要输出两个私有成员的值及“复制构造函数被调用!”字样,并分析输出结果。
面向对象实验报告
实验报告面向对象分析与设计班级学号姓名指导老师实验一用例图与活动图设计与实现[实验目的]1.熟悉UML建模2.掌握用例图的设计与实现4.掌握使用活动图细化用例的方法[实验内容]1.简单需求分析选课系统包括如下功能:(1)管理员通过系统管理界面进入系统,建立学期要开的各种课程,将课程信息保存在数据库中并对课程进行改动和删除(2)学生通过客户端浏览器根据学号和密码进入系统,可以选课,也可以查询已选课程本系统涉及的用户包括管理员和学生,他们是用例图中的执行者,他们的主要特征相似,都具有姓名和注册号(学生为学号)等信息,所以可以抽象出高层执行者“人”,而管理员和学生都从人统一派生。
数据库管理系统是另外一个执行者。
2.事件流(1)添加课程事件流(1)管理员选择进入管理界面,用例开始(2)系统提示输入管理员密码(3)管理员输入密码(4)系统验证密码A1:密码错误(5)进入管理界面,系统显示目前所建立的全部课程信息(6)管理员选择添加课程(7)系统提示输入新课程信息(8)管理员输入信息(9)系统验证是否和已有课程冲突A2:有冲突(10)系统添加新课程,提示课程添加成功(11)系统重新进入管理主界面,显示所有课程(12)用例结束其他事件流:A1:密码错误(1)系统提示再次输入(2)用户确认(3)三次错误,拒绝再次访问(4)否则进入添加课程事件流第(5)步A2:有冲突(1)系统提示冲突,显示冲突课程信息(2)用户重新输入(3)继续验证直到无冲突(4)进入添加课程事件流第(10)步删除课程事件流和修改课程事件流与此类似(2)选课事件流(1)学生进入选课登录界面,用例开始(2)系统提示输入学号和密码(3)学生输入学号和密码(4)系统验证A1:验证失败(5)进入选课主界面(6)学生点击选课。
(7)系统显示所有课程信息(8)学生选择课程(9)系统验证课程是否可选A2:课程不可选(10)系统提示课程选择成功(11)用例结束错误流:A1:验证失败(1)系统提示验证失败,提示重新输入(2)三次失败,拒绝访问(3)成功,转选课事件流第(5)步A2:课程不可选(1)系统提示课程不可选及原因(2)学生重新选课(3)重新验证直至成功(4)转选课事件流第(10)步3.选课用例图根据前面的需求分析可以试着粗略找出系统用例,并在后期的用例建模工作中合并、优化、筛选这些用例。
面向对象程序设计》C实验报告
面向对象程序设计》C实验报告《面向对象程序设计》实验报告学院:专业:班级学号:姓名:学期:教师:实验一 C++基础练习院(系):课程名称:面向对象程序设计教师签名:实验目的和要求1.掌握C++程序的基本格式与规范,学会编写简单的C++程序。
2.理解C++程序结构的特点。
3.熟悉C++程序基本的输入和输出操作。
4.掌握C++数据类型常量和变量以及修饰符的使用方法。
5.掌握函数定义、函数调用和函数说明的方法。
6.熟悉作用域运算符的功能和基本使用方法。
7.掌握C++内存的动态分配与释放方法。
8.理解引用的概念,掌握引用的使用方法。
实验内容和步骤1. 调试如下的代码并回答问题。
#include <iostream.h>void main(){//First c++ programchar name[10];cout<<"please input your name:";cin>>name;cout<<"welcome "<<name<<endl;}(1)C++的注释和C有何不同?答:C语言的注释有一种,用/*……….*/作为注释分界符号C++除保留了这种注释方式之外,还提供了一种更有效的注释方式,该注释以“//”开始,到行尾结束。
(2)C++的输入和输出所使用的函数及其相应头文件与C有何不同?答:在C中进行输入输出操作时,常使用函数scanf和printf。
C++除了可以照常使用这两个函数进行输入输出外,还增加了标准输入流对象cin和标准输出流对象cout来进行输入和输出。
Iostream是C++系统定义的一个头文件,在这个文件中声明了程序所需要的输入和输出操作的有关信息。
在C语言中头文件中用“.h”作为后缀,如stdio.h、math.h等。
2. 单步调试如下的代码并回答问题。
#include <iostream.h>inline int f(int x){ return 2*x*x+4*x+5; }inline double f(double x){ return 2*x*x+4*x+5; }void main(){ int x=5;double y=5.2;cout<<f(x)<<endl;cout<<f(y)<<endl;}(1)inline的含义和作用是什么?答:含义:在函数说明前冠以关键字“inline”,该函数就被声明为内联函数,每当程序中出现对该函数的调用时C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参。
面向对象程序设计实验报告格式
面向对象程序设计
实
验
报
告
班级:
学号:
姓名:
指导老师:
一、实验目的要求
1、熟悉Visual C#.NET集成开发环境。
2、掌握控制台应用程序的开发方法。
3、掌握Windows应用程序的开发方法。
二、实验条件
三、实验内容
四、实验结果与分析
五、实验总结与体会
一、实验目的要求
二、实验条件
三、实验内容
四、实验结果与分析
五、实验总结与体会
一、实验目的要求
二、实验条件
三、实验内容
四、实验结果与分析
五、实验总结与体会
一、实验目的要求
二、实验条件
三、实验内容
四、实验结果与分析
五、实验总结与体会
一、实验目的要求
二、实验条件
三、实验内容
四、实验结果与分析
五、实验总结与体会。
面向对象程序(vb)设计实习报告模板
(本报告为vb实习报告,封面请自行填写)实习报告题目:所属系、部:班级:姓名:学号:指导教师:2011年6月一、实习目的熟练掌握面向对象的概念、特点和基本的程序设计方法,熟悉使用常用的算法解决实际问题。
二、实习时间2011年6月13日-17日三、实习地点教学楼A302机房四、实习内容1、编写程序,将乘法“九九表”存入数组中,单击显示按扭,可以在当前窗口中显示出来;单击交换按扭后,弹出输入框,根据输入框里输入的数据交换乘法“九九表”中任意两行对应的数。
《99乘法表交换》设计代码Dim a(9)Dim b(9)Private Sub Command1_Clic k()Fori = 1 To 9a(i)= iForj = 1 To iPrint a(i) & "*" & a(j) & "="; a(i) * a(j);Next jPrintNextiEndSubPrivateSubCommand2_Click()Fori=1To 9a(i) = iNext iDim m%, n%m = InputBox("输入第一行号") n = InputBox("输入第二行号") Fori = 1 To 9a(i)= iIfi = m ThenFork = 1 To nb(k) = kPrint n & "*" & b(k)& "=";n * b(k);Next kPrinti = i +1EndIfIf i = nThenFork = 1 To mb(k) = kPrint m & "*" & b(k) & "=";m * b(k);Next kPrinti = i+ 1End IfForj = 1To iPrint a(i) &"*" &a(j) &"="; a(i) * a(j);Next jPrintNextiEnd Subﻩ图1-1《99乘法表交换》设计界面2、由随机函数产生10道一位整数与两位整数相加的加法题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++程序设计实验报告实验〇:顺序表与链表
专业:
班级:
姓名:
学号:
指导教师:
日期:
一、实验目的
熟练掌握动态链表结构及有关算法的设计。
掌握用链表表示特定形式的数据的方法,并能编写出有关运算的算法。
二、实验内容
链式存储结构及应用
1.键盘输入一组元素,尾部插入法建立一个单向链表。
2.在单向链表中删除一个结点。
3.在链表中插入一个元素。
三、需求分析
1.输入的形式和输入值的范围
建立链表时输入的都是整数,输入0代表输入的结束,插入元素时需要输入插入的位置和元素的值,删除元素时输入删除元素的值。
2.输出形式
所有操作在出现错误时都会有提示,并且在任意一个操作结束后都会输出操作后的链表。
3.程序所能达到的功能
完成链表的生成,任意位置插入元素、删除,实现链表数据的排序,删除链表中相同的元素,并且比较两个链表是否相等以及将两链表合成一个有序的链表。
4.测试数据:见第八部分。
四、概要设计
(1) 本程序包含的函数
主函数main()
显示操作菜单函数mainmenu()
显示单链表内容函数print()
尾部插入建立链表函数creatb()
插入元素函数insert()
删除函数Delete()
其中main函数负责操作其他的函数。
(2)各函数的功能设计为:
struct student *creatb():建立一个链表A(尾部插入建立的链表),并且返回这个链表的头指针.
struct student *insert(int a,int b,struct student *head):接受2个int类型的数据a和b(其中a为插入的位置,b为插入的数据),head
为需要操作的链表的头指针.
struct student *Delete(int a,struct student *head):删除链表A中和数据a相同的结点.返回操作后的链表的头指针.
struct student *Delete2(struct student *head):删除链表A中相同的元素返回操作后的链表的头指针.
struct student *creath():建立链表B(头部插入建立的链表),返回头指针.
struct student *paixu(struct student *head):调用2次该函数将A和B中的数据实现非递减的顺序排列,返回操作后链表的头指针.
struct student *merge(struct student *head1,struct student *head2):将链表A和B合成一个非递减的链表,返回新链表的头指针.
void compare(struct student *head1,struct student *head2,int flag):比较两链表是否相等.其中flag为判断用户是否进行了两链表的排序操作,当flag为1时,表示进行了排序操作.为0时表示没用进行排序操作(这样可以节省运算的时间).
mainMenu():打印出菜单
五、详细设计
(1)结点类型和指针类型:
struct student
{
int num;
struct student *next;
};
(2)单链表的基本操作
函数的算法:
(1) void mainmenu()
显示主菜单的函数
(2) void print(struct student *head)
输出函数,接受一个头指针,函数判断这个指针是不是为空,是的话就有提示语句,若不是则用while循环将链表的数据顺序输出.
(3) struct student *creatb()
尾部插入法创建链表的函数.首先创建3个student结构的指针p1,p2 ,head.第一次输入数据时p1接收输入的数据.然后让p2=p1,head=p1.再用while循环实现连续的输入.p1继续接受数据,调用语句p2->next=p1,将结点连接起来.然后p1和p2同时后移.当输入0时断开循环.返回head.
(4) struct student *insert(int a,int b,struct student *head)
插入元素的函数.接收2个int类型的数据(插入的位置和插入的数据),以及一个链表的头指针head通过while循环找到要插入的位置的前一个结点p和后一个接点q(要插入的结点记为s),然后执行语句p->next=s;s->next=q;将s插入到p和q中间.当要插入的位置为第一个时,执行语句s->next=head;head=s;当为最后一个位置时,首先找到原来链表的最后一个结点m,然后执行语句
m->next=s;s->next=null.从而实现了各个位置的插入操作
(5) struct student *Delete(int a,struct student *head)
删除元素函数,接收要删除的数据a,以及被操作的链表的头指针head.首先定义一个flag变量判断这个链表中是否有这个数据.然后通过while循环将整个的链表从头到尾遍历一便.如果找到了相同的数据结点(q).那么得到这个结点的前面一个结点p,执行语句p->next=q->next实现删除操作,同时定义flag为1(flag初始为0),表示找到了这样的结点.
六、调试分析
因为老师已经给出了创建链表和删除元素的代码,所以比较轻松的就实现了。
我觉得比较难的是删除那个函数,因为删除的情况比较复杂,需要考虑的情况也比较多,主要问题包括:删除元素在链表中多次出现,以及出现的位置的问题,比如重复的出现在一头和一尾,以及在第一个和第二个。
后来在网上看了这样类似的代码,并和同学讨论以后,改变了自己的算法,从而解决了这样的问题。
七、使用说明
运行后会有以下的菜单:
*******************欢迎进入链表操作,请选择操作***************
1.输入单链表(尾部插入)
2.在指定位置插入结点
3.删除指定数据的结点
*****************************4.结束操作退出系统********************
选择要进行的操作,如果出现了非法的操作,如没有建立链表就进行了删除或者插入操作,会有提示:先创建链表。
八、测试结果
(注:由于本实验的大部分程序在讲义上都出现过,所以设计部分没多大难度,关键是这部分:测试。
以下的撰写方式为:测试什么样的情况,使用什么输入,得到什么结果。
要求:测试的情况越全面越好。
)
1 、建立单链表:
选择 1 ,分别输入(0,11 ),(0,12 ),(0,13 ),(0,14 )(0,15 )。
得到单链表(15,14,13,12,11 )
2 、插入:
(1)测试插入位置不合法
选择 2 输入(-1,2 ),显示输入错误
(2)测试插入位置不合法
选择 2 输入(10,2 ),显示输入错误
(3)测试插入位置在头部
选择 2 输入(1,100 ),得到单链表(100,15,14,13,12,11 )(4)测试插入位置在尾部
选择 2 输入(7,2 ),得到单链表(100,15,14,13,12,11, 2)(5)测试插入位置在中间
选择 2 输入(3,8 ),得到单链表(100,15,8, 14,13,12,11, 2)3、删除:
(1)测试删除位置不合法
选择 3 ,输入10 。
返回输入错误
(2)测试删除位置不合法
选择 3 ,输入0 。
返回输入错误
(3)测试删除位置在头部
选择 3 ,输入 1 。
返回e=100 ,得到单链表(15,8, 14,13,12,11, 2 )(4)测试删除位置在中间
选择 3 ,输入 4 。
返回e=13 ,得到单链表(15,8, 14,12,11, 2 )(5)测试删除位置在尾部
选择 3 ,输入 6 。
返回e=2 ,得到单链表(15,8, 14,12,11 )
继续删除头部的节点,直到链表只剩下一个元素11。
(6)测试删除后链表为空链表
选择 3 ,输入 1 。
返回e=11 ,得到单链表为空链表
(7)测试在空链表中删除元素
选择 3 ,输入 1 。
提示链表为空,不能删除
九、附录:代码
代码略。