#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 10000
typedef struct {
char no[100];//图书ISBN
char name[100];//图书名字
double price;//图书价格
} Book;
typedef struct {
Book data[MAXSIZE];
int length;
} SqList,*PSqList;
PSqList PL;//创建一个顺序表,PL为一个指针变量
FILE* fp;
int cnt,st,op,i,j,k,flag,num,idx;
char name[100],no[100];
double price;
Book temp;
void menu();//菜单
void add();//图书插入
void delete1();//图书删除
void modify();//价格更新
void output();//图书浏览
void search();//图书查找
void price_sort();//价格排序
void reserse_save();//逆序存储
void bookstatistics();//图书统计
void read_in_information();//导入信息
void save_information1();//保存信息1(存储到book.txt中)
void save_information2();//保存信息2.1(正序存储到book-newsort.txt中)
void save_information3();//保存信息2.2(逆序存储到book-newsort.txt中)
int main() {
read_in_information();//导入信息
printf("图书信息如下:\n");
output();//图书浏览
menu();//菜单
scanf("%d", &op);
if (op >= 1 && op <= 8) {
switch (op) {
case 1:
add();
break;
case 2:
delete1();
break;
case 3:
modify();
break;
case 4:
price_sort();
break;
case 5:
output();
break;
case 6:
search();
break;
case 7:
bookstatistics();
break;
case 8:
reserse_save();
break;
}
} else printf("输入无效\n");
return 0;
}
//菜单
void menu() {
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("***********************************************************************************************************************\n");
printf("请输入代码选择(1-8):\n");
}
//图书浏览
void output() {
printf("北京林业大学图书馆计算机类图书采购列表\n");
printf("ISBN 书名 定价\n");
for(i=1; i<=PL->length; i++) {
printf("%-10s %-20s %-10.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
}
printf("\n");
}
//图书统计
void bookstatistics() {
printf("图书总数为%d\n",PL->length);
printf("\n");
}
//图书查找
void search() {
flag = 1;
while (1) {
printf("请输入需要查找的图书位置或书名(如果有多本,则全部输出)\n按键1选择输入图书位置,按键2选择输入书名,按键0选择停止输入:");
scanf("%d", &op);
if (op == 1 || op == 2 || op == 0) {
switch (op) {
case 0:
flag = 0;
break;
case 1: {
printf("请输入要查找的图书位置:");
scanf("%d", &num);
if(num<1||num>PL->length) printf("图书不存在,查找失败\n");
else {
printf("该图书信息如下:\n");
printf("ISBN 书名 定价\n");
printf("%-8s %-8s %-6.2f\n",PL->data[num].no,PL->data[num].name,PL->data[num].price);
}
}
break;
case 2: {
printf("请输入要查找的书名:");
scanf("%s", name);
int cnt=0;
for(int i=1; i<=PL->length; i++) {
if(strcmp(PL->data[i].name,name)==0) cnt++;
}
if(cnt==0) printf("图书不存在,查找失败\n");
else {
printf("该图书信息如下:\n");
printf("ISBN 书名 定价\n");
for(int i=1; i<=PL->length; i++) {
if(strcmp(PL->data[i].name,name)==0) printf("%-8s %-8s %-6.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
}
}
break;
}
}
} else {
printf("输入无效,请重新输入!!!\n");
continue;
}
if (flag == 0) break;
}
printf("\n");
}
//价格更新
void modify() {
for(i=1; i<=PL->length; i++) {
if(PL->data[i].price<45) PL->data[i].price*=1.2;
else PL->data[i].price*=1.1;
}
save_information2();//正序存储到新文件book-newsort.txt中
printf("更新成功!!!\n");
}
//图书插入
void add() {
printf("请输入需要插入的图书信息(ISBN,书名,定价):\n");
scanf("%s%s%lf", no, name, &price);
printf("请输入需要插入的位置num:\n");
scanf("%d",&num);
if(num<1||num>PL->length) printf("指定位置非法!!!\n");
else {
for(i=PL->length; i>=num; i--) {
strcpy(PL->data[i+1].no,PL->data[i].no),strcpy(PL->data[i+1].name,PL->data[i].name),PL->data[i+1].price=PL->data[i].price;
}
strcpy(PL->data[num].no,no),strcpy(PL->data[num].name,name),PL->data[num].price=price;
PL->length++;
}
save_information1();//存储到book.txt中
}
//图书删除
void delete1() {
printf("请输入需要删除的图书位置:\n");
scanf("%d", &num);
if(num<1||num>PL->length) printf("指定位置非法!!!\n");
else {
for(int i=num; i<PL->length; i++) {
strcmp(PL->data[i].no,PL->data[i+1].no),strcmp(PL->data[i].name,PL->data[i+1].name),PL->data[i].price=PL->data[i+1].price;
}
PL->length--;
}
save_information1();//存储到book.txt中
}
//导入信息
void read_in_information() {
if ((fp = fopen("D:\\book.txt", "r")) == NULL) {
printf("file open error!\n");
exit(0);
}
PL = (PSqList)malloc(sizeof(SqList)); // 分配内存
if(PL)
PL->length = 0;
else {
printf("内存分配失败!!!\n");
exit(-1);
}
while (!feof(fp)) {
++cnt;
fscanf(fp,"%s%s%lf",PL->data[cnt].no,PL->data[cnt].name,&PL->data[cnt].price);
PL->length++;
}
if (fclose(fp)) {
printf("can not close the file!\n");
exit(0);
}
}
//价格排序
void price_sort() {
for(i=1; i<PL->length; i++) {
k=i;
for(j=i+1; j<=PL->length; j++) {
if(PL->data[j].price<PL->data[k].price) k=j;
}
if(k!=i) {
temp=PL->data[i];
PL->data[i]=PL->data[k];
PL->data[k]=temp;
}
}
save_information2();//正序存储到新文件book-newsort.txt中
printf("排序成功!!!\n");
}
//逆序存储
void reserse_save() {
save_information3();//逆序存储到新文件book-newsort.txt中
printf("操作成功!!!\n");
}
//保存信息1
void save_information1() {
if ((fp = fopen("D:\\book.txt", "w")) == NULL) {
printf("file open error!\n");
exit(0);
}
for(int i=1; i<=PL->length; i++) {
if(i<PL->length) fprintf(fp,"%s %s %.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
else fprintf(fp,"%s %s %.2f",PL->data[i].no,PL->data[i].name,PL->data[i].price);
}
if (fclose(fp)) {
printf("can not close the file!\n");
exit(0);
}
}
//保存信息2.1(正序存储到book-newsort.txt中)
void save_information2() {
if ((fp = fopen("D:\\book-newsort.txt", "w")) == NULL) {
printf("file open error!\n");
exit(0);
}
for(int i=1; i<=PL->length; i++) {
if(i<PL->length) fprintf(fp,"%s %s %.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
else fprintf(fp,"%s %s %.2f",PL->data[i].no,PL->data[i].name,PL->data[i].price);
}
if (fclose(fp)) {
printf("can not close the file!\n");
exit(0);
}
}
//保存信息2.2(逆序存储到book-newsort.txt中)
void save_information3() {
if ((fp = fopen("D:\\book-newsort.txt", "w")) == NULL) {
printf("file open error!\n");
exit(0);
}
for(int i=PL->length; i>=1; i--) {
if(i>1) fprintf(fp,"%s %s %.2f\n",PL->data[i].no,PL->data[i].name,PL->data[i].price);
else fprintf(fp,"%s %s %.2f",PL->data[i].no,PL->data[i].name,PL->data[i].price);
}
if (fclose(fp)) {
printf("can not close the file!\n");
exit(0);
}
}