C++数据结构课程设计,学生宿舍管理系统
前言
使用了顺序表数据结构
一、资源地址
资源地址:源码+报告
二、数据结构选择
采用结构体数组作为顺序表
三、功能界面(部分)
四、数据结构代码(部分)
typedef struct Stu {
char stuNo[20];
char stuName[20];
char dormNo[10]; //宿舍号
char stuAge[3];
char stuSex[3];
char stuNative[20];
char stuMajor[20];//专业
}Stu;
void Swap(Stu &a, Stu &b, int flag)
{
/**
* 此函数实现两个结构体进行交换 用于排序和插入操作中
* flag 有三个值 1 2 3
* flag == 1 时进行学号比较并交换
* flag == 2 时进行姓名比较并交换
* flag == 3 时进行宿舍号比较并交换
*/
Stu temp; //结构体交换临时变量
if (flag == 1)
{
if (strcmp(a.stuNo, b.stuNo) > 0) {
temp = a;
a = b;
b = temp;
}
}
else if (flag == 2)
{
if (strcmp(a.stuName, b.stuName) > 0) {
temp = a;
a = b;
b = temp;
}
}
else
{
if (strcmp(a.dormNo, b.dormNo) > 0)
{
temp = a;
a = b;
b = temp;
}
else if(strcmp(a.dormNo, b.dormNo)==0 && strcmp(a.stuNo, b.stuNo)>0)
{
temp = a;
a = b;
b = temp;
}
}
}
void InsertStu(Stu stu[], int stuNum, Stu &stuTemp, int flag)
{
/**
* 功能:接受要插入学生信息 并按指定顺序插入
* st[] 成员结构体数组
* stuNum 学生人数
* stuTemp 要插入学生结构体
* flag 按何种顺序插入
* flag == 1 学号
* flag == 2 姓名
* flag == 3 宿舍号
* 说明:此函数可需调用 Swap(Stu &a, Stu &b, int flag) 函数
*/
stu[stuNum] = stuTemp;
for (int i=stuNum; i>0; i--)
{
Swap(stu[i-1], stu[i], flag);
}
}
/****************************************************/
void OutStuInfo(Stu stu[], int m)
{
/**
* 功能:输出学生信息 并进行简单排版
* stu[] 结构体数组
* m 要输出学生结构体下标
*/
//printf("***********************************************************************\n");
//printf("* 学号 姓名 性别 年龄 籍贯 专业 宿舍号 *\n");
printf("* *\n");
printf("* %-12s", stu[m].stuNo);
printf("%-10s", stu[m].stuName);
printf("%-5s", stu[m].stuSex);
printf("%-5s", stu[m].stuAge);
printf("%-12s", stu[m].stuNative);
printf("%-15s", stu[m].stuMajor);
printf("%-8s", stu[m].dormNo);
printf("*\n");
}
void OutDormInfo(Stu stu[], int m)
{
/**
* 输出宿舍成员信息 接收一成员 stu[m]
* 按学号顺序输出该宿舍所有成员信息
* 并进行简单排版
*/
int min = m, max = m;
while (strcmp(stu[min-1].dormNo, stu[min].dormNo) == 0)
min--;
while (strcmp(stu[max+1].dormNo, stu[max].dormNo) == 0)
max++;
printf("\n该宿舍人数为 %d\n", max-min+1);
printf("***********************************************************************\n");
printf("* 学号 姓名 性别 年龄 籍贯 专业 宿舍号 *\n");
for (int i=min; i<=max; i++)
{
OutStuInfo(stu, i);
}
printf("***********************************************************************\n");
}
/*****************************************************/
bool JudgeMarry(char str1[], char str2[])
{
/**
* 功能实现模糊匹配判断
* 假设str2 匹配 str1
* 规定: str2 长度大于等于 str1
* str2 顺序包含 str1中字符
* 即为匹配成功
* 如:str1 = "abcde" str2 == "ace" / "abd" 等均为成功
*/
int s1 = strlen(str1), s2 = strlen(str2);
if (s1 < s2) return false;
int i=0, j=0;
while (j<s2 && i<s1)
{
if (str1[i] == str2[j])
{
i++; j++;
}
else
{
i++;
}
}
if (j == s2) return true;
else return false;
}
void DimSearch(Stu stu[], int stuNum, char s[], int flag)
{
/**
* 功能:模糊查找
* 接受一个字符串按照指定的flag 进行模糊查找
* flag 取 1 2
* flag == 1 学号
* flag == 2 姓名
*/
bool temp = true;
if (flag == 1)
{
for (int i=0; i<stuNum; i++)
{
if (JudgeMarry(stu[i].stuNo, s))
{
OutStuInfo(stu, i);
temp = false;
}
}
}
else
{
for (int i=0; i<stuNum; i++)
{
if (JudgeMarry(stu[i].stuName, s))
{
OutStuInfo(stu, i);
temp = false;
}
}
return;
}
if (temp)
printf("\n!!! 没有匹配结果\n");
}
/*****************************************************/
void BublleSort(Stu stu[], int stuNum, int flag)
{
/**
* 功能:为冒泡排序函数 用于结构体排序
* 接收三个参数
* stu[] 结构体数组 stuNum学生人数 flag 按哪种方式排序
* flag == 1 按学号排序
* flag == 2 按姓名排序
* flag == 3 按宿舍号排序
*/
for (int i=0; i<stuNum; i++)
{
for (int j=1; j<stuNum; j++)
{
Swap(stu[j-1], stu[j], flag);
}
}
switch (flag)
{
case 1:
printf("\n已完成按*学号*的排序 可输入 4 进行展示\n"); break;
case 2:
printf("\n已完成按*姓名*的排序 可输入 4 进行展示\n"); break;
case 3:
printf("\n已完成按*宿舍号*的排序 可输入 4 进行展示\n"); break;
}
}
void BinarySearch(Stu stu[], int stuNum, char s[], int flag)
{
/**
* 功能:接收4个参数 进行二分查找 并输出学生或宿舍信息
* stu[] 成员结构体数组 stuNum 学生人数 s[] 需要查找的字符串
* flag 接受到的字符串为何种形式
* flag == 1 按学生学号查找
* flag == 2 按姓名查找
* flag = =3 按宿舍号查找
*/
if (flag == 1)
{
int low = 0, high = stuNum-1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (strcmp(stu[mid].stuNo, s) > 0)
high = mid-1;
else if (strcmp(stu[mid].stuNo, s) < 0)
low = mid+1;
else
{
OutStuInfo(stu, mid);
return;
}
}
}
else if (flag == 2)
{
int low = 0, high = stuNum-1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (strcmp(stu[mid].stuName, s) > 0)
high = mid-1;
else if (strcmp(stu[mid].stuName, s) < 0)
low = mid+1;
else
{
OutStuInfo(stu, mid);
return; //必须得有 标志着二分查找的成功 退出函数
}
}
}
else
{
int low = 0, high = stuNum-1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (strcmp(stu[mid].dormNo, s) > 0)
high = mid-1;
else if (strcmp(stu[mid].dormNo, s) < 0)
low = mid+1;
else
{
OutDormInfo(stu, mid);
return;
}
}
}
printf("\n查无此人 请检查您的输入是否正确\n");
}
总结
C++学生宿舍管理系统,数据结构课程设计,控制台应用,实现了对学生宿舍相关信息的管理,功能基本完善。