/******************************/ /* int, double, char * の加算 */ /* coded by Y.Suganuma */ /******************************/ #include <iostream> #include <string.h> /* クラスMojiの定義 */ class Moji { char *str; public: Moji(char *); // コンストラクタ(メモリ確保) Moji(const Moji &); // コンストラクタ(初期化) ~Moji() { delete [] str; } // デストラクタ Moji &operator= (const Moji &); // = のオーバーロード friend Moji operator + (Moji &, Moji &); // + のオーバーロード friend ostream& operator << (ostream&, Moji); // << のオーバーロード }; // コンストラクタ(メモリの確保) Moji::Moji(char *s) { str = new char [strlen(s)+1]; strcpy(str, s); } // コンストラクタ(初期化) Moji::Moji(const Moji &b) { str = new char [strlen(b.str)+1]; strcpy(str, b.str); } // +のオーバーロード Moji operator + (Moji &a, Moji &b) { char *s = strcat(a.str, b.str); Moji c(s); return c; } // =のオーバーロード Moji& Moji::operator= (const Moji &b) { if (&b == this) return *this; else { delete [] str; str = new char [strlen(b.str)+1]; strcpy(str, b.str); return *this; } } // << のオーバーロード ostream& operator << (ostream& stream, Moji a) { stream << a.str; return stream; } // 加算 template <class tp> tp add(tp a, tp b) { tp c = a + b; return c; } // main int main() { Moji a("test "), b("data"); std::cout << add(a, b) << std::endl; double d1 = 10.0, d2 = 0.7; std::cout << add(d1, d2) << std::endl; int i1 = 2, i2 = 3; std::cout << add(i1, i2) << std::endl; return 0; }
/****************************/ /* 任意のデータ型のソート */ /* coded by Y.Suganuma */ /****************************/ #include <iostream> #include <fstream> #include <stdlib.h> using namespace std; // クラスSort template <class tp, int size> class Sort { int size; // 最大データ数 int m; // 実際のデータ数 tp *p; public: Sort(char *); ~Sort() {delete [] p;} void print(); }; // コンストラクタ template <class tp, int size> Sort <tp, size> :: Sort(char *f_name) { // メンバー変数の設定 m = 0; p = new tp [size]; // データの読み込み ifstream in(f_name); while (m < size && !in.eof()) { in >> p[m]; m++; } // ソート int sw = 0; tp wk; while (sw == 0) { sw = 1; for (int i1 = 0; i1 < m-1; i1++) { if (p[i1] > p[i1+1]) { wk = p[i1]; p[i1] = p[i1+1]; p[i1+1] = wk; if (i1 != 0) sw = 0; } } } } template <class tp, int size> void Sort <tp, size> :: print() { for (int i1 = 0; i1 < m; i1++) cout << p[i1] << endl; } int main() { Sort < char, 20 > a("test1"); Sort < int, 20 > b("test2"); Sort < double, 20 > c("test3"); cout << "文字\n"; a.print(); cout << "整数\n"; b.print(); cout << "実数\n"; c.print(); return 0; }
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { // データの入力 int n = 15; vector <int> v; for (int i1 = 0; i1 < n; i1++) { int x; cin >> x; v.push_back(x); } // ソート sort(v.begin(), v.end()); // 余分なデータの削除 vector<int>::iterator it; it = v.begin(); it += 5; while (v.size() > 10) it = v.erase(it); // 結果の出力 for (it = v.begin(); it != v.end(); it++) cout << " " << *it; cout << endl; int s = 0; for (int i1 = 0; i1 < 10; i1++) s += v[i1]; cout << " 平均:" << s/10 << endl; return 0; }
#include <iostream> #include <set> using namespace std; int main() { // データの入力 int n = 15; set <int> s; for (int i1 = 0; i1 < 5; i1++) { int x; cin >> x; s.insert(x); } set<int>::iterator it; for (int i1 = 5; i1 < n; i1++) { int x; cin >> x; it = s.end(); it--; if (x < *it) { s.erase(it); s.insert(x); } } // 結果の出力 int m = 0; for (it = s.begin(); it != s.end(); it++) m += *it; cout << m/5 << endl; return 0; }
#include <iostream> #include <map> using namespace std; int main() { // データの入力 int n = 10; map <int, string, greater<int>> m; for (int i1 = 0; i1 < n; i1++) { int x; string s; cin >> x >> s; m.insert(pair<int, string>(x, s)); } // 結果の出力 map <int, string, greater<int>>::iterator it = m.begin(); int k = 0; while (k < 5) { cout << (*it).second << " " << (*it).first << endl; it++; k++; } return 0; }
#include <iostream> #include <set> using namespace std; // クラスの定義 class Test { public: int point; string name; Test(int p, string n) { point = p; name = n; } }; // 演算子のオーバーロード bool operator< (Test t1, Test t2) { return (t1.point > t2.point) ? true : false; } // 二項関数オブジェクト // 演算子のオーバーロードを使用する場合は必要ない class GT { public: bool operator() (Test t1, Test t2) const { return (t1.point > t2.point) ? true : false; } }; int main() { // データの入力 int n = 10; set <Test> st; // 演算子のオーバーロード // set <Test, GT> st; // 二項関数オブジェクト for (int i1 = 0; i1 < n; i1++) { int x; string s; cin >> x >> s; Test ts(x, s); st.insert(ts); } // 結果の出力 set <Test>::iterator it = st.begin(); // 演算子のオーバーロード // set <Test, GT>::iterator it = st.begin(); // 二項関数オブジェクト int k = 0; while (k < 5) { cout << (*it).name << " " << (*it).point << endl; it++; k++; } return 0; }
菅沼ホーム | 演習解答例目次 | 本文目次 | 付録 | 索引 |