鱼C论坛

 找回密码
 立即注册
查看: 2994|回复: 0

[技术交流] C语言经典期末作业——图书馆管理系统

[复制链接]
发表于 2021-6-18 22:35:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 尛善领主 于 2021-6-18 23:08 编辑
期末作业老师布置了最经典的图书馆管理问题

题目
图书目录信息包括:
  • 统一书号(不超过13字符)
  • 书名(不超过30字符)
  • 作者(不超过20字符)
  • 出版社(不超过30字符)
  • 出版日期(包括:年、月、日)
  • 价格(精确到分)
要求功能
如果用户输入 A 或 a、F 或 f、R 或 r、M 或 m、S 或 s,则可完成相应的操作。如果用户输入其它字符,则显示错误信息。
程序将反复显示主菜单,让用户持续工作。如果用户输入 Q 或 q,则程序结束

a添加记录
f根据书名寻找图书
s对所有图书进行升序
r根据书号删除指定图书
m根据书号修改指定图书

老师分为小组来做,群里包括我一些麻瓜自己一个小组做


讨论的时候,和另外3个人讨论,我和1位同学尝试用单链表做
(其他数据结构还没学)
另外2个人用数组做
最开始是在PTA上做
___________________________________________________________

(复制过来中文注释变鸟文了)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

//瀹氫箟鏁版嵁鍩?
typedef struct Data {
        char isbn[14];
        char title[31];
        char author[21];
        char publisher[31];
        struct Date{
                int year;
                int month;
                int day;
        }date;
        double price;
}Element;

//瀹氫箟閾捐〃
typedef struct Node {
        Element data;
        struct Node *next;
}LNode,*LList;

void input(LList);
void A(LList);
void F(LList);
LList R(LList);
void S(LList);
void M(LList);

int main(){
        //freopen("test.txt","r",stdin);
        LList head = NULL;
        head = malloc(sizeof(LNode));
        head->next = NULL;
        char ch;
        do{
                printf("Append Find Remove Modify Show Quit > ");
                if(scanf(" %c",&ch) == EOF)break;
                getchar();
                ch = tolower(ch);
                switch(ch){
                        case 'a':
                                A(head);
                                break;
                        case 'f':
                                F(head);
                                break;
                        case 'r':
                                head = R(head);
                                break;
                        case 'm':
                                M(head);
                                break;
                        case 's':
                                S(head);
                                break;
                        case 'q':
                                goto out;
                        default:
                                printf("Incorrect choice!\n");
                }
        }while(ch != 'q');
        out:return 0;
}

//杈撳叆
void input(LList p){
        printf("     ISBN: ");
        gets(p->data.isbn);
        printf("    Title: ");
        gets(p->data.title);
        printf("   Author: ");
        gets(p->data.author);
        printf("Publisher: ");
        gets(p->data.publisher);
        printf(" Pub date: ");
        int flag;
        do{
                flag = 1;
                scanf("%d/%d/%d",&p->data.date.year,&p->data.date.month,&p->data.date.day);
                if(p->data.date.year <= 0)
                        flag = 0;
                else {
                        int m2 = (p->data.date.year%4 == 0 && p->data.date.year%100 != 0) || (p->data.date.year%400 == 0);
                        switch(p->data.date.month) {
                                case 1:
                                case 3:
                                case 5:
                                case 7:
                                case 8:
                                case 10:
                                case 12:
                                        if(p->data.date.day < 1 || p->data.date.day > 31)
                                                flag = 0;
                                        break;
                                case 2:
                                        if(p->data.date.day < 1 || p->data.date.day > 28+m2)
                                                flag = 0;
                                        break;
                                case 4:
                                case 6:
                                case 9:
                                case 11:
                                        if(p->data.date.day < 1 || p->data.date.day > 30)
                                                flag = 0;
                                        break;
                                default:
                                        flag = 0;
                        }
                }
                if(!flag)printf("Incorrect date! Please reenter: ");
        }while(!flag);
        printf("    Price: ");
        scanf("%lf",&p->data.price);
}

//娣诲姞璁板綍
void A(LList head){
        LList p = head;
        LNode *newnode = malloc(sizeof(LNode));
        newnode->next = NULL;
        while(p->next != NULL){
                p = p->next;
        }
        p->next = newnode;
        input(p);
}

//绱㈠紩涔﹀悕
void F(LList head){
        LList p = head;
        char t[31];
        printf("Title: ");
        gets(t);
    int flag = 0;
        do{
                if(!strcmp(t,p->data.title)) {
            flag = 1;
            printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
            break;
                }
                p = p->next;
        }while(p->next != NULL);
        do{
                if(!strcmp(t,p->data.title)){
                printf("%-14s",p->data.isbn);
                printf("%-31s",p->data.title);
                printf("%-21s",p->data.author);
                printf("%-31s",p->data.publisher);
                printf("%04d/%02d/%02d ",p->data.date.year,p->data.date.month,p->data.date.day);
                printf("%8.2lf\n",p->data.price);
                }
                p = p->next;
        }while(p != NULL);
    if(!flag)printf("Not found!\n");
}

//鎸変功鍚嶅崌搴忔帓搴?
void S(LList head) {
        printf("ISBN--------- Title------------------------- Author-------------- Publisher--------------------- Pub-date-- Price---\n");
        LList p,q;
        int num=0,j=0;
        q = head;
        while(q->next != NULL){
                q = q->next;
                num++;
        }
        p = q = head;
        for(int i=0;i<num-1;i++,p = p->next){
                q = head;
                for(j = 0;j < num-i-1;j++,q = q->next){
                        if(strcmp(q->data.title,q->next->data.title) > 0){
                                LNode t;
                                t.data = (*q).data;
                                (*q).data = (*(q->next)).data;
                                (*(q->next)).data = t.data;
                        }
                }
        }
        for(LList p = head;p->next != NULL;p = p->next){
                printf("%-14s",p->data.isbn);
                printf("%-31s",p->data.title);
                printf("%-21s",p->data.author);
                printf("%-31s",p->data.publisher);
                printf("%04d/%02d/%02d ",p->data.date.year,p->data.date.month,p->data.date.day);
                printf("%8.2lf\n",p->data.price);
        }
        
}

//淇敼鍥句功
void M(LList head){
        char t[14];
        printf("ISBN: ");
        gets(t);
        int flag = 0;
        LList p = NULL;
        for(p = head;p->next != NULL;p = p->next){
                if(!strcmp(p->data.isbn,t)){
                        flag = 1;
                        break;
                }
        }
        if(flag){
                char select;
                do{
                        printf("Modify(y/n)? ");
                        select = tolower(getchar());
                        getchar();
                        if(select != 'y' && select != 'n')printf("Incorrect answer!\n");
                }while(select != 'y' && select != 'n');
               
                if(select == 'y'){
                        input(p);
                }else{
                        goto out;
                }
        }else{
                printf("Not found!\n");
        }
        out:;
}

//鍒犻櫎鍥句功
LList R(LList head){
        char t[14];
        int flag = 0;
        printf("ISBN: ");
        gets(t);
        for(LList p = head;p->next != NULL;p = p->next){
                if(!strcmp(t,p->data.isbn)){
                        flag = 1;
                }
        }
        if(!flag){
                printf("Not found!\n");
                return head;
        }
        LList fp = head;
        LList lp = head->next;
        flag = 0;
        char select;
        do{
                printf("Delete(y/n)? ");
                select = tolower(getchar());
                getchar();
                if(select == 'n')return head;
                else if(select == 'y'){
                        flag = 1;
                        break;
                }else{
                        printf("Incorrect answer!\n");
                }
        }while(!flag) ;
        
                while(flag && head->next != NULL){
                        flag = 0;
                        if(!strcmp(t,head->data.isbn)){
                                head = head->next;
                                free(fp);
                                fp = head;
                                lp = head->next;
                                flag = 1;
                        }
                }
                while(lp != NULL){
                        if(!strcmp(t,lp->data.isbn)){
                                fp->next = lp->next;
                                free(lp);
                                lp = fp->next;
                        }
                        fp = fp->next;
                        lp = lp->next;
                }
        return head;
}

然后经过一些简单的加工,我做成另外一个版本的
除了最开始的功能,外加了一个数据保存功能,保存为csv文件,可以直接用Excel打开


思路
①分为界面和处理


界面用来展示,在gui.c文件里


核心的处理在operate.c文件里


②界面:
这里我用stdlib库里的system来调用shell的指令


比如system("cls")可以清屏


这个界面的样式我存在menu.txt里了




每次清屏后再打印一遍


思路是每次按w或s可以切换选项


按p执行选项


③当然标准库里没有输入不回显的,这里我引入了第三方库引用getch函数
来达到按键后不需要按Enter的效果
1624028644612.gif





IJ(MGH)68XV6M5%KNU]E_WU.png


O[9EI(IE8Q3(XWN)JER3KUM.png

不过这个改版是基于原作业的基础上,代码有很多不必要的地方(懒得改了~)
利用字符画的方式可以不用图形库做贪吃蛇这种
但由于不是多线程,比较勉强也只能做这种操作简单的


期末作业.zip (3.55 KB, 下载次数: 19)





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 14:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表