我的简易图书管理系统(会日益完善,问题多多,望各位大佬斧正)

简易图书管理系统

1.0版本:

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <conio.h>

typedef struct booklist  
{  
    char num[20];  
    char name[20];  
    char writer[20];
    char press[20];
    float price; 
    int count; 
}BOOKS;

typedef struct book  
{  
    Books onebook;     /*数据域*/ 
    struct book *next;           /*指针域*/ 
}BOOK; 

void check();

struct book*searchBook (book,char*);

int bookSearch();

void addBook();

int bookAdd();

void bookPrint();

int deleteBook();

void bookDelete();

int choice();

int addFile();   

/**
安全验证
*/ 
void check()  
{  
   char userName[5];//用户名 
   char userPWD[5];//密码  
   int i,sum;
   for(i = 1; i < 4; i++)        
   {  
      //用户名和密码均为abcde 
        printf("****             (用户名和密码均为abcde)         ****\n");  
        printf("****             请输入您的用户名:               ****\n");  
        gets(userName);  

        printf("****             请输入您的密码:                 ****\n");  
        gets(userPWD);  

        if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))//验证用户名和密码  
        {  
            printf("*用户名和密码正确,显示主菜单*\n");  
            return;  
        }  
        else  
        {  
            if (i < 3)  
            {  
                printf("用户名或密码错误,提示用户重新输入");  
                printf("用户名或密码错误,请重新输入!");  
            }  
            else  
            {  
                printf("连续3次输错用户名或密码,退出系统。");  
                printf("您已连续3次将用户名或密码输错,系统将退出!");  
                exit(1);   
            }  
        }  
   }  
}

BOOK *searchBook (BOOK *listptr,char num[])  
{  
    while(listptr!= NULL)           //当不为空指针时继续循环 
        if(strcmp(listptr->onebook.num,num)==0)  
            return listptr;  
        else  
            listptr=listptr->next;  
        return  0;
}  

void bookSearch(BOOK *firstptr)  
{  
    BOOK *ptr;  
    char booknum[20];  
    printf("请输入编号:");  
    scanf("%s",&booknum);  
    ptr=searchBook(firstptr,booknum);  
    if (ptr!=NULL)  
    {  
        printf("找到了!\n");  
        printf("编号:%s\n",ptr->onebook.num);  
        printf("书名:%s\n",ptr->onebook.name);  
        printf("作者:%s\n",ptr->onebook.writer);
        printf("出版社:%s\n",ptr->onebook.press); 
        printf("价格:%.2f\n",ptr->onebook.price);
        printf("数量:%d\n",ptr->onebook.count);  
    }  
    else  
        printf("未发现此书!\n");  
}

int addBook(BOOK *listptr,BOOKS note)  
{  
    while(listptr->next!=0)
        listptr=listptr->next;  
                                          //创建动态空间 
    listptr->next=(BOOK *)malloc(sizeof(BOOK));  
    listptr->next->onebook=note;  
    listptr->next->next=0;  
    return 0;
}  

void bookAdd(BOOK *listptr,FILE *fp)  
{  
    int p;  
    struct booklist note;  
    printf("请输入编号:\n");  
    scanf("%s",note.num);  
    printf("请输入书名:\n");  
    scanf("%s",note.name);  
    printf("请输入作者:\n");       //写入书籍信息 
    scanf("%s",note.writer);
    printf("请输入出版社:\n");
    scanf("%s",note.press);
    printf("请输入价格:\n");
    scanf("%f",&note.price);
    printf("请输入数量:\n");
    scanf("%d",&note.count);  
    p=addBook(listptr,note);  
    if (p==0)  
    {     
        //将加入的图书写到文件中保存 
        fprintf(fp,"%s %s %s %s %.2f %d\n",note.num,note.name
        ,note.writer,note.press,note.price,note.count);  
        printf("添加图书成功!\n");  
    }  
    else  
        printf("添加图书失败!\n");  
}  

void bookPrint(BOOK *listptr)  
{  
    listptr=listptr->next;
    while(listptr!= NULL)
    {                                     //打印全部图书 
        printf("%s   %s   %s   %s   %.2f   %d\n",listptr->onebook.num,listptr->onebook.name,
        listptr->onebook.writer,listptr->onebook.press,listptr->onebook.price,listptr->onebook.count);
        listptr=listptr->next;
    }
}

int deleteBook(BOOK *listptr,char num[])  
{  
    while(listptr->next!=NULL)  
    {  
        if (strcmp(listptr->next->onebook.num,num)==0)  //通过编号寻找要删除的结点 
        {  
            listptr->next=listptr->next->next;   //通过将后一结点前移来实现结点的删除
            return 0;  
        }  
        else  
            listptr=listptr->next;                 //未找到则继续移向下一个结点
    }  

        return -1;  
}  

void bookDelete(BOOK *listptr,FILE *fp)  
{  
    char booknum[20];  
    int p;  
    BOOKS onebook;  
    printf("请输入编号:");  
    scanf("%s",&booknum);  
    p=deleteBook(listptr,booknum);  
    if (!p)                           //对返回值进行判断
    {  
        FILE *fpbak;  
        if ((fpbak=fopen("c:/dao","a+"))==NULL)  //返回指针为空则表示不能打开文件
            printf("文件打开失败!\n");  
        fseek(fp,0,SEEK_SET);   //移到文件开始  
        while((fscanf(fp,"%s %s %s %s %d\n",&onebook.num,&onebook.name
              ,&onebook.writer,&onebook.press,&onebook.count))!=EOF)  
        {                       //当书库文件未到结束时继续循环
            if (strcmp(onebook.num,booknum)!=0)  
            {  
                fprintf(fpbak,"%s %s %s %s %.2f %d\n",onebook.num,onebook.name,
                        onebook.writer,onebook.press,onebook.price,onebook.count);  
            }                   //将所有图书信息输出到指定文件中
        }  
        fclose(fp);           //关闭文件,释放内存 
        fclose(fpbak); 
          if (remove("c:/books.txt" ))   //删除失败返回非0
        {  
            printf("删除文件成功!\n");  
            return ;  
        }  
        else  
            if (rename("c:/booksbak.txt" ,"c:/books.txt" ))  //重命名失败返回非0值
            {  
                printf("重命名失败!\n");  
                return ;  
            }  
        printf("删除成功!\n");  
    }  
    else  
        printf("查无此书!\n");  
}  

int choice()  
{   
    int c; 
    printf("******************************************************\n");
    printf("***                                                ***\n");
    printf("***                  1.遍历图书                    ***\n"); 
    printf("***                  2.查找图书                    ***\n");  
    printf("***                  3.添加图书                    ***\n");  
    printf("***                  4.删除图书                    ***\n");  
    printf("***                  0.退出程序                    ***\n");  
    printf("***                  请选择序号:                   ***\n");
    printf("***                                                ***\n");
    printf("******************************************************\n");
    scanf("%d",&c); 
    return c ;  
    printf("\n"); 
}

int addFile(FILE *fp,BOOK *firstptr)  
  /**
  主要用来加载文件中存放的图书信息
  */  
{  
    BOOKS onebook;  
    while((fscanf(fp,"%s %s %s %s %.2f %d\n",&onebook.num,&onebook.name
          ,&onebook.writer,&onebook.press,&onebook.price,&onebook.count))!=EOF)  
    {  
        while(firstptr->next!=0)  
        firstptr=firstptr->next;  
        firstptr->next=(struct book *)malloc(sizeof(struct book)); //分配内存空间 
        firstptr->next->onebook=onebook;  
        firstptr->next->next=0;  
    }  
    return 0;  

}

int main()  
{
    printf("***********************图书管理系统*********************\n");
    check(); 
    int ch;  
    BOOK first; 
    BOOK *stptr; 
    first.next=0;
    BOOK *firstptr = &first;              
    FILE *fp;  
    if ((fp=fopen("c:/books.txt" ,"a+"))==NULL)
        printf("文件打开失败!");      //a+ 以附加方式打开可读写的文件,若文件不存在 
    addFile(fp,firstptr);           //则会建立该文件,如果文件存在,写入的数据 
    while(1)               //会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
    {  
        system("cls");   //清屏
        fflush(stdin);   //清空缓存区 
        ch=choice();  
        switch (ch)  
        {  
        case 1:
            bookPrint(firstptr);
            break;
        case 2:  
            bookSearch(firstptr);  
            break;  
        case 3:  
            bookAdd(firstptr,fp);  
            break;  
        case 4:  
            bookDelete(firstptr,fp);  
            break;  
        case 0:  
            printf("谢谢使用...\n");  
            exit(0);  
        default:  
            printf("请输入正确序号!");  
        }  
        system("pause"); /*等待用户按键并返回*/ 
    }  
    return 0;  
} 

/**

1
活着
余华
人民

注:此图书馆管理系统所用链表为有头节点,包含插入,删除,查找,遍历等基本操作(后续将会继续完善)

2.0:

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <conio.h>

typedef struct booklist  
{  
    char num[20];  
    char name[20];  
    char writer[20];
    char press[20];
    float price; 
    int count; 
}BOOKS; 

typedef struct book  
{  
    struct booklist onebook;     //数据域 
    struct book *next;           //指针域 
}BOOK;


BOOK *creat(BOOKS x);

BOOK *searchBook(BOOK *listptr,char num[]);

void check();

void bookSearch(BOOK *firstptr);

int addBook(BOOK **listptr,BOOKS note);

void bookAdd(BOOK *listptr,FILE *fp);

void bookPrint(BOOK *listptr);

int deleteBook(BOOK **listptr);

void bookDelete(BOOK **listptr,FILE *fp);

int choice();

int addFile(FILE *fp,BOOK *firstptr);


/**
安全验证
*/ 
void check()  
{  
   char userName[5];//户名  
   char userPWD[5];//密码  
   int i;
   for(i = 1; i < 4; i++)        
   {  
      //用户名和密码均为abcde 
        printf("****             (用户名和密码均为abcde)         ****\n");  
        printf("****             请输入您的用户名:               ****\n");  
        gets(userName);  
        printf("****             请输入您的密码:                 ****\n");  
        gets(userPWD);  
        if ((strcmp(userName,"abcde")==0) && (strcmp(userPWD,"abcde")==0))//验证用户名和密码  
        {  
            printf("*用户名和密码正确,显示主菜单*\n");  
            return;  
        }  
        else  
        {  
            if (i < 3)  
            {  
                printf("用户名或密码错误,提示用户重新输入");  
                printf("用户名或密码错误,请重新输入!");  
            }  
            else  
            {  
                printf("连续3次输错用户名或密码,退出系统。");  
                printf("您已连续3次将用户名或密码输错,系统将退出!");  
                exit(1);   
            }  
        }  
   }  
}


BOOK *creat(BOOKS x)
{
    BOOK* tmp = (BOOK*)malloc(sizeof(BOOK));  
    tmp->onebook = x;  
    tmp->next = NULL;  
    return tmp; 
}


BOOK *searchBook (BOOK *listptr,char num[])  
{  
    while(listptr!= 0)           //当不为空指针时继续循环 
        if(strcmp(listptr->onebook.num,num)==0)  
            return listptr;  
        else  
            listptr=listptr->next;  
        return  0;
}  


void bookSearch(BOOK *firstptr)  
{  
    BOOK *ptr;  
    char booknum[20];  
    printf("请输入编号:");  
    scanf("%s",&booknum);  
    ptr=searchBook(firstptr,booknum);  
    if (ptr!=NULL)  
    {  
        printf("找到了!\n");  
        printf("编号:%s\n",ptr->onebook.num);  
        printf("书名:%s\n",ptr->onebook.name);  
        printf("作者:%s\n",ptr->onebook.writer);
        printf("出版社:%s\n",ptr->onebook.press); 
        printf("价格:%.2f\n",ptr->onebook.price);
        printf("数量:%d\n",ptr->onebook.count);  
    }  
    else  
        printf("未发现此书!\n");  
}


int addBook(BOOK **listptr,BOOKS note)  
{  
    if(*listptr==0) 
    {
        *listptr = creat(note);
    }
    BOOK *listail = *listptr;
    while(listail->next != NULL)
    {
        listail = listail->next;
    }
    listail->next = creat(note);
    return 0;

}  


void bookAdd(BOOK *listptr,FILE *fp)  
{   

    BOOKS note;
    fp=fopen("c:/books.txt","w");
    if(fopen("c:/books.txt","w")==NULL)
    printf("打开文件失败\n"); 
    printf("请输入编号:\n");  
    scanf("%s",note.num);  
    printf("请输入书名:\n");  
    scanf("%s",note.name);  
    printf("请输入作者:\n");       //写入书籍信息 
    scanf("%s",note.writer);
    printf("请输入出版社:\n");
    scanf("%s",note.press);
    printf("请输入价格:\n");
    scanf("%f",&note.price);
    printf("请输入数量:\n");
    scanf("%d",&note.count);
    addBook(&listptr,note);       
        //将加入的图书写到文件中保存 
    fputs("\n", fp);                                                                 
    fputs(note.num, fp);                    
    fputs("\n", fp);
    fputs(note.name, fp);
    fputs("\n", fp);
    fputs(note.writer, fp);
    fputs("\n", fp);
    fputs(note.press, fp);
    fputs("\n", fp);
    fprintf(fp,"%.2f %d\n",note.price,note.count);  
    printf("添加图书成功!\n"); 
    fclose(fp); 
}  


void bookPrint(BOOK *listptr)  
{  
    listptr=listptr->next;
    while(listptr!= NULL)
    {                                     //打印全部图书 
        printf("%s %s %s %s %.2f %d\n",listptr->onebook.num,listptr->onebook.name,
        listptr->onebook.writer,listptr->onebook.press,listptr->onebook.price,listptr->onebook.count); 
        listptr=listptr->next;
    }
}


int deleteBook(BOOK **listptr)  
{    
    if((*listptr)==NULL)
    {
        return 0;
    }
    else
    {
        BOOK *tmp=(*listptr);
        (*listptr)=(*listptr)->next;
    }
}


void bookDelete(BOOK **listptr,FILE *fp)  
{  
    char booknum[20];  
    BOOKS onebook;  
    printf("请输入编号:");  
    scanf("%s",&booknum);
    deleteBook(listptr);      
    FILE *fpbak;  
    if((fpbak=fopen("c:/books.txt","a+"))==NULL)  //返回指针为空则表示不能打开文件
        printf("文件打开失败!\n");  
    fseek(fp,0,SEEK_SET);   //移到文件开始
    while((fscanf(fp,"%s %s %s %s %d\n",&onebook.num,&onebook.name
            ,&onebook.writer,&onebook.press,&onebook.count))!=EOF)  
    {                       //当书库文件未到结束时继续循环
        if(strcmp(onebook.num,booknum)!=0)  
        {  
            fputs("\n", fp);                                                                 
            fputs(onebook.num, fp);                 
            fputs("\n", fp);
            fputs(onebook.name, fp);
            fputs("\n", fp);
            fputs(onebook.writer, fp);
            fputs("\n", fp);
            fputs(onebook.press, fp);
            fputs("\n", fp);
            fprintf(fp,"%.2f %d\n",onebook.price,onebook.count);  
        }                   //将所有图书信息输出到指定文件中
    }  
    fclose(fp);           //关闭文件,释放内存 
    fclose(fpbak); 
    if (remove("c:/books.txt" ))   //删除失败返回非0  
    {  
            printf("删除文件成功!\n");  
            return ;  
    }  
    else if (rename("c:/booksbak.txt" ,"c:/books.txt" ))  //重命名失败返回非0值  
    {  
            printf("重命名失败!\n");  
            return ;  
    }
        printf("删除成功!\n");  
}  


int choice()  
{   
    int c; 
    printf("******************************************************\n");
    printf("***                                                ***\n");
    printf("***                  1.遍历图书                    ***\n"); 
    printf("***                  2.查找图书                    ***\n");  
    printf("***                  3.添加图书                    ***\n");  
    printf("***                  4.删除图书                    ***\n");  
    printf("***                  0.退出程序                    ***\n");  
    printf("***                  请选择序号:                   ***\n");
    printf("***                                                ***\n");
    printf("******************************************************\n");
    scanf("%d",&c); 
    return c ;  
    printf("\n"); 
}


int addFile(FILE *fp,BOOK *firstptr)  
  //主要用来加载文件中存放的图书信息  
{  
    BOOKS onebook;
    fp=fopen("c:/books.txt","a+");  
    while((fscanf(fp,"%s %s %s %s %.2f %d\n",&onebook.num,&onebook.name
          ,&onebook.writer,&onebook.press,&onebook.price,&onebook.count))!=EOF)  
    {  
        while(firstptr->next!=0)  
        firstptr=firstptr->next;  
        firstptr->next=(BOOK *)malloc(sizeof(BOOK)); //分配内存空间
        firstptr->next->onebook=onebook;  
        firstptr->next->next=NULL;  
    }  
    return 0;  
    fclose(fp);
}


int main()  
{
    printf("***********************图书管理系统*********************\n");
    check(); 
    int ch; 
    int a = 0; 
    BOOK first; 
    BOOK *stptr; 
    first.next=NULL;
    BOOK *firstptr = &first;              
    FILE *fp; 
    if ((fp=fopen("C:\\books.txt" ,"w+"))==NULL)
        printf("打开文件!");
             //a+ 以附加方式打开可读写的文件,若文件不存在 

    addFile(fp,firstptr);           //则会建立该文件,如果文件存在,写入的数据 
    while(1)               //会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) 
    {  
        system("cls");   //清屏   
        fflush(stdin);   //清空缓存区 
        ch=choice();  
        switch (ch)  
        {  
        case 1:
            bookPrint(firstptr);
            break;
        case 2:  
            bookSearch(firstptr);  
            break;  
        case 3:  
            bookAdd(firstptr,fp);  
            break;  
        case 4:  
            bookDelete(&firstptr,fp);  
            break;  
        case 0:  
            printf("谢谢使用...\n");  
            exit(0);  
        default:  
            printf("请输入正确序号!");  
        }  
        system("pause"); //等待用户按键并返回
    }  
    return 0;  
} 

/**

1
活着
余华
人民
20
100
2
龙族
江南
知音
30
200
22
龙族
江南
知音
30
200



*/ 

注:略有问题,望斧正!

—————————一个永远在路上的编程小菜鸟—

猜你喜欢

转载自blog.csdn.net/qq_42014895/article/details/80246022