抽象C语言大作业

1.图书登记管理程序

问题描述:

请设计一个图书登记管理程序,以方便图书管理员管理图书馆内的图书,该程序应该具有以下功能:

(1)从键盘输入某本图书的信息

(2)给定图书的国际标准书号(ISBN),显示该图书的信息。

(3)给定图书的作者,显示所有该作者所著的图书。

(4)给定国际标准书号(ISBN),修改该图书的信息。

(5)给定国际标准书号(ISBN),删除该图书的信息。

题目要求:

(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。

(2)图书信息应该包含国际标准书号、图书名称、图书出版社、图书作者(假设一个作者)、图书价格、出版时间。

(3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。

输入要求:

    (1)应用程序运行后在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。程序根据用户输入的信息完成相应的处理,实现要求的功能。

    (2)能对输入的数据进行简单的校验,例如,出版时间必须是一个合法的日期格式,国际标准书号是唯一的(一个国际标准书号对应一种图书信息)。

输出要求:

   (1)应用程序运行后,要在屏幕上显示一个菜单,多条记录分屏显示。

   (2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。

(3)在程序完成处理后,要清楚地给出程序的处理结果。例如,在给定国际标准书号删除图书信息时,如果该图书不存在,要提示没能删除,如果删除成功要提示删除成功。

实现要求:

   (1)在程序中使用链表存储图书信息。

   (2)采用模块化程序设计的方法,将程序中的各项功能用函数实现。

扩展功能:

   (1)提供一些统计分析功能。例如按出版社、图书名称、出版时间对图书数量进行统计分析。

   (2)图书信息从文件读入,可以多次导入且能够保证记录的唯一性,可将图书信息保存到文件中。

 以下是图书管理系统1.0

bug 无法添加文件,在文件夹里面含有bookInfo.txt文件且文件不为空时,会报错。初步分析是文件读取函数没写好。还有一些小bug比如忘写换行符。后期在优化代码2022-02-06已经全部解决问题

下面代码放心ctr c

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <math.h>
  5 typedef long long ll;
  6 struct Node* list = NULL;//使用全局链表
  7 void makeMenu()//菜单界面
  8 {
  9     printf("----------------------------------------------------------------\n");
 10     printf("\t图书管理系统1.0\n");
 11     printf("\t0.退出程序\n");
 12     printf("\t1.查询图书信息\n");
 13     printf("\t2.查询作者信息\n");
 14     printf("\t3.添加图书信息\n");
 15     printf("\t4.修改图书信息\n");
 16     printf("\t5.删除图书信息\n");
 17     printf("\t6.排序和浏览书籍\n");
 18     printf("\t7.借阅图书\n");
 19     printf("\t8.归还图书\n");
 20     printf("----------------------------------------------------------------\n"); 
 21     printf("\t请输入数字(0~8)\n");
 22 }
 23 //图书的设定
 24 struct BookInfo
 25 {
 26     char BookName[30];
 27     char WriterName[30];
 28     char ISBN[20];//使用新版 无需检验加权数
 29     int BookNum;//图书数量
 30     int year,month,day;//出版时间
 31     double BookPrice;//价格
 32     char Publisher[30];//出版社名称
 33     int PublisherCode[10];//出版社代码
 34 };
 35 //数据的设定1
 36 struct Node
 37 {
 38     struct BookInfo data;
 39     struct Node* next;
 40 };
 41 struct Node* createHead()
 42 {
 43     struct Node* headNode =(struct Node*)malloc(sizeof(struct Node));//动态内存申请
 44     headNode->next = NULL;
 45     return headNode;
 46 };
 47 //创建节点 为插入做准备1
 48 struct Node* createNode(struct BookInfo data)
 49 {
 50     struct Node* newNode=(struct Node*)malloc(sizeof( struct Node));
 51     newNode->data = data;
 52     newNode->next = NULL;
 53     return newNode;
 54 }
 55 //打印链表1
 56 void printfList(struct Node* headNode)
 57 {
 58     struct Node* pMove = headNode->next;\
 59     printf("图书名\t作者\t图书数量\t出版时间\t出版社\t价格\tISBN\t\n");
 60     while(pMove != NULL)
 61     {
 62         printf("%s\t%s\t%d\t%d-%d-%d\t%s\t%.1lf\t%s\n",pMove->data.BookName,pMove->data.WriterName,pMove->data.BookNum,pMove->data.year,
 63         pMove->data.month,pMove->data.day,pMove->data.Publisher,pMove->data.BookPrice,pMove->data.ISBN);
 64         pMove = pMove->next;
 65     }
 66 }
 67 //插入数据 使用表头法插入1
 68 void insertNodeBYHead(struct Node* headNode , struct BookInfo data)
 69 {
 70     struct Node* newNode = createNode(data);
 71     newNode->next = headNode->next;
 72     headNode->next = newNode;
 73 }
 74 //插入数据 使用表尾法1
 75 void insertNodeBYTail(struct Node* headNode , struct BookInfo data)
 76 {
 77     struct Node* pMove = headNode;
 78     while(pMove != NULL)
 79     {
 80         pMove = pMove->next;
 81     }
 82     struct Node* newNode = createNode(data);
 83     pMove->next = newNode;
 84 }
 85 //指定位置删除,通过书籍名字删除1
 86 void deleteNodeBYBookName(struct Node* headNode , char *BookName)
 87 {
 88     struct Node* posLeftNode = NULL;
 89     struct Node* posNode = headNode->next;
 90     while(posNode!=NULL && strcmp(posNode->data.BookName,BookName))//比较书籍名称
 91     {
 92         posLeftNode = posNode;
 93         posNode = posLeftNode->next;
 94     }
 95 //讨论查找结果
 96     if(posNode == NULL)
 97     return ;
 98     else
 99     {   
100         printf("删除成功!\n");
101         posLeftNode->next = posNode->next;
102         free(posNode);
103         posNode=NULL;
104     }
105 }
106 //用ISDN查找1
107 struct Node* searchByISDN(struct Node* headNode,char* ISDN)
108 {
109     struct Node* posNode = headNode->next;
110     while(posNode != NULL && strcmp(posNode->data.ISBN,ISDN))
111     {
112         posNode = posNode->next;
113     }
114     return posNode;
115 }
116 //书名查找1
117 struct Node* searchByBookName(struct Node* headNode,char* BookName)
118 {
119     struct Node* posNode = headNode->next;
120     while(posNode != NULL && strcmp(posNode->data.BookName,BookName))
121     {
122         posNode = posNode->next;
123     }
124     return posNode;
125 }
126 //书籍排序按照书价格(冒泡排序小到大)1
127 void bubbleSortList(struct Node* headNode)
128 {
129     for(struct Node* p = headNode->next;p != NULL;p = p->next)
130     {
131         for(struct Node* q = headNode->next; q->next != NULL; q = q->next)
132         {
133             if(q->data.BookPrice>q->next->data.BookPrice)
134             {
135                struct BookInfo tempData = q->data;
136                 q->data = q->next->data;
137                 q->next->data = tempData;
138 
139             }
140         }
141     }
142 }
143 //通过作者寻找
144 void searchByWriterName(struct Node* headNode,char* writerName)
145 {
146     
147     struct Node* posNode = headNode->next;
148     while(posNode != NULL )
149     {
150         posNode = posNode->next;
151         if(strcmp(posNode->data.WriterName,writerName))
152         printf("图书名\t作者\t图书数量\t出版时间\t出版社\t价格\tISBN\t\n");
153         printf("%s\t%s\t%d\t%d-%d-%d\t%s\t%.1lf\t%s\n",posNode->data.BookName,posNode->data.WriterName,posNode->data.BookNum,posNode->data.year,
154         posNode->data.month,posNode->data.day,posNode->data.Publisher,posNode->data.BookPrice,posNode->data.ISBN);
155     }
156 }
157 //文件操作
158 //写入文件
159 void saveInfoFile(const char* fileName,struct Node* headNode)
160 {
161     FILE *fp = fopen(fileName,"w+");
162     struct Node* pMove = headNode->next;
163     while(pMove != NULL)
164     {
165         fprintf(fp,"%s\t%s\t%d\t%d-%d-%d\t%s\t%.1lf\t%s\n",pMove->data.BookName,pMove->data.WriterName,pMove->data.BookNum,pMove->data.year,
166         pMove->data.month,pMove->data.day,pMove->data.Publisher,pMove->data.BookPrice,pMove->data.ISBN);
167         pMove = pMove->next;
168     }
169     fclose(fp);
170 }
171 //文件读操作
172 void  readInfoFile(const char* fileName,struct Node* headNode)
173 {
174     FILE *fp = fopen(fileName,"r");
175     if(fp == NULL)//文件不纯在就创建文件
176     {
177         fp = fopen(fileName,"w+");
178     }
179     struct BookInfo tempData;
180     /*while(fscanf(fp,"%s\t%s\t%d\t%d-%d-%d\t%s\t%lf\t%s\n",tempData.BookName,tempData.WriterName,&tempData.BookNum,&tempData.year,tempData.month,
181     &tempData.day,tempData.Publisher,&tempData.BookPrice,tempData.ISBN) != EOF)*/
182     while 
183     (
184         (fscanf(fp,"%s\t%s\t%d\t",tempData.BookName,tempData.WriterName,&tempData.BookNum) != EOF) &&
185         (fscanf(fp,"%d-%d-%d\t",&tempData.year,&tempData.month,&tempData.day) != EOF )&&
186         (fscanf(fp,"%s\t%lf\t%s\n\t",tempData.Publisher,&tempData.BookPrice,tempData.ISBN) != EOF )
187         
188     )
189     {
190         insertNodeBYHead(list,tempData);
191     }
192     fclose(fp);
193 }
194 //进行用户交互
195 void keyDown()
196 {
197     int userKey = 0;
198     int choose = 0;
199     struct BookInfo tempBook;//临时变量存储书籍信息
200     struct Node* result = NULL;
201     scanf("%d",&userKey);
202     switch(userKey)
203     {
204         case 0:
205         saveInfoFile("bookInfo.txt",list);
206         printf("【退出程序】\n");
207         printf("【退出成功!】\n");
208         system("pause");
209         exit(0);
210         break;
211         case 1:
212         printf("【查询图书信息】\n");
213         printf("请输入书籍的ISBN码");
214         scanf("%s",&tempBook.ISBN);
215         result = searchByISDN(list,tempBook.ISBN);
216         if(result == NULL)
217         printf("未找到相关信息");
218         else
219         {
220             printf("图书名\t作者\t图书数量\t出版时间\t出版社\t价格\tISBN\t\n");
221             printf("%s\t%s\t%d\t%d-%d-%d\t%s\t%.1lf\t%s\n",result->data.BookName,result->data.WriterName,result->data.BookNum,result->data.year,
222         result->data.month,result->data.day,result->data.Publisher,result->data.BookPrice,result->data.ISBN);
223 
224         }
225         break;
226         case 2:
227         printf("【查询作者信息】\n");
228         printf("输入作者名字\n");
229         scanf("%s",&tempBook.WriterName);
230         searchByWriterName(list,tempBook.WriterName);
231         printf("查找完毕");
232         break;
233         case 3:
234         printf("【添加图书信息】\n");
235         printf("输入图书的:\n图书名\t作者\t图书数量\t出版时间\t出版社\t价格\tISBN\t\n");
236         scanf("%s %s %d %d-%d-%d %s %lf %s",&tempBook.BookName,&tempBook.WriterName,&tempBook.BookNum,&tempBook.year,&tempBook.month,&tempBook.day,
237         &tempBook.Publisher,&tempBook.BookPrice,&tempBook.ISBN);
238         insertNodeBYHead(list,tempBook);
239         saveInfoFile("bookInfo.txt",list);
240         break;
241         case 4:
242         printf("【修改图书信息】\n");
243         printf("请输入要修改书籍的ISDN码\n");
244         scanf("%s",&tempBook.ISBN);
245         result = searchByISDN(list,tempBook.ISBN);
246         printf("请选择要修改的内容\n");
247         printf("1.图书名\t2.作者\t3.图书数量\t4.出版时间\t5.出版社\t6.价格\t7.ISBN\t\n");
248         scanf("%d",&choose);
249         switch (choose)
250         {
251             case 1:
252             printf("输入修改后的信息\n");
253             scanf("%s",&tempBook.BookName);
254             strcpy(result->data.BookName,tempBook.BookName);
255             break;
256             case 2:
257             printf("输入修改后的信息\n");
258             scanf("%s",&tempBook.WriterName);
259             strcpy(result->data.WriterName,tempBook.WriterName);
260             break;
261             case 3:
262             printf("输入修改后的信息\n");
263             scanf("%d",&tempBook.BookNum);
264             result->data.BookNum = tempBook.BookNum;
265             break;
266             case 4:
267             printf("输入修改后的信息\n");
268             scanf("%d-%d-%d",&tempBook.year,&tempBook.month,&tempBook.day);
269             result->data.year = tempBook.year;
270             result->data.month = tempBook.month;
271             result->data.day = tempBook.day;
272             break;
273             case 5:
274             printf("输入修改后的信息\n");
275             scanf("%s",&tempBook.Publisher);
276             strcpy(result->data.Publisher,tempBook.Publisher);
277             break;
278             case 6:
279             printf("输入修改后的信息\n");
280             scanf("%d",&tempBook.BookPrice);
281             result->data.BookPrice = tempBook.BookPrice;
282             break;
283             case 7:
284             printf("输入修改后的信息\n");
285             scanf("%s",&tempBook.ISBN);
286             strcpy(result->data.ISBN,tempBook.ISBN);
287             break;
288         }
289         break;
290         case 5:
291         printf("【删除图书信息】\n");
292         printf("请输入书名");
293         scanf("%s",&tempBook.BookName);
294         deleteNodeBYBookName(list,tempBook.BookName);
295         saveInfoFile("bookInfo.txt",list);
296         break;
297         case 6:
298         printf("【排序和浏览图书】\n");
299         bubbleSortList(list);
300         printfList(list);
301         break;
302         case 7:
303         printf("【借阅图书】\n");
304         printf("请输入借阅书籍的名称\n");
305         scanf("%s",&tempBook.BookName);
306         result = searchByBookName(list,tempBook.BookName);
307         if (result == NULL)
308         {
309             printf("没有相关书籍,无法借阅!\n");
310         }
311         else
312         {
313             if(result->data.BookNum>=1)
314             {
315                  result->data.BookNum--;
316                  printf("借阅成功\n");
317             }
318             else
319             {
320                 printf("书籍已被借完,无法借阅\n");
321             }
322            
323         }
324         break;
325         case 8:
326         printf("【归还图书】\n");
327         printf("请输入归还书籍的名称\n");
328         scanf("%s",&tempBook.BookName);
329         result = searchByBookName(list,tempBook.BookName);
330         if (result == NULL)
331         {
332             printf("没有相关书籍,来源非法!\n");
333         }
334         else
335         {
336             result->data.BookNum++;
337             printf("书籍归还成功\n");
338         }
339         break;
340         default:
341         printf("\terror!\n");
342         printf("\t请输入数字(0~8)\n");
343         break;
344 
345     }
346 }
347 int main()
348 { 
349     list = createHead();
350     readInfoFile("bookInfo.txt",list);//读入数据
351     while(1)
352     {
353      makeMenu();
354     keyDown();
355     system("pause");
356     system("cls");
357     }
358     system("pause");
359     return 0;
360 }

 

l c


posted @ 2023-02-04 10:05  芜湖大厨师  阅读(47)  评论(0编辑  收藏  举报