C++言語解説:1-1.学習の準備
2002-05-11

[概要] C/C++の言語を学習するための基礎を扱います。ここで取り上げた内容は、詳細と
    して後にもう一度学習することになります。(よっておまじない的内容です)。

[構成]・基本事項(1)
     * 最初のプログラム
     * 古いC++コンパイラへの対応
   ・基本事項(2)
     * 変数と標準入力を使う
   ・基本事項(3)
     * 2つの関数を利用する
     * 関数にデータを渡す


基本事項(1)

 最初のプログラム
 
  ・まずは、リスト1のコードを入力してみましょう。
  
   [List1.最初のプログラム]
   ┌───────────────────────────────────┐
    /* 最初のプログラム
      このプログラムを入力して、コンパイル/実行して下さい
    */
    
    #include <iostream>
    using namespace std;
    
    //main()でプログラム実行が始まる
    int main(){
      cout << "This is my first c++ program";
      
      return 0;
    }
   └───────────────────────────────────┘
   ┌───────────────────────────────────┐
    [実行結果]
    This is my first c++ program
   └───────────────────────────────────┘
 
  ・このリスト1のコードを眺めてみます。
  
  ・C++のコメント(*1)には2種類があります。
    //    : 単一行コメント, 改行までがコメント扱いとなります。
    /* 〜 */ : 複数行コメント, /* から */で囲まれた部分がコメントとなります。
  
  ・#include <iostream>
   + この行はヘッダの定義です。C++の機能を使用する際は、目的に応じたヘッダファ
    イル
をインクルードする必要があります。
   + リスト1のプログラムでは、標準出力定義coutを使用するために、ヘッダファイル
    iostream.hをインクルードしています。
  
  ・using namespace std;
    stdネームスペース(std namespace)の使用をコンパイラへ宣言している文です。
    これについては先に進まないと意味が理解できないので「今はおまじない」とし
    て扱って下さい。3-1章で説明する予定です。
  
  ・int main()
   + 全てのC++プログラムはmain()関数を持ちます(*2)。C++プログラムはmain()関数
    の呼び出しで始まり、多くの場合main()から戻ると終了
します。
    intはmain関数の戻り値型宣言です。intの示す型は整数(integer)です。
   + 関数等の記述は { で始まり、} で終わります(*3)。これはmain()以外の関数も同
    様です。
  
  ・cout << "This is my first c++ program";
   + コンソール(標準出力)への出力文です。標準出力coutへ文字列を渡すという
    文(statement)になっています。<< はデータを引き渡す演算子です(*4)
   + C++では文の終了を ; (セミコロン)で示します。
   + "This is my first c++ program"は文字列です。C++では文字列を " (ダブルクォ
    ーテーション)で囲んで表現します。

  
  ・return 0;
    returnはC++キーワードの一つで、関数から値を返すのに用います。多くのOSでは
    戻り値0が正常終了。それ以外が異常終了であることを意味します。


 古いC++コンパイラへの対応
 
  ・リスト1のコードは古いC++コンパイラではエラーの起きるケースがあります。
  
  ・#include <iostream>
   + iostram.hファイルをインクルードするという意味です。最新のC++では拡張子の
    .hを省略表記しますが、古いC++では「ファイルが見つからない」というエラーに
    なることがあります。この場合は
     #include <iostream.h>
    で記述すれば、エラーを回避できます。
   + ただし、最新のC++では、インクルードが必ずしも「ファイル」を意味しているわ
    けではないので、<iostream>記述を許しているコンパイラでは、この表記を勧め
    ます。
  
  ・using namespace std;
    ネームスペースの宣言ですが、古いコンパイラはグローバルネームスペースのみ
    サポートするので、この宣言は無効になります。従って「エラーが出たら削除す
    る」
が対応となります。


基本事項(2)

 変数と標準入力を使う
 
  ・次のコードでは変数と標準入力を使用し、少しだけコンピュータに仕事をさせてみ
   ます。

   [List2.変数と標準入力を使う]
   ┌───────────────────────────────────┐
    /* ==============================
      半径を入力して円の面積を求める
      ============================== */
    
    #include <iostream>
    using namespace std;
    
    int main(){
      float f_radius; //半径
      float f_space; //面積
      
      cout << "半径を入力して下さい :";
      cin >> f_radius;
      
      f_space = 3.14 * (f_radius * f_radius); //面積計算
      
      cout << "面積=" << f_space;
      
      return 0;
    }
   └───────────────────────────────────┘
   ┌───────────────────────────────────┐
    [実行結果]
    半径を入力して下さい :2.5
    面積=19.625
   └───────────────────────────────────┘
  
  ・float f_radius;
   + C++では全ての変数が使用する前に定義されていなければなりません。また、扱う
    データに合わせた変数の型(type)を宣言する必要があります。
   + この例では、半径データを保持するためにf_radiusという変数を定義し、小数点
    データとしてfloat(浮動小数点)型を適用しています。
   + その他の型については、後の教育で説明します。ちなみにC++では自分で型を定義
    することもできます。

  ・cin >> f_radius;
    cinはコンソール(標準入力)からの入力を意味しています。この文では、キーボー
    ドから入力したデータが、変数f_radiusへ代入されます。

  ・cout << "面積=" << f_space;
   + この文では標準出力に対し、文字列と数値という2つのデータを渡しています。動
    きとしては"面積="という文字列表示後に、f_spaceのデータを表示します。
   + データの型に関係なく出力制御できるという点、出力演算子によりデータを繋げ
    られる
ことがポイントです。


基本事項(3)

 2つの関数を使用する
 
  ・C++のプログラムは関数(function)と呼ばれる構築単位で構成されます。関数は1つ
   以上のC++文を含み、1つ以上のタスクを実行するサブルーチンです。
   
  ・次は2つの関数で構成されたプログラムを作ることにします(*5)
  
   [List3.2つの関数を利用する]
   ┌───────────────────────────────────┐
    /* ===========================
      2つの関数を含んだプログラム
      =========================== */
    
    #include <iostream>
    using namespace std;
    
    void Myfunc(); //プロトタイプ宣言
    
    int main() {
      cout << "mainで開始 :";
      
      Myfunc(); //Myfunc()を呼び出す
      
      cout << " mainへ戻る";
      
      return 0;
    }
    
    void Myfunc() {
      cout << " Myfunc実行 :";
    }

   └───────────────────────────────────┘
   ┌───────────────────────────────────┐
    [実行結果]
    mainで開始 : Myfunc実行 : mainへ戻る
   └───────────────────────────────────┘

  ・このプログラムは、main()関数内で
    cout << "mainで開始 :";
   を実行後、Myfunc()関数を呼び出して実行しています。Myfunc()関数実行後は再び
   main()に戻っています。
   
  ・void Myfunc();
   + これはMyfunc()関数のプロトタイプ宣言です。関数も変数と同様に、使用に先立
    ち型を宣言
しなければなりません。関数の場合宣言する型は戻り値です。ただし、
    main()関数は宣言の必要がありません。
   + ここで宣言されている戻り値型voidは「値を返さない」ことを意味しています。
    C++では何も値を返さない場合、void型として宣言します。
  
  ・void Myfunc() {・・・}
    Myfunc()関数はvoid型なので、return文を省略することができます。尚、
    Myfunc()関数の実態が同一ソースファイル内において、呼び出し側のmain()関数
    よりも前に定義されている場合、プロトタイプ宣言は必要ありません。


 関数にデータを渡す
 
  ・次は関数にデータを渡します。関数に渡される値は引数(argument)と呼ばれます。
  
   [List4.関数にデータを渡す]
   ┌───────────────────────────────────┐
    /* ==================
      関数にデータを渡す
      ================== */
    
    #include <iostream>
    using namespace std;
    
    int Space(int x, int y); //プロトタイプ
    
    int main()
    {
      int result;
      
      result = Space(3,3);
      cout << "結果=" << result;
      
      return 0;
    }
    
    int Space(int x, int y)
    {
      return (x * y);
    }

   └───────────────────────────────────┘
   ┌───────────────────────────────────┐
    [実行結果]
    結果=9
   └───────────────────────────────────┘
  
  ・List4では、Space()関数に2個の整数データを渡し、計算結果を整数として受け取る
   構造になっています。
  
  ・int Space(int x, int y)
   + 括弧内に記述された変数を仮引数(parameter)と呼びます。C++ではデータを引き
    渡す際に、値を仮引数へコピー
します。
   + 仮引数を持つ関数のことを仮引数付き関数(parameterized function)と呼びます。
    C++用のコンパイラは少なくとも256個の引数を渡せる決まりとなっていますが、
    あまり引数が多いのはプログラミングとしてナンセンスです。
   + 先頭のintはint型のデータを戻すことを意味しています。
  
  ・return (x * y);
    int型関数Space()の戻り値定義ですが、(x * y)の計算結果を戻す記述となってい
    ます。当然、データの型は一致していなければなりません。

                                      以上

(*1)原著では、良いコメントは以下のものだと書いています。(無意味なコメントが多いこ
  とへの批判らしい)

  [1]ソースファイル内の宣言の共通点、マニュアルの参照箇所、維持のための一般的ヒ
    ントなどを書いた個々のソースファイルについてのコメント。
  [2]各クラス、テンプレート、ネームスペースについてのコメント。
  [3]関数の目的、使っているアルゴリズム(見ればわかるような場合を除く)、環境に関
    連する前提条件などを書いた個々の関数(非常に単純なものは除く)についてのコメ
    ント。
  [4]個々のグローバル、ネームスペース変数、定数についてのコメント。
  [5]わかりにくい部分や移植性を持たない部分についての若干のコメント。
  [6]ごくまれなその他。
 
  ただし、教育資料のコードに含まれるコメントは、「教育目的」なので上記推奨条件か
  ら外れるものもあります。

(*2)Windowsプログラムなど、OSからのコール/イベント駆動で動作するものにはmain関数
  が含まれないこともあります。

(*3)C++では論理的に接続されたひとまとまりの記述文をブロックと呼びます。{ と } は
  ブロックの開始と終了を意味しています。

(*4)プログラミング経験者には、デバイスへデータを渡すのに「演算子」を使うという感
  覚がピンと来ないかもしれません。C++で標準出力を意味するcoutは、C++のグローバ
  ル(or標準)ネームスペースで予め用意されているシステムオブジェクトです。
  coutの本質的な理解には、オブジェクト指向の知識が必要なので、今は方法論のみ意
  識して下さい。

(*5)構造化プログラミングの原点は分割統治です。C/C++プログラムでは分割の単位が関数
  となります。洗練されたコードでは1つの関数で1つのタスクを実行するように整理さ
  れています。


[Revision Table]
 |Revision |Date    |Comments
 |----------|-----------|-----------------------------------------------------
 |1.00   |2002-05-11 |初版
 |1.01   |2002-05-18 |ファイル名変更
 |1.02   |2002-06-25 |リンク追加
 |1.03   |2002-06-30 |語句修正
[end]
Copyright(C) 2002 Altmo