资源描述
学生成绩标准管理系统C语言
/*创建*/
/*显示*/
/*排序*/
/*删除*/
/*查找
/*&new表示返
/*保存*/
/*读取*/
/*如菜单返回值为9
{switch(menu_select())
case l:head=create();break;case 2:print(head);break;
case 3:head=sort(head);break;case 4:head=delete(head);break;
case 5:search(head);break; */case 6:head=insert(head,&new);break; 回地址*/case 7:save(head);break;
case 8:head=load(); break;case 9:exit(0);
则程序结束*//*初始化函数*/
STUDENT *init()(
return NULL;/*返回空指针*//*菜单选择函数*/
menu_select(){int n;
struct date d;/*定义时间结构体*/getdate(&d);/*读取系统日期并把它放到结构体d
中*/printfC**按任意键进入主菜单”);/*按任意键进入主菜
单*/getch();/*从键盘读取一个字符,但不显示于屏幕*/
clrscr();
/*清屏*/
printf(H\n\t\t
学生成绩管理系统\n”);
printf(H\n\t
制作者:潍坊科技学院07级计算机应用(4)
.<2#^1# «2>
** . V V f , •»!•»!•<!•»!• »Tw »!• rjw rli<!• rlw <Tw r]^ »!• rjw »Tw »!• »!• rli <T»»!• rliejw rlw
kJ**7#Ki*kJ*<y>*,,\**X*¥**¥***...****g**.,.*...**.,.*¥**.,.m );
printf(n\t\t
欢迎进入\n”);
班杨坤\n”);prjntf( "************************************* IV! ELl^U * * *
*2>*2**2*\■ ,、输入学生成绩记录\n”);
printf(n\t\t\t2.
显示学生成绩\n”);printf(M\t\t\t3.
排序\n”);
printf(n\t\t\t4.
删除记录\n”);
按姓名查询成绩\n”);插入记录\n”);
退出\n”);
. a*2**1* «1**2**1* *2*
*• V V, V ■ * "<Jw •!*»J» »Jw<J»<Jw.川V ■ , \
/*显示当前系统日期
printf(n\t\t\t\t%d\\%d\\%d\nn„,);*/
do(printf(u\n\t\t\t 请选择项目(1~9):");
scanf(H%dH,&n);}while(n<l||n>9);必如果选择项不在1~9之间
则重输*/return(n);/*返回选择项,主函数根据
该数调用相应的函数*/}
/*输入函数*/STUDENT *create()
(int i,s;STUDENT *head=NULL,*p; /* */
clrscr();for(;;)
(p=(STUDENT *)malloc(LEN); /*开辟一个新的单元*/
if(!p)/*如果指针p为空*/
(printf(H\n内存己满!”);/*输出内存溢出*/return (head);/*返回头指针,下同*/
)printf(”输入学号(按*输入结束);
scanf(n%sM,p->num);if(p->num[O]==,*t) break;/*如果学号首字符为0则
结束输入*/printf(”输入姓名:”);
scanf(M %sH,p->name);printf(n请输入成绩\n”);/*提示开始输入成绩*/
s=();/*计算每个学生的总分,初值为0*/
for(i=0;iv3;i++)/*3 门课程循环 3 次*/(
do(printf(n 成绩 %d:n,i+l);
scanf(H %d,\&p->score[i]);/*确保成绩
/*确保成绩
if(p->score[i]<0 || p->score[i]>100)在0~100之间*/
printf(”请输入0〜100之间的数\n”);}while(p->score[i]<0 || p->score[i]>100);
s=s+p->score[i];/* 累加各门成绩*/p->sum=s;
p->sum=s;
/*将总分保存*/
p->average=(float)s/3;
将s转换成float型,再求平均值*/
p->order=0;
0*/
p->next=head;
输入结点的后继结点*/
head=p;
新的头结点*/
}
return(head);
}
/*显示全部记录函数*/
p->average=(float)s/3;
将s转换成float型,再求平均值*/
p->order=0;
0*/
p->next=head;
输入结点的后继结点*/
head=p;
新的头结点*/
}
return(head);
}
/*显示全部记录函数*/
/*先用强制类型转换
/*未排序前此值为
/*将头结点做为新
/*新输入结点为
void print(STUDENT *head)
{int i=0;/*统计记录条数*/
STUDENT *p;/*移动指针*/
clrscr();
p=head;
p=head;
/*初值为头指针*/
printf("\n********************************** 学 生 成 绩 表
**********************************、!,,)・printf(M
\n”);printf(H|记录号|学号 | 姓名 | 语
文I英语I高数I总分I平均分I排名W);printf(M
");while(p!=NULL)
(i++;
printf(M| %d |%s|%sI %d | %d | %d | %d | %f
I %d ", p->num,p->name,p->score[0],p->score[l],p->score[2],p->sum, p->average,p->order);p=p->next;
)printf(M
•?* •!• •?* •&•*?* *S**!• *?••?* *!• •?**?* *!•*!• •?* % t f X
/*排序函数*/STUDENT *sort(STUDENT *head)
{int i=0;
STUDENT *pl产p2,*t,*temp; temp=head->next;
指的下一个结点作头指针*/
head->next=NULL;
表的头结点*/
while(temp!=NULL)
进行排序*/
(
t=temp; temp=temp->next; pl=head;
头指针开始*/
p2=head;
pl的前驱,初值为头指针*/
/*保存名次*/
/*定义临时指针*/
/*将原表的头指针所
/*第一个结点为新
/*当原表不为空时,
/*取原表的头结点*/
/*原表头结点指针后移*/
/*设定移动指针pl,从
/*设定移动指针p2做为
/*作成绩平均分比较*/p2=pl;/*待排序点值小,则新
表指针后移*/pl=pl->next;
)if(pl==p2)/*pl==p2,说明待排序点值大,
应排在首位*/(
t->next=pl;/*待排序点的后继为p*/head=t;/*新头结点为待排序点*/
}else/*待排序点应插入在中间某个位置p2
和pl之间,如p为空则是尾部*/(
t->next=pl;/*t 的后继是 pl*/p2->next=t;/*p2 的后继是 t*/
})
pl=head;/*已排好序的头指针赋给pl,准备填写名次*/
/*结点序号*/
/*将结点序号赋值给名次*/
/*指针后移*/
/*排序成功*/
i++; pl->order=i; pl=pl->next;)
printf(”排序成功\n”); return (head);)
/*删除记录函数*/STUDENT *delete(STUDENT *head)
(int n=0;STUDENT *pl,*p2;/*pl为查找到要删除的结点指针,
p2为其前驱指针*/char c,s[6];/*s[6]用来存放学号,c用来输入字母*/
clrscr();printf(”请输入要删除的学生的学号:”);
scanf(n%sM,s);pl=p2=head;/*给pl和p2赋初值头指针*/
vvhile(strcmp(pl->num,s) && pl != NULL)/*当记录的学号不是要找的,或指针不为空时*/
{p2=pl;
pl的前驱指针*/
/*将pl指针值赋给p2作为
pl=pl->next;
/*将pl指针指向下一条记
录*/
if(strcmp(pl->num,s)==O)
/*学号找到了*/
f .』/ ,,^2**2**9*I** V ■ , • rjw ej« »jw rjw rj> »Jw rji rj»»|w rjw rj» rjw rjw rjwrjw rjwrjwrjw rjw
信息如下************************************\n”);
printf(M
\n”);printf(”| 学号 | 姓名 |语
文I英语I高数I总分I平均分I排名");
printf(M
");
printf(H|%s|%s| %d
| %d | %d | %d | %f | %d ",
pl->num,pl->name,pl->score[0],pl->score[l],pl->score[2],pl ->sum,pl->average,pl->order);
printf(H\nM);
一、设计目的
进一步加深、巩固学生所学专业课程(《C语言》)的基本 理论知识,理论联系实际,进一步培养学生综合分析问题和解 决问题的能力。掌握运用C语言独立地编写、调试应用程序和 进行其它相关设计的技能,充分发挥广大同学的潜力,使他们 通过本次课程设计而得到全面的锻炼。
二、系统分析
随着科学技术的不断发展,对人们的工作水平要求也越来 越高,然而计算机就成了帮助人们解决这个问题的工具,熟练 的运用计算机,它能为人们解决许多工作上的难题。对与一个 管理人员来说,快而迅速的了解各种信息是很关键的。使用计 算机在C语言环境下编写相关的管理系统就能达到对相关信 息的录入、显示;对记录的查询极其修改等目的。同时,这个 系统与*・*管理系统都有相似之处。基于同样的C语言环境, 对其提供的头文件*h (的不同组合,能为我们解决许许 多多的问题,因此,用它来编写成绩管理管理系统是可行的。
三、成绩管理系统主要功能
1. 输入记录
2. 用指定格式显示全部记录
3. 根据姓名查找记录
4. 根据姓名删除记录printf(
printf(
f fkJ* *{> «£«*$> *{> *2* *!* *£> <t* *{> «£>«£> —2* *1* <£> *1**2* *t* *?>*{> «£> *2** ■ ejw ♦[• riw rj— rj» ♦[•♦[• ej— rj» •;・ rj» ♦[• rjw rlw elw ♦[• erw rjw ♦[• »5w ♦[• rjw rjw ♦[•♦[• ♦卜 <iw rjw ♦[• rjw ♦卜♦;• rlw
**************************************\n”).
printf(”确定要删除吗? Y/N ?”);/*提示是否要删除,
输入Y删除,N则退出*/for(;;)
(scanf(n%c,\&c);if(c==,n,||c==,N,) break;/*如果不删除,则
跳出本循环*/if(c==*yq|c==*Y')
(if(pl==head)/*若 pl==head,说
明被删结点是首结点*/head=pl->next;/*把第二个结点地
址赋予head*/else
p2->next=pl->next;/* 否则将一下结点
地址赋给前一结点地址*/n=n-l;
printf(M\n 学号%s 已删除 \nM,s);printf(”请保存\nM);break;/*删除后就
跳出循环*/else
/*找不到该结点
*/
printf(H\n没有找到该生\nM);
return(head);
)
/*查找记录函数*/
void search(STUDENT *head)
{STUDENT *p;/*移动指针*/
char s[5];/*存放姓名用的字符数组*/
clrscr();
printf(”请输入要查找的姓名\n”);
scanf(H%sn,s);
p=head; /*将头指针赋给p*/ vvhile(strcmp(p->name,s) && p != NULL)/*当记录的姓
名不是要找的,或指针不为空时*/p=p->next;/*移动指针,指向下一结点*/
if(p!=NULL)/*如果指针不为空*/
•&* «£• *T»<T*<T* *Tw ^Jw <T* ^7%<T*<T» <T»#T» <Tw<T» <Tw
«£<**2* *2**3**!* <2* *2* —A *2* ■!*■!* ■?, *2* •!* «£<* *2* *2* •!* *2* »!**2* •!* *£<•*2* ■!* *2*t f \
“f r/ 不不不不不不不不不不不不不不不,F 不不不不不不不,F n*不不不不不不不不不、»*« • ■ I •
printf(H
W);
printf(M| 学号 | 姓名 | 语文| 英语I高数|总分|平均分|排名");
printf(M
\n”);
printf(n|%s|%s| %d
| %d | %d | %d | %f | %d ", p->num,p->name,p->score[0],p->score[l],p->score[2],p->sum, p->average,p->order);
printf(M—-
\n“);
printf(M 5jC ?jc 5jC <jc ?jc ?^C?JC ?JC 5jC ?JC 5jC 5^C 5jC ?JC 结束
率**¥****亭*¥**¥*¥****¥********* 必*);else
printf(n\n没有该学生\n”);
/*显示没有该学
生*/
/*插入记录函数*/STUDENT*insert(STUDENT *head,STUDENT *new)
(STUDENT *p0,*pl,*p2;int n=O,suml,i;
pl=head;/*使pl指向第一个结点*/pO=new;/*pO指向要插入的结点*/
printf(n\n请输入一个新记录\nn);/*提示输入记录信息*/
printf(”输入学号:,scanf(M %sM,new->num);
printf(”输入姓名:”); scanf(M %sM,new->name);printf(H请输入成绩\n”);
suml=O;/*保存新记录的总分,初值为0*/for(i=0;iv3;i++)
(do(
printf(n 成绩 %d:n,i+l);scanf(H %dH,&new->score[i]); if(new->score[i]>100||new->score[i]<0) printf(”请输入0~100之间的数\n”);
}while(new->score[i]>100||new->score[i]<0);suml=suml+new->score[i];/* 累加各门成绩
*/}
ne w->sum=sum 1;/*将总分存入新记录中*/new->average=(float)suml/3;
new->order=0;if(head==NULL)/*原来的链表是空表*/
(head=pO;pO->next=NULL;} /*使 pO 指向的结 点作为头结点*/ else{vvhile((pO->average<pl->average)&&(pl->next!=NULL))
{p2=pl;/*使p2指向刚才pl指向的结点*/pl=pl->next; /*pl 后移一个结点*/
}if(p()->average>=pl->average)
{if(head==pl)head=pO;/* 插到原来第一个结点之前*/
else p2->next=p0;/*插到 p2 指向的结点之后*/
pO->next=pl;}else
(pl->next=pO;pO->next=NULL;} /* 插到最后的结点之后*/
n=n+l; /*结点数加1*/head=sort(head);/*调用排序的函数,将学生成绩重新排
序*/printf(n\n 学生%s 记录已插入\nH,new->name);
printf(n 请保存 \n”);return(head);
}/*保存数据到文件函数*/
void save(STUDENT *head){FILE *fp;
STUDENT *p;
{FILE *fp;
STUDENT *p;
/*定义指向文件的指针*/
/*定义移动指针*/
char outfile[10];
printf(n请输入要保存文件名称例如c:\\score\nH);scanf(H%sM,outfile);
if((fp=fopen(outfile,nwbH))==NULL) /* 为输出打开一个二进制文件,为只写方式*/
(printf(”无法保存到文件!请检查路径是否正确!\n”); return;/*若打不开则返回菜单*/
)printf(M\n 正在保存\n”);
p=head;/*移动指针从头指针开始*/
while(p!=NULL)/*如 p 不为空*/{
fwrite(p,LEN,l,fp);/* 写入一条记录 */p=p->next;/* 指针后移*/
)fclose(fp);/* 关闭文件*/
printf(”保存成功!\iT);}
/*从文件读数据函数*/STUDENT *load()
(STUDENT *pl,*p2,*head=NULL;/*定义记录指针变量*/
FILE*fp;/*定义指向文件的指针*/char infile[10];
printf(n请输入读取文件名称例如c:\\score\nM);scanf(H %sn,infile);
if((fp=fopen(infile,nrbH))==NULL)/* 打开一个二进制文件,为只读方式*/
(printf(”打开失败!请检查路径是否正确!\"); return(head);
}printf(n\n 正在打开!\n”);
pl=(STUDENT *)malloc(LEN);/*开辟一个新单元*/if(!pl)
(printf(”没有存储!\iT);
return(head);head=pl;
head=pl;
/*申请到空间,将其作为头指针*/
while(!feof(fp))
while(!feof(fp))
/*循环读数据直到文件尾结束*/
if(fread(pl,LEN,l,fp)!=l) break; /*如果没读到数 据,跳出循环*/pl->next=(STUDENT *)malloc(LEN); /*为下一个
结点开辟空间*/if(!pl->next)
(printf(”没有存储!");
return (head);}
p2=pl;/*使p2指向刚才pl指向的结点*/pl=pl->next;/*指针后移,新读入数据链到当前表尾*/
}p2->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp);printf(M已成功读取!\n”);
return (head);}
5. 保存记录到文件
6. 按序号显示记录
7. 按姓名由小到大的顺序排序四、系统框图
开始输出界面
选择操作4 Ah
4 Ah;4b
-:/h:止
结束左冬"X
/Ep右泠甘口
皿||咚退出系统
M耳诠挡n
坨时々i±r5Izl+Zn
六、界面设计
此系统界面采用图形和数字化菜单设计。
主界面设计如下:
****9« •£•*!• *f* **•**> *1* •?* ***al>•?*•?*
<T*<T* <T**T* <Tw<T* #7w <T»^T* <7> <T»<T* ^Jw <T» <T^*T* <TW <T»<T» <T*<T*<T»<T* ^JW *T»<J* <T* <Tw <T»#7W <T*<T»<T*欢迎进入
学生成绩管理系统
•MENU
制作者:潍坊科技学院07级计算机应用(4)班 杨坤
•J* •?* *2^ ■,—•?« *1* ■,— •?**1* ■,— *•> •私 ■,— ••**2*
<Jw <T* <g* <T* »i> <zw *T* ^7* <Tw <»w <Tw <7> <1* <7^ <7* <Tw »g* <T* <Jw <T* ^Jw
«9» •[・... •., ♦[・•.• rj» »J» •.•・[・.[• •..,X. ・.・•[・•.. ・丫.•.•
1. 输入学生成绩记录
2. 显示学生成绩
3. 排序
4. 删除记录
5. 按姓名查询成绩
6. 插入记录
7. 保存
8. 读取
9. 退出六、用到的头文件及自定义的函数
1、头文件
#include <>
#include<>
#include<>/* 其它说明*/
#include<>/*字符串函数*/
#include<>/*内存操作函数*/
#include<>/*字符操作函数*/
#include<>/*动态地址分配函数*/
2、
自定义的功能函数
TUDENT*init();/* 初始化函数 */
int menu_select();/*菜单函数*/
STUDENT *create();必创建链表*/
void print(STUDENT *head);/* 显示全部记录
函数*/
void search(STUDENT *head);/*查找记录函数
*/
STUDENT *delete(STUDENT *head);/*删除
记录函数*/
STUDENT *sort(STUDENT *head);/*排序函
数*/
STUDENT *insert(STUDENT*head,STUDENT
*new);
/*插入记录函数*/
void save(STUDENT *head);
/*保存文件函数
STUDENT *load();
/*读文件函数*/
有关函数的具体定义以及用法此处不再啰嗦,参看
F面的程序代码。
#include <>
#include<>#include<>
#include<>
/*其它说明*/
#include<>
/*字符串函数〃
#include<>
/*内存操作函数*/
#include<>
/*字符操作函数*/
#include<>
/*动态地址分配函数*/
#deflne LEN sizeof(STUDENT)typedef struct stu/*定义结构体数组用于缓存数据*/
(char num[6];char name[10];
int score[3];int sum;
float average;int order;
struct stu *next;/*链表*/JSTUDENT;
/*函数原型*/STUDENT *init();/* 初始化函数*/
int menu_select(); /*菜单函数*/STUDENT *create();/*创建链表*/
void print(STUDENT *head); /* 显示全部记录函数*/ void search(STUDENT *head);/*查找记录函数*/STUDENT *delete(STUDENT *head);/*删除记录函数
*/STUDENT *sort(STUDENT *head);/*排序函数*/
STUDENT *insert(STUDENT *head,STUDENT *new);/*插入记录函数*/
void save(STUDENT *head);/*保存文件函数*/STUDENT *load();/*读文件函数*/
/*主函数界面*/void main()
(STUDENT *head,new;head=init();/*链表初始化,使head的值为NULL*/
for(;;)/*循环无限次*/
展开阅读全文