ACM_编程与调试重点记录(九)

来源:互联网 发布:千牛mac下载 编辑:程序博客网 时间:2024/06/06 20:13

/*

    图书信息包括图书的登陆号(长整型)、书名(字符串)、作者(字符串)和价钱(整型)。

    要求具有以下功能:

    (1)   创建图书信息表。从键盘读入完整的图书信息, 如果表创建失败,给出"创建表失败!"的提示信息。

    (2)   分行显示所有图书信息的列表。(要有表头)

    (3)   按书名查询图书信息。如果查找成功,显示所有该书名图书的作者和价钱,如果查找不成功,则给出"没有该读书!"的提示信息;

    (4)   在指定位置插入新的图书记录,如果指定位置不合理,给出"插入位置错误,插入失败!"的提示信息;

 

*/

#include<string.h>

#include<stdio.h>

#include <stdlib.h>

typedef struct

{

    long  LandNumber;

    char  Name[20],Writer[10];

    int   Price;

}Book;

typedef struct

{

    Book *elem;

    int length;

    int listsize;

}List;

Create(List *p)

{

    p->elem= (Book *)calloc(100,sizeof(Book));

    if (!(p->elem))

    {

        printf("申请图书信息存储空间失败");

        exit(0);

    }

    p->length=0;

    p->listsize=100;

}

InitList(List *p)

{

    int i,a;

    Book *e;

    e=p->elem;

    printf("下面创建一个图书信息表,请输入图书信息!/n");

    printf("请输入要存储的图书的本数!/n");

    while (scanf("%d",&a)!=1)

    {

        printf("输入有误,请重新输入!/n");

        fflush(stdin);  /*清空输入缓冲区*/

    }

    /*c=getchar();

    a=(int)c;*/    /*用强制类型转换纠错*/

    while (a>p->listsize||a<=0)

    {

        printf("输入有误,请重新输入!/n");

        printf("请输入要存储的图书的本数!/n");

        while (scanf("%d",&a)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

    }

    p->length=a;

    for (i=0;i<p->length;i++)

    {

        printf("请输入图书登陆号/n");

        while (scanf("%ld",&p->elem->LandNumber)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        printf("请输入书名/n");

        scanf("%s",p->elem->Name);

        printf("请输入作者姓名/n");

        scanf("%s",p->elem->Writer);

        printf("请输入价格/n");

        while (scanf("%d",&p->elem->Price)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        (p->elem)++;

    }

    p->elem=e;

}

print(List *p)

{

    int i;

    Book *q;

    q=p->elem;

    printf("登陆号         书名           作者           价钱/n");

    for (i=0;i<p->length;i++)

    {

        printf("%-15ld%-15s%-15s%-15d/n",q->LandNumber,q->Name,q->Writer,q->Price);

        q++;

    }

}

GetBook(List *p,char * ch)

{

    int i;

    Book *e;

    e=p->elem;

    if (p!=NULL)

    {

        for (i=1;i<p->length+1;i++)

        {

            if (strcmp(ch,p->elem->Name)==0)

            {

                printf("登陆号         书名           作者           价钱/n");

                printf("%-15ld%-15s%-15s%-15d/n",p->elem->LandNumber,p->elem->Name,p->elem->Writer,p->elem->Price);

                break;

            }

            p->elem++;

        }

    }

    if (i==p->length+1) printf("没有该图书!/n");

    p->elem=e;

}

int insert(List *l1,int n,int k)     /*插入n本图书信息   在第k本图书前*/

{

    int i,j;

    Book *p,*q;

    i=k;

    if (i<1||i>l1->length+1||n<1) return 0;

    if (l1->length>=l1->listsize) /*当前存储空间已满,增加分配*/

    {

        Book *newelem;

        newelem=(Book *)realloc(l1->elem,(l1->listsize+n)*sizeof(Book));

        if (newelem==NULL)

        {

            printf("当前存储空间已满,无法增加!");

            return 1;

        }

        l1->elem=newelem;

        l1->listsize+=n;

    }

    q=&(l1->elem[k-1]);

    for (p=&(l1->elem[l1->length-1]);p>=q;p--) /*插入位置及之后元素右移*/

    {

        (p+n)->LandNumber=p->LandNumber ;

        strcpy((p+n)->Name,p->Name);

        strcpy((p+n)->Writer,p->Name);

        (p+n)->Price=p->Price;

    }

    p++;

    for (j=0;j<n;j++)

    {

        printf("下面插入第%d本图书,共插入%d本图书/n",j+1,n);

        printf("请输入图书登陆号/n");

        while (scanf("%ld",&p->LandNumber)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        printf("请输入书名");

        while (scanf("%s",p->Name)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        printf("请输入作者姓名");

        while (scanf("%s",p->Writer)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        printf("请输入价钱");

        while (scanf("%d",&p->Price)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        p++;

        l1->length++;

    }

    return 1;

}

void main()

{

    int a,k,n,m;

    char nam[20];

    List list1;

    List *l1;

    l1=&list1;

    Create(l1);

    InitList(l1);    /*动态输入图书信息*/

    while (1)

    {

        printf("1.分行显示所有图书信息/n");

        printf("2.按书名查询图书信息/n");

        printf("3.在指定位置插入新的图书信息/n");

        printf("4.退出!/n");

        printf("请输入相关操作序号!/n");

        while (scanf("%d",&a)!=1)

        {

            printf("输入有误,请重新输入!/n");

            fflush(stdin);

        }

        if (a>=1&&a<=4)

        {

            switch (a)

            {

            case 1:

                print(l1);

                break;

            case 2:                                                 /*查找图书*/

            {

                printf("请输入要查找的图书名/n");

                scanf("%s",nam);

                GetBook(l1,nam);

            }

            break;

            case 3:                                                 /*在指定位置插入图书*/

            {

                printf("要插入几本图书信息?/n请输入");

                while (scanf("%d",&n)!=1)

                {

                    printf("输入有误,请重新输入!/n");

                    fflush(stdin);

                }

                printf("在第几个图书前插入一个图书信息?/n请输入");

                while (scanf("%d",&k)!=1)

                {

                    printf("输入有误,请重新输入!/n");

                    fflush(stdin);

                }

                m=insert(l1,n,k);

                if (m==0) printf("插入错误,插入失败!/n");

            }

            break;

            case 4:

                exit(0);

            }

        }

        else

        {

            printf("输入有误,请重新输入!/n");

        }

    }

}

原创粉丝点击