您的位置:首页 > 其它

学生成绩管理系统

2015-05-15 14:21 225 查看
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N sizeof(struct st)
#define M 100
#define FORMAT "%s   %s   %d   %d   %d\n",snum,name,math,english,physics

struct st{
char snum[11];
char name[11];
int math;
int english;
int physics;
struct st *next;
};
struct st *head;                        //头指针
char filename[11];                      //文件名
void creat_user(void);                  //创建账户
void entry(void);                       //登录账户
void input_txt(struct st *head);        //存储进文件
void insert_im(struct st *head);        //按学号顺序插入信息
struct st *creat(void);                 //创建链表
void inquiry(struct st *head);          //按学号查询函数
void inquiry_by_name(struct st *head);  //按姓名查询函数
void delete1(struct st *head);          //按学号删除链表结点
void display(struct st *head);          //打印函数
int num(struct st *head);               //学生的个数
void _sort(struct st *head);            //排序并输入存储于新文件
void revise_by_snum(struct st *head);   //根据学号修改学生成绩
void revise_by_name(struct st *head);   //根据姓名修改学生成绩
void display_by_sort(struct st *head);  //按平均成绩打印学生信息
void census_of_math(struct st *head);   //统计数学成绩大于多少分学生的信息
void census_of_english(struct st *head);//统计英语成绩大于多少分学生的信息
void census_of_physics(struct st *head);//统计物理成绩大于多少分学生的信息
void rate(struct st *head);             //各科成绩及格的比率
void free_of_link(struct st *head);     //清除链表
void read_file(void);                   //读取文件信息
void about_this_software(void);         //关于此软件的信息
void interface1(void);                  //界面1
void quit(void);                        //退出
void interface2(void);                  //界面2
void interface3(void);                  //界面3
void interface4(void);                  //界面4

/*
*界面函数
*/
#include "1.c"
#include "3.c"
void interface1(void)                  //界面1
{
while(1){
int x;
printf("\n****************************************\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("10、存储进文件                         *\n");
printf("11、按学号删除链表结点                 *\n");
printf("12、按平均成绩打印学生信息             *\n");
printf("13、读取我的文件信息                   *\n");
printf("14、关于此软件                         *\n");
printf("15、退出程序                           *\n");
printf("****************************************\n");
printf("PS:要使用2—12功能必须先创建链表\n");
printf("请根据菜单选择您要使用的功能:");
scanf("%d",&x);
while(1)
{
if(x<1||x>15)
{
printf("输入有误,请重新输入:");
scanf("%d",&x);
}
if(x>=1&&x<=15)
break;
}
switch(x)
{
case 1:head=creat();break;
case 2:display(head);break;
case 3:interface2();break;
case 4:_sort(head);break;
case 5:interface3();break;
case 6:interface4();break;
case 7:rate(head);break;
case 8:free_of_link(head);break;
case 9:insert_im(head);break;
case 10:input_txt(head);break;
case 11:delete1(head);break;
case 12:display_by_sort(head);break;
case 13:read_file();break;
case 14:about_this_software();break;
case 15:quit();break;
}
}
}

void interface2(void)
{
int x;
printf("****************************************\n");
printf("1、按学号查询学生成绩                  *\n");
printf("2、按姓名查询学生成绩                  *\n");
printf("3、返回主菜单                          *\n");
printf("****************************************\n");
printf("请根据子菜单选择您要使用的功能:");
scanf("%d",&x);
while(1)
{
if(x<1||x>3)
{

printf("输入有误,请重新输入:");
scanf("%d",&x);
}
if(x==1||x==2||x==3)
break;
}
switch(x)
{
case 1:inquiry(head);interface2();break;
case 2:inquiry_by_name(head);interface2();break;
case 3:interface1();break;
}
}

void interface3(void)
{
int x;
printf("****************************************\n");
printf("1、根据学号修改学生成绩                *\n");
printf("2、根据姓名修改学生成绩                *\n");
printf("3、返回主菜单                          *\n");
printf("****************************************\n");
printf("请根据子菜单选择您要使用的功能:");
scanf("%d",&x);
while(1)
{
if(x>3||x<1)
{
printf("输入有误,请重新输入:");
scanf("%d",&x);
}
if(x>=1&&x<=3)
break;
}
switch(x)
{
case 1:revise_by_snum(head);interface3();break;
case 2:revise_by_name(head);interface3();break;
case 3:interface1();break;
}
}

void interface4(void)
{
int x;
printf("*******************************************\n");
printf("1、统计数学成绩大于60分的人数比           *\n");
printf("2、统计英语成绩大于60分的人数比           *\n");
printf("3、统计物理成绩大于60分的人数比           *\n");
printf("4、返回主菜单                             *\n");
printf("*******************************************\n");
printf("请根据子菜单选择您要使用的功能:");
scanf("%d",&x);
while(1)
{
if(x>4||x<1)
{
printf("输入有误,请重新输入:");
scanf("%d",&x);
}
if(x<=4&&x>=1)
break;
}
switch(x)
{
case 1:census_of_math(head);interface4();break;
case 2:census_of_english(head);interface4();break;
case 3:census_of_physics(head);interface4();break;
case 4:interface1();break;
}

}

/*
*各种函数
*/
#include "4.c"
void quit()
{
exit(1);
}

void about_this_software(void)
{
printf("*****************************\n");
printf("名称:学生成绩管理系统      *\n");
printf("制作人:WT                  *\n");
printf("制作日期:2015年3月25日     *\n");
printf("*****************************\n");
getchar();
}

void creat_user(void)    //创建账户
{
int i=0,j;
FILE *fp;
char user[20],password[20],unpassword[20],ch;
fp=fopen("e:\\user.txt","a+");
printf("请输入用户名(用户名必须是7位):");
scanf("%s",user);
while(1)
{
if(strlen(user)>7)
{
fflush(stdin);
printf("输入有误,请重新输入:");
scanf("%s",user);
}
if(strlen(user)<=7)
break;
}
fputs(user,fp);
fputc('\n',fp);
fflush(stdin);
printf("请输入密码(密码必须是7位):");
ch=getch();
while ( (ch & 0xff) != 13)  //输入字符ch不为Carriage Return
{
if ( (ch & 0xff) == 8)  //输入字符ch为Back Space
{
printf("%c %c",ch,ch);
i--;
}
else
{
printf("*");
password[i] = ch;
i++;
}

ch = getch(); //继续输入字符ch
}
password[i]='\0';
i=0;
while(1)
{
if(strlen(password)>7)
{
fflush(stdin);
printf("\n输入有误,请重新输入:");
ch=getch();
while ( (ch & 0xff) != 13)
{
if ( (ch & 0xff) == 8)
{
printf("%c %c",ch,ch);
i--;
}
else
{
printf("*");;
password[i] = ch;
i++;
}
ch=getch(); //继续输入字符ch
}
password[i]='\0';
getch();
if(strlen(password)<=7)
break;
}
if(strlen(password)<=7)
break;
}
for(i=0;i<7;i++)
unpassword[i]=password[i];
for(i=0;i<7;i++)                //加密
password[i]=unpassword[6-i];
password[7]=0;
fputs(password,fp);
fputc('\n',fp);
fclose(fp);
printf("\n创建账户成功\n");
}

void entry(void)            //登录账户
{
FILE *fp;
int n=0,i=0,j;
char user[20],password[20],temp[20],unpassword[20],ch;
fp=fopen("e:\\user.txt","r");
printf("请输入用户名(用户名必须是7位):");
fflush(stdin);
scanf("%s",user);
while(1)
{
if(strlen(user)>7)
{
fflush(stdin);
printf("\n输入有误,请重新输入:");
scanf("%s",user);
}
if(strlen(user)<=7)
{
rewind(fp);
while(fgets(temp,8,fp)!=NULL)
{
if(strcmp(user,temp)==0)
{
i=1;
break;
}
fgetc(fp);

}
if(i==0)
{
printf("账号不存在,请重新输入:");
scanf("%s",user);
while(1)
{
if(strlen(user)>7)
{
fflush(stdin);
printf("\n输入有误,请重新输入:");
scanf("%s",user);
}
if(strlen(user)<=7)
break;
}
}
}
if(i==1)
break;
}

while(1)
{
if(strcmp(temp,user)==0)
{
fgetc(fp);
fflush(stdin);
printf("\n请输入密码(密码必须是7位):");
i=0;
ch=getch();
while ( (ch & 0xff) != 13)  //输入字符ch不为Carriage Return
{
if ( (ch & 0xff) == 8)  //输入字符ch为Back Space
{
printf("%c %c",ch,ch);
i--;
}
else
{
printf("*");;
password[i] = ch;
i++;
}
ch = getch(); //继续输入字符ch
}
password[i]='\0';
//     getchar();
i=0;
if(strlen(password)>7)
{
// printf("\n");
printf("\n密码有误,请重新输入:");
ch=getch();
while ( (ch & 0xff) != 13)  //输入字符ch不为Carriage Return
{
if ( (ch & 0xff) == 8)  //输入字符ch为Back Space
{
printf("%c %c",ch,ch);
i--;
}
else
{
printf("*");;
password[i] = ch;
i++;
}

ch = getch(); //继续输入字符ch
}
password[i]='\0';
}
//  getchar();
if(strlen(password)>7)
n++;
if(n>4)
{
printf("密码输入错误很多次,程序自动结束");
exit(1);
}
}
for(i=0;i<7;i++)
unpassword[i]=password[i];
for(i=0;i<7;i++)                      //解密
password[i]=unpassword[6-i];
password[7]=0;
if(strcmp(password,fgets(temp,8,fp))==0)
interface1();
}         //while
}

void read_file(void)
{
char array1[100];
char snum[11];
char name[11];
int math;
int english;
int physics;
FILE *fp;
fp=fopen(filename,"r");
if(fp==NULL)
{
printf("文件打开失败");
getchar();
exit(1);
}
fgets(array1,100,fp);
printf("%s",array1);
while(1)
{

fscanf(fp,"%s    %s   %d   %d   %d",snum,name,&math,&english,&physics);
fgetc(fp);
if(feof(fp)!=0)
break;
printf(FORMAT);
}
}

struct st *creat(void)       //创建链表
{
int i=1,n;
struct st *p1,*p2;
printf("请输入学生的人数:");
scanf("%d",&n);
p1=head=(struct st *)malloc(N);
printf("请按次序输入学生的学号,姓名,数学成绩,英语成绩,物理成绩(用空格隔开):");
p2=(struct st *)malloc(N);
scanf("%s%s%d%d%d",p2->snum,p2->name,&p2->math,&p2->english,&p2->physics);
while(i<n)
{
p1->next=p2;
p1=p2;
p2=(struct st *)malloc(N);
printf("请按次序输入学生的学号,姓名,数学成绩,英语成绩,物理成绩(用空格隔开):");
scanf("%s%s%d%d%d",p2->snum,p2->name,&p2->math,&p2->english,&p2->physics);
i++; //人数变化量
}
p1->next=p2;
p2->next=NULL;
printf("创建链表成功\n");
getchar();
getchar();
return head;
}

void input_txt(struct st *head)   //创建存储文件并将学生成绩输入存储
{
FILE *fp;
struct st *p;
getchar();
printf("请输入文件路径及文件名:");
scanf("%[^\n]",filename);
fp=fopen(filename,"w");
if(fp==NULL)
{
printf("文件创建失败");
getchar();
exit(1);
}
p=head->next;
fputs("学号 姓名 数学 英语 物理\n",fp);
while(p!=NULL)
{
fprintf(fp,"%s    %s   %d   %d   %d\n",p->snum,p->name,p->math,p->english,p->physics);
p=p->next;
}
printf("存储成功\n");
fclose(fp);
getchar();
}

void inquiry(struct st *head)    //按学号查询函数
{
struct st *p;
char no[11];
int i=0;
fflush(stdin);
printf("请输入学号:");
scanf("%[^\n]",no);
p=head->next;
while(p!=NULL)
{
if(strcmp(no,p->snum)==0)
{
i=1;
printf("学号:%s  姓名:%s  数学:%d  英语:%d  物理:%d\n",p->snum,p->name,p->math,p->english,p->physics);
}
p=p->next;
}
if(i==0)
printf("未查询到此学号\n");
getchar();
}

void inquiry_by_name(struct st *head)    //按照姓名查询成绩
{
struct st *p;
char name[11];
int i=0;
fflush(stdin);
printf("请输入姓名:");
scanf("%[^\n]",name);
p=head->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
i=1;
printf("学号:%s  姓名:%s  数学:%d  英语:%d  物理:%d\n",p->snum,p->name,p->math,p->english,p->physics);
}
p=p->next;
}
if(i==0)
printf("未查询到此姓名\n");
getchar();
}

void delete1(struct st *head)  //删除
{
struct st *p,*p2=head;
int i=0;
char snum[11];
printf("请输入要删除的学生成绩的学号:");
scanf("%s",snum);
p=head->next;
while(p!=NULL)
{
if(strcmp(snum,p->snum)==0)
{
i=1;
p2->next=p->next;
free(p);
return;
}
p2=p;
p=p->next;
}
if(i==0)
printf("出错,输入的学号有误\n");
getchar();
}

void display(struct st *head)       //打印函数
{
struct st *p=head;
while(p->next!=NULL)
{
p=p->next;
printf("学号:%s 姓名:%s 数学:%d 英语:%d 物理:%d\n",p->snum,p->name,p->math,p->english,p->physics);
}
getchar();
getchar();
}

int num(struct st *head)  //学生的个数
{
struct st *p=head;
int i=0;
p=p->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}

void _sort(struct st *head)    //排序并输入存储于新文件
{
FILE *fp;
struct st s[M],temp,*p=head;
int i=0,j,n=num(head);
double  ave[M],t;
char filename1[11];
p=p->next;
while(p!=NULL)
{
strcpy(s[i].snum,p->snum);
strcpy(s[i].name,p->name);
s[i].math=p->math;
s[i].english=p->english;
s[i].physics=p->physics;
i++;
p=p->next;
}
for(i=0;i<n;i++)
ave[i]=(s[i].math+s[i].english+s[i].physics)/3.0;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(ave[j]<ave[j+1])
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
t=ave[j];
ave[j]=ave[j+1];
ave[j+1]=t;
}
printf("请输入要存储的文件名:");
getchar();
scanf("%[^\n]",filename1);
fp=fopen(filename,"w");
if(fp==NULL)
{
printf("文件未创建成功");
getchar();
exit(1);
}
fputs("学号 姓名 数学 英语 物理\n",fp);
for(i=0;i<n;i++)
fprintf(fp,"%s    %s   %d   %d   %d\n",s[i].snum,s[i].name,s[i].math,s[i].english,s[i].physics);
printf("存储成功\n");
getchar();
}

void revise_by_snum(struct st *head)    //根据学号修改学生成绩
{
struct st *p=head;
char no[11];
fflush(stdin);
printf("请输入要修改成绩学生的学号:");
scanf("%[^\n]",no);
p=p->next;
while(p!=NULL)
{
if(strcmp(no,p->snum)==0)
{
fflush(stdin);
printf("是否修改此学生的数学成绩(y/n):");
if(getchar()=='y')
{
printf("请输入数学成绩:");
scanf("%d",&p->math);
printf("%d",p->math);
printf("修改成功\n");
}
printf("是否修改此学生的英语成绩(y/n):");
fflush(stdin);
if(getchar()=='y')
{
printf("请输入英语成绩:");
scanf("%d",&p->english);
printf("修改成功\n");
}
printf("是否修改此学生的物理成绩(y/n):");
fflush(stdin);
if(getchar()=='y')
{
printf("请输入物理成绩:");
scanf("%d",&p->physics);
printf("修改成功\n");
}
}
p=p->next;
}
getchar();
}

void revise_by_name(struct st *head)    //根据学号修改学生成绩
{
struct st *p=head;
char name[11];
fflush(stdin);
printf("请输入要修改成绩学生的姓名:");
scanf("%[^\n]",name);
p=p->next;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("是否修改此学生的数学成绩(y/n):");
if(getchar()=='y')
{
printf("请输入数学成绩:");
scanf("%d",&p->math);
printf("修改成功\n");
}
printf("是否修改此学生的英语成绩(y/n):");
fflush(stdin);
if(getchar()=='y')
{
printf("请输入英语成绩:");
scanf("%d",&p->english);
printf("修改成功\n");
}
printf("是否修改此学生的物理成绩(y/n):");
fflush(stdin);
if(getchar()=='y')
{
printf("请输入物理成绩:");
scanf("%d",&p->physics);
printf("修改成功\n");
}
}
p=p->next;
}
getchar();
}

void display_by_sort(struct st *head)
{
struct st s[M],temp,*p=head;
int i=0,j,n=num(head),k;
double ave[M],t;
p=p->next;
while(p!=NULL)
{
strcpy(s[i].snum,p->snum);
strcpy(s[i].name,p->name);
s[i].math=p->math;
s[i].english=p->english;
s[i].physics=p->physics;
i++;
p=p->next;
}
for(i=0;i<n;i++)
ave[i]=(s[i].math+s[i].english+s[i].physics)/3.0;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(ave[j]<ave[j+1])
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
t=ave[j];
ave[j]=ave[j+1];
ave[j+1]=t;
}
printf("要查询第几名学生的成绩:");
scanf("%d",&k);
printf("学号:%s  姓名:%s  数学:%d  英语:%d  物理:%d\n",s[k-1].snum,s[k-1].name,s[k-1].math,s[k-1].english,s[k-1].physics);
getchar();
}

void census_of_math(struct st *head)  //统计数学成绩大于多少分学生的信息
{
struct st *p=head;
int  score;
p=p->next;
printf("请输入统计学生数学成绩的最低分数:");
scanf("%d",&score);
while(p!=NULL)
{
if(p->math>=score)
printf("数学成绩:%d\n",p->math);
p=p->next;
}
getchar();
}

void census_of_english(struct st *head)  //统计英语成绩大于多少分学生的信息
{
struct st *p=head;
int score;
p=p->next;
printf("请输入统计学生英语成绩的最低分数:");
scanf("%d",&score);
while(p!=NULL)
{
if(p->english>=score)
printf("英语成绩:%d\n",p->english);
p=p->next;
}
getchar();
}

void census_of_physics(struct st *head)  //统计物理成绩大于多少分学生的信息
{
struct st *p=head;
int score;
p=p->next;
printf("请输入统计学生物理成绩的最低分数:");
scanf("%d",&score);
while(p!=NULL)
{
if(p->physics>=score)
printf("物理成绩:%d\n",p->physics);
p=p->next;
}
getchar();
}

void rate(struct st *head)   //各科成绩及格的比率
{
struct st *p=head;
int i=0,rate_of_math=0,rate_of_english=0,rate_of_physics=0,rate_of_ave=0,n=num(head);
double ave;
p=p->next;
while(p!=NULL)
{
if((ave=(p->math+p->english+p->physics)/3.0)>=60.0)
rate_of_ave++;
if(p->english>=60)
rate_of_english++;
if(p->physics>=60)
rate_of_physics++;
p=p->next;
}
printf("平均分大于60的人数占%%%f\n数学成绩大于60的人数占%%%f\n英语成绩大于60的人数占%%%f\n物理成绩大于60的人数占%%%f\n",rate_of_ave*1.0/n,rate_of_math*1.0/n,rate_of_english*1.0/n,rate_of_physics*1.0/n);
getchar();
}

void free_of_link(struct st *head)
{
struct st *p,*p2=head;
p=head->next;
while(p!=NULL)
{
p=p2->next;
free(p2);
p2=p;
}
printf("清除链表成功\n");
getchar();
}

void insert_im(struct st *head)      //按学号顺序插入信息
{
struct st *p=(struct st *)malloc(N),*p2=head;
printf("请按次序输入学生的学号,姓名,数学成绩,英语成绩,物理成绩(用空格隔开):");
scanf("%s%s%d%d%d",p->snum,p->name,&p->math,&p->english,&p->physics);
while(p2->next!=NULL&&strcmp(p2->next->snum,p->snum)<0)
p2=p2->next;
p->next=p2->next;
p2->next=p;
printf("插入成功\n");
getchar();
getchar();
}

//#include "4.c"  //界面
#include "5.c"  //函数

int main()
{
//   system("color A");
creat_user();
entry();
return 0;
}


这也是自己写的一个小项目吧,因为自己写了makefile,可能文件包含有点看不懂,各位看官就将就着看吧,如有错误不足还请指出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: