C语言程序设计-第十一章综合实训—学生成绩管理系统资料课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言程序设计-第十一章综合实训—学生成绩管理系统资料课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第十一 综合 学生 成绩管理系统 资料 课件
- 资源描述:
-
1、C语言程序设计语言程序设计项目十一项目十一 综合实训综合实训-学生成绩管理系统学生成绩管理系统1项目项目十一十一 综合实训综合实训学生成绩管学生成绩管理系统理系统2【项目要求项目要求】将从键盘输入的十进制数转换为将从键盘输入的十进制数转换为N N(如二进制、八进制、(如二进制、八进制、十六进制)进制数据,利用顺序栈实现数制转换问题十六进制)进制数据,利用顺序栈实现数制转换问题 十进制转化成十进制转化成N进制的算法是进制的算法是/整数部分为除整数部分为除N取余法取余法,小数部分为小数部分为乘乘N取整法。例如:对取整法。例如:对1348这个数,转化为这个数,转化为N进制,也就是解方程进制,也就是解
2、方程1348=aN5+bN4+cN3+dN2+eN1+f,目标就是要求出系数,目标就是要求出系数a,b,c,d,e,f的值(也许的值(也许a的前面还有的前面还有w*N6甚至甚至7次方等等,但是次次方等等,但是次数太高的话就必然会是数太高的话就必然会是0),比如我们假定),比如我们假定N=10的话,那么求出来的话,那么求出来的结果必然是的结果必然是a=b=0,c=1,d=3,e=4,f=8 。对于。对于N进制来说,进制来说,a,b,c,d,e,f的值都必然要小于的值都必然要小于N(否则就会向高位进一),显然求(否则就会向高位进一),显然求解的过程是:将解的过程是:将1348除以除以10(令(令N
3、=10),则余数就是则余数就是f ,即,即8,则商则商则是则是aN4+bN3+cN2+dN1+e,这样进一步除以,这样进一步除以10得得e,依次得依次得到到d,c,b,a,可用堆栈来实现。可用堆栈来实现。【项目分析项目分析】3问题情境及实现问题情境及实现v/*v 堆栈的应用-进制转换 v 将十进制转换成其他进制 v*/v#include v#define maNlen 100 v vtypedeftypedef structstruct /堆栈的结构大家应该都很熟悉了 v v intint datamaNlen;v intint top;vSeqStack;v vvoidvoid InitSt
4、ack(SeqStack*S)/置栈空 v v S-top=-1;v v 4问题情境及实现问题情境及实现vvoidvoid Pop(SeqStack*S,intint*N)/出栈,N用来接受被弹出的数的 v v *N=S-dataS-top;v S-top-;v v vvoidvoid Push(SeqStack*S,intint N)/入栈 v v S-top+;v S-dataS-top=N;v v vvoidvoid Conversion(SeqStack*S,intint n,intint d)/n为一个十进制数,d为进制 v v ifif(d 0)v printf(ERROR!n);
5、v ifif(n 0)v n=-n;v ifif(n=0)v Push(S,0);v whilewhile(n)v v Push(S,n%d);v n/=d;v v 5问题情境及实现问题情境及实现vintint main()v v intint n,d,N;/n为一个十进制数,d为进制 v SeqStack stack,*S;v S=&stack;v v whilewhile(scanf(%d%d,&n,&d)!=EOF)v v InitStack(S);/初始化 v Conversion(S,n,d);v ifif(n top!=-1)v v Pop(S,&N);v ifif(N top=0
6、;s-top=0;v v 判空栈判空栈vint empty(stack int empty(stack*s)s)v if(s-top=0)return if(s-top=0)return 1;1;v else return 0;else return 0;v 12 入栈入栈 vvoid push(stack void push(stack*s,datatype N)s,datatype N)v if(s-top=MAN-1)if(s-top=MAN-1)v printf(printf(栈满栈满););v else else v s-top+;s-top+;v s-datas-top=N;s-d
7、atas-top=N;v v 13 出栈出栈 vvoid pop(stack void pop(stack*s,datatype s,datatype*N)N)v if(empty(s)if(empty(s)v printf(printf(栈空栈空););v else elsev *N=s-datas-top;N=s-datas-top;v s-top-;s-top-;v v 14 取栈顶元素取栈顶元素 vdatatype get(stack datatype get(stack*s)s)v if(empty(s)if(empty(s)v printf(printf(栈空栈空););v els
8、e else v return(s-datas-top);return(s-datas-top);v 151.3 1.3 双栈的操作双栈的操作v让两个栈共享一个数组的存储空间,让一个栈的让两个栈共享一个数组的存储空间,让一个栈的栈底为该空间的始端,另一个栈的栈底为该空间的末栈底为该空间的始端,另一个栈的栈底为该空间的末端,当元素进栈时,都从两端向中间靠拢,这样就可端,当元素进栈时,都从两端向中间靠拢,这样就可以达到在使用过程中有的栈占有的空间多一些,有的以达到在使用过程中有的栈占有的空间多一些,有的栈占有的空间少一些,公共的剩余空间可以调节使用,栈占有的空间少一些,公共的剩余空间可以调节使用,
9、从而提高了存储空间的利用率。从而提高了存储空间的利用率。1 12 23 3 n n m mm+1 m+1 MAN-1MAN-1 data data a1 a2 a3 an bm b2 b1top1top2栈栈2底底栈栈1底底 双栈共享存储空间双栈共享存储空间 16存储结构可定义为存储结构可定义为v#define MAN#define MAN 双栈中允许存放元素的最大个数双栈中允许存放元素的最大个数vtypedef structtypedef structv datatype dataMAN;datatype dataMAN;v int top1,top2;int top1,top2;vboth
10、stack;bothstack;用用bothstack可以定义一个双栈可以定义一个双栈ds:bothstack ds;或或bothstack*ds;171.1.进栈进栈 vvoid push(bothstack void push(bothstack*ds,datatype N)ds,datatype N)v if(ds-top2=ds-top1+1)if(ds-top2=ds-top1+1)v printf(printf(栈满栈满););v else elsev ds-top2-;ds-top2-;v ds-datads-top2=N;ds-datads-top2=N;v v 182 2出栈
11、出栈 vvoid pop(bothstack void pop(bothstack*ds,datatype ds,datatype*N)N)v if(ds-top2=MAN)if(ds-top2=MAN)v printf(printf(栈空栈空););v else elsev *N=ds-datads-top2;N=ds-datads-top2;v ds-top2+;ds-top2+;v v 191.4 1.4 栈的应用栈的应用算法思路:把十进制数转换为二进制数采用的方法是算法思路:把十进制数转换为二进制数采用的方法是“除除2取余取余”,直到商为,直到商为0。依次得到的余数是。依次得到的余数是
12、k1,k2,k3,km,而转换后的二进制数是而转换后的二进制数是km km-1k3 k2 k1,从结果看恰好与计算过程相反,因此转换过程中每得到一位从结果看恰好与计算过程相反,因此转换过程中每得到一位二进制数则进栈保存,转换完毕后依次出栈则正好是转换结二进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。此种方法同样适用于将十进制数转换为果。此种方法同样适用于将十进制数转换为r进制的数。把十进制的数。把十进制整数进制整数11转换为二进制的过程如下:转换为二进制的过程如下:211 余数余数二进制位二进制位 低低 高高 25 1k1 1 22 1k2 2 21 0 k3 30 1k4 4例例 2
13、-3 编写一个算法将给定的十进制数转换为二进制数输出。编写一个算法将给定的十进制数转换为二进制数输出。20数值转换的算法数值转换的算法v typedef int datatype;#define MAN 10typedef int datatype;#define MAN 10v void transfer(int n,int r)void transfer(int n,int r)void transfer(int n,int r)void transfer(int n,int r)v stack s;int sMAN,top;/stack s;int sMAN,top;/*定义一定义一个顺
14、序栈个顺序栈*/v datatype N;int N;datatype N;int N;v init(s);init(s);top=0;top=0;/*初始化栈初始化栈*/v while(n)while(n)while(n)while(n)v push(s,n%r);push(s,n%r);s+top=n%r;/s+top=n%r;/*余数入栈余数入栈*/v n=n/r;n=n/r;n=n/r;n=n/r;/*商作为被除数继续商作为被除数继续*/v v while(!empty(s)while(top!=0)while(!empty(s)while(top!=0)v pop(s,N);pop(
15、s,N);N=stop-;N=stop-;v printf(%d,N);printf(%d,N);printf(%d,N);printf(%d,N);v v v 算法一算法一 算法二算法二21例例2-4 2-4 栈与递归栈与递归 v下面以下面以 n!n!为例,介绍如何将递归的算法改写为为例,介绍如何将递归的算法改写为堆栈的非递归算法。堆栈的非递归算法。n!=1 n n=0 0或或n n=1/1/*递归终止条件递归终止条件*/n n*(n-1)!(n-1)!n0 /n0 /*递归步骤递归步骤*/int fact(int n)if(n=0|n=1)return 1;else return(n*fa
展开阅读全文