#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define S 20 int booknum = 0; struct Book //图书信息结构体 { char name[100]; //书名 char aut[100]; //作者 float price; //单价 char pub[100]; //出版社 int num; //数量 char sort[100]; //分类 char bh[100]; //编号 struct book*next; }temp[S]; struct Book book[S];
void mainmenu(); //显示主菜单 void display(); //输出结构体文件 void readfile(); //读取文件到结构体
void smcx(); //按书名查询 void autcx(); //按作者查询
void zlpx(); //按种类排序 void cbspx(); //按出版社排序
void price(); //书籍价格 void danjia(); //书籍单价 void totalprice(); //所有书籍总价
void totalnum(); //每类图书的总册数
void addbook(); //添加图书
void bookmodify(); //图书修改
int main(int argc, char *argv[]) { readfile(); mainmenu(); return 0; }
void mainmenu()
{ printf("\n"); printf(" *********************************\n"); printf(" | 1.显示所有图书基本信息 |\n");
printf(" | 2.按书名查询 |\n");
printf(" | 3.按作者名查询 |\n");
printf(" | 4.按种类排序 |\n");
printf(" | 5.按出版社排序 |\n");
printf(" | 6.图书价格 |\n");
printf(" | 7.每类图书的总册数 |\n");
printf(" | 8.图书信息的修改 |\n"); printf(" | 0.退出 |\n");
printf(" **********************************\n"); printf("请输入您要查询的序号: \n"); int n; scanf("%d",&n); switch(n) { case 1:display();break; case 2:smcx();break; case 3:autcx();break; case 4:zlpx();break; case 5:cbspx();break; case 6:price();break; case 7:totalnum();break; case 8:bookmodify();break; default:break; } }
void readfile() { system("cls"); FILE*fp = fopen("JK0326.txt","r"); int m = 0; char str[100]; //定义数组存储文件信息 if (fp == NULL) { printf ("图书信息打开失败!\n") ; return; } fgets(str,100,fp); while(!feof(fp)) { //将信息提取到结构体中 fscanf(fp,"%s %s %s %s %s %d %f\n",book[m].bh ,book[m].sort ,book[m].name ,book[m].aut ,book[m].pub , &book[m].num ,&book[m].price ); m++; } booknum = m; printf ("\n\n 读取图书文件信息成功!\n"); fclose(fp); }
void display() { system("cls"); int i; //将文件逐个输出的变量 int x; //等待输入的指令变量 printf ("\n\n编号 分类 书名 作者 出版社 数量 单价\n");
for(i = 0;i < booknum;i++) { //输出结构体中的信息 printf ("%3s %s %-6s %-6s %-6s %d %-5.3f\n",book[i].bh ,book[i].sort ,book[i].name ,book[i].aut , book[i].pub ,book[i].num ,book[i].price );
}
printf("\n已呈现所查询的内容,如果需要继续查询其他项目,请输入任何指令返回菜单栏");
getch();
mainmenu();
}
void smcx() { system("cls"); int x; int i; //取出文件的参数 int n = 0; //判断是否查询成功 char t; //判断是否继续程序 char bookname[30]; Loop: //标识语句 n = 0; printf("请输入你要查询的书名: "); scanf("%s",bookname); for(i=0;i<booknum;i++)
{ if(!strcmp(bookname,book[i].name )) //判断输入和存在的书名是否一致 { printf ("\n\n编号 分类 书名 作者 出版社 数量 单价\n"); printf("%3s %s %-6s %-7s %-s %d %-5.3f\n",book[i].bh ,book[i].sort ,book[i].name ,book[i].aut , book[i].pub ,book[i].num ,book[i].price ); n = 1; } } if(n == 0) { printf("您查询的书籍暂无!十分抱歉\n"); } printf("是否继续查找?继续请按1,返回请按2\n"); fflush(stdin); //清除输入缓冲区(standard input //标准输入) scanf("%s",&t); if(t == '1') { goto Loop; //使程序继续查询 } if(t == '2') { getch(); mainmenu(); //使程序跳转至菜单栏 }
}
void autcx() { system("cls"); int x; int i; // 取出文件的参数 int n = 0; //判断是否查询成功 int t; //判断程序是否继续进行 char bookaut[100]; Loop: printf("请输入您要查询的作者名: "); scanf("%s",bookaut); for(i = 0;i < booknum;i ++) {
if(!strcmp(bookaut,book[i].aut)) //a与b内容是否相同(strcmp(a,b)==0) { printf ("\n编号 分类 书名 作者 出版社 数量 单价\n"); printf("%3s %s %-6s %-7s %-s %d %-5.3f\n",book[i].bh ,book[i].sort ,book[i].name ,book[i].aut , book[i].pub ,book[i].num ,book[i].price ); n = 1; } } if(n == 0) { printf("你查询的作者暂时没有作品存在于此处!抱歉\n"); } printf("是否继续查找?继续请按1,返回请按2\n"); fflush(stdin); scanf("%s",&t); if(t == '1') { goto Loop; } if(t == '2') { getch(); mainmenu(); //实现程序跳转 } }
void zlpx() { system("cls"); int x; struct Book books[booknum]; struct Book temp; int i,j; //循环参数 for(i = 0;i < booknum;i++) //建立原有书籍的副本 { books[i] = book[i]; } for(i = 0;i < booknum - 1;i++) //排序 { for(j = i + 1;j < booknum;j++) { if(strcmp(books[i].sort ,books[j].sort ) > 0) { temp = books[i]; books[i] = books[j]; books[j] = temp; } } } printf ("\n编号 分类 书名 作者 出版社 数量 单价\n"); for(i = 0;i < booknum;i++) { printf("%3s %s %-6s %-7s %-s %d %-5.3f\n",books[i].bh ,books[i].sort ,books[i].name ,books[i].aut , books[i].pub ,books[i].num ,books[i].price ); printf("\n"); } for(;x!=49;) { printf("\n已呈现查询的内容,结束显示请按1\n"); x = getch(); for(;x!=49;) { x = getch(); } }
printf("\n请按任意键返回菜单栏");
getch();
mainmenu();
}
void cbspx() { struct Book books[booknum]; int x; struct Book temp; int i,j; //循环参数 for(i = 0;i < booknum;i++) //建立原有书籍的副本 { books[i] = book[i]; } for(i = 0;i < booknum - 1;i++) //排序 { for(j = i + 1;j < booknum;j++) { if(strcmp(books[i].pub ,books[j].pub ) > 0) { temp = books[i]; books[i] = books[j]; books[j] = temp; } } } printf ("\n编号 分类 书名 作者 出版社 数量 单价\n"); for(i = 0;i < booknum;i++) { printf("%3s %s %-6s %-7s %-s %d %-5.3f\n",books[i].bh ,books[i].sort ,books[i].name ,books[i].aut , books[i].pub ,books[i].num ,books[i].price ); printf("\n"); } for(;x!=49;) { printf("\n已呈现查询的内容,结束显示请按1\n"); x = getch(); for(;x!=49;) { x = getch(); } }
printf("\n请按任意键返回上一层");
getch();
mainmenu();
}
void price() { system("cls"); int x; int y; int n; printf("\n\n\n"); printf(" *********************************\n"); printf(" | 1.显示单书总价 |\n\n"); printf(" | 2.显示所有图书总价 |\n\n"); printf(" | 3.回到菜单 |\n\n"); printf(" *********************************\n"); Loop: printf("请输入您要查询的内容指令:\n"); scanf("%d",&n); switch(n) { case 1:danjia();break; case 2:totalprice();break; case 3:mainmenu(); default:break; } printf("是否继续查询?"); y = getch(); if(y==13) { goto Loop; }
}
void totalprice() { int i; int x; int product; int bookprice; int sum; for(i=0;i<booknum;i++) { product = book[i].num *book[i].price ; bookprice = sum + product; sum = bookprice; } printf("所有书籍的总价:%d",sum); for(;x!=49;) { printf("\n已呈现查询的内容,结束显示请按1\n"); x = getch(); for(;x!=49;) { x = getch(); } }
printf("\n请按任意键返回上一层");
getch();
price();
}
void danjia() { int i; int x; int n = 0; char bookname[20]; printf("请输入书名:\n"); scanf("%s",bookname); for(i=0;i<booknum;i++) { if(!strcmp(bookname,book[i].name )) { printf("查询成功!\n"); printf("册数:%d,价格:%-5.3f\n",book[i].num ,book[i].price ); n = 1; } } if(n == 0) { printf("\n没有找到您要找的书籍哦\n"); } printf("结束显示请按1\n"); x = getch(); for(;x!=49;) { x = getch(); }
printf("\n请按任意键返回上一层");
getch();
price();
}
void totalnum() { system("cls"); int x; int i; int n = 0; char booksort[20]; printf("请输入您要查询的图书类型:\n"); scanf("%s",booksort); for(i=0;i<booknum;i++) { if(!strcmp(booksort,book[i].sort )) { printf("查询成功!\n"); printf ("\n\n编号 分类 书名 数量\n"); printf("%3s %s %-6s %d\n",book[i].bh ,book[i].sort ,book[i].name ,book[i].num ); n = 1; } } printf("结束显示请按1\n"); x = getch(); for(;x!=49;) { x = getch(); }
printf("\n请按任意键返回上一层");
getch();
mainmenu();
}
void addbook() { FILE *fp; int i; char name[100] = {'\0'}; //赋值初始化 char aut[100] = {'\0'};
char price[100] = {'\0'};
char pub[100] = {'\0'};
char num[100] = {'\0'}; char sort[100] = {'\0'}; char bh[100] = {'\0'}; //name[100]={'\0'} 是先给大小再进行初始化 //name[]={'\0'}是直接赋值初始化,赋的值决定其大小 system("cls");
fp = fopen("JK0326.txt","a+");
printf("请输入书名:\n");
scanf("%c",name);
for(i=0;i<booknum;i++)
{
if(strcmp(name,book[i].name ) == 0)
{
book[i].num = book[i].num +1;
return;
}
}
printf("\n请按以下格式输入图书信息:\n编号 分类 书名 作者 出版社 数量 单价\n");
for(;i!=49;)
{
printf("请输入: \n");
scanf("%s%s%s%s%s%s%s",bh,sort,name,aut,pub,num,price);
fprintf(fp,"\n%s %-8s %-6s %-6s %-10s %d %-5.3f\n",bh,sort,name,aut,pub,num,price);
printf("添加成功!\n");
printf("完成添加\n");
i = getch();
for(;i!=49;)
{
i = getch();
}
}
fclose(fp);
printf("\n保存成功,按任意键返回上一层");
getch();
mainmenu();
}
void bookmodify() { system("cls"); int i,m; FILE*fp=fopen("JK0326.txt","w"); char bookname[20]; printf("\n请输入要修改的书本名称:");
scanf("%s",bookname); for(i=0;i<booknum;i++) { temp[i] = book[i]; if(strcmp(bookname,book[i].name )==0) { printf("请输入修改后书本的编号:"); scanf("%s",temp[i].bh); printf("请输入修改后书本的分类:"); scanf("%s",temp[i].sort); printf("请输入修改后书本的作者:"); scanf("%s",temp[i].aut); printf("请输入修改后书本出版社:"); scanf("%s",temp[i].pub); printf("请输入修改后书本的数量:"); scanf("%d",&temp[i].num); printf("请输入修改后书本的单价:"); scanf("%f",&temp[i].price); book[i]=temp[i];
fprintf(fp,"\n编号 分类 书名 作者 出版社 数量 单价\n");
for(m=0;m<booknum;m++)
{
fprintf(fp,"%3s %s %-6s %-7s %-s %d %-5.2f\n",book[m]. bh,book[m].sort ,book[m].name ,book[m].aut ,book[m].pub ,book[m].num ,book[m].price);
}
fclose(fp);
}
if(i==booknum)
{
printf("该书本不存在,无法进行修改!\n\n");
break;
}
} display(); return mainmenu(); } void Borrowbook() { printf("\n已呈现查询的内容,结束显示请按1\n"); x = getch(); for(;x!=49;) { x = getch(); }
printf("\n请按任意键返回上一层");
getch();
mainmenu();
}
能说一下现在有什么问题吗