マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Stadio C++講義
第1章 プログラミングを体験しよう!


第6話 コードの1行1行の意味とコードを書く上での注意点


#include <iostream>
using namespace std;
int main() {
    cout << "こんにちは" << endl;
    return 0;
}

では、1行1行意味を説明していきます。

尚、説明されても現時点では理解できない話も混ざります。

なぜなら、プログラミング講義は推理小説と同じで最後まで読まないとわからないからです。

プログラミング講義と書きましたが、

すべての学問がすべて推理小説と同じで最後まで読まないとわからないのです。

これは、ヘーゲルの弁証法についての発言「全体は部分であり、部分は全体である」であるからです。

あるいは哲学的解釈学という学問があり、

その中で解釈学的循環という言葉が出てきます。

「全体を理解するには、部分を理解しなければならず、

部分を理解するためには、全体を理解できなければならない。」

全体と部分の関係は無限循環になります。

部分を読むときに、全体を理解しておらず、

全体を最後まで通して読んだとしても部分の理解が不十分なので、

全体の理解も当然不十分となります。

そして2回目の読解に進んだとしても全体の理解が不十分なので、

2回目の読解でも部分は正確には理解できません。

ですから、無限循環です。

ショーペンハウアーは『読書について』という本で、

読書は2回しなければならないと言っています。

「全体を理解するには、部分を理解しなければならず、

部分を理解するためには、全体を理解できなければならない。」

であるからです。

先に述べた通り、

解釈学的循環は無限に続くので正確には無限回読まなければならないことになりますが、

私たちの人生は長くて100年です。

同じ本を10回も20回も読む時間はありません。

ですが、本当に理解したい本(そういう本が生涯に何冊かあってよいと思います)であれば10回から20回は読むべきです。

この講義も現時点ですべて理解しようとする姿勢は、

間違いです。

完全に理解してから次に進むという完璧主義は、

理解の邪魔になります。

今の時点はなんとなくわかればよいのです。

そして、ある程度読んだら最初から読み直すことを繰り返すことが正しい学習法です。

この学習法はエビングハウスの忘却曲線の研究とも一致します。

エビングハウスの研究によれば、一所懸命に覚えたとしても1週間で9割忘れ、

1カ月で99%忘却することがわかっています。

忘れなくする方法は
「忘れる前の反復です」

ところが、皆さん逆をやっています。

「忘れてからの反復です」

これは何回やっても忘れます。

脱線が長くなりますが、大事な話ですので入れておきます。

効率的な反復のタイミングは

① その日に反復

② 次の日の朝に反復

③ ②の3日後に反復

④ ③の1週間後に反復

⑤ ④の2週間後に反復

⑥ ⑤の1か月後に反復

⑦ ⑥の半年後に反復

です。これでほぼ生涯記憶になることが証明されています。

⑦は念押しですので、①から⑥をやれば充分です。

この勉強法(①~⑦)を①~⑦までを使って生涯記憶に変えてください。

そして、あらゆる入試や資格試験に活かしてください。

脱線終わりです。


#include <iostream>
using namespace std;
int main() {
    cout << "こんにちは" << endl;
    return 0;
}

まず、1行目です。

#include <iostream>

#includeは<>中のファイルをインクルード(読み込む)することを意味します。

iostreamはファイルの出し入れに関するファイルです。

インクルードファイルは学習が進展してくと増えていきます。

using namespace std;

はcout << "こんにちは" << endl; を使うために必要なお呪いです。

正確には私も理解していません。

cout << "こんにちは" << endl; は

黒い画面(コンソール)に""で挟んでいる内容を打ち出す働きがあります。

cout << "こんにちは" << endl;

の最後から2番目のendlは改行を意味します。

そして、最後の;は文章の句点『。』に相当して文の終わりを示します。

最後から2番目の行

    return 0;



int main() を終わりにするときのお呪いだと思ってください。

さらに、
#include <iostream>//インクルードファイルの読み込み

using namespace std;//coutを使うときに必要なお呪い

int main() {

    cout << "こんにちは" << endl;//コンソール画面への表出

    return 0;//int main() を終わるためのお呪い

}

と書くようにすることをお勧めします。

見やすくするためです。

//の書いてある文は注釈文と言い、

コンパイラ(これは次話で詳しく解説します)はこの文を無視します。

「コンパイラはこの文を無視します」

の文は今の時点では

「コンピュータはこの文を無視します」

であると理解してください。

自分の言葉に直して学習していくことはとても大切なことです。

ただし、その時点での理解が不十分な可能性もあるので、

繰り返して読み返すことが重要となるわけです。

//・・・をコンピュータは無視するのになぜ入れた方がよいのでしょうか。

あなたが将来プログラマーになりたいと考えていれば、

プログラマーは会社ではチームプレイをすることになります。

ですから、チームのメンバーにコードの意味を解説することは大変重要となります。

実は、もう一人に解説しています。

もう一人とは誰ですか。答えは20行下に。






















答え 自分です。自分のために解説するのです。

えっ、どうして?

ですね。

私の最近の体験を語ってその答えとします。

9×9数独の自動生成ソフトの開発に成功して、

16×16、25×25、・・・、と数独を一般化しようとしていました。

ところが、何か月やってもうまくいかないのです。

16×16、25×25はVBA時代に成功していますので、

そのコードを印刷して原因を探ろうとしました。

ところが、私は空白行を嫌うので隙間なくコードが書いてあるのに、

印刷したらA4で144枚になりました。

大変だけど、なんとしても読み通して理解してC++版を成功させなければ

と思いました。

ところが、自分で書いたコードなのにまったく理解できないのです。

理由はコード書いてから10年以上経過してしまっていたからです。

若くタイピングが苦手だったころにプログラミングをするようになって、

注釈文を書かない悪習が身についてしまったのです。

それで、A4で144枚のコードが理解できずに苦しんだわけです。

まさに自業自得です。

ですから、コードは

#include <iostream>//インクルードファイルの読み込み

using namespace std;//coutを使うときに必要なお呪い

int main() {

    cout << "こんにちは" << endl;//コンソール画面への表出

    return 0;//int main() を終わるためのお呪い

}

のように書くように心がけましょう。

第6話最後の話題です。

第1章第1話で関数とはプログラムを構成する単位=細胞であると言いました。

今書いたコードにも関数が出ています。

int main() {

    cout << "こんにちは" << endl;//コンソール画面への表出

    return 0;//int main() を終わるためのお呪い

}

です。私は関数のことを社員とも言います。

現時点では社員は一人で社長兼社員です。

社長だけは名前を自分でつけることはできません。

社長名は int main()とC++の文法で定めらています。

これからたくさんの社員(関数)を雇って大きな会社になっていきます。

そして、仕事は社長(int main())自身がやらないで社員にやらせる習慣を身につけてください。

一つ言い忘れに気が付きましたので、

もう一つだけ辛抱して聞いてください。

全角文字をいれると唯一の例外を除いて必ずエラーします。

唯一の例外とはcout << "こんにちは" << endl;//コンソール画面への表出の""で挟んである部分です。

基本は半角文字での作業になります。

全角空白でさえビルド(次話で詳しく解説します)エラーします。


そして、コードを
#include <iostream>//インクルードファイルの読み込み
using namespace std;//coutを使うときに必要なお呪い
int main() {
cout << "こんにちは" << endl;//コンソール画面への表出
return 0;//int main() を終わるためのお呪い
}
と書いている人を見たことがありますが、

これは絶対にやってはいけない見本です。

int main() {

    cout << "こんにちは" << endl;//コンソール画面への表出

    return 0;//int main() を終わるためのお呪い

}

今のホームページビルダーは全角で文字を右に寄せても

エラーしないように工夫されていますが、

文字を右に寄せるときはスペースではなく必ずTabキーを使ってください。

全角のスペースが入ってしまうと必ずエラーするからです。

Tabキーを使うのは段差を大きくとるためです。
int main() {

 cout << "こんにちは" << endl;//コンソール画面への表出

 return 0;//int main() を終わるためのお呪い

}
ではだめなのです。

その理由は、for文などを学ぶとわかります。
int main() {

     for(int i=0;i<10;i++){
         for(int j=0;j<10;j++){

            ・・・
            ・・・
         }
     }

     return 0;//int main() を終わるためのお呪い

}

     for(int i=0;i<10;i++){
         for(int j=0;j<10;j++){

            ・・・
            ・・・
         }
     }
のように入れ子構造がわかるように書くべきだからです。

ホームページビルダーではTabキーが使えないので、

次善の策として全角スペースを使っているだけです。

ホームページビルダーで作ったコードをコピペしてもエラーしない理由は

おそらく、全角スペースを使っても自動的に半角スペース2個分にホームページビルダーの方が直してくれているからだと思われます。

昔のバージョンではエラーしましたから。

文字の右よせはスペースではなく必ずTabキーを使ってください。

尚、段組みはエディタ(プログラミング専用編集ソフト)が自動的にやってくれているので、

基本はそれに従ってください。

これで第6話は終了となり、

第1章の最終話である第8話では統合開発環境を詳しく解説いきますが、

その準備として、

第7話でEXEファイル=実行ファイルがどこにあるか探す手順を説明します。




第1章第5話へ 第1章第7話へ


 本講義トップへ