C语言学生信息管理系统程序与报告.doc_第1页
C语言学生信息管理系统程序与报告.doc_第2页
C语言学生信息管理系统程序与报告.doc_第3页
C语言学生信息管理系统程序与报告.doc_第4页
C语言学生信息管理系统程序与报告.doc_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

C程序课程设计学生成绩管理系统的设计与运行 姓 名:_ 学号:_ 院(系):地空学院 专业:地球信息科学 指导教师: 职称: 评 阅 人: 职称: 2012 年 1 月目 录第一章 程序设计课题:学生信息管理系统 (1) 1.1程序设计题目(1)1.2程序设计要求(1)第二章 学生信息管理系统内容及结构 (1) 2.1结构和流程图部分(1) 第三章 学生信息管理系统运行示例 (7)3.1运行结果截图展示(7)第四章 程序设计实习感想 (17)附录 源代码和注释(18)参考文献 (46)2012.1 中国地质大学论文 55第一章 程序设计课题:学生信息管理系统1.1 程序设计题目课程设计题目:学生信息管理系统设计通过学生信息管理系统项目的实际编程操作训练,让同学们掌握对实际工程项目的开发与设计的基本方法与步骤,掌握结构体数组、分支结构、循环结构、顺序结构程序设计、函数调用的思想,在日后的工作和学习中能够更加熟练地运用所学的知识。 提高学生们的实际操作能力。1.2 程序设计要求界面要求:有简单操作界面, 用户可以通过数字选择不同的功能. 功能要求:(1) 录入成绩.(建立链表,每个结点包括:)(2)学生信息包括学号、姓名、数学、物理、英语、计算机、总分。(2) 输出成绩.(链表的输出)(4)排序信息(可以按学号排序、按总分排序) (5)查找成绩.(按学号或姓名查找结点)(6)删除信息(按学号或者姓名删除结点)(7)添加信息(按学号顺序插入结点,) (8)保存到文件, 以及从文件中读出.第二章 学生信息管理系统内容及结构2.1 结构和流程图部分本系统在编辑过程中一共定义了28个函数以实现菜单、输入数据,查询信息,删除信息,修改信息,阅读信息,排序和文件处理八个主要的功能,各个不同的功能的函数的调用通过一个main()主函数和四个其他的菜单函数实现功能的选择和切换。各个部分详细如下:进入主目录进入学生信息管理系统开始输入学生信息从原文件中录入学生信息显示学生的信息退出系统是否编辑信息是否返回目录查询学生信息删除该生补充学生信息在列表中插入在列表末补充返回目录排序学生信息按学号排序按年龄排序按单科成绩排序按总分排序显示学生信息返回主目录是否保存退出否保存信息是全部系统流程图1.输入部分:在编辑程序之处,根据程序的基本要求能够录入学生的学号、姓名、年龄、数学、物理、英语、计算机四门成绩,同时还考虑到在后期的数据处理中需要计算和显示出每一个学生的总分成绩并建立结点以链表的形式存入电脑中,所以在开始的结构体中我定义了一个long int型num变量存入学号,一个字符数组name存入学生姓名,一个整形age,五个浮点型和为了构建链表用于指向下一个结点地址的struct student型指针变量,student型结构体在全部的系统中都会被引用,所以定义为全局变量。同时定义一个整形变量n作为计数器用于计算总共的学生数目,其中n会在插入函数,查询函数和删除函数中作为循环的总次数多次使用。Head10101成绩next10103成绩NULLP1P2n=2在输入函数中先定义了一个结构体型指针head,作为建立链表的首地址,同时也作为creat函数的返回值,是实现其他的函数在创建链表中实现各种功能的地址。在输入数据过程中,默认学号不为零,采用ifelse进行判断,如果学号的值扫描为0则终止输入,返回主菜单,不为一使用malloc创建新的结点,由已经定义的指针p1指向,根据p1对结构体进行赋值,赋值完毕后已定义的指针p2此时指向该节点的上一个结点,把p1所指向的新地址赋给上一个结点的next,使链表各结点间相联系,建立保存有学生信息的链表,每输入一次,整形变量n自增,计数学生。开辟一个新结点是p1、p2指向新结点读入一个数据给p1指向的结点P1-num=0n=n+1n=1Head=p1P2-nexy=p1p2=p1尾结点是NULL,退出真假真假输入函数流程图2.输出部分输出函数定义为无返回值(void)型,首先把所需输出链表的首地址head传递给输出函数的形参,定义一个dowhile循环,判断循环条件是next的地址不为NULL,把首地址head复制给指针p1,通过printf输出每一个结点信息,p1再根据next中存放的地址指向下一个结点输出,当读入最后一个结点时,next为空,循环终止,函数结束。P=headP指向尾结点输出结点P=p-next退出假真输出函数流程图输出函数仅输出链表内容,不作修改,其他也无功能。3.排序部分在本系统中排序功能部分一共定义了7函数sort个以实现从学号到年龄以及单科成绩和总分的不同排序方式。以按学号排序为例。在排序中使用了冒泡法排序,根据冒泡法原理,当p2-num大于p1-num时,数据交换,但因为结构体不是数组,需要从学号,姓名到成绩的全部交换,所以在函数开始定义了一个swap交换函数,并在swap函数中定义了一个struct student类型的形参作为中间变量,以交换比较的两个结点的值,swap用于嵌套在sort函数中实现排序功能,然后把p1的地址赋给p2,p1指向下一个结点再次比较,当p1指向最后一个结点,重新把head赋给p1和p2,循环n-1次后实现排序。排序结束之后,所有学生的顺序按照学号的升序排列,排列完后,返回所需排列的链表首地址,嵌套输出函数print输出结果。其他的排序函数原理与学号排序基本一致。在排序函数中改变了原来链表中的4.查询部分本系统为了使用方便同样定义了8个函数search以实现学号,姓名及各科成绩的查找。在查找中,首先把查找链表的首地址head传递进入search函数的形参,search函数中又定义了一个变量(根据不同的函数查找功能的不同而变化,如学好查找就定义long int型)函数search根据首地址进行读取,用ifelse函数进行判断,如果head= =NULL则直接输出链表空置,请补充信息,其余状况才实现继续扫描。其实现过程实质是链表的遍历及按条件输出的结果。当结点的 num 成员与用户的输入值吻合时,则输出该结点的信息,否则则扫描下一个结点的信息,依次类推。当所有的结点均被扫描但仍未发现吻合的 num值时,会提示“不存在的信息”,并跳转到主菜单以实现重新操作。如果发现吻合的信息,用printf函数输出该结点的信息,即为我们所需要查找学生的信息,此时查找终止,返回主菜单。在查询函数中不改变原来连表内部保存的数值信息。5.补充信息部分在本系统中,补充信息包括在链表中间插入信息,和在链表尾部补充信息两种方式,虽然两种函数不同的运行结果可以通过排序函数实现最终输出和保存结果一致,但是再补充信息过程中还是可以更方便的完成。在插入函数insert中首先定义两个指针,一个用于传递得到的需要插入数据的链表的首地址,另一个用于指向存放待插入信息变量的地址,如果首地址空置(即head= =NULL)则令首地址为p0=stud。函数内定义的指针首先根据num大小的排列顺序,把各个结点中的num与带插入信息stud中的num进行比较,当num小于stud.num时,p=p-next依次向后对比,直到stud.num介于前后的num元素大小之间时,新定义一个指针p0=stud,并把p0的地址赋值给上一个结点的next成员,并把下一个节点的地址赋给p0-next,这样行的信息就成功的按照学好顺序插入了链表之中。插入函数一件改变了链表内部的储存信息,因此返回一个head值(如果原来的head= =NULL,则head值改变)用于其他的函数使用该链表。在链表尾部添加信息的函数定义为add,add函数的功能是在链表的末尾添加学生的信息结点,首先使用整形变量n的值读出学生总数,把n的值代入for的循环语句,使指针p指向已存在链表的最后一个结点,新建一个结点输入所需要添加的信息,把新结点地址赋给p-next,新结点的next暂时令其为NULL,直至需要再一次的添加结点时,循环以上过程,即可在链表尾部加入新的信息结点。6.删除信息部分删除信息部分包括一个查询模块和一个执行删除函数,删除函数是根据学生的学号查询学生的信息进行删除操作,因此在删除之前如果不知道学号可以根据查询功能首先进行查询,得到具体的信息之后读取学号,进行删除。先定义指针p1根据链表的首地址进行扫描,如果首地址为空置,则输出“学生信息为空,请输入信息”,不为空置则把扫描过程放入一个while的循环之中,扫描结果和输入的结果不吻合p1根据p-next指向下一个的结点,如果一致则修改上一个结点的next地址使其指向下一个结点,跳过所删除的结点之后free(p),这样就成功的删除了该节点,是指在以后的排序、查询、阅读信息中不再显示出来。P1=head链表为空num=p1-numP2=p1P1=p1-nextP1是删除结点P1是首结点Head=p1-nextP2-next=p1-next删除成功退出真假假真真假删除函数流程图9.文件处理部分:这一部分主要有读出函数(load)和保存函数(save)两个函数。Save() 函数可将链表信息写为文本文件保存在硬盘中,保存的文件名为file.txt 。load()函数可实现将以前保存的 file.txt 文件读出,并返回首地址head,根据返回值head(保存链表读入内存之后的首地址)代入其他的查询、删除、排序函数中进行其他的操作处理,实现信息的反复使用。10.菜单部分:菜单函数在本程序中是实现各个不同的功能的函数之间的反复调用,因此是实现系统运行的很重要的部分。在本系统中为了实现操作界面的简单化,一共设计了4个菜单函数,首先是主菜单函数,主菜单函数显示出了输入、读取文件、查询、删除、补充、输出、排序、退出、和保存文件九个个主要的功能。因为在设计函数时,为了让函数之间可以彼此调用,实现功能的模块化,我选择了每一个函数都返回所处理的链表的首地址,因此定义的是返回指针的函数,因此在主函数中定义了struct student型指针变量head用于接受每个函数返回的地址,同时定义一个新的整形变量用于录入使用者的选择,代入switch函数进行判断从而调用不同功能的函数,在本系统中默认输入0为返回主目录,便于进行其他的操作。第三章 学生信息管理系统运行示例2.1 运行结果截图展示打开系统选择1进入主目录在目录中选择(1)一输入学生信息按学号、姓名、年龄各科成绩依次输入5个学生的信息当输入学号为零,系统判断输入完毕返回主菜单,选择6可以查看我们输入的学生信息。在主目录中选择保存功能函数,我们把刚才输入的信息以文本文档保存下来为了检测系统的保存和读取功能,我们打开刚才的文件,显示的是刚才输入的5个学生信息,保存和读取成功。现在我们在上次的基础上继续输入学生信息。输入20107号学生孙皓,添加成功现在我们发现没有学号为20104的学生,要插入信息中大家可以看见学号为20104的学生刘禅成功的插入了链表之中接下来我想要查询某一位学生的信息,返回主菜单,进入查询功能页面这里安排了多种查询方式,下面主要演示按姓名查询、按学号查询和按数学成绩查询,其他的几种查询函数基本一致,就不做演示。为了便于查看信息,我们把学生信息进行排序查看首先按学号进行降序排序再按数学成绩由高到低进行排序,两次排序均成功,其他的排序类似不做演示这时删除一个学生的信息,进入删除功能成功删除学号为20101的刘备同学,本次更改结束,把修改结果保存以message为文件名保存为文本文档保存成功操作完毕后我们退出学生信息管理系统,谢谢您的使用。第四章 程序设计实习感想进入本学期以来,我们开始学习C语言课程,这是对于计算机的学习与使用过程中极为重要的一门课程。本次实习经历,让我对于C语言的理解不仅仅局限在了书本上,而且获得了一次难得的机会去实践所学内容,综合运用一个学期所学习的知识,进行一次系统而复杂的程序编写工作,提高了自己的编程能力,加深了我对与C语言的理解,同时积累了可贵的编程经验,获益匪浅。其中有几点很大的收获如下:首先,C语言是一门实践性的课程,只是学习书本知识是远远不够熟练的掌握它的,要想充分的理解和运用C语言,我们不仅仅需要理解每一个语句的含义和使用方法,而且要通过大量的编写程序来熟练的使用他。而本次实习课程正是为我们创造了这样的条件。学生信息管理系统就目前阶段而言,对我们来说是比较复杂的一个系统,在编写系统过程中,为了实现我们想要的各种功能,我几乎用到了所有的学习过的内容,这一次程序编写是对自己C语言的一次综合考察,全面的测试了自己的学习情况,我就在本次事件中了解到了自己结构数组的知识还不够熟练,有待提高。其次,本次实习我深刻的学习到了计算机编程的思想,即把复杂的问题简单化,这一种处理问题的思想在本系统中定义的许多函数中都有体现,如删除函数,查找函数,排序函数,其中以排序函数体现的尤为突出。以按学号排序为例,若干个学号按序号由大到小排序看似复杂,因为学号数目众多而且计算机功能有限,利用基本的语句只能实现两个数据的大小比较,所以看上去很复杂,但是在实习课程中,我学会了冒泡法比较大小,他把复杂的比较进行了简单化,首先比较相邻两个数据的大小,利用指针这个工具,如果不满足我们所要求的大小顺序,就把相邻的两个数值进行交换,然后指针指向下一个结点在比较下面两个数据的大小,进行n-1次循环之后数组就会按大小顺序排列好。这是一种非常好的排序方式,但是他更加体现了化繁为简的思维方法,把n个值的比较化为了两个值的比较,从而进行排序,这种方法就像撬动地球的支点一样,用微小的力完成了巨大的工作。这种方法费城值得借鉴。第三,程序模块化设计的方法,在本次系统设计之中,处处体现着这一种思想,想染大量的定义和使用函数让主程序更加的清晰和简单化,同时还可以通过增加和减少,改变函数的内容来修改整个系统的功能和运行情况,而不回影响到其他的程序的运行。编写的程序在一定的条件下可以实现重复使用大大减少了所需要编写的程序的数量,极大的方便了我们的程序编写工作。学习编写和调用函数是我们在熟练使用计算机语言过程中必不可少了的一项能力。第四,整体思想,在模块化思想的基础上整体思想极为重要,因为要把如此众多的函数反复的调用,许多的模块都不再是单一的完成该项功能,他还需要与其他的函数相配合完成该项功能,因此许多的语句都有很重要的意义,比如输出函数本不需要返回值,但是为了配合全部的函数同样定义为了一个返回指针的函数最后,在实习过程中,我锻炼了自己解决问题的能力,编写程序往往会出现很多的问题导致无法运行,或者应有的功能无法实现,折旧需要我们深刻的理解每一个语句的含义从中找到问题,并加以改正,这一次实习我充分经历了这样的过程,提高了自己,现在已经基本能够迅速发现各种问题,加深了常见的集中错误的影响,为以后的进一步的学习和实践提供了基础。附录: 程序源代码及注释#include#include#include#includeint n;/定义一个整形变量计数学生人数struct student/定义一个结构体作为全局变量,用于存储学生信息,和作为结点long int num;/学号char name10;/姓名int age;/年龄float math;/数学float phy;float eng;float cpu;float sum;struct student *next;/下一个结点地址;/插入学生信息的函数 struct student *insert(struct student *head, struct student *stud); /交换两个结点信息的函数,用于排序函数调用void swap(struct student *p1, struct student *p2);/输入信息的函数struct student *creat(void);/输出信息的函数void print(struct student *head);/添加学生信息 struct student *add(struct student *head, struct student *stu);/读取struct student *load(struct student *head);/查询模块/1.按学号查询struct student *search1(struct student *head);/2.按姓名查询struct student *search2(struct student *head);/3.按年龄查询struct student *search3(struct student *head);/4.按数学成绩查询struct student *search4(struct student *head);/5.按物理成绩查询struct student *search5(struct student *head);/6.按英语成绩查询struct student *search6(struct student *head);/7.按计算机成绩查询struct student *search7(struct student *head);/8.按总分成绩查询struct student *search8(struct student *head);/保存模块int save(struct student *p1);/删除模块struct student *del(struct student *head);/排序模块/1.按学号排序struct student *sort1(struct student *head);/2.按年龄排序struct student *sort2(struct student *head);/3.按数学成绩排序struct student *sort3(struct student *head);/4.按物理成绩排序struct student *sort4(struct student *head);/5.按英语成绩排序struct student *sort5(struct student *head);/6.按计算机成绩排序struct student *sort6(struct student *head);/7.按总分成绩排序struct student *sort7(struct student *head);/主目录函数int menu()int k;/定义一个整形变量用于输入选择printf(nnn);printf(*n);printf(* 学生信息管理系统主目录 *n);printf(* 1.输入学生的信息 *n);printf(* 2.从文件读取信息 *n);printf(* 3.查询学生的信息* *n);printf(* 4.删除学生的信息 *n);printf(* 5.补充学生的信息* *n);printf(* 6.阅读学生的信息 *n);printf(* 7.排序学生的信息* *n);printf(* 8.保存学生的信息 *n);printf(* 9.退出 *n);printf(*nn);printf(我的选择:);/在显示器上显示菜单页面scanf(%d, &k);/输入选择getchar();return(k);/返回值进入switch函数判断,以调用不同功能的函数/3.查询信息菜单struct student *menu3(struct student *head)int k;/定义一个整形变量输入switch进行判断printf(nnn);printf(*n);printf(* 查询学生信息目录 *n);printf(* 1.按学生学号查询 *n);printf(* 2.按学生姓名查询 *n);printf(* 3.按学生年龄查询 *n);printf(* 4.按数学成绩查询 *n);printf(* 5.按物理成绩查询 *n);printf(* 6.按英语成绩查询 *n);printf(* 7.按计算机成绩查询 *n);printf(* 8.按总分成绩查询 *n);printf(* 9.返回主菜单 *n);printf(*nn);printf(我的选择:);/输出菜单界面scanf(%d, &k);/输入选择switch(k)case 1:/调用学号查询函数head=search1(head);/返回首地址head用于其他函数的处理break;/处理完毕,结束语句case 2:/调用姓名查询函数head=search2(head);/返回首地址head用于其他函数的处理break;/处理完毕,结束语句case 3:/调用年龄查询函数head=search3(head);/返回首地址head用于其他函数的处理break;/处理完毕,结束语句case 4:/调用数学成绩查询函数head=search4(head);/返回首地址head用于其他函数的处理break;/处理完毕,结束语句case 5:/调用物理成绩查询函数head=search5(head);/返回首地址head用于其他函数的处理break;/处理完毕,结束语句case 6:/调用英语成绩查询函数head=search6(head);break;case 7:/调用计算机成绩查询函数head=search7(head);break;case 8:/调用总分成绩查询函数head=search8(head);break;case 9:break;/退出查询功能,返回主菜单default:printf(输入错误请重试n);return head;/5.补充信息菜单struct student *menu5(struct student *head)int k;/定义一个整形变量输入switch进行判断struct student *stu=0;struct student stud;/用于输入插入学生的信息printf(nnn);printf(*n);printf(* 补充学生信息目录 *n);printf(* 1.在列表尾部添加学生信息 *n);printf(* 2.在列表中间插入学生信息 *n);printf(* 3.返回主菜单 *n);printf(*nn);printf(我的选择:);/菜单界面scanf(%d, &k);/输入选择项switch(k)case 1:head=add(head, stu);/调用添加函数,把返回地址赋给headbreak;/结束语句case 2:loop4:printf(n请输入插入的学生的学号(输入0退出):);scanf(%ld, &stud.num);/输入学号if(stud.num=0)printf(请根据主目录内容重新选择功能);/判断学号是否为零,为零返回主菜单else/不为零,输入其他信息if(stud.numnext=NULL;elsewhile(p0-nump1-num)&(p1-next!=NULL)/判断每个节点中学号的大小p2=p1;p1=p1-next;if(p0-numnum)/找到结点前一个大于插入结点,后一个小于插入结点if(head=p1)head=p0;/如果P1是首结点,改变head地址p0-next=p1;else/如果p1不是首结点,改变next插入结点p2-next=p0;p0-next=p1;else/如果插入结点大于所有的原结点则放在链表末尾p1-next=p0;p0-next=NULL;n=n+1;/插入一个学生,n自增一次return(head);/返回已改变链表的地址用于其他的函数处理/交换void swap(struct student *p1, struct student *p2) /交换函数,用于冒泡法的排序函数中int k, d;/定义各种交换的中间变量char a10;float temp;k=p1-num;/把新定义的num变量作为中间变量交换swap函数中的前后两个变量的学号信息p1-num=p2-num;p2-num=k;strcpy(a, p1-name);/交换姓名信息,采用一个同类型中间变量,过程同上strcpy(p1-name, p2-name);strcpy(p2-name,a);d=p1-age; /交换年龄信息,采用一个

温馨提示

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

评论

0/150

提交评论