精华内容
下载资源
问答
  • C语言编程 学生成绩管理系统 适用于初学者借鉴学习 代码清析
  • printf(" 欢迎进入学生成绩管理系统\n"); printf("1数据输入 2数据显示\n"); printf("3数据删除 4数据排序\n"); printf("5数据保存 6数据调入\n"); printf("7退出系统\n"); printf("请选择功能号(1,2,3,4...

    目录

    一、概要分析

    1、需求分析

    2、系统功能

    二、模型设计

    三、模块设计

    1、ScoreManageMain.cpp文件

    2、Menu.cpp文件

    3、Menu.h文件

    4、ScoreManager.cpp文件

    5、ScoreManager.h文件

    四、数据预测

    五、总结思考

    1、结果分析

    2、思路梳理

    3、深入研究


    一、概要分析

    1、需求分析

    由于进入了信息化时代,如何更有效地对学生的成绩进行管理显得越来越重要。为了更好地对学生成绩进行管理,编写了本次系统,利用c语言完成输入录入、数据显示、数据删除、数据排序、数据保存、数据调入功能,极大地便利了教师对学生成绩的管理。

    2、系统功能

    可实现数据录入、数据显示、数据删除、数据排序、数据保存、数据调入。

    二、模型设计

     

    三、模块设计

    1、ScoreManageMain.cpp文件

    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include<stdlib.h>
    #include<stdio.h>
    #include"Menu.h"
    #include"Score.h"
    #include"ScoreManager.h"
    
    #define N 40
    

    主模块main()

    ①模块功能:通过调用菜单模块选择对应的程序执行。

    ②输入输出:

     

    形式:int main()

    归属:ScoreManageMain

    ③解决思路:先调用菜单模块输出菜单,然后输入数据选择对应程序,最后调用程序所对应的自定义模块。

    ④算法步骤:

    ⑤模块代码:

    int main()
    {
    	Score s[N];
    	int num = 0;
    
    	while (1)
    	{
    		switch (createMenu())
    		{
    		case 1:inputScore(s, N, &num); break;
    		case 2:displayScore(s, N, num); break;
    		case 3:delScore(s, N, &num); break;
    		case 4:sortScore(s, N, num); break;
    		case 5:saveScore(s, N, num); break;
    		case 6:loadScore(s, N,&num); break;
    		case 7:exit(0);
    		default:printf("输入错误\n");
    		}
    	}
    
    	return 0;
    }

    2、Menu.cpp文件

    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include<stdio.h>
    

    自定义模块createMenu

    ①模块功能:显示菜单界面,并返回所选择的功能编号。

    ②输入输出:

    ③解决思路:首先利用printf显示出对应界面,输入序号后返回输入的序号。

    ④算法步骤:

    第一步:显示出程序界面。

    第二步:输入选择程序的序号。

    第三步:返回所选择的序号值。

    ⑤模块代码:

    int createMenu()
    {
    	int input;
    
    	printf("     欢迎进入学生成绩管理系统\n");
    	printf("1数据输入              2数据显示\n");
    	printf("3数据删除              4数据排序\n");
    	printf("5数据保存              6数据调入\n");
    	printf("7退出系统\n");
    	printf("请选择功能号(1,2,3,4,5,6,7)\n");
    	scanf("%d", &input);
    
    	return input;
    }

    3、Menu.h文件

    #ifndef Menu_h
    #define Menu_h
    
    int createMenu();
    
    #endif

    4、ScoreManager.cpp文件

    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include<stdio.h>
    #include<string.h>
    #include<errno.h>
    #include"Score.h"

    (1)自定义模块inputScore

    ①模块功能:录入成绩。

    ②输入输出:

     

    形式:void inputScore(Score *psc, int n,int *pnum)

    归属:ScoreManager

    ③解决思路:利用死循环不断输入数据,当输入-1或数组存放满时停止。

    ④算法步骤:

    ⑤模块代码:

    void inputScore(Score *psc, int n,int *pnum)
    {
    	if (*pnum == n)
    	{
    		printf("对不起,人数已满");
    	}
    	else
    	{
    		while (1)
    		{
    			int input;
    			printf("请输入第%d个学号、成绩、姓名(-1停止输入):", *pnum + 1);
    			scanf("%d", &input);
    			if (input == -1)
    			{
    				break;
    			}
    			else
    			{
    				scanf("%f%s", &psc[*pnum].score, &psc[*pnum].name);
    				psc[*pnum].no = input;
    			}
    			(*pnum)++;
    		}
    	}
    }

    (2)自定义模块 displayScore

    ①模块功能:显示成绩。

    ②输入输出:

    ③解决思路:利用for循环,有显示所有已存入的数据,即需要循环n次,循环次数小于n为循环条件。每次都显示次数所对应的数据值。

    ④算法步骤:

    ⑤模块代码:

    void displayScore(Score* psc, int n, int num)
    {
    	printf("\t学生的分数显示结果如下:\n");
    	printf("\t***********************\n");
    	printf("\t学号\t分数\t姓名\n");
    
    	for (int i = 0; i < num; i++)
    	{
    		printf("\t%d\t%.2f\t%s\n", psc[i].no, psc[i].score, psc[i].name);
    	}
    
    	float sum = 0;
    
    	for (int i = 0; i < num; i++)
    	{
    		sum = sum + psc[i].score;
    	}
    
    	printf("\t班级平均分:%.2f\n", sum / num);
    	printf("\t学生分数显示结束\n");
    }

    (3)自定义模块 delScore

    ①模块功能:删除所选序号的数据。

    ②输入输出:

    ③解决思路:通过利用循环,将目标数据之后的数据前移完成。

    ④算法步骤:

    ⑤模块代码:

    void delScore(Score* psc, int n, int* pnum)
    {
    	int No;
    	char choice;
    	int k;
    	
    	while (getchar(),printf("还要删除数据吗?(y/n)\n"),scanf("%c", &choice), choice == 'y')
    	{
    		printf("请输入要删除信息的学号>");
    		scanf("%d", &No);
    		for (k = 1; k <= *pnum; k++)
    		{
    			if (psc->no == No);
    			{
    				break;
    			}
    		}
    		for (int i = k; i <= *pnum; i++)
    		{
    			psc[i] = psc[i+1];
    		}
    		
    		(*pnum)--;
    	}
    }

    (4)自定义模块sortScore

    ①模块功能:对输入数据进行排序。

    ②输入输出:

    ③解决思路:比较相邻数字的大小,大的沉下去,小的浮上来,每轮都保证最大数在最后。

    ④算法步骤:

    ⑤模块代码:

    void sortScore(Score* psc, int n,int num)
    {
    	for (int i = 1; i < num; i++)
    	{
    		for (int j = 0; j < num - i; j++)
    		{
    			if (psc[j].score > psc[j + 1].score)
    			{
    				Score tmp;
    				tmp = psc[j];
    				psc[j] = psc[j + 1];
    				psc[j + 1] = tmp;
    			}
    		}
    	}
    	printf("排序成功\n");
    }

    (5)自定义模块saveScore

    ①模块功能:输入数据到文件中。

    ②输入输出:

    ③解决思路:使用文件操作函数。

    ④算法步骤:

    第一步:定义文件指针;

    第二步:打开文件,关联文件指针;

    第三步:输入数据;

    第四步:关闭文件

    ⑤模块代码:

    void saveScore(Score* psc, int n, int num)
    {
    	FILE* pWrite = fopen("score.txt","wb");
    	if (pWrite == NULL)//打开失败
    	{
    		printf("%s\n", strerror(errno));
    	}
    	else//打开成功
    	{
    		int i = 0;
    		fwrite((void*)psc, sizeof(struct Score), num, pWrite);
    		fclose(pWrite);//关闭文件
    		pWrite = NULL;
    	}
    }

    (6)自定义模块loadScore

    ①模块功能:读取数据到结构体数组中。

    ②输入输出:

    ③解决思路:使用文件操作函数。

    ④算法步骤:

    第一步:定义文件指针;

    第二步:打开文件,关联文件指针;

    第三步:利用循环读取数据;

    第四步:关闭文件

    ⑤模块代码:

    void loadScore(Score* psc, int n, int* pnum)
    {
    	FILE* pRead = fopen("score.txt", "rb");
    	if (pRead == NULL)//打开失败
    	{
    		printf("%s\n", strerror(errno));
    	}
    	else//打开成功
    	{
    		int i = 0;
    		while (1)
    		{
    			if (fread((void*)&psc[i], sizeof(struct Score), 1, pRead) != 1)
    			{
    				break;
    			}
    			i++;
    		}
    		*pnum = i;
    		fclose(pRead);//关闭文件
    		pRead = NULL;
    	}
    }

    5、ScoreManager.h文件

    #pragma once
    #ifndef ScoreManager_h
    #define ScoreManager_h
    
    void inputScore(Score* psc, int n, int* pnum);
    void displayScore(Score* psc, int n, int num);
    void delScore(Score* psc, int n, int* pnum);
    void sortScore(Score* psc, int n, int num);
    void saveScore(Score* psc, int n, int num);
    void loadScore(Score* psc, int n, int* pnum);
    
    #endif

    四、数据预测

    输入学号、成绩和姓名1024 88 zhangshan1025 54 lisi1026 66 wanwu

    显示学号、成绩和姓名1024 88 zhangshan1025 54 lisi1026 66 wanwu

    排序后显示学号、成绩和姓名1025 54 lisi1026 66 wanwu1024 88 zhangshan

    再删除1025后显示数据 1026 66 wanwu1024 88 zhangshan

    保存数据、读取数据后显示1026 66 wanwu1024 88 zhangshan

    五、总结思考

    1、结果分析

    结果与预测相符合,达到预期效果,程序正确。

    2、思路梳理

    一:启动菜单界面。

    二:输入一个整数选择功能

    三:通过switch进入所选择的功能模块,调用对应的自定义模块。

    3、深入研究

    每次录入完数据都需要而外选择数据保存,这样的操作步骤有些繁琐,可以将数据保存添加进数据录入模块,使得操作变得便捷。

    直接在输入模块的最后调用数据保存模块即可,代码如下:

    void inputScore(Score *psc, int n,int *pnum)
    {
    	if (*pnum == n)
    	{
    		printf("对不起,人数已满");
    	}
    	else
    	{
    		while (1)
    		{
    			int input;
    			printf("请输入第%d个学号、成绩、姓名(-1停止输入):", *pnum + 1);
    			scanf("%d", &input);
    			if (input == -1)
    			{
    				break;
    			}
    			else
    			{
    				scanf("%f%s", &psc[*pnum].score, &psc[*pnum].name);
    				psc[*pnum].no = input;
    			}
    			(*pnum)++;
    		}
    		saveScore(psc, n, *pnum);
    	}
    }

     

    展开全文
  • C语言编程学生成绩管理系统,进行学号、姓名、成绩的读入,排序,交换,读写的功能,是高校C语言学习中的常见题型
  • 自己的C语言期末考核,做得不是很好,没什么时间去修改。 希望能帮助到你。里面附带我的讲解。
  • 学生成绩管理系统进一步加深对C语言课程内容的理解,初步掌握一般应用程序的开发方法和步骤,进一步了解与掌握C语言编程方法和技巧
  • 创新创业实践报告 杭州电子科技大学信息工程学院 创新创业实践报告 创新创业实践报告 第 第 PAGE 1 页 共 NUMPAGES 19 页 第 第 PAGE 3 页 共 NUMPAGES 19 页 实践项目名称 学生成绩管理系统 实践项目的目的 锻炼...
  • C语言简易学生成绩管理系统

    千次阅读 多人点赞 2020-03-30 10:36:13
    某班有最多不超过30人(具体人数由键盘输入)参加某门课程的考试,编程实现如下学生成绩管理: (1)录入每个学生的学号和考试成绩; (2)计算课程的总分和平均分; (3)按成绩由高到低排出名次表; (4)按学号由...

    某班有最多不超过30人(具体人数由键盘输入)参加某门课程的考试,编程实现如下学生成绩管理:
    (1)录入每个学生的学号和考试成绩;
    (2)计算课程的总分和平均分;
    (3)按成绩由高到低排出名次表;
    (4)按学号由小到大排出成绩表;
    (5)按学号查询学生排名及其考试成绩;
    (6)按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比;
    (7)输出每个学生的学号、考试成绩,以及课程总分和平均分。

    输入格式:
    ( 1 ) 录入学生的人数:
    要求输入数据格式为:"%d"
    提示信息为:“Input student number(n<30):\n”
    ( 2 )录入每个学生的学号和考试成绩:
    要求输入数据格式为:"%ld%f"
    提示信息为:“Input student’s ID and score:\n”

    输出格式:

    1、菜单项的输出显示:
    Management for Students’ scores
    1.Input record
    2.Calculate total and average score of course
    3.Sort in descending order by score
    4.Sort in ascending order by number
    5.Search by number
    6.Statistic analysis
    7.List record
    0.Exit
    Please Input your choice:

    2、计算课程的总分和平均分:
    要求输出总分与平均分格式为:“sum=%.0f,aver=%.2f\n”
    3、按成绩由高到低排出名次表:
    要求输出格式为:"%ld\t%.0f\n"
    提示信息为:“Sort in descending order by score:\n”
    4、按学号由小到大排出成绩表:
    要求输出格式为:"%ld\t%.0f\n"
    提示信息为:“Sort in ascending order by number:\n”
    5、按学号查询学生信息及其考试成绩(输出学号与成绩):
    如果未查到此学号的学生,提示信息为:“Not found!\n”;
    如果查询到该学生,要求输出格式为:"%ld\t%.0f\n"
    6、按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比:
    成绩<60输出提示格式为:"<60\t%d\t%.2f%%\n";
    成绩=100输出格式为:"%d\t%d\t%.2f%%\n";
    其他要求输出百分比格式为:"%d-%d\t%d\t%.2f%%\n"

    演示效果:
    在这里插入图片描述
    在这里插入图片描述

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    
    //宏定义最大学生人数
    #define stu_max 30
    
    /*进行函数的全局声明*/
    
    //获取学生人数
    int stu_num();
    //显示菜单获取用户输入
    char menu_tips();
    //获取学生学号,及本门考试成绩
    void stu_information(long num[],float score[],int n);
    //计算输出课程的总分和平均分
    void sum_aver(float score[],int n);
    //模块功能:交换两个长整型数据
    void exchange_long(long *a,long *b);
    //模块功能:交换两个浮点型数据
    void exchange_float(float *a,float *b);
    //按成绩由高到低输出名次表
    void output_score(long num[],float score[],int n);
    //按学号从小到大排出成绩表
    void output_num(long num[],float score[],int n);
    //查询输出学生信息及考试成绩:
    void query(long num[],float score[],int n);
    //分数划界处理并输出
    void score_pro(float score[],int n);
    //直接输出对应列表
    void output(long num[],float score[],int n);
    //暂停清屏
    void clean();
    
    int main()
    {
        int n,i;
        long num[stu_max];
        float score[stu_max];
        n=stu_num();
        while(1)
        {
            i=menu_tips();
            switch(i)
            {
                case '1':printf("1"),stu_information(num,score,n),system("cls");break;
                case '2':printf("2"),sum_aver(score,n),clean();break;
                case '3':printf("3"),output_score(num,score,n),clean();break;
                case '4':printf("4"),output_num(num,score,n),clean();break;
                case '5':printf("5"),query(num,score,n),clean();break;
                case '6':printf("6"),score_pro(score,n),clean();break;
                case '7':printf("7"),output(num,score,n),clean();break;
                case '0':printf("0"),exit(0);break;
                default:printf("Input error!\n"),clean();
            }
        }
    }
    
    /*以下为函数功能模块*/
    
    //获取学生人数
    int stu_num()
    {
        int n;
        printf("Input student number(n<30):\n");
        scanf("%d",&n);
        system("cls");
        return n;
    }
    
    //显示菜单获取用户输入
    char menu_tips()
    {
        printf(" -----------------------------------------------------------\n");
        printf("|              Management for Students' scores              |\n");
        printf(" -----------------------------------------------------------\n");
        printf("|       1.Input record                                      |\n");
        printf("|       2.Calculate total and average score of course       |\n");
        printf("|       3.Sort in descending order by score                 |\n");
        printf("|       4.Sort in ascending order by numbe                  |\n");
        printf("|       5.Search by number                                  |\n");
        printf("|       6.Statistic analysis                                |\n");
        printf("|       7.List record                                       |\n");
        printf("|       0.Exit                                              |\n");
        printf(" -----------------------------------------------------------\n");
        printf("\nPlease Input your choice:\n");
        char i;
        i=getch();
        return i;
    }
    
    //获取学生学号,及本门考试成绩
    void stu_information(long num[],float score[],int n)
    {
        int i;
        printf("\nInput student's ID and score:\n");
        for(i=0;i<n;i++)
            scanf("%ld%f",&num[i],&score[i]);
    }
    
    //计算输出课程的总分和平均分
    void sum_aver(float score[],int n)
    {
        int i;
        float sum,aver;
        for(i=0,sum=0;i<n;i++)
            sum+=score[i];
        aver=sum/n;
        printf("\nsum=%.0f,aver=%.2f\n",sum,aver);
    }
    
    //模块功能:交换两个长整型数据
    void exchange_long(long *a,long *b)
    {
        long t;
        t=*a;
        *a=*b;
        *b=t;
    }
    
    //模块功能:交换两个浮点型数据
    void exchange_float(float *a,float *b)
    {
        float t;
        t=*a; *a=*b; *b=t;
    }
    
    //按成绩由高到低输出名次表
    void output_score(long num[],float score[],int n)
    {
        int i,j;
        for(j=n-1;j>0;j--)
        {
            for(i=0;i<j;i++)
                if(score[i]<score[i+1])
            {
                exchange_float(&score[i],&score[i+1]);
                exchange_long(&num[i],&num[i+1]);
            }
        }
        printf("\nSort in descending order by score:");
        output(num,score,n);
    }
    
    //按学号从小到大排出成绩表
    void output_num(long num[],float score[],int n)
    {
        int i,j;
        for(j=n-1;j>0;j--)
        {
            for(i=0;i<j;i++)
                if(num[i]>num[i+1])
            {
                exchange_float(&score[i],&score[i+1]);
                exchange_long(&num[i],&num[i+1]);
            }
        }
        output(num,score,n);
    }
    
    //查询输出学生信息及考试成绩:
    void query(long num[],float score[],int n)
    {
        printf("\nEnter the ID to query:\n");
        long temp;
        scanf("%ld",&temp);
        int i;
        for(i=0;i<n;i++)
        {
            if(num[i]==temp)
            {
                printf("%ld\t%.0f\n",num[i],score[i]);
                return;
            }
        }
        printf("\nNot found!\n");
    }
    
    //分数划界处理并输出
    void score_pro(float score[],int n)
    {
        int t[6]={0,0,0,0,0,0};
        /*前五个分别对应优秀、良好、中等、及格、不及格五个类别
        第六位存储100分的人数*/
        int i,m;
        for(i=0;i<n;i++)
        {
            if(score[i]>=90&&score[i]<100) t[0]++;
            if(score[i]>=80&&score[i]<=89) t[1]++;
            if(score[i]>=70&&score[i]<=79) t[2]++;
            if(score[i]>=60&&score[i]<=69) t[3]++;
            if(score[i]>=0 &&score[i]<=59) t[4]++;
            if(score[i]==100)              t[5]++;
        }
    
        //遍历t数组,输出对应的数据
        for(i=0,m=9;i<6;i++)
        {
            if(i==4)
                printf("<60\t%d\t%.2f%%\n",t[4],(float)t[4]/n*100);
            if(i==5)
                printf("%d\t%d\t%.2f%%\n",100,t[5],(float)t[5]/n*100);
            if(i!=4&&i!=5)
            {
                if(i==0)
                    printf("\n");
                printf("%d-%d\t%d\t%.2f%%\n",m*10,m*10+9,t[i],(float)t[i]/n*100);
                m--;
            }
        }
    }
    
    //直接输出对应列表
    void output(long num[],float score[],int n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            if(i==0)
                printf("\n");
            printf("%ld\t%.0f\n",num[i],score[i]);
        }
    }
    
    //暂停清屏
    void clean()
    {
        system("pause");
        system("cls");
    }
    
    
    展开全文
  • 用C编写的系统程序,有十个功能,可实现成绩查询,修改,排序,退出等功能
  • 某班有最多不超过30人(具体人数由键盘输入)参加数学、语文、英语考试,编程实现如下菜单驱动的学生成绩管理系统: 1)录入学生信息,包括学号、姓名、数学分数、语文分数、英语分数; 2)计算3门课程的总分以及...

    本人软工学生一枚,学艺不精。有不足之处请谅解 ^ _ ^
    有什么问题还希望您能多批评指正,不吝指教。
    蟹蟹你来看鸭~~

    1.问题描述

    某班有最多不超过30人(具体人数由键盘输入)参加数学、语文、英语考试,编程实现如下菜单驱动的学生成绩管理系统:
    1)录入学生信息,包括学号、姓名、数学分数、语文分数、英语分数;
    2)计算3门课程的总分以及平均分;
    3)按学生成绩排序(需要2级子菜单:按什么成绩排升序还是降序);
    4)按学号升序排列;
    5)按姓名字典序排列;
    6)按学号查询学生信息;
    7)按姓名查询学生信息;
    8)按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比(需要子菜单:按什么成绩统计);
    9)输出所有学生的学号、姓名、数学分数、语文分数、英语分数、总分、平均分。

    涉及到的知识

    计数控制的循环、条件控制的循环以及循环嵌套。
    一维数组、二维数组作为函数参数。
    字符串处理函数、字符串处理操作。

    2.上代码

    #include "string.h"
    #include "stdio.h"
    void rank(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	int i, j, k;
    	float temp1;
    	long long temp2;
    	char temp[10];
    	for (i = 0; i < n - 1; i++)
    	{
    		k = i;
    		for (j = i + 1; j < n; j++)
    		{
    			if (score[j][3] > score[k][3])
    				k = j;
    		}
    		if (k != i)
    		{
    			for (int t = 0; t <= 3; t++)
    			{
    				temp1 = score[k][t];
    				score[k][t] = score[i][t];
    				score[i][t] = temp1;
    
    			}
    			temp2 = STU_ID[k];
    			STU_ID[k] = STU_ID[i];
    			STU_ID[i] = temp2;
    			strcpy(temp, name[k]);
    			strcpy(name[k], name[i]);
    			strcpy(name[i], temp);
    		}
    	}
    }
    void fun1(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	float a;
    	printf("Input student's ID and name ,math,chinese,english score:\n");
    	for (int i = 0; i < n; i++)
    	{
    		score[i][3] = 0;
    		scanf("%lld", &STU_ID[i]);
    		scanf("%s", name[i]);
    		for (int j = 0; j < 3; j++)
    		{
    			scanf("%f", &a);
    			while (a < 0 || a>100)
    			{
    				printf("输入错误!请输入正确的分数0-100\n");
    				scanf("%f", &a);
    			}
    			score[i][j] = a;
    			score[i][3] = score[i][3] + score[i][j];
    		}
    	}
    }
    void fun2(float score[][4], float sum[], float aver[], int n)
    {
    	for (int j = 0; j < 3; j++)
    	{
    		sum[j] = 0;
    		for (int i = 0; i < n; i++)
    		{
    			sum[j] = sum[j] + score[i][j];
    		}
    		aver[j] = sum[j] / n;
    		printf("course%d:sum=%.0f,aver=%.0f\n", j + 1, sum[j], aver[j]);
    	}
    
    }
    void fun3(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	int i, j, k;
    	float temp1;
    	long long temp2;
    	char temp[10];
    	for (i = 0; i < n - 1; i++)
    	{
    		k = i;
    		for (j = i + 1; j < n; j++)
    		{
    			if (score[j][3] > score[k][3])
    				k = j;
    		}
    		if (k != i)
    		{
    			for (int t = 0; t <= 3; t++)
    			{
    				temp1 = score[k][t];
    				score[k][t] = score[i][t];
    				score[i][t] = temp1;
    
    			}
    			temp2 = STU_ID[k];
    			STU_ID[k] = STU_ID[i];
    			STU_ID[i] = temp2;
    			strcpy(temp, name[k]);
    			strcpy(name[k], name[i]);
    			strcpy(name[i], temp);
    		}
    	}
    	printf("总分排名\n\n");
    	printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\t排名\n");
    	for (i = 0; i < n; i++)
    	{
    		printf("%lld\t", STU_ID[i]);
    		printf("%s\t", name[i]);
    		for (int t = 0; t <= 3; t++)
    		{
    			printf("%.0f\t", score[i][t]);
    		}
    		printf("%.0f\t", score[i][3] / 3);
    		printf("%d\n", i + 1);
    	}
    
    }
    void fun_3(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    
    	int i, j, k;
    	float temp1;
    	long long temp2;
    	char temp[10];
    	for (i = 0; i < n - 1; i++)
    	{
    		k = i;
    		for (j = i + 1; j < n; j++)
    		{
    			if (score[j][3] < score[k][3])
    				k = j;
    		}
    		if (k != i)
    		{
    			for (int t = 0; t <= 3; t++)
    			{
    				temp1 = score[k][t];
    				score[k][t] = score[i][t];
    				score[i][t] = temp1;
    
    			}
    			temp2 = STU_ID[k];
    			STU_ID[k] = STU_ID[i];
    			STU_ID[i] = temp2;
    			strcpy(temp, name[k]);
    			strcpy(name[k], name[i]);
    			strcpy(name[i], temp);
    		}
    	}
    	printf("总分逆向排名\n\n");
    	printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\t排名\n");
    	for (i = 0; i < n; i++)
    	{
    		printf("%lld\t", STU_ID[i]);
    		printf("%s\t", name[i]);
    		for (int t = 0; t <= 3; t++)
    		{
    			printf("%.0f\t", score[i][t]);
    		}
    		printf("%.0f\t", score[i][3] / 3);
    		printf("%d\n",n-i);
    	}
    
    }
    void fun4(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	int i, j, k;
    	float temp1;
    	long long temp2;
    	char temp[10];
    	for (i = 0; i < n - 1; i++)
    	{
    		k = i;
    		for (j = i + 1; j < n; j++)
    		{
    			if (STU_ID[j] < STU_ID[k])
    				k = j;
    		}
    		if (k != i)
    		{
    			for (int t = 0; t <= 3; t++)
    			{
    				temp1 = score[k][t];
    				score[k][t] = score[i][t];
    				score[i][t] = temp1;
    
    			}
    			temp2 = STU_ID[k];
    			STU_ID[k] = STU_ID[i];
    			STU_ID[i] = temp2;
    			strcpy(temp, name[k]);
    			strcpy(name[k], name[i]);
    			strcpy(name[i], temp);
    		}
    	}
    	printf("学号排名\n\n");
    	printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\n");
    	for (i = 0; i < n; i++)
    	{
    		printf("%lld\t", STU_ID[i]);
    		printf("%s\t", name[i]);
    		for (int t = 0; t <= 3; t++)
    		{
    			printf("%.0f\t", score[i][t]);
    		}
    		printf("%.0f\t", score[i][3] / 3);
    		printf("\n");
    	}
    
    }
    void fun_4(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	int i, j;
    	float temp1;
    	long long temp2;
    	char temp[10];
    	for (i = 0; i < n - 1; i++)
    	{
    		for (j = i + 1; j < n; j++)
    		{
    			if (strcmp(name[j], name[i]) < 0)
    			{
    				for (int t = 0; t <= 3; t++)
    				{
    					temp1 = score[j][t];
    					score[j][t] = score[i][t];
    					score[i][t] = temp1;
    
    				}
    				temp2 = STU_ID[j];
    				STU_ID[j] = STU_ID[i];
    				STU_ID[i] = temp2;
    				strcpy(temp, name[j]);
    				strcpy(name[j], name[i]);
    				strcpy(name[i], temp);
    			}
    
    		}
    
    	}
    	printf("姓名排名\n\n");
    	printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\n");
    	for (i = 0; i < n; i++)
    	{
    		printf("%lld\t", STU_ID[i]);
    		printf("%s\t", name[i]);
    		for (int t = 0; t <= 3; t++)
    		{
    			printf("%.0f\t", score[i][t]);
    		}
    		printf("%.0f\t", score[i][3] / 3);
    		printf("\n");
    	}
    }
    void fun5(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	long long number;
    	rank(STU_ID, name, score, n);
    	printf("Input the number you want to scarch:");
    	scanf("%lld", &number);
    	int flag = 0;
    	for (int i = 0; i < n; i++)
    	{
    		if (STU_ID[i] == number)
    		{
    			printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\t排名\n");
    			printf("%lld\t", STU_ID[i]);
    			printf("%s\t", name[i]);
    			for (int t = 0; t <= 3; t++)
    			{
    				printf("%.0f\t", score[i][t]);
    			}
    			printf("%.0f\t", score[i][3] / 3);
    			printf("%d\n", i + 1);
    			flag = 1;
    		}
    	}
    	if (flag == 0)
    		printf("\nNot found!\n");
    
    }
    void fun_5(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	char temp[10];
    	int i;
    	rank(STU_ID, name, score, n);
    	printf("Input the name you want to scarch:");
    	scanf("%s", temp);
    	int flag = 0;
    	for (i = 0; i < n; i++)
    	{
    		if (strcmp(name[i], temp) == 0)
    		{
    			printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\t排名\n");
    			printf("%lld\t", STU_ID[i]);
    			printf("%s\t", name[i]);
    			for (int t = 0; t <= 3; t++)
    			{
    				printf("%.0f\t", score[i][t]);
    			}
    			printf("%.0f\t", score[i][3] / 3);
    			printf("%d\n", i + 1);
    			flag = 1;
    		}
    	}
    	if (flag == 0)
    		printf("\nNot found!\n");
    
    }
    void fun6(float score[][4], int n)
    {
    	int t[5];
    	int i, j, total;
    	for (j = 0; j < 3; j++)
    	{
    		printf("course:%d\n", j + 1);
    		for (int k = 0; k < 5; k++)
    		{
    			t[k] = 0;
    		}
    		for (i = 0; i < n; i++)
    		{
    			if (score[i][j] >= 0 && score[i][j] < 60) t[0]++;
    			else if (score[i][j] < 70) t[1]++;
    			else if (score[i][j] < 80) t[2]++;
    			else if (score[i][j] < 90) t[3]++;
    			else if (score[i][j] < 100) t[4]++;
    		}
    		printf("<60\t%d\t%.2f%%\n", t[0], (float)t[0] / n * 100);
    		printf("60-69\t%d\t%.2f%%\n", t[1], (float)t[1] / n * 100);
    		printf("70-79\t%d\t%.2f%%\n", t[2], (float)t[2] / n * 100);
    		printf("80-89\t%d\t%.2f%%\n", t[3], (float)t[3] / n * 100);
    		printf("90-100\t%d\t%.2f%%\n", t[4], (float)t[4] / n * 100);
    
    	}
    }
    void fun7(long long STU_ID[], char name[][10], float score[][4], int n)
    {
    	int i, j, k;
    	float temp1;
    	long long temp2;
    	char temp[10];
    	for (i = 0; i < n - 1; i++)
    	{
    		k = i;
    		for (j = i + 1; j < n; j++)
    		{
    			if (STU_ID[j] > STU_ID[k])
    				k = j;
    		}
    		if (k != i)
    		{
    			for (int t = 0; t <= 3; t++)
    			{
    				temp1 = score[k][t];
    				score[k][t] = score[i][t];
    				score[i][t] = temp1;
    
    			}
    			temp2 = STU_ID[k];
    			STU_ID[k] = STU_ID[i];
    			STU_ID[i] = temp2;
    			strcpy(temp, name[k]);
    			strcpy(name[k], name[i]);
    			strcpy(name[i], temp);
    		}
    	}
    	printf("成绩单\n\n");
    	printf("学号      \t姓名\t数学\t语文\t英语\t总分\t平均分\n");
    	for (i = 0; i < n; i++)
    	{
    		printf("%lld\t", STU_ID[i]);
    		printf("%s\t", name[i]);
    		for (int t = 0; t <= 3; t++)
    		{
    			printf("%.0f\t", score[i][t]);
    		}
    		printf("%.0f\t", score[i][3] / 3);
    		printf("\n");
    	}
    
    }
    int main()
    {
    	long long STU_ID[30];
    	char name[30][10];
    	float score[30][4];
    	float sum[4];
    	float aver[4];
    	int n = 0;
    	int a = -1;
    	int ha;
    	printf("Please input student number.\n\n");
    	scanf("%d", &n);
    	while (a != 0)
    	{
    		printf("\n*************************\n");
    		printf("1.Input record\n");
    		printf("2.Caculate total and average score of course\n");
    		printf("3.Sort in  order by score\n");
    		printf("4.Sort in ascending order by unmber\n");
    		printf("5.Sort in dictionary order by name\n");
    		printf("6.search by number\n");
    		printf("7.search by name\n");
    		printf("8.Statistic analysis\n");
    		printf("9.List record\n");
    		printf("0.Exit\n");
    		printf("*************************\n");
    		printf("请输入功能号0-9:");
    		scanf("%d", &a);
    		while (a < 0 || a>9)
    		{
    			printf("\n输入错误!请输入正确的功能号0-9:");
    			scanf("%d", &a);
    		}
    
    		if (a == 1)
    			fun1(STU_ID, name, score, n);
    		else if (a == 2)
    			fun2(score, sum, aver, n);
    		else if (a == 3)
    		{
    		
    			ha = -1;
    			while (ha != 0)
    			{
    				printf("1.Sort in descending order by score\n");
    				printf("2.Sort in ascending order by score\n");
    				printf("请输入功能号1,2:");
    				scanf("%d", &ha);
    				while (ha < 0 || ha>2)
    				{
    					printf("\n输入错误!请输入正确的功能号1,2:");
    					scanf("%d", &ha);
    				}
    				if (ha == 1)
    				{
    					fun3(STU_ID, name, score, n);
    					break;
    				}
    				else if (ha == 2)
    				{
    					fun_3(STU_ID, name, score, n);
    					break;
    				}
    			}
    		}
    		else if (a == 4)
    			fun4(STU_ID, name, score, n);
    		else if (a == 5)
    			fun_4(STU_ID, name, score, n);
    		else if (a == 6)
    			fun5(STU_ID, name, score, n);
    		else if (a == 7)
    			fun_5(STU_ID, name, score, n);
    		else if (a == 8)
    			fun6(score, n);
    		else if (a == 9)
    			fun7(STU_ID, name, score, n);
    		
    	}
    
    	return 0;
    }
    
    

    3.运行结果部分截图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • C语言编程管理学生成绩管理系统,包括学生姓名性别课程成绩等多方面,有不足的地方请多包含
  • C语言编写学生成绩信息管理系统

    千次阅读 多人点赞 2020-07-06 18:27:13
    C语言设计学生成绩信息管理系统介绍代码结构体数组的定义main_interface()函数add_infor()函数browse_infor()函数 介绍 软件方面采用的是Visual Studio 2019 IDE工具。 程序方面采用结构体数组,成员包括学号、...

    介绍

    • 软件方面采用的是 Visual Studio 2019 IDE 工具。
    • 程序方面采用结构体数组,成员包括学号、姓名以及一科成绩。程序整体采用分模块编程形式,包括主函数在内共10个函数,实现功能有信息的录入、浏览、查询、修改、删除、数据保存到文件以及成绩的排序。程序比较简单,结构体成员只有三个,没有什么技术含量,后期看看有没有能力用链表来编写这个程序。

    代码

    • 结构体数组的定义

    函数开始前,是结构体数组的定义。这里直接使用typedef定义结构体数组,一步到位。后续可用STUDENT来进行变量声明了


    • home_page() 函数

    这个是主界面的显示函数,完整的声明为:void home_page(),无形参,无返回值,单纯用printf()函数打印的界面。
    完整代码

    void home_page()
    {
    	printf("\n\t\t******************************** \n");
    	printf("\t\t     学生成绩信息管理系统       \n\n");
    	printf("\t\t        1、录入信息            \n\n");
    	printf("\t\t        2、浏览信息            \n\n");
    	printf("\t\t        3、查询信息            \n\n");
    	printf("\t\t        4、修改信息            \n\n");
    	printf("\t\t        5、成绩排序            \n\n");
    	printf("\t\t        6、删除信息            \n\n");
    	printf("\t\t        7、向文件写入数据       \n\n");
    	printf("\t\t        8、从文件读出数据       \n\n");
    	printf("\t\t        9、退出系统            \n\n");
    	printf("\t\t******************************** \n\n");
    }
    

    运行效果
    在这里插入图片描述
    其中,“输入标号选择功能:”字样是在 main() 函数中调用 home_page() 函数后,打印的提示语。


    • add_infor() 函数

    这是实现信息录入功能的函数,完整的函数声明是:int add_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,返回值n+i是添加完信息后的结构体数组的总个数。函数内部,i变量是每次添加的信息的个数,sign变量作为连续输入的标志。这里判断是否连续输入,我原来用的方法是判断stu[n+i].num的值是否为-1,编译成功没有报错,但是实际运行过程中会出现一些问题,应该是逻辑上的问题。我暂且换成每输入一条信息后,判断是否继续输入第二条信息,实际使用时会有一些繁琐,但总体效果相差无几。
    完整代码

    int add_infor(STUDENT stu[], int n)
    {
    	int i = 0;
    	char sign = 'Y';
    
    	while ((sign == 'Y') || (sign == 'y'))
    	{
    		printf("\n\t\t\t学号:");
    		scanf("\t\t%s", stu[n + i].num);
    		printf("\t\t\t姓名:");
    		scanf("\t\t%s", stu[n + i].name);
    		printf("\t\t\t成绩:");
    		scanf("\t\t%f", &stu[n + i].score);
    
    		printf("\n\t\t\t是否继续录入?(Y/N):");
    		sign = getchar();
    
    		i++;
    	}
    
    	return (n + i);
    }
    

    上述代码在 Visual Studio 2019 IDE 中编译时,scanf()函数会报出警告,警告代码为:C6031,说明为:返回值被忽略。解决方法有两个,第一种是将scanf替换为scanf_s,我没有采用这种方法,因为scanf_s并不是 C 语言中的,而是 Visual Studio 开发工具提供的一个功能相同的安全标准输入函数,如果换为scanf_s,在另一个编译器下就可能会出问题;第二种是使用#define _CRT_SECURE_NO_WARNINGS 1,具体做法可百度查找,经实测,这种方法是可行的。但是,如果两种方法都不采取,即不消除这个警告,实际上对程序的正确运行也没有影响。
    运行效果
    在这里插入图片描述
    “录入学生成绩信息”字样由 main() 函数在调用 add_infor() 函数前打印


    • browse_infor() 函数

    这是实现浏览录入信息功能的函数,完整声明为:void browse_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,无返回值。函数内部,i是作为循环控制变量,传入数组个数n,然后通过 for 循环,依次打印出结构体成员的值。
    完整代码

    void browse_infor(STUDENT stu[], int n)
    {
    	int i;
    
    	printf("\n\n");
    	printf("\t\t学号\t姓名\t成绩\n\n");
    
    	for (i = 0; i < n; i++)
    	{
    		printf("\t\t%s\t%s\t %3.1f\n",stu[i].num,stu[i].name,stu[i].score);
    	}
    }
    

    运行效果
    在这里插入图片描述
    “浏览学生成绩信息”字样由 main() 函数在调用 browse_infor() 函数前打印


    • find_infor() 函数

    这是实现信息查找功能的函数,完整的声明为:void find_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,无返回值。函数内部,又分为通过学号查找和通过姓名查找两种方式,变量option存放键入的选项,两个字符串数组分别存放查找的学号和姓名。先选择查找方式,输入对应方式的值,然后遍历数组,通过strcmp()函数判断数组中是否有与输入相同的值,若无相同的值则显示“未找到!”的信息,若有相同值则将该结构体成员的信息打印到屏幕上。
    完整代码

    void find_infor(STUDENT stu[], int n)
    {
    	int option;
    	int i = 0;
    	char search_num[10] = { 0 };
    	char search_name[20] = { 0 };
    
    	printf("\n\t\t\t1、按学号查找\n");
    	printf("\t\t\t2、按姓名查找\n");
    	printf("\n\t\t\t请选择相应的选项:");
    	scanf("%d",&option);
    
    	system("cls");
    
    	if (1 == option)
    	{
    		printf("\n\t\t请输入要查找的学号:");
    		scanf("%s", search_num);
    
    		while ((strcmp(stu[i].num, search_num) != 0) && i < n)
    		{
    			i++;
    		}
    	}
    
    	if (2 == option)
    	{
    		printf("\n\t\t请输入要查找的姓名:");
    		scanf("%s", search_name);
    
    		while ((strcmp(stu[i].name, search_name) != 0) && i < n)
    		{
    			i++;
    		}
    	}
    
    	if (i == n)
    	{
    		printf("\n\t\t未找到!");
    		return;
    	}
    
    	printf("\n\t\t学号:%s\n", stu[i].num);
    	printf("\t\t姓名:%s\n", stu[i].name);
    	printf("\t\t成绩:%3.1f\n", stu[i].score);
    }
    

    从上述代码中可以看到,在定义两个字符串数组时,均赋了初值0,若此处没有赋初值0时,上段代码在 Visual Studio 2019 IDE 中编译时,strcmp()函数会报警告,警告代码为:C6054,说明为:可能没有为字符串“xxx”添加字符串零终止符。深入了解strcmp()函数可以知道,其功能是两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 ‘\0’ 为止。所以此处在定义字符串数组时,将其初始化为 ‘\0’ ,即char search_num[10] = { 0 };,就可以消除此类警告。
    运行效果
    在这里插入图片描述


    • modify_infor() 函数

    这是实现信息修改功能的函数,函数声明为:int modify_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n。函数内部,可选择通过学号查找修改和通过姓名查找修改两种方式。查找部分与void find_infor(STUDENT stu[], int n)函数一致;修改部分有修改学号、姓名、成绩三个选项,修改的实现形式是:通过查找部分得出待修改的数组下标,然后通过strcpy()函数,将输入的修改后的学号和姓名赋值给下标对应的成员,分数的修改则直接赋值。
    完整代码

    int modify_infor(STUDENT stu[], int n)
    {
    	int option, choice;
    	int i = 0;
    	char old_temp[20] = { 0 };
    	char new_temp[20] = { 0 };
    	float new_score;
    
    	printf("\n\t\t\t1、按学号查找修改\n");
    	printf("\t\t\t2、按姓名查找修改\n");
    	printf("\n\t\t请输入选项选择功能:");
    	scanf("%d", &option);
    
    	system("cls");
    
    	if (1 == option)
    	{
    		printf("\n\t\t请输入学号:");
    		scanf("%s", &old_temp);
    
    		while ((strcmp(stu[i].num, old_temp) != 0) && i < n)
    		{
    			i++;
    		}
    
    		if (i == n)
    		{
    			printf("\n\t\t未找到!");
    		}
    	}
    
    	if (2 == option)
    	{
    		printf("\n\t\t请输入姓名:");
    		scanf("%s", &old_temp);
    
    		while ((strcmp(stu[i].name, old_temp) != 0) && i < n)
    		{
    			i++;
    		}
    
    		if (i == n)
    		{
    			printf("\n\t\t未找到!");
    		}
    	}
    
    	printf("\n\t\t待修改学生的信息:\n");
    	printf("\n\t\t学号:%s\n\t\t姓名:%s\n\t\t成绩:%3.1f\n", stu[i].num, stu[i].name, stu[i].score);
    
    	printf("\n\t\t请选择要修改的信息(1.学号 2.姓名 3.成绩):");
    	scanf("%d", &choice);
    
    	if (1 == choice)
    	{
    		printf("\n\t\t输入修改后的学号:");
    		scanf("%s", &new_temp);
    
    		strcpy(stu[i].num, new_temp);
    		printf("\t\t修改成功!\n");
    	}
    
    	if (2 == choice)
    	{
    		printf("\n\t\t输入修改后的姓名:");
    		scanf("%s", &new_temp);
    
    		strcpy(stu[i].name, new_temp);
    		printf("\t\t修改成功!\n");
    	}
    
    	if (3 == choice)
    	{
    		printf("\n\t\t输入修改后的成绩:");
    		scanf("%f", &new_score);
    
    		stu[i].score = new_score;
    		printf("\t\t修改成功!\n");
    	}
    }
    

    此函数中的两个字符串数组在定义时,也需要赋初值,以消除函数strcmp()strcpy()使用时的警告。
    运行效果
    在这里插入图片描述


    • sort_score() 函数

    此函数完整声明为:void sort_score(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,实现的功能是排序,用的是冒泡排序法,按从小到大的顺序给成绩排序。具体实现形式就是,通过两层循环,外层循环是排序趟数,内层循环是每趟比较的次数,相邻两元素比较,若前者大于后者,则两者进行交换,此时为顺序,即从小到大;若前者小于后者且两者交换,则为逆序,即从大到小。此函数为顺序,且在交换两者值时,学号和姓名使用strcpy()函数,成绩的交换使用指针。
    完整代码

    void sort_score(STUDENT stu[], int n)
    {
    	int i, j;
    	float * p, * q, s;
    	char temp[20];
    
    	for (i = 0; i < n - 1; i++)
    	{
    		for (j = 0; j < n - 1 - i; j++)
    		{
    			if (stu[j].score > stu[j + 1].score)
    			{
    				strcpy(temp, stu[j].num);
    				strcpy(stu[j].num, stu[j + 1].num);
    				strcpy(stu[j + 1].num, temp);
    
    				strcpy(temp, stu[j].name);
    				strcpy(stu[j].name, stu[j+1].name);
    				strcpy(stu[j+1].name,temp);
    
    				p = &stu[j].score;
    				q = &stu[j + 1].score;
    				s = *p;
    				*p = *q;
    				*q = s;
    			}
    		}
    	}
    }
    

    运行效果
    在这里插入图片描述


    • delete_infor() 函数

    此函数是信息删除函数,完整声明为:int delete_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,返回值是删除后的数组个数。函数内部,可通过按学号和按姓名两种方式查找并删除,其中查找部分与void find_infor(STUDENT stu[], int n)函数一致;删除部分的实现形式是,从查找部分获得找到的数组下标,从下标处开始,将后一值赋给前一值,直至数组的末尾,以此实现删除的功能。
    完整代码

    int delete_infor(STUDENT stu[], int n)
    {
    	char search_num[10] = { 0 };
    	char search_name[20] = { 0 };
    	int i = 0;
    	int j;
    	int option;
    	
    	printf("\n\t\t\t1、按学号查找删除\n");
    	printf("\t\t\t2、按姓名查找删除\n");
    	printf("\n\t\t\t请输入选项选择功能:");
    	scanf("%d", &option);
    	
    	system("cls");
    
    	if (1 == option)
    	{
    		printf("\n\t\t请输入要删除的学生的学号:");
    		scanf("%s", &search_num);
    
    		while ((strcmp(stu[i].num, search_num)) != 0 && (i < n))
    		{
    			i++;
    		}
    
    		if (i == n)
    		{
    			printf("\t\t未找到!\n");
    			return n;
    		}
    	}
    	
    	if (2 == option)
    	{
    		printf("\n\t\t请输入要删除的学生的姓名:");
    		scanf("%s", &search_name);
    
    		while ((strcmp(stu[i].num, search_name) != 0) && (i < n))
    		{
    			i++;
    		}
    
    		if (i == n)
    		{
    			printf("\t\t未找到!\n");
    			return n;
    		}
    	}
    
    	for (j = i; j < n; j++)
    	{
    		strcpy(stu[j].num, stu[j + 1].num);
    		strcpy(stu[j].name, stu[j + 1].name);
    		stu[j].score = stu[j + 1].score;
    	}
    
    	printf("\t\t删除成功!\n");
    	return (n - 1);
    }
    

    注意此函数的返回值,由于删除了一条信息,即从结构体数组中删除了一项,所以返回值应当是传入参数n减去1之后的值,即返回值return (n-1);
    运行效果
    在这里插入图片描述


    • writetofile() 函数

    此函数的功能是将录入的数据保存到文件中,完整声明为:void writetofile(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n。函数内部,用 FILE 结构体类型定义文件类型的指针变量 fp,输入要写入的文件的名称,然后以只写 “w” 的方式,向文件写入数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件,首先向文件内写结构体数组的个数,然后通过 while 循环,将所有信息写入文件中,最后fclose(fp)关闭文件。
    完整代码

    void writetofile(STUDENT stu[], int n)
    {
    	FILE* fp;
    	int i = 0;
    	char filename[20] = { 0 };
    	
    	printf("\n\t\t\t请输入文件名称:");
    	scanf("%s", filename);
    
    	if ((fp = fopen(filename, "w")) == NULL)
    	{
    		printf("\n\t\t\t打开文件失败!\n");
    		return;
    	}
    
    	fprintf(fp, "%d\n", n);
    
    	while (i < n)
    	{
    		fprintf(fp, "%-6s%-10s%3.1f\n", stu[i].num, stu[i].name, stu[i].score);
    		i++;
    	}
    
    	fclose(fp);
    
    	printf("\n\t\t\t写入文件成功!\n");
    }
    

    由于只需要向文件写数据,所以fopen()中 mode 参数只需要"w"即可,数据写入文件成功后,一定要使用fclose(fp)关闭文件。
    运行效果
    在这里插入图片描述
    在这里插入图片描述
    “向文件写入数据”字样由 main() 函数在调用 writetofile() 函数前打印


    • readfromfile() 函数

    此函数的功能是从文件中读出数据,完整声明为:int readfromfile(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,返回值为读入数据后的数组总个数。函数内部,用 FILE 结构体类型定义文件类型的指针变量 fp,输入要读出数据的文件的名称,以只读方式,通过 while 循环,从文件中读出数据,存放到数组中,然后将读到的数据个数加上传进的参数 n 作为返回值,最后关闭文件。
    完整代码

    int readfromfile(STUDENT stu[], int n)
    {
    	FILE* fp;
    	int i, num;
    	char filename[20];
    
    	i = 0;
    
    	printf("\n\t\t\t请输入文件名称:");
    	scanf("%s", filename);
    
    	if ((fp = fopen(filename, "r")) == NULL)
    	{
    		printf("\n\t\t\t无法打开文件!\n");
    
    		return n;
    	}
    
    	fscanf(fp, "%d", &num);
    
    	while (i < num)
    	{
    		fscanf(fp, "%-5s%-10s%3.1f\n", stu[n + i].num, stu[n + i].name, stu[n + i].score);
    		i++;
    	}
    
    	n += num;
    	fclose(fp);
    
    	printf("\n\t\t\t读出数据成功!\n");
    
    	return n;
    }
    

    同样,在打开文件并执行操作完毕后,需要fclose(fp)来关闭文件。注意,此函数的返回值应该是读到的数据个数 num 加上传进的参数 n ,返回的才是此时总的数组个数。
    运行效果
    在这里插入图片描述
    “从文件读出数据”字样由 main() 函数在调用 readfromfile() 函数前打印


    • main() 函数

    main函数部分,主要是由while(1)死循环构成的,循环内部首先调用home_page()函数显示主界面,然后通过 switch-case 语句,来匹配用户输入的选项。

    完整代码

    int main()
    {
    	int select = 0;
    	int n = 0;
    
    	while (1)
    	{
    		system("cls");
    		
    		home_page();
    
    		printf("\t\t输入标号选择功能: ");
    		scanf("%d", &select);
    
    		switch (select)
    		{
    			case 1:
    				system("cls");
    				printf("\n\t\t********录入学生成绩信息********\n");
    				n = add_infor(stu, n);
    				break;
    			case 2:
    				system("cls");
    				printf("\n\t\t********浏览学生成绩信息********\n");
    				browse_infor(stu, n);
    				getchar();
    				break;			
    			case 3:
    				system("cls");
    				printf("\n\t\t**********查询学生信息**********\n");
    				find_infor(stu, n);
    				getchar();
    				break;
    			case 4:
    				system("cls");
    				printf("\n\t\t*********修改学生信息*********\n");
    				n = modify_infor(stu, n);
    				getchar();
    				break;
    			case 5:
    				system("cls");
    				printf("\n\t\t*********按成绩排序*********\n");
    				sort_score(stu, n);
    				printf("\n\t\t\t排序成功!");
    				getchar();
    				break;	
    			case 6:
    				system("cls");
    				printf("\n\t\t*********删除学生信息*********\n");
    				n = delete_infor(stu, n);
    				getchar();
    				break;
    			case 7:
    				system("cls");
    				printf("\n\t\t********向文件写入数据********\n");
    				writetofile(stu, n);
    				getchar();
    				break;
    			case 8:
    				system("cls");
    				printf("\n\t\t********从文件读出数据********\n");
    				n = readfromfile(stu, n);
    				getchar();
    				break;
    			default:
    				system("cls");
    				printf("\n\n\t\t**********谢谢使用!**********\n");
    				exit(0);
    				break;
    		}
    
    		getchar();
    	}
    }
    

    注意,switch-case 语句的每个 case 结束都应加上break;,且最后要加上default,同时,为了美观,在每个 case 语句调用函数前,都加上system("cls")清屏函数;在调用后,加上getchar ()语句等待用户操作。


    • 完整代码

    链接: 完整代码

    结束语

    第一次写博客,方方面面的都有些不熟悉,脑子里有很多想法,但无从下手,拿了以前写的程序作主要内容,进行一次尝试。虽然内容啥的都很简单,程序也没有什么技术含量,但这是一次从0到1的尝试吧,以后也会继续努力。文中如有错误之处,还请指正,如遇大佬,还请多多指教!

    展开全文
  • 学生成绩管理系统C语言编程,账号123,密码也为123。
  • 通过C语言开发一个简单的项目:学生成绩管理系统1.C语言知识点的综合运用,加深对C语言的理解,学会结构化编程的思想2.熟悉企业软件开发的基本流程,树立软件工程的思维和概念3.具备独立开发一个小型甚至中型软件的...
  • c语言学生成绩管理系统

    热门讨论 2013-03-14 22:27:45
    一、题目: 学生成绩管理系统 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题...
  • 学生成绩管理系统设计》 二、实训目的 (1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。 (2)掌握C++的基本概念和基础知识。 (3)通过训练能够读懂较为复杂的C++语言源程序...
  • 课程设计(论文)任务书 软 件 学 院 软件工程 专 业 20092 班 一课程设计(论文)题目 学生成绩管理系统 二课程设计(论文)工作自 2010 年 6 月 28 日起至 2010 年7月 2 日止 三课程设计(论文) 地点: 软件学院实训中心 ...
  • 语言编程学生成绩管理系统c语言编程-学生成绩管理系统#include /*引用库函数*/#include#include#includetypedef struct /*定义结构体数组*/char num[10]; /*学号*/char name[20]; /*姓名*/int score; /*成绩*/...
  • 实现录入学生基本信息和成绩功能: 添加学生信息 设计为单独的子函供主函数调用。 定义一个结构体类型,包括四个成员变量(学号,姓名,性别,成绩),并用该类型定义一个全局的结构体数组,供外部录入学生信息时存储...
  • 这篇文章主要为大家详细介绍了C语言实现简单学生成绩管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 系统功能: 1.实现所有学生成绩的录入(利用结构体数组),当输入字符为end时候,结束成绩的...
  • 学生成绩管理系统c语言编程,有学生成绩存储,排序,录入等多种功能
  • 计算机学院 C语言程序设计报告书 设计名称学生成绩管理系统 专业软件工程 指导老师 班级 姓名 学号 座号 2011-6-15 一实验目的 1.在编辑应用程序过程中逐步加深对C语言编程的理解 2.加强实践的能力动手能力同时...
  • 代码设计的概念,利用Visual C++ 6.0实现学生成绩管理系统的输入、显示、排序、插入、删除、查找、求平均分等基本操作,使用函数实现模块化程序设计和结构体类型处理组合数据实现学生成绩管理,掌握C语言中的结构体...
  • C语言大作业学生成绩管理系统

    千次阅读 2019-07-18 22:29:00
    利用资源,采用模块化的结构,使用模仿修改自主设计相结合的方法,锻炼学生综合分析解决实际问题的编程能力通过C语言各个函数功能来实现对学生信息的管理学生信息包括学生姓名,学号,各科成绩管理方式包括对...
  • 通过C语言编程的基于链表的学生成绩管理系统,实现学生成绩管理的各个功能

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 207
精华内容 82
关键字:

c语言编程学生成绩管理系统

c语言 订阅