• 11.26C语言实验课作业


    编写学生成绩管理系统V4.0。
    某班有最多不超过30人(具体人数由键盘输入)参加期末考试,考试科目最多不超过6门(具体门数由键盘输入)。参考例题8.12,用二维数组作函数参数编程实现如下学生成绩管理:

    1.  录入每个学生的学号、姓名和各科考试成绩,学号用long int[]类型定义。考试成绩用int[][M]定义。第一维为学生数,第二维为课程数。
      
    2.  计算每门课程的总分和平均分
      
    3.  计算每个学生的总分和平均分
      
    4.  按每个学生的总分由高到低排出名次表
      
    5.  按每个学生的总分由低到高排出成绩表
      
    6.  按学号由小到大排出成绩表
      
    7.  按姓名的字典顺序排出成绩表
      
    8.  按学号查询学生排名及各科考试成绩
      
    9.  按姓名查询学生的排名及各科考试成绩
      
    10. 按优秀(90~100)、良好、中等、及格、不及格5个类别,对每门课程分别统计每个类别的人数以及所占的百分比。
    11. 输出每个学生的学号、姓名、各科考试成绩、总分、平均分,以及每门课程的总分和平均分。
      image
    //假定名字输入时不含空格
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 40
    #define C 6
    #define SWAP(a,b) xx=a,a=b,b=xx;
    struct Node{
    	long num;
    	char name[N];
    	int score[C], sumev;
    	double aver;
    };
    /*
    void LSwap(long *, long *);
    void ISwap(int *, int *);
    void DSwap(double *, double *);
    */
    void StrSwap(char *, char *);
    int Choose(struct Node ,struct Node, int);
    void Average(int , int , struct Node *, int *, double *);
    //求学生总分、平均值,各科总分、平均值
    void Read (int , int , struct Node*);//输入数据
    void Print(int , int , struct Node*);//输出
    void Sort(int , int , struct Node *, int op);//排序,op==1表示按总分降序,op==2表示按总分升序,op==3表示按学号升序,op==4表示按字典序
    void Find(int , int , struct Node *, int id, char *, int op);
    //查找,op==1表示按学号查,op==2表示按名字查
    void Account(int , int , struct Node *);
    //统计分析
    
    int main(void)
    {
    	int n = 0, c = 0, i, j, in, id, sum[C] = {0};
    	char na[N];
    	double ave[N];
    	struct Node stu[N] = {0};;
    	do{
    		puts("");
    		puts("1.Input score, ID and name");
    		puts("2.Caculate total and average score of course");
    		puts("3.Caculate total and average score of students");
    		puts("4.Sort in descending order by score");
    		puts("5.Sort in ascending order by score");
    		puts("6.Sort in ascending order by number");
    		puts("7.Sort in alphabetical order by name");
    		puts("8.Search by number");
    		puts("9.Search by name");
    		puts("10.Statistic analysis");
    		puts("11.List record");
    		puts("0.Exit");
    		printf("Please enter your choice:");
    
    		scanf("%d", &in);
    		switch(in)
    		{
    			case 0:break;
    			case 1:
    				printf("Please enter the number of students and the number of scores: ");
    				scanf("%d %d", &n, &c);
    				puts("Please enter student's ID, name and score");
    				puts("Attention: No space in their names");
    				Read(n, c, stu);
    				Average(n, c, stu, sum, ave);
    				break;
    			case 2:
    				for(j = 0; j < c; ++j)
    					printf("%5d %5.1lf
    ", sum[j], ave[j]);
    				break;
    			case 3:
    				for(i = 0; i < n; ++i)
    					printf("%5d %5.1lf
    ", stu[i].sumev, stu[i].aver);
    				break;
    			case 4:
    				Sort(n,c,stu,1);
    				Print(n,c,stu);
    				break;
    			case 5:
    				Sort(n,c,stu,2);
    				Print(n,c,stu);
    				break;
    			case 6:
    				Sort(n,c,stu,3);
    				Print(n,c,stu);
    				break;
    			case 7:
    				Sort(n,c,stu,4);
    				Print(n,c,stu);
    				break;
    			case 8:
    				Sort(n,c,stu,1);
    				printf("Please input the ID: ");
    				scanf("%d", &id);
    				Find(n,c,stu,id,"",1);
    				break;
    			case 9:
    				Sort(n,c,stu,1);
    				printf("Please input the name: ");
    				scanf("%s", na);
    				Find(n,c,stu,0,na,2);
    				break;
    			case 10:
    				Account(n,c,stu);
    				break;
                case 11:
                    Print(n, c, stu);
    				for(i = 0; i < 21; ++i)putchar(' ');
    				for(j = 0; j < c; ++j)
    					printf("%5d", sum[j]);
    				puts("");
    				for(i = 0; i < 21; ++i)putchar(' ');
    				for(j = 0; j < c; ++j)
    					printf("%5.1lf ", ave[j]);
                    break;
    			default:puts("Inputs Error!");break;
    		}
    	}while(in);
    	return 0;
    }
    /*
    void DSwap(double *a, double *b)
    {
    	double c = *a;
    	*a = *b;
    	*b = c;
    }
    void ISwap(int *a, int *b)
    {
    	int c = *a;
    	*a = *b;
    	*b = c;
    }
    void LSwap(long *a, long *b)
    {
    	long c = *a;
    	*a = *b;
    	*b = c;
    }
    */
    void StrSwap(char *a, char *b)
    {
    	char c[N];
    	strcpy(c,a);
    	strcpy(a,b);
    	strcpy(b,c);
    }
    void Read(int n, int c, struct Node stu[])
    {
    	int i, j;
    	for(i = 0; i < n; ++i)
    	{
    		scanf("%ld", &stu[i].num);
    		scanf("%s" , stu[i].name);
    		for(j = 0; j < c; ++j)
    			scanf("%d", &stu[i].score[j]);
    	}
    	return ;
    }
    void Print(int n, int c, struct Node stu[])
    {
    	int i, j;
    	for(i = 0; i < n; ++i)
    	{
    		printf("%-5ld %-15s", stu[i].num, stu[i].name);
    		for(j = 0; j < c; ++j)
    			printf("%5d ", stu[i].score[j]);
    		printf("%5d %5.1lf
    ", stu[i].sumev, stu[i].aver);
    	}
    	return ;
    }
    void Average(int n, int c, struct Node *stu, int sum[], double ave[])
    {
    	int i, j;
    	for(i = 0; i < n; ++i)
    	{
    		for(j = 0; j < c; ++j)
    		{
    			sum[j]		 += stu[i].score[j];
    			stu[i].sumev += stu[i].score[j];
    		}
    		stu[i].aver = 1.0 * stu[i].sumev / c;
    	}
    	for(j = 0; j < c; ++j)
    		ave[j] = 1.0 * sum[j] / n;
    	return ;
    }
    int Choose(struct Node stu1, struct Node stu2, int op)
    {
    	switch(op)
    	{
    		case 1:return stu1.sumev < stu2.sumev;
    		case 2:return stu1.sumev > stu2.sumev;
    		case 3:return stu1.num	 > stu2.num;
    		case 4:return strcmp(stu1.name, stu2.name) > 0;
    	}
    }
    void Sort(int n, int c, struct Node *stu, int op)
    {
    	int i, j, k;
    	double xx;
    	for(i = 0; i < n; ++i)
    	{
    		k = i;
    		for(j = i+1; j < n; ++j)
    			if(Choose(stu[k], stu[j], op))
    				k = j;
    		if(k != i)
    		{
    			StrSwap(stu[i].name, stu[k].name);
    			SWAP(stu[i].num, stu[k].num);
    			SWAP(stu[i].sumev, stu[k].sumev);
    			SWAP(stu[i].aver, stu[k].aver);
    			for(j = 0; j < c; ++j)
    				SWAP(stu[i].score[j], stu[k].score[j]);
    		}
    	}
    	return ;
    }
    void Find(int n, int c, struct Node *stu, int id, char na[], int op)
    {
    	int i, j;
    	for(i = 0; i < n; ++i)
    	{
    		if(op == 1 && stu[i].num == id)
    			break;
    		else
    			if(op == 2 && !strcmp(stu[i].name, na))
    				break;
    	}
    	if(i != n)
    	{
    		printf("Rank: %d
    ", i+1);
    		printf("%-5ld%-15s", stu[i].num, stu[i].name);
    		for(j = 0; j < c; ++j)
    			printf("%5d", stu[i].score[j]);
    		puts("");
    	}
    	else	puts("Not find!");
    	return ;
    }
    void Account(int n, int c, struct Node *stu)
    {
    	char grade[5]={'E','D','C','B','A'};
    	int i, j, peo[C][5] = {0};
    	for(j = 0; j < c; ++j)
    	{
    		for(i = 0; i < n; ++i)
    		{
    			if(stu[i].score[j] == 100)
    				++peo[j][4];
    			else
    				if(stu[i].score[j] >= 60)
    					++peo[j][(int)(stu[i].score[j]/10)-5];
    				else	++peo[j][0];
    		}
    		printf("Subject %d
    : ", j+1);
    		for(i = 4; i >= 0; --i)
    			printf("	grade %c: %d	%lf%%
    ", grade[i], peo[j][i], 100.0*peo[j][i]/n);
    	}
    	return ;
    }
    

    data

    5 3
    101 nieleheng 95 93 94
    102 yanglang  85 87 88
    103 buzhidao 58 58 58
    104 yanzhichong 75 85 85
    105 suxuewen 88 86 87
    
  • 相关阅读:
    【MongoDB初识】-结合C#简单使用,驱动2.x
    【NuGet】打包上传一条龙服务
    【NuGet】搭建自己团队或公司的NuGet
    【MongoDB初识】-其他操作
    【MongoDB初识】-条件操作符
    【MongoDB初识】-增删改
    【MongoDB初识】-安装篇
    【面试题】-100盏灯
    【微信开发】一获取用户授权(静默授权方式)
    XML序列化及反序列化
  • 原文地址:https://www.cnblogs.com/kuaileyongheng/p/14042800.html
Copyright © 2020-2023  润新知