宿舍管理查询系统

简介: 宿舍管理查询系统1.任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计

宿舍管理查询系统


1.任务:

为宿舍管理人员编写一个宿舍管理查询软件, 程序设计


2.要求:

1) 采用交互工作方式, 建立一个学生宿舍信息线性表在内存中存储数据(或存储在数据文件),数据按关键字(姓名、学号、房号)进行排序(可使用交换、选择、插入排序等)

2) 查询功能: (用二分查找实现以下操作)

A. 按姓名查询

B. 按学号查询

C. 按房号查询

3) 打印任一查询结果(可以连续操作)


3.概要设计

根据系统要求,即本系统具有信息的录入,显示,排序显示、查找,插入、删除、结束程序等功能,先设计出详细的系统流程图,然后将源代码输入程序,进行编译调试即可。


程序总体分10个项目:


输入记录、显示记录、按姓名排序并显示、按房间号排序并显示 、按学号排序并显示 、按姓名查找并显示 、按房间号查找并显示 、按学号查找并显示、插入一条记录按学号排序并显示以及结束程序。


线性表存储结构表示:

typedef struct {
  char name[20];
  int num;            //学号和房号都为整型
  int room;
} stu;
typedef struct {
  int length; //当前长度
  stu *elem;  //存储空间基址
  int listsize;  //当前分配的存储容量
} linklist;

三种排序方法及二分查找法:

1.冒泡排序(按姓名排序):

void sort1(linklist &L) { 
  int i, j;
  stu temp;
  for (i = 0; i<L.length - 1; i++)
    for (j = 0; j<L.length-1-i; j++)
      if (strcmp(L.elem[j].name, L.elem[j+1].name)>0) {
        temp = L.elem[j];
        L.elem[j] = L.elem[j+1];
        L.elem[j+1] = temp;
      }
}

2.插入排序(按学号排序:`

void sort2(linklist &L) { 
   int i, j, mid, low, high;
   stu temp;
   for (i = 1; i < L.length; i++) {
    if(L.elem[i].num<L.elem[i-1].num) {
      temp = L.elem[i];
      low = 0;
      high = i-1;
      while (low <= high) {
        mid = (low + high) / 2;
        if (temp.num < L.elem[mid].num)
          high = mid - 1;
        else
          low = mid + 1;
      }
      for (j = i - 1; j >= high+1; j--)
        L.elem[j+1]=L.elem[j];
      L.elem[high+1]=temp;
    }
  }
}

3.选择排序(按房号排序):

void sort3(linklist &L) { 
  int i,j,k;
  stu temp;
  for(i=0; i<L.length-1; i++) {
    k=i;
    for(j=i+1; j<L.length; j++)
      if(L.elem[j].room<L.elem[k].room)
        k=j;
    if(k!=i){
      temp = L.elem[i];
      L.elem[i] = L.elem[k];
      L.elem[k] = temp;
    }
  }
}

4.二分查找法:

void search1(linklist &L) { 
  if (L.length == 0) {
    printf("已无学生记录!\n");
    Ret();
    Menu();
  } else {
    int low = 0, high = L.length, mid, flag = 0;
    printf("\n");
    printf("按姓名查找-->请输入要查找的姓名:");
    char a[15], ch;
    scanf("%s", a);
    while (low <= high) {
      mid = (low + high) / 2;
      if (strcmp(a, L.elem[mid].name) == 0) {
        flag = 1;
        break;
      } else if (strcmp(a, L.elem[mid].name)>0)
        low = mid + 1;
      else
        high = mid - 1;
    }
    if (flag == 1) {
      printf("查找成功-->该学生信息为:\n");
      printf("姓名       学号    房号\n");
      printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);
      if (Select())
        search1(L);
      else {
        system("cls");
        Menu();
      }
    } else {
      printf("该学生不存在!");
      if (Select())    search1(L);
      else {
        system("cls");
        Menu();
      }
    }
  }
}

执行结果测试:

1.系统界面:

12.1.png

2.新建宿舍名单12.2.png

3.排序宿舍信息

  • 按名字排序:12.3.png按学号排序:12.4.png
  • 按房号排序:12.5.png

4.查询宿舍信息

  • 按姓名查找
  • 12.6.png
  • 按学号查找:12.7.png
  • 按房号查找:12.8.png

5.插入宿舍信息


12.9.png

  • 插入学生信息后:12.10.png

6.删除宿舍信息


12.11.png

  • 删除学生信息后:12.12.png

带注释的源程序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define N 40 //线性表存储空间的初始分配量
#define increase 10 //线性表存储空间的分配量增量
int choice;  //定义全局变量
typedef struct {
  char name[20];
  int num;            //学号和房号都为整型
  int room;
} stu;
stu stud;
typedef struct {
  int length; //当前长度
  stu *elem;  //存储空间基址
  int listsize;  //当前分配的存储容量
} linklist;
//线性表初始化
void Init(linklist &L) { 
  L.length = 0;
  L.elem = (stu *)malloc(N * sizeof(stu));
  L.listsize = N;
}
//操作菜单
void Menu() { 
  printf( "**************************************\n" );
  printf( "***       欢迎进入宿舍管理系统     ***\n" );
  printf( "**************************************\n" );
  printf( "*        1.  新建宿舍名单            *\n" );
  printf( "*        2.  排序宿舍信息            *\n" );
  printf( "*        3.  查询宿舍信息            *\n" );
  printf( "*        4.  插入宿舍信息            *\n" );
  printf( "*        5.  删除宿舍信息            *\n" );
  printf( "*        0.  退出系统                *\n" );
  printf( "**************************************\n" );
  printf("请输入菜单(0-5):");
  scanf("%d", &choice);
  if (choice<0 || choice>5) {
    system("cls");
    printf("输入数字不对,请重新!\n");
    printf("\n");
    Menu();
  }
}
//打印学生信息
void Display(linklist &L) { 
  int i;
  printf("姓名       学号    房号\n");
  for (i = 0; i<L.length; i++)
    printf("%-10s %-2d %5d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);
}
//返回主界面
void Ret() {    
  char c;
  fflush(stdin);
  printf("\n");
  printf("请按任意键进入主界面:");
  scanf("%c", &c);
  system("cls");
}
//创建学生信息表
void Create(linklist &L) { 
  if (L.length >= L.listsize) { //判断学生的人数是否超过初值,如果超过,则重新分配
    stu *newbase;
    newbase = (stu*)realloc(L.elem, (N + increase) * sizeof(stu));
    L.elem = newbase;
    L.listsize += increase;
  }
  int i = 2;
  char ch;
  printf("********开始创建学生信息**********\n");
  printf("\n");
  printf("请输入第1个学生的信息\n");
  printf("请输入姓名:");
  fflush(stdin);      // 清空输入缓冲区,得到正确的输入数据
  gets(stud.name);    //输入一行字符串(姓名)
  printf("请输入学号:");
  scanf("%d", &stud.num);
  printf("请输入房号:");
  scanf("%d", &stud.room);
  ch = getchar();
  strcpy(L.elem[L.length].name, stud.name);
  L.elem[L.length].num = stud.num;
  L.elem[L.length].room = stud.room;
  L.length++;
  printf("\n");
  printf("是否继续输入?<y/n>:");
  scanf("%c", &ch);
  printf("\n");
  while (ch == 'y') {
    printf("请输入第%d个学生的信息\n", i);
    printf("请输入姓名:");
    fflush(stdin);      // 清空输入缓冲区,得到正确的输入数据
    gets(stud.name);    //输入一行字符串(姓名)
    printf("请输入学号:");
    scanf("%d", &stud.num);
    printf("请输入房号:");
    scanf("%d", &stud.room);
    strcpy(L.elem[L.length].name, stud.name);
    L.elem[L.length].num = stud.num;
    L.elem[L.length].room = stud.room;
    i++;
    L.length=i-1;
    ch = getchar();
    printf("\n");
    printf("是否继续输入?<y/n>:");
    scanf("%c", &ch);
    printf("\n");
  }
  if (ch == 'n')
    system("cls");
}
//按姓名排序(采用冒泡排序)
void sort1(linklist &L) { 
  int i, j;
  stu temp;
  for (i = 0; i<L.length - 1; i++)
    for (j = 0; j<L.length-1-i; j++)
      if (strcmp(L.elem[j].name, L.elem[j+1].name)>0) {
        temp = L.elem[j];
        L.elem[j] = L.elem[j+1];
        L.elem[j+1] = temp;
      }
}
//按学号排序(采用折半插入排序)
void sort2(linklist &L) { 
  int i, j, mid, low, high;
  stu temp;
  for (i = 1; i < L.length; i++) {
    if(L.elem[i].num<L.elem[i-1].num) {
      temp = L.elem[i];
      low = 0;
      high = i-1;
      while (low <= high) {
        mid = (low + high) / 2;
        if (temp.num < L.elem[mid].num)
          high = mid - 1;
        else
          low = mid + 1;
      }
      for (j = i - 1; j >= high+1; j--)
        L.elem[j+1]=L.elem[j];
      L.elem[high+1]=temp;
    }
  }
}
//按房号排序(采用简单选择排序)
void sort3(linklist &L) { 
  int i,j,k;
  stu temp;
  for(i=0; i<L.length-1; i++) {
    k=i;
    for(j=i+1; j<L.length; j++)
      if(L.elem[j].room<L.elem[k].room)
        k=j;
    if(k!=i){
      temp = L.elem[i];
      L.elem[i] = L.elem[k];
      L.elem[k] = temp;
    }
  }
}
//排序函数
void Sort(linklist &L) { 
  int c;
  printf("请输入排序的方式(1:按名字排序,2:按学号排序,3:按房号排序):");
  scanf("%d", &c);
  switch (c) {
    case 1:
      sort1(L);
      if (L.length == 0) {
        printf("已无学生记录!\n");
        Ret();
        Menu();
      } else {
        printf("按姓名排序:\n");
        Display(L);
        Ret();  //调用返回主界面
        Menu();
      }
      break;
    case 2:
      sort2(L);
      if (L.length == 0) {
        printf("已无学生记录!\n");
        Ret();
        Menu();
      } else {
        printf("按学号排序:\n");
        Display(L);
        Ret();  //调用返回主界面
        Menu();
      }
      break;
    case 3:
      sort3(L);
      if (L.length == 0) {
        printf("已无学生记录!\n");
        Ret();
        Menu();
      } else {
        printf("按房号排序:\n");
        Display(L);
        Ret();  //调用返回主界面
        Menu();
      }
      break;
    default:
      break;
  }
}
//选择是否继续查找
int Select() { 
  char ch;
  scanf("%c", &ch);
  printf("是否继续查找?<y/n>:");
  fflush(stdin);
  scanf("%c", &ch);
  if (ch == 'y') {
    system("cls");
    return 1;
  } else
    return 0;
}
//按姓名从小到大查找(采用二分查找)
void search1(linklist &L) { 
  if (L.length == 0) {
    printf("已无学生记录!\n");
    Ret();
    Menu();
  } else {
    int low = 0, high = L.length, mid, flag = 0;
    printf("\n");
    printf("按姓名查找-->请输入要查找的姓名:");
    char a[15], ch;
    scanf("%s", a);
    while (low <= high) {
      mid = (low + high) / 2;
      if (strcmp(a, L.elem[mid].name) == 0) {
        flag = 1;
        break;
      } else if (strcmp(a, L.elem[mid].name)>0)
        low = mid + 1;
      else
        high = mid - 1;
    }
    if (flag == 1) {
      printf("查找成功-->该学生信息为:\n");
      printf("姓名       学号    房号\n");
      printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);
      if (Select())
        search1(L);
      else {
        system("cls");
        Menu();
      }
    } else {
      printf("该学生不存在!");
      if (Select())    search1(L);
      else {
        system("cls");
        Menu();
      }
    }
  }
}
//按学号从小到大查找(采用二分查找)
void search2(linklist &L) { 
  if (L.length == 0) {
    printf("\n");
    printf("已无学生记录!\n");
    Ret();
    Menu();
  } else {
    int low = 0, high = L.length, mid, flag = 0;
    int n;
    char ch;
    printf("\n");
    printf("按学号查找-->请输入要查找的学号:");
    scanf("%d", &n);
    while (low <= high) {
      mid = (low + high) / 2;
      if (n == L.elem[mid].num) {
        flag = 1;
        break;
      } else if (n>L.elem[mid].num)
        low = mid + 1;
      else
        high = mid - 1;
    }
    if (flag == 1) {
      printf("查找成功----->该学生信息为:\n");
      printf("姓名       学号    房号\n");
      printf("%-1s0 %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);
      if (Select())
        search2(L);
      else {
        system("cls");
        Menu();
      }
    } else {
      printf("该学生不存在!");
      if (Select())
        search2(L);
      else {
        system("cls");
        Menu();
      }
    }
  }
}
//按房号从小到大查找(采用二分查找)
void search3(linklist &L) { 
  if (L.length == 0) { //此函数功能为:返回主界面
    printf("\n");
    printf("已无学生记录!\n");
    Ret();
    Menu();
  } else {
    int low = 0, high = L.length, mid, flag = 0;//flag作为标志符,为1则表示查找成功,否则没有所要查找的学生
    int m;
    char ch;
    printf("\n");
    printf("按房号查找-->请输入要查找的房号:");
    scanf("%d", &m);
    while (low <= high) {
      mid = (low + high) / 2;
      if (m == L.elem[mid].room) {
        flag = 1;
        break;
      } else if (m>L.elem[mid].room)
        low = mid + 1;
      else
        high = mid - 1;
    }
    if (flag == 1) {
      printf("查找成功-->该学生信息为:\n");
      printf("姓名       学号    房号\n");
      printf("%-10s %-2d %-5d\n", L.elem[mid].name, L.elem[mid].num, L.elem[mid].room);
      if (Select())    //调用判断函数1
        search3(L);
      else {
        system("cls");
        Menu();
      }
    } else {
      printf("该学生不存在!");
      if (Select())  //调用判断函数2
        search3(L);
      else {
        system("cls");
        Menu();
      }
    }
  }
}
//查找函数
void Search(linklist &L) { 
  int c;
  printf("请输入查找的方式(1:按名字查找,2:按学号查找,3:按房号查找):");
  scanf("%d", &c);
  switch (c) {
    case 1:
      sort1(L);
      search1(L);
      break;//先进行二分查找排序
    case 2:
      sort2(L);
      search2(L);
      break;
    case 3:
      sort3(L);
      search3(L);
      break;
    default:
      break;
  }
}
//按学号从小到大插入该学生
void Insert(linklist &L) { 
  int i, j, k;
  char ch;
  printf("\n");
  printf("插入的学生信息为:\n");
  printf("姓名:");
  fflush(stdin);// 清空输入缓冲区,得到正确的输入数据
  gets(stud.name);
  printf("学号:");
  scanf("%d", &stud.num);
  printf("房号:");
  scanf("%d", &stud.room);
  if (L.length == 0) {
    strcpy(L.elem[L.length].name, stud.name);
    L.elem[L.length].num = stud.num;
    L.elem[L.length].room = stud.room;
  }
  for (i = 0; i<L.length; i++) {
    if (stud.num<L.elem[i].num) {
      k = i;
      for (j = L.length; j>k; j--)
        L.elem[j] = L.elem[j - 1];
      strcpy(L.elem[k].name, stud.name);
      L.elem[k].num = stud.num;
      L.elem[k].room = stud.room;
      break;
    } else {
      strcpy(L.elem[L.length].name, stud.name);
      L.elem[L.length].num = stud.num;
      L.elem[L.length].room = stud.room;
    }
  }
  L.length++;
  fflush(stdin);
  printf("\n");
  printf("是否继续插入?<y/n>:");
  scanf("%c", &ch);
  if (ch == 'y') Insert(L);
  else system("cls");
}
//按学号删除该学生
void Delete(linklist &L) { 
  int i, j, k = -1;
  char ch;
  printf("\n");
  printf("\n");
  printf("请输入要删除学生的学号:");
  scanf("%d", &stud.num);
  for (i = 0; i<L.length; i++) {
    if (stud.num == L.elem[i].num) {
      printf("该学生的信息为:\n");
      printf("姓名:%s \n学号:%d \n房号:%d\n", L.elem[i].name, L.elem[i].num, L.elem[i].room);
      k = i;
      for (j = k; j<L.length - 1; j++)
        L.elem[j] = L.elem[j + 1];
      printf("已成功删除\n");
      break;
    }
  }
  if (i >= L.length) printf("该学生不存在\n");
  if (k >= 0)L.length--;
  fflush(stdin);
  printf("\n");
  printf("是否继续删除操作?<y/n>:");
  scanf("%c", &ch);
  system("cls");
  if (ch == 'y') Delete(L);
  else system("cls");
}
//主函数
int main() {  
  linklist L;    //定义线性表 L
  Init(L);
  Menu();        //调用主菜单函数
  while (choice != 0) {
    system("cls");
    switch (choice) {
      case 1:
        Create(L);    //调用线性表创建函数
        Menu();
        break;
      case 2:
        Sort(L);
        break;//调用排序函数
      case 3:
        Search(L);
        break;//调用查找函数进行(二分)查找
      case 4:
        sort2(L);      //调用学号排序函数
        Insert(L);        //按学号序列插入
        system("cls");
        printf("插入后的学生信息:\n");
        Display(L);
        Ret();
        Menu();
        break;
      case 5:
        Delete(L);    //调用删除函数
        if (L.length == 0) {
          printf("\n");
          printf("学生记录已被删除完!\n");
          Ret();
          Menu();
        } else {
          printf("显示删除后的学生信息:\n");
          Display(L);
          Ret();
          Menu();
        }
        break;
    }
  }
}
相关文章
|
8月前
|
Java 数据库
图书信息查询系统
图书信息查询系统
79 1
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础练习系列10、访客登记系统
MySQL数据库基础练习系列10、访客登记系统
70 1
|
7月前
|
缓存
索葛售票系统使用步骤--购票
索葛售票系统使用步骤--购票
|
8月前
|
JavaScript Java 关系型数据库
公寓报修|公寓报修管理系统|基于springboot公寓报修管理系统设计与实现(源码+数据库+文档)
公寓报修|公寓报修管理系统|基于springboot公寓报修管理系统设计与实现(源码+数据库+文档)
73 2
|
7月前
索葛售票系统使用步骤--交易查询
索葛售票系统使用步骤--交易查询
|
8月前
|
小程序 JavaScript Java
宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)
宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)
88 0
|
8月前
|
小程序 JavaScript Java
座位预约|座位预约小程序|基于微信小程序的图书馆自习室座位预约管理系统设计与实现(源码+数据库+文档)
座位预约|座位预约小程序|基于微信小程序的图书馆自习室座位预约管理系统设计与实现(源码+数据库+文档)
206 0
|
8月前
|
安全 JavaScript Java
航班进出港|航班进出港管理系统|基于springboot航班进出港管理系统设计与实现(源码+数据库+文档)
航班进出港|航班进出港管理系统|基于springboot航班进出港管理系统设计与实现(源码+数据库+文档)
56 0
|
存储 数据库
控制台实现简单的家庭收支记录软件
控制台实现简单的家庭收支记录软件
控制台实现简单的家庭收支记录软件
|
8月前
|
前端开发 JavaScript 调度
考勤管理——功能列表
考勤管理——功能列表
57 0