前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言实现一个简单学生信息管理系统

C语言实现一个简单学生信息管理系统

作者头像
英雄爱吃土豆片
发布2021-01-21 06:31:46
1.8K0
发布2021-01-21 06:31:46
举报

学生信息管理,声明一个结构体存储信息先。

代码语言:javascript
复制
//存储学生信息的结构体
typedef struct Student {
	//姓名,学号,语文成绩,数学成绩,英语成绩
	char name[30];
	char ID[20];
	int chinese;
	int math;
	int english;
} Student;

然后呢,增,删,查,改,显示,分别封装为五个函数。其中添加和删除的部分,为了使数据长度随函数内增加和删除的操作改变,传参时除了数组指针,数组的长度也使用指针型传递。

代码语言:javascript
复制
//添加学生信息
void AddStudent(Student stu_arr[], int* length) {
	//如果存储的信息量已达最大
	if (*length == MAXSIZE) {
		printf("不能添加更多的学生信息了!\n");
		return ;
	}

	Student stu;
	printf("请输入要添加的学生姓名:");
	scanf("%s", &stu.name);
	printf("请输入要添加的学生学号:");
	scanf("%s", &stu.ID);
	printf("请输入要添加的学生语文成绩:");
	scanf("%d", &stu.chinese);
	printf("请输入要添加的学生数学成绩:");
	scanf("%d", &stu.math);
	printf("请输入要添加的学生英语成绩:");
	scanf("%d", &stu.english);

	stu_arr[*length] = stu;
	(*length)++;
	int in = (*length) - 1;
	printf("学生 %s 信息添加成功!\n", stu_arr[in].name);
}

删除的部分使用数组覆盖的方式实现。

代码语言:javascript
复制
//删除学生信息
void DeleteStudent(Student stu_arr[], int* length) {
	//如果数组已经为空
	if (length == 0) {
		printf("没有可删除的数据!\n");
		return ;
	}

	char name[30];
	printf("请输入要删除的学生姓名:");
	scanf("%s", &name);

	int i, j, is_find = 0;
	for (i = 0; i < *length && is_find == 0; i++) {
		if (strcmp(stu_arr[i].name, name) == 0) {
			is_find = 1;
			//对被删除信息进行覆盖
			for (j = i; j < (*length) - 1; j++) {
				stu_arr[j] = stu_arr[j + 1];
			}
		}
	}

	if (is_find == 0) {
		printf("未找到该学生信息!\n");
	} else {
		(*length)--;
		printf("学生 %s 信息删除成功!\n", name);
	}
}

代码语言:javascript
复制
//查找学生信息
void FindStudent(Student stu_arr[], int length) {
	char name[30];
	printf("请输入要查找的学生姓名:");
	scanf("%s", &name);

	int i, is_find = 0;
	for (i = 0; i < length && is_find == 0; i++) {
		if (strcmp(stu_arr[i].name, name) == 0) {
			is_find = 1;
			printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
			printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n", 
				   stu_arr[i].name, stu_arr[i].ID, 
				   stu_arr[i].chinese, stu_arr[i].math, 
				   stu_arr[i].english);
		}
	}

	if (is_find == 0) {
		printf("未找到该学生信息!\n");
	}
}

代码语言:javascript
复制
//修改学生信息
void UpdateStudent(Student stu_arr[], int length) {
	char name[30];
	printf("请输入要修改的学生姓名:");
	scanf("%s", &name);

	int i, is_find = 0;
	for (i = 0; i < length && is_find == 0; i++) {
		if (strcmp(stu_arr[i].name, name) == 0) {
			is_find = 1;
			printf("姓名:%s\n修改为:", stu_arr[i].name);
			scanf("%s", &stu_arr[i].name);
			printf("学号:%s\n修改为:", stu_arr[i].ID);
			scanf("%s", &stu_arr[i].ID);
			printf("语文成绩:%d\n修改为:", stu_arr[i].chinese);
			scanf("%d", &stu_arr[i].chinese);
			printf("数学成绩:%d\n修改为:", stu_arr[i].math);
			scanf("%d", &stu_arr[i].math);
			printf("英语成绩:%d\n修改为:", stu_arr[i].english);
			scanf("%d", &stu_arr[i].english);
		}
	}

	if (is_find == 0) {
		printf("未找到该学生信息!\n");
	} else {
		printf("学生 %s 信息修改成功!\n", name);
		printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
		printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n", 
		       stu_arr[i - 1].name, stu_arr[i - 1].ID, 
			   stu_arr[i - 1].chinese, stu_arr[i - 1].math,
			   stu_arr[i - 1].english);
	}
}

显示

输出学生信息时,我们使用一些制表符美化输出。

代码语言:javascript
复制
//显示所有学生信息
void PrintAll(Student stu_arr[], int length) {
	printf("学生信息\n");
	printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
	int i;
	for (i = 0; i < length; i++) {
		printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n", 
				   stu_arr[i].name, stu_arr[i].ID, 
				   stu_arr[i].chinese, stu_arr[i].math, 
				   stu_arr[i].english);
	}
}

录入

实现分不同科目录入学生信息。

代码语言:javascript
复制
//录入各科成绩
void SetScore(Student stu_arr[], int length) {
	int key;
	printf("请问你想录入哪个科目的成绩?\n"); 
	printf("1.语文 2.数学 3.英语\n");
	printf("@请输入操作号码>");
	scanf("%d", &key);
	if (key < 1 || key > 3) {key = 1;}
	
	if (key == 1) {
		int i;
		for (i = 0; i < length; i++) {
			printf("请输入 %s 的语文成绩:", stu_arr[i].name);
			scanf("%d", &stu_arr[i].chinese);
		}
	} else if (key == 2) {
		int i;
		for (i = 0; i < length; i++) {
			printf("请输入 %s 的数学成绩:", stu_arr[i].name);
			scanf("%d", &stu_arr[i].math);
		}
	} else {
		int i;
		for (i = 0; i < length; i++) {
			printf("请输入 %s 的英语成绩:", stu_arr[i].name);
			scanf("%d", &stu_arr[i].english);
		}
	}
	printf("录入成功!\n");
}

排序函数

我们调用< stdlib.h>库中的 qsort 对学生成绩进行排名,首先为不同科目各写一个排序函数。

代码语言:javascript
复制
//比较语文成绩的排序函数 
int CmpByChinese(const void* x, const void* y) {
	Student stu_x = *(Student*)x;
	Student stu_y = *(Student*)y;
	
	return stu_x.chinese < stu_y.chinese;
}
//比较数学成绩的排序函数 
int CmpByMath(const void* x, const void* y) {
	Student stu_x = *(Student*)x;
	Student stu_y = *(Student*)y;
	
	return stu_x.math < stu_y.math;
}
//比较英语成绩的排序函数 
int CmpByEnglish(const void* x, const void* y) {
	Student stu_x = *(Student*)x;
	Student stu_y = *(Student*)y;
	
	return stu_x.english < stu_y.english;
}

排名

调用不同的排序函数实现不同科目成绩的排名并输出。

代码语言:javascript
复制
//查看各科成绩排名
void ShowRanking(Student stu_arr[], int length) {
	int key;
	printf("请问你想根据哪个科目的成绩进行排名?\n");
	printf("1.语文 2.数学 3.英语\n");
	printf("@请输入操作号码>");
	scanf("%d", &key);
	if (key < 1 || key > 3) {key = 1;}
	
	if (key == 1) {
		qsort(stu_arr, length, sizeof(Student), CmpByChinese);
	} else if (key == 2) {
		qsort(stu_arr, length, sizeof(Student), CmpByMath);
	} else {
		qsort(stu_arr, length, sizeof(Student), CmpByEnglish);
	}
	printf("排序成功!\n");
	PrintAll(stu_arr, length); 
}

查看不及格学生

实现一个查看挂科超 2 科的学生名单的功能。

代码语言:javascript
复制
//查看不及格科目达两科的学生
void ShowFailStudent(Student stu_arr[], int length) {
	printf("@学生名单@以下同学不及格科目达 2 科\n");
	printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
	int i;
	for (i = 0; i < length; i++) {
		int sum = 0;
		if (stu_arr[i].chinese < 60) sum++;
		if (stu_arr[i].math < 60) sum++;
		if (stu_arr[i].english < 60) sum++;
		
		if (sum >= 2) {
			printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n", 
				   stu_arr[i].name, stu_arr[i].ID, 
				   stu_arr[i].chinese, stu_arr[i].math, 
				   stu_arr[i].english);
		}
	}
}

主菜单。

简单的交互界面。

代码语言:javascript
复制
//显示主菜单
void ShowMenu() {
	printf("@@学生信息管理系统@@\n"); 
	printf("1.添加学生信息\n");
	printf("2.删除学生信息\n");
	printf("3.查找学生信息\n");
	printf("4.修改学生信息\n");
	printf("5.查看所有信息\n");
	printf("6.录入学生成绩\n");
	printf("7.查看成绩排名\n");
	printf("8.查看不及格名单\n");
	printf("9.退出管理系统\n");
} 

主函数

收尾部分。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "student.h"

int main() {
	//存储学生信息的数组
	Student stu_arr[MAXSIZE];
	int length = 0; 
	
	int flag = 1;
	while (flag == 1) {
		ShowMenu();
		char key;
		printf("@@请输入操作号码>");
		scanf("%c", &key);
		
		switch (key) {
			case '1':
				AddStudent(stu_arr, &length);
				break;
			case '2':
				DeleteStudent(stu_arr, &length);
				break;
			case '3':
				FindStudent(stu_arr, length);
				break;
			case '4':
				UpdateStudent(stu_arr, length);
				break;
			case '5':
				PrintAll(stu_arr, length);
				break;
			case '6':
				SetScore(stu_arr, length);
				break;
			case '7':
				ShowRanking(stu_arr, length);
				break;
			case '8':
				ShowFailStudent(stu_arr, length);
				break;
			case '9':
				flag = 0;
				system("cls");
				printf("谢谢使用!\n");
				break;
			default:
				break;
		}
		
		system("pause");
		system("cls");
		//清空键盘输入缓冲区,防止 key 读入键入的回车 
		fflush(stdin);
	}
	
	return 0;
}

运行效果

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

开发工具 Dev-C++。 源码下载地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档