我的代码可以对
姓名 出版社 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]