1. 程式人生 > >C++STL練習(3)

C++STL練習(3)

題目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巡迴賽的獎金