第10講 関数の学習
第6話 第4話問題解答例と関数の意義


解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         String^ wr=L"";
         String^ v;
         gakki1();
         v=label1->Text;
         wr=wr+v;
         gakki2();
         v=label1->Text;
         wr=wr+v;
         gakki3();
         v=label1->Text;
         wr=wr+v;
         goukei();
         v=label1->Text;
         wr=wr+v;
         heikin();
         v=label1->Text;
         wr=wr+v;
         label1->Text=wr;
      }

      void gakki1(void){
         char i;
         char j;
         String^ w=L"";
         int yg;
         int tg;
         w=w+L"1学期の成績\n";
         w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
         for(i=0;i<40;i++){
           if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
           if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
           yg=0;
           for(j=0;j<5;j++){
             a[i][j]=rand() %100;
             yg=yg+a[i][j];
             if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
             if((a[i][j]>=10) & (a[i][j]<100))w=w+(a[i][j]).ToString()+L" ";
           }
           if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
           if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
           if(yg>=100)w=w+yg.ToString()+L"\n";
         }
         w=w+L" 合計 ";
         for(i=0;i<5;i++){
           tg=0;
           for(j=0;j<40;j++){
             tg=tg+a[j][i];
           }
           if(tg<10)w=w+L"000"+tg.ToString()+L" ";
           if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
           if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
           if(tg>=1000)w=w+tg.ToString()+L" ";
         }
         w=w+L"\n"+L"\n";
         label1->Text=w;
      }

      void gakki2(void){
         char i;
         char j;
         String^ w=L"";
         int yg;
         int tg;
         w=w+L"2学期の成績\n";
         w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
         for(i=0;i<40;i++){
           if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
           if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
           yg=0;
           for(j=0;j<5;j++){
             b[i][j]=rand() %100;
             yg=yg+b[i][j];
             if(b[i][j]<10)w=w+L"0"+(b[i][j]).ToString()+L" ";
             if((b[i][j]>=10) & (b[i][j]<100))w=w+(b[i][j]).ToString()+L" ";
           }
           if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
           if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
           if(yg>=100)w=w+yg.ToString()+L"\n";
         }
         w=w+L" 合計 ";
         for(i=0;i<5;i++){
           tg=0;
           for(j=0;j<40;j++){
             tg=tg+a[j][i];
           }
           if(tg<10)w=w+L"000"+tg.ToString()+L" ";
           if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
           if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
           if(tg>=1000)w=w+tg.ToString()+L" ";
         }
         w=w+L"\n"+L"\n";
         label1->Text=w;
      }
      void gakki3(void){
         char i;
         char j;
         String^ w=L"";
         int yg;
         int tg;
         w=w+L"3学期の成績\n";
         w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
         for(i=0;i<40;i++){
           if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
           if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
           yg=0;
           for(j=0;j<5;j++){
             c[i][j]=rand() %100;
             yg=yg+c[i][j];
             if(c[i][j]<10)w=w+L"0"+(c[i][j]).ToString()+L" ";
             if((c[i][j]>=10) & (c[i][j]<100))w=w+(c[i][j]).ToString()+L" ";
           }
           if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
           if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
           if(yg>=100)w=w+yg.ToString()+L"\n";
         }
         w=w+L" 合計 ";
         for(i=0;i<5;i++){
           tg=0;
           for(j=0;j<40;j++){
             tg=tg+a[j][i];
           }
           if(tg<10)w=w+L"000"+tg.ToString()+L" ";
           if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
           if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
           if(tg>=1000)w=w+tg.ToString()+L" ";
         }
         w=w+L"\n"+L"\n";
         label1->Text=w;
      }

      void goukei(void){
         char i;
         char j;
         String^ w=L"";
         int yg;
         int tg;
         w=w+L"1年間の合計\n";
         w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
         for(i=0;i<40;i++){
         if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
         if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
         yg=0;
         for(j=0;j<5;j++){
           yg=yg+(a[i][j]+b[i][j]+c[i][j]);
           if((a[i][j]+b[i][j]+c[i][j])<10)w=w+L"00"+((a[i][j]+b[i][j]+c[i][j])).ToString()+L" ";
           if(((a[i][j]+b[i][j]+c[i][j])>=10) & ((a[i][j]+b[i][j]+c[i][j])<100))w=w+L"0"+((a[i][j]+b[i][j]+c[i][j])).ToString()+L" ";
           if((a[i][j]+b[i][j]+c[i][j])>=100)w=w+((a[i][j]+b[i][j]+c[i][j])).ToString()+L" ";
         }
         if(yg<10)w=w+L"000"+yg.ToString()+L"\n";
         if((yg>=10) & (yg<100))w=w+L"00"+yg.ToString()+L"\n";
         if((yg>=100) & (yg<1000))w=w+L"0"+yg.ToString()+L"\n";
         if(yg>=1000)w=w+L"0"+yg.ToString()+L"\n";
       }
       w=w+L" 合計 ";
       for(i=0;i<5;i++){
         tg=0;
         for(j=0;j<40;j++){
           tg=tg+(a[i][j]+b[i][j]+c[i][j]);
         }
         if(tg<10)w=w+L"000"+tg.ToString()+L" ";
         if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
         if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
         if(tg>=1000)w=w+tg.ToString()+L" ";
       }
       w=w+L"\n"+L"\n";
       label1->Text=w;
    }

    void heikin(void){
       char i;
       char j;
       String^ w=L"";
       int yg;
       int tg;
       w=w+L"1年間の平均\n";
       w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
       for(i=0;i<40;i++){
         if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
         if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
         yg=0;
         for(j=0;j<5;j++){
           yg=yg+((a[i][j]+b[i][j]+c[i][j])/3);
           if(((a[i][j]+b[i][j]+c[i][j])/3)<10)w=w+L"0"+(((a[i][j]+b[i][j]+c[i][j])/3)).ToString()+L" ";
           if((((a[i][j]+b[i][j]+c[i][j])/3)>=10) & (((a[i][j]+b[i][j]+c[i][j])/3)<100))w=w+(((a[i][j]+b[i][j]+c[i][j])/3)).ToString()+L" ";
         }
         if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
         if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
         if(yg>=100)w=w+yg.ToString()+L"\n";
       }
       w=w+L" 合計 ";
       for(i=0;i<5;i++){
         tg=0;
         for(j=0;j<40;j++){
           tg=tg+((a[i][j]+b[i][j]+c[i][j])/3);
         }
         if(tg<10)w=w+L"000"+tg.ToString()+L" ";
         if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
         if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
         if(tg>=1000)w=w+tg.ToString()+L" ";
       }
       w=w+L"\n"+L"\n";
       label1->Text=w;
    }
  };
}



(コピーペースト用

#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ wr=L"";
String^ v;
gakki1();
v=label1->Text;
wr=wr+v;
gakki2();
v=label1->Text;
wr=wr+v;
gakki3();
v=label1->Text;
wr=wr+v;
goukei();
v=label1->Text;
wr=wr+v;
heikin();
v=label1->Text;
wr=wr+v;
label1->Text=wr;


}
void gakki1(void){
char i;
char j;
String^ w=L"";
int yg;
int tg;
w=w+L"1学期の成績\n";
w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
for(i=0;i<40;i++){
if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
yg=0;
for(j=0;j<5;j++){
a[i][j]=rand() %100;
yg=yg+a[i][j];
if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
if((a[i][j]>=10) & (a[i][j]<100))w=w+(a[i][j]).ToString()+L" ";
}
if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
if(yg>=100)w=w+yg.ToString()+L"\n";
}
w=w+L" 合計 ";
for(i=0;i<5;i++){
tg=0;
for(j=0;j<40;j++){
tg=tg+a[j][i];
}
if(tg<10)w=w+L"000"+tg.ToString()+L" ";
if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
if(tg>=1000)w=w+tg.ToString()+L" ";
}
w=w+L"\n"+L"\n";
label1->Text=w;
}
void gakki2(void){
char i;
char j;
String^ w=L"";
int yg;
int tg;
w=w+L"2学期の成績\n";
w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
for(i=0;i<40;i++){
if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
yg=0;
for(j=0;j<5;j++){
b[i][j]=rand() %100;
yg=yg+b[i][j];
if(b[i][j]<10)w=w+L"0"+(b[i][j]).ToString()+L" ";
if((b[i][j]>=10) & (b[i][j]<100))w=w+(b[i][j]).ToString()+L" ";
}
if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
if(yg>=100)w=w+yg.ToString()+L"\n";
}
w=w+L" 合計 ";
for(i=0;i<5;i++){
tg=0;
for(j=0;j<40;j++){
tg=tg+a[j][i];
}
if(tg<10)w=w+L"000"+tg.ToString()+L" ";
if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
if(tg>=1000)w=w+tg.ToString()+L" ";
}
w=w+L"\n"+L"\n";
label1->Text=w;
}
void gakki3(void){
char i;
char j;
String^ w=L"";
int yg;
int tg;
w=w+L"3学期の成績\n";
w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
for(i=0;i<40;i++){
if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
yg=0;
for(j=0;j<5;j++){
c[i][j]=rand() %100;
yg=yg+c[i][j];
if(c[i][j]<10)w=w+L"0"+(c[i][j]).ToString()+L" ";
if((c[i][j]>=10) & (c[i][j]<100))w=w+(c[i][j]).ToString()+L" ";
}
if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
if(yg>=100)w=w+yg.ToString()+L"\n";
}
w=w+L" 合計 ";
for(i=0;i<5;i++){
tg=0;
for(j=0;j<40;j++){
tg=tg+a[j][i];
}
if(tg<10)w=w+L"000"+tg.ToString()+L" ";
if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
if(tg>=1000)w=w+tg.ToString()+L" ";
}
w=w+L"\n"+L"\n";
label1->Text=w;
}
void goukei(void){
char i;
char j;
String^ w=L"";
int yg;
int tg;
w=w+L"1年間の合計\n";
w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
for(i=0;i<40;i++){
if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
yg=0;
for(j=0;j<5;j++){
yg=yg+(a[i][j]+b[i][j]+c[i][j]);
if((a[i][j]+b[i][j]+c[i][j])<10)w=w+L"00"+((a[i][j]+b[i][j]+c[i][j])).ToString()+L" ";
if(((a[i][j]+b[i][j]+c[i][j])>=10) & ((a[i][j]+b[i][j]+c[i][j])<100))w=w+L"0"+((a[i][j]+b[i][j]+c[i][j])).ToString()+L" ";
if((a[i][j]+b[i][j]+c[i][j])>=100)w=w+((a[i][j]+b[i][j]+c[i][j])).ToString()+L" ";

}
if(yg<10)w=w+L"000"+yg.ToString()+L"\n";
if((yg>=10) & (yg<100))w=w+L"00"+yg.ToString()+L"\n";
if((yg>=100) & (yg<1000))w=w+L"0"+yg.ToString()+L"\n";
if(yg>=1000)w=w+L"0"+yg.ToString()+L"\n";
}
w=w+L" 合計 ";
for(i=0;i<5;i++){
tg=0;
for(j=0;j<40;j++){
tg=tg+(a[i][j]+b[i][j]+c[i][j]);
}
if(tg<10)w=w+L"000"+tg.ToString()+L" ";
if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
if(tg>=1000)w=w+tg.ToString()+L" ";
}
w=w+L"\n"+L"\n";
label1->Text=w;
}
void heikin(void){
char i;
char j;
String^ w=L"";
int yg;
int tg;
w=w+L"1年間の平均\n";
w=w+L"出席番号  国語  社会  数学  理科  英語 合計\n";
for(i=0;i<40;i++){
if(i+1<10)w=w+L" 0"+(i+1).ToString()+L" ";
if(i+1>=10)w=w+L" "+(i+1).ToString()+L" ";
yg=0;
for(j=0;j<5;j++){
yg=yg+((a[i][j]+b[i][j]+c[i][j])/3);
if(((a[i][j]+b[i][j]+c[i][j])/3)<10)w=w+L"0"+(((a[i][j]+b[i][j]+c[i][j])/3)).ToString()+L" ";
if((((a[i][j]+b[i][j]+c[i][j])/3)>=10) & (((a[i][j]+b[i][j]+c[i][j])/3)<100))w=w+(((a[i][j]+b[i][j]+c[i][j])/3)).ToString()+L" ";
}
if(yg<10)w=w+L"00"+yg.ToString()+L"\n";
if((yg>=10) & (yg<100))w=w+L"0"+yg.ToString()+L"\n";
if(yg>=100)w=w+yg.ToString()+L"\n";
}
w=w+L" 合計 ";
for(i=0;i<5;i++){
tg=0;
for(j=0;j<40;j++){
tg=tg+((a[i][j]+b[i][j]+c[i][j])/3);
}
if(tg<10)w=w+L"000"+tg.ToString()+L" ";
if((tg>=10) & (tg<100))w=w+L"00"+tg.ToString()+L" ";
if((tg>=100) & (tg<1000))w=w+L"00"+tg.ToString()+L" ";
if(tg>=1000)w=w+tg.ToString()+L" ";
}
w=w+L"\n"+L"\n";
label1->Text=w;
}
};
}



さて、関数の意義の1つは、大きなプログラムを小さな部品に分けて、
全体を見やすくする、分業が可能にする等です。

全体が見やすくなる、わかりやすくなるを感じ取ってもらうために、
少し複雑な例をとって、説明しましょう。

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

の中に同じ数字が重複していないかを判定させるプログラムを考えてみましょう。
同じ数字が重複しているとは、

   2  3  4
 5  6  7  8
 9 10 11 12
13 14 15  

の1のような場合です。
それではまず、ビルドして実行ボタンを押すと、
となるForm1を作りましょう。
もちろん、関数の学習ですからを作るのは関数にやらせましょう。
その関数をviod f1(void)にするとすれば
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           f1();
        }
        void f1(void){
             ・
             ・
             ・
となります。
さらに、関数viod f2(void)において、viod f1(void)で作った行列(方陣)に重複した数字がないかを調べるプログラムをしてみましょう。
この数字に重複がないかを調べるプログラムは、学習が進んでいくとコンピュータに魔方陣を試行錯誤で作らせるソフト作りに挑戦しますが、
その際に必要になってくる場合があります。
尚、第9講において4次と6次の魔方陣を作りましたが、
人間が見つけた法則に従って、コンピュータが人間の指示通りに動いただけであって、
コンピュータが自分で考えて魔方陣を発見したわけではありません。
人間が発見した魔方陣を再現しているにすぎません。
しかし、学習が進むとコンピュータに試行錯誤を繰り返えさせて、魔方陣を作らせるということに挑戦します。
この段階で、はじめてコンピュータが自ら考えて魔方陣を発見したと言えます。
学習が進むと26次魔方陣当たりでも1秒で数百個作れるようになります。
さらに、魔方陣のプログラムを応用してナンバープレイス(数独)の問題を作成するソフトの開発にも挑戦する予定になっています。


第5話へ 第7話へ



初心者のためのJava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすい vb 入門 vba 入門 基礎から応用まで 第1部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ