学生成绩管理系统设计

学生成绩信息包括:学号、姓名、C语言成绩。试设计一选修课程系统,使之能提供以下功能:

系统以菜单方式工作(用键盘输入1~5之间的数来选择功能)

(1)成绩信息录入功能(成绩信息用文件保存)

(2)成绩信息浏览功能

(3)查询功能:按学号查询或按成绩段查询(至少一种查询方式)

(4)成绩信息的删除:(按学号进行删除某学生的成绩)

(5)成绩信息的修改:(按成绩修改,把55~59分之间的成绩都加上5分)

(6)自定义题目

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct student
{
    char name[20];
    char number[20];
    double math;
    double english;
    double chinese;
    double program;
} s[50];

void head()
{
    printf("*******************************************************************\n");
    printf("***                   学生成绩管理系统                          ***\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("***                   0.退出成绩系统                            ***\n");
    printf("***                                                             ***\n");
    printf("*******************************************************************\n");
}

void daoru(struct student s[],int* n)
{
    FILE *p;
    if((p=fopen("data.txt","r"))==NULL)
    {
        printf("打开失败!");
        exit(1);
    }
    else
    {
        while(!feof(p))
        {
            fscanf(p, " %s %s %lf %lf %lf %lf \n", s[*n].name, s[*n].number, &s[*n].math, &s[*n].english, &s[*n].chinese, &s[*n].program);
            ++(*n);
        }
    }
    fclose(p);
}
void daochu(struct student s[], int n)
{
    FILE *p;
    int i=0;
    if((p=fopen("data.txt", "w"))==NULL)
    {
        printf("无法打开此文件!");
    }
    else
    {
        while(n-- && n > 1)
        {
            fprintf(p, "%s %s %lf %lf %lf %lf\n", s[i].name, s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program);
        }
        fprintf(p, "%s %s %lf %lf %lf %lf", s[0].name, s[0].number, s[0].math, s[0].english, s[0].chinese, s[0].program);
    }
    fclose(p);
}

void dayin(struct student s[],int n)
{
    int i;
    double all;
    printf("\n姓名\t\t学号\t\t数学\t英语\t语文\t程序\t总分\n");
    for(i=0; i<n; i++)
    {
        all=s[i].math+s[i].english+s[i].chinese+s[i].program;
        printf("%\s\t\t  %s\t\t  %.1lf\t  %.1lf\t  %.1lf\t  %.1lf\t  %.1lf\n", s[i].name, s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program, all);
    }
}

void shuru(struct student s[], int* n)
{
    int i=*n,j,k,m;
    printf("请输入学生姓名:");
    scanf("%s", s[i].name);
    printf("请输入学生学号:");
    for (j=0; ; j++)
    {
        m=0;
        scanf("%s",s[i].number);
        for (k=0; k<i; k++)
        {
            if (strcmp(s[i].number, s[k].number)==0)
            {
                m=m+1;
                printf("学号重复,请重新输入学号:");
                break;
            }
        }
        if(m==0)
        {
            break;
        }
    }
    printf("请输入数学成绩:");
    scanf("%lf", &s[i].math);
    printf("请输入英语成绩:");
    scanf("%lf", &s[i].english);
    printf("请输入语文成绩:");
    scanf("%lf", &s[i].chinese);
    printf("请输入程序成绩:") ;
    scanf("%lf", &s[i].program);
    printf("添加信息成功!\n");
    *n=*n+1;
    daochu(s,*n);
}

void paixu(struct student s[], int n)
{
    int i,j;
    double all1,all2;
    struct student stu;
    for(i=0; i<n-1; i++)
    {
        for(j=j+1; j<n; j++)
        {
            all1=s[i].math+s[i].english+s[i].chinese+s[i].program;
            all2=s[j].math+s[j].english+s[j].chinese+s[j].program;
            if(all1<all2)
            {
                stu=s[i];
                s[i]=s[j];
                s[j]=stu;
            }
        }
    }
    printf("排序后的数据:\n");
    dayin(s, n);
}

void chazhao(struct student s[], int n)
{
    char name[20], num[20];
    int m1, m2=0,i,j;
    printf("1.按姓名查找\n2.按学号查找\n选择查询方式(1或2):");
    scanf("%d", &m1);
    if (m1==1)
    {
        printf("请输入您要查找的学生姓名:");
        scanf("%s",name);
        for (i=0; i<n; i++)
        {
            if (strcmp(s[i].name, name)==0)
            {
                m2=m2+1;
                if(m2==1)
                {
                    printf("\n姓名\t\t学号\t数学\t英语\t语文\t程序\n");
                }
                printf("%s\t\t%s\t\t%f\t\t%f\t\t%f\t\t%f\n",s[i].name,s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program);
            }
        }
        if(m2==0)
        {
            printf("没有此学生信息!\n");
        }
    }
    else if(m1==2)
    {
        printf("请输入您要查找的学生学号:");
        scanf("%s", num);
        j=0;
        for (i=0; i<n; i++)
        {
            if (strcmp(s[i].number, num)==0)
            {
                m2=m2+1;
                if(m2==1)
                {
                    printf("\n姓名\t\t学号\t数学\t英语\t语文\t程序\n");
                }
                printf("%s\t\t%s\t\t%f\t\t%f\t\t%f\t\t%f\n", s[i].name, s[i].number, s[i].math, s[i].english, s[i].chinese, s[i].program);
            }
        }
        if(m2==0)
        {
            printf("没有此学生信息!\n");
        }
    }
}

void shanchu(struct student s[], int* n)
{
    char num[20];
    int m=0,i,j;
    printf("请输入您要删除的学生学号:");
    scanf("%s",num);
    for(i=0; i<=*n; i++)
    {
        if (strcmp(s[i].number, num)==0)
        {
            m=m+1;
            for(j=i; j<*n; j++)
            {
                s[j]=s[j+1];
            }
            *n=*n-1;
        }
    }
    if(m==0)
    {
        printf("没有此学生信息!\n");
    }
    else
    {
        daochu(s,*n);
        printf("删除完毕!\n");
    }
}

void allAndAver(struct student s[], int n)
{
    int i;
    double all,aver;
    for(i=0; i<n; i++)
    {
        all=s[i].math+s[i].english+s[i].chinese+s[i].program;
        aver=all/4;
        printf("%s\t\t%s\t\t%.1lf\t%.1lf\n", s[i].name, s[i].number, all, aver);
    }
}

void Fail(struct student s[], int n)
{
    int i, fail[4]= {0};
    for (i=0; i<n; i++)
    {
        if (s[i].math<60)
        {
            fail[0]++;
        }
        if (s[i].english<60)
        {
            fail[1]++;
        }
        if (s[i].chinese<60)
        {
            fail[2]++;
        }
        if (s[i].program<60)
        {
            fail[3]++;
        }
    }
    printf("\n不及格信息:\n");
    printf("数学不及格人数为:%d人\n",fail[0]);
    printf("英语不及格人数为:%d人\n",fail[1]);
    printf("语文不及格人数为:%d人\n",fail[2]);
    printf("程序不及格人数为:%d人\n",fail[3]);
}

void Max(struct student s[],int n)
{
    int i, counter[4]= {0};
    double max[4]= {s[0].math, s[0].english, s[0].chinese, s[0].program};
    for (i=0; i<n; i++)
    {
        if (s[i].math>max[0])
        {
            max[0]=s[i].math;
        }
        if (s[i].math>max[1])
        {
            max[1]=s[i].math;
        }
        if (s[i].math>max[2])
        {
            max[2]=s[i].math;
        }
        if (s[i].math>max[3])
        {
            max[3]=s[i].math;
        }
    }
    for (i=0; i<n; i++)
    {
        if (s[i].math==max[0])
        {
            counter[0]++;
        }
        if (s[i].math==max[1])
        {
            counter[1]++;
        }
        if (s[i].math==max[2])
        {
            counter[2]++;
        }
        if (s[i].math==max[3])
        {
            counter[3]++;
        }
    }
    printf("\n最高分信息:\n");
    printf("数学最高分为:%.1lf, 人数为:%d人\n", max[0], counter[0]);
    printf("英语最高分为:%.1lf, 人数为:%d人\n", max[1], counter[1]);
    printf("语文最高分为:%.1lf, 人数为:%d人\n", max[2], counter[2]);
    printf("程序最高分为:%.1lf, 人数为:%d人\n", max[3], counter[3]);
}

void Min(struct student s[],int n)
{
    int i,counter[4]= {0};
    double min[4]= {s[0].math, s[0].english, s[0].chinese, s[0].program};
    for (i=0; i<n; i++)
    {
        if (s[i].math<min[0])
        {
            min[0]=s[i].math;
        }
        if (s[i].math<min[1])
        {
            min[1]=s[i].math;
        }
        if (s[i].math<min[2])
        {
            min[2]=s[i].math;
        }
        if (s[i].math<min[3])
        {
            min[3]=s[i].math;
        }
    }
    for (i=0; i<n; i++)
    {
        if (s[i].math==min[0])
        {
            counter[0]++;
        }
        if (s[i].math==min[1])
        {
            counter[1]++;
        }
        if (s[i].math==min[2])
        {
            counter[2]++;
        }
        if (s[i].math==min[3])
        {
            counter[3]++;
        }
    }
    printf("\n最低分信息:\n");
    printf("数学最低分为:%.1lf, 人数为:%d人\n", min[0], counter[0]);
    printf("英语最低分为:%.1lf, 人数为:%d人\n", min[1], counter[1]);
    printf("语文最低分为:%.1lf, 人数为:%d人\n", min[2], counter[2]);
    printf("程序最低分为:%.1lf, 人数为:%d人\n", min[3], counter[3]);
}

void update(struct student s[], int n)
{
    char str[80];
    int m=0,i=0;
    printf("\n请输入要修改的学生的学号:");
    scanf("%s",str);

    for(i = 0; i < n;++i)
    {
        if(strcmp(s[i].number,str) == 0)
        {
            m = i;
            break;
        }
    }

    printf("\n请输入修改后的\"学号\"");
    scanf("%s",s[m].number);
    printf("\n请输入修改后的\"姓名\"");
    scanf("%s",s[m].name);
    printf("\n请输入修改后的\"数学成绩\":");
    scanf("%lf",&s[m].math );
    printf("\n请输入修改后的\"英语成绩\":");
    scanf("%lf",&s[m].english );
    printf("\n请输入修改后的\"语文成绩\":");
    scanf("%lf",&s[m].chinese );
    printf("\n请输入修改后的\"编程成绩\":");
    scanf("%lf",&s[m].program );
}

void tongji(struct student s[], int n)
{
    printf("统计信息如下:\n");
    printf("\n姓名\t\t学号\t\t总分\t平均分\n");
    allAndAver(s, n);
    Max(s, n);
    Min(s, n) ;
    Fail(s, n);
}

int main()
{
    int k,n=0;
    daoru(s,&n);
    while(1)
    {
        head();
        printf("\n请按对应的键选择相应的功能:");
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            shuru(s, &n);
            break;
        case 2:
            tongji(s, n);
            break;
        case 3:
            dayin(s, n);
            break;
        case 4:
            chazhao(s, n);
            break;
        case 5:
            paixu(s, n);
            break;
        case 6:
            shanchu(s, &n);
            break;
        case 7:
            update(s, n);
            break;
        case 8:
            daochu(s,n);
            break;
        case 0:
            exit(1);
            break;
        default :
            printf("请输入正确的命令!\n");
        }
        system("pause");
        system("cls");
    }
    return 0;
}


心得体会:

       感觉好辛苦,在看到这个程序时以为很简单就没有太在意,当真正写出来的时候发现有好多错误,感觉好悲伤,但是要有耐心,经历了半天的时间再加上舍友的帮忙终于改好了,不容易啊。在写程序是我们要有一颗卑微的心,不要太过骄傲,不懂就要问。

  • 21
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值