结构体存储学生信息

发布时间:2023年12月28日

本关任务:使用结构体储存学生信息(包括学号,姓名,3 门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。

相关知识

参考结构体第1关相关知识。

编程要求

根据提示,在右侧编辑器 Begin-End 处补充代码,使用结构体储存学生信息,实现对学生信息修改和删除操作。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:

 
  1. 10 3
  2. 1 Siyu 90 90 90
  3. 2 Amy 60 70 94
  4. 3 Jack 60 60 98
  5. 4 Jack 77 90 60
  6. 5 Banana 60 60 40
  7. 6 White 60 60 60
  8. 7 Pinkman 60 60 60
  9. 8 Fring 60 60 70
  10. 9 Ehrmantraut 80 63 61
  11. 10 Schrader 99 66 100
  12. 1 Jack
  13. 2 1 100 100 100
  14. 3 10

测试输入数据说明: 输入一个 nq,标书下面 n 行则是 n 个学生的信息,再下 q 行则是对应的操作。

 
  1. 1 name //为根据名字查询操作
  2. 2 sno num1 num2 num2 //为修改分数操作,修改学号为sno的3门成绩
  3. 3 sno //为删除操作

预期输出:

 
  1. 3 Jack 60 60 98 218
  2. 4 Jack 77 90 60 227
  3. 1 Siyu 100 100 100 300
  4. 2 Amy 60 70 94 224
  5. 3 Jack 60 60 98 218
  6. 4 Jack 77 90 60 227
  7. 5 Banana 60 60 40 160
  8. 6 White 60 60 60 180
  9. 7 Pinkman 60 60 60 180
  10. 8 Fring 60 60 70 190
  11. 9 Ehrmantraut 80 63 61 204
  12. 10 Schrader 99 66 100 265
  13. 1 Siyu 100 100 100 300
  14. 2 Amy 60 70 94 224
  15. 3 Jack 60 60 98 218
  16. 4 Jack 77 90 60 227
  17. 5 Banana 60 60 40 160
  18. 6 White 60 60 60 180
  19. 7 Pinkman 60 60 60 180
  20. 8 Fring 60 60 70 190
  21. 9 Ehrmantraut 80 63 61 204

预期输出数据说明: 每次修改操作则输出全部的学生信息,查询操作则输出查询的学生的信息。

第一阶段:准备工作

  • 定义全局变量: 定义了一个全局整数变量n,表示学生的数量。
  • 定义结构体: 定义了一个名为student的结构体,用于存储学生的信息,包括学号、姓名、语文成绩、数学成绩、英语成绩和总分。

第二阶段:函数定义

  • 查找学生信息:?void chaxun(struct student stu[], char name_1[])函数用于查找具有特定姓名的学生并打印其信息。它通过循环遍历所有学生,并使用strcmp函数比较姓名来实现。
  • 更新学生信息:?void update(struct student stu[], int neo, int a, int b, int c)函数用于更新特定学生的信息。它通过循环遍历所有学生,并检查学号是否匹配来实现。如果匹配,则更新语文、数学和英语成绩,并重新计算总分。
  • 删除学生信息:?void delet(struct student stu[], int neo)函数用于删除具有特定学号的学生。它通过循环遍历所有学生,并检查学号是否匹配来实现。如果匹配,则将该学生的信息覆盖为下一个学生的信息,从而实现删除效果。

第三阶段:主函数?main()

  • 输入学生数量和操作数量: 从标准输入读取学生的数量n和操作数量q
  • 输入学生信息: 根据学生数量n循环读取每个学生的信息并存储在stu数组中。每个学生的信息包括学号、姓名、语文成绩、数学成绩和英语成绩。
  • 执行操作: 根据操作数量q循环执行一系列操作。每个操作由一个数字fack标识。根据不同的操作执行相应的功能,如查找学生信息、更新学生信息或删除学生信息。

注意事项

  • 在函数chaxun中,for循环的条件是i < n-1,这意味着它只检查到倒数第二个学生。这可能是为了防止数组越界,但可能会导致最后一个学生的信息不被处理。
  • 在函数delet中,删除特定学生后,循环并没有减少,因此可能会导致未删除的学生的信息被多次处理。此外,由于数组的大小没有改变,所以最后一个学生的信息可能不会被正确处理。
  • 该程序没有对输入进行错误检查(例如检查学号或姓名的有效性)。在实际应用中,这是很重要的。

#include<stdio.h>
#include<string.h>
int n;
struct student
{
	int num;
	char name[20];
	int chinese;
	int math;
	int english;
	int sum;
};
void chaxun(struct student stu[], char name_1[])
{
	for (int i = 0; i < n-1; i++) 
	{
		if (strcmp(stu[i].name, name_1) == 0)
			printf("%d %s %d %d %d %d\n", stu[i].num, stu[i].name, stu[i].chinese, stu[i].math, stu[i].english,stu[i].sum);
	}
}
void update(struct student stu[],int neo,int a,int b,int c)
{
	
		for (int i = 0; i < n; i++)
	{
		if (stu[i].num == neo)
		{
		 stu[i].chinese=a;
		 stu[i].math=b;
		 stu[i].english=c;
		 stu[i].sum = stu[i].math + stu[i].english + stu[i].chinese;
		}
	}
}
void delet(struct student stu[],int neo)
{
	for(int i=0;i<n;i++)
	{
		if(stu[i].num>=neo)
		stu[i]=stu[i+1];
		
	}
}
int main()
{
  
  
	int q;
	struct student stu[50];
	scanf("%d %d", &n, &q);
	for (int i = 0; i < n; i++)
	{
		scanf("%d %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].chinese, &stu[i].math, &stu[i].english);
		stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
	}
	while (q--)
	{
		int fack;
		char name_1[20];
		scanf("%d",&fack);
		if (fack == 1)
		{
			scanf("%s", name_1);
			chaxun(stu, name_1);
		}
		else if (fack == 2)
		{	int neo,a,b,c;
			scanf("%d %d %d %d",&neo,&a,&b,&c);
			update(stu,neo,a,b,c);
			for(int i=0;i<n;i++)
			printf("%d %s %d %d %d %d\n", stu[i].num, stu[i].name, stu[i].chinese, stu[i].math, stu[i].english,stu[i].sum);
		}
		else if (fack == 3)
		{		
		 	int neo;
			scanf("%d",&neo);
			delet(stu,neo);
			for(int i=0;i<n-1;i++)
			printf("%d %s %d %d %d %d\n", stu[i].num, stu[i].name, stu[i].chinese, stu[i].math, stu[i].english,stu[i].sum);
		}
	}
	return 0;
}

文章来源:https://blog.csdn.net/ggbzwz/article/details/135258436
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。