)字 号
《软件课程设计》报告
班级:信科07-3班 姓名:郑志安 学号:08073625 讲师:葛欣
中国矿业大学计算机科学与技术学院
2008年 11 1
郑志安 编号:(
月
郑志安
软件课程设计任务书
专业年级:电子信息科学与技术2007级 学生姓名: 郑志安
任务下达日期:2008年11月14日
课程设计日期:2008年11月14日至2009年1月4日
课程设计题目:
类别 题目序号 面向过程 1,2,3,4,5,7, 面向对象 1,2,3,4,5,6, 图形界面 1 数据结构 1,2,3,4
2
软件课程设计指导教师评阅书
指导教师评语(①基础理论及基本技能的掌握;②独立解决实际问题的能力;
③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题等):
成 绩:
指导教师签字: 年
月 日3
目 录
==============================
第一部分 基础题
1面向过程 第3题:使用如下所谓的简单变量“数据平移”方法来求出
Fibonacci数列的第n项上……………..………………....................................7
显
示
在
屏
幕
1.1 需求分析…………………………………………………………………………1 1.2 概要设计………………………………………………………………………...1 1.3 详细设计与编码………………………………………………………………...1 1.4 调试分析………………………………………………………………………...2 1.5 用户使用说明 ………………………………………………………………….3 1.6 设计心得………………………………………………………………………...3
第7题…………………………………………………………………………3
2.1需求分析………………………………………………………………………….3 2.2 概要设计………………………………………………………………………..3 2.3 详细设计与编码………………………………………………………………...4 2.4 调试分析………………………………………………………………………...4 2.5 用户使用说明 ………………………………………………………………….5 2.6 设计心得………………………………………………………………………...5
2面向对象 第3题利用虚函数手段,按照3种不同的计算方法来求出Fibonacci数列
的第n项(的具体项值)并输出。………………………………..………………….5 3.1需求分析…………………………………………………………………………..5 3.2 概要设计………………………………………………………………………...5 3.3 详细设计与编码………………………………………………………………...6 3.4 调试分析………………………………………………………………………..6 3.5 用户使用说明 ………………………………………………………………….7 3.6 设计心得………………………………………………………………………..7
第8题编写程序实现一个简单的电话记录簿,要求记录的个人信息包括:姓名,单位,
家庭电话,移动电话,并包含保存、输出、查询、修改等功能………………………………………………………………….……………………..7 4.1需求分析…………………………………………………………………………..7
4
4.2 概要设计………………………………………………………………………...7 4.3 详细设计与编码………………………………………………………………...8 4.4 调试分析………………………………………………………………………...8 4.5 用户使用说明 ………………………………………………………………….9 4.6 设计心得………………………………………………………………………...10
3可视化编程 第1题
实现计算器编程。该计算器需要实现基础的数学运算,如加,减,乘,除。
5.1需求分析…………………………………………………………………………..11 5.2 概要设计………………………………………………………………………...12 5.3 详细设计与编码………………………………………………………………...13 5.4 调试分析………………………………………………………………………...14 5.5 用户使用说明 ………………………………………………………………….15 5.6 设计心得………………………………………………………………………...15
第2题使用Visual C++ 6.0实现以下绘图程序(可以参考附件中的程序
代码)。
6.1需求分析…………………………………………………………………………..15 6.2 概要设计………………………………………………………………………...15 6.3 详细设计与编码………………………………………………………………...15 6.4 调试分析………………………………………………………………………...16 6.5 用户使用说明 ………………………………………………………………….16 6.6 设计心得………………………………………………………………………...16
4数据结构 第2题
假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知p为指向链表中某结点的指针,试编写算法在链表中删除结点p 的前趋结点。
7.1需求分析…………………………………………………………………………..17 7.2 概要设计………………………………………………………………………...17 7.3 详细设计与编码………………………………………………………………...17 7.4 调试分析………………………………………………………………………...18 7.5 用户使用说明 …………………………………………………………………18 7.6 设计心得………………………………………………………………………...18
第3题
求A矩阵的转置矩阵B
8.1需求分析…………………………………………………………………………..19 8.2 概要设计………………………………………………………………………...19 8.3 详细设计与编码………………………………………………………………...19 8.4 调试分析………………………………………………………………………...19
5
8.5 用户使用说明 ………………………………………………………………….19 8.6 设计心得………………………………………………………………………...20
1面向过程
第3题 编程序,使用如下所谓的简单变量“数据平移”方
法来求出Fibonacci数列的第n项(的具体项值)并显示在屏幕上(正整数n通过键盘输入) 1.1 需求分析:
当我们在生活中或者数学、物理等学习过程中,往往会遇到累加问题,即新的项是由于它距离最近的两项的加和,不断的生成新项,实现了累加,进行所谓的“数据平移”,因此实现此类算法是很有必要的。 1.2 概要设计:
说明变量old1=1,old2=1,newItem;新的Fibonacci项newItem总是“距它最近”的前两项(old1与old2)的累加和。而后通过“old1=old2; old2=newItem;”进行所谓的“数据平移”。接着计算另一个新的Fibonacci项newItem,依次循环,直到求出数列的第n项时为止。 Fibonacci数列的计算公式如下: fib(1) = 1; fib(2) = 1;
fib(n) = fib(n-1) + fib(n-2); //对大于等于3的任意n 1.3详细设计与编码:
(流程图)
old1=1,old2=1
真 假
NewItem=Old1+old2
Old1的值赋给K
把old2的值赋给old1, newItem的值赋给old2(实现移位) 6
返回错误
(最终代码及必要说明 )
#include int old1=1,old2=1,newItem,n,k; //定义变量,newItem是总是靠近他的前两项 cout<<\"---------------------------\"< for(int i=0;i k=old1; //累加和算法,在每一次循环过程中将其值前移 old1=old2; old2=newItem; } cout< 7 1.4调试分析 1.newItem,n,k的类型是int型 2.赋值过程中一定是newItem=old1+old2; 而不是old1+old2 =newItem 3. 注意体会尝试程序的健壮性。 4.尝试用其他方法完成该程序 1.5用户说明 用户可直接通过键盘向界面输入你要求的Fibonacci数列的第n项,按回车键即可得到答案。 1.6 设计心得: 在这个程序设计中,所用的都是最基本的知识,对于最基本的知识一定要达到熟练的程度,才能熟中生巧,设计出高质量的程序。 2.面向过程 第7题将输入的罗马数据化为10进制数。假设罗马数据中 只使用如下7个“基值”字母:M、D、C、L、X、V、I,分别用来表示1000、500、100、50、10、5、1。 2.1需求分析: 8 我们在生活中常会遇见用罗马数字表示的代码或者数学、物理等学习过程中,往往会遇到将罗马数字转化为十进制数的计算,设计一个简单的转换程序是很有意义的 2.2概要设计 将输入的10进制正整数转换为罗马数据。假设罗马数据中只使用“基值”字母:M、D、C、L、X、V、I,分别用来表示1000、500、100、50、10、5、1。显然是一个翻译程序,肯定是将一种表达形式换算成另一种表达形式。该题是把罗马数字转换成十进制数,初步设想:输入一个字符数组,即一个罗马数字,然后按照其位数上的权值展开后输出,即输出一个十进制数。 2.3详细设计与编码: (流程图) 输入 判断字符的表达和字符 的初始化,m,d,c,等设0 输入字符串,即罗马数字 执行判断句,即else if 语句 a=1000*m+500*d+100*c+50*l+10* x+5*v+1*i; //将翻译的数付给a 输出 9 任意一个步骤出错输出错误 10 运行结果: 2.4调试分析 1程序开始不可少语句 int a,m=0,d=0,c=0,l=0,x=0,v=0,i=0; //设“基值”并作零初始化,若不做初始化,字母输出任意值。 2.将对应的权值相乘,将各位加和赋给a输出,除了对应之外没有其他难点 3.尝试着用其他方法编写 2.5用户使用说明: 用户可意直接根据提示从键盘输入罗马数字,按回车键可以方便得到结果 2.6设计心得: 此程序在设计之前,一定要分析好设计思路,巧妙运用循环语句。同时也要注意时间复杂度的分析,尽量使程序高效运行。 3面向对象 第3题利用虚函数手段,按照3种不同的计算方法来求 出Fibonacci数列的第n项(的具体项值)并输出。具体地说,可通过在基类baseCla及其派生类fib1Cla、fib2Cla和fib3Cla中说明如下的同一个虚函数“virtual double fib(int n);”, 来实现求Fibonacci数列第n项值并返回的3种不同求解方法。 11 3.1需求分析 运用对象实现该算,法虽是递归算法,对于实现大规模,繁多数据的处理是很有必要的。 3.2概要设计 主要函数列表,每条记录应包括函数名及功能简要说明 1.class baseCla //自定义基类baseCla 2.virtual double fib(int n)=0 //在基类中说明一个虚函数fib,且为纯虚函数 3.class fib1Cla:public baseCla //基类class baseCla中派生出的fib1Cla 4. virtual double fib(int n) //派生类中说明同一个虚函数fib 5.void fun(baseCla *p, int n) //定义函数,用n指明项 6.void main() //主函数调用输出 3.3详细设计与编码 代码略 截屏如下: 3.4调试分析 1. 定义基类baseCla的位置很重要。 2.基类class baseCla中派生出的fib1Cla的表达式的写法不可些错 为class fib1Cla:public baseCla 3. 写程序时的位置对应,以便查错。 4. 函数对应的调用顺序要正确,不但容易阅读而且容易查错。 5. 考虑程序的健壮性,并不断尝试不同的更简洁的算法使我们当前的工作。 12 3.5用户使用说明: 屏幕直接显示。 3.6设计心得: 通过此题,我对上学期所学类的定义以及应用达到了复习的效果,熟悉了函数的调用等编程,Fiboccas数列由于上学期就学过,对于期原理有一定的掌握,所以这个程序设计倒是不难。 4面向对象 第8题编写程序实现一个简单的电话记录簿,要求记录 的个人信息包括:姓名,单位,家庭电话,移动电话。具体功能如下: 1.创建信息链表并以磁盘文件保存。 2.读取磁盘文件并显示输出所有人的移动电话。 3.按姓名或单位查询家庭电话。 4.通过姓名和单位确定个人,修改其电话信息并存盘. 4.1需求分析 把家庭电话本用软件的形式实现,可以实现记录,查找,修改以及反应有关信息更加自动化,而且以管理等优点,特别是在电话和信息很多很复杂是更会显示出其优点,因此实现电话本系统是很有必要的。 4.2概要设计 按要求实现一个简单的电话簿,不难想到定义功能类,实现输入,保存, 读取,查询,修改等功能。初步设计: 1.struct phonelist//信息输入类 2.phonelist *creat()//创建电话簿 3.find(phonelist *head,char name[]) //信息查询类 4.change(phonelist *head,char name[] ) //信息改变类 5.int main()// 主函数调用, 4.3详细设计与编码 代码略 截屏如下: 13 4.4调试分析 1编程前一定要在整体考虑其结构和实现功能方面做足功夫 3程序时的位置对应,以便查错。 4.函数对应的调用顺序要正确,不但容易阅读而且容易查错。 5.考虑程序的健壮性,并不断尝试不同的更简洁的算法使我们当前的 4.5用户使用说明: 用户可以根据提示从键盘先选择功能键,然后一步一步根据提示输入信息,程序系统会自动在屏幕上生成用户想要的信息 4.6设计心得: 通过该程序的设计,更体会到在大规模的信息调用类以及生成类会更好,更进一步培养自己的编程风格,先整体规划,然后一步一步实现;出错处理的能力;算法复杂度分析,期待着更大的进步··· 5 可视化编程 计算器 5.1用你熟悉的一种可视化编程语言 实现如下图所示的计算器。该计算器需要实现基础的数学运算,如加,减,乘,除。 14 5.1需求分析 小型计算器的可视化编程 5.2概要设计 程序是用mfc制作,在进入mfc时选择基本对话框来建立工程,然后根据题目图形的需求,在工作区的Resourceview中的Dialog进行框架的设计,如上图所示的图形进行按钮的拖放,当按钮都拖放完毕后就进行按钮函数的设计 5.3详细设计与编码 实现过程: 1. 加法的实现,如7+8=15的操作如下: 15 16 2.乘法的实现,如8*9=72的操作如下: 17 18 减法和除法的实现就不再表示了。 5.4调试分析本程序的设计过程是根据学校所给的范例程序仿制而成,当将程序写进去后,在调试时出现的主要问题就是不能显示点击的数字和结果,经过 5.5用户使用说明 本程序是简单的计算器程序使用很简单,直接点击按钮和相应的算术符号就能得到结果。 5.6设计心得 可视化编程编程由于以前没接触过所以较难,许多函数都 要查资料,或上网搜寻。 1. 6可视化编程使用Visual C++ 6.0实现以下绘图程序(可以参考附件中的 程序代码)。要求: (1)程序中包含图中所示菜单项和工具栏; (2)先选择菜单项或单击工具栏上的命令按钮,然后在窗体空白区域单击鼠标后,绘制相应菜单项或命令按钮指定的图形、文字。 6.1需求分析 学习使用编程实现绘图 19 6.2概要设计 程序是用MFC制作,在进入MFC时选择基本对话框来建立工程,然后根据题目图形的需求,在工作区的Resourceview中的Dialog进行框架的设计,跟着视频思路往下走。 6.3详细设计与编码 第一步:初步界面 第二步:图形界面 20 第三步:实现文字输出 21 第四部:实现绘图 第五步:图形与文字: 22 6.4调试分析 本程序的设计过程是根据学校所给的范例程序仿制而成,操作较简单,写入程序后较容易调试。 6.5用户使用说明 根据窗口上面的提示用鼠标左键单击即可得到用户所用的图形和文字。 6..6设计心得 通过花一定的时间看完MFC视频跟着提示的步骤制作,熟练了可视化编程的步骤,为以后的学习积累基础。 7数据结构第二题假设有一个循环链表的长度大于1,且表中既无 头结点也无头指针。已知p为指向链表中某结点的指针,试编写算法在链表中删除结点p 的前趋结点。 7.1需求分析 在数据结构的学习中,链表是最常见的存储方式,链表的插入,删除,改正也就是很常用的操作,对它的学习就显得很有必要而且很有意义。 7.2概要设计 1. 对节点的删除,无疑先要定义一个结构体和指针,运来存放和查找要删除的节点struct Node *next 2.设计一个类求前驱节点:Node* getPriorNode(Node *node) 23 3. 删除指向结点的前驱结点:deletePriorNode(Node *node) 4. 输出原始链表:printList(Node *node) 5.主函数将操作后的链表输出。 7.3详细设计与编码 代码略 截图如下; 7.4调试分析 1.我在首次调试时错将指向前驱节点的指针分开写了,这显然是一个错,,指针是一个具有整体性的符号,不能分裂。 2.编写过程要细心,缺分号,括号的现象也有时发生 7.5用户使用说明 程序中的数字是从编程时输入的,平心而论该程序还有很大的改编空间,是一个静态的检验程序 7.6设计心得 进一步掌握了链表的基本操作,前驱指针在查找节点时的作用,类的整体设计和个类之间的关系,弄懂这些编程的要点,无论是在今后的学习还是调试过程中都是很有意义的。 8数据结构第三题求A矩阵的转置矩阵B 24 8..1需求分析 矩阵是物理数学中极其常见的数学工具,研究它的运算也是十分重要的,特别的在计算机程序中的应用是更重要的 8.2概要设计 输入两个正整数m和n,而后通过使用指针配合new运算符生成一个m行n列的二维动态数组A以及另一个n行m列的二维动态数组B,之后为A输入数据(A矩阵数据),进而求出其转置矩阵B(数据放动态数组B中)。既是要求又是提示,故有一下提纲: 1. p=new int *[m]; q=new int *[n];建立动态数组分别存放行和 列 2. for(i=0;i 3. q[j][i]=p[i][j]; 转置 8.3详细设计与编码 代码略 截图 8.4调试分析 本程序的编写,调试费了好大的力气,具体的: 25 1. int **p,**q 指针的定义符号问题,即指向指针的指针 2. p=new int *[m], q=new int *[n]动态数组的定义问题 3. for(i=0;i 用户通过键盘输入矩阵,按回车键即可得结果 8.6设计心得 此程序看似虽看简单,编写实属不易,通过改题目,掌握了矩阵的有关操作,输入,动态数组的应用以前没见过,是我通过看《C++技术内幕》上面的一个例题而得;掌握了转置的输出 26 因篇幅问题不能全部显示,请点此查看更多更全内容