C++STL練習(3)
阿新 • • 發佈:2018-11-22
題目1:Unix ls 命令
思路:
1.接受使用者輸入,用陣列儲存使用者輸入的檔名
2.計算輸出的行數和列數
3.對陣列中的字串進行排序
4.按列輸出,但這裡我們不可能輸出一列又回到開頭去輸出,所以真正程式碼的書寫還是按行輸出,但通過計算造成按列排序輸出的“假象”
程式碼實現:
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; void print(const string &s,int len,char extra); //宣告儲存使用者輸入字串的陣列 vector<string> saveString; //每行能儲存字元的最大值 const int charMaxOfRow = 60; //列印函式,輸出字串s,長度不足len時就補充字元extra void print(const string &s,int len,char extra) { cout<< s; for(unsigned int i=0;i < len-s.length();i++) cout<<extra; } int main() { int stringNum; //使用者輸入的字串的個數 //獲取使用者的輸入並儲存 while(cin>>stringNum) { //使用者輸入的最長字串的長度 int lenOfMaxString=0; string tempString; //儲存使用者的輸入的字串 for(int i=0;i < stringNum;i++) { cin>>tempString; saveString.push_back(tempString); lenOfMaxString = max(lenOfMaxString,(int)tempString.length()); } int row; //輸出的字串的行 int column; //輸出的字串的列 //通過計算每行能輸出的最大字串個數,然後計算列數 // 用每一行所能容納的字元數減去最後一列的長度,然後除以前面每列字串的長度,整數的相除,會向下取整,再加上最後一列 column =(charMaxOfRow - lenOfMaxString) /(lenOfMaxString+2)+ 1; //這裡行的計算有一定的技巧,我們直觀想到的是: //row = stringNum/column;但仔細想一下,這樣的寫法有問題如下 //當stringNum/column的如果單純數學計算結果大於某個整數的話,在這裡的整數運算中會向下取整,就會導致字串沒被完全儲存 //所以由此推斷很明顯我們需要向上取整,很自然想到那寫成下面不就好了 //row = stringNum/column+1; //是的,當stringNum/column的數學計算結果是個小數的時候沒問題了 //但是,當stringNum/column的數學計算結果剛好為一個整數時,就多了一行 //所以row = (stringNum - 1)/column + 1恰好解決了上述的兩個問題,達到了向上取整的目的 row = (stringNum - 1)/column + 1; //輸出上面的分割符 print("",60,'-'); cout<<"\n"; //排序 sort(saveString.begin(),saveString.end()); //按行輸出 for(int r=0;r < row;r++) { for(int c=0;c < column;c++) { //計算每個字串在陣列中的位置 int index=c * row + r; //確保訪問陣列的安全性 if(index < stringNum) { //輸出指定的格式,這句程式碼值得再看 print(saveString[index],c == column-1? lenOfMaxString:lenOfMaxString+2,' '); } } //每行完了換行 cout<<"\n"; } } }
eclipse下執行結果:
知識點重點補充
1.向上取整與向下取整
向下取整:row = stringNum/column;
向上取整:row = (stringNum - 1)/column + 1
2.三目運算子解析(待補充)
print(saveString[index],c == column-1? lenOfMaxString:lenOfMaxString+2,' ');
題目2:資料庫(明天更)
思路:
直觀思路:寫一個四重迴圈遍歷r1,r2,c1,c2,但是列舉量太大,效率太低,會超時
高效思路:
1.獲取使用者輸入的資料庫儲存在二維陣列當中
2.只列舉
題目3:PGA巡迴賽的獎金