沒事做的一個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;
}