Skip to content

Latest commit

 

History

History
301 lines (271 loc) · 7.62 KB

借书证信息系统.md

File metadata and controls

301 lines (271 loc) · 7.62 KB

借书证信息系统

实验要求

  • (1)建立关于借书证信息结点的结构体;
  • (2)定义借书证信息的记录并录入基本信息;
  • (3)写出用某种排序算法(如冒泡排序)按关键字对记录进行排序的算法函数;
  • (4)对借书证信息的记录按系名建立索引查找结构;
  • (5)输入某个要查找的系名,用索引查找方法查找并输出该系的所有借书证信息。

代码

#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;
}

文件格式

123.png

具体界面

3445