学生管理系统(文件版)

    学生管理系统,要求的就是增删查改,显示学生信息,对学生进行排序。这里考虑用动态内存的方法,先开辟一块内存,不够了在增容。这样比用顺序表来存储更加的灵活。退出学生管理系统时,将内存中的数据写入到文件中,这样在下次进入系统时,学生数据依然可以看见。

结构体的设计😉

    为了保证能更加灵活的存储学生信息,这里考虑用两个结构体,一个是学生的信息,另一个有指向保存学生信息的指针,后面对它进行内存的申请,记录最大容量,和有效数据。

typedef struct stuinfo
{
	char name[20];
	int age;
	char sex[5];
	char id[10];
	char grade[20];
}stuinfo;
typedef struct student
{
	struct stuinfo* date;
	int capicity;
	int count;
}student;

所有接口🤨

//初始化学生系统
void initStudent(student* ps);
//增加学生
void addStudent(student* ps);
//显示学生
void showStudent(const student* ps, int pos);
//查找学生
int findStudent(const student* ps, char* name);
//排序
void sortStudent(student* ps);
//删除学生
void delStudent(student* ps);
//修改学生信息
void modifStudent(student* ps);
//查找学生
void searStudent(student* ps);
//销毁存储学生内存
void destroyStudent(student* ps);

接口的实现 😊

     由于学生数据是保存在文件中,那么在初始化学生管理系统时,要先加载文件中的数据到内存中。在退出学生系统时,要保存数据到文件中。这里使用了assert保证指针的有效性。

void checkCapicity(student* ps)
{
	if (ps->count == ps->capicity)
	{
		stuinfo* pa = (stuinfo*)realloc(ps->date, sizeof(stuinfo) * (ps->capicity + 2));
		if (pa != NULL)
		{
			ps->date = pa;
			ps->capicity += 2;
			printf("扩容成功\n");
		}
	}
}
void loadStudent(student* ps)
{
	FILE* pf = fopen("student.txt", "rb");
	if (pf == NULL)
	{
		return;
	}
	stuinfo tmp = { 0 };
	while ((fread(&tmp, sizeof(stuinfo), 1, pf)) != 0)
	{
		checkCapicity(ps);
		ps->date[ps->count] = tmp;
		ps->count++;
		
	}

	fclose(pf);
	pf = NULL;
}
void initStudent(student* ps)
{
	assert(ps);
	ps->count = 0;
	ps->date = (stuinfo*)malloc(sizeof(stuinfo) * 3);
	ps->capicity = 3;
	loadStudent(ps);
}

void addStudent(student* ps)
{
	assert(ps);
	checkCapicity(ps);

	printf("请输入学生姓名:");
	scanf("%s", ps->date[ps->count].name);
	printf("请输入学生年龄:");
	scanf("%d", &(ps->date[ps->count].age));
	printf("请输入学生性别:");
	scanf("%s", ps->date[ps->count].sex);
	printf("请输入学生学号:");
	scanf("%s", ps->date[ps->count].id);
	printf("请输入学生班级:");
	scanf("%s", ps->date[ps->count].grade);
	ps->count++;
	printf("增加成功\n");
}
void showStudent(const student* ps, int pos)
{
	if (ps->count == 0)
	{
		printf("学生系统为空\n");
		return;
	}
	if (pos == -1)
	{
		int i = 0;
		printf("姓名\t年龄\t性别\t学号\t班级\n");
		for (i = 0; i < ps->count; i++)
		{
			printf("%s\t%d\t%s\t%s\t%s\n", ps->date[i].name,
				ps->date[i].age,
				ps->date[i].sex,
				ps->date[i].id,
				ps->date[i].grade);
		}
	}
	else
	{
		printf("姓名\t年龄\t性别\t学号\t班级\n");
		printf("%s\t%d\t%s\t%s\t%s\n", ps->date[pos].name,
			ps->date[pos].age,
			ps->date[pos].sex,
			ps->date[pos].id,
			ps->date[pos].grade);
	}
}
int findStudent(const student* ps, char* name)
{
	

	int i = 0;
	for (i = 0; i < ps->count; i++)
	{
		if (strcmp(ps->date[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
int cmp(const void* e1, const void* e2)
{
	return ((stuinfo*)e1)->age - ((stuinfo*)e2)->age;
}
void sortStudent(student* ps)
{
	assert(ps);
	if (ps->count == 0)
	{
		printf("学生系统为空\n");
		return;
	}
	qsort(ps->date, ps->count, sizeof(ps->date[0]), cmp);
	printf("排序成功\n");
}
void delStudent(student* ps)
{
	char name[10] = { 0 };
	printf("请输入你要删除学生的姓名:");
	scanf("%s", name);
	int ret = findStudent(ps, name);
	if (ret == -1)
	{
		printf("抱歉,你要删除的学生不存在\n");
		return;
	}
	else
	{
		int i = 0;
		for (i = ret; i < ps->count - 1; i++)
		{
			ps->date[i] = ps->date[i + 1];
		}
		ps->count--;
		printf("删除成功\n");
	}
}
void modifStudent(student* ps)
{
	char name[10] = { 0 };
	printf("请输入你要修改学生的姓名:");
	scanf("%s", name);
	int pos = findStudent(ps, name);
	if (pos == -1)
	{
		printf("抱歉,你要修改的学生不存在\n");
		return;
	}
	else
	{
		printf("请输入学生姓名:");
		scanf("%s", ps->date[pos].name);
		printf("请输入学生年龄:");
		scanf("%d", &(ps->date[pos].age));
		printf("请输入学生性别:");
		scanf("%s", ps->date[pos].sex);
		printf("请输入学生学号:");
		scanf("%s", ps->date[pos].id);
		printf("请输入学生班级:");
		scanf("%s", ps->date[pos].grade);
		printf("修改成功\n");
	}
}
void searStudent(student* ps)
{
	char name[5] = { 0 };
	printf("请输入你要查找学生的姓名:");
	scanf("%s", name);
	int ret = findStudent(ps, name);
	if (ret == -1)
	{
		printf("抱歉,没有你要查找的学生\n");
	}
	else
	{
		printf("你要查找的学生信息:\n");
		showStudent(ps, ret);
	}
}
void destroyStudent(student* ps)
{
	assert(ps);
	free(ps->date);
	ps->date = NULL;
}
void saveStudent(student* ps)
{
    assert(ps);
	FILE* pf = fopen("student.txt", "wb");
	if (pf == NULL)
	{
		return;
	}
	int i = 0;
	for (i = 0; i < ps->count; i++)
	{
		fwrite(&(ps->date[i]), sizeof(stuinfo), 1, pf);
	}
	fclose(pf);
	pf = NULL;
}

测试模块😆

void menu()
{
	printf("***********************************\n");
	printf("*****   1.add       2.show   ******\n");
	printf("*****   3.find      4.sort   ******\n");
	printf("*****   5.del       6.modif  ******\n");
	printf("*****   0.exit               ******\n");
	printf("***********************************\n");
}
int main()
{
	student stu;
	initStudent(&stu);
	int input = 0;
	do
	{
		menu();
		printf("请输入你的选择:");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			addStudent(&stu);
			break;
		case 2:
			showStudent(&stu, -1);
			break;
		case 3:
			searStudent(&stu);
			break;
		case 4:
			sortStudent(&stu);
			break;
		case 5:
			delStudent(&stu);
			break;
		case 6:
			modifStudent(&stu);
			break;
		case 0:
			saveStudent(&stu);
			destroyStudent(&stu);
			printf("退出学生管理系统\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
			break;
		}
	} while (input);

	return 0;
}

 小结😯

     这里的很多接口都是一些基本对数据的操作,需要我们有一个对整个系统流程的梳理,还有对一些细节上的注意。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
您使用Python中的文件操作(如打开、读取、写入、关闭文件)来实现用户账号管理和学生管理系统文件。以下是一个简单的示例代码,演示如何使用文本文件存储和读取用户账号和学生信息。 ```python # 用户账号管理系统文件 # 打开用户账号文件 user_file = open("user_accounts.txt", "a+") # 获取用户输入的用户名和密码 username = input("请输入用户名:") password = input("请输入密码:") # 检查用户输入的用户名是否已存在 user_file.seek(0) # 将文件指针移动到文件开头 for line in user_file: if username in line: print("该用户名已存在!") break else: # 将新用户的账号信息写入文件 user_file.write(username + "," + password + "\n") print("用户账号创建成功!") # 关闭用户账号文件 user_file.close() # 学生管理系统文件 # 打开学生信息文件 student_file = open("student_info.txt", "a+") # 获取用户输入的学生信息 name = input("请输入学生姓名:") age = input("请输入学生年龄:") score = input("请输入学生成绩:") # 将新学生的信息写入文件 student_file.write(name + "," + age + "," + score + "\n") print("学生信息添加成功!") # 关闭学生信息文件 student_file.close() ``` 在上述示例代码中,我们分别打开了用户账号文件和学生信息文件,使用 `a+` 模式来打开文件,这意味着我们既可以读取文件中已有的内容,也可以在文件末尾添加新的内容。在用户账号管理系统中,我们首先读取文件中已有的账号信息,然后检查用户输入的用户名是否已存在,如果不存在则将新用户的账号信息写入文件。在学生管理系统中,我们直接将用户输入的学生信息写入文件。最后,我们都关闭了文件,释放系统资源。 请注意,上述代码仅为示例,实际应用中您需要根据需求进行修改和完善。另外,为了确保文件操作的安全性和稳定性,建议您在代码中添加异常处理机制。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小太空人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值