数据结构课程设计-图书管理系统

我的代码可以对

姓名  出版社 int char 进行排错

写这个用了一个晚上,有地方有错误,不改了,太费脑子,如有想修改者,可以联系我微信QQ2423824433

代码C语言:

# include<stdio.h> 
# include <stdlib.h>
# define N 40                         //图书最多40/2个汉字 
# define MAX 200                       //用户录入的书籍最大数 
# define Year 2017 
typedef struct TU{
	int A[4];                         //A[0]存图书的出版时间  A[1]作者性别  0男1女    A[2]为库存量    A[3]存图书的价格 单位 分1890分 
	char B[4][N+1];                     //B[0]书名     B[1]作者     B[2]出版社    B[3]图书的编号 
}TU;
typedef struct Head{
	int S[4];                         //S[0]存书籍 总种类数  S[1]存当前录入了多少种书本   S[2]当前书本中女性作者总数  S[3]存书本的总本数 
	TU T[MAX];                        //接上MAX个图书结构体 
}Head;
char name[]={" 赵 钱 孙 李 周 吴 郑 王 冯 陈 楮 卫 蒋 沈 韩 杨 朱 秦 尤 许 何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 谢 邹 喻 柏 水 窦 章 云 苏 潘 葛 奚 范 彭 郎 鲁 韦 昌 马 苗 凤 花 方 俞 任 袁 柳 酆 鲍 史 唐 费 廉 岑 薛 雷 贺 倪 汤 滕 殷 罗 毕 郝 邬 安 常 乐 于 时 傅 皮 卞 齐 康 伍 余 元 卜 顾 孟 平 黄 和 穆 萧 尹 姚 邵 湛 汪 祁 毛 禹 狄 米 贝 明 臧 计 伏 成 戴 谈 宋 茅 庞 熊 纪 舒 屈 项 祝 董 梁 杜 阮 蓝 闽 席 季 麻 强 贾 路 娄 危 江 童 颜 郭 梅 盛 林 刁 锺 徐 丘 骆 高 夏 蔡 田 樊 胡 凌 霍 虞 万 支 柯 昝 管 卢 莫 经 房 裘 缪 干 解 应 宗 丁 宣 贲 邓 郁 单 杭 洪 包 诸 左 石 崔 吉 钮 龚 程 嵇 邢 滑 裴 陆 荣 翁 荀 羊 於 惠 甄 麹 家 封 芮 羿 储 靳 汲 邴 糜 松 井 段 富 巫 乌 焦 巴 弓 牧 隗 山 谷 车 侯 宓 蓬 全 郗 班 仰 秋 仲 伊 宫 宁 仇 栾 暴 甘 斜 厉 戎 祖 武 符 刘 景 詹 束 龙 叶 幸 司 韶 郜 黎 蓟 薄 印 宿 白 怀 蒲 邰 从 鄂 索 咸 籍 赖 卓 蔺 屠 蒙 池 乔 阴 郁 胥 能 苍 双 闻 莘 党 翟 谭 贡 劳 逄 姬 申 扶 堵 冉 宰 郦 雍 郤 璩 桑 桂 濮 牛 寿 通 边 扈 燕 冀 郏 浦 尚 农 温 别 庄 晏 柴 瞿 阎 充 慕 连 茹 习 宦 艾 鱼 容 向 古 易 慎 戈 廖 庾 终 暨 居 衡 步 都 耿 满 弘 匡 国 文 寇 广 禄 阙 东 欧 殳 沃 利 蔚 越 夔 隆 师 巩 厍 聂 晁 勾 敖 融 冷 訾 辛 阚 那 简 饶 空 曾 毋 沙 乜 养 鞠 须 丰 巢 关 蒯 相 查 后 荆 红 游 竺 权 逑 盖 益 桓 公 万俟 司马 上官 欧阳 夏侯 诸葛 闻人 东方 赫连 皇甫 尉迟 公羊 澹台 公冶 宗政 濮阳 淳于 单于 太叔 申屠 公孙 仲孙 轩辕 令狐 锺离 宇文 长孙 慕容 鲜于 闾丘 司徒 司空 丌官 司寇 仉 督 子车 颛孙 端木 巫马 公西 漆雕 乐正 壤驷 公良 拓拔 夹谷 宰父 谷梁 晋 楚 阎 法 汝 鄢 涂 钦 段干 百里 东郭 南门 呼延 归 海 羊舌 微生 岳 帅 缑 亢 况 后 有 琴 梁丘 左丘 东门 西门 商 牟 佘 佴 伯 赏 南宫 墨 哈 谯 笪 年 爱 阳 佟 第五 言 福 "};
char key[21][3]={"!","。","?","《","》",",","{","}","(",")","¥","‘","’",":",";","—","”","“","、","·","~"};
int jiemian(Head *QQ);                        //界面函数 返回用户的选择 
int BF(char a[],char b[]);            //BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标 若无返回0  
int gainint(int *p,int min,int max);  //输入int *p直至满足(a,b)输入结束,并返回*p     
int gainchar(char *A,int min,int max);//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度 
void record(Head *temp);                 //录入函数 录入图书信息 
int GetDate(char S[],int F);            //F=0录入日期和印刷数F=1只录入出版日期   F=2只录入印刷数 
int check(char S[],int X);               //检验合法性   X=0检验S是否为汉字  是则返回0   X=1检验姓名 姓名合法返回0    X=2检验出版社   合法返回0  X=3检测书的编号 
void print(Head *temp,int X);              //显示第X个人的所有信息 
void paixu(int A[][MAX],int n,int F);//以A[0]为比较依据共 n个 F=0升序   F=1降序 
int main()
{
	Head QQ={0},*Temp=&QQ;
	int choice,W,Y,AA[2][MAX],i,j,k,domain[][8]={{2,4,0,6,1700,1,1,100},{N,8,1,14,Year,99,MAX*MAX,20000}};
	const char ASDF[8][10]={"书本名   "," 作者名"," 性别"," 编号    ","时间 ","印刷数 ","库存量 ","价格"},Tran[]={0,0,1,0,0,0,2,3};
	char SE[][9]={"全部删除","退出"},WU[][17]={"出版时间由早到晚","先男后女","库存量由少到多","图书价格由低到高"};
	char BB[N+1]; 
	do{
		system("cls");
		choice=jiemian(&QQ);	
		if(choice==1)
			record(Temp);
		if(!QQ.S[0])
			continue;
		if(choice==2||choice==3)
		{
			for(i=0;i<8;i++)
				printf("%d:%s",i+1,ASDF[i]);
			printf("\n");
			if(choice==3)
			{
				for(i=0;i<QQ.S[1];i++)
					print(&QQ,i);
			}
			else{
				printf("请输入查找的类型[1,8]:");
				gainint(&W,1,8);
				W--; 
				for(i=0;i<8;i++)
				printf("%d:%s",i+1,ASDF[i]);
			    printf("\n");
				if(W<2||W==3)
				{
					printf("请输入书的%s--[%d,%d]个字节:",ASDF[W],domain[0][W],domain[1][W]);
					gainchar(BB,domain[0][W],domain[1][W]);
					printf("查找结果以第%d列为准:\n",W+1);
					for(i=0;i<QQ.S[1];i++)
						if(BF(QQ.T[i].B[W],BB))
							print(&QQ,i);
				}
				else if(W!=4&&W!=5){
					printf("请输入%s[%d,%d]:",domain[0][W],domain[1][W]);
					gainint(&W,domain[0][W],domain[1][W]);
					printf("查找结果以第%d列为准:\n",W+1);
					for(i=0;i<QQ.S[1];i++)
						if(QQ.T[i].A[Tran[W]]==W)
							print(&QQ,i);
				}
				else
				{
					Y=GetDate("书本",W-3);
					for(i=0;i<QQ.S[1];i++)
					{
						j=0;
						if(W==5&&QQ.T[i].A[Tran[W]]/100==Y/100)j=1;
						if(W==4&&QQ.T[i].A[Tran[W]]%100==Y)  j=1;
						if(j) print(&QQ,i);
					}
				}
			}
		}
		if(choice==4)
		{
			
			for(i=0;i<QQ.S[1];i++)
				printf("%3d:%s\t",i+1,QQ.T[i].B[0]);		
			printf("请输入要删除的书前的序号[1,%d]:",QQ.S[1]);
			gainint(&W,1,QQ.S[1]);
			print(&QQ,--W);
			QQ.S[2]-=QQ.T[W].A[1];
			QQ.S[3]-=QQ.T[W].A[2];
			for(i=W;i<QQ.S[1];i++)
			{
				for(j=0;j<4;j++)
					QQ.T[i].A[j]=QQ.T[i+1].A[j];
				for(j=0;j<4;j++)
					for(k=0;k<N;k++)
						QQ.T[i].B[j][k]=QQ.T[i+1].B[j][k];
			}
			QQ.S[1]--;
		}
		if(choice==5)
		do{
			printf("1:出版时间\t2:性别\t3:库存量\t4:价格\n请输入排序的基准[1,4]:");
			gainint(&W,1,4);
			printf("%s请按1,否则请按0:",WU[--W]);
			gainint(&Y,0,1);
			for(i=0;i<QQ.S[1];i++)
			{
				AA[1][i]=i;
				AA[0][i]=QQ.T[i].A[W];
			}
			paixu(AA,QQ.S[1],Y);
			printf("排序结果以第%d列为基准:\n",W+1);
			for(i=0;i<QQ.S[1];i++)
				print(&QQ,AA[1][i]);
			printf("继续查看排序请按1:退出排序请按0:");
			  gainint(&Y,0,1);
		}while(Y);
		if(choice==6||choice==7)
		{
			printf("确定%s请按1,取消请按0:",SE[choice-6]);
			gainint(&W,0,1);
			if(W)
			{
				QQ.S[0]=0;
				printf("%s成功!\n",SE[choice-6]);
				if(choice==7)    return 0;	
			}
		}
		printf("请按任意键继续…");
		getchar(); 
	}while(1);
	return 0;
}
void print(Head *temp,int X)
{
	char SEX[][3]={"男","女"};
	int  Y[5]={temp->T[X].A[0]/10000,temp->T[X].A[0]%10000/100,temp->T[X].A[0],temp->T[X].A[3]/100,temp->T[X].A[0]%100};
	printf("%-11s%8s  %-3s  %-10s  %d.%02d  %3d%6d  %d.%02d\n",temp->T[X].B[0],temp->T[X].B[1],SEX[temp->T[X].A[1]],temp->T[X].B[3],Y[0],Y[1],Y[2],temp->T[X].A[2],Y[3],Y[4]); 
}
int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标 若无返回0    
{                         
	int i=0,j=0;     
	while (a[i]&&b[j])    
		if (a[i++]==b[j]) ++j;   // 继续比较后继字    
		else  (i-=j)&&(j=0);             
		return b[j]?0:i-j+1;    
}   
int jiemian(Head *QQ)
{
	int A;
	printf("$$$$$$$$$$$$$$$$$图书管理系统$$$$$$$$$$$$$$$$$\n");
	if(QQ->S[0])
	{
		printf("______________________________________________\n");
		printf("当前书库书本共%4d种\n已经录入%4d种\n",QQ->S[0],QQ->S[1]);
		printf("书本作者->男性:%2d人<---->女性:%2d人\n",QQ->S[1]-QQ->S[2],QQ->S[2]); 
		printf("本书库共存有书本%6d本\n",QQ->S[3]);          
	}	
	printf("**********************************************\n");
	printf("*  *1:添加  书本信息      *一个汉字=两个字节 *\n");
	printf("*  *2:查找  书本信息      *可多次录入书本信息*\n");
	printf("*  *3:显示  书本信息      *只能录入全汉字书籍*\n");
	printf("*  *4:删除  书本信息      *////\\\ \ *\n");
	printf("*  *5:对书本信息进行排序  * |  ^     ^  |  *\n");
	printf("*  *6:全部清空 恢复初始化 * d   ● * ●  b  *\n");
	printf("*  *7:退出                * I'm  zhagoodwell *\n");
	printf("**********************************************\n");
	printf("输入你的选择[1,7]:"); 
	return gainint(&A,1,7);
} 
int gainint(int *p,int min,int max)//输入int *p直至满足(a,b)输入结束,并返回*p       
{           
	do{          
		*p=min-1;    //此处是为了减少意外情况的发生 虽然那种意外情况不常见    
		scanf("%d",p);          
		while(getchar()!='\n');          
		if(*p>max||*p<min)          
			printf("输入有误,请重新输入[%d,%d]:",min,max);          
	}while(*p>max||*p<min);          
	return *p;          
}  
void record(Head *temp){
	int num,i,j,k,F,domain[][4]={{2,4,10,6},{N,8,N,14}};
	char WE[][9]={"书本名","作者姓名","出版社","图书编号"};
	if(!(temp->S[0]))
	{
		printf("书本总共的种类[100,%d]:",MAX);
		gainint(&temp->S[0],100,MAX);
	} 
	printf("此次需要录入书本的种类[%d,%d]:",temp->S[1]?0:2,temp->S[0]-temp->S[1]);
	gainint(&num,temp->S[1]?0:2,temp->S[0]-temp->S[1]);
	for(i=temp->S[1],temp->S[1]+=num;i<temp->S[1];i++)
	{
		for(F=j=0;j<4;j++,F=0)
			do{
				printf("第%d个书的%s--[%d,%d]个字节:",i+1,WE[j],domain[0][j],domain[1][j]);
				gainchar(temp->T[i].B[j],domain[0][j],domain[1][j]);
				if(!j||j==3) for(F=k=0;k<i;k++)
					if(BF(temp->T[k].B[j],temp->T[i].B[j]))
						F=printf("此%s已经录入过!请重新",WE[j]);
			}while(check(temp->T[i].B[j],j)||F);
			temp->T[i].A[0]=GetDate(temp->T[i].B[0],0);
			printf("%s>>性别(0代表男--1代表女):",temp->T[i].B[1]);
			temp->S[2]+=gainint(&temp->T[i].A[1],0,1); 
			printf("本书的库存量[1,%d]:",MAX*MAX); 
			temp->S[3]+=gainint(&temp->T[i].A[2],1,MAX*MAX);
			printf("输入图书的价格>");
			if(i==temp->S[1]-num)
				printf("\n<比如18.90元 请输入1890> ");
			printf("范围[100,20000]:");
			gainint(&temp->T[i].A[2],100,20000); 
	} 	
}
int check(char S[],int X)               //检验合法性   X=0书名     X=1作者     X=3出版社 
{
	int i=-1,j=0,F=0,k;  
	char T[3]={S[2],S[4]},CBS[]={"出版社"};//CBS为出版社三个汉字的首字母 
	if(X==3)while(S[++i])
		if((S[i]>'9'||S[i]<'0')&&(S[i]<'a'||S[i]>'z')&&(S[i]<'A'||S[i]>'Z')&&S[i]!=' '&&S[i]!='-')
			return printf("图书编号只能由字母,数字,'-'或者空格组成,请重新输入");
		while(S[++i])
			if(S[i]>0)          return printf("输入中含有非中文字符!请重新输入");  
			while(j<21)  
				if(BF(S,key[j++]))  return printf("输入中有的不是汉字!请重新输入"); 
				if(X==1)
				{
					S[2]=S[4]=0;
					k=BF(name,S);
					S[2]=T[0];
					if(name[k-2]==' '&&name[k+1]==' ')F=1;
					else {
						k=BF(name,S);
						S[4]=T[1];
						if(name[k-2]==' '&&name[k+3]==' ')F=1;
						if(!F) return printf("姓氏有误!请重新输入");
					}
					S[4]=T[1];
				}	
				if(X==2)
				{
					k=BF(S,CBS);
					if(S[k+5]) return printf("出版社名称有误!请重新输入");
				}
				return 0;
}
int GetDate(char S[],int F){     
	int a[3]={0},charge[6]={1700,1,1,Year,12,99},i,C[][3]={{0,0,2},{3,2,3}};  
	char zifu[][9]={"年份","月份","印刷次数"};  
	for(i=C[0][F];i<C[1][F];i++)    
	{    
		printf("请输入%s的出版%s[%d,%d]:\n",S,zifu[i],charge[i],charge[i+3]);    
		gainint(&a[i],charge[i],charge[i+3]);       
	}    
	return a[0]*10000+a[1]*100+a[2];//把年月日拼成一个数字  并返回 
} 
int gainchar(char *A,int min,int max)//长度在[min,max]  <闭区间>  之间时 函数结束 返回字符串A的长度        
{        
	int B,C;      
	do{        
		A[max]=B=C=0;    
		while((A[B++]=getchar())!='\n'&&B<max);    
		if(A[B-1]!='\n')while(getchar()!='\n'&&++C);        
		else A[--B]=0;     
		if(C||B&&B<min)    printf("您录入的字符串长度:%d字节\n只录入[%d,%d]个字节!\n",B+C,min,max);        
	}while(C||B<min);        
	return B;      
} 
void paixu(int A[][MAX],int n,int F)//以A[0]为比较依据共 n个 F=0升序   F=1降序 
{  
	int i,j,k,m,t;  
	for(i=0;i<n-1;i++)  
	{  
		k=i;  
		for(j=i+1;j<n;j++)  
			if(F?A[0][j]>A[0][k]:A[0][j]<A[0][k])  
				k=j;  
			if(k!=i) for(t=0;t<2;t++)
			{  
				m=A[t][i];
				A[t][i]=A[t][k];
				A[t][k]=m;  
			}  
	}  
}   


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值