用C语言实现一个简单的学生成绩管理系统Word文件下载.docx

上传人:b****5 文档编号:18921668 上传时间:2023-01-02 格式:DOCX 页数:16 大小:231.41KB
下载 相关 举报
用C语言实现一个简单的学生成绩管理系统Word文件下载.docx_第1页
第1页 / 共16页
用C语言实现一个简单的学生成绩管理系统Word文件下载.docx_第2页
第2页 / 共16页
用C语言实现一个简单的学生成绩管理系统Word文件下载.docx_第3页
第3页 / 共16页
用C语言实现一个简单的学生成绩管理系统Word文件下载.docx_第4页
第4页 / 共16页
用C语言实现一个简单的学生成绩管理系统Word文件下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

用C语言实现一个简单的学生成绩管理系统Word文件下载.docx

《用C语言实现一个简单的学生成绩管理系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《用C语言实现一个简单的学生成绩管理系统Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。

用C语言实现一个简单的学生成绩管理系统Word文件下载.docx

开发工具主要采用TurboC2。

0,主要用于对学生的学号、姓名等自然信息以及各项学科成绩进行增加、删除、修改、查询及保存到文件等操作。

系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用系统提供的管理功能。

学生成绩管理系统处理流程如图1。

图1系统处理流程图

主要功能设计描述如下:

(1)系统主控平台允许用户选择想要的操作,包括输入学生信息、显示学生信息、查询学生信息、修改学生信息、删除学生信息、计算成绩以及成绩的排序等。

通过输入相应的序号选择相应的操作。

(2)学生成绩信息用户根据提示输入学生的学号、姓名、以及三门课的成绩,如语文成绩、英语成绩、数学成绩等.输入完成一条学生记录,可根据提示信息继续输入下一条学生记录或者继续其他的操作。

允许输入多条学生的成绩信息记录。

输入完的学生记录暂时保持在单链表中,等待下一步的操作。

(3)查询学生信息可以根据学号,姓名,总分从单链表中对学生所有的信息进行查询,如果没有查询到任何信息,系统会给出提示信息。

(4)修改学生信息首先提示用户输入要进行修改的操作的学号,如果单链表中有该学生的信息存在,则提示用户输入要修改的学生的基本信息、各科成绩等,并将修改结果重新存储在单链表中。

如果用户没有找到要修改的学生信息,系统将给出提示。

(5)插入学生信息对已经建立好的信息若还需增加,则对信息进行插入。

首先提示用户输入要进行插入的学号,然后在根据提示对用户信息进行完整输入。

输入完成后系统将对其进行保存。

(6)删除学生信息首先提示用户输入要删除学生的学号,系统根据用户输入的信息在单链表中查找,如果找到,直接删除该学生全部信息,如果没有找到,系统给出提示信息。

(7)计算各科成绩平均分该模块主要进行学生成绩的平均分计算,进入计算界面,系统自动对各科进行平均分计算。

(8)显示学生信息在选择了显示学生信息后,将刚输入的学生信息从单链表中调出来显示,如果没有数据,则提示无学生记录。

(9)学生成绩排序成绩信息输入完整后,根据学生的总分对学生从小到大进行排序,在显示学生信息的时候可以看到学生在班级或校的排列名次。

(10)操作完成后对操作结果进行保存。

运行完毕,退出系统。

2系统功能模块初始化准备

1编译预处理

“编译预处理”是C编译系统的一个组成部分.在C编译系统对程序进行通常的编译(包括词法和语法分析、代码生成、优化等)之前,先对程序中这些特殊命令进行“预处理”,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。

C语言提供的预处理功能主要有:

(1)宏定义;

(2)文件包含;

(3)条件编译。

而本程序使用文件包含的预处理方式进行编译预处理:

#include<

stdlib.h>

/*标准库函数*/

#include〈stdio.h〉/*标准输入、输出函数库*/

#include<

conio。

h〉/*屏幕操作函数*/

#include〈string.h〉/*字符串函数*/

3.2。

2数据结构定义

学生成绩管理系统中的变量有学号,姓名,成绩等,这些数据类型各不相同,无法用简单数据类型来描述,显然要定义结构体类型。

由于学生人数很多,还需要定义数组或者链表。

数组的特点是数据在内存中顺序存放,长度必须事先指定,而学生的人数很难估计。

如果数组长度定的过大,会找出存储空间浪费,如果过小,又无法满足需求。

特别是进行插入,删除等操作时,代价较大而又容易出错。

用链表来管理学生成绩就显得比较妥当,它无需估计学生人数,进行插入删除等操作时代价较小。

C语言中,说明和使用“结构体”之前必须先定义,在编写程序之前应该对学生基本信息进行定义,在这个程序中,使用struct来定义结构体的类型为structlist,然后用它来定义变量,在定义结构体类型的时候定义一个next成员,该成员可以把学生结点进行链接。

并且通过类型定义typedef将已有的各种类型名定义成为新的类型标识符link,经类型定义后,link即可当做原类型名使用。

具体定义如下:

structlist{

intID;

/*学号*/

charname[256];

/*姓名*/

intchina;

/*语文成绩*/

intenglish;

/*英语成绩*/

intmath;

/*数学成绩*/

floatsum;

/*总分*/

intorder;

/*排序*/

structlist*next;

/*指向下一个学生的指针*/

};

typedefstructlistnode;

/*自定义一个数据结构的结点*/

typedefnode*link;

/*定义结点为link结构*/

3.3具体模块处理函数的实现

3.1菜单函数界面的设计

系统与用户交换的界面是通过菜单实现的,菜单按预定义格式显示主菜单界面,等待用户输入0-8中的任一数据,系统会根据用户的输入调用相应的功能模块,实现用户所要求的操作。

(1)本程序的菜单界面主要使用屏幕操作函数编写,欢迎界面设置为白底红字,菜单界面设置为绿底蓝字,在欢迎界面中单击任意键进入菜单操作界面.整个系统都以光标定位函数gotoxy(x,y)固定光标的位置,在对其进行输出,从而可以使显示的文字都出现在设定的窗口内,窗口的界面设置使用画图工具制作周围的边框,边框的设置具体如下:

gotoxy(8,2);

putch(0xc9);

/*输入左上角边框*/

for(i=1;

i〈46;

i++)putch(0xcd);

/*输出上边框水平线*/

putch(0xbb);

/*输出右上角边框*/

for(i=3;

i〈23;

i++)

{gotoxy(8,i);

putch(0xba);

/*输出左垂直线*/

gotoxy(56,i);

putch(0xba);

}/*输出右垂直线*/

gotoxy(8,23);

putch(0xc8);

/*输出左下角边框*/

i〈46;

/*输出下边框水平线*/

putch(0xbc);

/*输出右下角边框*/

window(9,3,55,22);

/*制作显示菜单的窗口*/

(2)菜单是由menu函数实现,主要通过printf函数显示一些文本选项如:

printf(”<

0>

exittheprogram.\n"

);

构建一个简单的字符界面,系统设置11个模块,用户通过输入关键字key从0—10之间选择相应的操作,函数通过switch调用各功能模块:

switch(key){case0:

exit(0);

case1:

head=init();

break;

case2:

head=creat_list()break;

case3:

search_chengji(head);

case4:

head=modify_chengji(head,key);

case5:

head=delete_chengji(head,key);

case6:

head=insert_chengji(head,key);

break;

case7:

average(head);

case8:

sort(head);

case9:

printf_list(head);

case10:

save(head);

3.2功能函数设计

(1)初始化链表

学生成绩管理系统使用前要先将系统进行初始化操作,初始化函数init()就是将函数置空。

(2)创建学生信息函数

创建学习信息函数由creat_list函数实现,首先在创建链表之前先定义函数的基本信息并创建结构体指针head,pointer和new,设学号,排名为整形,名字设为字符型,语文,数学,英语成绩设为单精度类型,并对order和sum进行初始化,为head建立一个空结点,当head不为空,输入用户信息,然后将新输入的数据存于head指针。

程序如下:

head=(link)malloc(sizeof(node));

/*建立一个新/空结点*/

if(head==NULL)

{printf("

memoryallocatefailure!

!

\n”);

exit(0);

else{

printf(”pleaseinputID:

"

);

scanf("

%d"

&

ID);

head->

ID=cID

printf("

pleaseinputname:

scanf("

%s"

cname);

for(i=0;

i<

256;

i++)head->

name[i]=cname[i];

printf(”pleaseinputchina:

,&

cchina);

head—〉china=cchina;

……

head—〉next=NULL;

pointer=head;

如果输入正确既while为真的时候为news新建立一个结点,提示用户如果要继续输入按1,输入0为退出。

新输入的数据存储到news指针里,然后把head和news里面的数据一起放到pointer,供下面操作时调用pointer的数据.

while

(1)

{news=(link)malloc(sizeof(node));

Areyoucontinue?

Ifcontinueenter’1'

orreturnenter’0’.。

."

/*输入1为继续,0为退出*/

%d”,&cID);

if(cID==0)break;

news—〉next=NULL;

pointer->

next=news;

pointer=news;

创建函数时只能创建一次,因为创建的链表暂时存于head指针里,如果再次创建,要先保存否则系统会自动将head指针进行初始化数据将被清空,存放新创建的记录。

(3)查询学生成绩函数

查询函数search_chengji用来对学生的基本信息进行查询。

首先使用光标定位函数gotoxy(x,y)和printf函数制作查询的子菜单,菜单包括:

0。

exit、1。

searchbyID、2。

searchbyname、3.searchbysum.查询菜单设置完成后应用switch(){case1:

执行语句;

}语句调用相应函数操作功能.

系统在调用函数时,调用自定义的辅助函数,按预定义格式显示查询成绩的子菜单界面。

用户输入的格式正确时使用while函数调用相应的功能函数。

①按学号查询,输入choose==1,key1为要查询的学号,查找系统中学号为key1的学生是否存在,如果key1==ID说明找到该学生,并标记flag=1,中断查询显示查询的结果,否则继续查找直到找到为止。

例如:

if(choose==1)

{while(pointer!

=NULL)

{if(pointer—>

ID—key1==0){flag=1;

}

elsepointer=pointer—〉next;

}}

②按名字查询,输入choose==2,sname为要查询学生的名字,查找系统中名字为sname的学生是否存在,如果strcmp(pointer—>

name,sname)==0说明找到该学生,并标记flag=1,中断查询显示查询的结果,否则继续向下查找直到找到名字为sname的学生。

③按学生的总成绩查询,输入choose==3,score为要查找学生的总分,查找系统中总分为score的学生是否存在,如果if(pointer—>

sum-score==0)说明找到该学生,并标记flag=1,中断查询显示查询的结果;

否则继续向下查找直到找到总分为score的学生;

(4)修改学生成绩函数

修改函数modify_chengji是对之前所输入的信息如果出现错误,或需要更改时使用。

在编写之前先对函数进行定义,并把head的值赋给pointer,然后用简单的printf函数编写修改菜单的基本界面以及修改的内容.用户根据提示输入要编辑的学号printf("

pleaseinputnumberformodify:

”);

scanf(”%d”,&

keynum),系统根据学号查找该学生的基本信息,如果寻找到该生,系统提示要修改的具体内容,根据用户需要选择相应内容进行修改,此功能应用switch(choose){case1:

}语句执行。

printf(”enter0exitmodefiy\n"

printf(”enter1modefiyname\n”);

enter2modefiychina\n”);

printf(”enter3modefiyenglish\n"

enter4modefiymath\n"

PleaseEnteryouchoice:

”);

%d"

choose);

信息输入完成后,按任意键系统自动保存到pointer中,新信息将覆盖原有信息pointer->

name[i]=xname[i],运行结束输出修改后的信息,返回到菜单.如果没有找到,系统将中止执行.

while

(1){if(pointer-〉ID==key3)

{if(choose==1)

{for(i=0;

i〈256;

pointer-〉name[i]=xname[i];

break;

}

elseif(choose==2){pointer-〉china=xchina;

elseif(choose==3){pointer->

english=xenglish;

elseif(choose==4){pointer—>

math=xmath;

if(head!

=NULL)

{printf("

Preeanykeytosave!

getch();

returnhead;

(6)删除学生信息函数

删除函数delete_chengji在编写之前先定义2个结构体pointer和q,key2为要删除学生的学号,定义完成后对pointer赋初值,用j记录pointer的位置,将其设为整形并初始化.

从链表中删去一个节点只要改变链接的关系即可,既修改结点指针成员的值。

从链表中删除一个结点有三种情况:

删除链表的头结点,删除链表的中间结点,删除链表的尾节点。

具体情况如图2。

图2删除算法

当pointer的后面指针不为空:

①如果key2!

=pointer—>

ID,则把pointer的值赋给q,pointer指向下一个记录继续寻找学号key2。

while((pointer-〉next!

=NULL))

{if(pointer-〉ID!

=key2)

{q=pointer;

j++;

pointer=pointer—〉next;

elsebreak;

②如果key2==pointer—〉ID时,判断j是否为0,如果j为0说明pointer为头结点,则直接将结点删除,head指向他的下一指针.

if((pointer-〉ID==key2))

{if(j==0)

{head=head—>

next;

free(pointer);

}}

③如果判断j!

=0,则说明删除的结点不是头指针,结点位于中间,要删除结点pointer首先应该让q->

next指向pointer—>

next,然后释放pointer。

执行完后系统将自动停留几秒然后返回主菜单.

(7)插入学生成绩

插入功能主要用于插入新的学生记录.在insert_chengji函数先定义2个结构体指针pointer和news,pointer为原指针,news为新插入指针。

定义完成后对pointer初始化,然后为news建立新结点news=(link)malloc(sizeof(node)),定义完成后为news输入新数据。

插入的情况有两种既:

①如果pointer为空则直接将news的值赋给head输入系统并做为头指针;

②如果pointer不为空则把news的值赋给pointer,运行如果正确且head不为空时显示输入的数据信息。

具体操作如图3.

图3插入算法

程序:

{news=(link)malloc(sizeof(node));

/*如果head不为空,为news指针建立一个结点*/

gotoxy(3,5);

printf(”pleaseinputstudentID:

news—>

……}

{if(pointer==NULL)

{news—〉next=head;

head=news;

break;

}/*如果pointer为空,news直接为头指针*/

if(pointer-〉ID==key3)

{news—>

next=pointer—>

pointer—>

}/*如果key3等于ID直接插入news*/

pointer=pointer—>

next;

(8)计算各科成绩的平均分函数

计算函数average求各科的平均分。

首先为各科成绩进行初始化操作,如果pointer不为空,说明里面有数据,在对其求各科的总成绩,最后在进行平均分求值.计算完成显示最后计算结果。

具体程序如下:

{achina=achina+pointer->

china;

/*求总分*/

aenglish=aenglish+pointer-〉english;

amath=amath+pointer-〉math;

cnt=++cnt;

if(pointer—>

next==NULL)break;

pointer=pointer-〉next;

}/*求平均分*/

avechina=achina/cnt;

aveenglish=aenglish/cnt;

avemath=amath/cnt;

(9)学生成绩排序

学生成绩排序函数sort用来对学生成绩进行按从大到小的顺序排序。

处理过程:

定义2个临时指针pointer、max,max用来存放pointer的数据,而pointer指向它的下一位。

再定义一个单精度变量fen、整形变量k和字符型变量s[256],分别存放成绩、学号、名字.定义完成后把先对pointer初始化,用count来记录pointer的个数,然后从1开始对max和pointer进行比较.比较一次count加1,在把count的值赋给pointer—〉order。

排序完成后到显示界面查看。

函数排序过程如下:

for(i=1;

i〈count;

{max=pointer=head;

for(j=i+1;

j<

=count;

j++)

{max=pointer—>

if(max-〉sum>

pointer->

sum)/*用总分对成绩进行排名*/

{fen=max->

sum;

max—>

sum=pointer-〉sum;

pointer-〉sum=fen;

/*总分的交换*/

k=max->

ID;

max->

ID=pointer—〉ID;

pointer—〉ID=k;

/*学号的交换*/

fen=max-〉china;

max—〉china=pointer—>

china;

china=fen;

/*语文成绩的交换*/

fen=max—〉math;

math=pointer—>

math;

pointer—〉math=fen;

/*数学成绩的交换*/

fen=max-〉english;

english=pointer—>

english;

english=fen;

/*英语成绩的交换*/

strcpy(s,max—〉name);

strcpy(max-〉name,pointer—〉name);

strcpy(pointer—〉name,s);

}/*姓名的交换*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1