1. 程式人生 > >C++程式設計 期末考試 程式設計題#7 字串排序

C++程式設計 期末考試 程式設計題#7 字串排序

這道題我卡在傳遞函式物件上,說到底函式物件實質是一個類的物件,只是通過過載()運算子達到函式的作用。所以定義函式物件為形參時,應該同普通型別一樣,以型別名+物件名的形式展現。

如此,我也發現函式物件和函式作為實參時的不同點:函式是直接寫函式名,函式物件則是類名+(),應該是生成了一個臨時引數。

--------以下是題目--------

描述

請按照要求對輸入的字串進行排序。

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A{
private:
        string name;
public:
        A(string n) :name(n){}
        friend bool operator < (const class A& a1, const class A &a2);
        friend bool operator == (const class A &a1, const class A &a2){
                if (a1.name.size() == a2.name.size())
                        return true;
                else
                        return false;
        }
        friend ostream & operator << (ostream &o, const A &a){
                o << a.name;
                return o;
        }
        string get_name() const{
                return name;
        }
        int get_size() const{
                return name.size();
        }
};
// 在此處補充你的程式碼
int main(int argc, char* argv[])
{
        list<A> lst;
        int ncase, n, i = 1;
        string s;
        cin >> ncase;
        while (ncase--){
                cout << "Case: "<<i++ << endl;
                cin >> n;
                for (int i = 0; i < n; i++){
                         cin >> s;
                         lst.push_back(A(s));
                }
                lst.sort();
                Show(lst.begin(), lst.end(), Print());

                cout << endl;
                lst.sort(MyLarge<A>());
                Show(lst.begin(), lst.end(), Print());
                cout << endl;
                lst.clear();
        }
        return 0;
}

輸入

第一行是正整數T,表示測試資料的組數

每組測試資料輸入共兩行,

第一行是正整數N,表示字串個數

第二行是N個字串, 字串間用空格分離

輸出

對於每組測試資料,先輸出一行:

Case: n

如對第一組資料就輸出Case: 1

第二行按照字串長度從小到大排序之後輸出N個字串,字串之間以空格間隔(不會出現字串長度相同的情況)

第三行按照字串首字元ASCII碼序從小到大排序之後輸出N個字串,字串之間以空格間隔(不會出現字串首字母相同的情況)

-------------以下是填充的程式碼--------------
bool operator < (const class A& a1, const class A &a2)
{
	return a1.get_size() < a2.get_size();
}
struct Print
{
	void operator()(A a) { cout << a<< " "; }
};

void Show(list<A>::iterator i, list<A>::iterator j, Print p)
{
	list<A>::iterator k = i;
	for (; k != j; k++)
		p(*k);
}
template<class T>
struct MyLarge{
	bool operator()(const T &t1,const T&t2)
	{
		return t1.get_name() < t2.get_name();
	}
};