数据结构课程设计--数据结构的实现.docx
课程设计报告课程名称:课程设计题目:算法与数据结构数据结构的实现2014年6月16日图14. 2.3源代码#include<stdio.h>#include<string. h>#include<process.h>#include<conio.h>ttdefine N 30ttdefine M 4typedef struct student (char number 10;char name20;float scoreM; float sum;STU;STU stuN; int n; void menu()system(nclsn);printf (nnH);printf ("*欢 迎进入 学 生成绩 管理系 统*nprintf (n菜单n");printf ("输入成绩lnu);printf (“查看成绩及成绩排序2n");printf ("查询学生成绩3nn);printf ("修改成绩4n");printf ("添力口成绩5n");printf ("删除成绩6nn);printf ("保存成绩7n");printf ("退出系统8'n");printf ("请输入您的选择n");void inputscore()int i,j;system(nclsn);printf ("请输入学生总数:nM);scanf(n%dn,&n);printf ("提示:*输入学号时请输入位数为8位的数字*n"); /*因二维表上下需对正 故有此要求*/printf (”请输入学生的学号姓名语文数学英语理综:n”);for(i=0;i<n;i+)scanf(H%s %s %f %f %f %fn,stui. number,stui. name,&stui. score0,&stui.scorel,&stui. score2,&stui. score3);printf ("成功输入n"); /*计 算各个 同 学的总 分 */ void sumgescore()int i,j;for(i=0;i<n;i+)stui. sum=0;for(j=0;jM;j+)stui. sum+=stui.scorej)/*查看学 生成绩 及根据总分对 学生 进行排序*/void lookscore()int i,j,k;STU t;sumgescore ();system(nclsn);for(i=0;i<n-l;i+)(for(k=i,j=i+l;j<n;j+)if(stuj. sum>stuk. sum) k=j;if(k!=j) (t=stuk;stuk=stui;stui=t;)printf ("名次t学号tt姓名t语文t数学t英语t理综t总分n”);for(i=0;i<n;i+)printf (n%dt%st%st%. lft%. lft%. lft%. lft%. lfnn,i+1,stui. number,stui .name,stui. score0,stui. scoreEl,stui. score2,stui. score3,stui. s um); )/ * 通 过输入学号查找学生成绩 */ void searchscore ()(char a10;int i,j,flog=0;system("cls");printf ("请输入需查询的学生学号学");scanf,a);for(i=0;i<n;i+)if (strcmp(a, stu i. number) =0) flog=l;printf ("名次t学号tt姓名t语文t数学t英语t理综t总分n”);printf (n%dt%st%st%. lft%. lft%. lft%. lft%. lfnn, i+1, stui. number, stui .name, stui. score0, stui. scorel, stui. score2, stui. score3, stui. s um);printf("n");break;/*找到该学生成绩信息后跳出for循环*/)if (flog=0)printf("未找到该学生信息!");/* 修 改学 生成绩 * void modify()char a10;int i,j,flog=0;system(nclsn);printf (”请输入需要修改成绩的学生学号n”); scanf(n%sn,a);for(i=0;i<n;i+)if(strcmp(a,stui. number)=0)flog=l;printf ("名次t学号tt姓名t语文t数学t英语t理综t总分n(;printf (n%dt%st%st%. lft%. lft%. lft%. lft%. lfnn,i+l, stui. number, stui .name, stui. score0, stui. scorel, stui. score2, stui. score3, stui. s um);printf ("n"); break;if(flog=l)printf (”请重新输入该学生的学号姓名 语文 数学英语 理综:n”);scanf (,r%s %s %f %f %f %fn, stui. number, stui. name,&stui. score 0 ,&stui. sc orel ,&stui. score2 ,&stui. score3);printf ("修改成功n");elseprintf ("未找到该学生信息n");)/ * 添力口 学生成 绩 */void add()int a,i,j;system(nclsn);printf(”请输入新增加的学生人数:n”);scanf("%d”,&a);n=n+a;printf (”请输入添加的学生的学号 姓名 语文 数学 英语 理综:n”); for(i=n-a;i<n;i+)scanf(H%s %s %f %f %f %fn,stui, number,stui, name,&stui, score0,&stui .scoreEl,&stui. score2,&stui. score3);printf ("添加成功n"); /* 删 除学生 成绩 * void delscore()int i,j,flog=0;char m,a10;system(nclsn);printf (”请输入要删除的学生学号n”); scanf(n%sn,a);for(i=0;i<n;i+)if(strcmp(a,stui. number)=0)flog=l;printf ("名次t学号tt姓名t语文t数学t英语t理综t总分n(;printf (n%dt%st%st%. lft%. lft%. lft%. lft%. lfnn,i+l,stui. number,stui .name,stui. score0,stui. scorel,stui. score2,stui. score3,stui. s um);printf ("n"); break;if (flog=0)printf ("未找到该学生信息n");elseprintf ("是否删除该学生成绩(y/n)n“); scanf("%s”,&m);if(m=1y1)/*结构体整体赋值将后一位学生成绩信息拷贝进入/*删除该学生信息后学生总数减一 */for(i;i<n-l;i+) stui=stui+l; 前一位学生信息的存储位置*/n=n-l;printf ("删除成绩成功n");elseprintf ("删除成绩失败成");/* 保 存 学生成 绩 */ void savescore ()FILE *fp;int i,flag=l;char m;system(Hclsn);puts("是否保存学生成绩(y/n)”);scanf("%s”,&m); if(m='y')(if (fp=fopen('fscore. datn, nwbH) =NULL) printf ("文件打开失败n");return; )for(i=0;i<n;i+)if(fwrite(&stui,sizeof(struct student),1,fp)!=1) (printf ("保存失败n");flag=0; if(flag=l)printf ("保存成功!n");fclose (fp); elsereturn;)void main()(short int flag=0; menu(); do(flag=l;switch(getch ()default : printf ("输入有误n");caseTinputscore();break;/*输入成绩*/caselookscore();break;/*查看成绩*/casesearchscore();break;/*查找成绩*/case4,modify () ; break;/*修改成绩*/case5add () ; break;/*添加成绩*/case'6,delscore();break;/*删除成绩*/case7savescore();break;/*保存成绩*/case'8,exit (0);/*退出程序*/printf ("按任意键继续n");getchO ;menu ();while (flag=l);)4. 2.4程序运行运行开始(如图2)D:C + +Microsoft Visual StudioMyProjects5JES22DebugF卜xxxxxxxx欢卬讲人学牛成绩管王里系统XXXXXXXXXXXXX 单黔疆及运绩丽2慢金圣委成绩3修改成绩4降露二二二二二二二二二二二二 XXXXXXMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 馆输入您的选择图2选择1输入学生信息(如图3)"D:C* -?-Microsoft Visual StudioMyPrpjectsU验报告四De入学生总数:、士 请输,当131115122108当131115122108学号时i25223127325413814112812512713211013544日 座索: "后相!J31260030312600313126003231260080曩任意键继续曩任意键继续图3选择2按总分排序并查看总体情况(如图4)I wD:C-rrMicrosoft Visual StudioMyProjects校验报告四DebugFibonacci.exe"名衩学号131260030231260032331260080431260031按任意键继续名衩学号131260030231260032331260080431260031按任意键继续名丰凯丽民 姓张王陈李语文数学131.0127.0122.0 110.0108.0135.0英语理综138.0 252.0128.0 273.0125.0254.0648.0633.0622.0619.0选择3查询某同学的成绩(如图5)i ' *D:C+Microsoft Visual StudioMyProjectsJ|Qt3DebugFibcnacc!,exe>请输入髓询除生学号语文数学英语理综总分122.0110.0128.0273.0633.0语文数学英语理综总分122.0110.0128.0273.0633.031260032名次学号231260032胺任意键继续L5选择4修改学生成绩(如图6)D:C+Microsoft Visual StudioMyProjectsSJES29DebugFibonacci.exe请输入需要修改成绩的学生学号31260031名次学号姓名语文数学英语理综总分431260031李民115.0132.0141.0231.0619.0输31瞿新00座忌重26改任姓411 号3 工r2 、L-r 1 住5 生11 W选择5添加学生成绩(如图7),D:C-Microsoft Visual Studio'MyPrpjects'虔险报告四DebugFibc请输入新增加的学生人数:储输入添加的学生的学号姓名语文数学英语理综:31260033 叶建军 110 138 121 25631260034 卢楠 120 133 134 235翻翻继续目录一、课程设计的目的1二、课程设计要求1三、课程设计方案1四、课程设计内容14.1 数据结构设计1设计背景14.1.1 定义数据结构体2存储方式24.1.2 数据结构上的基本运算24.2 实例应用5问题描述5422程序设计5源代码6424程序运行12五、总结14六、参考文献15选择2查看添加后的成绩情况(如图8)131.0131.0122.0110.0108.0120.0115.0252.0273.0256.0254.0235.0235.0138.0128.0121.0125.0134.0141.0图8选择6删除某学生成绩(如图9) "D:C*-*-Microsott Visual StudioMyProjectsEfe券诩-'Microsoft Visual StudioMyProjects模验报告四。吐119丫七。皿欲©"请输入要删除的学生字号31260033名次学号姓名 语文数学英语理综总分331260033口十建军 110.0138.0121.0256.0625.0是否删除该学生成绩“n31260030!31260032)31260033I31260080i31260034,31260031决任意键继续军名丰凯建一端民姓张王李姒子127.0110.0138.0135.0133.0123.0屈万648.0633.0625.0622.0622.0614.0tain选择8退出系统(如图10)"D:C'Microsoft Visual StudioMyProjects55野报吉四DebugFib4于成成成:人套询改加除市输蟹香蓍一序一 一排一 一绩一 晟绩 一及成 绩堇绩绩绩绩统您*-M-0 t 择y 先e 关k图10五、总结本次课程设计实在学习并掌握了简单数据结构与算法的基础上对数据结构 的应用,数据结构形式多样,我们需要在一些简单的结构的基础上对数据结构进 行修改以便解决实际生活中的不同问题。根据不同的实际问题选择不同的数据结 构是解决实际问题的基础。回顾起此次课程设计,我感慨颇多,的确,从拿到题 目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩 固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有 把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务, 从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可 以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在 设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌 握得不够牢固,比如说结构体通过这次课程设计之后,一定把以前所学过的 知识熟悉了,本次课程设计结束了,我们通过这次实践学到了许多知识。学到了 设计一个简单的系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。 编写程序是件细心活,稍不留神就会出错,这就必须要求我们对待事情要认真!在 编写程序的过程中,错误不断出现,不同的类型(如少写了一个符号,写错了字母, 用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能半 途而废。因此,在此次课程设计过程中总结了如下经验:1 .要熟练掌握课本知识,并且能在理解的基础上加以创新;2 .在做整个课程设计之前应该对问题进行系统的分析,确定总体思路;3 .将总任务分解为几个不同的板块,逐个击破;4 .要有足够的耐心和细心,坚持不懈。六、参考文献1宁正元赖贤伟 算法与数据结构(第二版)清华大学出版社2黄思先刘必雄 程序设计基础教程(C语言版)科学出版社3谭浩强 C程序设计题解与上机指导(第三版).北京:清华大学出版社,20054网上相关资料一、课程设计的目的1 .掌握算法与数据结构的基本概念以及程序设计的基本理论和基本方法与技术,学会分 析比较复杂的程序设计问题。2 .熟练掌握常用的数据结构如顺序表、链表、栈、队列、广义表、树结构、图网结构等, 学会各种数据结构上的基本运算。3 .初步掌握算法的时间性能与空间性能的分析技巧,得到复杂程序设计的初步训练。4 .学会分析研究计算机加工的数据对象的特性,能够运用和选择适当的数据结构解决实 际问题。5 .进一步提高从事软件分析、设计、编程和数据组织处理能力和水平。二、课程设计要求L在掌握常用数据结构的基础上实现一种数据结构,可以是逻辑结构或者是存储结构并 实现该种数据结构的基本运算包括插入、删除、元素获取、搜索、定位和创建等等。6 .举出具体事例,利用数据结构解决实际问题。对实际学习生活中遇到的问题进行分析 处理、建立模型,将前面设计的数据结构应用到具体实际问题当中。7 .掌握简单数据结构的程序实现的基本策略,能够利用高级语言将这种数据结构转化为 程序来实现。三、课程设计方案(1)数据结构本身就是一种定义了特定成员的结构体,例如结构体中包含指针和数据 元素的结构体就构成链表。仿照这种做法,设计一种含多种不同类型数组的结构体。这是在 数据结构的基础上对顺序表进行的改进,即把原本顺序表的一维数组data增加为多个数组 datal , data2等等,根据实际情况可以把datal 定义为字符型,data2定义为整型。 另外在结构体中可以定义其他变量。(2)确认应用该数据结构所要解决的实际问题为“学生成绩管理系统:该系统要求如 下:1 .对学生信息(包括学号、姓名、语文、数学、英语、理综)进行管理,包括 学生成绩的信息输入、输出、查询、删除、排序、统计、退出。2 .成绩信息显示浏览功能:完成全部学生记录的显示。3,排序功能:按学生平均成绩进行排序。4 .成绩信息录入功能:(成绩信息用文件保存,可以一次完成若干条记录的 输入。)5 .应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可 能清晰美观!四、课程设计内容4.1数据结构设计4. 1.1设计背景在实际学习生活中,我们需要对获得的信息进行处理和存储,然而处理的元素可以是数 据、符号、或者其他的记录,等等这些数据结点都可以用来构成一个线性表。线性表是由n 个相同类型数据元素组成的有限序列。而有些时候需要把不同类型的数据结点整合在一起, 用来描述某些记录。例如,要记录学生的成绩表需要包括姓名、学号以及各科成绩等数据, 这其中包含了字符型和整型两种数据类型。因此,仅用含有一个数组的顺序表没办法具体描 述出详细的信息,所以有必要增加顺序表中的成员来达到目的。令 下面以“学生成绩管理”问题为例建立解决此类问题的数据结构结构体并实现在该数据 结构上的基本运算。4.L2定义数据结构体“学生成绩管理”数据结构定义如下:typedef struct studentchar number10;char name20;float score4;float sum;)STU;STU stuN;这里把这种结构体成为“学生信息其中,数组name储存学生姓名,数组number储存 学号,数组score储存成绩数据(这里以语文 数学 英语 理综为成绩)。Sum用于储存总 分。存储方式由于该数据结构结构体中的成员是不同的数据类型,成员按照定义时的顺序依次存储在 连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考 虑到系统在存储结构体变量时的地址对齐问题。在C+的结构体中存储方式是按一种内存对 齐的规则来存储的。对于一个结构体中每次的偏移量是相等的,以结构体所占空间最大的变 量类型为一个位访问的单位偏移量,这样对于程序来说加快了访问的速度,当同时也会早造 成一些空间的浪费。一般情况下该结构体的大小可以通过如下方法计算:(1).分析各个成员长度;(2),找出最大长度的成员长度M (结构体的长度一定是该成员的整数倍);(3) .并按最大成员长度出现的位置将结构体分为若干部分;(4) .各个部分长度一次相加,求出大于该和的最小M的整数倍即为该部分长度;(5) .将各个部分长度相加之和即为结构体长度数据结构上的基本运算1,输入函数 inputscore ()输入运算实现的是把原始学生数据信息包括学号、姓名、各科成绩等输入结构体,并且 把信息按照顺序存储结构储存在一片连续的存储单元中。算法描述如下:void inputscore ()int i,j, n;printf ("请输入学生总数:nw);scanf ,&n);printf ("提示:*输入学号时请输入位数为8位的数字*n");printf(”请输入学生的学号姓名语文数学英语理综:n”);for (i=0;i<n;i+)scanf (n%s%s%f%f%f%f,r, stui. number, stui. name,&stui. score0 ,&stui.scoretl ,&stui. score2 ,&stui. score3);2,插入(添加)函数add()插入函数实现将某一学生的信息插入到结构体中,即结构体中的成员数组number, 数组name口,score元素分别增加1,增加的数值为所添加的新学生的信息。为了方便, add()函数利用循环功能实现添加多个学生信息,算法描述如下:void add()(int a,i,j;printf(”请输入新增加的学生人数:nM);scanf("%d”,&a);n=n+a;printf (”请输入添加的学生的学号姓名 语文 数学英语 理综:n”);for(i=n-a;i<n;i+)scanf (,r%s%s%f%f%f%f,r, stui. number, stui. name,&stui. score0 ,&stui.scorel ,&stui. score2,&stui.score3);i j3,删除函数delscore()删除某学生的信息,根据输入的学号,搜索所有学生信息找到该学号的信息并删除,删 除的具体操作为结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位 置,删除该学生信息后学生总数减一。算法描述如下:void delscore()(int i,j,flog=0;char m,a10;system(nclsn);printf ("请输入要删除的学生学号n”);scanf (,r%s,f ,a);for(i=0;i<n;i+)if(strcmp(a,stui. number)=0)(flog=l;break;if (flog=0)printf ("未找到该学生信息n");elseprintf ("是否删除该学生成绩(y/n)n,r);scanf (n%s,&m);if(m='y')for(i;i<n-l;i+)stui=stui+l;n=n-l;printf ("删除成绩成功n除;elseprintf ("删除成绩失败n"); 4,输出(显示)函数lookscore ()输出所保存的学生信息。先将信息数据按照某一元素进行排序,这里按照总分从大到小 排序并输出所有学生信息。算法描述如下:void lookscore() (int i,j,k;STU t;for(i=0;i<n-l;i+)(for(k=i,j=i+l;j<n;j+)if (stuj. sum>stuk. sum)k二 j;if(k!=j)(t=stuk;stuk=stui;stui=t;)printf ("名次t学号tt姓名t语文t数学t英语t理综t总分n”);for (i=0;i<n;i+)printf (,r%dt%st%st%. lft%. lft%. lft%. lfnn, i+1, stui. number, s tui. name, stui. score0, stui. scoretl, stui. score2, stui score3, stu i. sum);5.查询函数 searchscore ()根据学号查询学生信息并输出。算法描述如下:void searchscore() (char a10;int i,j,flog=0;system(nclsn);printf ("请输入需查询的学生学号n");scanf (,r%sn,a);for(i=0;i<n;i+)if (strcmp(a, stui. number) =0)(flog=l;printf ("名次t学号tt姓名t语文t数学t英语t理综t总分n”);printf (n%dt%st%st%. lft%. lft%. lft%. lft%. lfnn, i+1, stui. number, stui .name, stui. score0, stui. scorel, stui. score2, stui. score3, stui. s um);printf (nnn);break;if (flog=0)printf("未找到该学生信息!");4. 2实例应用5. 2.1问题描述已知某班级学生入学成绩如下表,设计“学生成绩管理系统”使其具有以下功能:(1) 能完成对学生成绩的录入能按班级统计学生的成绩,求学生的总分及平均分,排序(2) 能按班级,学期输出学生的成绩单和不及格科目及学生名单能查询单个学生成绩(3) 能修改单个学生信息表1某班学生高考入学成绩表姓名学号语文数学英语理综总分张丰31260030131127138252648李民31260031115132141231619王凯31260032122110128273633 陈丽312600801081351252546224. 2.2程序设计程序主要包括以下几个模块:1、成绩录入功能2、成绩输出功能3、成绩查询功能4、 添加模块5、删除模块6、修改模块7、保存功能8、退出系统主程序流程图如下: