1、一、课程设计的基本任务数据结构是一门涉及多门课程的课程,难度较大,需要较好的 C 语言的程序设计和调试能力,如果学生能够按照要求,从时间和精力上保证完全的投入,相信能够有很大的收获,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。数据结构课程设计是计算机科学与技术专业的主要实践性教学环节。在进行了专业基础课和数据结构课程的基础上,设计一个实际的应用软件,初步软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。1二、课程设计的基本要求课程设计按照教学要求需要一
2、周时间完成,总共至少要上机调试程序 10 小时。对每个题目要有需求分析, 在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构, (有些题目已经指定了数据存储的,按照指定的设计) ,设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来 。 对有些题目提出算法改进方案,比较不同算法的优缺点。 如果程序不能正常运行,写出实现此算法中遇到的问题,和改进方法;2 对每个题目要有相应的源程序(可以是一组源程序,即详细设计部分): 源程序要按照写程序的规则来编写
3、。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。 程序能够运行,要有基本的容错功能。尽量避免出现操作错误时出现死循环;3 最后提供的主程序可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。1、能力培养要求巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力。培养学生选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。够按要求编写课程设计报告书,能正确阐述设计和
4、实验结果,正确绘制系统和程序框图。通过课程设计,培养学生严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。2、学生提交课程设计报告要求1)设计题目22)设计目的3)设计内容4)程序流程图5)源程序6)软件测试报告(包括所用到的数据及结果)3三、课程设计的基本步骤和方法1、学生以自学为主,独立完成设计任务,注重学生能力的培养。2、教师要注意按学生基础和能力提出要求,辅导时要有侧重,做到因材施教。对基础差的学生要勤检查多指导,对能力强的学生应提出更高的要求,增加些选作内容,充分发挥其潜力。3、教师要教书育人。要求学生从点滴开始,每步操作都要按规定去做,以培养严肃认真的科学态度。选定方
5、案要考虑经济效益,坚持勤俭节约的原则。要教育学生团结协作,遵守纪律,爱护公物。通过设计提高业务能力,提高思想觉悟。4、课程设计安排教师下达设计任务书任务书内容包括题目、主要技术指标和要求、给定条件及原始数据、所用仪器设备和参考资料及文献等。教师讲授必要的设计思路和设计方法。生完成预设计本阶段学生应明确任务,查阅资料及文献(主要自学) ,掌握工程设计基本方法,确定设计方案,进行设计分析,完成预设计。实验阶段经教师审查通过预设计方案后,即可进行编程调试。实验由学生独立完成,教师定时指导。设计总结阶段本阶段学生要认真完成课程设计报告书,整理技术资料,如有需要还应写出课程设计的心得体会和改进意见。4课
6、程设计报告书包括:设计任务及主要技术指标、设计方案及论证结果、系统的原理框图、设计程序、实验结果、实验中主要问题及故障现象的分析及设计结论等。报告书中还应附实验数据、系统软硬件环境、使用说明及参考资料等。5郑州轻工业学院课 程 设 计 任 务 书题目 模拟计算器的程序 专业、班级 计算机科学与技术 10-01 学号 541007010157 姓名 郑峰弓 主要内容、基本要求、主要参考资料等:主要内容:设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及 SQR 和 ABS 函数的任意整型表达式进行求解。设计要求:要检查有关运算的条件,并对错误的条件产生报警。参考资料:C+.C 语
7、言程序设计,数据结构(c 语言版)完 成 期 限: 2012-6-21 指 导 教 师 签 名 : 课程负责人签名: 2012 年 6 月 21 日6郑州轻工业学院本科数据结构课程设计总结报告设计题目:模拟计算器的程序学生姓名:郑峰弓系 别:计算机科学与工程专 业:计算机科学与技术班 级:10 级 1 班学 号:541007010157指导教师:卢冰 李晔2012 年 6 月 21 日7一、 设计题目(任选其一)模拟计算器的程序要求能对包含加、减、乘、除、括号运算符及 SQR 和 ABS 函数的任意整型表达式进行求解。二、 运行环境(软、硬件环境)WindowXP 环境下运行三、 算法设计的思
8、想本程序采用栈的算法设计思想,为了实现算符优先算法,首先建立两个栈,一个字符型栈 YF,用于存储运算符,一个浮点型栈 YS,用于存储运算数据。算法的基本思想:1. 建立两个空栈,将表达式起始符“n”为运算符压入栈底2. 顺序读取每个字符,每次读取判断是运算符还是数据,若是运算符则和运算符栈 YF 的栈顶元素进行优先性的比较,做相关的操作,若是数据符,将一个连续的数字字符读入到一个字符数组中,将这个字符数组,通过 atof()函数将字符串转化成浮点型数据,然后将这个浮点数据压入 YS 数据栈,知道整个表达式读取完毕。四、 算法流程图略五、 算法设计分析1. 建立的两个栈,栈的操作方法都包括栈的建
9、立 InitStack() ,入栈函数 Push() ,取栈顶元素函数 GetTop() ,出栈函数 Pop() ,判断是否是空栈函数 StackEmpty() ,两个栈分别进行运算符和运算数的相关操作。2. 对于一个表达式,进行求值应满足以下运算规则:先算乘除,后算加减;从左到右依次计算,先算括号里面的,后算括8号外面的,遇到绝对值运算符 A(A 代表 abs 的缩写,表示进行绝对值运算,形式是(4-9)A 运算结果是 5.00) ,和运算符 S(S 代表 sqrt 的缩写,表示进行开放运算形式是(2)S 运算结果是 1.41) ,A 和 S 的优先性是比“) ”的优先性低一级。开方和取绝对
10、值时一定要注意输入格式(表达式)A 和(表达式)S。3. 运算符的游行先比较。Precede(char s1,char s2)比较两个字符的优先性,若是 S1 的优先级高于 S2 的优先性,则返回 ,若是 S1 的优先级高于 S2 的优先性,则返回 #include#include#include#include#include#define MAX 20#define STACKSIZE 5/建立两个栈,一个运算符栈和一个操作数栈typedef struct char *base; char *top;int stacksize;Qstack;typedef struct double *b
11、ase;double *top;int stacksize;SQstack;/建立一个栈(字符型)用于存储运算符void InitStack( Qstack S.top=S.base;S.stacksize=MAX;void Push(Qstack S.top=S.base+S.stacksize;S.stacksize=S.stacksize+STACKSIZE;*S.top=e;17S.top+;void GetTop(Qstack e=*(S.top-1);void Pop(Qstack S.top-;e=*S.top;bool StackEmpty(Qstack else return
12、 false;/建立一个栈(浮点型)用于存储数据void InitStack( SQstack S.top=S.base;S.stacksize=MAX;void Push( SQstack S.top=S.base+S.stacksize;S.stacksize=S.stacksize+STACKSIZE;18*S.top=e;S.top+;void GetTop(SQstack e=*(S.top-1);void Pop(SQstack S.top-;e=*S.top;bool StackEmpty(SQstack else return false;/计算器算法部分char Preced
13、e(char s1,char s2)/比较两个字符的优先性char f;switch(s2)case +:case -:if(s1=(|s1=n)f=;break;19case *:case /:if(s1=*|s1=/|s1=)f=;/s1 比 s2 的优先级别高else f=;/有括号的先运算括号内的else f=;/有括号的先运算括号内的else f=;break;case n: switch(s1)case n:f=;break;case (:printf(“缺少右括号an“);exit(0);default:f=;return f;/判断运算符,本运算符只支持英文运算符,若出现中文的
14、运算符将判为违法运算符bool Put( char e)/若为所给运算符返回 true,否则返回 falseswitch(e)case +:case -:case *:case /:case (:case ):case A:case S:case n:return true;default : return false ;double Operate(double a,char f,double b)/四则运算,绝对值运算和开方运算21switch(f)case +: return a+b;case -: return a-b;case *: return a*b;case A:return
15、fabs(b); /A 代表绝对值运算符,形式是 (2-3)Acase S:if(b:Pop(YF,x1);Pop(YS,b);Pop(YS,a);Push(YS,Operate(a,x1,b);/进行数的运算,并将运算结果压入数据栈 YSelse if(c=0 /将连续的数的字符存入到字符数组中c=getchar();zi=0;d=atof(z);/将保存在数组型的字符转化成浮点型存到 dPush(YS,d);/将浮点数 d 压入数据栈else /若输入的不是所给的操作数和操作运算符将直接退出系统23printf(“出现非法字符!an“);exit(0);GetTop(YF,x1);/每次循
16、环获取运算符的栈顶元素Pop(YS,x);/将运算结果出栈while (!StackEmpty(YS)/判断是否出栈完毕printf(“error!a“);exit(0);return x;void main()/若不按所给的输入和不符合数学算法将给与直接退出 例:5/0 (-2)S char k;while(k!=n|k!=N)printf(“t*欢迎使用计算器*n“);printf(“t* *n“);printf(“t* 1 2 3 + ( *n“);printf(“t* *n“);printf(“t* 4 5 6 - ) *n“);printf(“t* *n“);printf(“t* 7
17、 8 9 * A(asb) *n“);/A 代表绝对值运算符,形式是 (2-3)Aprintf(“t* *n“);printf(“t* 0 . / S(sqrt) *n“);/S 代表开方运算符,形式是 (2)S 或(5+4)Sprintf(“t* *n“);printf(“t* 输入 N 或 n 退出 24*n“);printf(“t*进行下面的操作*n“);printf(“请输入以上给出的操作符和操作数:n“);printf(“%.2lf n“,computer(); printf(“要继续操作么.(Y/N):“);k=getchar();if(k=n|k=N)break;getchar();printf(“谢谢使用!an“);