【万字力作】C语言课程设计--图书信息管理系统设计

一、题目要求

【万字力作】C语言课程设计--图书信息管理系统设计_第1张图片

二、具体实现

1.导入库函数、定义结构体、声明函数

#include 
#include
#include

typedef struct BOOK{
	int num;
	char bname[128];
	char wname[128];
	int dnum;
	char cname[128];
	int time;
	float price;
}BOOK;

typedef struct list{
	BOOK *data;
	int size;
	int length;
}list,*List;

int menu(List);
void menu0(List);
int menu2(List);
void menu3(List);
void menu4(List);
int Init(List);
int Input(List);
int Find(List,char*);
int Find2(List,int);
int Find3(List,char*);
int Find4(List,char*);
int Insert(List);
int Insert2(List,int);
void Delete(List);
void Update(List); 
void Look(List);
void sort1(List);
void sort2(List);
void sort3(List);
void sort4(List);
int Load(List);
void booknumberfind(List);
void booknamefind(List);
void writernamefind(List);
void cnamefind(List);

        提前进行函数声明,避免因函数相互调用而出现的逻辑错误。

2.菜单及功能函数的定义

①菜单函数

        一级菜单menu()及四个二级菜单menu0()、menu2()、menu3()、menu4(),层次分明、逻辑清晰,且切换菜单时均有提示,便于操作。

int menu(List L){
	int flag = 1;
	int n;
	while(flag){
		printf("****欢迎来到图书信息管理系统****\n");
		printf("0.初始化 1.录入 2.编辑 \n3.浏览   4.查询 5.退出\n");
		printf("Please choose 0~5:");
		scanf("%d",&n);
		switch(n){
			case 0:
				menu0(L);
				break; 
			case 1:
				Input(L);
				break;
			case 2:
				menu2(L);
				break;
			case 3:
				menu3(L);
				break;
			case 4:
				menu4(L);
				break;
			case 5:
				flag = 0;
				printf("您已成功退出系统!\n");
				break;
			default:
				printf("Error!Please choose again:");
				break;
		}
	}
	return 1;
}

void menu0(List L){
	int n;
	int flag = 1;
	printf("****初始化****\n");
	while(flag){
	printf("1.载入已有信息 2.新建书单\n");
	scanf("%d",&n);
	switch(n){
		case 1:
			if(Load(L))
			flag = 0;
			break;
		case 2:
			Init(L);
			flag = 0;
			break;
		default:
			printf("选择无效!\n");
			break;
	}
    }
}

int menu2(List L){
	int n;
	int flag = 1;
	while(flag){
	    printf("****编辑菜单****\n");
      	printf("1.插入 2.删除 3.修改 0.退出\n");
     	printf("Please choose 0~3:");
	    scanf("%d",&n);
	    switch(n){
		    case 1:
		    	Insert(L);
			    break;
		    case 2:
		    	Delete(L);
			    break;
		    case 3:
		    	Update(L);
		        break;
		    case 0:
		        flag = 0;
		        printf("您已退出编辑菜单\n");
		        break;
		    default:
		        printf("Error!Please choose again:");
			    break;		
	} 
    }
	return 1;
}

void menu3(List L){
	int n;
	int flag = 1;
	while(flag){
		printf("****浏览菜单****\n");
	    printf("1.书号↑2.书号↓\n3.价格↑ 4.价格↓\n0.退出\n");
	    printf("Please choose 0~4:");
	    scanf("%d",&n);
	    switch(n){
	    	case 1:
	    		sort1(L);
	    		Look(L);
	    		break;
	        case 2:
	        	sort2(L);
	        	Look(L);
	        	break;
	        case 3:
	        	sort3(L);
	        	Look(L);
	        	break;
	        case 4:
	        	sort4(L);
	        	Look(L);
	        	break;
	        case 0:
	        	flag = 0;
	        	printf("您已退出浏览菜单\n");
	        	break;
	        default:
	        	printf("输入错误!\n");
	        	break;
		}
	}
}

void menu4(List L){
	int flag = 1;
	int n;
	while(flag){
		printf("****查询菜单****\n");
		printf("1.书号 2.书名 \n3.作者名 4.出版社 \n0.退出\n");
		printf("Please choose 0~4:");
		scanf("%d",&n);
		switch(n){
			case 1:
				booknumberfind(L);
				break;
			case 2:
				booknamefind(L);
				break;
			case 3:
				writernamefind(L);
				break;
			case 4:
				cnamefind(L);
				break;
			case 0:
				flag = 0;
				break;
		}
	}
	printf("您已退出查询菜单!\n");
	return; 
}

②初始化、录入函数

//初始化(新建书单) 
int Init(List L){
	printf("请输入书单最大长度:\n");
	int max;
	scanf("%d",&max);
	L->data = new BOOK[max];
	if(L->data == NULL){
		printf("Space request failed!\n");
		return 0;
	}
	L->size = max;
	L->length = 0;
	printf("Creat successfully!\n");
	return 1;
}
//录入函数 
int Input(List L){
	//检查书单是否存在 
	if(L->data == NULL){
		printf("请先创建书单!\n");
		return 0;
	}
	//确定本次录入的数据规模 
	BOOK x;
	int i, length;
	printf("请输入此次要录入的数目:");
	scanf("%d",&length);
	for(i = 0; i < length ;i++){
		Insert2(L,L->length+1);
	}
	printf("录入成功!\n");
	return 1;
} 

③插入函数

//插入函数 
int Insert(List L){
	int i;
	printf("请输入插入位置:");
	scanf("%d",&i);
	if(i < 1 || i > L->length + 1){
		printf("插入位置不合理!\n");
		return 0;
	}
	if(L->length >= L->size){
		printf("容量不够!\n");
		return 0;
	}
	int k;
	for(k = L->length ; k >= i;k--){
		L->data[k] = L->data[k-1];
	}
	BOOK x;
	printf("请依次输入以下信息(空格隔开):\n");
	printf("书号 书名 作者名 分类号 出版社 出版时间 价格\n");
	scanf("%d%s%s%d%s%d%f",&x.num,x.bname,x.wname,&x.dnum,x.cname,&x.time,&x.price);
	L->data[i-1] = x;
	L->length++;
	printf("插入成功!\n");
	return 1;
	
}
//录入中的插入函数 
int Insert2(List L,int i){
	if(i < 1 || i > L->length + 1){
		printf("插入位置不合理!\n");
		return 0;
	}
	if(L->length >= L->size){
		printf("容量不够!\n");
		return 0;
	}
	int k;
	for(k = L->length ; k >= i;k--){
		L->data[k] = L->data[k-1];
	}
	BOOK x;
	printf("请依次输入第%d本书的信息(空格隔开):\n",i);
	printf("书号 书名 作者名 分类号 出版社 出版时间 价格\n");
	scanf("%d%s%s%d%s%d%f",&x.num,x.bname,x.wname,&x.dnum,x.cname,&x.time,&x.price);
	L->data[i-1] = x;
	L->length++;
	printf("插入成功!\n");
	return 1;
}

④查找函数

// 查找函数
///按书名 
int Find(List L,char temp[128]){
	int i;
	for( i = 0 ; i < L->length;i++){
		if(strcmp(L->data[i].bname, temp) == 0){
			return i;
		}
	}
	return -1;
}
///按书号 
int Find2(List L,int t){
	int i;
	for( i = 0 ; i < L->length;i++){
		if(L->data[i].num == t){
			return i;
		}
	}
	return -1;
}
///按作者名 
int Find3(List L,char temp[128]){
	int i;
	for( i = 0 ; i < L->length;i++){
		if(strcmp(L->data[i].wname, temp) == 0){
			return i;
		}
	}
	return -1;
}
///按出版社 
int Find4(List L,char temp[128]){
	int i;
	for( i = 0 ; i < L->length;i++){
		if(strcmp(L->data[i].cname, temp) == 0){
			return i;
		}
	}
	return -1;
}

⑤删除函数

void Delete(List L){
	printf("请输入要删除的图书名称:\n");
	char temp[128];
	scanf("%s",temp);
	int n = Find(L,temp);
	if(n == -1){
		printf("未找到该图书!\n");
		return;
	}
	int i;
	for( i = n; i < L->length - 1 ;i++ ){
		L->data[i] = L->data[i+1];
	} 
	L->length--;
	printf("删除成功!\n");
	return;
}

⑥修改函数

//修改 
void Update(List L){
	printf("请输入要修改的图书名称:\n");
	char temp[128];
	scanf("%s",temp);
	int n = Find(L,temp);
	if(n == -1){
		printf("未找到该图书!\n");
		return;
	}
	BOOK x;
	printf("请输入新的图书信息(空格隔开):\n");
	printf("书号 书名 作者名 分类号 出版社 出版时间 价格\n");
	scanf("%d%s%s%d%s%d%f",&x.num,x.bname,x.wname,&x.dnum,x.cname,&x.time,&x.price);
	L->data[n] = x;
	printf("修改成功!\n");
	return;
}

⑦载入函数

        载入函数中的读取格式一定要和保存数据的写入格式完全一致,不然会发生读取错误。

//载入书单 
int Load(List L){
	FILE *fp;
	fp = fopen("C:/Users/lenovo/Desktop/data.txt","r");
	if(fp == NULL ){
		printf("文件不存在!\n");
		return 0;
	}
	int i;
	fscanf(fp,"%d %d\n",&L->length,&L->size);
	L->data = new BOOK[L->size];
	for( i = 0; i < L->length ;i++){
		fscanf(fp,"%d %s %s %d %s %d %lf\n",&L->data[i].num,L->data[i].bname,L->data[i].wname,&L->data[i].dnum,L->data[i].cname,&L->data[i].time,&L->data[i].price);
	}
	fclose(fp);
	printf("载入成功!\n");
	return 1;
}

⑧浏览函数

//浏览函数 
void Look(List L){
	if(L->length == 0){
		printf("无数据\n");
		return;
	}
	int i;
	printf("信息如下:\n");
	for(i = 0; i < L->length ;i++){
			printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
	}
	return;
}

⑨排序函数

        采用选择排序法进行排序。

//排序输出
///按书号升序 
void sort1(List L){
	if(L->length == 0){
		printf("没有数据!\n");
		return;
	}
	BOOK temp;
	int i,j,min;
	//选择排序 
	for(i = 0; i < L->length - 1 ;i++){
		for( min = i, j = i + 1; j < L->length; j++){
			if(L->data[j].num < L->data[min].num){
				temp = L->data[j];
				L->data[j] = L->data[min];
				L->data[min] = temp;
			}
		}
	}
	printf("已按书号升序排序\n");
	return;
}
///按书号降序 
void sort2(List L){
	if(L->length == 0){
		printf("没有数据!\n");
		return;
	}
	BOOK temp;
	int i,j,max;
	//选择排序 
	for(i = 0; i < L->length - 1 ;i++){
		for( max = i, j = i + 1; j < L->length; j++){
			if(L->data[j].num > L->data[max].num){
				temp = L->data[j];
				L->data[j] = L->data[max];
				L->data[max] = temp;
			}
		}
	}
	printf("已按书号降序排序\n");
	return;
}
///按价格升序 
void sort3(List L){
	if(L->length == 0){
		printf("没有数据!\n");
		return;
	}
	BOOK temp;
	int i,j,min;
	//选择排序 
	for(i = 0; i < L->length - 1 ;i++){
		for( min = i, j = i + 1; j < L->length; j++){
			if(L->data[j].price < L->data[min].price){
				temp = L->data[j];
				L->data[j] = L->data[min];
				L->data[min] = temp;
			}
		}
	}
	printf("已按价格升序排序\n");
	return;
}
///按价格降序 
void sort4(List L){
	if(L->length == 0){
		printf("没有数据!\n");
		return;
	}
	BOOK temp;
	int i,j,max;
	//选择排序 
	for(i = 0; i < L->length - 1 ;i++){
		for( max = i, j = i + 1; j < L->length; j++){
			if(L->data[j].price > L->data[max].price){
				temp = L->data[j];
				L->data[j] = L->data[max];
				L->data[max] = temp;
			}
		}
	}
	printf("已按价格降序排序\n");
	return;
}

⑩查询函数

//查询函数
/// 按书名 
void booknamefind(List L){
	char temp[128];
	printf("请输入书名:\n");
	scanf("%s",temp);
	int i = Find(L,temp);
	if(i == -1){
		printf("查无此书!\n");
		return;
	}
	printf("信息如下:\n");
	printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
    return;
}
///按书号 
void booknumberfind(List L){
	int temp; 
	printf("请输入书号:\n");
	scanf("%d",&temp);
	int i = Find2(L,temp);
	if(i == -1){
		printf("查无此书!\n");
		return;
	}
	printf("信息如下:\n");
	printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
    return;
}
///按作者名 
void writernamefind(List L){
	char temp[128];
	printf("请输入作者名:\n");
	scanf("%s",temp);
	int i = Find3(L,temp);
	if(i == -1){
		printf("查无此书!\n");
		return;
	}
	printf("信息如下:\n");
	printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
    return;
}
///按出版社名 
void cnamefind(List L){
	char temp[128];
	printf("请输入出版社名:\n");
	scanf("%s",temp);
	int i = Find4(L,temp);
	if(i == -1){
		printf("查无此书!\n");
		return;
	}
	printf("信息如下:\n");
	printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
    return;
}

3.主函数及信息保存功能的实现

//主函数 
int main(){
	list list;
	List L = &list;
	menu(L);
	FILE *fp;
	fp = fopen("C:/Users/lenovo/Desktop/data.txt","w+");
	if(fp == NULL){
		printf("文件打开(创建)失败!\n");
		return 0;
	} 
	int i;
	fprintf(fp,"%d %d\n",L->length,L->size);
	for( i = 0; i < L->length ;i++){
		fprintf(fp,"%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
	}
	fclose(fp);
	return 0;
}

         文件操作采用的是格式化录入数据,即先录入书单已保存书的数目和书单最大长度,之后依次换行录入每本书的信息。载入书单即读取已存数据,两者格式必须一致,详见载入函数

        若读者想直接control + cv使用,请注意更改主函数及载入函数中文件的地址,避免出现错误。

三、总结

        除模糊查询功能外基本实现功能要求,欢迎大家批评指正~

你可能感兴趣的:(c语言,开发语言,后端,程序设计)