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

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

数据结构期末课程设计一、引言数据结构是计算机科学中的重要基础课程,它研究数据的组织、存储和管理方式,以及数据之间的关系和操作。
数据结构的课程设计是对学生在课程学习过程中所掌握的知识和技能的综合应用,旨在提高学生的问题解决能力和编程能力。
本次课程设计要求学生设计一个基于数据结构的应用程序,通过对问题的分析和设计,运用数据结构的知识和算法,实现对数据的高效管理和操作。
二、设计目标本次课程设计的目标是设计一个学生信息管理系统,实现对学生信息的录入、查询、修改和删除等功能。
具体设计要求如下:1. 学生信息包括学号、姓名、性别、年龄、专业等基本信息;2. 学生信息可以通过键盘输入或者从文件中读取;3. 支持按学号、姓名、专业等关键字进行查询;4. 支持对学生信息的修改和删除;5. 支持将学生信息保存到文件中。
三、设计思路为了实现上述设计目标,可以采用以下的设计思路:1. 设计一个学生类,包含学号、姓名、性别、年龄、专业等属性;2. 使用链表或者数组等数据结构来存储学生信息,每一个节点或者元素表示一个学生对象;3. 设计一个菜单界面,通过用户输入选择不同的功能;4. 根据用户的选择,调用相应的函数实现对学生信息的录入、查询、修改和删除等操作;5. 将学生信息保存到文件中,可以使用文件读写操作实现。
四、详细设计1. 学生类的设计学生类包含以下属性:- 学号(字符串类型)- 姓名(字符串类型)- 性别(字符串类型)- 年龄(整数类型)- 专业(字符串类型)2. 数据结构的选择可以使用链表来存储学生信息。
链表的每一个节点包含一个学生对象和指向下一个节点的指针。
3. 菜单界面的设计设计一个菜单界面,显示以下选项:- 1. 录入学生信息- 2. 查询学生信息- 3. 修改学生信息- 4. 删除学生信息- 5. 保存学生信息到文件- 6. 退出程序4. 功能函数的设计- 录入学生信息函数:根据用户输入,创建一个学生对象,将其插入到链表中。
数据结构课程设计(5篇)

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

数据结构课程设计报告总结一、背景与目的数据结构是计算机科学中的一门核心课程,它涉及到如何有效地组织、存储和处理数据。
本次课程设计的目的是通过实际项目,加深对数据结构基本概念和原理的理解,提高解决实际问题的能力。
二、项目内容与实现本次课程设计,我们选择了“学生信息管理系统”作为项目主题。
该系统需要存储和管理学生信息,包括学号、姓名、年龄、成绩等。
为了满足这些需求,我们采用了多种数据结构,如数组、链表、栈、队列和二叉搜索树等。
在实现过程中,我们首先定义了学生类,包含各种属性。
然后,我们使用数组来存储学生信息。
为了方便查找,我们采用二叉搜索树对学生信息进行排序。
此外,我们还实现了添加、删除、查找和修改学生信息的功能。
三、遇到的问题与解决方案在实现过程中,我们遇到了以下几个问题:1. 如何在O(log n)的时间内查找学生信息?解决方案:我们采用了二叉搜索树来存储学生信息,从而实现了在O(log n)的时间内查找学生信息。
2. 如何有效地实现对学生信息的批量修改?解决方案:我们采用链表作为底层数据结构,对学生信息进行动态管理。
当我们需要修改大量学生信息时,只需遍历链表,修改对应节点的值即可。
3. 如何处理大量数据的存储和查询?解决方案:我们采用数据库作为存储系统,将学生信息存储在数据库中。
通过编写SQL语句,我们可以方便地对学生信息进行查询和修改。
四、总结与展望通过本次课程设计,我们不仅加深了对数据结构基本概念和原理的理解,还提高了解决实际问题的能力。
在实现过程中,我们学会了如何将理论知识应用到实际项目中,也意识到了数据结构在软件开发中的重要性。
展望未来,我们将继续深入学习数据结构相关知识,努力提高自己的编程能力和算法水平。
同时,我们也希望能够将所学的数据结构知识应用到更多的实际项目中,为软件开发做出更大的贡献。
数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
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.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
《数据结构》课程设计报告范本(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)。
课程设计(论文)任务书软件学院软件工程专业 3 班一、课程设计(论文)题目表达式求值,可供小学生作业,并能给出分数二、课程设计(论文)工作自 2014年 12月 22日至 2014年 12月 26日。
三、课程设计(论文) 地点: 创新大楼实训中心4楼四、课程设计(论文)内容要求:1.本课程设计的目的1) 使学生增进对数据结构各理论知识的熟练程度,2) 加强算法设计的能力,为以后的数据库原理等课程的学习打下良好基础。
,2.课程设计的任务及要求25.表达式求值,可供小学生作业,并能给出分数问题描述:利用所学知识,建立一个试题库,供小学生选题。
基本要求:(1)建立试题库文件,随机产生n个题目;(2)题目涉及加减乘除,带括号的混合运算;(3)随时可以退出;(4)保留历史分数,能回顾历史,给出与历史分数比较后的评价。
3)课程设计论文编写要求1)详细清晰地描述个人的课程设计工作;2)要按照本模板的规格打印誊写课程报告;3)课设报告包括目录、内容提要、正文、课程设计体会、参考文献、附录等;4)课程报告装订按学校的统一要求完成4)评分标准:1)完成原理分析:20分;2)完成设计过程:40分;3)完成代码分析:20分。
4)个人创新工作:20分。
学生签名:2014年12月26 日课程设计(论文)评审意见(1)原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)程序流程(20分):优()、良()、中()、一般()、差();(4)代码分析(20分):优()、良()、中()、一般()、差();(5)个人创新(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否()评阅人:职称:讲师2010年12月28 日目录目录................................................................................................................... - 1 - 正文................................................................................................................... - 2 -一、需求分析....................................................................................................... - 2 -二、个人工作....................................................................................................... - 2 -三、概要设计....................................................................................................... - 4 -四、源程序........................................................................................................... - 4 -五、程序结果..................................................................................................... - 17 - 课程设计体会.......................................................................... 错误!未定义书签。
正文一、需求分析该题目的核心是利用栈这种数据结构来实现一个加减乘除以及带括弧的混合数学表达式的计算。
其次是利用文件来保存和读写试题库、每次做题的成绩和以往成绩的平均值。
对于数学表达式的计算,可以设置一个运算符栈和一个数字栈,分别来保存运算符、数字或者中间计算得到的结果。
将整个表达式看做一个字符串,从开头依次判断每个字符是运算符还是数字,若是运算符,则根据运算符优先级来确定是将其压栈还是弹栈进行计算;若是数字,则先将其转化并计入一个临时int型变量中,看下一个字符是否为运算符栈,若是,则将临时变量压进数字栈,否则读取下一个数字字符并进行相关处理后累加到临时变量中,直到下一个字符为运算符,将临时变量压进数字栈。
最后,当字符为"="时,结束计算,得到计算结果。
对于试题库,第一次运行程序时需要用户输入若干试题来建立试题库文件,再次运行时磁盘上已经存在试题库文件,故不需再次建立试题库,直接读取文件即可。
然后从试题库中通过随机数函数随机抽取若干个试题供用户来做测试。
测试过程中可即时跟踪判断用户所给答案是否正确,并给出相关提示。
测试完毕后给出本次测试得分,对得分进行评价并将得分存到磁盘文件上。
用户可随时查看成绩的历史记录以及其平均成绩,可随时选择退出程序。
二、个人工作本次的课程数据我是用栈来实现表达式求解,利用栈求表达式的值,可供小学生作业,并能给出分数。
要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。
我利用文件来保存和读写试题库,且要运用磁盘文件。
数学表达式的计算,我设置了一个运算符栈与一个数字栈,分别来保存运算符、数字或者中间计算得到的结果。
将表达式看成一个字符串,从而分种计算。
四、源程序1.//此程序所有文件均保存在了G盘根目录下,实际调试运行时,可根据实际情况更改存2.//储路径3.#include <stdio.h>4.#include <stdlib.h>5.#include <time.h>6.int N; //定义全局变量,表示试题库试题数量7.typedef struct8.{9.char a[100];10.int result;11.}Shiti; //试题数据类型12.typedef struct13.{14.int *base,*top;15.int size;16.}Num; //数字栈17.typedef struct18.{19.char *base,*top;20.int size;21.}Oper; //运算符栈22.int NumInitStack(Num *S1) //构造数字栈23.{24.S1->base=(int *)malloc(100*sizeof(int));25.if(!S1->base)26.{27.printf("申请内存失败!\n");28.return 0;29.}30.S1->top=S1->base;31.S1->size=100;32.return 1;33.}34.int OperInitStack(Oper *S2) //构造运算符栈35.{36.S2->base=(char *)malloc(100*sizeof(char));37.if(!S2->base)38.{39.printf("申请内存失败!\n");40.return 0;41.}42.S2->top=S2->base;43.S2->size=100;44.return 1;45.}46.int NumGetTop(Num *S1) //得到数字栈栈顶元素47.{48.int e1;49.if((*S1).top==(*S1).base)50.return 0;51.e1=*((*S1).top-1);52.return e1;53.}54.char OperGetTop(Oper *S2) //得到运算符栈栈顶元素55.{56.char e2;57.if((*S2).top==(*S2).base)58.return 0;59.e2=*((*S2).top-1);60.return e2;61.}62.void NumPush(Num *S1,int e1) //数字栈压栈63.{64.*(*S1).top++=e1;65.}66.void OperPush(Oper *S2,char e2) //运算符栈压栈67.{68.*(*S2).top++=e2;69.}70.int NumPop(Num *S1) //数字栈弹栈71.{72.int e1;73.if((*S1).top==(*S1).base)74.return 0;75.e1=*--(*S1).top;76.return e1;77.}78.char OperPop(Oper *S2) //运算符栈弹栈79.{80.char e2;81.if((*S2).top==(*S2).base)82.return 0;83.e2=*--(*S2).top;84.return e2;85.}86.char Precede(char a,char b) //判断运算符优先级87.{88.int i,j;89.char Table[8][8]={{' ','+','-','*','/','(',')','='},90.{'+','>','>','<','<','<','>','>'},91.{'-','>','>','<','<','<','>','>'},92.{'*','>','>','>','>','<','>','>'},93.{'/','>','>','>','>','<','>','>'},94.{'(','<','<','<','<','<','=',' '},95.{')','>','>','>','>',' ','>','>'},96.{'=','<','<','<','<','<',' ','='}}; //优先级表格97.for(i=0;i<8;i++)98.if(Table[0][i]==a) //纵坐标寻找99.break;100.for(j=0;j<8;j++) //横坐标寻找101.if(Table[j][0]==b)102.break;103.return Table[j][i];104.}105.i nt Operate(int a,char theta,int b) //计算二元表达式的值106.{107.int c;108.if(theta=='+')109.c=a+b;110.else if(theta=='-')111.c=a-b;112.else if(theta=='*')113.c=a*b;114.else115.c=a/b;116.return c;117.}118.i nt IsOper(char ch) //判断字符ch是否为运算符119.{120.char ptr[10]={'+','-','*','/','(',')','='};121.int i;122.for(i=0;i<7;i++)123.{124.if(ch==ptr[i])125.return 1;126.}127.return 0;128.}129.i nt Result(char a[],Num *num,Oper *oper) //计算表达式的结果130.{131.char theta;132.int b,d,k=0,i=0,j=0,num2=0;133.NumInitStack(num); //构造数字栈134.OperInitStack(oper); //构造运算符栈135.OperPush(oper,'='); //将“=”压到栈底136.while(a[i]!='='||OperGetTop(oper)!='=')137.{138.//对表达式a进行计算139.if(a[i]>='0'&&a[i]<='9')140.{141.//字符是数字142.k++;143.if(k<=j)144.{145.num2=a[i]-48;146.i++;147.}148.if(k>j)149.{150.num2=num2*10+(a[i]-48);151.k=j=0;152.i++;153.}154.if(!IsOper(a[i]))155.k++;156.if(k==j) //如果k等于j,说明下一个字符是运算符,即数字字符结束,压进数字栈157.NumPush(num,num2);158.}159.else if(IsOper(a[i]))160.{161.//字符是运算符162.switch(Precede(a[i],OperGetTop(oper)))163.{164.//该运算符和栈顶运算符进行优先级比较并做相关处理165.case '<':166.OperPush(oper,a[i++]);167.if(a[i]!='('&&a[i]!=')')168.j++;169.break;170.case '=':171.OperPop(oper);172.i++;173.break;174.case '>':175.theta=OperPop(oper); //运算符栈弹栈176.d=NumPop(num); //数字栈弹栈177.b=NumPop(num);178.NumPush(num,Operate(b,theta,d)); //计算结果并压栈179.break;180.}181.}182.}183.return (NumGetTop(num)); //返回最终计算结果184.}185.i nt Buildshitiku() //建立试题库186.{187.int i;188.FILE *fp;189.Shiti t;190.if(!(fp=fopen("G:\\shitiku.txt","w")))191.{192.printf("无法建立试题库文件!\n");193.return 0;194.}195.printf("输入要建立的试题库的试题数目: ");196.scanf("%d",&N);197.fprintf(fp,"%d\n",N);198.for(i=0;i<N;i++)199.{200.printf("输入第%d道题目:\n",i+1);201.scanf("%s",t.a);202.fprintf(fp,"%s\n",t.a); //将键盘输入的表达式写进文件203.}204.fclose(fp);205.return 1;206.}207.v oid Xuanti(int n,int a[]) //随机选取n个题目,将题号保存在数组a中208.{209.srand((int)time(0));210.int i,j,t;211.a[0]=rand()%N; //产生0-N之间的随机数并记录212.for(i=1;i<n;i++)213.{214.t=rand()%N;215.for(j=0;j<i;j++)216.{217.if(a[j]==t)218.break;219.}220.if(j==i)221.a[i]=t;222.else223.i--;224.}225.}226.v oid Avescore() //求平均成绩227.{228.FILE *fp1,*fp2;229.int sum=0,i=0,s,a;230.if(!(fp1=fopen("G:\\score.txt","r")))231.{232.printf("无法打开成绩信息文件!\n");233.exit (-1);234.}235.while(!feof(fp1)) //读出所有的历史成绩并求和236.{237.fscanf(fp1,"%d",&s);238.sum+=s;239.i++; //记录成绩个数240.}241.fclose(fp1);242.a=sum/i;243.if(!(fp2=fopen("G:\\average.txt","w")))244.{245.printf("无法创建或者无法打开平均成绩文件!\n"); 246.exit (-1);247.}248.fprintf(fp2,"%d",a); //将平均值写入文件中249.fclose(fp2);250.}251.v oid Zuoti(Shiti a[]) //做题252.{253.system("cls");254.printf("\t\t******好好学习天天向上******\n\n");255.int n,i,r,k=0,score,ave;256.FILE *fp,*fp1;257.printf("请输入要做几道题:");258.scanf("%d",&n);259.int t[n]; //在VC++6.0编译环境下该条语句编译通不过,可改为定义一个足够大的数组,例如int t[100];260.Xuanti(n,t); //调用Xuanti函数从试题库中随机抽取n道题目261.for(i=0;i<n;i++)262.{263.//做题并判断答案是否正确264.printf("\n第%d道题:\n",i+1);265.printf("%s",a[t[i]].a);266.scanf("%d",&r);267.if(a[t[i]].result==r)268.{269.k++;270.printf("答案正确!\n");271.}272.else273.{274.printf("答案错误!正确答案为:%d\n",a[t[i]].result); 275.}276.}277.score=100*k/n;278.printf("\n本次得分:%d\n",score); //输出本次做题所得的分数并进行评价279.if(score>=90)280.printf("优秀,继续保持!\n");281.else if(score>=80)282.printf("良好,还需努力!\n");283.else if(score>=70)284.printf("一般,继续加油!\n");285.else if(score>=60)286.printf("及格,多多努力!\n");287.else288.printf("糟糕,不及格,该好好学习了!\n");289.if(!(fp=fopen("G:\\score.txt","a")))290.{291.printf("无法建立或者无法打开成绩信息文件!\n"); 292.exit (-1);293.}294.fprintf(fp," %d",score); //将本次成绩写入文件295.fclose(fp);296.Avescore();297.if(!(fp1=fopen("G:\\average.txt","r")))298.{299.printf("无法创建或者无法打开平均成绩文件!\n"); 300.exit (-1);301.}302.fscanf(fp1,"%d",&ave); //读出之前成绩的平均成绩303.if(score>ave)304.printf("\n成绩较以前相比有所进步,继续努力!\n"); 305.else if(score<ave)306.printf("\n成绩较以前相比退步了,要多多练习,不要气馁!!\n");307.else308.printf("\n成绩与以前持平\n");309.}310.v oid History() //输出历史成绩311.{312.FILE *fp,*fp1;313.int s,a;314.if(!(fp=fopen("G:\\score.txt","r")))315.{316.printf("无法打开成绩信息文件!\n");317.exit (-1);318.}319.printf("历史成绩显示如下:\n");320.while(!feof(fp))321.{322.fscanf(fp,"%d",&s);323.printf("%d ",s);324.}325.fclose(fp);326.printf("\n");327.if(!(fp1=fopen("G:\\average.txt","r")))328.{329.printf("无法打开平均成绩文件!\n");330.exit (-1);331.}332.fscanf(fp1,"%d",&a);333.printf("平均为:%d\n\n",a);334.}335.i nt menu() //菜单函数336.{337.int a;338.do339.{340.system("cls");341.printf("\t\t******好好学习天天向上******\n\n"); 342.printf("\t\t 1.做题\n");343.printf("\t\t 2.查看历史成绩\n");344.printf("\t\t 3.退出系统\n\n");345.printf("\t\t****************************\n");346.printf("\t\t请选择:");347.scanf("%d",&a);348.}while(a<1||a>3);349.return a;350.}351.i nt main()352.{353.FILE *fp;354.int i;355.char c;356.Shiti s[1000];357.Num num;358.Oper oper;359.if(!(fp=fopen("G:\\shitiku.txt","r"))) //如果试题库文件不存在,则建立试题库360.{361.printf("\t******欢迎使用******\n\n");362.printf("\t程序第一次运行,尚无试题库,请先建立试题库!\n\n\t");363.system("pause");364.if(Buildshitiku())365.printf("成功建立试题库!\n");366.system("pause");367.fp=fopen("G:\\shitiku.txt","r");368.}369.fscanf(fp,"%d",&N); //将试题库文件中的信息读到内存中370.for(i=0;i<N;i++)371.{372.fscanf(fp,"%s",s[i].a);373.s[i].result=Result(s[i].a,&num,&oper);374.}375.fclose(fp);376.while(1)377.{378.switch(menu())379.{380.case 1:381.do382.{383.Zuoti(s);384.printf("\n是否继续做题?y-是,n-否:"); 385.getchar();386.scanf("%c",&c);387.}while(c!='n'&&c!='N');388.break;389.case 2:390.History(); //输出成绩391.system("pause");392.break;393.case 3:394.printf("\n\t欢迎使用,再见!\n\n\t");395.system("pause");396.exit (0); //退出系统397.} 398.} 399.return 0; 400. }五、程序结果首次运行程序时如图1。