《程序设计基础》课程报告—成绩管理系统_第1页
《程序设计基础》课程报告—成绩管理系统_第2页
《程序设计基础》课程报告—成绩管理系统_第3页
《程序设计基础》课程报告—成绩管理系统_第4页
《程序设计基础》课程报告—成绩管理系统_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、成都东软学院成都东软学院 数据结构项目报数据结构项目报告告 课课 程:程: 数据结构数据结构 项目名称:项目名称: 学生成绩管理系统学生成绩管理系统( (链表版链表版) ) 专业班级:专业班级: 网络工程一班网络工程一班 学学 号:号:1616 姓姓 名:名: 第一组第一组 指导教师:指导教师: 20152015 年年 0606 月月 3 3 日日 目录目录 1 项目概述项目概述. 1 1.1 内容.1 1.2 功能.1 1.3 意义 . 1 2 项目实施项目实施.2 2.1 主要功能模块说明.2 3 项目总结项目总结.3 3.1 结论. 3 1 项目概述项目概述 1.1 内容内容 对学生信息

2、(包括学号、数学、英语、计算机、平均分)进行管理,包括学生成绩的信息输入、 输出、查询、删除、排序、统计、退出.将学生的成绩信息进行记录。 信息内容包含:学生的学号、姓名、成绩。假设,现收集到了一个班学生的所有成绩信息, 要求用 C 语言(链表)编写一个简单的成绩管理系统,可进行录入、查询、修改和浏览等 功能。 1.2 功能功能 (1)主菜单界面设计。通过提示用户输入一个数字选项,调用相应的 功能函数。 (2)学生成绩显示:完成班级全部学生成绩的显示。 (3)学生成绩追加:完成新增一个(或多个)学生的成绩记录,要求在追加过程中有相应的 提示信息,完成追加后能重新计算学生平均成绩并显示;。 (4

3、)学生成绩修改:要求能按学号和按姓名两种定位方式,且可以按用户要求修改记录中除 学号和姓名以外的指定内容,并重新计算学生的平均成绩。 (5)学生成绩信息的查询;要求系统能按学号和按姓名两种查询方式定位,显示符合条件的 记录,若查询不到应给出相应的提示信息。 (6)学生成绩信息的删除;要求可按指定的学号和指定的姓名两种定位方式删除学生的成绩 记录。 (7)要求在删除模块、修改模块和查询模块中若找不到所需的记录时,系统设计中应有一定 的提示信息。 (8)成绩排序:按学生平均成绩和单科成绩进行排序。 (9)成绩统计:统计并以表格的形式显示所有课程的平均分。 1.3 意义意义 1.在编辑应用程序过程中

4、,逐步加深对 C 语言链表编程的理解,掌握结构化数据结构的基 本思路和方法。 2.加强实践的能力,动手能力,同时进一步对所学的知识进行巩固,为以后的学习奠定基 础。 3.增强学生我们利用自己所学知识解决实际问题的能力。 4.掌握书写程序设计说明文档的能力。 5.增强了团队合作能力,培养了我们的团队意识。 2 项目实施项目实施 2.1 主要功能模块说明主要功能模块说明 学生成 绩管理 系统 输入学 生成绩 显示所 有学生 成绩 插入某 个学生 的成绩 删除谋 个学生 的成绩 查找某 个学生 成绩 显示各 科最高 分 显示各 科平均 分 排序退出程 序 主要模块功能说明:主要模块功能说明: 1 输

5、入功能:输入学生姓名学号及成绩。 2 查看功能:输出姓名学号及各科成绩。 3 查询功能:通过学号查询学生姓名及各科成绩。 4 统计功能:统计班级学生及格率,优秀率,各个学生成绩方差等。 5 修改功能:通过输入学号修改指定学生的错误信息。 6 添加功能:添加学生信息。 7 删除功能:通过输入学号输入指定学生信息。 8 保存功能:将学生信息保存。 9 退出系统。 主要函数的函数原型主要函数的函数原型 void Menu(); int main(); LinkList Input(); void Display(LinkList L); void Insert(LinkList L); void D

6、elete(LinkList L); void Search(LinkList L); void Max(LinkList L); void Average(LinkList L); void Sort(LinkList L); void tuichu(); 3 项目总结项目总结 3.1 心得心得 源代码: #include #include #include #include /单链表的定义 /数据元素的类型 typedef struct LNode /声明结点的类型和指向结点的指针类型/ int stuid; char name20; float english; float math;

7、float database; float sum; float average; struct LNode *next; /指示结点地址的指针/ LNode,*LinkList; /函数 1.输入学生信息,逆向建立单链表 LinkList Input() int i,n; LinkList L,p; L=(LinkList)malloc(sizeof(LNode); L-next=NULL; /建立一带头结点的空单链表/ /单链表初始化结束 printf(t 请输入要输入的学生个数:); scanf(%2d, /逆序建立 for(i=n; i0; i-) printf(t*n); print

8、f(t* 请输入第%d 个学生的信息 *n,i); printf(t*n); p=(LinkList)malloc(sizeof(LNode); /生成新结点/ printf(t 请输入学生的学号:); scanf(%d, printf(t 请输入学生的姓名:); scanf(%s,p-name); printf(t 请输入学生的英语成绩:); scanf(%f, printf(t 请输入学生的高数成绩:); scanf(%f, printf(t 请输入学生的数据结构成绩:); scanf(%f, p-sum=p-english+p-math+p-database; p-average=p-s

9、um/3; p-next=L-next; L-next=p;/把新结点插入到链表头部 system(cls); return L; /函数 2.显示学生信息 void Display(LinkList L) system(cls); LinkList p; p=L-next;/ L 为头指针 p 指向第一个结点 if(L=NULL) printf(t 请先输入数据n); else printf(t 所有同学信息如下:n); printf(t 学号t 姓名t 总分t 平均分t 英语t 高数t 数据结构n); while(p) printf(t%dt%st%.2ft%.2ft%.2ft%.2ft%

10、.2fn,p-stuid,p- name,p-sum,p-average,p-english,p-math,p-database); p=p-next; /函数 3.插入单个学生到表头 void Insert(LinkList L) system(cls); LinkList p; p=(LinkList)malloc(sizeof(LNode);/p 指向要插入的结点 printf(t 请输入学生的学号:); scanf(%d, printf(t 请输入学生的姓名:); scanf(%s,p-name); printf(t 请输入学生的英语成绩:); scanf(%f, printf(t 请

11、输入学生的高数成绩:); scanf(%f, printf(t 请输入学生的数据结构成绩:); scanf(%f, p-sum=p-english+p-math+p-database; p-average=p-sum/3; p-next=L-next;/将 p 插入 L 中 L-next=p; printf(t 插入成功!n); /函数 4.删除某个学生 /要知道要删除的这个结点的前一个结点的位置 void Delete(LinkList L) system(cls); LinkList p,q; int num,ch; char s20; if(L=NULL) printf(t 请先输入数据

12、n); else p=L; /L 是头结点的头指针,最后 p 指向要删除的结点的前一个位置 q=p-next; /q 指向 p 的下一个结点,即最后指向要删除的结点 printf(t1.按姓名删除nt2.按学号删除nt 请选择:); scanf(%d, if(ch=1) printf(t 请输入姓名:); scanf(%s,s); while(strcmp(q-name,s)!=0 q=q-next; if(strcmp(q-name,s)=0) /q 指向的结点要被删除,p 指向要 删除的结点的前一个位置 p-next=q-next; printf(t 被删除学生的信息如下:n); prin

13、tf(t 学号t 姓名t 总分t 平均分t 英语t 高数t 数据结 构n); printf(tt%dt%st%.2ft%.2ft%.2ft%.2ft%.2fn,q- stuid,q-name,q-sum,q-average,q-english,q-math,q-database); free(q); /释放要删除的结点 q else printf(t 没有该学生的信息n); /按姓名删除 else printf(t 请输入要删除学生的学号:); scanf(%10d, while(q-stuid!=num q=q-next; if(q-stuid=num) /q 指向的结点要被删除,p 指向要

14、删除的 结点的前一个位置 p-next=q-next; printf(t 被删除学生的信息如下:n); printf(tt 学号t 姓名t 总分t 平均分t 英语成绩t 高数成 绩t 数据结构成绩n); printf(%dt%st%.2ft%.2ft%.2ftt%.2ftt%.2fn,q- stuid,q-name,q-sum,q-average,q-english,q-math,q-database); free(q); /释放要删除的结点 q else printf(t 没有该学生的信息n); /按学号删除 /有学生信息 /函数 5.顺序查找某个学生 void Search(LinkLis

15、t L) system(cls); LinkList p; int num,ch; char sn20; p=L-next; if(!L) printf(t 请先输入数据n); else printf(t1.按学号查找nt2.按姓名查找nt 请选择:); scanf(%d, if(ch=1) printf(t 请输入要查找学生的学号:); scanf(%10d, while(p if(p-stuid=num) printf(t 学号t 姓名t 总分t 平均分t 英语成绩t 高数成绩 t 数据结构成绩n); printf(t%dt%st%.2ft%.2ft%.2ftt%.2ftt%.2fn,p-

16、 stuid,p-name,p-sum,p-average,p-english,p-math,p-database); else printf(t 没有该学生的信息n); /按学号查找 ch=1 else printf(t 请输入要查找学生的姓名:); scanf(%s,sn); while(p if(strcmp(p-name,sn)=0) printf(t 学号t 姓名t 总分t 平均分t 英语成绩t 高数成绩 t 数据结构成绩n); printf(%dt%st%.2ft%.2ft%.2ftt%.2ftt%.2fn,p- stuid,p-name,p-sum,p-average,p-eng

17、lish,p-math,p-database); else printf(t 没有该学生的信息n); /按姓名查找 ch=2 /有数据 /函数 6.显示各科最高分 void Max(LinkList L) system(cls); float max1=0,max2=0,max3=0; LinkList p1=L-next,p2=L-next,p3=L-next; printf(t*n); printf(t* 显示各科最高分 *n); printf(t*n); for(p1; p1-next!=NULL; p1=p1-next) if(p1-englishp1-next-english) ma

18、x1=p1-english; else max1=p1-next-english; /数学最高分 for(p2; p2-next!=NULL; p2=p2-next) if(p2-mathp2-next-math) max2=p2-math; else max2=p2-next-math; /数据结构最高分 for(p3; p3-next!=NULL; p3=p3-next) if(p3-databasep3-next-database) max3=p3-database; else max3=p3-next-database; printf(t 英语 :tt%6.1fn,max1); pri

19、ntf(t 高数 :tt%6.1fn,max2); printf(t 数据结构:t%6.1fn,max3); /函数 7.各科平均分 void Average(LinkList L) system(cls); float ave1,ave2,ave3,i=0; float english1=0,math1=0,database1=0; LinkList p; p=L-next; if(!L) printf(t 请先输入数据); while(p!=NULL) i+; english1=english1+p-english; math1= math1+ p-math; database1=data

20、base1+ p-database; p=p-next; ave1=english1/i; ave2=math1/i; ave3=database1/i; printf(t*n); printf(t * 各科平均分的统计 *n); printf(t*nn); printf(tt 英语t 高数t 数据结构n); printf(t 平均分:%6.1ft%6.1ft%6.1fn,ave1,ave2,ave3); /函数 0.退出 void tuichu() printf(t*谢谢使用*n); exit(0); /函数 8.排序 void Sort(LinkList L) system(cls); L

21、inkList p,q,r; int ch1,ch2,dd1,i,j,count=0; float dd2; if(!L) printf(t 请先输入数据); else printf(t1.直接插入排序nt2.冒泡排序nt3.直接选择排序nt 请选 择:); scanf(%d, switch (ch1) case 1: /L 是带头结点的单链表 printf(t1.按学号排序nt2.按英语成绩排序nt3.按高数成绩排 序nt4.按数据结构成绩排序nt5.按总分排序nt 请选择:); scanf(%d, switch (ch2) case 1: p=L-next-next;/p 指向第一结点的后

22、继 L-next-next=NULL;/直接插入排序,第一元素有序,从 第二元素起依次插入 while(p!=NULL) r=p-next;/暂存 p 的后继 q=L; while(q-next!=NULL/将 P 结点链入链表 p-next=q-next; q-next=p; p=r; break; case 2: p=L-next-next; L-next-next=NULL; while(p!=NULL) r=p-next; q=L; while(q-next!=NULL p-next=q-next; q-next=p; p=r; break; case 3: p=L-next-next

23、; L-next-next=NULL; while(p!=NULL) r=p-next; q=L; while(q-next!=NULL p-next=q-next; q-next=p; p=r; break; case 4: p=L-next-next; L-next-next=NULL; while(p!=NULL) r=p-next; q=L; while(q-next!=NULL p-next=q-next; q-next=p; p=r; break; case 5: p=L-next-next; L-next-next=NULL; while(p!=NULL) r=p-next; q

24、=L; while(q-next!=NULL p-next=q-next; q-next=p; p=r; break; /switch(ch2) break; case 2: p=L-next; while(p) count+; p=p-next; printf(1.按学号排序nt2.按英语成绩排序nt3.按高数成绩排序 nt4.按数据结构成绩排序nt5.按总分排序nt 请选择:); scanf(%d, switch (ch2) case 1: for(i=0; inext; for(j=0; jstuidp-next-stuid) dd1=p-stuid; p-stuid=p-next-st

25、uid; p-next-stuid=dd1; p=p-next; break; case 2: for(i=0; inext; for(j=0; jenglishp-next-english) dd2=p-english; p-english=p-next-english; p-next-english=dd2; p=p-next; break; case 3: for(i=0; inext; for(j=0; jmathp-next-math) dd2=p-math; p-math=p-next-math; p-next-math=dd2; p=p-next; break; case 4:

26、for(i=0; inext; for(j=0; jdatabasep-next-database) dd2=p-database; p-database=p-next-database; p-next-database=dd2; p=p-next; break; case 5: for(i=0; inext; for(j=0; jsump-next-sum) dd2=p-sum; p-sum=p-next-sum; p-next-sum=dd2; p=p-next; break; /switch(ch2) break; case 3: /直接选择排序一趟找出一个关键字最小的结点,其数据和当前

27、 结点进行交换; /若要交换指针,需记下当前结点和最小结点的前驱指针 p=L-next; printf(1.按学号排序nt2.按英语成绩排序nt3.按高数成绩排序 nt4.按数据结构成绩排序nt5.按总分排序nt 请选择:); scanf(%d, switch (ch2) case 1: while(p) q=p-next; r=p;/设 r 是指向关键字最小的结点的指针 while(q) if(q-stuidstuid) r=q; q=q-next; if(r!=p) dd1=r-stuid; r-stuid=q-stuid; q-stuid=dd1; p=p-next; /while(p)

28、 break; case 2: while(p) q=p-next; r=p;/设 r 是指向关键字最小的结点的指针 while(q) if(q-englishenglish) r=q; q=q-next; if(r!=p) dd2=r-english; r-english=q-english; q-english=dd2; p=p-next; /while(p) break; case 3: while(p) q=p-next; r=p;/设 r 是指向关键字最小的结点的指针 while(q) if(q-mathmath) r=q; q=q-next; if(r!=p) dd2=r-math; r-math=q-math; q-math=dd2; p=p-next; /while(p) break; case 4: while(p) q=p-next; r=p;/设 r 是指向关键字最小的结点的指针 wh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论