#include"stdio.h"
#include"stdlib.h"
#include "string.h"
#define MAXSIZE 100
typedef struct {
char cardnumber[20]; //卡号
char name[20]; //姓名
char major[20]; //系别
char classnumber[20]; //班号
char infonumber[20]; //学号
}recordtype;
typedef struct {
recordtype r[MAXSIZE];
int length;
}table;
//录入所有人的借书信息
void input(table *tab,char *filename)
{
int count = 0;
FILE *fp = fopen(filename,"r");
if (fp)
{
fscanf(fp, "%d", &tab->length); //读取所有学生借书证个数
for (int j = 1; j <= tab->length; j++)
{
fscanf(fp, "%s", &tab->r[j].cardnumber); //读取借书证卡号
fscanf(fp, "%s", &tab->r[j].name); //读取姓名
fscanf(fp, "%s", &tab->r[j].major); //读取系别
fscanf(fp, "%s", &tab->r[j].classnumber); //读取班号
fscanf(fp, "%s", &tab->r[j].infonumber); //读取学号
}
printf("读取文件信息成功!!\n");
}
else
printf("打开文件失败!!\n");
}
//格式化输出所有的借书信息
void output(table *tab)
{
if (tab->length != 0)
{
printf("输出所有的学生信息:\n");
printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
for (int i = 1; i <= tab->length; i++)
printf("%20s%20s%10s%20s%20s\n", tab->r[i].cardnumber, tab->r[i].major, tab->r[i].name, tab->r[i].classnumber, tab->r[i].infonumber);
}
else
printf("借书证系统还没有借书记录!!\n");
}
//对学号进行插入排序
void insertsort(table *tab)
{
int i, j;
for (i = 1; i <= tab->length; i++) //依次插入从第2个开始的而所有元素
{
j = i - 1;
tab->r[0] = tab->r[i]; //设置哨兵,准备找插入位置
while (strcmp(tab->r[0].cardnumber,tab->r[j].cardnumber) < 0) //比较当前结点与哨兵的大小
{
tab->r[j + 1] = tab->r[j]; //讲大于的数字向后移动
j = j - 1; //继续向左查找
}
tab->r[j + 1] = tab->r[0]; //最后i插入第i个数据的副本,即前面设置的哨兵
}
}
//对借书证卡号进行排序
void shellinsertsort(table *tab)
{
int i, j, d;
d = tab->length / 2;
while (d >= 1)
{
for (i = d + 1; i <= tab->length; i++)
{
tab->r[0] = tab->r[i]; //保存表当中第i 个元素
j = i - d; ///向前找插入位置
while (j > 0 && strcmp(tab->r[0].infonumber,tab->r[j].infonumber) < 0) //排序码比较找插入位置并且后移
{
tab->r[j + d] = tab->r[j]; //记录后移
j = j - d; //继续向前找
}
tab->r[j + d] = tab->r[0]; //插入第i个元素的副本
}
d = d / 2;
}
}
// 对班级简单的选择进行
void simpleselectsort(table *tab)
{
int i, j, k;
for (i = 1; i <= tab->length - 1; i++) //每次选择一个最小的元素的位置,和第i个元素交换
{
k = i; //记下当前最小元素的位置
for (j = i + 1; j <= tab->length; j++) //向右查找更小的元素
{
if (strcmp(tab->r[j].classnumber , tab->r[k].classnumber) <= 0) //修改当前最小元素的位置
k = j;
if (k != i) //如果第i次选到的最小元素位置k不等于i则将第k、i个元素交换
{
tab->r[0] = tab->r[k]; //以没有用到的第0个元素作为中间单元进行交换
tab->r[k] = tab->r[i];
tab->r[i] = tab->r[0];
}
}
}
}
void sort(table *tab)
{
int input = 0; //输入想要选择的步骤
printf("\n1.借书证卡号\n");
printf("2.学号\n");
printf("3.班级\n");
printf("请输入你想要排序的数据:\n");
scanf("%d",&input);
switch (input)
{
case 1:
shellinsertsort(tab); //对借书证卡号进行希尔插入排序
printf("借书证卡号排序成功!!\n");
break;
case 2:
insertsort(tab); //对学号进行简单插入排序
printf("学号排序成功!!\n");
break;
case 3:
simpleselectsort(tab); //对班级简单的选择进行
printf("班级排序成功!!\n");
break;
default:
break;
}
}
//借书证卡号查询
int searchcardnumber(table *tab, char *key)
{
shellinsertsort(tab);
int low = 1, high = tab->length + 1, mid;
while (low <= high)
{
mid = (low + high) / 2; //开始二分
//puts(tab->r[mid].cardnumber);
if (strcmp(tab->r[mid].cardnumber, key) == 0)
return mid;
if (strcmp(tab->r[mid].cardnumber, key) > 0)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
//学院的筛选
void IndexSeqSearch(table *tab, char *major)
{
int count = 0; //用于记录学院的所有借书证信息个数
bool exit = true;
int k = tab->length;
while (k >= 0)
{
if (strcmp(tab->r[k].major, major) == 0)
{
if (exit)
{
printf("\n%s所有借书证信息:\n",major);
printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
exit = false;
count++;
}
printf("%20s%20s%10s%20s%20s\n", tab->r[k].cardnumber, tab->r[k].major,
tab->r[k].name, tab->r[k].classnumber, tab->r[k].infonumber);
}
k--;
}
if (count == 0)
printf("该学院暂时没有借书信息!\n");
}
void search(table *tab)
{
printf("请选择想要查询的信息:\n");
printf("1.借书证卡号查询\n");
printf("2.学院的删选\n");
int c = 0;
scanf("%d", &c);
switch (c)
{
case 1: //借书证卡号查询
{
getchar();
char charnumber[20] = "";
printf("请输入想要查询的借书证卡号:\n");
gets_s(charnumber);
printf("查找结果:\n");
int result = searchcardnumber(tab, charnumber);
if (result != -1)
{
printf("%22s%15s%12s%20s%18s\n", "借书卡号", "专业", "姓名", "班级号", "学号");
printf("%20s%20s%10s%20s%20s\n", tab->r[result].cardnumber, tab->r[result].major,
tab->r[result].name, tab->r[result].classnumber, tab->r[result].infonumber);
}
else
printf("没有找到该借书证信息!\n");
}
case 2: {
getchar();
char major[20] = "";
printf("请输入想要筛选的学院:\n");
gets_s(major);
IndexSeqSearch(tab, major);
}
default:
break;
}
}
void show()
{
printf("\t*********借书证信息系统*********\n");
printf("\t\t1.从文件读取信息\n");
printf("\t\t2.对信息进行排序\n");
printf("\t\t3.查找借书证信息\n");
printf("\t\t4.输出所有借书证信息\n");
}
int main()
{
int c = 0; //键盘键入的操作数
table tab;
tab.length = 0;
char filename[30] = "D:\\Desktop\\BookInfo.txt";
show();
while (1)
{
printf("请输入操作序号:\n");
scanf("%d", &c);
switch (c)
{
case 1:
input(&tab, filename);
break;
case 2:
sort(&tab);
break;
case 3: {
search(&tab);
}
break;
case 4: {
output(&tab);
printf("\n");
}
break;
default:
printf("输入了错误的操作数!!\n");
exit(0);
break;
}
}
system("pause");
return 0;
}