查找书籍
给定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
分析
方法一:
我的刚开始的想法是直接使用两个数组
string name[10]
和int price[10]
分别存储对应的书名和价格,再遍历价格数组求出最大价格的下标maxIndex
和最小下标minIndex
,最后通过price[maxIndex]
和name[maxIndex]
求出最高价格和对应书名,以及price[minIndex]
和name[minIndex]
求出最低价格和对应书名。
方法二:
后来我发现,其实对于这类只需要保留筛选后的最终结果的问题,即只需要保留满足筛选条件的结果,其他不满足条件的输入都可以过滤掉,应该采取
输入时筛选
的策略,这样就在输入的for
循环里就把筛选给完成了,避免了多次使用循环,减少了开销。
代码
方法一:先输入,后筛选
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
/* 方法一:先输入,再筛选 */
int main(){
int n = 0;
cin >> n;
cin.ignore(); // 忽略换行符
string name[10];
double price[10];
// 输入
for(int i = 0; i < n; ++i){
getline(cin, name[i]);
cin >> price[i];
cin.ignore(); // 忽略换行符
}
// 比较筛选
int maxIndex = 0, minIndex = 0; // 设最大和最小价格的下标为0
for(int j = 1; j < n; ++j){
if(price[j] > price[maxIndex])
maxIndex = j;
if(price[j] < price[minIndex])
minIndex = j;
}
// 输出
cout << fixed << setprecision(2); // 设置输出格式为:保留小数点后两位
cout << price[maxIndex] << ", " << name[maxIndex] << endl;
cout << price[minIndex] << ", " << name[minIndex] << endl;
return 0;
}
方法二:输入时筛选
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
/* 方法二:输入时筛选*/
int main(){
int n = 0;
cin >> n;
cin.ignore(); //忽略换行符
double minPrice = 1e9;// 设置初始的最高和最低价格
double maxPrice = -1.0;
string maxName, minName;
for(int i = 0; i < n; ++i){
double price = 0.0;
string name;
getline(cin, name); // 使用getline()函数输入一行字符串
cin >> price;
cin.ignore();
if(price > maxPrice){
maxPrice = price;
maxName = name;
}
if(price < minPrice){
minPrice = price;
minName = name;
}
}
// 输出结果,保留两位小数
cout << fixed << setprecision(2);
cout << maxPrice << ", " << maxName << endl;
cout << minPrice << ", " << minName << endl;
return 0;
}