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