第2講 変数を理解しよう

第1話 変数とは?


皆さん、第2講では変数を扱っていきます。
変数というと、数学を連想し身構えてしまう方もいらっしゃるかもしれませんが、
苦手意識を持つ必要は全くありません。
変数とは、数字や文字を入れる箱です。
これ以上難しく考える必要はさらさらありません。

では、例を作って説明していきましょう。
次のようなForm1を作り、
シートビルド(F5押すこと)すると
すべてのlabelに「東日本大震災の被災者の皆さん がんばれ!」と表示させるプログラムを考えてみましょう。
コーティング(プログラムの文章を書くこと)は、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           label1->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label2->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label3->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label4->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label5->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label6->Text=L"東日本大震災の被害者の皆さん がんばれ!";   
         }
  };
}
です。これでF5を押してビルドしてから実行ボタンを押すと、
実行例
となりますが、このプログラミングは芸がありません。
理由は同じことの繰り返しを人間がしているからです。
繰り返しはコンピュータにやらせるべきで、人間は極力作業量が少なくなるようにすべきです。
そこで文字や数字を収納する箱=変数を用意します。
変数名=箱の名前は、禁則を犯さなければ自由につけることができます。
禁則は、始めに数字が来てはいけない等ですが、
基本的にアルファベット、_(アンダーバー)、数字であれば自由につけられます。

現在のVisual C++の入門書やネットの初心者のためのページでは、
変数名を非常に長い難しい英単語で書くことを推奨しています。
ところが、変数名を難しい英単語にしていることが、初心者の理解を妨げる原因になっています。
初心者からすればforやifなどVisual C++の文法で定められている単語と自由につけられる変数名との区別が困難であるからです。
初心者は、変数を難しい英単語で書かれると、必ずそう書かなければならないと思ってしまうことに、
入門書の著者たちは思いが至らないのです。
短い変数名で貫いている私のVC++講義が各検索エンジンで1位にランクされ、
1日のトータルアクセスで3000から4000を数えていることが、
長くて難しい英単語の変数名が、如何に初心者の理解を妨げていたかを、如実に物語っているといえます。
コンピュータのメモリが小さかった頃は、変数名が短かったのですが、
メモリが大きくなってくると、変数名は何を表すかが明確になるように長い英単語で書くべきだとされてきたのです。
入門系のプログラミングのサイトとしては、VC++講義はダントツのトップです。
おそらく、変数名の付け方にまた革命が起きることでしょう。
本サイトによって、短い変数名が見直されるようになるでしょう。
例えば、1文字の変数でも、注釈文などで説明しておけば、混乱することはありません。
注釈文とは後でも説明しますが、冒頭に//のついた文章でこれをコンピュータは読み飛ばします。
つまり、注釈文はプログラムに何の影響も与えないのです。
注釈文は何のためにあるかといいますと、あくまで人間のためのものです。
プログラムを呼んでいる人が理解できるように解説したものが、注釈文です。

というわけで、本講座においては変数名は、基本は2文字以下のアルファベットと数字の組み合わせか、
漢字を使用します。

変数に戻りましょう。変数とは名前のついた箱です。
箱の名前が変数名です。
箱
文字型変数であれば、箱の中に文字が、
整数型変数であれば数字が入ります。
文字型変数の場合
箱に入力
整数型変数の場合
箱に整数を入力

変数名がaの文字型変数を用意するには、
String^ a;
と冒頭で書きます。String^の^が気になるでしょうが、
これもVC++使うアルファベットの余名ものだと解釈して下さい。
String^全体で1つに綴りで、文字型変数を意味すると理解して下さい。
^って何?考えるとわからなくなりますから、String^全体で1つの単語であると理解して下さい。

さて、この変数を使って先のコーティングを書き直すと、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           String^ a;
           a=L"東日本大震災の被害者の皆さん がんばれ!";
           label1->Text=a;
           label2->Text=a;
           label3->Text=a;
           label4->Text=a;
           label5->Text=a;
           label6->Text=a;
        }
   };
}


これでもF5を押して実行ボタンを押すと
変数を利用したソフト実行例
で同じ結果になります。
2つのコーティングを比べてください。
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           label1->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label2->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label3->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label4->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label5->Text=L"東日本大震災の被害者の皆さん がんばれ!";
           label6->Text=L"東日本大震災の被害者の皆さん がんばれ!";   
         }
  };
}

#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           String^ a;
           a=L"東日本大震災の被害者の皆さん がんばれ!";
           label1->Text=a;
           label2->Text=a;
           label3->Text=a;
           label4->Text=a;
           label5->Text=a;
           label6->Text=a;
        }
   };
}
変数を使うことによってかなりすっきりしました。
変数を使う意義はもちろんこれにつきません。
数字なら様々な計算(加法、減法、乗法、除法やそれの組み合わせなど)
ができます、文字の場合でも足し算ができるのです。
文字の足し算は、第2話で扱います。

その前に1つだけ断っておきたいことがあります。
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           String^ a;
           a=L"東日本大震災の被害者の皆さん がんばれ!";
           label1->Text=a;
           label2->Text=a;
           label3->Text=a;
           label4->Text=a;
           label5->Text=a;
           label6->Text=a;
        }
   };
}
は、例えば
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ a;
a=L"東日本大震災の被害者の皆さん がんばれ!";
label1->Text=a;
label2->Text=a;
label3->Text=a;
label4->Text=a;
label5->Text=a;
label6->Text=a;
}
};
}
と書いても、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           String^ a
;
           a=L"東日本大震災の被害者の皆さん がんばれ!";

           label1->Text=a;
           label2->Text=a;
           label3->Text=a;
           label4->Text=a;
           label5->Text=a;
           label6->Text=a;

        }
   };
}
と書いても影響はありません。

この中で一番いい書き方は、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           String^ a
;
           a=L"東日本大震災の被害者の皆さん がんばれ!";

           label1->Text=a;
           label2->Text=a;
           label3->Text=a;
           label4->Text=a;
           label5->Text=a;
           label6->Text=a;

        }
   };
}
です。理由は、この方がわかりやすいからです。
空白行と全角スペースによらない左右の位置は、コンピュータに影響を与えません。
ですから、何のために段組をしたり、空白行を入れるかというのは、
人間のためです。わかりやすくするためです。
例えば、私の作ったWindows版マルチスレッド対応の数独問題作成ソフトVer.1のソースの一部を紹介すると、
段組
意味に固まりごとに段組をするのと、
void totalkaiseki2(){
register char i1,i2,i3,i4;
char i1s,i2s;

for(i1=0;i1<9;i1++){
for(i2=0;i2<9;i2++){
if(mah11[i1][i2]==0){
for(i3=0;i3<9;i3++){
dhs1[i1][i2][i3]=0;
}
for(i3=0;i3<9;i3++){
if(mah11[i1][i3]>0)dhs1[i1][i2][mah11[i1][i3]-1]=1;
}
for(i3=0;i3<9;i3++){
if(mah11[i3][i2]>0)dhs1[i1][i2][mah11[i3][i2]-1]=1;
}
i1s=i1/3;
i2s=i2/3;
for(i3=0;i3<3;i3++){
for(i4=0;i4<3;i4++){
if(3*i1s+i3!=i1 && 3*i2s+i4!=i2 && mah11[3*i1s+i3][3*i2s+i4]>0)dhs1[i1][i2][mah11[3*i1s+i3][3*i2s+i4]-1]=1;
}
}
for(i3=0;i3<9;i3++){
if(dhs1[i1][i2][i3]==0){
rst1[i1][i2][cnn1[i1][i2]]=i3+1;
cnn1[i1][i2]++;
}
}
if(cnn1[i1][i2]==1){
iz1[chs1]=i1;
jz1[chs1]=i2;
chs1++;
}
}
}
}
ではわかりやすさが全く違っています。
段組と空白行を入れることによって、
わかりやすいプログラムを心がけてください。
だたし、くどいようですが全角スペースによる移動はエラーになりますので、絶対にやらないようにしましょう。


第1講第7話へ 第2話へ

025


vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る