设计一种结构体,用来保存学生信息(C语言)

给设计一种结构体,用来保存学生信息(包括学号、姓名、三科成绩、平均成绩)。除平均成绩外,各项数据均由键盘输入。现在要求输入若干学生的信息,并实现以下功能:(可以使用数组或链表实现)
1)计算学生的平均成绩,并填入相应的数据域;
2)插入学生信息;
3)删除学生信息;
4)查询学生信息。

看到有人问这道题或者这个实验,因为刚帮朋友写了类似的这个代码,所以直接修改一下就发出来了,我的实现是通过数组,通过链表也可以实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

// 声明结构体 
struct 	Student 
{
	int num;
	char name [20];
	int score[3];
	float ave;
};

// 声明全局变量 
const int MAX = 100; 
struct Student stu[MAX]; 
int count = 0; // 学生数组下标 

// 函数的声明
void menu(); // 功能选择菜单 
void put();  // 输入学生信息 
void insert(); // 插入学生信息 
void getAverage(); // 计算平均数 
void query(); // 查询学生信息 
void del(); // 删除学生信息 
void list(); // 打印全部学生信息 
void stuInfo(int index); // 打印index下标对应的学生信息 

// main函数
int main() {
	struct Student s[70];
	int choice;
	while (1)
	{
		menu();
		scanf("%d", &choice);
		switch(choice)
		{
			case 1 : 
				put();
				break;
			case 2:
				insert();
				break;
			case 3:
				query();
				break;
			case 4:
				getAverage();
				break;
			case 5:
				del();
				break;
			case 6:
				list();
				break;
			case 0:
				exit(0);
			default:
				printf("无效的输入,请输入0--6的整型数字\n");
				break;
		}
	}
	return 0;
}

void menu() {
	printf("请选择您要执行的功能:\n");
	printf("1.输入学生信息\n");
	printf("2.插入学生信息\n");
	printf("3.查询学生信息\n");
	printf("4.计算学生平均成绩\n");
	printf("5.删除学生信息\n");
	printf("6.列出所有学生信息\n");
	printf("0.退出\n");
}

void put() {
	int n;
	printf("请输入你想要输入的学生数量:");
	scanf("%d", &n);
	if(count + n <= MAX) {
		printf("请输入学生信息,按照学号 姓名 成绩1 成绩2 成绩3 的格式\n");
		for(int i = 0; i < n; i++) {
			scanf("%d %s %d %d %d", &stu[count].num, stu[count].name, &stu[count].score[0], &stu[count].score[1], &stu[count].score[2]);
			count++;
		}
	} else {
		printf("您选择输入的数量已经超过了设定的最大存储值\n");
	}
}

void insert() {
	printf("请输入想要插入的位置:");
	int index;
	scanf("%d", &index);
	if(index < count && index > 0) {
		// 从index以后的都向后移动一个位置 
		index--; // 因为数组是从0开始存储 
		for(int i = count, j = count - 1; i >= index; i--, j--) {
			stu[i].num = stu[j].num;
			strcpy (stu[i].name, stu[j].name);
			stu[i].score[0] = stu[j].score[0];
			stu[i].score[1] = stu[j].score[1];
			stu[i].score[2] = stu[j].score[2];
			stu[i].ave = stu[j].ave;
		}
		count++;
		printf("请输入学生信息,按照学号 姓名 成绩1 成绩2 成绩3 的格式\n");
		scanf("%d %s %d %d %d", &stu[index].num, stu[index].name, &stu[index].score[0], &stu[index].score[1], &stu[index].score[2]);
	} else {
		printf("输入的下标位置已经超过了目前存储的最大位置\n");
	}
}

void getAverage() {
	if(count == 0) {
		printf("还没有数据,请先输入学生信息再进行操作\n");
	} else {
		for(int i = 0; i < count; i++) {
			stu[i].ave = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
		}
	}
}

void stuInfo(int index) {
	printf("学号:%d 姓名:%s 成绩1:%d 成绩2:%d 成绩3:%d 平均成绩:%.2f\n", stu[index].num, stu[index].name, stu[index].score[0], 
			stu[index].score[1], stu[index].score[2], stu[index].ave);
}

void query() {
	int num, flag = 0;
	printf("请输入查询学生的学号:");
	scanf("%d", &num);
	for(int i = 0; i < count; i++) {
		if(stu[i].num == num) {
			stuInfo(i);
			flag = 1;
			break;
		}
	}
	if(!flag) {
		printf("没有找到对应学生,请检查输入的学号\n");
	}
}

void del() {
	int num, flag = 0;
	printf("请输入要删除的学生学号:");
	scanf("%d", &num);
	for(int i = 0; i < count - 1; i++) { // 当不是在删除的学生在数组中间时 
		if(stu[i].num == num) {
			int tmp = i;
			for(int j = i + 1; j < count; j++, tmp++) {
				stu[tmp].num = stu[j].num;
				strcpy (stu[tmp].name, stu[j].name);
				stu[tmp].score[0] = stu[j].score[0];
				stu[tmp].score[1] = stu[j].score[1];
				stu[tmp].score[2] = stu[j].score[2];
				stu[tmp].ave = stu[j].ave;
			}
			count--;
			flag = 1;
			break;
		}
	}
	if(!flag) { // 还没有找到,这时可能在最后一个位置,也可能学号输入错误 
		if(stu[count - 1].num != num) {
			printf("学号输入错误,请重新检查\n");
		} else {
			count--;
		}
	}
}

void list() {
	for(int i = 0; i < count; i++) {
		printf("学号:%d 姓名:%s 成绩1:%d 成绩2:%d 成绩3:%d 平均成绩:%.2f\n", stu[i].num, stu[i].name, stu[i].score[0], 
			stu[i].score[1], stu[i].score[2], stu[i].ave);
	}
}

希望一键三连!!!

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值