采用c语言 需要使用记事本读取数据,可只做出查询,排序,添加功能,每行进行相应的注释,感谢
给你个参考吧,类似的,如有问题可以问。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define EMPTY -1 // 初始标志
#define DEL_EMPTY 0 // 删除标志
#define _MAX 200 //库存最大数量
typedef struct BookInfo {
int _count;
int _price;
char _id[10];
char _author[20];
char _name[50];
char _introduction[100];
}BookData;
BookData books_house[_MAX] = { -1, 0,"","", "", "", };
// 书仓信息
void books_house_info()
{
printf("--------------------书籍信息--------------------\n");
printf("ID\t书名\t作者\t价格\t数量\t简介\n");
for (int i = 0; i < _MAX; ++i) {
if (books_house[i]._count == EMPTY)
break;
else if (books_house[i]._count == DEL_EMPTY)
continue;
printf("%s\t", books_house[i]._id);
printf("%s\t", books_house[i]._name);
printf("%s\t", books_house[i]._author);
printf("%d\t", books_house[i]._price);
printf("%d\t", books_house[i]._count);
printf("%s\t", books_house[i]._introduction);
printf("\n");
}
printf("------------------------------------------------\n");
}
// 增添书
bool books_house_add(BookData info)
{
for (int i = 0; i < _MAX; ++i) {
if (books_house[i]._count == EMPTY ||
books_house[i]._count == DEL_EMPTY) {
for (int j = 0; j < _MAX; ++j) {
if (strcmp(books_house[j]._id, info._id) == 0 ||
strcmp(books_house[j]._name, info._name) == 0) {
return false;
}
}
books_house[i] = info; break;
}
}
books_house_info();
return true;
}
// 删除书
void books_house_del(BookData info)
{
for (int i = 0; i < _MAX; ++i) {
if (strcmp(books_house[i]._name, info._name) == 0) {
books_house[i]._count = DEL_EMPTY;
break;
}
}
books_house_info();
}
// 价格排序(升序)
void books_house_sort()
{
for (int i = 0; i < _MAX - 1; ++i) {
if (books_house[i]._count == EMPTY) break;
else if (books_house[i]._count == DEL_EMPTY) continue;
for (int j = 0; j < _MAX - i - 1; ++j) {
if (books_house[j]._price > books_house[j + 1]._price) {
BookData tmp = books_house[j];
books_house[j] = books_house[j + 1];
books_house[j + 1] = tmp;
}
}
}
books_house_info();
}
// 修改书籍信息
void books_house_modify(BookData info)
{
for (int i = 0; i < _MAX; ++i) {
if (strcmp(books_house[i]._name, info._name) == 0) {
books_house[i] = info; break;
}
}
books_house_info();
}
// 根据书ID查找
bool books_house_search(BookData info)
{
printf("\n--------------------查询结果--------------------\n");
printf("ID\t书名\t作者\t价格\t数量\t简介\n");
for (int i = 0; i < _MAX; ++i) {
if (strcmp(books_house[i]._id, info._id) == 0) {
printf("%s\t", books_house[i]._id);
printf("%s\t", books_house[i]._name);
printf("%s\t", books_house[i]._author);
printf("%d\t", books_house[i]._price);
printf("%d\t", books_house[i]._count);
printf("%s\t", books_house[i]._introduction);
printf("\n");
return true;
break;
}
}
return false;
}
// 书籍信息
void set_book_info(BookData *book)
{
printf("输入ID:");
scanf_s("%s", book->_id, sizeof(book->_id));
printf("输入书名:");
scanf_s("%s", book->_name, sizeof(book->_name));
printf("输入作者:");
scanf_s("%s", book->_author, sizeof(book->_author));
printf("输入简介:");
scanf_s("%s", book->_introduction, sizeof(book->_introduction));
printf("输入数量:");
scanf_s("%d", &book->_count);
printf("输入价格:");
scanf_s("%d", &book->_price);
}
void books_house_manage_menu()
{
system("cls");
printf(" 图书管理系统 \n\n");
printf(" | 1.查看库存 |\n");
printf(" 2.录入书籍 \n");
printf(" | 3.删除书籍 |\n");
printf(" 4.查询书籍 \n");
printf(" | 5.价格排序 |\n");
printf(" 6.修改信息 \n");
printf(" | 7.退出 |\n");
printf("\n-----\n");
printf("请问你想操作什么: ");
}
int main(int argc, char **argv)
{
do {
int select;
books_house_manage_menu();
scanf_s("%d", &select);
switch (select)
{
case 1: {
books_house_info();
break;
}
case 2: {
BookData book;
set_book_info(&book);
books_house_add(book) ? NULL : printf("**该书籍已存在!请勿重复输入!\n");
break;
}
case 3: {
BookData book;
printf("输入需要删除的书名:");
scanf_s("%s", book._name, sizeof(book._name));
books_house_del(book);
break;
}
case 4: {
BookData book;
printf("输入需要查询的ID号:");
scanf_s("%s", book._id, sizeof(book._id));
books_house_search(book);
break;
}
case 5: {
books_house_sort();
break;
}
case 6: {
BookData book;
printf("输入需要修改书籍的ID:");
scanf_s("%s", book._id, sizeof(book._id));
if (books_house_search(book)) {
printf("请输入以下提示的修改信息\n");
set_book_info(&book);
books_house_modify(book);
}
break;
}
case 7: {
return 0;
}
default:
break;
}
printf("\n");
system("pause");
} while (true);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE *fp,*fpj,*fps;
int i,xuan;
typedef struct book{
char name[10];
char num[10];
char writer[10];
int date;
char press[10];
float price;
char leibie[10];
int kucun;
int jiechu;
}bo;
typedef struct student{
char name[10];
char num[10];
int jie;
}st;
typedef struct jieyue{
char snum[10];
char bnum[10];
}ji;
void menu()//菜单
{
printf("\n\n");
for(i=0;i<80;i++)
printf("#");
printf("\n\n");
printf("\t\t1-----图书录入\t\t\t");
printf("2-----图书浏览\n\n");
printf("\t\t3-----图书查询\t\t\t");
printf("4-----修改删除图书\n\n");
printf("\t\t5-----借阅图书\t\t\t");
printf("6-----归还图书\n\n");
printf("\t\t7-----借阅查询\t\t\t\n");
printf("\n\t\t\t\t输入其他任意键退出\n");
printf("\n\n");
for(i=0;i<80;i++)
printf("#");
printf("\n\n");
}
void end()//录入图书
{
bo boo,booq;
printf("请输入图书名(最多十个字符):");
scanf("%s",boo.name);
do{
i=1;
printf("请输入图书编号(最多十个字符):");
scanf("%s",boo.num);
fread(&booq,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(booq.num,boo.num)==0){
printf("\n该编号已存在请重新输入\n\n");
i=0;
break;
}
fread(&booq,sizeof(bo),1,fp);
}
rewind(fp);
}while(i==0);
printf("请输入图书作者(最多十个字符):");
scanf("%s",boo.writer);
printf("请输入图书出版日期(例如2001年5月3日出版则输入20010503):");
scanf("%d",&boo.date);
printf("请输入图书价格:");
scanf("%f",&boo.price);
printf("请输入图书出版社(最多十个字符):");
scanf("%s",boo.press);
printf("请输入图书类别(最多十个字符):");
scanf("%s",boo.leibie);
printf("请输入图书入库数:");
scanf("%d",&boo.kucun);
boo.jiechu=0;
getchar();
fseek(fp,0,2);
fwrite(&boo,sizeof(bo),1,fp);
printf("\n录入成功!回到主菜单");
system("pause");
}
void print()//浏览图书
{
bo boo;
printf("书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
fread(&boo,sizeof(bo),1,fp);
while(feof(fp)==0){
printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
fread(&boo,sizeof(bo),1,fp);
}
printf("\n浏览图书完毕!回到主菜单");
system("pause");
}
int dui(char *p,char *p1)//对比两个字符串的相关度(用于精确搜索)
{
int bao=0,fan=1;
for(i=0;i<(int)strlen(p1);i++){
if(p[0]==p1[i]){
bao=i;
break;
}
}
if((int)strlen(p)>(int)strlen(p1)-bao+1)
return 0;
else
for(i=0;i<(int)strlen(p);i++){
if(p[i]!=p1[bao+i])
fan=0;
}
return fan;
}
void find()//查询图书
{
char hao[10];
int fan=1;
int bian=1;
bo boo;
printf("请选择查询类型:\n\n\t\t1-按图书编号模糊查询 2-按图书名关键字查询\n");
printf(" \n\t\t3-按图书编号精确查询 4-按图书名精确查询\n\n代码:");
scanf("%d",&xuan);
if(xuan==1){
printf("请输入编号(最多十个字符):");
scanf("%s",hao);
printf("序号 书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
fan=dui(hao,boo.num);
if(fan==1){
printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
bian++;}
fread(&boo,sizeof(bo),1,fp);
}
}
else if(xuan==2){
printf("请输入图书名关键字(最多十个字符):");
scanf("%s",hao);
printf("序号 书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
fan=dui(hao,boo.name);
if(fan==1)
printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
fread(&boo,sizeof(bo),1,fp);
}
}
else if(xuan==4){
printf("请输入图书名(最多十个字符):");
scanf("%s",hao);
printf("序号 书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
while(!feof(fp)){
if(strcmp(hao,boo.name)==0)
printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
fread(&boo,sizeof(bo),1,fp);
}
}
else if(xuan==3){
printf("请输入图书编号(最多十个字符):");
scanf("%s",hao);
printf("序号 书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
while(!feof(fp)){
if(strcmp(hao,boo.num)==0)
printf("%-5d%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",bian,boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
fread(&boo,sizeof(bo),1,fp);
}
}
else{
printf("输入错误,正在退出!");
system("pause");
return;
}
printf("\n查询图书完毕! ");
system("pause");
}
void del()//修改删除图书
{
FILE *p;
ji jie;
int j=0;
char num[10];
bo boo,booq;
int xu;
char oper;
char cha[10];
printf("\n删除修改图书只能通过图书编号来完成!\n是否调用图书查询来查询你要操作的图书编号(Y/N)\n");
getchar();
scanf("%c",&oper);
if(oper=='Y'||oper=='y'){
find();
rewind(fp);}
printf("\n请输入你要操作的图书的编号(如果输入错误的编号,将不做任何操作):");
scanf("%s",cha);
fread(&jie,sizeof(ji),1,fpj);
while(!feof(fpj)){
if(strcmp(jie.bnum,cha)==0){
printf("\n这本书已有人借阅,不能操作!\n正在退出 ");
system("pause");
return;
}
fread(&jie,sizeof(ji),1,fpj);
}
printf("\n\n1-删除图书 2-修改图书\n\n");
printf("请选择操作类型:");
scanf("%d",&xuan);
fread(&boo,sizeof(bo),1,fp);
p=fopen("c:\\books1.txt","wb+");
while(!feof(fp)){
j++;
if(strcmp(boo.num,cha)==0){
if(xuan==2){
printf("\n\n1-书名 2-编号 3-作者 4-价格 5-出版社 6-类别 7-库存\n\n");
printf("请选择要修改的项目:");
scanf("%d",&xu);
if(xu==1){
printf("你要把%s改为:",boo.name);
scanf("%s",boo.name);}
else if(xu==2){
do{
i=1;
printf("你要把%s改为:",boo.num);
scanf("%s",num);
rewind(fp);
fread(&booq,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(booq.num,num)==0){
printf("\n该编号已存在请重新输入\n\n");
i=0;
break;
}
fread(&booq,sizeof(bo),1,fp);
}
}while(i==0);
rewind(fp);
for(i=0;i<j;i++){
fread(&boo,sizeof(bo),1,fp);
strcpy(boo.num,num);
}
}
else if(xu==3){
printf("你要把%s改为:",boo.writer);
scanf("%s",boo.writer);}
else if(xu==4){
printf("你要把%.2f改为:",boo.price);
scanf("%f",&boo.price);}
else if(xu==5){
printf("你要把%s改为:",boo.press);
scanf("%s",boo.press);}
else if(xu==6){
printf("你要把%s改为:",boo.leibie);
scanf("%s",boo.leibie);}
else if(xu==7){
printf("你要把%d改为:",&boo.kucun);
scanf("%d",&boo.kucun);}
fwrite(&boo,sizeof(bo),1,p);
}
}
else
fwrite(&boo,sizeof(bo),1,p);
fread(&boo,sizeof(bo),1,fp);
}
fclose(p);
p=fopen("c:\\books1.txt","rb+");
fclose(fp);
fp=fopen("c:\\book.txt","wb+");
fread(&boo,sizeof(bo),1,p);
while(!feof(p)){
fwrite(&boo,sizeof(bo),1,fp);
fread(&boo,sizeof(bo),1,p);
}
fclose(fp);
printf("操作成功 回到主菜单");
system("pause");
}
void lend()//借阅图书
{
bo boo;
FILE *p;
st stu;
ji jie;
int j=0;
char oper,num[10],xnum[10];
printf("\n借阅图书只能通过图书编号完成!\n是否调用图书查询来查询你要操作的图书编号(Y/N)\n");
getchar();
scanf("%c",&oper);
if(oper=='Y'||oper=='y')
find();
printf("\n请输入你要借阅的图书的编号:");
scanf("%s",num);
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(num,boo.num)==0){
j=1;
break;
}
fread(&boo,sizeof(bo),1,fp);
}
if(j==0){
printf("\n书库没有该图书 正在退出\n");
system("pause");
return;
}
printf("\n你需要借阅的图书是:\n");
printf("书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
if(boo.kucun==boo.jiechu){
printf("\n该册图书已全部借出!正在退出\n");
system("pause");
return;
}
printf("\n请输入你的学号:");
scanf("%s",xnum);
j=0;
fread(&jie,sizeof(ji),1,fpj);
while(!feof(fpj)){
if((strcmp(jie.bnum,num)==0)&&(strcmp(jie.snum,xnum)==0)){
j=1;
break;
}
fread(&jie,sizeof(ji),1,fpj);
}
if(j==1){
printf("\n你已经借阅过该书 正在退出\n");
system("pause");
return;
}
fread(&stu,sizeof(st),1,fps);
j=0;
while(!feof(fps)){
if(strcmp(xnum,stu.num)==0){
j=1;
break;
}
fread(&stu,sizeof(st),1,fps);
}
if(j==0){
printf("\n你是第一次借阅图书,为了方便管理请输入你的姓名:");
scanf("%s",stu.name);
strcpy(stu.num,xnum);
stu.jie=1;
fseek(fps,0,2);
fwrite(&stu,sizeof(st),1,fps);
}
else{
if(stu.jie==5){//这里可以控制每个学生最多借几本书
printf("\n你已经借了5本书,不能再借\n");
system("pause");
return;}
p=fopen("c:\\jie.txt","wb+");
rewind(fps);
fread(&stu,sizeof(st),1,fps);
while(!feof(fps)){
if(strcmp(xnum,stu.num)==0)
stu.jie++;
fwrite(&stu,sizeof(st),1,p);
fread(&stu,sizeof(st),1,fps);
}
fclose(p);
fclose(fps);
p=fopen("c:\\jie.txt","rb+");
fps=fopen("c:\\student.txt","wb+");
fread(&stu,sizeof(st),1,p);
while(!feof(p)){
fwrite(&stu,sizeof(st),1,fps);
fread(&stu,sizeof(st),1,p);
}
}
strcpy(jie.bnum,num);
strcpy(jie.snum,xnum);
fseek(fpj,0,2);
fwrite(&jie,sizeof(ji),1,fpj);
rewind(fp);
p=fopen("c:\\jie.txt","wb+");
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(num,boo.num)==0)
boo.jiechu++;
fwrite(&boo,sizeof(bo),1,p);
fread(&boo,sizeof(bo),1,fp);
}
fclose(p);
p=fopen("c:\\jie.txt","rb+");
fclose(fp);
fp=fopen("c:\\book.txt","wb+");
fread(&boo,sizeof(bo),1,p);
while(!feof(p)){
fwrite(&boo,sizeof(bo),1,fp);
fread(&boo,sizeof(bo),1,p);
}
printf("\n借阅成功!回到主菜单");
system("pause");
}
void huan(){//归还图书
FILE *p;
bo boo;
ji jie;
st stu;
int j=0;
char snum[10],bnum[10];
i=0;
printf("\n请输入你的学号:");
scanf("%s",snum);
printf("\n你借阅了以下图书\n");
fread(&jie,sizeof(ji),1,fpj);
printf("书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
while(!feof(fpj)){
if(strcmp(jie.snum,snum)==0){
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(jie.bnum,boo.num)==0){
printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
j=1;
}
fread(&boo,sizeof(bo),1,fp);
}
}
fread(&jie,sizeof(ji),1,fpj);
}
if(j==0){
printf("\n你没有借阅任何图书!\n\n正在退出");
system("pause");
return;
}
rewind(fp);
rewind(fpj);
printf("\n请输入你归还的图书的编号:");
scanf("%s",bnum);
fread(&jie,sizeof(jie),1,fpj);//改变jieyue.txt里的数据
p=fopen("c:\\jie.txt","wb+");
while(!feof(fpj)){
if((strcmp(jie.bnum,bnum)==0)&&(strcmp(jie.snum,snum)==0))
i=1;
else
fwrite(&jie,sizeof(jie),1,p);
fread(&jie,sizeof(jie),1,fpj);
}
if(i==0){
printf("\n你没有借过该图书\n正在退出");
system("pause");
return;
}
fclose(p);
fclose(fpj);
p=fopen("c:\\jie.txt","rb+");
fpj=fopen("c:\\jieyue.txt","wb+");
fread(&jie,sizeof(ji),1,p);
while(!feof(p)){
fwrite(&jie,sizeof(ji),1,fpj);
fread(&jie,sizeof(ji),1,p);
}
fclose(p);//改变book.txt里的数据
p=fopen("c:\\jie.txt","wb+");
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(bnum,boo.num)==0)
boo.jiechu--;
fwrite(&boo,sizeof(bo),1,p);
fread(&boo,sizeof(bo),1,fp);
}
fclose(p);
p=fopen("c:\\jie.txt","rb+");
fclose(fp);
fp=fopen("c:\\book.txt","wb+");
fread(&boo,sizeof(bo),1,p);
while(!feof(p)){
fwrite(&boo,sizeof(bo),1,fp);
fread(&boo,sizeof(bo),1,p);
}
fclose(p);//改变student.txt里的数据
p=fopen("c:\\jie.txt","wb+");
rewind(fps);
fread(&stu,sizeof(st),1,fps);
while(!feof(fps)){
if(strcmp(snum,stu.num)==0)
stu.jie--;
fwrite(&stu,sizeof(st),1,p);
fread(&stu,sizeof(st),1,fps);
}
fclose(p);
fclose(fps);
p=fopen("c:\\jie.txt","rb+");
fps=fopen("c:\\student.txt","wb+");
fread(&stu,sizeof(st),1,p);
while(!feof(p)){
fwrite(&stu,sizeof(st),1,fps);
fread(&stu,sizeof(st),1,p);
}
printf("\n归还成功!回到主菜单");
system("pause");
}
void cha(){//借阅查询
char num[10];
bo boo;
ji jie;
printf("\n请输入你的学号:");
scanf("%s",num);
fread(&jie,sizeof(ji),1,fpj);
printf("书名 编号 作者 价格 出版社 类别 原始库存 借出\n");
while(!feof(fpj)){
if(strcmp(jie.snum,num)==0){
fread(&boo,sizeof(bo),1,fp);
while(!feof(fp)){
if(strcmp(jie.bnum,boo.num)==0)
printf("%-10s%-10s%-10s%-10.2f%-10s%-10s%-10d%-4d\n",boo.name,boo.num,boo.writer,boo.price,boo.press,boo.leibie,boo.kucun,boo.jiechu);
fread(&boo,sizeof(bo),1,fp);
}
}
fread(&jie,sizeof(ji),1,fpj);
}
printf("\n查询完毕!回到主菜单");
system("pause");
}
main(){
if((fp=fopen("c:\\book.txt","rb+"))==NULL){
printf("在c盘根目录下没有找到储存图书信息的book.txt文件\n请选择 1--手动导入! 2--创建此文件\n");
scanf("%d",&xuan);
switch(xuan){
case 2:if((fp=fopen("c:\\book.txt","wb+"))!=NULL)
printf("创建成功\n\n");
break;
case 1:printf("请把名为book.txt的文件复制到c盘根目录下\n\n");
}
}
if((fpj=fopen("c:\\jieyue.txt","rb+"))==NULL){
printf("在c盘根目录下没有找到储存借阅信息的jieyue.txt文件\n请选择 1--手动导入! 2--创建此文件\n");
scanf("%d",&xuan);
switch(xuan){
case 2:if((fpj=fopen("c:\\jieyue.txt","wb+"))!=NULL)
printf("创建成功\n\n");
break;
case 1:printf("请把名为jieyue.txt的文件复制到c盘根目录下\n\n");
}
}
if((fps=fopen("c:\\student.txt","rb+"))==NULL){
printf("在c盘根目录下没有找到储存学生信息的student.txt文件\n请选择 1--手动导入! 2--创建此文件\n");
scanf("%d",&xuan);
switch(xuan){
case 2:if((fps=fopen("c:\\student.txt","wb+"))!=NULL)
printf("创建成功\n\n");
break;
case 1:printf("请把名为student.txt的文件复制到c盘根目录下\n\n");
}
}
menu();
printf("\n 代码:");
scanf("%d",&xuan);
while(xuan==1||xuan==2||xuan==3||xuan==4||xuan==5||xuan==6||xuan==7){
fp=fopen("c:\\book.txt","rb+");
fps=fopen("c:\\student.txt","rb+");
fpj=fopen("c:\\jieyue.txt","rb+");
switch(xuan){
case 0:break;
case 1:end();break;
case 2:print();break;
case 3:find();break;
case 4:del();break;
case 5:lend();break;
case 6:huan();break;
case 7:cha();break;
}
fclose(fp);
fclose(fpj);
fclose(fps);
menu();
printf("\n 代码:");
scanf("%d",&xuan);
}
}
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
struct books_list
{
char author[20]; /*作者名*/
char bookname[20]; /*书名*/
char publisher[20]; /*出版单位*/
char pbtime[15]; /*出版时间*/
char loginnum[10]; /*登陆号*/
float price; /*价格*/
char classfy[10]; /*分类号*/
struct books_list * next; /*链表的指针域*/
};
struct books_list * Create_Books_Doc(); /*新建链表*/
void InsertDoc(struct books_list * head); /*插入*/
void DeleteDoc(struct books_list * head , int num);/*删除*/
void Print_Book_Doc(struct books_list * head);/*浏览*/
void search_book(struct books_list * head); /*查询*/
void save(struct books_list * head);/*保存数据至文件*/
/*新建链表头节点*/
struct books_list * Create_Books_Doc()
{
struct books_list * head;
head=(struct books_list *)malloc(sizeof(struct books_list)); /*分配头节点空间*/
head->next=NULL; /*头节点指针域初始化,定为空*/
return head;
}
/*保存数据至文件*/
void save(struct books_list * head)
{
struct books_list *p;
FILE *fp;
p=head;
fp=fopen("data.txt","w+"); /*以写方式新建并打开 data.txt文件*/
fprintf(fp,"┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n"); /*向文件输出表格*/
fprintf(fp,"┃登录号┃ 书 名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 价格 ┃\n");
fprintf(fp,"┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");
/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/
while(p->next!= NULL)
{
p=p->next;
fprintf(fp,"┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f ┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price);
}
fprintf(fp,"┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");
fclose(fp);
printf(" 已将图书数据保存到 data.txt 文件\n");
}
/*插入*/
void InsertDoc(struct books_list *head)
{
/*定义结构体指针变量 s指向开辟的新结点首地址 p为中间变量*/
struct books_list *s, *p;
char flag='Y'; /*定义flag,方便用户选择重复输入*/
p=head;
/*遍历到尾结点,p指向尾结点*/
while(p->next!= NULL)
{
p=p->next;
}
/*开辟新空间,存入数据,添加进链表*/
while(flag=='Y'||flag=='y')
{
s=(struct books_list *)malloc(sizeof(struct books_list));
printf("\n 请输入图书登陆号:");
fflush(stdin);
scanf("%s",s->loginnum);
printf("\n 请输入图书书名:");
fflush(stdin);
scanf("%s",s->bookname);
printf("\n 请输入图书作者名:");
fflush(stdin);
scanf("%s",s->author);
printf("\n 请输入图书出版社:");
fflush(stdin);
scanf("%s",s->publisher);
printf("\n 请输入图书出版时间:");
fflush(stdin);
scanf("%s",s->pbtime);
printf("\n 请输入图书分类号:");
fflush(stdin);
scanf("%s",s->classfy);
printf("\n 请输入图书价格:");
fflush(stdin);
scanf("%f",&s->price);
printf("\n");
p->next=s; /*将新增加的节点添加进链表*/
p=s; /*p指向尾节点,向后移*/
s->next=NULL;
printf(" ━━━━ 添加成功!━━━━");
printf("\n 继续添加?(Y/N):");
fflush(stdin);
scanf("%c",&flag);
printf("\n");
if(flag=='N'||flag=='n')
{break;}
else if(flag=='Y'||flag=='y')
{continue;}
}
save(head); /*保存数据至文件*/
return;
}
/*查询操作*/
void search_book(struct books_list *head)
{
struct books_list * p;
char temp[20];
p=head;
if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
{
printf(" ━━━━ 图书库为空!━━━━\n");
}
else
{
printf("请输入您要查找的书名: ");
fflush(stdin);
scanf("%s",temp);
/*指针从头节点开始移动,遍历至尾结点,查找书目信息*/
while(p->next!= NULL)
{
p=p->next;
if(strcmp(p->bookname,temp)==0)
{
printf("\n图书已找到!\n");
printf("\n");
printf("登录号: %s\t\n",p->loginnum);
printf("书名: %s\t\n",p->bookname);
printf("作者名: %s\t\n",p->author);
printf("出版单位: %s\t\n",p->publisher);
printf("出版时间: %s\t\n",p->pbtime);
printf("分类号: %s\t\n",p->classfy);
printf("价格: %.2f\t\n",p->price);
}
if(p->next==NULL)
{
printf("\n查询完毕!\n");
}
}
}
return;
}
/*浏览操作*/
void Print_Book_Doc(struct books_list * head)
{
struct books_list * p;
if(head==NULL || head->next==NULL) /*判断数据库是否为空*/
{
printf("\n ━━━━ 没有图书记录! ━━━━\n\n");
return;
}
p=head;
printf("┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n");
printf("┃登录号┃ 书 名 ┃ 作 者┃ 出版单位 ┃ 出版时间 ┃分类号┃ 价格 ┃\n");
printf("┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");
/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/
while(p->next!= NULL)
{
p=p->next;
printf("┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f ┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price); /*循环输出表格*/
}
printf("┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");
printf("\n");
}
/*删除操作*/
void DeleteDoc(struct books_list * head)
{
struct books_list *s,*p; /*s为中间变量,p为遍历时使用的指针*/
char temp[20];
int panduan; /*此变量用于判断是否找到了书目*/
panduan=0;
p=s=head;
printf(" [请输入您要删除的书名]:");
scanf("%s",temp);
/*遍历到尾结点*/
while(p!= NULL)
{
if(strcmp(p->bookname,temp)==0)
{
panduan++;
break;
}
p=p->next;
}
if(panduan==1)
{
for(;s->next!=p;) /*找到所需删除卡号结点的上一个结点*/
{
s=s->next;
}
s->next=p->next; /*将后一节点地址赋值给前一节点的指针域*/
free(p);
printf("\n ━━━━ 删除成功! ━━━━\n");
}
else /*未找到相应书目*/
{
printf(" 您输入的书目不存在,请确认后输入!\n");
}
return;
}
int main()
{
struct books_list * head;
char choice;
head=NULL;
for(;;) /*实现反复输入选择*/
{
printf(" ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n");
printf(" ┃ ┃ tony 图书馆管理系统 ┃ ┃\n");
printf(" ┃ ┗━━━━━━━━━━━━━━━━━━━┛ ┃\n");
printf(" ┃ [1]图书信息录入 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ [2]图书信息浏览 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ [3]图书信息查询 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ [4]图书信息删除 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ [5]退出系统 ┃\n");
printf(" ┃ ┃\n");
printf(" ┃ ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf(" 请选择:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='1')
{
if(head==NULL)
{
head=Create_Books_Doc();
}
InsertDoc(head);
}
else if(choice=='2')
{
Print_Book_Doc(head);
}
else if(choice=='3')
{
search_book(head);
}
else if(choice=='4')
{
DeleteDoc(head);
}
else if(choice=='5')
{
printf("\n");
printf(" ━━━━━━━━ 感谢使用图书管理系统 ━━━━━━━━\n");
break;
}
else
{
printf(" ━━━━ 输入错误,请重新输入!━━━━\n");
}
}
return 0;
}