#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//使用数组版本
//模块化
//定义图书目录信息结构体
typedef struct Book{
//isbn号
long long ISBN;
//书名
char name[32];
//作者
char author[22];
//出版社
char puber[32];
//时间
int year,month,day;
//价格
double price;
}Book,*Bookptr;
//-----------------------------------------------------------基础函数类-----------------------------------------------------------
//释放内存
int free_books(Bookptr books[]) {
int index=0;
while(books[index]!=NULL){
free(books[index]);
index++;
}
return index==0?-1:0;
}
//替换函数,用来替换最后\n符号,指定替换次数
int str_replace(char * str,char dest,char c,int num){
int index=0;
int count=0;
while(str[index]!='\0'){
if(count<num){
if(str[index]==dest){
str[index]=c;
count++;
}
}else{
return 0;
}
index++;
}
return -1;
}
//日期合法性检查,合法返回0,否则返回-1
int check_date(int year,int month,int day){
//基础判断
if(!(1<=month && month<=12 && 1<=day && day<=31)) {
return -1;
}
//判断闰年
if(month==2){
if(day>29)return -1;
if(day==29){
if(year%400==0 || (year%100!=0 && year%4==0))return 0;
return -1;
}
}
if(day==31){
if(month==1 || month==3 || month==5 || month==7 || month==8 ||month==10 || month==12)return 0;
return -1;
}
return 0;
}
//基础输入
void input(char *str,int num){
char c;
scanf(" %c",&c);
ungetc(c,stdin);
char *res=fgets(str,num,stdin);
str_replace(str,'\n','\0',1);
}
//----------------------------------------------------------图书功能类------------------------------------------------------------
//排序图书
int sort_book(Bookptr books[],int num) {
int i,j;
int flag=0;
for(i=1;i<num;i++){
for(j=0;j<num-i;j++){
if(books[j+1]!=NULL && books[j]->ISBN>books[j+1]->ISBN){
Bookptr tmp=books[j];
books[j]=books[j+1];
books[j+1]=tmp;
flag=1;
}
}
if(flag==0){
return -1;
}
}
return 0;
}
//查询图书,
int find_book(Bookptr books[],Bookptr find_books[],int type,char *dest,long long dest1){
int index=0;
int index1=0;
while(books[index]!=NULL){
//isbn
if(type==1){
if(books[index]->ISBN==dest1){
find_books[index1]=books[index];
index1++;
return 0;
}
}else{
if(strcmp(books[index]->name,dest)==0){
find_books[index1]=books[index];
index1++;
}
}
index++;
}
return index1==0?-1:0;
}
//删除图书
int delete_book(Bookptr books[],long long ISBN){
int index=0;
int count=count_book(books);
while(books[index]!=NULL){
if(books[index]->ISBN==ISBN){
free(books[index]);
books[index]=books[count-1];
books[count-1]=NULL;
return 0;
}
index++;
}
return -1;
}
//统计图书数量
int count_book(Bookptr books[]) {
int index=0;
while(books[index]!=NULL){
index++;
}
return index;
}
//打印节点数据
void print_book (Bookptr book){
printf("%-13lld ",book->ISBN);
printf("%-30s ",book->name);
printf("%-20s ",book->author);
printf("%-30s ",book->puber);
printf("%4d/%02d/%02d ",book->year,book->month,book->day);
printf("%8.2lf",book->price);
printf("\n");
}
//打印所有节点数据
void print_all_book(Bookptr books[]){
printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
int index=0;
while(books[index]!=NULL){
print_book(books[index]);
index++;
}
}
//--------------------------------------------------------主页功能类--------------------------------------------------------------
//主页添加图书 A
int home_insert_book(Bookptr books[]){
Bookptr book=malloc(sizeof(Book));
printf("%10s ","ISBN:");
scanf("%lld",&book->ISBN);
printf("%10s ","Title:");
input(book->name,31);
printf("%10s ","Author:");
input(book->author,21);
printf("%10s ","Publisher:");
input(book->puber,31);
printf("%10s ","Pub date:");
scanf("%d/%d/%d",&book->year,&book->month,&book->day);
while(check_date(book->year,book->month,book->day)!=0){
printf("Incorrect date! Please reenter: ");
scanf("%d/%d/%d",&book->year,&book->month,&book->day);
}
printf("%10s ","Price:");
scanf("%lf",&book->price);
int index=0;
while(books[index]!=NULL){
index++;
}
books[index]=book;
return 0;
}
//主页删除图书 R
int home_delete_book(Bookptr books[]) {
long long isbn;
char q;
Bookptr find_books[1]={NULL};
printf("ISBN: ");
scanf("%lld",&isbn);
if(find_book(books,find_books,1,NULL,isbn)!=0){
printf("Not found!\n");
return -1;
}
printf("Remove(y/n)? ");
scanf(" %c",&q);
while(q!='Y' && q!='y' && q!='n' && q!='N'){
printf("Incorrect answer!\n");
printf("Remove(y/n)? ");
scanf(" %c",&q);
}
//开始删除
if(q=='Y' || q=='y'){
delete_book(books,isbn);
return 0;
}
return -1;
}
//主页查找图书 F
int home_find_book(Bookptr books[]) {
char name[32];
Bookptr find_books[100]={NULL};
printf("Title: ");
input(name,31);
if(find_book(books,find_books,0,name,0)!=0){
printf("Not found!\n");
return -1;
}else{
print_all_book(find_books);
return 0;
}
}
//主页更改图书,M
int home_change_book(Bookptr books[]){
long long isbn;
char q;
Bookptr find_books[1]={NULL};
printf("ISBN: ");
scanf("%lld",&isbn);
if(find_book(books,find_books,1,NULL,isbn)!=0){
printf("Not found!\n");
return -1;
}
printf("Modify(y/n)? ");
scanf(" %c",&q);
while(q!='Y' && q!='y' && q!='n' && q!='N'){
printf("Incorrect answer!\n");
printf("Modify(y/n)? ");
scanf(" %c",&q);
}
//开始修改
if(q=='Y' || q=='y'){
delete_book(books,isbn);
home_insert_book(books);
return 0;
}
return -1;
}
//主页排序图书 S
int home_sort_book(Bookptr books[]){
sort_book(books,count_book(books));
//printf("%d",count_book(books));
print_all_book(books);
}
int main(int argc, char *argv[]) {
//数组定长,默认1000
Bookptr BOOKS[1000]={NULL};
int flag=1;
while(flag){
//刷新缓冲区,防止上一次遗留输入影响
printf("Append Find Remove Modify Show Quit > ");
char input;
scanf(" %c",&input);
switch(input){
case 'Q':case 'q':
printf("Thank you! Goodbye!");
flag=0;
free_books(BOOKS);
break;
case 'A':case'a':
home_insert_book(BOOKS);
break;
case 'S':case 's':
home_sort_book(BOOKS);
break;
case 'F':case'f':
home_find_book(BOOKS);
break;
case 'R':case 'r':
home_delete_book(BOOKS);
break;
case 'M':case'm':
home_change_book(BOOKS);
break;
default:
printf("Incorrect choice!\n");
}
}
return 0;
}
【图书目录管理系统-C语言】
于 2023-01-24 23:43:33 首次发布