标签:
#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,可能文件包含有点看不懂,各位看官就将就着看吧
标签:
原文地址:http://www.cnblogs.com/s742780906/p/4505866.html