给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。

输入格式:

输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。

输出格式:

在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:

3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0

输出样例:

25.00, Programming in Delphi
18.50, Programming in VB
#include <stdio.h>
#include <string.h>
#define N 10
#define BN 31
typedef struct books
{
    char name[BN];
    double price;
}BOOKS;

int main()
{
    int n,i,j,index;
    BOOKS boks[N];
    BOOKS temp;
    scanf("%d",&n);
    getchar();
        if(n>0 && n<10){
        for(i=0;i<n;i++)
        {
            gets(boks[i].name);
            scanf("%lf",&boks[i].price);
            getchar();
        }
        for(i=0;i<n-1;i++)
        {
            index = i;
            for(j=i+1;j<n;j++)
            {
                if(boks[j].price>boks[index].price)
                    index = j;
            }
                    temp = boks[i];
                    boks[i] = boks[index];
                    boks[index] = temp;
        }
        printf("%.2lf, %s\n",boks[0].price,boks[0].name);
        printf("%.2lf, %s\n",boks[n-1].price,boks[n-1].name);   
        }
    return 0;
}

总结

题中提到书本的价格为正实数,如果定义float类型则无法通过n最小时的测试。n最小为1,这对float定义的价格有什么影响吗?我想不明白。

书包含名称和价格,因此书作为一个结构体来定义。有n本书,那么可以定义一个结构体数组,每个数组单元内存储的是一本“书”。因此题目实际上是要求一个数组中的最大和最小“数据”,问题得以简化。

第33至35行是对结构体数据“书”的整体交换。原理是2个结构体变量的数据类型相同时,可以进行变量间的赋值操作,这个赋值不是简单的数据项赋值,而是内存拷贝,拷贝过去的还会有空字段。放个例子来解释下空字段。

typedef struct example{
    char arr[5];
    short a;
    char c;
    int b;
}EXAMP;

EXAMP exam;

计算这个结构体类型EXAMP的内存空间大小sizeof(EXAMP)=16byte。

首先所占内存大小是以结构体中最大的数据类型来决定的,且是其的整数倍。这里最大的类型是int类型,4字节。

32位系统,也就是有32根地址线,每次读取32位数据,因此内存是以32位对齐,也就是4字节对齐。当内存给数据分配空间时,为了提高CPU的工作效率,数据也被默认按照4字节对齐来分配而不会被“分割”。

除了要满足系统的字节对齐,还有变量的自身对齐:变量的存储地址应是变量数据类型的整数倍。如int类型是4字节对齐,short类型是2字节对齐且首地址要能被2整除。

EXAMP分配的空间中还有4个字节是没有数据的。可以在初始化之前通过

memset(&exam,0,sizeof(EXAMP));来进行字节填充。

Last modification:2021 年 03 月 27 日 16 : 43 : 17