PAT1054 求平均值 (20 分)【从非法输入字符串中获取合法输入 cin.putback()】
生活随笔
收集整理的這篇文章主要介紹了
PAT1054 求平均值 (20 分)【从非法输入字符串中获取合法输入 cin.putback()】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
吐槽
題目描述的太不清晰了吧,自己寫了一些測試用例,從已知中并不能看出這些輸入是否合法…
我的測試用例
21
007 000.01 12. .9 -007 -000.01 -12. -.9 .9. - +100 + -+. -+ .- .+ ± ++ 0. .0 +.00
以上輸入到底哪些可以??下面是別人的AC代碼和我的代碼(有一個(gè)測試點(diǎn)不通過)的結(jié)果對比
實(shí)際上,OJ上的測試點(diǎn)沒有那么刁鉆,可能是我想復(fù)雜了。但既然有的測試用例會(huì)引起歧義,至少應(yīng)該在題目中說清楚正確格式啊…
題目
代碼
沒有必要的判斷被我注釋掉了,但是別人的AC代碼里卻又有這些判斷
#include<iostream> #include<string> #include<vector> using namespace std; //5 -3.2 aaa 9999 2.3.4 7.123 2.35 int main() {//先吸收一個(gè)字符串:判斷整個(gè)字符串內(nèi)只有一個(gè)小數(shù)點(diǎn)、只有一個(gè)'-'且負(fù)號在第0個(gè)字符、小數(shù)點(diǎn)后面的數(shù)字不超過2位。//如果滿足以上條件,將string返回stdin,用double接收,如果-1000<=num<=1000,計(jì)算sum//疑問:以下輸入哪些符合要求?可以有加號嗎?//007 000.01 12. .9 -007 -000.01 -12. -.9 .9. -int total;cin >> total;//輸入string str;int totalJian = 0;int totalDian = 0;int totalJia = 0;int i, j, k;vector<double>num;double numTemp;double sum = 0;for (i = 0; i < total; i++){cin >> str;totalDian = 0;totalJian = 0;totalJia = 0;for (j = 0; j < str.size(); j++)//對這個(gè)字符串的每一個(gè)字符檢測{if (str[j] == '-' || str[j] == '+' || str[j] == '.' || (str[j] >= '0' && str[j] <= '9'))//一個(gè)字符的所有可能{if (str[j] == '-'){totalJian++;if (totalJian > 1 || j != 0|| str.size()==1)//如果多個(gè)減號 或者減號不在第一個(gè) 或者整個(gè)str只有減號{//輸出errorcout << "ERROR: " << str << " is not a legal number\n";break;}}if (str[j] == '+'){totalJia++;if (totalJia > 1 || j != 0 || str.size() == 1)//如果多個(gè)加號 或者加號不在第一個(gè) 或者整個(gè)str只有加號{//輸出errorcout << "ERROR: " << str << " is not a legal number\n";break;}}if (str[j] == '.'){totalDian++;if (totalDian > 1){//輸出errorcout << "ERROR: " << str << " is not a legal number\n";break;}//if (j== str.size()-1)//如果小數(shù)點(diǎn)在末尾//{// //輸出error// cout << "ERROR: " << str << " is not a legal number\n";// break;//}//if (j == 0)//如果小數(shù)點(diǎn)在開頭//{// //輸出error// cout << "ERROR: " << str << " is not a legal number\n";// break;//}//if (j!=0&&str[j-1]=='-')//如果小數(shù)點(diǎn)前面是-//{// //輸出error// cout << "ERROR: " << str << " is not a legal number\n";// break;//}if (str.size() - j > 3){//輸出errorcout << "ERROR: " << str << " is not a legal number\n";break;}}}else{//輸出errorcout << "ERROR: " << str << " is not a legal number\n";break;}}//通過了檢測if (j == str.size()){//放回for (k = str.size() - 1; k >= 0; k--){cin.putback(str[k]);}//用double接收cin >> numTemp;//檢測是否范圍內(nèi)if (numTemp >= -1000.00&&numTemp <= 1000.00){num.push_back(numTemp);sum += numTemp;}else{cout << "ERROR: " << str << " is not a legal number\n";}}}//輸出if (num.size() == 0){cout << "The average of 0 numbers is Undefined";}else{cout << "The average of " << num.size() << " numbers is ";printf("%.2lf", sum / num.size());}cout << endl;system("pause");return 0; }總結(jié)
以上是生活随笔為你收集整理的PAT1054 求平均值 (20 分)【从非法输入字符串中获取合法输入 cin.putback()】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT1053 住房空置率 (20 分)
- 下一篇: PAT1055 集体照 (25 分)【3