给定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
第一次文章分享,有点紧张,主要是自己知识储备还不够,特别是在字符串处理这一块,这题让我很难受,为了帮助同学们能够遇到此题的时候不被折磨到,所以在此讲解一下。
这一题主要是考察字符串处理,我们可以选用结构体来存储书名和价格,并定义结构体数组去存储数据。
宏定义和结构体部分:
#define MAXLINE 31
#define MAXBOOKS 10
typedef struct Node Book;
struct Node{
char name[MAXLINE];
double price;
};
在这一部分里,定义了字符串数组最大存储的长度为30,宏定义为31是当最大输入为30个字符时,能够存储'\0'结束符
char name[MAXLINE];存放书名
double price; 记录输的价格
//定义结构体数组
Book books[number];
double minprice=1e10;
double maxprice=0;
//通过访问数组下标记录最贵和最便宜的书
int minname=0;
int maxname=0;
这里通过记录最贵和最便宜的书本下标,在输出的时候,直接通过下标访问即可
在找寻最贵书本是,将maxprice设置为比其中任何一个书本的价格都大的情况,最便宜的同理设置为0
存入书本名称和价格
//存入书名和价格
for(int i=0; i < number ; i++)
{
scanf("\n");
/*gets()输入一个字符串,允许带空格,遇到回车结束,自动将输入的
数据和'\0'送入数组中*/
gets(books[i].name);
scanf("%lf",&books[i].price);
}
这里我选用了gets作为处理字符串输入的输入格式,因为你用getchar()只能输入一个字符,用scanf()是不能输入空格的,最输入空格的时候就会自动结束输入,gets()是处理字符串输入的函数,他允许输入空格!!!
然后就是比较:
for(int i=0;i < number;i++)
{
if(books[i].price < minprice)
{
minprice = books[i].price;
minname = i;
}
if(books[i].price > maxprice)
{
maxprice = books[i].price;
maxname = i;
}
}
输出格式:
//输出结果,保留俩位小数
printf("%.2lf, ",maxprice);
puts(books[maxname].name);
printf("%.2lf, ",minprice);
puts(books[minname].name);
这里选用puts()作为输出字符串数组,可以参考一下我上面发出来的那张图片,他会在输出时遇到结束符’\0’,自动将其装换位换行符’\n’
最后再注意一下输出的格式细节就可以了
提交情况:
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 31
#define MAXBOOKS 10
typedef struct Node Book;
struct Node{
char name[MAXLINE];
double price;
};
int main()
{
int number;
scanf("%d",&number);
if(number <= 0 || number >MAXBOOKS)
{
printf("outing of line");
return 1;
}
//定义结构体数组
Book books[number];
double minprice=1e10;
double maxprice=0;
//通过访问数组下标记录最贵和最便宜的书
int minname=0;
int maxname=0;
//存入书名和价格
for(int i=0; i < number ; i++)
{
scanf("\n");
/*gets()输入一个字符串,允许带空格,遇到回车结束,自动将输入的
数据和'\0'送入数组中*/
gets(books[i].name);
scanf("%lf",&books[i].price);
}
for(int i=0;i < number;i++)
{
if(books[i].price < minprice)
{
minprice = books[i].price;
minname = i;
}
if(books[i].price > maxprice)
{
maxprice = books[i].price;
maxname = i;
}
}
//输出结果,保留俩位小数
printf("%.2lf, ",maxprice);
puts(books[maxname].name);
printf("%.2lf, ",minprice);
puts(books[minname].name);
return 0;
}