スタートガイド

例で学ぶ

新しい言語でプログラミングを行う方法を学ぶ最適な方法の 1 つは、多数のサンプル プログラムを確認することです。以下の各プログラムをコピーしてテキスト ファイルに貼り付けて、コンパイルすることをおすすめします。次に、試験運用版を試します。これらのサンプル プログラムを拡張することで、C++ のさまざまな側面に精通し、プログラムをゼロから作成する際に自信が持てるようになります。

例 1: コンパイラを動作させる

まだ行っていない場合は、次の従来のプログラムをコピーしてテキスト ファイルに貼り付けて、コンパイルしてください。コンパイルの手順については、こちらをご覧ください。

このプログラムの詳細はチュートリアルですでに学習済みであるため、ここでは行ごとの説明は行いません。ただし、読みやすさに関して注意すべき点がいくつかあります。プログラムを読みやすく、理解しやすく、維持しやすくするためのコメントと書式設定のことです。

  • 私たちが記述するすべてのプログラムはヘッダー コメントから始まり、作成者の名前、連絡先情報、簡単な説明、用途(該当する場合)が記載されます。どの関数も、オペレーションと使用方法についてのコメントから始まります。
  • コード自体が文書化されていない場合(処理が難しい、自明でない、興味深い、重要な場合など)は、完全な文を使用した説明コメントが追加されます。
  • 常にわかりやすい名前を使用します。変数は、my_variable のように小文字の単語を「_」で区切ったものです。MyExcitingFunction() のように、関数名では大文字を使用して単語をマークします。kDaysInWeek のように、定数は「k」で始まり、単語をマークするときに大文字を使用します。
  • インデントは 2 の倍数にします。最初のレベルは 2 つのスペースです。さらにインデントが必要な場合は、4 つのスペース、6 つのスペースなどを使用します。
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

次のようなテストをお試しください。

  • 最も重要なことは、このプログラムをコンパイルして実行できることを確認することです。
  • 上のプログラムを変更して「Hello World!」と出力するようにします。1 行に 4 回、6 行で、それぞれが 17 スペースのフィールドに印刷されます。そのためには、for ループを使用します。cout で出力をフォーマットする方法については、こちらをご覧ください。解答を確認するには、こちらをクリックしてください。
  • 先ほどのプログラムを使用して、「Hello World!」を 17 個のスペースからなるフィールドに左揃えで出力する方法を見つけ出してください(デフォルトは右揃えです)。解答を確認するには、こちらをクリックしてください。

例 2: 入力を取得する

cin を使用すると、C++ でキーボードから簡単に入力できます。次に例を示します。

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

テスト:

  • 入力エラーが発生すると、ストリームが「中断」され、cin が false を返し、プログラムが停止します。上記のプログラムのように、このようなエラーを防ぐことが非常に重要です。しかし、プログラムを停止するのではなく、エラーから回復したい場合はどうすればよいでしょうか。エラーから復旧するには、次の 2 つのステップがあります。
    1. cin.clear() を使用してエラーをクリアします。
    2. ストリームから間違った文字を削除します。1 つの方法は、cin.ignore() を使用することです。

この 2 つのステップを使用して、不正な入力から回復するプログラムを作成します。Google を使用して、これらの方法の仕組みを検索してください。こちらからソリューションをご確認ください。

例 3: このプログラムの出力内容

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

例 4: 分解によりすべてが容易になる...

コンピュータ ゲームの作成を始めましょう。最初の例は少しシンプルですが、ほんの始まりです。私たちのタスクは、推測ゲームを実装するプログラムを作成することです。このプログラムは 0 ~ 100 の乱数を生成します。プレーヤーは秘密の番号を推測する必要があります。プログラムは、プレーヤーが最終的に秘密の数字を推測するまで、「高すぎる」または「低すぎます」などのヒントを提供します。

このゲームには 3 つのステップで取り組みます。 

  1. 特定の値の範囲から乱数を生成する方法を探る。
  2. プレーヤーからの 1 つの推測を処理してヒントを提供する main 関数を作成します。
  3. プレーヤーが数字を推測するまで、複数の推測を許容するために必要なものを追加します。

この開発プロセスは「分解」と呼ばれ、簡単に実行できるタスクをサブタスクに分割します。

ステップ 1 から、Google 検索を行い、C++ を使用して乱数を生成する方法を確認します。「rand C++」で検索してみてください。解決策はこちらです。

ステップ 2 では、プレーヤーから整数入力を受け取り(cin で適切なエラーチェックを行い)、それをシークレット番号と照合する必要があります。解決策を確認する前に、ゲームのこの部分をご自身で作成してみてください。

最後に、プレーヤーが最終的にシークレット 番号を推測するまで、プレーヤーの推測を収集し続けるループを追加する必要があります。プログラムのこの部分が完了したら、Google の解決策を確認できます。

分解は、プログラマーが習得すべき最も重要なスキルの一つです。プロジェクトの規模に関係なく、タスクを扱いやすい断片に分割し、一度に 1 つずつ完了できることは重要です。他にも、分解を練習できる機会をいくつかご紹介します。

  • 日常業務の多くは、分解のスキルを身に付ける機会を提供します。あなたの頭が、次のように動いていることに気が付くかもしれません。

    たとえば、散らかったキッチン(小さな女の子がケーキを焼くだけではないか)を片付ける必要がある場合、作業を分割して計画を作成し、後で作業をやり直さなくても済むようにします。カウンターにいろんなものが置いてあるから、先に床を洗いたくないの。たぶん後で床を洗わなければならないかもしれない。食材をすべて片付け、食器をすべてシンクに移し、カウンターをきれいにして食器を洗い、最後に床を掃除するかもしれません。このタスクを実行する方法は他にもありますが、まずよく考えておいてください。繰り返し作業が不要なプランを定義するのに役立ちます。

    分解スキルを磨くための例として、日常的なタスクを使用します。そうすれば家での移動の効率も向上するかもしれませんね。

  • 2 つの整数の最大公約数は、両方を均等に割る最大数です。たとえば、gcd(12, 18) = 6、gcd(-4, 14) = 2 となります。 gcd を計算する最も効率的な方法は、ユークリッド アルゴリズムを使用することです。2 つの整数の gcd を計算する関数を持つプログラムを作成します。まず、再帰をせずに関数を実行してみてください。アルゴリズムの仕組みを理解するのに役立ちます。

    サブタスクを明示的に定義する(たとえば、ユークリッド アルゴリズムのコードを見つける、アルゴリズムの非再帰関数を作成するなど)。こちらが解決策です。

例 5: 数学パズル

コンピューティングの強みの 1 つは、問題の解決策をブルート フォース サーチできることです。問題によっては、試行錯誤するだけでうまくいく場合があります。実際、コンピュータはそのような問題に特に適しています。次の点を考慮してください。

馬は 10 ドル、豚は 3 ドル、ウサギはわずか 0.5 ドルです。ある農家が 100 頭の動物を 100 ドルで 買ったとします 

この問題に対する非常にシンプルな解決策があります。Google のガイドをご覧になる前に、実装されているかどうかご確認ください。

別の方法を試してみましょう。
6 冊の書籍を本棚に左から右に並べる方法はいくつありますか。

今回は解答するだけで、プログラムを記述できます。 720

例 6: 検討する文字列

次のプログラムの出力内容は次のうちどれですか。

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

詳しくは、こちらをクリックしてください。

例 7: 分解による次のステップ - 作業初日

あなたは、高級エクササイズ シューズを専門に扱っている ExerShoe の会社で、1 足約 225 ドルの価格を製造する販売員の職に就きました。上司から 3 つの選択肢が提供されました。これらは、初日の開始前に選択する必要があります。

  1. 週 600 ドルの定額給
  2. 1 時間あたり $7.00 の給与 + 販売に対する 10% のコミッション
  3. 給与なし(ただし、販売された靴 1 組につき 20% のコミッションと 20 ドル)

C++ プログラマーは、最適な報酬の選択に役立つプログラムを作成できると考えました。

大規模なプログラムで分解を行う場合の一般的なアプローチは、問題を解決するための概要のように読み取るメイン関数を作成することです。次に、各タスクを実行する関数を記述します。

メイン プログラムの最初のパスは次のとおりです。

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

Google の解決策をご覧になる前に、各関数を実装できるかどうかをご確認ください。

例 8: 利用できる地域

次のプログラムの出力はどれですか。

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

答えを見つけたら、こちらでコメント版コードを確認してください。

例 9: ファイルの処理

C++ のファイル処理は fstream を使用して行われます。ファイルに保存するには、ofstream を宣言し、「out」モードで開きます。以下の例で確認してください。

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • 作成したファイルを開き、データを表示する方法がわかるかどうかを確認します。こちらで解決策をご覧ください。
  • このプログラムを変更して、ユーザーがループを使用して多数のデータレコードを入力できるようにするかどうかを確認します。また、すべてのデータを一度に 1 レコードずつ読み取る必要があります。こちらで解決策をご覧ください。

これで、ご自身でエクササイズやプロジェクトに挑戦する準備が整いました。

Google でソフトウェア エンジニアとは

Google での働き方については、こちらのウェブサイトをご覧ください。

演習とプロジェクト

基本的な C++ を使った演習では、さらに演習を行います。このコースでは、他の受講者と一緒に受講してほしいため、これらの演習とプロジェクトに対する解答は提供しません。

  1. 現在の気温に正比例して鳴る一般的なフィールド クリケットの音。 クリケットが 1 分間に鳴る回数に 40 を足し、その値を 4 で割ると気温が得られます。1 分あたりのチャープ数を入力として受け取り、現在の温度を出力するプログラムを作成します。次に例を示します。
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. 受講しているプログラミング コースの最終成績を計算するプログラムを作成します。採点方法は以下のとおりです。
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    プログラムでは、4 つの課題スコア、中間成績、最終成績、セクション成績をユーザーに求めます。その後、最終スコアが計算されて出力されます。計算するには、4 つの課題スコアの平均に 0.4(40%)を掛けます。そして、中間スコアに 0.15、最終スコアに 0.35、参加成績に 0.1 を掛けます。そして、これらの乗算のすべての結果を合計します。

    このプログラムでは、可能な限りどこでも関数を使用します。入力を取得する関数を作成するには、説明となる cout に表示される文字列をパラメータとして渡します。実行の例を次に示します。

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. 電子ストップウォッチがより安く、より正確になるにつれ、信じられないほど正確な時刻の測定にうんざりすることはないでしょう。秒単位で指定される時間を入力として受け取り、それが表す時間、分、秒を出力するプログラムを作成します。次に例を示します。
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. 以下では、プログラムを作成する前に分解を行います。可能な場合は関数を使用して、適切に構成されたプログラムを作成する。

  5. 次のバナーを出力するとします。

    「FREEZY BREEZE MAKES 3 TREES TREES」

    これはバナーなので、文字をかなり大きくします。

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    など

    優れた問題分解者であれば、すべての cout を main 関数に含めるよりも、関数に入れる方がはるかに効率的であることにお気づきでしょう。たとえば「printE」関数と「printZ」関数などを使用できます。

    文字が繰り返し出現する単語またはフレーズのバナーを作成する関数を含むプログラムを作成します。次のような用途が考えられます。

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. これは「マジック ナンバー」問題です。ユーザーに、最初の数字が最後の数字より大きい 3 桁の数字を入力するよう求めます。プログラムは、元の数値を逆にして、その逆数を減算します。最後に、結果の数字を反転し、反転していない形式に追加します。最終結果を出力します。ユーザーが入力する元の番号は、整数型である必要があります(3 文字は使用できません)。整数を入力として受け取り、その数値の逆を返す関数を記述する方法を考えてみてください。以下に例を示します。
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. この法律では、食品メーカーは商品に有効期限を設定することが義務付けられていますが、法律に抜け穴があります。特定の形式に有効期限を設定する必要はありません。そのため、スワヒリ語で書いても合法です。

    ラルフ ネーダーの 3 人目のいとこであるナディーンさんは、自称食品品質スパイです。 その結果、多くの食品メーカーが商品の有効期限をエンコードして、ユーザーに古さを知らせないようにしていることを知りました。

    ただし、食料品店はなんらかの理由でエンコードを行って有効期限を判断できます。

    一般的なエンコード方法は次のとおりです。

    • 1 月から 12 月までの月を「A」から「L」にエンコードする
    • 日付の各桁を「Q」~「Z」にエンコードする
    • 年を「A」~「Z」(1 ~ 26 を意味する)でエンコードし、1995 を加えます。

    ナディーンさんは、この日付の「ARZM」という疑問に思われるパンを見つけました。 日付を決定するプログラムを作成します。

  8. これは、有名なカードトリックに例える。3 桁の数字を入力するようにユーザーに依頼します。この数字は ABC(A、B、C は 3 桁の数字)だと考えてください。ABC、BCA、CAB を 11 で割ったときの余りを求めます。余りを X、Y、Z と呼びます。X + Y、Y + Z、Z + X で足してください。合計が奇数である場合は、11 ずつ増減します(どちらの演算の結果が 20 未満の正数になります。合計が 9 の場合は、それを報告してプロセスを中止します)。最後に、それぞれの合計を半分に割ります。結果の数字は A、B、C です。このアルゴリズムを実装するプログラムを作成します。

アプリケーション: アニメーションによる音楽の可視化

ソフトウェア エンジニアは、さまざまな興味深い革新的なアプリケーションを作成します。このコースの各モジュールでは、エンジニアが設計、実装したさまざまなアプリケーションについて説明します。これは、エンジニアが担当するさまざまな分野の理解に役立ちます。

こちらは、音楽を可視化するために作成された、興味深いアプリケーションの一つです。