競技プログラミング風 標準C++ライブラリ入門【第9回】


競技プログラミング風 標準C++ライブラリ入門【第9回】

これまでに競技プログラミング風 標準C++ライブラリ入門 を2シーズン、8回にわたりお届けしたが、各方面に好評だったので、 さらにおかわり(シーズン3)として【第9回】~【第12回】をお届けする。

標準C++ライブラリを知っていれば比較的簡単な問題をたくさん解いて、 標準C++ライブラリに親しんでいただこうというのが本連載の趣旨だ。

各問題は、「問題文」「テストコード」「ヒント」「解答例」「解説」から構成される。
まず、問題を読んで正しく理解し、テストコード部分をIDEやテキストエディタまたはweb上のコンパイラ (ideonなど)で保存・ビルド・実行し、 NGが出ないようにテストコードの「ToDo:」部分のコードを完成させてほしい。

「ヒント」「解答例」「解説」はデフォルトでは非表示になっており、中身を読みたい場合は【show】ボタンを押せば表示される。 これらをすぐに読むのではなく、ちゃんと解答を考え、使用する標準ライブラりのクラス・関数をweb検索して勉強し、 コード記述・ビルド・実行してからそれらを読むのを強く推奨する。なにごとも自分で考え、いろいろ試した上で、解答などを見るようにするのが肝要だ。 その方が解答が印象に残り問題解決方法が記憶に定着しやすいのだ。

目次

ソート済み?(難易度:★☆☆☆☆)

問題

引数で、配列アドレス・要素数を受け取り、配列要素が昇順にソート済みかどうかを判定する関数 bool my_is_sorted(const int ar[], int sz) を実装しなさい。

例えば、ar[]: {1, 1, 2, 5, 100}、sz: 5 が渡された場合は true を、ar[]: {1, 5, 2, 1, 100}、sz: 5 が渡された場合は false を返す。

#include <iostream>       //  標準入出力ライブラリ
#include <algorithm>
using namespace std;    //  std 名前空間使用
#define DO_TEST(exp)    do_test(exp, __LINE__)
void do_test(bool b, int line) {
    if( b ) return;     //  OK
    cout << "\nNG at line " << line << "\n";
    exit(1);
}
bool my_is_sorted(const int ar[], int sz) {		//	ar: 配列アドレス、sz: 要素数
    return true;      //  ToDo: 標準関数を使い、ここを書き換えて、ar[] の要素が昇順ソート済みかどうかを返す
}
int main() {
    const int ar1[] = {1, 1, 2, 5, 100};
    const int SZ1 = sizeof(ar1, sizeof(int));
    DO_TEST( my_is_sorted(ar1, SZ1) );
    const int ar2[] = {1, 5, 2, 1, 100};
    const int SZ2 = sizeof(ar2, sizeof(int));
    DO_TEST( !my_is_sorted(ar2, SZ2) );
    cout << "\nGood Job!\n";
    return 0;
}
ヒント
解答例
解説

複素数角度(難易度:★☆☆☆☆)

問題

X軸方向が実数、Y軸方向が虚数の複素平面上で、引数で与えられた複素数と原点を結んだ直線とX軸との角度 (反時計回りがプラス)を返す関数 int angle(const complex<double>& c) を実装しなさい。
なお、角度の単位は度(degree)とする。

例えば、実数1, 虚数1 が与えられた場合は 45 を返す。

#include <iostream>       //  標準入出力ライブラリ
#include <complex>
using namespace std;    //  std 名前空間使用
#define DO_TEST(exp)    do_test(exp, __LINE__)
void do_test(bool b, int line) {
    if( b ) return;     //  OK
    cout << "\nNG at line " << line << "\n";
    exit(1);
}
#define PI  3.1415926535
int angle(const complex<double>& c) {
    return 0;   //  ToDo: 標準ライブラリの関数を使い、複素数cのX軸からの角度を返す
}
int main() {
    DO_TEST( angle(complex<double>(1, 0)) == 0 );
    DO_TEST( angle(complex<double>(0, 1)) == 90 );
    cout << "\nGood Job!\n";
    return 0;
}
ヒント
解答例
解説

内積(難易度:★☆☆☆☆)

問題

const vector<int>& 型の引数 v1, v2 の2つを受け取り、それらの内積(Σv1[i]*v2[i])を返す関数 int my_inner_product(const vector<int>& v1, const vector<int>& v2) を実装しなさい。

ただし、v1, v2 のサイズが異なる場合は、小さい方のサイズ分の内積を計算するものとする。

#include <iostream>       //  標準入出力ライブラリ
#include <numeric>
#include <vector>
using namespace std;    //  std 名前空間使用
#define DO_TEST(exp)    do_test(exp, __LINE__)
void do_test(bool b, int line) {
    if( b ) return;     //  OK
    cout << "\nNG at line " << line << "\n";
    exit(1);
}
int my_inner_product(const vector<int>& v1, const vector<int>& v2) {
    return 0;      //  ToDo: 標準関数を使い、ここを書き換えて、v1 と v2 の内積を返す
}
int main() {
    vector<int> v1 = {1, 2, 3};
    vector<int> v2 = {7, 4, 3};
    DO_TEST( my_inner_product(v1, v2) == 24 );
    v1 = { 1, 2, 3, 4 };
    v2 = { 7, 6 };
    DO_TEST(my_inner_product(v1, v2) == 19);
    cout << "\nGood Job!\n";
    return 0;
}
ヒント
解答例
解説

関連記事

競技プログラミング風 標準C++ライブラリ入門【第12回】

競技プログラミング風 標準C++ライブラリ入門【第12回】 今回も、標準C++ライブラリの基本をマスターするための競技プログラミング風問題を解いていただこう。 問題を理解したら、テストコードをコンパイル・実行していただき […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第11回】

競技プログラミング風 標準C++ライブラリ入門【第11回】 今回も、標準C++ライブラリの基本をマスターするための競技プログラミング風問題を解いていただこう。 問題を理解したら、テストコードをコンパイル・実行していただき […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第10回】

競技プログラミング風 標準C++ライブラリ入門【第10回】 今回も、標準C++ライブラリの基本をマスターするための競技プログラミング風問題を解いていただこう。 問題を理解したら、テストコードをコンパイル・実行していただき […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第9回】

競技プログラミング風 標準C++ライブラリ入門【第9回】 これまでに競技プログラミング風 標準C++ライブラリ入門 を2シーズン、8回にわたりお届けしたが、各方面に好評だったので、 さらにおかわり(シーズン3)として【第 […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第8回】

競技プログラミング風 標準C++ライブラリ入門【第8回】 今回で本シリーズも最後だ。競技プログラミング風問題を解いて、標準C++ライブラリにより詳しくなっていただこう。 問題を理解したら、テストコードをコンパイル・実行し […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第7回】

競技プログラミング風 標準C++ライブラリ入門【第7回】 今回も、標準C++ライブラリの基本をマスターするための競技プログラミング風問題を解いていただこう。 問題を理解したら、テストコードをコンパイル・実行していただきた […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第6回】

競技プログラミング風 標準C++ライブラリ入門【第6回】 今回も、標準C++ライブラリの基本をマスターするための競技プログラミング風問題を解いていただこう。 問題を理解したら、テストコードをコンパイル・実行していただきた […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第5回】

競技プログラミング風 標準C++ライブラリ入門【第5回】 これまでに競技プログラミング風 標準C++ライブラリ入門 を4回にわたりお届けしたが、各方面に好評だったので、 おかわり(シーズン2)として【第5回】~【第8回】 […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第4回】

競技プログラミング風 標準C++ライブラリ入門【第4回】 今回で本シリーズも最後だ。今回も競技プログラミング風問題を解いて、標準C++ライブラリにより詳しくなっていただこう。 問題を理解したら、テストコードをコンパイル・ […]
コメントなし

競技プログラミング風 標準C++ライブラリ入門【第3回】

競技プログラミング風 標準C++ライブラリ入門【第3回】 今回も、標準C++ライブラリ入門のための競技プログラミング風問題を解いて、標準C++ライブラリに親しんでいただきたい。 問題を理解したら、テストコードをコンパイル […]
コメントなし
筆者:津田伸秀
プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が好き。迷走中・・・ ボードゲーム・パズル系アプリ開発・リリースしてます。
  • このエントリーをはてなブックマークに追加

PAGE TOP