数据结构课程设计报告书
数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。
二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。
在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。
三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。
2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。
3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。
4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。
5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。
四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。
2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。
通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。
3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。
链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。
在实现链表时,我们定义了一个节点结构,包含数据域和指针域。
通过指针的方式将节点连接起来,形成一个链式结构。
同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。
4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。
数据结构课程设计报告

数据结构课程设计报告数据结构课程设计报告设计题目:实现一个简单的通讯录管理系统设计背景:在日常生活中,我们经常需要管理并使用一些联系人的联系信息,例如电话号码、姓名、地址等。
为了方便对这些联系人进行管理和查询,我们设计了一个简单的通讯录管理系统。
设计目的:本设计旨在通过实现一个通讯录管理系统,加深对数据结构的理解和应用。
通过该系统,用户可以方便地添加、删除、修改和查询联系人信息,提高信息的管理效率和准确性。
设计原理:该系统采用基于链表的数据结构,其中每个节点存储一个联系人的信息,包括姓名、电话号码和地址。
系统提供了以下功能:1. 添加联系人:用户可以输入联系人的姓名、电话号码和地址,程序将创建一个新节点,并将其插入链表中。
2. 删除联系人:用户可以输入要删除的联系人姓名,程序将遍历链表查找到该节点,并将其删除。
3. 修改联系人信息:用户可以输入要修改的联系人姓名,程序将遍历链表查找到该节点,并允许用户修改联系人的电话号码和地址。
4. 查询联系人信息:用户可以输入要查询的联系人姓名,程序将遍历链表查找到该节点,并显示联系人的姓名、电话号码和地址。
设计过程:1. 定义联系人信息结构:创建一个结构体,包含姓名、电话号码和地址等字段的定义。
2. 定义链表节点结构:创建一个结构体,包含联系人信息和指向下一个节点的指针。
3. 实现添加联系人功能:用户输入联系人信息,程序创建一个新节点,并将其插入链表的适当位置。
4. 实现删除联系人功能:用户输入要删除的联系人姓名,程序遍历链表查找到该节点,并将其删除。
5. 实现修改联系人信息功能:用户输入要修改的联系人姓名,程序遍历链表查找到该节点,并允许用户修改联系人的电话号码和地址。
6. 实现查询联系人信息功能:用户输入要查询的联系人姓名,程序遍历链表查找到该节点,并显示联系人的姓名、电话号码和地址。
7. 设计界面显示:使用控制台界面,根据用户选择调用相应的功能函数。
设计结果:通过实验和测试,我们成功实现了一个简单的通讯录管理系统。
数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
数据结构课程设计报告书

1引言本设计使用C语言编写程序,以栈为主体实现功能,所以首先我们要认识一下栈。
栈是限定仅在表尾进行插入或删除操作的线性表,其存取数据时按照后进先出的原则进行。
而此次课程设计就是利用栈的这一特性并结合栈的输入、输出、判空等基本操作,来实现栈的三种实际应用:数制转换,行编辑和括号匹配。
2问题分析2.1 设计内容的分析本次课程设计的目标是使用C语言编写一个程序,当使用者进入程序时,首先出现一个菜单项,使用者可以选择所要实现的功能,从而进入相应的程序模块:数制转换:进入此模块后,程序提示输入任意一个十进制数和所要转换的进制,程序运行后得到相应进制的数据。
行编辑:进入模块后,程序提示输入原始数据,运行时当遇到#时退格一个,当遇到@时,清空所在行中之前的所有数据;当遇到\n时,完成前一行的输入处理,进行下一行的输入;当遇到¥时,全文输入编辑结束。
括号匹配:进入模块后,程序提示输入所要检验的括号以#为结束符,当括号匹配不正确时,程序输出相应的:左右括号匹配次序不正确,左括号多于右括号,右括号多于左括号。
当左右括号匹配无误时,输出左右括号匹配正确。
2.2 程序中用到的数据结构本程序主要是运用栈的相关知识,所以为了实现上述的三种功能,需要定义栈的结构用于储存数据:typedef char ElemType;//定义用户变量,代替char,便于以后修改typedef struct{ElemType *base;//在栈构造之前和销毁之后,base的值为NULLElemType *top;//栈顶指针int stacksize;//当前已分配的存储空间,以元素为单位}SqStack;实现第一个模块功能时,需要使用while语句进行栈的输入输出。
实现第二个模块功能时,需要使用while语句和swicth语句的嵌套来进行文本编辑实现第三个模块功能时,需要使用if、else语句的多重嵌套来判断匹配3总体设计3.1 总体设计思路本程序主要首先在主函数通过调用switch 语句来选择需要实现的功能,从而进入相应的函数模块。
数据结构课程设计(5篇)

数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。
三、具体要求1)利用完全二叉树的性质建立一棵二叉树。
(层数不小于4层)2)统计树叶子结点的个数。
3)求二叉树的深度。
4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。
四、进度安排依照教学计划,课程设计时间为:2周。
本设计要求按照软件工程的基本过程完成设计。
建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。
三个阶段时间分配的大概比例是:35: 45: 20。
五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。
其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。
4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。
5、源代码要求在关键的位置有注释,增加程序的可读性。
程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。
《数据结构》课程设计报告范本(doc 8页)

《数据结构》课程设计报告范本(doc 8页)《数据结构》课程设计报告一、课程设计的内容、要求1 线性表的另一种实现。
对顺序表空间被耗尽问题的一个解决办法是:当数组溢出时,用一个更大的数组替换该数组。
一个较好的法则是:当出现溢出时,数组长度加长一倍具有较高的时间和空间效率。
参照教材中顺序表的有关内容,按上面的要求实现顺序表,并测试当数组溢出时你的实现的运作情况。
二、所采用的数据结构ADT List{数据对象: D = {a i|a i ∈ElemSet, i=1,2…n>=0}数据关系: R1={<a i-1, a i>|a i-1, a i∈D, i=1,2,…,n}基本操作:void IniList(SqList& L);void DestroyList(SqList& L);bool ListEmpty(SqList L);int ListLength(SqList L);void GetElem(SqList L, int i, Elem &e);bool PriorElem(SqList L, Elem cur_e, Elem &pre_e);bool NextElem(SqList L, Elem cur_e, Elem &next_e);void ListInsert(SqList &L, int i, Elem e);void ListDelete(SqList &L, int i);void ClearList(SqList& L);}三、主要模块(或函数)及其功能typedef struct LIST{ElemType *data;int size;int max_size;}LIST;void InitList(LIST *list)//初始化{list->data = (int*)malloc(sizeof(ElemType)*INIT_SIZE);list->size = 0;list->max_size = INIT_SIZE;}void DestroyList(LIST &list){}bool NextElem(LIST list,int cur_e,int &next_e)//后继{if(cur_e < 0 || cur_e > list.size) return false;else{next_e = cur_e + 1;return true;}}void Insert(LIST *list,ElemType value){if(list->size>=list->max_size){int i;ElemType *temp = (int*)malloc(sizeof(ElemType)*list->size*2);cout<<endl<<"线性表原容量改变:原大小为"<<list->max_size;for(i=0;i<list->size;i++){temp[i] = list->data[i];}free(list->data);list->data = temp;list->max_size*=2;cout<<"改变后大小"<<list->max_size<<endl;}list->data[list->size] = value;list->size++;}void Insert_Back(LIST *list,int idx,ElemType value){if(list->size>=list->max_size){int i;ElemType *temp = (int*)malloc(sizeof(ElemType)*list->size*2);cout<<endl<<"线性表原容量改变:原大小为"<<list->max_size;for(i=0;i<list->size;i++){temp[i] = list->data[i];}free(list->data);list->data = temp;list->max_size*=2;cout<<"改变后大小"<<list->max_size<<endl;}if(idx>list->size){list->data[list->size] = value;}else{int i;for(i=list->size;i>idx;i--){list->data[i] = list->data[i-1];}list->data[idx] = value;}list->size++;}void ListDelete(LIST *list,int i,ElemType *e)//删除一个元素{int j;*e=list->data[i];for(j=i+1;j<=list->size-1;j++)list->data[j-1]=list->data[j];list->size--;}void Print_list(LIST *list){int i;if(list->size == 0){cout<<"当前线性表内没有元素。
《数据结构》课程设计报告

《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。
本课程目标如下:1. 知识目标:(1)理解数据结构的基本概念,包括线性表、栈、队列、串、数组、树、图等;(2)掌握各类数据结构的存储表示和实现方法;(3)了解常见算法的时间复杂度和空间复杂度分析;(4)掌握排序和查找算法的基本原理和实现。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,如实现字符串匹配、图的遍历等;(2)具备分析算法性能的能力,能够根据实际问题选择合适的算法和数据结构;(3)具备一定的编程能力,能够用编程语言实现各类数据结构和算法。
3. 情感态度价值观目标:(1)培养学生对计算机科学的兴趣,激发其探索精神;(2)培养学生团队合作意识,提高沟通与协作能力;(3)培养学生面对问题勇于挑战、善于分析、解决问题的能力;(4)引导学生认识到数据结构在计算机科学中的重要地位,激发其学习后续课程的兴趣。
本课程针对高年级学生,课程性质为专业核心课。
结合学生特点,课程目标注重理论与实践相结合,强调培养学生的实际操作能力和解决问题的能力。
在教学过程中,教师需关注学生的个体差异,因材施教,确保课程目标的达成。
通过本课程的学习,学生将具备扎实的数据结构基础,为后续相关课程学习和职业发展奠定基础。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、串、数组、树、图等;教学大纲:第1章 数据结构概述,第2章 线性表,第3章 栈和队列,第4章 串。
2. 数据结构的存储表示和实现方法:教学大纲:第5章 数组和广义表,第6章 树和二叉树,第7章 图。
3. 常见算法的时间复杂度和空间复杂度分析:教学大纲:第8章 算法分析基础。
4. 排序和查找算法:教学大纲:第9章 排序,第10章 查找。
教学内容安排和进度如下:1. 第1-4章,共计12课时,了解基本概念,学会使用线性表、栈、队列等解决简单问题;2. 第5-7章,共计18课时,学习数据结构的存储表示和实现方法,掌握树、图等复杂结构;3. 第8章,共计6课时,学习算法分析基础,能对常见算法进行时间复杂度和空间复杂度分析;4. 第9-10章,共计12课时,学习排序和查找算法,掌握各类算法的实现和应用。
数据结构课程设计报告 (4)

数据结构课程设计报告1、引言数据结构是计算机科学中的重要基础课程,它研究如何组织和管理数据以及数据之间的关系。
掌握良好的数据结构对于程序设计和算法的实现至关重要。
本报告将介绍在数据结构课程中完成的设计项目,主要包括设计目标、设计思路、实现细节以及结果分析等内容。
2、设计目标本设计项目的目标是实现一个简单的学生成绩管理系统,该系统能够实现对学生的基本信息以及各门课程成绩的管理和查询。
设计的关键要求如下:1.能够添加学生信息并关联其各门课程成绩;2.能够根据学号查询学生信息以及其各门课程成绩;3.能够计算学生的总成绩和平均成绩;4.能够实现对学生信息和成绩的修改和删除操作。
3、设计思路为了实现上述设计目标,我们采用了链表数据结构来保存学生信息和成绩。
链表的节点用来存储学生的基本信息,如学号、姓名、性别等,同时还包含一个指向课程成绩链表的指针。
课程成绩链表的节点用来存储每门课程的成绩。
在添加学生信息时,我们按照学号的顺序将学生节点插入到链表中。
通过遍历链表,我们可以根据学号查找到对应的学生节点,并进一步查找到该学生的课程成绩链表。
对于查询操作,我们可以通过遍历链表找到匹配的学生节点,然后输出其基本信息和课程成绩。
计算总成绩和平均成绩可以通过遍历课程成绩链表并累加每门课程的成绩来实现。
修改和删除操作可以通过遍历链表找到匹配的学生节点,并进行相应的修改或删除操作。
4、实现细节该学生成绩管理系统的具体实现细节如下:•使用C++编程语言实现;•采用链表数据结构,分别设计了学生信息链表和课程成绩链表;•学生信息链表的节点包括学号、姓名、性别等信息,以及指向课程成绩链表的指针;•课程成绩链表的节点包括课程名称和成绩信息;•提供了添加学生信息、添加课程成绩、查询学生信息、查询课程成绩、计算总成绩和平均成绩等功能;•通过遍历链表实现对学生信息和成绩的修改和删除操作。
5、结果分析经过测试和验证,该学生成绩管理系统能够满足设计目标,并能够正常运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南通大学计算机学院《数据结构课程设计报告书》题目: 2.3表达式求值问题专业:计算机科学与技术开始日期: 2013.01.14完成日期: 2012.01.161.问题的描述和分析1.1问题描述表达式是数据运算的基本形式。
人们的书写习惯是中缀式,如:11+22*(7-4)/3。
中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。
表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 – 7 4 3)。
后缀表达式和前缀表达式中没有括号,给计算带来方便。
如后缀式计算时按运算符出现的先后进行计算。
本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。
1.2 问题分析选择了栈,在某些运算部分采用了数组。
重点是栈的使用问题,栈是限制只能在表的一端进行插入和删除的线性表,栈顶能进行插入和删除而栈底不允许插入和删除。
难点是使用栈存表达式和让表达式逆序输出这些问题。
2.概要设计2.1系统模块划分图2-1 系统模块图2.2 ADT(抽象数据类型)描述要求:描述系统所采用数据结构的抽象数据类型,只要说清楚数据对象、数据关系,基本操作集合,切勿复制大量代码,可以参考教材如何定义ADT的。
例如:ADT Stack{数据对象:D={ai|ai∈ElementSet,i=1,2,…,n,n≥0}数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,…,n基本操作:(1)char Precede(char t1,char t2)进行运算符优先级的比较(2)int In(char c)判断输入的c是否是运算符(3)double Operate(double a,char theta,double b) 进行一次运算(4)double Val_Exp(char *exp)进行中缀表达式的求值(5) void CreatePostExp(char * exp,char * &postexp) 中缀表达式求后缀表达式(6)double Val_PostExp(char *postexp)后缀表达式求值(7)void CreatePreFax(char * exp,char * &prefax) 中缀表达式求前缀表达式(8)double Va2_PreFax(char *prefax)前缀表达式求值}3.详细设计3.1 ADT基本操作算法设计3.1.1ADT操作(1)char Precede(char t1,char t2)进行运算符优先级的比较括号优先级高,其实乘除,最后加减(5)int In(char c)判断输入的c是否是运算符(6)double Operate(double a,char theta,double b) 进行一次运算进行加减乘除运算(7)double Val_Exp(char *exp)进行中缀表达式的求值Step 1:设定两栈,操作符栈和操作数栈;Step 2:栈初始化:设操作数栈为空;Step 3:依次读入字符:若是操作数则入栈;如果是操作符:若优先级小于栈顶元素,则退栈、计算,结果压入操作数栈;若优先级等于栈顶元素,则脱括号;若优先级大于栈顶元素,则压入操作符栈;(5) void CreatePostExp(char * exp,char * &postexp)中缀表达式求后缀表达式Step 1:设立暂存运算符的栈;Step 2:设表达式的结束符为“=”;Step 3:若当前字符是操作数,则直接给输出串;Step 4:若当前运算符的优先级高于栈顶运算符,则压栈;Step 5:否则,栈顶运算符出栈;Step 6:“(”对它之前后的运算符起隔离作用,“)”可视为自相应左右括弧的表达式的结束符。
(6)double Val_PostExp(char *postexp)后缀表达式求值Step 1:读入表达式的一个字符;Step 2:若是操作数,压入栈,转4;Step 3:若是运算符,从栈中弹出两个数,将运算结果压入栈Step 4:若表达式输入完毕,栈顶即表达式值;若表达式未输入完,转1;(7)void CreatePreFax(char * exp,char * &prefax)中缀表达式求前缀表达式Step 1:求输入串的逆序;Step 2:检查输入的下一个元素;Step 3:假如是操作数,把他添加到输出串;Step 4:假如是闭括号,将它压栈;Step 5:假如是运算符,则:(1)如果栈空,此运算符入栈;(2)如果栈顶是闭括号,此运算符入栈;(3)如果它的优先级高于或等于栈顶运算符,此运算符入栈;(4)否则,栈顶运算符出栈并添加到到输出串,重复步骤5;Step 6:假如是开括号,栈中运算符逐个出栈并输出,知道遇到闭括号,闭括号出栈并丢弃;Step 7:假如输入还未完毕,跳转到步骤2;Step 8:假如输入完毕,栈中剩余所有元素操作符出栈并加到输出串中;Step 9:求输出串的逆序。
(8)double Va2_PreFax(char *prefax)前缀表达式求值Step 1:从左到右扫描前缀表达式;Step 2:从右面的第一个字符开始判断:(1):如果该字符时操作数,则一直到数字串的末尾再记录下来;(2):如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的数字串并记录下来,一直扫描到表达式的最左端时,最后运算的值也就是表达式的值。
3.2 功能模块设计3.2.1 登录/录入模块(1)界面设计(2)处理流程设计前缀表达式的值结束4.运行和调试4.1 运行和测试运行:0错误,0警告;测试:以下四个图为测试结果:图(1):表达式的创建和表达式的求值;图(2):求后缀表达式和后缀表达式求值;图(3):求前缀表达式和前缀表达式求值;图(4):显示表达式和退出系统4.2 调试记录与收获整个表达式求值程序过程中出现了不少问题。
比如在整个程序中使用float造成了多警告,在改用double后得到解决;在求前缀表达式的问题中,用定义的字符去表示栈顶操作符和优先级比较的大小值,也造成了程序虽无错但无法运行的情况,最终直接用OP.GetTop()和调用了优先级比较函数解决了问题;在前缀表达式求值部分,出现了考虑不周的情形,比如把带小数的中缀表达式输入后运行出的结果错误,问题出在表达式出栈时小数的小数点左右的两个数字调换了,经过思考发现需要对输出的小数采用一次逆输出才解决了问题。
调试过程还出现了if与else if 不配对的问题,但都通过思考和请教别人解决了。
这次的课程设计比大一两学期的课程设计都来的综合,让我认识到了自己很多方面知识的缺漏,让我在使用C++语言解决问题方面得到了锻炼,也清楚的意识到了自己能力的欠缺,比如不会使用QT进行界面设计,需要自己去自学。
在编写程序的过程中,思路的清晰是最重要的,其次就是编写时要谨慎,要细心。
而在调试过程中,坚持很重要,调试是个复杂的过程,需要一次次去修改错误,我们不能放弃。
另外,请教他人也是不可少的,因为在长时间的调试过程中,我们容易产生固定思维,此时让别人帮忙看看错误也许更容易发现。
以上,就是我对本次课程设计一些体会和总结。
//附录源程序:#include<iostream.h>//cout,cin#include"process.h"//exit()#include"stdio.h"//EOF,NULL#include<string.h>#include<stdlib.h> // atoi()#include"SqStack.h"char pause;char Precede(char t1,char t2){//算符的优先级比较char f;switch(t2){case '+':case '-':if(t1=='('||t1=='=')f='<';elsef='>';break;case '*':case '/':if(t1=='*'||t1=='/'||t1==')')f='>';elsef='<';break;case '(':if(t1==')'){cout<<"ERROR1"<<endl;exit(0);}elsef='<';break;case ')':switch(t1){case '(':f='=';break;case '=':cout<<"ERROR2"<<endl; exit(0);default: f='>';}break;case '=':switch(t1){case '=':f='=';break;case '(':cout<<"ERROR2"<<endl;exit(0);default: f='>';}}return f;}int In(char c){ // 判断c是否为运算符switch(c){case'+':case'-':case'*':case'/':case'(':case')':case'=':return 1;default:return 0;}}double Operate(double a,char theta,double b){//实施一次运算double c;switch(theta){case'+':c=a+b;break;case'-':c=a-b;break;case'*':c=a*b;break;case'/':c=a/b;}return c;}double Val_Exp(char *exp){ //中缀表达式求值。
设OPTR和OPND分别为运算符栈和运算数栈SqStack<char> OP(20);SqStack<double> OD(20);char theta;double a,b,d;char c,x; // 存放由键盘接收的字符char z[6]; // 存放符点数字符串int i;OP.Push('='); // =是表达式结束标志c=*exp++;x=OP.GetTop();while(c!='='||x!='='){if(In(c)) // 是7种运算符之一switch(Precede(x,c)){case'<':OP.Push(c); // 栈顶元素优先权低c=*exp++;break;case'=':x=OP.Pop(); // 脱括号并接收下一字符c=*exp++;break;case'>':theta=OP.Pop(); // 退栈并将运算结果入栈 b=OD.Pop();a=OD.Pop();OD.Push(Operate(a,theta,b));}else if(c>='0'&&c<='9'||c=='.') // c是操作数{i=0;do{z[i]=c;i++;c=*exp++;}while(c>='0'&&c<='9'||c=='.');z[i]='\0';d=atof(z); // 将字符串数组转为符点型存于dOD.Push(d);}else // c是非法字符{cout<<"ERROR3"<<endl;;exit(0);}x=OP.GetTop();}d=OD.GetTop();return d;}void CreatePostExp(char * exp,char * &postexp){//由中缀式求后缀式char c,x;int i=0;SqStack<char> OP(20);OP.Push('='); // =是表达式结束标志cout<<"exp:"<<exp<<endl;c=*exp++;while(c){if((c>='0'&&c<='9')||c=='.'){postexp[i++]=c;c=*exp++;}if(In(c)) // 是7种运算符之一{postexp[i++]=' ';x=OP.GetTop();switch(Precede(x,c)){case'<':OP.Push(c); // 栈顶元素优先权低c=*exp++;break;case'=':x=OP.Pop(); // 脱括号并接收下一字符c=*exp++;break;case'>':postexp[i++]=OP.Pop(); // 运算符出栈输出break;}}postexp[i]='\0';}//whilecout<<"后缀表达式为:"<<postexp<<endl;}double Val_PostExp(char *postexp){//后缀表达式求值int i;char z[6];double v=0,d=0,a,b;char c;SqStack<double> OD(20);c=*postexp++;while(c!='\0'){if((c>='0'&&c<='9')||c=='.')//为操作数{i=0;do{z[i++]=c;c=*postexp++;}while(c>='0'&&c<='9'||c=='.');z[i]='\0';d=atof(z); // 将字符串数组转为符点型存于dOD.Push(d);}if(In(c))//c为运算符{b=OD.Pop ();a=OD.Pop ();OD.Push (Operate(a,c,b));c=*postexp++;}c=*postexp++;}v=OD.Pop ();return v;}void CreatePreFax(char * exp,char * &prefax) { //由中缀式求前缀式char q;char m[20];int i=0,j=0,k=0;SqStack<char> OP(20);SqStack<char> OM(20);SqStack<char> ON(20);while(*exp!='=')OM.Push(*exp++);while(!OM.StackEmpty()){q=OM.Pop();if((q>='0'&&q<='9')||q=='.'){m[i++]=q;}if(q==')')OP.Push(q);while((q=='+')||(q=='-')||(q=='*')||(q=='/')){m[i++]=' ';if(OP.StackEmpty()||OP.GetTop()==')'||Precede(q,OP.GetTop())=='>'||Precede( q,OP.GetTop())=='='){OP.Push(q);break;}elsem[i++]=OP.Pop();}if(q=='('){while(OP.GetTop()!=')')m[i++]=OP.Pop();OP.Pop();}}while(!OP.StackEmpty()){m[i++]=OP.Pop();}m[i]='\0';while(m[j]!='\0'){ON.Push(m[j++]);}while(!ON.StackEmpty())prefax[k++]=ON.Pop();prefax[k]='\0';cout<<"前缀表达式为:"<<prefax<<endl;}double Va2_PreFax(char *prefax){//前缀求值int i,j;char c;char z[6];char s[6];SqStack<char> OS(20);SqStack<double> OD(20);double v=0,d=0,a,b;while(*prefax!='\0'){OS.Push(*prefax++);}while(!OS.StackEmpty()){c=OS.Pop();if((c>='0'&&c<='9')||c=='.'){i=0;do{z[i++]=c;c=OS.Pop();}while((c>='0'&&c<='9')||c=='.');i--;for(int j=0;i>=0;i--)s[j++]=z[i];s[i]='\0';d=atof(s);OD.Push(d);}if(In(c)){b=OD.Pop();a=OD.Pop();OD.Push(Operate(b,c,a));}}v=OD.Pop();return v;}void main(){char exp[20];char *postexp;postexp=new char[20];*postexp='\0';char *prefax;prefax=new char[20];*prefax='\0';double v1,v2;system("cls");//执行系统命令cls,清屏int choice;do{//显示主菜单cout<<"1-创建表达式\n";cout<<"2-表达式求值\n";cout<<"3-求后缀表达式\n";cout<<"4-后缀表达式求值\n";cout<<"5-求前缀表达式\n";cout<<"6-前缀表达式求值\n";cout<<"7-显示表达式\n";cout<<"8-退出\n";cout<<"Enter choice:";cin>>choice;switch(choice){case 1://创建表达式cout<<"请输入表达式,以=结束"<<endl;cin>>exp;cin.get(pause);system("pause");break;case 2://表达式求值v1=Val_Exp(exp) ;cout<<exp;cout<<v1<<endl;cin.get(pause);system("pause");break;case 3://求后缀表达式CreatePostExp(exp,postexp);cin.get(pause);system("pause");break;case 4://后缀表达式求值v1=Val_PostExp(postexp);cout<<postexp<<"="<<v1<<endl;cin.get(pause);system("pause");break;case 5://求前缀表达式CreatePreFax(exp,prefax);cin.get(pause);system("pause");break;case 6://前缀表达式求值v2=Va2_PreFax(prefax);cout<<prefax<<"="<<v2<<endl;cin.get(pause);system("pause");break;case 7:// 显示表达式cout<<endl;cout<<"已创建的表达式为:";cout<<exp<<endl;CreatePostExp(exp,postexp);CreatePreFax(exp,prefax);cin.get(pause);system("pause");break;case 8://退出cout<<"结束运行,Bye-Bye!"<<endl;break;default://cout<<"Invalid choice\n";break;}}while(choice!=8);}//end main。