没事做的一个c++的题目:
给定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
今天在做这道题目的时候,很快就把代码写了出来,但是各种格式问题,平台始终没让我通过。
主要的问题就是最开始不知道c++中的:
cin>>a[i].name;
是在终端输入一串字符串时,遇到空格或者换行就会直接停止,这个功能在做别的题目的时候时有用的但是在这道题目中带来了很多麻烦。
其实用c语言的话这道题目很好解决,使用c语言中的get()函数
get()函数用例:
char a[10];
get(a);
直接读到换行符结束读取。
通过查找找到一个函数getline();
getline(cin,a[i].name);
但是还是出错。
出错原因分析
getline(cin,str)的读取原理是将以‘\n’ 为结束符完整读取的一行,’\n’灰度,所以当之前用cin读取一个字符串的时候,你会输入一个字符串,然后回车,那么getline(cin,str)读的时候灰度入这个回车,并判断结束了。
解决办法
在getline前面加一个函数cin.ignore()
这样一来,回车就会被忽略
另外一个问题就是:c++中的小数保留
相对于c中简单粗暴的方式:
eg:%f 格式化输出浮点型数据,在%之后加上“.n”即可。
例如:%.2f\n中的“.2”即保留两位小数;
不设定保留几位小数,则默认六位。
c++保留小数点位数
//头文件
#include <iomanip>
//第一种写法
cout<<setiosflags(ios::fixed)<<setprecision(2);
//直接写在要输出的语句前面
//第二种写法
cout.setf(ios::fixed);
cout<<setprecision(2);
//第三种写法
cout<<fixed<<setprecision(2);
*要保留几位小数setprecision(n)的括号里n就换成几。
*前两种写法是一样的,第三种是简化写的。
*上面的语句写一次就行了,对之后的数字都有效。
最后全部代码:
#include<iostream>
#include<string>
#include <iomanip>
using namespace std;
typedef struct book{
//char name[100];
string name;
double price;
}Book;
int main(){
int n;
cin>>n;
Book a[10];
for(int i=0;i<n;i++){
cin.ignore();
getline(cin,a[i].name);
//cin>>a[i].name;
cin>>a[i].price;
}
double MaxPrice = a[0].price;
double MinPrice = a[0].price;
for(int j=1;j<n;j++){
if(a[j].price>MaxPrice){
MaxPrice = a[j].price;
}
if(a[j].price < MinPrice){
MinPrice = a[j].price;
}
}
for(int i=0;i<n;i++){
if(MaxPrice==a[i].price){
cout<<fixed<<setprecision(2);
cout<<a[i].price<<", "<<a[i].name<<endl;
}
}
for(int i=0;i<n;i++){
if(MinPrice==a[i].price){
cout<<fixed<<setprecision(2);
cout<<a[i].price<<", "<<a[i].name;
}
}
return 0;
}