DAY18C语言笔记

C语言:第17天笔记

综合案例:学生成绩管理系统V2.0

综合案例:学生成绩管理系统v2.0

  • 需求:

    要求实现一个基于指针的学生成绩管理系统,具体功能如下:

    1. 添加学生信息:输入学号和三门成绩,存储到数组中。
    2. 显示所有学生信息:遍历数组,输出每个学生的学号和成绩。
    3. 计算每个学生的平均分和总分:遍历数组,计算每行的总分和平均分。
    4. 根据某科成绩排序:用户选择科目,然后按该科成绩排序,可以升序或降序。
    5. 查找学生信息:按学号查找,显示该生的成绩和平均分。
    6. 退出程序。
  • 代码:

    /*************************************************************************
      > File Name:    soresMG2.c
      > Author:       小刘
      > Description:  
      > Created Time: 2025年05月26日 星期一 13时45分38秒
     ************************************************************************/
    
    #include 
    #include 
    #include 
    
    #define MAX_STUDENT 50  // 最大学生数量
    #define COURSE_NUM 3    // 课程科目数量
    #define ID_LENGTH 4
    
    /** 函数原型声明 **/
    // 添加学生信息
    void addStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int *count);
    //显示所有记录
    void  displayAll(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count);
    // 显示统计信息
    void showStatistics(int (*scores)[COURSE_NUM],int count);
    // 成绩排序
    void sorseSorting(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count);
    // 学生查找
    void searchStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count);
    // 学号校验 1- 校验合格  0-校验不合格
    int validate(char *id);
    int main(int argc,char *argv[])
    {
        int choice;
        int studentCount = 0;
    
        char studentIds[MAX_STUDENT][ID_LENGTH];
        int scores[MAX_STUDENT][COURSE_NUM];
    
        do
        {
            // 系统菜单界面
            printf("\033[1;32m+-----------------------+\033[0m\n"); // 绿色边框 
    	    printf("\033[1;32m| \033[1;33m学生成绩管理系统 v2.0\033[1;32m |\033[0m\n"); 
    	    printf("\033[1;32m| \033[1;33m作者:小刘\033[1;32m |\033[0m\n"); 
    	    printf("\033[1;32m+-----------------------+\033[0m\n"); 
        	printf("\033[31m1. 添加学生信息\033[0m\n");
    	    printf("\033[31m2. 显示所有记录\033[0m\n"); 
    	    printf("\033[31m3. 查看统计信息\033[0m\n");
    	    printf("\033[31m4. 成绩排序\033[0m\n"); 
    	    printf("\033[31m5. 查找学生\033[0m\n"); 
    	    printf("\033[31m6. 退出系统\033[0m\n"); 
    	    printf("\n请输入您的选择: "); 
    	    scanf("%d",&choice);
            switch(choice)
            {
                case 1://
                    addStudent(scores,studentIds,&studentCount);
                    break;
                case 2:
                    displayAll(scores,studentIds,studentCount);
                    break;
                case 3:
                    showStatistics(scores,studentCount);
                    break;
                case 4:
                    sorseSorting(scores,studentIds,studentCount);
                    break;
                case 5:
                    searchStudent(scores,studentIds,studentCount);
                    break;
                case 6:
                    printf("系统已退出,感谢使用!\n");
                    break;
                default:
                    printf("无效输入,请重新选择!\n");
                
                    
            }
        }while(choice != 6);
        return 0;
    }
    
    // 查找学生
    void searchStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count)
    {
        if(count == 0)
        {
            printf("暂无学生数据!\n");
            return;
        }
        char targetID[ID_LENGTH + 1];
        printf("\n请输入要查找的学号:\n");
        scanf("%4s",targetID);
        while(getchar() != '\n');
        for (int i = 0;i < count; i++)
        {
            if(memcmp(ids[i],targetID,ID_LENGTH) == 0)
            {
                printf("找到学生记录:\n");
                printf("学号:%.4s\n",ids[i]);
                printf("成绩:China=%d Math=%d English=%d\n",scores[i][0],scores[i][1],scores[i][2]);
                return;
            }
    
        }
        printf("未找到该学号的学生记录!\n");
    }
    
    // 成绩排序
    void sorseSorting(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count)
    {
        if(count == 0)
        {
            printf("暂无学生数据!\n");
            return;
        }
        printf("%s\t%s\t%s\t\n","China","Math","English");
        for(int i = 0;i < COURSE_NUM ;i++)
        {
            for(int j = 0; j < count;j++)
            {
                for(int k = 0;k < count -j-1;k++)
                {
                if(scores[k][i] < scores[k+1][i])
                    {
                        int score = scores[k][i];
                        scores[k][i] = scores[k+1][i];
                        scores[k+1][i] = score;
                    }
                }
            }
        }
        for(int i = 0;i < count ;i++)
        {
            for(int j = 0; j < COURSE_NUM;j++)
            {
                printf("%d\t",scores[i][j]);
                
            }
            printf("\n");
        }
        printf("\n");
        
    }
    
    // 查看统计信息
    void showStatistics(int (*scores)[COURSE_NUM],int count)
    {
        if(count == 0)
        {
            printf("暂无学生数据!\n");
            return;
        }
        int courseTota[COURSE_NUM] = {0};
        int max[COURSE_NUM] = {0};
        int min[COURSE_NUM] = {100,100,100};
        for(int i = 0;i < count; i++)
        {
            for(int j = 0;j < COURSE_NUM;j++)
            {
                int score = scores[i][j];
                courseTota[j] += score;
                if(score > max[j])max[j] = score;
                if(score < min[j])min[j] = score;
            }
        }
        printf("\n---- 课程统计信息 ----\n");
        char *courses[] = {"China","Math","English"};
        for(int i = 0;i < COURSE_NUM;i++)
        {
            printf("%s:\n",courses[i]);
            printf("  平均分:%.2f\n",(float)courseTota[i] / count);
            printf("  最高分:%d\n",max[i]);
            printf("  最低分:%d\n",min[i]);
        }
    }
    
    // 显示所有记录
    void  displayAll(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int count)
    {
    	printf("\n----- 学生成绩列表 ----\n");
    	if(count == 0)
    	{
    		printf("暂无学生数据!\n");
    		return;
    	}
        printf("%s\t%s\t%s\t%s\t\n","学号","Chaina","Math","English");
        for(int i =0;i < count ; i++)
        {
            printf("%.4s\t",ids[i]);
            for(int j = 0;j < COURSE_NUM ;j++)
            {
                printf("%d\t",*(*(scores + i) + j));
            }
            printf("\n");
        }
        printf("\n");
    
    }
    
    
    
    /**
     * 添加学生信息
     */ 
    void addStudent(int (*scores)[COURSE_NUM],char (*ids)[ID_LENGTH],int *count)
    {
        // 校验存储空间是否已满
        if(*count >= MAX_STUDENT)
        {
            printf("错误信息:存储空间已满!\n");
            return;
        }
        printf("\n----- 请添加学生信息 -----\n");
    
        //创建一个数组,用来存放学生学号
        char tempId[ID_LENGTH + 1];
    
        do
        {
            printf("请输入4位学号:");
            scanf("%4s",tempId);
            while(getchar() != '\n');
        }while(!validate(tempId));
    
        // 检查序号是否已存在
        register int i;
        for(i = 0;i < *count; i++)
        {
            //使用
            if (memcmp(ids[i],tempId,ID_LENGTH) == 0)
            {
                printf("错误信息:该学号已存在!\n");
                return ;
            }
        }
        memcpy(ids[*count],tempId,ID_LENGTH);
        // 输入成绩
        printf("请输入%d门课程成绩(0~100):\n",COURSE_NUM);
        for (i = 0; i < COURSE_NUM;)
        {
            printf("课程%d:",i+1);
            int tempScore = scanf("%d",&scores[*count][i]);
            if(tempScore != 1)
            {
                printf("错误信息:成绩无效,请重新输入!\n");
                while(getchar() != '\n');
                continue;
            }
            if(scores[*count][i] < 0 || scores[*count][i] >100)
            {
                printf("错误信息:成绩无效,请重新输入!\n");
                continue;
                
            }
            i++;
        }
        (*count)++;
    
        printf("学生信息添加成功!\n");
    
    }
    
    // 校验信息
    int validate(char *id)
    {
        char *p = id;
        int len = 0;
        while(*p && len < ID_LENGTH)
        {
            if(!(*p >= '0' && *p <= '9'))
            {
                printf("学号必须为数字!\n");
                return 0;
            }
            p++;
            len++;
        }
        // 校验输入的长度
        if(len != ID_LENGTH || *p != '\0')
        {
            printf("学号必须为4位!");
            return 0;
        }
        return 1;
    }
    

你可能感兴趣的:(嵌入式开发学习,C语言基础,c语言,笔记,算法)