zoukankan      html  css  js  c++  java
  • 成绩管理系统 C语言版

    忙了一天,做出来个简单的成绩管理系统,代码如下:

    //学生成绩管理程序 2012年3月17日08:25:05至2012年3月18日12:54:49
    //此系统密码为"aa"
    //此系统供学校成绩管理中心使用,不是学生自己使用,所以查每个学生信息时,会显示出密码
    //学号不能相同 姓名 不能带空格
    //头文件====================================
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<string.h>

    //声明部分===================================
    void print1(); //输出信息
    void print2(); //输出信息
    void display();//输出所有学生信息
    void del(); //删除学生信息
    void modify(); //修改学生信息
    void save(); //保存信息
    void zhumulu(); //主目录
    void write(); //录入学生信息
    void sort(); //对学生信息进行排序
    void find(); //查找学生信息
    void read();//初始化读取学生信息

    int scount; //学生的数目 全局变量

    //结构体数组
    struct STU
    {
    char num[10]; //学号
    char password[10];//密码
    char name[15]; //姓名
    double grade[3];//成绩 语文 数学 英语
    double ave;//平均成绩
    }stu[10000];


    //按学号
    int cmp11(const void *a,const void *b) //快排
    {
    return strcmp((*(struct STU *)a).num,(*(struct STU *)b).num); //升序
    }

    int cmp12(const void *a,const void *b) //快排
    {
    return strcmp((*(struct STU *)b).num,(*(struct STU *)a).num); //降序
    }

    //按姓名
    int cmp21(const void *a,const void *b) //快排
    {
    return strcmp((*(struct STU *)a).name,(*(struct STU *)b).name); //升序
    }

    int cmp22(const void *a,const void *b) //快排
    {
    return strcmp((*(struct STU *)b).name,(*(struct STU *)a).name); //降序
    }

    //按语文成绩
    int cmp31(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).grade[0]>(*(struct STU *)b).grade[0]?1:-1; //升序
    }

    int cmp32(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).grade[0]>(*(struct STU *)b).grade[0]?-1:1; //降序
    }

    //按数学成绩
    int cmp41(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).grade[1]>(*(struct STU *)b).grade[1]?1:-1; //升序
    }

    int cmp42(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).grade[1]>(*(struct STU *)b).grade[1]?-1:1; //降序
    }

    //按英语成绩
    int cmp51(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).grade[2]>(*(struct STU *)b).grade[2]?1:-1; //升序
    }

    int cmp52(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).grade[2]>(*(struct STU *)b).grade[2]?-1:1; //降序
    }
    //按平均成绩
    int cmp61(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).ave>(*(struct STU *)b).ave?1:-1; //升序
    }

    int cmp62(const void *a,const void *b) //快排
    {
    return (*(struct STU *)a).ave>(*(struct STU *)b).ave?-1:1; //降序
    }


    //主函数=================================================================================
    int main()
    {

    char s[15];
    int i=0,j;
    printf("若要使用本系统,请先输入系统密码(字母分大小写)!\n\n");

    while(i!=3)
    {
    printf("请在此处输入密码 : ");
    for(j=0;;j++) //设置输入密码的时候显示为 '*'
    {
    s[j]=getch();
    if(s[j]!='\r') //'\r'为回车的转义字符
    putchar('*');
    if(s[j]=='\r')
    {
    break;
    }

    }
    s[j]='\0';
    printf("\n");
    if(strcmp(s,"aa")==0)
    {
    printf("\n\n\t\t\t 恭喜你,密码正确!\n\n");
    printf("\t\t========================================\n");
    printf("\t\t=======欢迎进入学生成绩管理程序=========\n");
    printf("\t\t========================================\n");
    printf("\n\t\t\t正在初始化学生信息...\n\n");

    read();
    printf("\t\t\t原文件中共有%d条学生信息:\n",scount);

    printf("\n\n\t\t\t请按任意键进入管理目录...\n");
    getch();
    system("cls");
    zhumulu();
    break;
    }
    else
    {
    system("cls");
    printf("密码不正确,请重新输入:\n");
    i++;
    }
    if(i==3)printf("\n您已输入错误超过3次,不能再输入!\n\n");
    }

    return 0;
    }

    void print1()
    {
    printf("学生的信息为:\n学号 密码 姓名 语文 数学 英语 平均分\n");
    printf("=============================================================================\n");

    }
    void print2()
    {
    printf("=============学生成绩管理系统=================\n");
    printf("1)录入学生成绩;\n2)显示整个系统所有学生的成绩;\n3)查询学生成绩;\n4)修改学生成绩;\n5)对学生成绩进行排序;\n6)删除学生成绩;\n0)退出学生成绩管理系统\n");
    printf("请按提示输入:\n");

    }

    void zhumulu()
    {

    int j=1;
    char i;
    print2();
    printf("\n请选择功能前的数字0-6\n");
    scanf("%c",&i);
    while(j==1)
    {
    switch(i)
    {
    case '1':write();j=0;break;
    case '2':display();j=0;break;
    case '3':find();j=0;break;
    case '4':modify();j=0;break;
    case '5':sort();j=0;break;
    case '6':del();j=0;break;
    case '0':printf("\t\t\t****欢迎使用本系统****\n\n\n");j=0;break;
    default:{ system("cls");
    print2();
    printf("\n请选择功能前的数字0-6\n");
    j=1;
    break;
    }

    }
    if(j==1)scanf("%c",&i);
    }
    }
    void read()
    {
    FILE *fp;
    if((fp=fopen("stu.txt","r"))==NULL)
    {
    printf("\t\t\t文件打开错误!\n\n\n");
    return; // 此处不能用exit(0) 不信试试看 在不建立stu.txt的前提下
    }
    scount=0;
    while(!feof(fp))
    {
    fscanf(fp,"%s%s%s%lf%lf%lf%lf\n",stu[scount].num,stu[scount].password,stu[scount].name,&stu[scount].grade[0],&stu[scount].grade[1],&stu[scount].grade[2],&stu[scount].ave);
    if(strcmp(stu[scount].num,"")!=0)scount++; //去掉 学号为空的情况
    }
    fclose(fp);
    }
    void write()
    {

    int n,i;
    system("cls");
    printf("请输入要录入学生的人数:\n");
    scanf("%d",&n);
    print1();
    for(i=scount;i<scount+n;i++)
    {
    scanf("%s%s%s%lf%lf%lf",stu[i].num,stu[i].password,stu[i].name,&stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]);
    stu[i].ave=(stu[i].grade[0]+stu[i].grade[1]+stu[i].grade[2])/3;
    }
    scount+=n;
    save();
    printf("录入完毕,请按任意键进入管理目录...\n");
    getch();
    system("cls");
    zhumulu();

    }
    void save()
    {
    int i;
    FILE *fp;
    if((fp=fopen("stu.txt","w"))==NULL)
    {
    printf("文件打开错误:\n");
    exit(0);
    }
    for(i=0;i<scount;i++)
    fprintf(fp,"%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
    fclose(fp);
    }
    void display() //查看系统总体学生信息
    {
    int i;
    system("cls");
    print1();
    for(i=0;i<scount;i++)
    printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
    printf("请按任意键进入管理目录...:\n");
    getch();
    zhumulu();

    }
    void find()
    {
    int i;
    char s[10];
    system("cls");
    printf("请输入要查询的学号:\n");
    getchar(); //接收上一个回车字符
    gets(s);
    for(i=0;i<scount;i++)
    if(strcmp(s,stu[i].num)==0)
    {
    print1();
    printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n\n\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
    break;
    }
    if(scount==i)printf("未找到该学生的信息!\n");
    printf("请按任意键进入管理目录...:\n");
    getch();
    system("cls");
    zhumulu();
    }
    void modify()
    {
    char s[10],c;
    int i,k,m,n;
    char j;
    int p,q,t;
    system("cls");
    while(1)
    {
    p=0;//
    k=0;//
    n=1;//需在while内部初始化
    printf("请输入您要修改的学号:\n");
    getchar(); //接收上一个回车字符

    gets(s);
    system("cls");
    for(i=0;i<scount;i++)
    {
    if(strcmp(s,stu[i].num)==0)
    {
    p=1;
    t=i;
    printf("此学生的信息为:\n");
    print1();
    printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
    printf("请按提示输入你想要修改的信息:\n");
    //修改一个学生的信息

    printf("1)学号\n2)密码(建议不要轻易修改学生密码)\n3)名字\n4)语文成绩\n5)数学成绩\n6)英语成绩\n7)平均成绩\n\n");

    scanf("%c",&j);
    system("cls");
    while(n==1)//若输错序号,控制重复输入的语句
    {
    switch(j)
    {
    case '1':printf("请输入新学号:\n");scanf("%s",stu[i].num);n=0;break;
    case '2':printf("请输入新密码:\n");scanf("%s",stu[i].password);n=0;break;
    case '3':printf("请输入新名字:\n");scanf("%s",stu[i].name);n=0;break;
    case '4':printf("请输入新语文成绩:\n");scanf("%lf",&stu[i].grade[0]);n=0;break;
    case '5':printf("请输入新数学成绩:\n");scanf("%lf",&stu[i].grade[1]);n=0;break;
    case '6':printf("请输入新英语成绩:\n");scanf("%lf",&stu[i].grade[2]);n=0;break;
    case '7':printf("请输入新平均成绩:\n");scanf("%lf",&stu[i].ave);n=0;break;
    default:{
    system("cls");
    n=1;
    printf("请在数字0-7之间选择:\n");
    printf("1)学号\n2)密码(建议不要轻易修改学生密码)\n3)名字\n4)语文成绩\n5)数学成绩\n6)英语成绩\n7)平均成绩\n\n");
    break;

    }

    }//switch
    if(n==1)scanf("%c",&j);
    } //while
    printf("此学生修改后的信息为:\n");
    print1();
    printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[t].num,stu[t].password,stu[t].name,stu[t].grade[0],stu[t].grade[1],stu[t].grade[2],stu[t].ave);
    printf("若完成此修改输入Y或y,否则请输入N或n:\n");
    getchar(); //必须加一个回车接收上一个的回车键
    scanf("%c",&c);
    if((c=='Y')||(c=='y'))
    {
    printf("恭喜您修改成功!\n\n");
    k=1;
    break;
    }
    else if((c=='N')||(c=='n'))
    {
    printf("请按提示重新修改:\n");
    break;
    }


    }//if

    } //for
    if(p==0)
    {
    printf("没有找到学号为%s的学生信息\n\n",s);
    printf("若您继续修改,确认请输入1,否则输入0\n");
    scanf("%d",&q);
    if(q==0)
    break;
    }

    if(k==1)
    {
    printf("若要修改其他学生的信息,确认请输入1,否则输入0\n");
    scanf("%d",&m);
    system("cls");
    if(m==0)
    break;
    }


    } //while
    save();
    printf("请按任意键进入管理目录...:\n");
    getch();
    system("cls");
    zhumulu();

    }

    void del()
    {
    int i,j,k,p=0;
    char s[10],c;
    printf("请输入您要删除的学生的学号:\n");
    getchar();//
    gets(s);
    for(i=0;i<scount;i++)
    {
    if(strcmp(stu[i].num,s)==0)
    {
    p=1; //标记
    print1();
    printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
    printf("确认删除,请输入Y或y;不删除请输入N或者n:\n");
    c=getchar();
    if(c=='Y'||c=='y')
    {
    for(j=i+1;j<scount;j++)
    stu[j-1]=stu[j];
    for(k=0;k<scount-1;k++)
    {
    if(strcmp(stu[k].num,s)==0)
    {
    printf("删除不成功:\n");
    break;
    }
    }
    if(k==(scount-1))
    {printf("恭喜你,删除成功!\n");
    scount--;
    }
    }

    else
    {
    printf("没有选择删除此学生的信息.\n");
    break;
    }
    }

    }
    if(p==0)
    printf("没有找到学号为%s的学生信息\n",s);
    save();
    printf("请按任意键进入管理目录...:\n");
    getch();
    system("cls");
    zhumulu();

    }

    void sort()
    {
    int j=0;
    char c1,c2;
    system("cls");
    printf("请按提示输入数字0-6:\n\n1)按学号排序\n2)按姓名排序\n3)按语文成绩排序\n4)按数学成绩排序\n5)按英语成绩排序\n6)按平均成绩排序\n0)退出排序\n");
    getchar();//接收回车
    c1=getchar();
    switch(c1)
    {
    case '1':
    {
    system("cls");
    printf("\n1)按学号升排序\n2)按学号降排序\n0)不排序\n");
    getchar();
    c2=getchar();
    switch(c2)
    {
    case '1':qsort(stu,scount,sizeof(stu[0]),cmp11);j=1;break;
    case '2':qsort(stu,scount,sizeof(stu[0]),cmp12);j=1;break;
    case '0':break;
    default:printf("输入错误\n");
    }
    if(j==1)
    printf("恭喜你 排序成功!\n");
    else
    printf("排序失败!\n");
    break;
    }
    case '2':
    {
    system("cls");
    printf("\n1)按姓名字典升排序\n2)按姓名字典降排序\n0)不排序\n");
    getchar();
    c2=getchar();
    switch(c2)
    {
    case '1':qsort(stu,scount,sizeof(stu[0]),cmp21);j=1;break;
    case '2':qsort(stu,scount,sizeof(stu[0]),cmp22);j=1;break;
    case '0':break;
    default:printf("输入错误\n");
    }
    if(j==1)
    printf("恭喜你 排序成功!\n");
    else
    printf("排序失败!\n");
    break;
    }
    case '3':
    {
    system("cls");
    printf("\n1)按语文成绩升排序\n2)按语文成绩降排序\n0)不排序\n");
    getchar();
    c2=getchar();
    switch(c2)
    {
    case '1':qsort(stu,scount,sizeof(stu[0]),cmp31);j=1;break;
    case '2':qsort(stu,scount,sizeof(stu[0]),cmp32);j=1;break;
    case '0':break;
    default:printf("输入错误\n");
    }
    if(j==1)
    printf("恭喜你 排序成功!\n");
    else
    printf("排序失败!\n");
    break;
    }
    case '4':
    {
    system("cls");
    printf("\n1)按数学成绩升排序\n2)按数学成绩降排序\n0)不排序\n");
    getchar();
    c2=getchar();
    switch(c2)
    {
    case '1':qsort(stu,scount,sizeof(stu[0]),cmp41);j=1;break;
    case '2':qsort(stu,scount,sizeof(stu[0]),cmp42);j=1;break;
    case '0':break;
    default:printf("输入错误\n");
    }
    if(j==1)
    printf("恭喜你 排序成功!\n");
    else
    printf("排序失败!\n");
    break;
    }
    case '5':
    {
    system("cls");
    printf("\n1)按英语成绩升排序\n2)按英语成绩降排序\n0)不排序\n");
    getchar();
    c2=getchar();
    switch(c2)
    {
    case '1':qsort(stu,scount,sizeof(stu[0]),cmp51);j=1;break;
    case '2':qsort(stu,scount,sizeof(stu[0]),cmp52);j=1;break;
    case '0':break;
    default:printf("输入错误\n");
    }
    if(j==1)
    printf("恭喜你 排序成功!\n");
    else
    printf("排序失败!\n");
    break;
    }
    case '6':
    {
    system("cls");
    printf("\n1)按平均成绩升排序\n2)按平均成绩降排序\n0)不排序\n");
    getchar();
    c2=getchar();
    switch(c2)
    {
    case '1':qsort(stu,scount,sizeof(stu[0]),cmp61);j=1;break;
    case '2':qsort(stu,scount,sizeof(stu[0]),cmp62);j=1;break;
    case '0':break;
    default:printf("输入错误\n");
    }
    if(j==1)
    printf("恭喜你 排序成功!\n");
    else
    printf("排序失败!\n");
    break;
    }
    case '0':break;
    default:printf("输入错误\n");

    }
    save();
    printf("请按任意键进入管理目录...:\n");
    getch();
    system("cls");
    zhumulu();
    }

    过程总结:

    1)密码显示为'*',若输错,则不能删除,暂时没有解决这个问题,密码的算法可能需要重新设计,暂时还没想起更好的;

    2)对文件部分加深了印象,此程序若没有打开文件,则应该写成return;而不能写成 exit(0),因为后期还要输入文件信息,不能直接终止程序,若不存在,还会自动的创建;

    3)对结构体快排加深了印象,体会到其简洁性;

    4)清屏函数system("cls")用了之后是程序更加简洁;

    5)输入一个字符时无论用c=getchar();或scanf("%c",&c);之前看情况要加上getchar(),来接收上面的回车键,要不然会出错;因为其将回车符赋给了字符c;

    6)在输入字符串是也一样,之前要加上一个getchar();

    7)函数要声明

    8)全局变量却实好用

    9)初始化信息很给力

    10)做标记,很有用处

    OK,还比较满意,可能还有需要改进的地方,以后再说!



  • 相关阅读:
    OpenDataSource、OPENQUERY、OPENROWSET用法
    DROIDSLAM 论文阅读笔记
    android之路重新开启
    Android工程目录
    新入园
    获取输入框内容,数值类型转换问题
    基于.net平台remoting、DB2技术的大型分布式HIS系统架构及开发(项目架构师方向)
    基于ios开发点餐系统应用(附带源码)
    DEV控件及如何实现一些功能的应用(附带PPT讲解)
    基于J2EE+JBPM3.x/JBPM4.3+Flex流程设计器+Jquery+授权认证)企业普及版贝斯OA与工作流系统
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2404590.html
Copyright © 2011-2022 走看看