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

我的代码可以对

姓名  出版社 int char 进行排错

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

代码C语言:

# include 
# include 
# 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;iT[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||*pmax||*pS[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;iS[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;kT[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  之间时 函数结束 返回字符串A的长度        
{        
	int B,C;      
	do{        
		A[max]=B=C=0;    
		while((A[B++]=getchar())!='\n'&&BA[0][k]:A[0][j]


你可能感兴趣的:(编程题,C语言小程序)