#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
typedef struct student{ /*定义结构体*/
char IDNumber[16];/*学号*/
char FamilyName[16]; /*姓*/
char GivenName[16]; /*名*/
int sex; /*性别(0代表“女”,1代表“男”)*/
int BirthYear; /*出生年*/
int BirthMonth; /*出生月*/
int BirthDay; /*出生日*/
float score[4]; /*成绩*/
float sum; /*总分*/
float average; /*平均分*/
}stu;
typedef struct Lnode
{
student data;
Lnode *next;
}st, *linklist;
/***************************************************************************/ struct tm* ptm;
float Sumstu(linklist L);
float Averstu(linklist L);
float Sumstu(linklist L){ /*计算总分*/
linklist s;
s=L;
int i;
s->data.sum=0;
for(i=0;i<=4;i++)
{
s->data.sum+=s->data.score[i];
}
return (s->data.sum);
}
float Averstu(linklist L){
linklist q;
q=L;
Sumstu(q);
q->data.average=q->data.sum/4;
return (q->data.average);
}
void TimeNow() /*获取系统时间*/
{
struct tm* ptm;
long ts;
int y,m,d,h,n,s;
ts = time(NULL);
ptm = localtime(&ts);
y = ptm-> tm_year+1900; //年
m = ptm-> tm_mon+1; //月
d = ptm-> tm_mday; //日
h = ptm-> tm_hour; //时
n = ptm-> tm_min; //分
s = ptm-> tm_sec; //秒
}
int Menu() /*菜单函数*/
{
int n;
printf("\t\t\t\n\n\n\n欢迎使用学生成绩管理系统\n\n\t\t\t按任意键进入系统!"); system("pause");
system("cls");
printf("**************************************************************************\n");
printf("\n\t\t\t学生成绩管理系统\n\t\t\t\t制作人 陈光林(52101407)\n");
printf("-------------------------------菜单(Menu)---------------------------------\n");
printf("\n\t 1. Enter list 输入记录\n");
printf(" \t 2. Delete a record from list 删除记录\n");
printf(" \t 3. Print list 显示所有记录\n");
printf(" \t 4. Search record on name 按照姓名查找记录\n");
printf(" \t 5. Save the file 保存记录到文件中\n");
printf(" \t 6. Load the file 从文件中读入记录\n");
printf(" \t 7. Compute the score 计算所有学生的总分和均分\n"); printf(" \t 8. Query by class 按班级查询显示学生总分\n");
printf(" \t 9. Insert record to list 插入记录到表中\n");
printf(" \t 0. Quit 退出系统\n");
printf("---------------------------------------------------------------------------\n");
printf("****************************************************************************\n");
do{
printf("\n\t\t\t 请选择你需要的操作(0—9):");
scanf("%d",&n);
}while(n<1||n>5); /*如果选择项不在1—9之间则重输*/
return(n); /*返回选择项*/
}
/***************************************************************************/
linklist initlist(void) /*建立一个空链表*/
{
linklist L=(linklist)malloc(sizeof(st));
L->next=NULL;
return NULL;
}
/*建立学生信息链表*/
st *creastlist(linklist L)
{
int i;
float s;
linklist p;
for(;;)
{
p=(linklist)malloc(sizeof(st)); /*开辟新的节点*/
if(!p)
{
printf("\n Out of memory.");
return (L);
}
printf("请输入学生学号");
scanf("%s",p->data.IDNumber);
if(p->data.IDNumber[0]=='0') break;
printf("请输入姓:");
scanf("%s",p->data.FamilyName);
printf("请输入名:");
scanf("%s",p->data.GivenName);
printf("请输入性别(0女/1男):");
scanf("%d",&p->data.sex);
printf("请输入生日:");
scanf("%d %d %d",&p->data.BirthYear, &p->data.BirthMonth,&p->data.BirthDay); printf("请输入成绩\n",4);
s=0;
for(i=0;i<4;i++)
{
do
{
printf("score%d:",i+1);
scanf("%f",&p->data.score[i]);
if(p->data.score[i]<0 || p->data.score[i]>100)
printf(" Data error,please enter again.\n");
}while(p->data.score[i]<0 || p->data.score[i]>100);
s=s+p->data.score[i];
}
p->data.sum=s;
p->data.average=s/4;
p->next=L;
L=p;
}
return(L);
}
/***********************************************************************************************/
/*
void creastlist(linklist L)
{
st *p;
linklist head=NULL;
p=(linklist)malloc(sizeof(st));
p=L;
for(;;)
{
printf("请输入学生学号:\n");
scanf("%s",p->data.IDNumber);
printf("请依次输入学生姓名:\n");
scanf("%s%s",p->data.FamilyName,p->data.GivenName);
printf("请输入出生年月日:\n");
scanf("%d%d%d",p->data.BirthYear,p->data.BirthMonth,p->data.BirthDay); TimeNow();
if(p->data.BirthYear>=ptm-> tm_year+1900){ printf("错误!学生年龄不能为负值!请重新输入!");continue;}
else if(p->data.BirthMonth>=ptm-> tm_mon+1){printf("错误!学生年龄不能为负值!请重新输入!");continue;}
else if(p->data.BirthDay>=ptm-> tm_mday){printf("错误!学生年龄不能为负值!请重新输入!");continue;}
else{
printf("请输入性别(0代表女,1代表男:\n");
scanf("%d",p->data.sex);
if(p->data.sex!=0||p->data.sex!=1) {printf("错误!学生年龄不能为负值!请重新输入!");continue;}
else{
printf("请分别输入外语、高数、C语言、马哲四门成绩:\n");
scanf("%f%f%f%f",&p->data.score[0],&p->data.score[1],&p->data.score[2],&p->data.score[3]); p->next=head;
head=p;
}
}
}
}
*/
/*输出所有学生的信息*/
void print(linklist head)
{
linklist p;
p=head;
printf("**************************************************************************");
printf("| 学号 | 姓名 |性别|出生年 月 日|外语 C语言 高数 马哲|总分 |平均分|");
printf("--------------------------------------------------------------------------");
Sumstu(p);
Averstu(p);
while(p!=NULL)
{
printf("%s%s%s%d%d%d%f%f%f%f%f%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName,
p->data.sex,p->data.BirthYear,p->data.BirthMonth,p->data.BirthDay,
p->data.score[0],p->data.score[1],p->data.score[2],p->data.score[3],p->data.sum,p->data.average);
printf("\n");
p=p->next;
}
printf("\n");
}
/********************************************************************************************/
void insert(linklist L){ //插入新的结点
linklist s,p=L;
stu e;
s=(linklist)malloc(sizeof(st));
s->data=e; //头插法
s->next=p->next;
p->next=s;
}
/*******************************************************************************************/
void search(linklist L){
int flag=1;
char familyname[16];
linklist p;
printf("请输入要查询的学生姓名:\n");
scanf("%s",familyname);
p=L->next;
while(p!=NULL)
{
if(strcmp(familyname,p->data.FamilyName)==0){
system("cls");
Sumstu(p);
Averstu(p);
printf("**************************************************************************");
printf("| 学号 | 姓名 |性别|出生年 月 日|外语 C语言 高数 马哲|总分 |平均分|");
printf("--------------------------------------------------------------------------");
printf("%s%s%s%d%d%d%f%f%f%f%f%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName,
p->data.sex,p->data.BirthYear,p->data.BirthMonth,p->data.BirthDay,
p->data.score[0],p->data.score[1],p->data.score[2],p->data.score[3],p->data.sum,
p->data.average);
printf("\n");
flag=0;
break;}
else
p=p->next;
}
if(flag)printf("没有该学生信息或输入错误");
Menu();
}
/*******************************************************************************************************/
void Delete(linklist L){
linklist p,q;
char num[16];
int label=1;
printf("请输入要删除的学生学号:\n");
scanf("%s",num);
p=L->next;
q=L;
do
{
if(strcmp(num,p->data.IDNumber)==0)
{
system("cls");
printf("\t发现要删除的学生信息,确认删除吗?\n");
printf("\t\t确认(Y) 取消(N)");
getchar();
if('y'||'Y')
{
q->next=p->next;
delete p;
printf("删除成功!");
label=0;
}
else{
exit(0);}
}
else{
q=q->next;
p=q->next;
}
} while(q->next!=NULL);
if(label)printf("输入错误或者信息不存在!");
}
/*********************************************************************************************************/
void Paixu(linklist L){
linklist p;
float s1=90,s2=80,s3=70,s4=60;
p=L;
int i;
for(i=0;i<=4;i++){
printf("****************************************************");
printf("第%d科90分以上的学生:",i);
if(p->data.score[i]>=s1)
{ printf("%s%s%s%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName, p->data.score[i]);
}
else{
p=p->next;
}
if(s2<=p->data.score[i]<s1)
{ printf("%s%s%s%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName, p->data.score[i]);
}
else{
p=p->next;
}
if(s3<=p->data.score[i]<s2)
{ printf("%s%s%s%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName, p->data.score[i]);
}
else{
p=p->next;
}
if(s4<=p->data.score[i]<s3)
{ printf("%s%s%s%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName, p->data.score[i]);
}
else{
p=p->next;
}
if(p->data.score[i]<s4)
{ printf("%s%s%s%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName, p->data.score[i]);
}
else{
p=p->next;
}
}
}
/******************************************************************************
*********************/
/*void Query(linklist L){ //此处假设学号形式为20101407
linklist p;
p=L;
char classs[2];
float sumclass;
printf("请输入您想查询的班级:\n");
scanf("%s",classs);
do{
sumclass=p->data.score[0]+p->data.score[1]+p->data.score[2]+p->data.score[3] ; printf("%s%f",p->data.IDNumber,p->data.sum);
}while((strcmp(classs[1],p->data.IDNumber[5])==0)&&(strcmp(classs[2],p->data.IDNumber[6])==0));
}
/**************************************************************************************************/
void ComputeProject(linklist L){
linklist p;
float sumall[4],averall[4];
float Su=0,Av=0;
//sumall[4]={0,0,0,0};averall[4]={0,0,0,0};
int i,m=0;
p=L;
for(i=0;i<=4;i++){
for(p=L;p->next!=NULL;p=p->next){
m++;
sumall[i]+=p->data.score[i];
}
averall[i]=sumall[i]/4;
printf("第%d科的平均成绩是:\n",averall[i]);
Su+=averall[i];
}
Av=Su/4;
printf("总的平均成绩是:%f\n",Av);
}
/************************************************************************************************/
void compute(linklist L){
linklist p;
p=L;
Sumstu(p);
Averstu(p);
do{
printf("学号:%s\n",p->data.IDNumber);
printf("总分:%f\n平均分:%f\n",p->data.sum,p->data.average);
p=p->next;
}while(p->next!=NULL);
}
/********************************************************************************************/
void insert(linklist L, stu e){ //插入新的结点
linklist s,p=L;
printf("请输入要插入的学生信息:\n");
scanf("%s%s%s%d%d%d%f%f%f%f%f%f",p->data.IDNumber,p->data.FamilyName,p->data.GivenName,
p->data.sex,p->data.BirthYear,p->data.BirthMonth,p->data.BirthDay,
p->data.score[0],p->data.score[1],p->data.score[2],p->data.score[3],p->data.sum,
p->data.average);
s=(linklist)malloc(sizeof(st));
s->data=e; //头插法
s->next=p->next;
p->next=s;
}
/*******************************************************************************************/
void save(linklist L)
{
FILE *fp;
linklist p; /* 定义移动指针*/
char outfile[20];
scanf("%s",outfile);
if((fp=fopen(outfile,"w"))==NULL) /*为输出打开一个二进制文件,为只写方式*/ {
printf("Cannot open the file\n");
return; /*若打不开则返回菜单*/
}
p=L; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(st),1,fp); /*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("Save the file successfully!\n");
}
/* 从文件读数据函数*/
st *Load(linklist L)
{
linklist p1,p2,head=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[20];
scanf("%s",infile);
if((fp=fopen(infile,"r"))==NULL) /*打开一个二进制文件,为只读方式*/
{
printf("Can not open the file.\n");
return(head);
}
printf("\nLoading the file!\n");
p1=(linklist)malloc(sizeof(st)); /*开辟一个新单元*/
if(!p1)
{
printf("Out of memory!\n");
return(head);
}
head=p1;
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(fread(p1,sizeof(st),1,fp)!=1) break; /*如果没读到数据,跳出循环*/
p1->next=(linklist)malloc(sizeof(st)); /*为下一个结点开辟空间*/
if(!p1->next)
{
printf("Out of memory!\n");
return (head);
}
p2=p1; /*使p2指向刚才p1指向的结点*/
p1=p1->next; /*指针后移,新读入数据链到当前表尾*/
}
p2->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp);
printf("\nYou have success to read data from the file!\n");
return (L);
}
/********************************************************************************************/
/*********************************************************************************************/
void main()
{
linklist head=initlist();
for(;;){
switch(Menu()){
case 1 :creastlist(head);
case 2 :Delete(head);
}
}
}
case 3 :print(head); case 4 :search(head); case 5 :save(head); //case 6 :load(head); case 7 :compute(head); //case 8 : Query(head); case 9 :insert(head); case 0 :exit(0);