学生成绩管理系统

题目: 学生成绩管理系统

     功能: 输入若干个学生信息(比如:学号,姓名及三门课成绩),能实现

学生信息的录入、查询、插入、排序等功能。

要求: 用数据文件保存学生信息。利用菜单可以循环完成各个操作。

进一步要求: 能够实现对成绩的修改更好。

(文件函数 、结构数组,排序等)

 

 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void first_print()
{
    printf("\n=============================\n");
    printf("欢迎进入该系统!!!");
    printf("\n=============================\n");    
    
    }
void menu()
{
    printf("\n*****************************\n");
    printf("1、录入信息\n2、显示信息\n3、查询信息\n4、插入信息\n5、升序排序\n6、降序排序\n7、修改信息\n8、删除信息\n9、退出系统");
    printf("\n*****************************\n");     
}
struct MM{
    char num[20];
    char name[20];
    float cj[3];
    float score;
    float ave;
    }mm;
void scanf_1()
{
    int n=0;
    char ch,ck[20];
    FILE *fp;
    if((fp=fopen("ding.dat","w+"))==NULL)
    {printf("cannot open file\n");
    exit(0);
        }
    do{getchar();
        printf("请输入学号:\n");
        gets(ck);
        if(strlen(ck)>20)
        {
            printf("输入字符过长,已退出输入!!");
            break;
            }
        rewind(fp);   
        while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
        {
            if(strcmp(ck,mm.num)==0)
            {
                printf("学号输入重复,已退出输入!!");
                n++;
                break;
                }
            }
        if(n)
        break;
        strcpy(mm.num,ck);
        printf("请输入姓名:\n");
        gets(mm.name);
        if(strlen(mm.name)>20)
        {
            printf("输入字符过长,已退出输入!!");
            break;
            }
        printf("请输入语文、数学、英语成绩:\n");
        scanf("%f%f%f",&mm.cj[0],&mm.cj[1],&mm.cj[2]);
        mm.score=mm.cj[0]+mm.cj[1]+mm.cj[2];
        mm.ave=mm.score/3;
        fprintf(fp,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
        printf("是否继续 y or n?\n");
        getchar();
        ch=getchar();        
        }while(ch=='y'||ch=='Y');
    fclose(fp);
    }
    void scanf_2()
{
    int n=0;
    char ch,ck[20];
    FILE *fp;
    if((fp=fopen("ding.dat","a+"))==NULL)
    {printf("cannot open file\n");
    exit(0);
        }
    do{getchar();
        printf("请输入学号:\n");
        gets(ck);
        if(strlen(ck)>20)
        {
            printf("输入字符过长,已退出输入!!");
            break;
            }
        rewind(fp);   
        while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
        {
            if(strcmp(ck,mm.num)==0)
            {
                printf("学号输入重复,已退出输入!!");
                n++;
                break;
                }
            }
        if(n)
        break;
        strcpy(mm.num,ck);
        printf("请输入姓名:\n");
        gets(mm.name);
        if(strlen(mm.name)>20)
        {
            printf("输入字符过长,已退出输入!!");
            break;
            }
        printf("请输入语文、数学、英语成绩:\n");
        scanf("%f%f%f",&mm.cj[0],&mm.cj[1],&mm.cj[2]);
        mm.score=mm.cj[0]+mm.cj[1]+mm.cj[2];
        mm.ave=mm.score/3;
        fprintf(fp,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
        printf("是否继续 y or n?\n");
        getchar();
        ch=getchar();        
        }while(ch=='y'||ch=='Y');
    fclose(fp);
    }
void print()
{FILE *fp;
printf("学号                姓名                 语文   数学  英语   总分  平均分\n");
if((fp=fopen("ding.dat","r"))==NULL)
{
    printf("cannot open file\n");
    exit(0);
    }
     
    while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
    {    
        
      printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);

  }
    fclose(fp);
    }
 void find()
 {
    int a=0,b=0;
    char  ch[20];
    FILE *fp;
    if((fp=fopen("ding.dat","r"))==NULL)
    {printf("cannot open file\n");
     exit(0);   }
    printf("请输入要查找成绩的方式\n1.按学号查找\n2.按姓名查找\n");
    scanf("%d",&a);
    getchar();
    if(a==1)
    {
    printf("请输入学号:\n");
    gets(ch);
    while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
     {
    if(strcmp(mm.num,ch)==0)
    {b++;
    printf("学号                姓名                 语文   数学  英语   总分  平均分\n");
    printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
    }
       
    }
    if(b==0)
    printf("no found\n");
        }    
    if(a==2)
    {
    printf("请输入姓名:\n");
    gets(ch);
    while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
    {
    if(strcmp(mm.name,ch)==0)
    {b++;
    printf("学号                姓名                 语文   数学  英语   总分  平均分\n");
    printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
    }
    
        }
      if(b==0)
    printf("no found\n");     
    }
    fclose(fp);
        }
void change()
{struct XX{
    char num[20];
    char name[20];
    float cj[3];
    float score;
    float ave;
    }xx;
    int b=0;
    char ch[20],ck;
    FILE *fp;
    FILE *fp2;
    do{
        if((fp=fopen("ding.dat","r"))==NULL)
        {printf("cannot open file\n");
        exit(0);}
        if((fp2=fopen("temp.dat","w"))==NULL)
        {printf("cannot open file\n");
        exit(0);}
        printf("请输入要修改成绩的学号:\n");
        scanf("%s",ch);
        while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
        {   
            if(strcmp(mm.num,ch)==0)
            {b++;
            printf("学号                姓名                 语文   数学  英语   总分  平均分\n");
            printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
            getchar();
            printf("请输入新学号:\n");
            gets(xx.num);
            printf("请输入新姓名:\n");
            gets(xx.name);
            printf("请输入新语文、数学、英语成绩:\n");
            scanf("%f%f%f",&xx.cj[0],&xx.cj[1],&xx.cj[2]);
            xx.score=xx.cj[0]+xx.cj[1]+xx.cj[2];
            xx.ave=xx.score/3;
            fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",xx.num,xx.name,xx.cj[0],xx.cj[1],xx.cj[2],xx.score,xx.ave);
                }else
            fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
            }
        if(b==0)
        {printf("没有找到相关信息!!");
         getchar();
                }
         rewind(fp);
         printf("是否继续修改 y or n?\n");
         getchar();
         ck=getchar();
         fclose(fp);
         fclose(fp2);
         remove("ding.dat");
         rename("temp.dat","ding.dat");
     }while(ck=='y'||ck=='Y');
    if(b!=0)
    printf("修改成功!!");  
    }  
void del()
{
    int b=0;
    char ch[20],ck;
    FILE *fp;
    FILE *fp2;
    do{
        if((fp=fopen("ding.dat","r"))==NULL)
        {printf("cannot open file\n");
        exit(0);}
        if((fp2=fopen("temp.dat","w"))==NULL)
        {printf("cannot open file\n");
        exit(0);}
        printf("请输入要删除成绩的学号:\n");
        scanf("%s",ch);
        while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
        {   
            if(strcmp(mm.num,ch)==0)
            {b++;
            printf("学号                姓名                 语文   数学  英语   总分  平均分\n");
            printf("%-20s%-20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
                }else
            fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",mm.num,mm.name,mm.cj[0],mm.cj[1],mm.cj[2],mm.score,mm.ave);
            }
        if(b==0)
        {printf("没有找到相关信息!!");
         getchar();
                }
         rewind(fp);
         printf("是否继续删除 y or n?\n");
         getchar();
         ck=getchar();
         fclose(fp);
         fclose(fp2);
         remove("ding.dat");
         rename("temp.dat","ding.dat");
     }while(ck=='y'||ck=='Y');
    if(b!=0)
    printf("删除成功!!");  
    }
void  sort_1()
{struct PP{
    char num[20];
    char name[20];
    float cj[3];
    float score;
    float ave;
    }pp[100];
    
    int i=0;
    FILE *fp;
    FILE *fp2;
    if((fp=fopen("ding.dat","r"))==NULL)
    {printf("cannot open file");
     exit(0);}
    if((fp2=fopen("d排序后.dat","w"))==NULL)
    {printf("cannot open file");
     exit(0);}   
     while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
      {strcpy(pp[i].num,mm.num);
       strcpy(pp[i].name,mm.name);
       pp[i].cj[0]=mm.cj[0];
       pp[i].cj[1]=mm.cj[1];
       pp[i].cj[2]=mm.cj[2];
       pp[i].score=mm.score;
       pp[i].ave=mm.ave;
       i++;}
       for(int j=0;j<i;j++)
       {int x=j;
       float a,b,c,d,e;
        char num[20],name[20];
        for(int k=j+1;k<i;k++)
        if(pp[x].score>pp[k].score)
              x=k;
        
        
        strcpy(num,pp[x].num);
        strcpy(pp[x].num,pp[j].num);
        strcpy(pp[j].num,num);
        
        strcpy(name,pp[x].name);
        strcpy(pp[x].name,pp[j].name);
        strcpy(pp[j].name,name);        
        
        
        a=pp[x].cj[0];
        pp[x].cj[0]=pp[j].cj[0];
        pp[j].cj[0]=a;
       
       b=pp[x].cj[1];
       pp[x].cj[1]=pp[j].cj[1];
       pp[j].cj[1]=b;
       
       
       c=pp[x].cj[2];
       pp[x].cj[2]=pp[j].cj[2];
       pp[j].cj[2]=c;
       
       
       d=pp[x].score;
       pp[x].score=pp[j].score;
       pp[j].score=d;
       
       e=pp[x].ave;
       pp[x].ave=pp[j].ave;
       pp[j].ave=e;}    
       for(int n=0;n<i;n++)
       fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",pp[n].num,pp[n].name,pp[n].cj[0],pp[n].cj[1],pp[n].cj[2],pp[n].score,pp[n].ave);
       fclose(fp);
       fclose(fp2);
       remove("ding.dat");
       rename("d排序后.dat","ding.dat");
       printf("升序排序成功!!\n");
}
void  sort_2()
{struct PP{
    char num[20];
    char name[20];
    float cj[3];
    float score;
    float ave;
    }pp[100];
    
    int i=0;
    FILE *fp;
    FILE *fp2;
    if((fp=fopen("ding.dat","r"))==NULL)
    {printf("cannot open file");
     exit(0);}
    if((fp2=fopen("d排序后.dat","w"))==NULL)
    {printf("cannot open file");
     exit(0);}   
     while(fscanf(fp,"%s%s%f%f%f%f%f",mm.num,mm.name,&mm.cj[0],&mm.cj[1],&mm.cj[2],&mm.score,&mm.ave)==7)
      {strcpy(pp[i].num,mm.num);
       strcpy(pp[i].name,mm.name);
       pp[i].cj[0]=mm.cj[0];
       pp[i].cj[1]=mm.cj[1];
       pp[i].cj[2]=mm.cj[2];
       pp[i].score=mm.score;
       pp[i].ave=mm.ave;
       i++;}
       for(int j=0;j<i;j++)
       {int x=j;
       float a,b,c,d,e;
        char num[20],name[20];
        for(int k=j+1;k<i;k++)
        if(pp[x].score<pp[k].score)
              x=k;
        
        
        strcpy(num,pp[x].num);
        strcpy(pp[x].num,pp[j].num);
        strcpy(pp[j].num,num);
        
        strcpy(name,pp[x].name);
        strcpy(pp[x].name,pp[j].name);
        strcpy(pp[j].name,name);        
        
        
        a=pp[x].cj[0];
        pp[x].cj[0]=pp[j].cj[0];
        pp[j].cj[0]=a;
       
       b=pp[x].cj[1];
       pp[x].cj[1]=pp[j].cj[1];
       pp[j].cj[1]=b;
       
       
       c=pp[x].cj[2];
       pp[x].cj[2]=pp[j].cj[2];
       pp[j].cj[2]=c;
       
       
       d=pp[x].score;
       pp[x].score=pp[j].score;
       pp[j].score=d;
       
       e=pp[x].ave;
       pp[x].ave=pp[j].ave;
       pp[j].ave=e;}    
       for(int n=0;n<i;n++)
       fprintf(fp2,"%20s%20s%6.2f%6.2f%6.2f%8.2f%6.2f\n",pp[n].num,pp[n].name,pp[n].cj[0],pp[n].cj[1],pp[n].cj[2],pp[n].score,pp[n].ave);
       fclose(fp);
       fclose(fp2);
       remove("ding.dat");
       rename("d排序后.dat","ding.dat");
       printf("降序排序成功!!\n");
}
void  exit()
{char ch;
printf("确定退出  y or n?\n");
getchar();
ch=getchar();
if(ch=='y'||ch=='Y')
exit(0);
else
menu();
    }
int main()
{
    first_print();
    menu();
    while(1)
    {int n;
     scanf("%d",&n);
     switch(n)
     {case 1:scanf_1();break;
       case 2:print();break;
       case 3:find();break;
       case 4:scanf_2();break;
       case 5:sort_1();break;
       case 6:sort_2();break;
       case 7:change();break;
       case 8:del();break;
       case 9:exit();break;
     default:printf("输入错误!!请重新输入:\n");
            }
      menu();  
        }

    getchar();getchar();
    return 0;
    }

思路
1.可解决学号重复问题;
2.退出输入即为返回菜单;

 

总结

1.exit(0)与return 0的区别:exit()仍然会终止程序;但return将控制权移交给递归的前一级,
直到最初的那一级,此时return才会终止程序。(exit(0)的头文件为stdlib.h)

2.strlen(ck)可以测量字符串的长度(头文件为string.h);

3.fscanf的返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)

4.strcmp(str1,str2)字符串比较函数(头文件string.h)若str1==str2,则返回零;若str1<str2,
则返回负数;若str1>str2,则返回正数。

5.char *strcpy(char* dest, const char *src)字符串复制函数,(头文件string.h)
strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,
返回值的类型为char*。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值