抽象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