C语言--学生管理系统--(完整代码)

本系统分成了三个文件,main.c student.c student.h

功能:

实现对班级成员的增加、删除、修改、遍历、根据成绩排序。

增加 会检查,现在班级已有的人数,班级是否已满(没有学号重复检测)

删除(根据学号查询-->删除) 会判断 班级中是否存在这个学生

修改(根据学号查询) 可以修改学生的其他信息(除学号外),也有检测该班级中是否存在该学生ID的功能函数

遍历 会判断该班级中是否有学生,没有学生 会做出提示

排序 根据成绩,由高到低,本系统使用的是冒泡排序

注:没有调用数据库,所有的数据都是存在内存里

---代码中有详细注释---

main.c功能

主要包含文件的整体逻辑(子函数的调用),主要的逻辑代码

student.c功能

是子函数的功能实现的执行代码

student.h功能

是函数的所有的头文件,以及结构体的定义

代码

main.c

#include "./student.h"

int main(int argc, const char *argv[])
{
	//使用结构体之前需要定义一个结构体类型的变量

	class_t my_class;//定义一个班级的结构体变量
	my_class.count = 0;//初始化班级人数
	int choose = 0;
	//循环等待客户操作
	while(1){
		//打印主菜单
		print_menu();
		printf(">>");
		scanf("%d",&choose);
		switch(choose){
			case 1://插入学生
				insert_student(&my_class);
				break;
			case 2://遍历学生
				print_student(&my_class);
				break;
			case 3://修改学生信息(没有学号)
				xiugai_student(&my_class);
				break;
			case 4://删除学生
				rm_student(&my_class);
				break;
			case 5://根据成绩排序
				PX_student(&my_class);
				break;
			case 6://退出系统
				exit(0);
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
		}
	
	}
	return 0;
}

student.c

#include "./student.h"

void print_menu(){
	printf("-------------------------------------------------\n");
	printf("                学生管理系统                     \n");
	printf("-------------------------------------------------\n");
	printf("|   1.添加学员  2.遍历学员信息  3.修改学员信息  |\n");
	printf("|   4.删除学员  5.根据成绩降序排序  6.退出程序  |\n");
	printf("-------------------------------------------------\n");
}

//添加学员信息的函数
int insert_student(class_t *p_class){//主函数传输参数,接收,由于传输的是指针变量,需要定义一个同类型的指针接收
	//指针的非空检查 否则操作空指针会有段错误
	if(NULL == p_class){
		printf("入参指针为空,请检查\n");
		exit(-1);
	}
	if(40 == p_class->count)
	{
		printf("班级人数已满,无法插入\n");
		return 0;
		
	}
	printf("请输入学员信息 :姓名 年龄 学号 成绩\n");
	scanf("%s%d%d%d",
			p_class->stu[p_class->count].name,
			&(p_class->stu[p_class->count].age),
			&(p_class->stu[p_class->count].id),
			&(p_class->stu[p_class->count].score));
	//信息写入到指针对应的结构体的 数组 的 新的位置(count位置)
	//添加完学生后,班级人数加加
	p_class->count++;
}

//输出所有学员信息的函数
int print_student(class_t *p_class){
	//判断 非空检查
	if(NULL == p_class){
		printf("入参指针为空,请检查\n");
		exit(-1);
	}
	if(0 == p_class->count)
	{
		printf("没有学生,无法遍历\n");
		return 0;
	}else{
		int i = 0;
		//循环遍历输出,该指针指向的结构体的数组的 第i个成员
		for(i = 0; i < p_class->count; i++){
			printf("%s %d %d %d \n",
					p_class->stu[i].name,
					p_class->stu[i].age,
					p_class->stu[i].id,
					p_class->stu[i].score);
		}
	}

}

//修改学生信息
int xiugai_student(class_t *p_class)
{
	//非空检查
	if(NULL == p_class)
	{
		printf("修改,传入指针错误\n");
		exit(-1);
	}

	printf("请输入要修改的学生的学号>>");
	int num = 0;
	int i = 0;
	scanf("%d",&num);//接收对应的学号
	//循环遍历学号所对应的下标
	for(i=0;icount;i++)
	{
		if(num == p_class->stu[i].id)
		{//如果找到,说明该学生存在
			printf("---该学生存在---\n");
			break;	
		}	
	}
	if(i == p_class->count)
	{
		printf("----该学生不存在----\n");
		return 0;	
	}
	printf("请输入该学生新的信息:姓名 年龄 成绩\n");
	scanf("%s%d%d",
			p_class->stu[i].name,
			&(p_class->stu[i].age),
			&(p_class->stu[i].score));
	printf("修改成功\n");
	return 0;
}




//删除成员
int rm_student(class_t *p_class)
{
	//非空检查
	if(NULL == p_class)
	{
		printf("删除传入指针错误\n");
		exit(-1);
	}

	int num = 0;
	int i = 0;
	int n=0;//定义一个标识
	printf("请输入要删除的学生的学号>>");	
	scanf("%d",&num);
	//循环遍历找到该学生的学号,对应的数组的下标
	for(i=0;icount;i++)
	{
		if(num == p_class->stu[i].id)
		{
			n=1;//标识
			printf("--该学生存在--正在删除---\n");
			break;	
		}	
	}//此时i里存的数据就是 对应学号的学生的 数组的下标

	if(n == 1)
	{
		//从这一位开始,由后往前,逐个赋值---覆盖
		for(i;icount;i++)
		{
			p_class->stu[i] = p_class->stu[i+1];		
		}

		//删除完成后,班级人数减减
		p_class->count--;
	
		printf("删除成功\n");
	}else{
		printf("----该学生不存在----\n");
		return -1;
	}

	return 0;
}

//排序
int PX_student(class_t *p_class)
{
	int i = 0;
	int j = 0;
	//定义一个跟学生结构体 相同类型的变量,用来充当 交换数据的桶
	student_t temp;

	printf("降序排列\n");
	//冒泡排序
	//根据成绩,交换数组中的两个 学生结构体
	for(i=0;icount;i++)
	{
		for(j=0;jcount-i-1;j++)
		{
			if(p_class->stu[j].score < p_class->stu[j+1].score)
			{
				temp = p_class->stu[j];
				p_class->stu[j] = p_class->stu[j+1];
				p_class->stu[j+1] = temp;
			}
			
		}
		
	}
	printf("排序完成\n");
	return 0;
	
}

注:自己调整 菜单格式

student.h

#ifndef STUDENT_H
#define STUDENT_H
#include 
#include 
//定义学生结构体,typedef重命名,命名成student_t
typedef struct Student{
	char name[32];
	int age;
	int id;
	int score;
}student_t;
//定义班级结构体,typedef重命名,class_t
//该结构体 调用学生结构体,生成对应的结构体数组
typedef struct Class{
	student_t stu[40];//学生成员结构体
	int count;//班级人数
}class_t;

//原型声明
//注意:原型声明 传参位置需要加参数类型
void print_menu();
//传过来的是&my_class(班级的结构体指针) 需要用 班级的结构体指针 进行接收

int insert_student(class_t*);
int print_student(class_t*);
int rm_student(class_t*);
int xiugai_student(class_t*);
int PX_student(class_t*);

#endif

编译:执行

本系统用Ubuntu编写,gcc编译

把三个文件放一个目录下,

gcc main.c student.c

 生成对应的a.out 可执行文件

你可能感兴趣的:(C语言-基础编程,指针-传参,c语言)