【问题描述】为宿舍管理人员编写一个宿舍管理软件, 查询学生宿舍住宿信息,开学时录入学生住宿信息,毕业时删除学生住宿信息。
【基本要求】
(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");
}