/*学生成绩管理系统V3.0(链表版)
某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。使用链表编程成实现如下菜单驱动的学生成绩管理系统。
1.从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。
2.增量式手动录入每个学生的学号(8位数字)、姓名和各科考试成绩。不考虑中文姓名,不考虑重名情况下的处理,学生的学号是唯一的。
3.计算每门课程的总分和平均分;
4.计算每个学生的总分和平均分;
5.按每个学生的总分由高到低排出名次表;
6.按每个学生的总分由低到高排出名次表;
7.按学号由小到大排出成绩表;
8.按姓名的字典顺序排出成绩表;
9.按学号查询学生排名及其考试成绩;
10.按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。
11.按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。
12.输出每个学生的学号、姓名、各科考试成绩、总分和平均分;
13.将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;
要求程序运行后先显示如下菜单,并提示用户输入选项(菜单式循环显示,直到选择0.exit 整个程序退出):*/
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include "StudentLogin.h"
#include "StudentRegister.h"
/*************************************************************
*************************声明函数*****************************
**************************************************************/
void Help(); //帮助
void Regard(); //关于
int main(); //主函数
void Login(); //总登录页面
int RegisterS(int ); //学生注册
void RegisterA(); //管理员注册
void LoginA(); //管理员登录
void LoginS(); //学生登录
void Register(); //总注册页面
void Set();
void L1();
void L2();
void L3();
void L4();
void L5();
void L6();
void L7();
void L8();
void L9();
/*******************全局变量************************/
int Sn=0; //第Sn个注册的学生
void Set(){
int choice;
system("cls");
printf("\t\t┏━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 学生成绩管理系统V3.0(管理) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 1.每门课程总分与平均分 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 2.学生总分排名(高->低) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 3.学生总分排名(低->高) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 4.学生学号排名 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 5.学生姓名排名(字典) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 6.查询学生信息(学号) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 7.查询学生信息(姓名) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 8.成绩类别分析 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 9.全部学生信息 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 0.返回上一级 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━┛\n");
scanf("%d",&choice);
switch(choice){
case 1: L1(); break;
case 2: L2(); break;
case 3: L3(); break;
case 4: L4(); break;
case 5: L5(); break;
case 6: L6(); break;
case 7: L7(); break;
case 8: L8(); break;
case 9: L9(); break;
case 0: Login(); break;
default: printf("输入错误,请重新输入!\n"); system("pause"); Login(); break;
}
system("pause");
Set();
}
void Login() //总登录页面
{
int choice;
system("cls");
printf("\t\t┏━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 学生成绩管理系统V3.0(登录) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 请选择: ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 1.管理学生信息 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 2.录入新的学生信息 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 0.返回上一级 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━┛\n");
scanf("%d",&choice);
switch(choice){
case 1: Set(); break;
case 2: Register(); break;
case 0: main(); break;
default: printf("输入错误,请重新输入!\n"); system("pause"); Login(); break;
}
}
void Register() //总注册页面
{
int i;
system("cls");
RegisterS(Sn);printf("\n恭喜,录入成功!\n"); system("pause");
}
int main()
{
int choice; //选择操作
do{
system("cls");
printf("\t\t┏━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t┃ 学生成绩管理系统V3.0(链表版) ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 1.登录管理系统 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 2.帮助 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 3.关于 ┃\n");
printf("\t\t┃ ┃\n");
printf("\t\t┃ 0.退出系统 ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━┛\n");
printf("请输入您的选择:\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
Login();
break;
case 2:
Help();
break;
case 3:
Regard();
break;
case 0:
printf("信息保存中");
for(int i=0;i<6;i++)
{
printf(".");
Sleep(1000);
}
exit(0);
break;
default:
printf("输入错误,请重新输入!\n");
system("pause");
break;
}
}while(choice>0);
return 0;
}
void Help() //帮助
{
system("cls");
printf("首页->帮助\n\n");
printf(" 本系统操作简单,功能强大,但是任何试图输入不规范格式的行为可能会带来意想不到的后果,\n");
printf("为了您自身的的信息安全,请不要随意操作!\n");
printf("\n\n请按任意键继续!\n");
system("pause");
}
void Regard() //关于
{
system("cls");
printf("首页->关于\n\n");
printf(" 本系统由制作者呕心泣血通宵达旦写成,请尊重我们的劳动成果,严禁盗版,翻录必究!\n");
printf("\n\n请按任意键继续!\n");
system("pause");
}
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct students)
#ifndef STUDENT
#define STUDENT
struct students{
int Number;
char Name[10];
char Sex[5];
int Age;
float Chinese;
float math;
float English;
float Sum;
float Average;
struct students *Next;
}z[30];
struct students *p1,*p2,*head,*p;
FILE *fp;
#endif
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include"STUDENT.h"
struct students *qq,*q,*headq;
void L9(){
system("cls");
qq=q=(struct students*)malloc(LEN);
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)) {
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
}
fclose(fp);
}
void L1(){
float c=0.0,m=0.0,e=0.0,s=0.0;
int k=0;
system("cls");
qq=(struct students*)malloc(LEN);
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("\t\t语文成绩\t数学成绩\t英语成绩\n");
while(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)) { // printf("%s\t%s\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
c+=qq->Chinese;m+=qq->math;e+=qq->English;s+=qq->Sum;
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
printf("总分:\t\t%.2f\t\t%.2f\t\t%.2f\t\t\n",c,m,e);
printf("平均分:\t%.2f\t\t%.2f\t\t%.2f\t\t\n",c/k,m/k,e/k);
fclose(fp);
}
void L2(){
system("cls");
float t,max[30];
int i,k=0,j;
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
max[k]=qq->Sum;
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(max[i]<max[j])
{
t=max[i];
max[i]=max[j];
max[j]=t;
}
for(i=0;i<k;i++){
qq=headq;
for(j=0;j<k;j++)
if(qq->Sum==max[i]){
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
break;
}
else qq=qq->Next;
}
}
void L3(){
system("cls");
float t,max[30];
int i,k=0,j;
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
max[k]=qq->Sum;
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(max[i]>max[j])
{
t=max[i];
max[i]=max[j];
max[j]=t;
}
for(i=0;i<k;i++){
qq=headq;
for(j=0;j<k;j++)
if(qq->Sum==max[i]){
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
break;
}
else qq=qq->Next;
}
}
void L4(){
system("cls");
int t,max[30];
int i,k=0,j;
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
max[k]=qq->Number;
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(max[i]>max[j])
{
t=max[i];
max[i]=max[j];
max[j]=t;
}
for(i=0;i<k;i++){
qq=headq;
for(j=0;j<k;j++)
if(qq->Number==max[i]){
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
break;
}
else qq=qq->Next;
}
}
void L5(){
system("cls");
char max[30][10],t[10];
int i,k=0,j;
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
strcpy(max[k],qq->Name);
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(strcmp(max[i],max[j])==1)
{
strcpy(t,max[i]);
strcpy(max[i],max[j]);
strcpy(max[j],t);
}
for(i=0;i<k;i++){
qq=headq;
for(j=0;j<k;j++)
if(strcmp(qq->Name,max[i])==0){
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
break;
}
else qq=qq->Next;
}
}
void L6(){
system("cls");
int a,t=0,i,k=0;
printf("请输入您想搜索的学生学号:\n");
scanf("%d",&a);
system("cls");
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
qq=headq;
for(i=0;i<k;i++){
if(a==qq->Number){
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
t=1;
break;
}
else qq=qq->Next;
}
if(t!=1)printf("没有该生信息!\n");
}
void L7(){
system("cls");
char a[10];
int k=0,t,i;
printf("请输入您想搜索的学生姓名:\n");
scanf("%s",a);
system("cls");
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
printf("学号\t\t姓名\t\t性别\t年龄\t语文成绩\t数学成绩\t英语成绩\t总分\t\t平均分\n");
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
qq=headq;
for(i=0;i<k;i++){
if(strcmp(a,qq->Name)==0){
printf("%d\t%s\t\t%s\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",qq->Number,qq->Name,qq->Sex,qq->Age,qq->Chinese,qq->math,qq->English,qq->Sum,qq->Average);
t=1;
break;
}
else qq=qq->Next;
}
if(t!=1)printf("没有该生信息!\n");
}
void L8(){
system("cls");
int c[5],m[5],e[5],s[5];
int i,k=0;
for(i=0;i<5;i++){
c[i]=0;
e[i]=0;
m[i]=0;
}
system("cls");
qq=(struct students*)malloc(LEN);
headq=qq;
if((fp=fopen("student.txt","r"))==NULL){
printf("打开文件失败!按任意键退出!\n");system("pause");exit(0);
}
while(1) {
if(EOF!=fscanf(fp,"%d\t%s\t%s\t%d\t%f\t%f\t%f\t%f\t%f\n",&qq->Number,qq->Name,qq->Sex,&qq->Age,&qq->Chinese,&qq->math,&qq->English,&qq->Sum,&qq->Average)){
if(qq->Chinese>=90)c[0]++;
else if(qq->Chinese>=80)c[1]++;
else if(qq->Chinese>=70)c[2]++;
else if(qq->Chinese>=60)c[3]++;
else if(qq->Chinese<60)c[4]++;
if(qq->math>=90)m[0]++;
else if(qq->math>=80)m[1]++;
else if(qq->math>=70)m[2]++;
else if(qq->math>=60)m[3]++;
else if(qq->math<60)m[4]++;
if(qq->English>=90)e[0]++;
else if(qq->English>=80)e[1]++;
else if(qq->English>=70)e[2]++;
else if(qq->English>=60)e[3]++;
else if(qq->English<60)e[4]++;
q=(struct students*)malloc(LEN);
qq->Next=q;
qq=q;
k++;
}
else{
qq->Next=NULL;
break;
}
}
fclose(fp);
printf("\t\t语文成绩\t数学成绩\t英语成绩\n");
printf("优秀人数\t%d\t\t%d\t\t%d\n",c[0],m[0],e[0]);
printf("优秀率\t\t%.2f\t\t%.2f\t\t%.2f\n",c[0]/1.0/k,m[0]/1.0/k,e[0]/1.0/k);
printf("良好人数\t%d\t\t%d\t\t%d\n",c[1],m[1],e[1]);
printf("良好率\t\t%.2f\t\t%.2f\t\t%.2f\n",c[1]/1.0/k,m[1]/1.0/k,e[1]/1.0/k);
printf("中等人数\t%d\t\t%d\t\t%d\n",c[2],m[2],e[2]);
printf("中等率\t\t%.2f\t\t%.2f\t\t%.2f\n",c[2]/1.0/k,m[2]/1.0/k,e[2]/1.0/k);
printf("及格人数\t%d\t\t%d\t\t%d\n",c[3],m[3],e[3]);
printf("及格率\t\t%.2f\t\t%.2f\t\t%.2f\n",c[3]/1.0/k,m[3]/1.0/k,e[3]/1.0/k);
printf("挂科人数\t%d\t\t%d\t\t%d\n",c[4],m[4],e[4]);
printf("挂科率\t\t%.2f\t\t%.2f\t\t%.2f\n",c[4]/1.0/k,m[4]/1.0/k,e[4]/1.0/k);
}
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include"STUDENT.h"
#define LEN sizeof(struct students)
int RegisterS(int k)
{
if(k==0)
{
p2=p1=(struct students*)malloc(LEN);
head=p1;
printf("请输入学号:\n");
scanf("%d",&p2->Number);
printf("请输入姓名:\n");
scanf("%s",p2->Name);
printf("请输入性别:\n");
scanf("%s",p2->Sex);
printf("请输入年龄:\n");
scanf("%d",&p2->Age);
printf("请输入语文成绩:\n");
scanf("%f",&p2->Chinese);
printf("请输入数学成绩:\n");
scanf("%f",&p2->math);
printf("请输入英语成绩:\n");
scanf("%f",&p2->English);
p2->Sum=p2->Chinese+p2->math+p2->English;
p2->Average=p2->Sum/3;
fp=fopen("student.txt","a");
fprintf(fp,"%d\t%s\t%s\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",p2->Number,p2->Name,p2->Sex,p2->Age,p2->Chinese,p2->math,p2->English,p2->Sum,p2->Average);
fclose(fp);
}
else{
p1=(struct students*)malloc(LEN);
p2->Next=p1;
p2=p1;
printf("请输入学号:\n");
scanf("%d",&p1->Number);
printf("请输入姓名:\n");
scanf("%s",p2->Name);
printf("请输入性别:\n");
scanf("%s",p2->Sex);
printf("请输入年龄:\n");
scanf("%d",&p2->Age);
printf("请输入语文成绩:\n");
scanf("%f",&p1->Chinese);
printf("请输入数学成绩:\n");
scanf("%f",&p1->math);
printf("请输入英语成绩:\n");
scanf("%f",&p1->English);
p1->Sum=p1->Chinese+p1->math+p1->English;
p1->Average=p1->Sum/3;
p1->Average=p1->Sum/3;
fp=fopen("student.txt","a");
fprintf(fp,"%d\t%s\t%s\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",p2->Number,p2->Name,p2->Sex,p2->Age,p2->Chinese,p2->math,p2->English,p2->Sum,p2->Average);
fclose(fp);
}
return k+1;
}