学生成绩管理系统课程设计(C语言,链表实现)

#include
#include
#include
#include
#include
struct stu
{
char num[11];
char name[8];
int maths;
int physics;
int english;
int circuit;
int computer;
float avg;
char is_ok[2]; 
struct stu *next;
};
int n; //全局变量n 
//以下是函数声明
struct stu *input(); //输入函数 
void output(struct stu * head);  //输出函数 
void find(struct stu * head); //查找和排名函数 
void level(struct stu * head); //分数段人数函数 
void average(struct stu * head); //各科平均分函数 
void menushow(); //主菜单函数 
void submenu1();  //查找子菜单函数 
void submenu2(); //增加子菜单函数 
void submenu3(); //删除子菜单函数 
void welcome(); //欢迎界面函数 
void savefile(struct stu * head);//保存入函数 
struct stu *readfile(); //读取成绩信息函数 
void print(); //输出函数 
void cutout(struct stu * head); //删除函数 
void add(struct stu * head);  //增加函数 

main() //主函数 
{  
struct stu *head,*p;
int j,k,i,l,m=1,n; //m为控制变量,j,k,i,l为子菜单控制变量
   welcome(); //调用欢迎函数 
 while(1){ //建立菜单循环 
  menushow(); //调用menushow函数 
scanf("%d",&j); //读取变量j
switch(j){
case 1:system("cls"); //输入学生信息,并返回主菜单 
print();
head=input();
p=head;
printf("输入成功!");
Sleep(1000);
break;  
case 2:system("cls"); //输出学生信息,返回主菜单
output(p);
printf("任意键返回上一级");
getchar();
getchar();
break;      
case 3:m=1;
while(m) //以m的值确定是否循环,m为1循环,m为0退出该级循环 
{
system("cls");
add(p); //调用增加函数 
printf("增加成功!");
getchar();
getchar();
system("cls");
n=1; // 以n的值确定是否循环,n为1循环,n为0退出该级循环 
while(n){
submenu2();
scanf("%d",&i);
switch(i){
case 1:n=0;break; //退出该级循环,回到上一级增加函数 
case 0:m=0;n=0;break;//退出上两级循环,回到主菜单 
default:printf("\t                     选择错误,请重新输入!\n");
n=1; //子菜单选择错误,重新选择 
Sleep(3000);
system("cls");
break; 
}
}
}
break;
case 4:system("cls");    //调用保存文件函数,返回主菜单 
savefile(p);
printf("保存成功!");
Sleep(1000);
break;
case 5:system("cls"); //输出各科平均分,返回主菜单 
average(p);
printf("任意键返回上一级");
getchar();
getchar();
break;
case 6:m=1; //m控制循环 
while(m)
{
system("cls"); //调用find函数,用于查询学生信息
find(p);
getchar();
getchar();
        system("cls");
n=1;
while(n){ //调用查找子菜单 
submenu1();
scanf("%d",&k);
switch(k){
case 1:n=0;break; //退出该循环,回到查找函数 
case 0:m=0;n=0;break;//退出上两级循环,回到主菜单 
default:printf("\t                     选择错误,请重新输入!\n");
Sleep(3000);
system("cls");
n=1;
break; //子菜单选择错误,重新选择 
}
}
}break;
case 7:system("cls");       //调用level函数,返回主菜单
level(p);
printf("任意键返回上一级");
getchar();
getchar();
break;
case 8:
m=1;
while(m) //控制循环 
{
system("cls");
cutout(p); //调用删除函数 
getchar();
getchar();
system("cls");
n=1;
while(n){  
submenu3(); //调用删除子菜单
scanf("%d",&l);  
switch(l){
case 1:n=0;break; //退出该级循环,回到删除函数 
case 0:m=0;n=0;break;//退出上两级循环,回到主菜单 
default:printf("\t                     选择错误,请重新输入!\n");
Sleep(3000);
n=1;
system("cls");
break;  //子菜单选择错误,重新选择 
}
}
}break;
case 9:
system("cls");
head=readfile(); //调用读取函数
p=head;printf("读取成功!"); 
Sleep(1000);break;
case 0:printf("\t                           再见!\n");return 0;break; 
default:printf("\t                     选择错误,请重新输入!\n");
Sleep(3000);
break; //主菜单选择错误,重新选择 
}
}
  }


void print() //输出函数 
{
printf("请输入学生信息及成绩\n");
printf("    学号     姓名      数学  物理  英语  电路  计算机  是否继续(y/n)\n");
printf("例403140101   xx       100    100   100   100   100      y\n");
}

struct stu *input()    //输入学生成绩信息 
{
struct stu *head,*p1,*p2;
n=0;
p1=p2=(struct stu*)malloc(sizeof(struct stu));
scanf("%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
head=NULL;
while(strcmp(p1->is_ok,"n")!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct stu*)malloc(sizeof(struct stu));
scanf("%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
p1->avg=(p1->maths+p1->physics+p1->english+p1->circuit+p1->computer)/5;
}
p2->next=NULL;
return(head);
}
void output (struct stu * head)  //输出学生成绩信息 
{
struct stu * p;
printf("\n学生成绩如下:\n");
printf("                      \n  学号     姓名      数学  物理  英语  电路  计算机  平均分\n");
p=head;
if(head!=NULL) 
do{
p->avg=(p->maths+p->physics+p->english+p->circuit+p->computer)/5;
printf("%s %-8s %5d %5d %5d %5d %5d     %5.2f\n",p->num,p->name,p->maths,p->physics,p->english,p->circuit,p->computer,p->avg);
p=p->next;
}while(p!=NULL);
}

void find(struct stu * head)    //查找学生成绩信息 
{
struct stu * p;
int k=1,m=1;
float j=200;
char num[11];
char Name[8];
p=head;
if(head!=NULL)
printf("请输入需要查找的学生的学号:");
scanf("%s",num);
do{
if(strcmp(p->num,num)==0)
{
printf("\n  学号     姓名      数学  物理  英语  电路  计算机  平均分\n");
p->avg=(p->maths+p->physics+p->english+p->circuit+p->computer)/5;
printf("%s %-8s %5d %5d %5d %5d %5d     %5.2f\n",p->num,p->name,p->maths,p->physics,p->english,p->circuit,p->computer,p->avg);
j=p->avg;
  strcpy(Name,p->name);
}
p=p->next;
}while(p!=NULL);
p=head;
for(p;p!=NULL;p=p->next) 
{           //按照平均分输出排名
if((p->avg)>j)
k++;
}
if(j<200)
printf("%s的排名为:%d\n",Name,k);  
p=head;
for(p;p!=NULL;p=p->next)
{
if(strcmp(p->num,num)==0)
m=0;
}
if(m==1)
printf("未找到该同学信息!");
}




void  level(struct stu * head)  //分数段信息函数 
{
struct stu * p;
int i,j=0,k=0,x=0,y=0,z=0;
p=head;
if(head!=NULL) 
do{
if(p->avg>=90&&p->avg<=100)j++;
if(p->avg>=80&&p->avg<90)k++;
if(p->avg>=70&&p->avg<80)x++;
if(p->avg>=60&&p->avg<70)y++;
if(p->avg<60)z++;
p=p->next;
}while(p!=NULL);
printf(" 分数段分布如下:\n");
printf("90-100分有 %-3d人\n",j);
  printf("80-89分有  %-3d人\n",k);
  printf("70-79分有  %-3d人\n",x);
  printf("60-69分有  %-3d人\n",y);
    printf("60分以下有 %-3d人\n",z);
}

void average(struct stu * head) //求各科平均分函数 
{
float avg_maths=0;
float avg_physics=0;
float avg_english=0;
float avg_circuit=0;
float avg_computer=0;
struct stu * p;
p=head;
if(head!=NULL)
do
{
avg_maths+=p->maths;
avg_physics+=p->physics;
avg_english+=p->english;
avg_circuit+=p->circuit;
avg_computer+=p->computer;
p=p->next;
}while(p!=NULL);
avg_maths=avg_maths/n;
avg_physics=avg_physics/n;
avg_english=avg_english/n;
avg_circuit=avg_circuit/n;
avg_computer=avg_computer/n;
printf("各科的平均分如下:\n");
 printf("数学:  %-6.2f \n",avg_maths);        
 printf("物理:  %-6.2f \n",avg_physics);
 printf("英语:  %-6.2f \n",avg_english);
 printf("电路:  %-6.2f \n",avg_circuit);
 printf("计算机:%-6.2f \n",avg_computer);
}

                    

void menushow()
{
system("cls");
printf(" \n\n\n\n\n\n\n\t\t\t  欢迎使用学生成绩管理系统\n");
printf("                          *************************\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("                          * 0.  退            出  *\n");
printf("                          *************************\n");
printf("                                    请选择:");
}
void savefile(struct stu * head) //读取文件成绩信息函数 
{
struct stu * p;
FILE *fp;
fp=fopen("stu.txt","w");
p=head;
if(head!=NULL) 
do{
p->avg=(p->maths+p->physics+p->english+p->circuit+p->computer)/5;
fprintf(fp,"%s %-8s %5d %5d %5d %5d %5d     %5.2f\n",p->num,p->name,p->maths,p->physics,p->english,p->circuit,p->computer,p->avg);
p=p->next;
}while(p!=NULL);
fclose(fp);
}

void submenu1() //查找子菜单 
{
printf(" \n\n\n\n\n\n\n");
printf("                          **************************\n");
printf("                          * 1.  继   续   查   找  *\n");
printf("                          **************************\n");
printf("                          * 0.  返  回  上  一 级  *\n");
printf("                          **************************\n");
printf("                                    请选择:");
}
void welcome()  //输入密钥进入程序,欢迎函数 
{
char password[5];
char num[5];
strcpy(num,"njit");
loopback3:printf(" \n\n\n\n\n\n\n\n");
system("color 0F");
printf("\t\t\t欢迎使用学生成绩管理系统!\n");
printf("\t\t\t\t请输入密码:");
scanf("%s",&password);
if(strcmp(password,num)==0)
{
system("cls");
system("color 02");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 04");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 05");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 06");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 0C");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 0F");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);

}
else
{
printf("\t\t\t\t 密码错误!"); //密码错误重新输出 
Sleep(2000);
system("cls");
goto loopback3;
}
}

void submenu2() //增加学生信息的子菜单 
{
printf(" \n\n\n\n\n\n\n");
printf("                          **************************\n");
printf("                          * 1.  继   续   增   加  *\n");
printf("                          **************************\n");
printf("                          * 0.  返  回  上  一 级  *\n");
printf("                          **************************\n");
printf("                                    请选择:");
}

void submenu3() //删除学生信息的子菜单 
{
printf(" \n\n\n\n\n\n\n");
printf("                          **************************\n");
printf("                          * 1.  继   续   增   加  *\n");
printf("                          **************************\n");
printf("                          * 0.  返  回  上  一 级  *\n");
printf("                          **************************\n");
printf("                                    请选择:");
}
void add(struct stu * head)  //增加学生成绩信息函数 
{
struct stu * p,*p1;
p=head;
while(p->next!=NULL)
{
p=p->next;
}
 printf("                      请输入成绩\n  学号     姓名      数学  物理  英语  电路  计算机\n");
p1=(struct stu*)malloc(sizeof(struct stu));
scanf("%s%s%d%d%d%d%d",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer);
p1->avg=(p1->maths+p1->physics+p1->english+p1->circuit+p1->computer)/5;
p1->next=NULL;
p->next=p1;
}
 
void cutout(struct stu *head) //删除学生成绩信息函数 
{
struct stu *p;
struct stu *p1;
p1=head;
p=head->next;
char num[11];
printf("请输入需要删除的学生的学号:"); 
scanf("%s",num);
while(p!=NULL) //找到同学并删除
      {
          if(strcmp(p->num,num)==0)
         {
             p1->next=p->next;
             free(p);
             printf("删除成功!\n");
             return;
         }
         p=p->next;
         p1=p1->next;
     }
    if(p==NULL) //未找到该学生 
    {
        printf("找不到要删除的学生信息!\n");
        return ;
    }
}
struct stu *readfile()  //读取文件输入 
{
FILE *fp;
struct stu *head,*p1,*p2;
fp=fopen("stu1.txt","r");
n=0;
p1=p2=(struct stu*)malloc(sizeof(struct stu));
  fscanf(fp,"%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
head=NULL;
while(strcmp(p1->is_ok,"n")!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct stu*)malloc(sizeof(struct stu));
fscanf(fp,"%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
p1->avg=(p1->maths+p1->physics+p1->english+p1->circuit+p1->computer)/5;
}
p2->next=NULL;
return(head);

你可能感兴趣的:(c/c++)