宿舍管理人员使用的宿舍管理软件——C代码

【问题描述】为宿舍管理人员编写一个宿舍管理软件, 查询学生宿舍住宿信息,开学时录入学生住宿信息,毕业时删除学生住宿信息。
【基本要求】
(1)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入排序等任选一种);
(2)实现如下查询功能:
   按姓名查询
   按学号查询
   按房号查询
   打印任意查询结果(可以连续操作)
(3)录入、删除学生住宿信息,同时,将数据文本的信息及时更新。

代码解析:

数据文件电脑存在,且已经有若干名学生信息

要求1的实现:程序中采用关键字 ‘学号’ 以冒泡方式进行排序!程序流程:先读取数据文件,然后按照关键字‘学号’以冒泡顺序排序,再写入到数据文件中!

要求2的实现:均已经实现

要求3的实现:均已经实现

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

#define N 20
typedef struct {
	char stuID[N]; //学号
	char name[N]; //姓名
	char roomID[N]; //房号
}StuType;

typedef struct {
	StuType S[N];
	int stunum; //学生人数
}Student;

/////////////////////////////////////////////////////////////////////
//子函数的声明
/////////////////////////////////////////////////////////////////////
void menu(); //索引菜单
void Allprint(Student ); //打印学生信息到屏幕
void stuID_Sort(Student *); //学号排序:由小到大排序 冒泡排序
void name_Sort(Student *); //姓名排序:由小到大排序 冒泡排序
void Read(Student *); //将文本中的数据读取到结构体数组中
void Write(Student *); //将学生数据存储到数据文件中
void roomIDsort(Student *); //根据房号,进行冒泡排序
void NameSearch(Student *Stu); //输入学生名字,输出对应的学生信息
void stuIDSearch(Student *Stu); //输入学生学号,输出对应的学生信息
void HouseSearch(Student *Stu); //输入学生房号:输出对应的学生信息
void AddStu(Student *PStu); //增加学生信息,按照学号进行排序,然后添加到数据文件中
void DeleteStu(Student *PStu); //通过学号删除学生信息,按照学号进行排序,然后添加到数据文件中
//通过输入学号,改变学生信息;按照学号进行排序,然后添加到数据文件中
void ChangeStu(Student *PStu);
							   
//主函数:
int main() {

	Student Stu;
	Read(&Stu); //将文件中的数据读取到结构体数组中
	stuID_Sort(&Stu); //将学生数据按照学号进行冒泡排序
	Write(&Stu); //将排序好的学生信息输入到数据文件中
	menu(); //菜单索引
	while (1)
	{

		char input;
		if (kbhit())
		{
			input = getch();
			if (input == '1')
			{
				stuIDSearch(&Stu);
			}
			if (input == '2')
			{
				NameSearch(&Stu);
			}
			if (input == '3')
			{
				HouseSearch(&Stu);
			}
			if (input == '4')
			{
				stuID_Sort(&Stu);
				Allprint(Stu);
			}

			if (input == '5')
			{
				name_Sort(&Stu);
				Allprint(Stu);
			}
			if (input == '6')
			{
				roomIDsort(&Stu);
				Allprint(Stu);
			}
			if (input == '7')
			{
				AddStu(&Stu);
			}
			if (input == '8')
			{
				DeleteStu(&Stu);
			}

			if (input == '9')
			{
				ChangeStu(&Stu);
			}
			if (input == 'e')
			{
				printf("感谢您的使用!");
				system("cls");
				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("               7、增加信息                    \n");
	printf("               8、删除信息                    \n");
	printf("               9、修改信息                    \n");
	printf("               e、退出                       \n");
	printf("**********************************************\n");
	printf("               请选择...                      \n ");
}

//打印学生信息到屏幕
void Allprint(Student Stu) {
	printf("学号\t姓名\t房号\n");
	for (int i = 0; i < Stu.stunum; i++)
	{
		printf("%s\t%s\t%s\n", Stu.S[i].stuID, Stu.S[i].name, Stu.S[i].roomID);
	}
}
//学号排序:由小到大排序 冒泡排序
void stuID_Sort(Student *PStu) {
	int len = PStu->stunum;
	int i, j;
	StuType temp;
	for (i = 0; i < len - 1; i++)
		for (j = 0; j < len - 1 - i; j++)
			if (strcmp(PStu->S[j].stuID, PStu->S[j + 1].stuID) > 0) {
				temp = (PStu->S[j]);
				(PStu->S[j]) = (PStu->S[j+1]);
				(PStu->S[j+1]) = temp;
			}
}

//姓名排序:由小到大排序 冒泡排序
void name_Sort(Student *PStu) {
	int len = PStu->stunum;
	int i, j;
	StuType temp;
	for (i = 0; i < len - 1; i++)
		for (j = 0; j < len - 1 - i; j++)
			if (strcmp(PStu->S[j].name, PStu->S[j + 1].name) > 0) {
				temp = (PStu->S[j]);
				(PStu->S[j]) = (PStu->S[j + 1]);
				(PStu->S[j + 1]) = temp;
			}
}
//将文本中的数据读取到结构体数组中
void Read(Student *PStu) {

	FILE *fp = fopen("./Data Structure.txt", "r");
	int i = 0;
	if (fp == NULL) {
		printf("can not open the file");
		exit(0);
	}
	while (1)
	{
		int n = fscanf(fp, "%s %s %s\n", PStu->S[i].stuID, PStu->S[i].name, PStu->S[i].roomID);
		if (n == -1) {
			break;
		}
		PStu->stunum = i + 1;
		i++;
	}
	fclose(fp);
}

//将学生数据存储到数据文件中
void Write(Student *PStu) {
	FILE *fp = fopen("./Data Structure.txt", "w");
	int i = 0;
	if (fp == NULL) {
		printf("can not open the file");
		exit(1);
	}
	for (i = 0; i < PStu->stunum;i++) {
		fprintf(fp,"%s\t%s\t%s\n", PStu->S[i].stuID, PStu->S[i].name, PStu->S[i].roomID);
	}
	fclose(fp);
}

//根据房号,进行冒泡排序
void roomIDsort(Student *PStu) {
	int len = PStu->stunum;
	int i, j;
	StuType temp;
	for (i = 0; i < len - 1; i++)
		for (j = 0; j < len - 1 - i; j++)
			if (strcmp(PStu->S[j].roomID, PStu->S[j + 1].roomID) > 0) {
				temp = (PStu->S[j]);
				(PStu->S[j]) = (PStu->S[j + 1]);
				(PStu->S[j + 1]) = temp;
			}
}

//输入学生名字,输出对应的学生信息
void NameSearch(Student *Stu) {
	printf("请输入该学生的姓名:\n");
	char key[N];
	scanf("%s", key);
	int  i;
	int flag = 0;
	for (i=0;i< Stu->stunum;i++)
		if (strcmp(Stu->S[i].name, key) == 0)
		{
			flag = 1;
			break;
		}
	if (flag == 0)
	{
		printf("查无此人!");
		return;
	}
	printf("查询成功!\t");
	printf("学号:%s,姓名:%s,房号:%s\n", Stu->S[i].stuID, Stu->S[i].name, Stu->S[i].roomID);
}

//输入学生学号,输出对应的学生信息
void stuIDSearch(Student *Stu) {
	 
	printf("请输入该学生的学号:\n");
	char key[N];
	scanf("%s", key);
	int nn = 0;
	int low, high, mid;
	low = 1;
	high = Stu->stunum;
	while (low <= high)
	{
		mid = (high + low) / 2;
		if (strcmp(key, Stu->S[mid].stuID) == 0)
		{
			nn = mid;
			break;
		}
		else if (strcmp(key, Stu->S[mid].stuID) < 0)
			high = mid - 1;
		else
			low = mid + 1;
	}
	printf("查询成功!");
	printf("学号:%s,姓名:%s,房号:%s\n", Stu->S[nn].stuID, Stu->S[nn].name, Stu->S[nn].roomID);
}

//输入学生房号:输出对应的学生信息
void HouseSearch(Student *Stu) {
	printf("请输入该学生的房号:\n");
	char key[N];
	scanf("%s", key);
	int i;
	int flag = 0;
	for (i = 0; i < Stu->stunum; i++)
		if (strcmp(Stu->S[i].roomID, key) == 0)
		{
			flag = 1;
			break;
		}
	if (flag == 0)
	{
		printf("查无此人!");
		return;
	}
	printf("查询成功!\t");
	printf("学号:%s,姓名:%s,房号:%s\n", Stu->S[i].stuID, Stu->S[i].name, Stu->S[i].roomID);
}

//增加学生信息,按照学号进行排序,然后添加到数据文件中
void AddStu(Student *PStu) {
	printf("请依次输入该学生的学号、姓名、房号:\n");
	char num[N];
	char name[N];
	char house[N];
	scanf("%s %s %s", &num, &name, &house);
	strcpy(PStu->S[PStu->stunum].stuID, num);
	strcpy(PStu->S[PStu->stunum].name, name);
	strcpy(PStu->S[PStu->stunum].roomID, house);
	PStu->stunum++;
	stuID_Sort(PStu);
	Write(PStu);
	printf("添加成功!\n");
}

//通过学号删除学生信息,按照学号进行排序,然后添加到数据文件中
void DeleteStu(Student *PStu) {
	printf("请输入该学生的学号:\n");
	char key[N];
	scanf("%s", &key);
	int i;
	int flag = 0;
	for (i=0;i< PStu->stunum;i++)
		if (strcmp(PStu->S[i].stuID,key) == 0)
		{
			flag = 1;
			break;
		}
	if (flag == 0)
	{
		printf("查无此人!");
		return;
	}
	printf("学号:%s,姓名:%s,房号:%s\n", PStu->S[i].stuID, PStu->S[i].name, PStu->S[i].roomID);
	printf("确定删除请按1,放弃删除请按0...\n");
	int q,k;
	
	scanf("%d", &q);
	if (q == 0) {
		return;
	}
	else
	{
		if (i == (PStu->stunum - 1)) {
			//删除最后一个学生信息
			 
		}
		else
		{
			for (k = i; k < PStu->stunum - 1; k++) {
				PStu->S[k] = PStu->S[k + 1];
				 
			}
		}
		PStu->stunum--;
		stuID_Sort(PStu);
		Write(PStu);
		printf("删除成功!\n");
	}		
}

//通过输入学号,改变学生信息;按照学号进行排序,然后添加到数据文件中
void ChangeStu(Student *PStu) {
	printf("请输入该学生的学号:\n");
	char key[N];
	scanf("%s", &key);
	int i;
	int flag = 0;
	for (i=0;i< PStu->stunum;i++)
		if (strcmp(PStu->S[i].stuID, key) == 0)
		{
			flag = 1;
			break;
		}
	if (flag == 0)
	{
		printf("查无此人!");
		return ;
	}
	printf("请依次输入修改后的学号\t姓名\t房号:\n");
	scanf("%s %s %s",PStu->S[i].stuID,PStu->S[i].name,PStu->S[i].roomID);
	stuID_Sort(PStu);
	Write(PStu);
	printf("修改成功!\n");
}

发布了76 篇原创文章 · 获赞 32 · 访问量 7935

猜你喜欢

转载自blog.csdn.net/wuwuku123/article/details/103714971