给定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));
来进行字节填充。
本文链接:https://shengto.top/c/pat_45.html
转载时须注明出处及本声明