C语言 学生管理系统 小项目

背景

帮一个学生写的课程设计,支持文件读写,支持自动读取文件数据代替手动输入测试数据。

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

int StuNum; //学生人数,可以改
#define StuPrj 3//课程数,可以改
#define  MAX 100

double EnlishAVE;
double MathAVE;
double ChineseAVE;

typedef struct student
{
    int studentID;
    int ClassId;
    char studentName[20];
    char stuSex[10]; //man or woman
    int EnlishSco;//英语分数
    int MathSco;//数学分数
    int ChineseSco;//语文分数
    double stuAVE;//平均分
    int AllSco;

}STU;


STU stu[MAX];

//统计每个学生的平均成绩
void CalcuStuAVE()
{
    for (int i = 0; i < StuNum; i++) {
        stu[i].AllSco = stu[i].ChineseSco + stu[i].MathSco + stu[i].EnlishSco;
        stu[i].stuAVE = stu[i].AllSco/StuPrj;
    }
}


void CalcuProACE()
{
    int ToEn = 0, ToMa = 0, ToCh = 0;
    for (int i = 0; i < StuNum; i++) {
        ToEn += stu[i].EnlishSco;
        ToMa += stu[i].MathSco;
        ToCh += stu[i].ChineseSco;
    }
    EnlishAVE = ToEn/StuNum;
    MathAVE = ToMa/StuNum;
    ChineseAVE = ToCh/StuNum;
}


//数据输入
void Input()
{
    FILE *fp;
    fp=fopen("olddata.txt","w");
    if(fp==NULL) {
        printf("不能打开文件\n");
    }

    fprintf(fp,"%d\n",StuNum);

    int i, j;
    for(i = 0; i< StuNum; i++) {
        printf("输入第%d个学生的学号: ", i+1);
        scanf("%d",&stu[i].studentID);
        fprintf(fp,"%d\n",stu[i].studentID);

        printf("输入此学生姓名: ");
        scanf("%s",stu[i].studentName);
        fprintf(fp,"%s\n",stu[i].studentName);

        printf("输入此学生性别: ");
        scanf("%s",stu[i].stuSex);
        fprintf(fp,"%s\n",stu[i].stuSex);

        printf("输入此学生英语成绩: ");
        scanf("%d",&stu[i].EnlishSco);
        fprintf(fp,"%d\n",stu[i].EnlishSco);

        printf("输入此学生数学成绩: ");
        scanf("%d",&stu[i].MathSco);
        fprintf(fp,"%d\n",stu[i].MathSco);

        printf("输入此学生语文成绩: ");
        scanf("%d",&stu[i].ChineseSco);
        fprintf(fp,"%d\n",stu[i].ChineseSco);

        printf("输入此学生班级 :");
        scanf("%d",&stu[i].ClassId);
        fprintf(fp,"%d\n",stu[i].ClassId);

    }
    fclose(fp); 
    CalcuProACE();
    CalcuStuAVE();
}

void SecondRead()
{
    FILE *fp;
    fp=fopen("olddata.txt","r"); 
    if(fp==NULL) {  
        return;
    }  
    int conutSum = 0;

    fscanf(fp,"%d",&conutSum); 
    StuNum = conutSum;
    for(int i = 0;i < StuNum;i++) {  
        fscanf(fp,"%d", &stu[i].studentID); 
        fscanf(fp,"%s", stu[i].studentName); 
        fscanf(fp,"%s", stu[i].stuSex); 
        fscanf(fp,"%d", &stu[i].EnlishSco); 
        fscanf(fp,"%d", &stu[i].MathSco); 
        fscanf(fp,"%d", &stu[i].ChineseSco); 
        fscanf(fp,"%d", &stu[i].ClassId); 
    }  
    CalcuProACE();
    CalcuStuAVE();

}

//数据修改,通过学号修改学生信息
void ModifyInfo()
{
    //1 修改 0不修改
    int Id;
    int flag = 0;
    int i;
    while(1){
        printf("是否需要修改学号:");
        scanf("%d", &flag);
        if(flag ==0) {
            break;
        }
        else {
            flag = 0;
        }

        printf("输入需要修改的学号: ");
        scanf("%d", &Id);
        for (i = 0; i < StuNum; i++) {
            if (stu[i].studentID == Id) {
                flag = 1;
                break;;
            }
        }
        if (flag == 0) {
            printf("学号不存在\n");
            continue;
        }
        flag = 0;

        printf("姓名是否需要修改:");
        scanf("%d", &flag);
        if(flag ==1) {
            printf("输入修改后姓名 ");
            scanf("%s",stu[i].studentName);
        }

        flag = 0;
        printf("姓别是否需要修改:");
        scanf("%d", &flag);
        if(flag == 1) {
            printf("输入修改后姓别 ");
            scanf("%s",stu[i].stuSex);
        }

        flag = 0;
        printf("英语成绩是否需要修改:");
        scanf("%d", &flag);
        if(flag == 1) {
            printf("输入修改后的英语成绩 ");
            scanf("%d",&stu[i].EnlishSco);
        }

        flag = 0;
        printf("数学成绩是否需要修改:");
        scanf("%d", &flag);
        if(flag == 1) {
            printf("输入修改后的数学成绩 ");
            scanf("%d",&stu[i].MathSco);
        }

        flag = 0;
        printf("语文成绩是否需要修改:");
        scanf("%d", &flag);
        if(flag ==1) {
            printf("输入修改后的语文成绩 ");
            scanf("%d",&stu[i].ChineseSco);
        }

        flag = 0;
        printf("班级是否需要修改:");
        scanf("%d", &flag);
        if(flag ==1) {
            printf("输入修改后的班级 ");
            scanf("%d",&stu[i].ClassId);
        }

        flag = 0;
        printf("是否需要继续修改学号:");
        scanf("%d", &flag);
        if(flag ==0) {
            break;
        }
        else {
            flag = 0;
            continue;
        }
    }
}


//排序,按学号从小到大排序

void Sortinfo()
{
    struct student t;
    for(int i = 1; i < StuNum; i++) {
        for(int j = 0;j < StuNum - i; j++) {
            if(stu[j].studentID > stu[j+1].studentID) {
                t = stu[j];
                stu[j] = stu[j+1];
                stu[j+1] = t;
            }
        }
    }
}

//查询,按学号查询输出成绩
void QueryInfo()
{
    int Id;
    int flag = 0;
    printf("请输入待查找的学生学号:");
    scanf("%d",&Id);
    for (int i = 0; i < StuNum; i++) {
        if (Id == stu[i].studentID) {
            printf("\n学号\t姓名\t性别\t班级\t数学\t英语\t语文\t总成绩\t平均分\n");
            printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%lf\n",stu[i].studentID,stu[i].studentName,stu[i].stuSex,stu[i].ClassId
                , stu[i].MathSco,stu[i].EnlishSco,stu[i].ChineseSco,stu[i].AllSco, stu[i].stuAVE);
            printf("打印出查找结果!\n");
            flag = 1;
            break;
        }
    }
}


void Studelete()
{
    int Id;
    int result;
    printf("请输入待删除的学生学号:");
    scanf("%d",&Id);
    result= -1;
    for (int i = 0; i< StuNum; ++i) {
        if (Id == stu[i].studentID){
            result = i;
            break;
        }
    }

    if (result == -1) {
        printf("没有该学生信息!\n");
    }
    else {    //删除当前学生信息即为将数组从result的位置依次前挪一个位置 
        for(int i = result; i < StuNum - 1; ++i) {  //最后在main函数中,要将n的值减1 
            stu[i].studentID = stu[i+1].studentID; 
            strcpy(stu[i].studentName,stu[i+1].studentName); 
            stu[i].MathSco = stu[i+1].MathSco; 
            stu[i].EnlishSco = stu[i+1].EnlishSco; 
            stu[i].ChineseSco = stu[i+1].ChineseSco; 
            stu[i].AllSco = stu[i+1].AllSco;
            stu[i].stuAVE = stu[i+1].stuAVE;
        } 

    }
    StuNum = StuNum - 1;
}

void Print()
{
    int i;
    printf("\n学号\t姓名\t性别\t班级\t数学\t英语\t语文\t总成绩\t平均分\n");
    printf("----------------------------------------------------------\n");

    for(i = 0; i< StuNum; i++) {
        printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%lf\n",stu[i].studentID,stu[i].studentName,stu[i].stuSex,stu[i].ClassId
            , stu[i].MathSco,stu[i].EnlishSco,stu[i].ChineseSco,stu[i].AllSco, stu[i].stuAVE);
    }
    printf("-------------------------------------------------------\n");

}

void PreserData()
{
    FILE *fp;
    fp=fopen("newdata.txt","w");
    if(fp==NULL) {
        printf("不能打开文件\n");
    }

    int i;
    for(i = 0; i< StuNum; i++) {
        //printf("保存第%d个学生的学号: ", i+1);
        fprintf(fp,"%d",stu[i].studentID);

        //printf("保存此学生姓名: ");
        fprintf(fp,"%s\n",stu[i].studentName);

        //printf("保存此学生性别: ");
        fprintf(fp,"%s\n",stu[i].stuSex);

        //printf("保存此学生英语成绩: ");
        fprintf(fp,"%d\n",stu[i].EnlishSco);

        //printf("保存此学生数学成绩: ");
        fprintf(fp,"%d\n",stu[i].MathSco);

        //printf("保存此学生语文成绩: ");
        fprintf(fp,"%d\n",stu[i].ChineseSco);

        //printf("保存此学生班级 :");
        fprintf(fp,"%d\n",stu[i].ClassId);

        //printf("保存此学生平均成绩 :");
        fprintf(fp,"%d\n",stu[i].stuAVE);

    }
    fclose(fp); 
}

int main()
{
    int flag;

    SecondRead();
    while(1) {
        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("[9] 退出程序\n");
        printf("请输入您的选择(1 - 9):");
        scanf("%d",&flag);
        printf("**************************************)\n");

        switch (flag) {
    case 1://录入;
        printf("请输入学生个数: ");
        scanf("%d",&StuNum); 
        Input();
        break;

    case 2://输出;
        Print();
        break;

    case 3://根据学号可以修改学生信息
        ModifyInfo();
        break;

    case 4://按学号排序
        Sortinfo();
        break;

    case 5://按学号查询学生成绩 
        QueryInfo();
        break;

    case 6://统计学生平均学生成绩和课程平均 
        CalcuProACE();
        CalcuStuAVE();
        break;
    case 7://按学号删除某个学生信息
        Studelete();
        break;
    case 8://将数据存在文件中
        PreserData();
        break;

    case 9://退出程序 
        printf("退出程序\n");
        printf("程序结束,谢谢使用!\n");
        exit(0);
    default:
        printf("您输入的菜单有误。请重新输入!\n");

        }
    }
    return 0;
}

以上,欢迎留言交流~

猜你喜欢

转载自blog.csdn.net/breakpoints_/article/details/80709703