-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Description
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"stdlib.h"
#include<string.h>
#define MAXSIZE 50
#define M 20
typedef struct {
int key;
}record;
typedef struct {
char cardID[M];//卡号
char name[M];//姓名
char major[M];//专业
char classnum[M];//班号
}recordtype;
typedef struct {
recordtype r[MAXSIZE];
int length;
}table;
void read(table *tab, char *filename)//读取所有人的借书信息
{
int i, j, k, n;
FILE *fp;
fp = fopen(filename, "r");
if (fp)
{
fscanf(fp, "%d", &tab->length);//读取所有学生借书证个数
for (i = 1; i <= tab->length; i++)
{
fscanf(fp, "%s", &tab->r[i].cardID);
fscanf(fp, "%s", &tab->r[i].name);
fscanf(fp, "%s", &tab->r[i].major);
fscanf(fp, "%s", &tab->r[i].classnum);
}
printf("读取文件信息成功!");
}
else printf("读取文件失败!");
fclose(fp);//关闭文件
}
void output(table *tab)
{
int i;
if (tab->length != 0)
{
printf("输出所有的学生信息:\n");
printf("%s%13s%12s%18s\n", "借书卡号", "专业", "姓名", "班级号");
for (i = 1; i <= tab->length; i++)
printf("%5s%17s%12s%17s\n", tab->r[i].cardID, tab->r[i].major, tab->r[i].name, tab->r[i].classnum);
}
else
printf("借书证系统还没有借书记录!!\n");
}
//对班号进行插入排序
void insertsort(table *tab)
{
int i, j;
for (i = 1; i <= tab->length; i++)
{
j = i - 1;
tab->r[0] = tab->r[i];
while (strcmp(tab->r[0].classnum, tab->r[j].classnum) < 0)
{
tab->r[j + 1] = tab->r[j];
j = j - 1;
}
tab->r[j + 1] = tab->r[0];
}
}
//对卡号进行插入排序
void insertsort2(table *tab)
{
int i, j;
for (i = 1; i <= tab->length; i++)
{
j = i - 1;
tab->r[0] = tab->r[i];
while (strcmp(tab->r[0].cardID, tab->r[j].cardID) < 0)
{
tab->r[j + 1] = tab->r[j];
j = j - 1;
}
tab->r[j + 1] = tab->r[0];
}
}
void sort(table *tab)
{
int input = 0; //输入想选择的步骤
printf("\n\t1.借书证卡号\n");
printf("\t2.班号\n");
printf("请输入你想排序的编号:");
scanf("%d", &input);
switch (input)
{
case 1:
insertsort2(tab);//对借书证卡号进行选择排序
output(tab);
printf("借书证卡号排序成功!!\n\n");
break;
case 2:
insertsort(tab);//对班号进行插入排序
output(tab);
printf("班号排序成功!!\n\n");
default:
break;
}
}
int search_cardnum(table *tab, char *key)
{
int low = 1, high = tab->length, mid;
while (low <= high)
{
mid = (low + high) / 2; //开始二分
//puts(tab->r[mid].cardnumber);
if (strcmp(tab->r[mid].cardID, key) == 0) //检索成功返回
return mid;
else if (strcmp(tab->r[mid].cardID, key) > 0)
high = mid - 1; //继续在前半部分进行二分检索
else
low = mid + 1; //继续在后半部分进行二分检索
}
return -1;
}
//专业的筛选
void search_major(table *tab, char *major)
{
int count = 0; //用于记录该专业借书证个数
int k = tab->length;
int i = 1;
while (k >= 0)
{
if (strcmp(tab->r[k].major, major) == 0)
{
count++;
if (i == 1)
{
printf("------所有借书信息-----\n");
printf("借书卡号 姓 名 专 业 班号\n");
i = 0;
}
printf("%s%15s%10s%10s", tab->r[k].cardID, tab->r[k].name,
tab->r[k].major, tab->r[k].classnum);
printf("\n");
}
k--;
}
if (count == 0)
printf("该专业暂时没有借书信息!\n");
}
void search(table *tab)
{
int result = -1;
int c = 0;
char brow[M] = "";
char major[M] = "";
printf("\n\t1.借书证号查询");
printf("\n\t2.专业查询");
printf("\n请选择你需要查找的信息:");
scanf("%d", &c);
switch (c)
{
case 1://借书证卡号查询
{
getchar();
printf("\n请输入你需要查找的借书证卡号:");
scanf("%s", brow);
printf("\n查找结果:");
result = search_cardnum(tab, brow);
if (result != -1)
{
printf("借书卡号 姓 名 专 业 班号\n");
printf("%14s%13s%10s%8s", tab->r[result].cardID, tab->r[result].name,
tab->r[result].major, tab->r[result].classnum);
printf("\n");
}
else
printf("\n没有找到该书信息!");
break;
}
case 2:
{
getchar();
printf("请输入想要筛选的专业:\n");
scanf("%s", major);
search_major(tab, major);
}
default:
break;
}
}
int main()
{
int c = 0; //键盘键入的操作数
char filename[30] = "a.txt";
table tab;
tab.length = 0;
while (1)
{
printf("\n");
printf("\t借书证信息系统\n");
printf("****************************************************\n");
printf("***********\t1.从文件读取信息\t************\n");
printf("***********\t2.对信息进行排序\t************\n");
printf("***********\t3.查找借书证信息\t************\n");
printf("***********\t4.输出所有借书证信息\t********\n");
printf("****************************************************\n");
printf("请输入操作序号:");
scanf("%d", &c);
switch (c)
{
case 1:
read(&tab, filename);
output(&tab);
break;
case 2:
sort(&tab);
break;
case 3:
search(&tab);
break;
case 4:
output(&tab);
printf("\n");
break;
default:
printf("输入了错误的操作数!!\n");
break;
}
}
system("pause");
return 0;
}Metadata
Metadata
Assignees
Labels
No labels
