Laity199 2021-06-17 15:41 采纳率: 80%
浏览 29
已采纳

C++结构体应用.。

把30名学生的学号,姓名,4门课的成绩以及平均分放在一个结构体数组中。学生的学号、姓名、4门课的成绩由键盘输入,计算出平均分放在结构体对应的域中

提示类型说明如下

struct  student

       char num【5】,name【10】;

       int s【4】;

       double ave;

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-06-17 15:52
    关注

    代码如下,如有帮助,请采纳一下,谢谢。(可能结构体中的名字不一致,修改一下即可)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //定义课程数量
    #define NMBKC 4
    struct Student
    {
    	char id[5];    //学号
    	char name[20]; //姓名
    	float score[NMBKC];//成绩
    	float total;   //总分
    	float avg;     //平均分
    };
    //录入信息
    void InputInfo(struct Student arr[],int n)
    {
    	int i,j;
    	for (i = 0;i < n; i++)
    	{
    		arr[i].total = 0.0;
    		printf("请输入第%d名学生的信息(学号、姓名、课程成绩):",i+1);
    		scanf("%s %s",arr[i].id,arr[i].name);
    		for (j = 0;j < NMBKC;j++)
    		{
    			scanf("%f",&arr[i].score[j]);
    			arr[i].total += arr[i].score[j];
    		}
    		arr[i].avg = arr[i].total / NMBKC;
    	}
    }
    //修改数据
    void ChangeInfo(struct Student arr[],int n)
    {
    	int i,j;
    	char id[8] = {0};
    	char c;
    	printf("请输入学生的学号:");
    	scanf("%s",id);
    
    	for (i = 0; i < n;i++)
    	{
    		if (strcmp(arr[i].id, id) == 0)
    		{
    			printf("是否修改姓名(Y/N)?");
    			scanf(" %c",&c);
    			getchar();//吸收回车符
    			if ('Y' == c || 'y' == c)
    			{
    				printf("请输入修改后的名字:");
    				scanf("%s",arr[i].name);
    			}
    			printf("是否修改成绩(Y/N)?");
    			scanf(" %c",&c);
    			getchar();//吸收回车符
    			if('Y' == c || 'y' == c)
    			{
    				printf("请输入%d门成绩:",NMBKC);
    				//此处默认修改全部成绩,也可以进一步细化修改某个课程的成绩
    				arr[i].total = 0.0;
    				for (j = 0;j < NMBKC;j++)
    				{
    					scanf("%f",&arr[i].score[j]);
    					arr[i].total += arr[i].score[j];
    				}
    				arr[i].avg = arr[i].total / NMBKC;
    			}
    
    			break;
    		}
    	}
    }
    
    //排序
    void SortByTotal(struct Student arr[],int n)
    {
    	int i,j;
    	struct Student tmp;
    	for (i = 0; i < n-1;i++)
    	{
    		for (j = 0;j < n-1-j;j++)
    		{
    			if(arr[j].total < arr[j+1].total)
    			{
    				tmp = arr[j];
    				arr[j] = arr[j+1];
    				arr[j+1] = tmp;
    			}
    		}
    	}
    	//显示
    	for (i = 0;i< n;i++)
    	{
    		printf("%s\t%s\t%.1f\t%.1f\t",arr[i].id,arr[i].name,arr[i].total,arr[i].avg);
    		for (j=0;j<NMBKC;j++)
    		{
    			printf("%f\t",arr[i].score[j]);
    		}
    		printf("\n");
    	}
    }
    
    //查询
    void Find(struct Student arr[],int n)
    {
    	int i,j;
    
    	char name[20]={0};
    	printf("请输入学号或者姓名:");
    	scanf("%s",name);
    	
    	for (i = 0;i < n;i++)
    	{
    		if( (strcmp(arr[i].name,name) == 0) || (strcmp(arr[i].id ,name)==0) )
    		{
    			printf("%s\t%s\t%.1f\t%.1f\t",arr[i].id,arr[i].name,arr[i].total,arr[i].avg);
    			for (j=0;j<NMBKC;j++)
    			{
    				printf("%f\t",arr[i].score[j]);
    			}
    			printf("\n");
    			break;;
    		}
    	}
    }
    //统计每个学生的平均成绩和每门课程的平均成绩
    //每个学生的平均成绩在录入成绩时已经计算,此处只统计每门课程的平均成绩
    //统计结果放在avg数组中
    void Tongji(struct Student arr[],int n,float avg[])
    {
    	int i,j;
    	for (i = 0; i< NMBKC;i++)
    	{
    		avg[i] = 0.0;
    		for (j = 0;j < n;j++)
    		{
    			avg[i] += arr[j].score[i];
    		}
    		avg[i] = avg[i]/n;
    	}
    	//显示课程平均分
    	printf("课程平均分:");
    	for (i = 0;i < NMBKC;i++)
    	{
    		printf("课程%d的平均分:%.1f\n",i+1,avg[i]);
    	}
    }
    
    int main()
    {
    	struct Student stu[10];
    	int n;
    	int opt;
    	int bgo = 1;
    	float avg[NMBKC]; //课程平均分
    	while(bgo)
    	{
    		printf("-------学生管理系统-------\n");
    		printf("  1.录入学生信息          \n");
    		printf("  2.修改学生信息          \n");
    		printf("  3.按总分排序            \n");
    		printf("  4.学生平均分和课程平均分\n");
    		printf("  9.退出系统              \n");
    		printf("--------------------------\n");
    		scanf("%d",&opt);
    		switch(opt)
    		{
    		case 1:
    			printf("请输入学生人数:");
    			scanf("%d",&n);
    			InputInfo(stu,n);
    			getchar();
    			getchar();
    			system("cls");
    			break;
    		case 2:
    			ChangeInfo(stu,n);
    			getchar();
    			getchar();
    			system("cls");
    			break;
    		case 3:
    			SortByTotal(stu,n);
    			getchar();
    			getchar();
    			system("cls");
    			break;
    		case 4:
    			Tongji(stu,n,avg);
    			getchar();
    			getchar();
    			system("cls");
    			break;
    		case 9:
    			bgo = 0;
    			break;
    		}
    	}
    	return 0;
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥250 雷电模拟器内存穿透、寻基址和特征码的教学
  • ¥200 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥15 关于Java的学习问题
  • ¥15 如何使用chatgpt完成文本分类任务?
  • ¥15 已知速度v关于位置s的等式,怎么转化为已知位置求速度v的等式
  • ¥15 我有个餐饮系统,用wampserver把环境配置好了,但是后端的网页却进去,是为什么,能不能帮远程一下?
  • ¥15 R运行没有名称为"species"的插槽对于此对象类"SDMmodelCV"
  • ¥20 基于决策树的数字信号处理,2ask 2psk 2fsk的代码,检查下报错的原因
  • ¥15 wincc已组态的变量过多
  • ¥60 如图:直线与椭圆X轴平行,求直线与椭圆任意一点的相切坐标计算公式