PAT Advanced 1022. Digital Library in C.

本文介绍了一个简单的图书检索系统的实现过程,包括数据结构定义、输入验证、排序和搜索算法等关键部分。通过对图书信息进行有效组织,实现了基于不同字段的快速查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


注意点就是,仔细看题的要求,一个是ID**一个年份**,其他的的要求都比较一般.

一开始我没考虑输入信息的valid性, 没有AC, 后来试着更改ID的输入要求, 不符合ID要求的书目信息是无效的, 年份的有效性加不加都可以AC,我这里为了严谨性加上了.

还有一个就是搜索的问题, 这里的题意应该是前面的数字序号对应的类别,比如1:指的是,后面的字符串查找的就是题目等等,但是我这里是把他看作”黑箱查找”,来做的,就是这里的用户query可能是5个信息的任何一个,所以在查找的时候,每个类别都遍历了一遍,当然这会包含题目中的这种情况,因为题目要求的时间比较宽松,所以我这种也可以AC.当然如果想完全按照题目出题思路来,就自己添加个变量,来判断前面的数字就好.

最后我这里先将书目按照ID排序,这样边查找就可以边输出.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxNum 10001
#define maxTapLength 81 //title, author, and pulisher's length
#define maxKeyLength 11
#define maxKeyNum 6
#define maxYearLength 5
#define maxIdLength 8

typedef struct libNode{
    char tit[maxTapLength],aut[maxTapLength],pub[maxTapLength];
    char keys[maxKeyNum][maxKeyLength],year[maxYearLength],id[maxIdLength];
    int kn; //keys number
} *lib,libNode;
long toNum(char s[])
{
    int i,r=0;
    for(i=0;i<strlen(s);i++)
    {
        if(s[i]<'0'||s[i]>'9') return 0;
        r=10*r+s[i]-'0';
    }
    return r;
}
int comp(const void *A,const void *B)
{
    lib a=(lib)A,b=(lib)B;
    long l=toNum(a->id)-toNum(b->id);
    return (int)l;
}
int scanKey(char k[][maxKeyLength])
{
    int i=0,j=0;
    char c;

    while((c=getchar())!='\n')
    {
        if(c>='A'&&c<='Z') c=c-'A'+'a';
        if(c==' ')
        {
            /*end of a key*/
            k[i++][j]='\0';
            j=0;
        }
        else k[i][j++]=c;
    }
    k[i++][j]='\0';
    return i;
}

void scan(char *s)
{
    int i;
    char c;
    i=0;
    while((c=getchar())!='\n')
    {
        if(c>='A'&&c<='Z') c=c-'A'+'a';
        s[i++]=c;
    }
    s[i]='\0';
}

void search(char s[],lib a,int n)
{
    int i,j,innerFlag,outterFlag=0;
    printf("%s\n",s);
    for(i=2;i<strlen(s);i++)
        if(s[i]!=' ') break;
    strcpy(s,s+i); /*valid string starts from the first non-space character*/
    for(j=0;j<strlen(s);j++)
            if(s[j]<='Z'&&s[j]>='A') s[j]=s[j]-'A'+'a';
    /*main search*/
    for(i=0;i<n;i++)
    {
        innerFlag=0;
        if(!strcmp(s,a[i].tit)) innerFlag=outterFlag=1;
        if(!strcmp(s,a[i].aut)) innerFlag=outterFlag=1;
        if(strlen(s)<maxKeyLength)
        {
            for(j=0;j<a[i].kn;j++)
                if(!strcmp(s,a[i].keys[j])) innerFlag=outterFlag=1;
        }
        if(!strcmp(s,a[i].pub)) innerFlag=outterFlag=1;
        if(!strcmp(s,a[i].year)) innerFlag=outterFlag=1;

        if(innerFlag) printf("%s\n",a[i].id);
    }

    if(!outterFlag) printf("Not Found\n");
}
int isValid(char s[])
{
    int i;
    if(strlen(s)>7||strlen(s)<7) return 0;
    for(i=0;i<strlen(s);i++)
        if(s[i]<'0'||s[i]>'9') return 0;
    return 1;
}

int main()
{
    int n,i,m;
    long y;
    char s[maxTapLength];
    lib l;
    scanf("%d",&n);
    getchar();
    l=(lib)malloc(sizeof(libNode)*n);
    for(i=0;i<n;i++)
    {
        scan(l[i].id);
        scan(l[i].tit);
        scan(l[i].aut);
        l[i].kn=scanKey(l[i].keys);
        scan(l[i].pub);
        scan(l[i].year);
        y=toNum(l[i].year);
        if((y<1000||y>3000)||!isValid(l[i].id))
        {
            /*valid book INFO*/
            i--;n--;
        }
    }
    qsort(l,n,sizeof(libNode),comp);

    scanf("%d",&m);
    getchar();
    for(i=0;i<m;i++)
    {
        gets(s);

        search(s,l,n);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值