第6講 簡易電卓ソフト作りに挑戦しよう
第8話 改善の解説の続き

if(y2==1){
    cn=cn+1;
    for(i=0;i<cn;i++){
        z=10*z;
    }
}

cnはプログラム冒頭
#pragma once
int y1;
int y2=0;

int cn=0;
double z=0;
double w;

で0とされ、また、i1のいずれかのボタンが押されたときも、

private: System::Void button11_Click(System::Object^ sender, System::EventArgs^ e) {
                    z=0;
                    cn=0;
                    w=0;
          y1=0;
 
                   textBox1->Text=L"";
}
private: System::Void button12_Click(System::Object^ sender, System::EventArgs^ e) {
                    if(y1==3){
                        z=w+z;
                        textBox1->Text=z.ToString();
                    }
                    if(y1==1){
                        z=w*z;
                        textBox1->Text=z.ToString();
                    }
                    if(y1==4){
                        z=w-z;
                        textBox1->Text=z.ToString();
                    }
                    if(y1==2){
                        z=w/z;
                        textBox1->Text=z.ToString();
                    }
                    y1=1;
                    w=z;
                    z=0;
                    y2=0;
                    cn=0;
}
private: System::Void button13_Click(System::Object^ sender, System::EventArgs^ e) {
                    if(y1==3){
                        z=w+z;
                        textBox1->Text=z.ToString();
                    }
                    if(y1==1){
                        z=w*z;
                        textBox1->Text=z.ToString();
                     }
                    if(y1==4){
                        z=w-z;
                        textBox1->Text=z.ToString();
                    }
                    if(y1==2){
                        z=w/z;
                        textBox1->Text=z.ToString();
                     }
                     y1=2;
                     w=z;
                     z=0;
                     y2=0;
                     cn=0;
                }
private: System::Void button14_Click(System::Object^ sender, System::EventArgs^ e) {
                     if(y1==3){
                         z=w+z;
                         textBox1->Text=z.ToString();
                     }
                     if(y1==1){
                         z=w*z;
                         textBox1->Text=z.ToString();
                     }
                     if(y1==4){
                         z=w-z;
                         textBox1->Text=z.ToString();
                     }
                     if(y1==2){
                         z=w/z;
                         textBox1->Text=z.ToString();
                     }
                     y1=3;
                     w=z;
                     z=0;
                     y2=0;
                     cn=0;
               }
private: System::Void button15_Click(System::Object^ sender, System::EventArgs^ e) {
                     if(y1==3){
                         z=w+z;
                         textBox1->Text=z.ToString();
                     }
                     if(y1==1){
                         z=w*z;
                         textBox1->Text=z.ToString();
                     }
                     if(y1==4){
                         z=w-z;
                         textBox1->Text=z.ToString();
                      }
                      if(y1==2){
                          z=w/z;
                          textBox1->Text=z.ToString();
                      }
                      y1=4;
                      w=z;
                      z=0;
                      y2=0;
                      cn=0;
              }
というように0となります。cnはi2が押された後、何回数字のキー顔されたかをカウントしています。
例えば、次の順でボタンが押されて事を想定してみましょう。
1→3→5→i3→6→3→8
こう押したとき、電卓では135.638となるので、135.628と表示されるようになって欲しいわけです。
1→3→5と押したとき、135となることは、『第4話 ボタン7,3などの解説』で既習済みです。
次にi4が押され、6のボタンが押されると、
private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) {
                    int i;
                    if(y2==1){
                        cn=cn+1;
                        for(i=0;i<cn;i++){
                            z=10*z;
                        }
                    }
                    if(y2==0)z=z*10;
                    z=z+6;
                    if(y2==1){
                        for(i=0;i<cn;i++){
                            z=z/10;
                        }
                    }

                    textBox1->Text=z.ToString();
               }
cn=cn+1;すなわちcn←0+1によって、cnは1となります。したがって、
for(i=0;i<cn;i++){
    z=10*z;
}
は1回だけ実行されますので、z←10×135によりz=1350となります。
そして、z=z+6すなわちz←1350+6によって、z=1356となります。
次に、
if(y2==1){
    for(i=0;i<cn;i++){
         z=z/10;
    }

}はcn=1ですから、1回だけ実行され、z=z/10すなわちz←z÷10の計算から、z=135.6と期待している結果が得られます。
次に3のボタンが押されれば、関数
private: System::Void button9_Click(System::Object^ sender, System::EventArgs^ e) {
                    int i;
                    if(y2==1){
                        cn=cn+1;
                        for(i=0;i<cn;i++){
                            z=10*z;
                        }
                    }
                    if(y2==0)z=z*10;
                    z=z+3;
                    if(y2==1){
                        for(i=0;i<cn;i++){
                            z=z/10;
                        }
                    }

                    textBox1->Text=z.ToString();
               }
が実行されます。cn=cn+1すなわちcn←1+1の命令からcn=2です。なので、今回は

for(i=0;i<cn;i++){
    z=10*z;
}
は2回実行されるので、z←135.6×10、z←1356×10の計算からz=13560となります。
z=z+3すなわちz←13560+3からz=13563です。
if(y2==1){
    for(i=0;i<cn;i++){
         z=z/10;
    }
}
も同じく2回実行され、z←13563÷10、z←1356.3÷10により、z=135.63と再び思うような結果になります。
最後に8が押され、
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
                    int i;
                    if(y2==1){
                        cn=cn+1;
                        for(i=0;i<cn;i++){
                            z=10*z;
                        }
                    }
                    if(y2==0)z=z*10;
                    z=z+8;
                    if(y2==1){
                        for(i=0;i<cn;i++){
                            z=z/10;
                        }
                    }

                    textBox1->Text=z.ToString();
               }
が実行されます。
cn←2+1からcnは3であり、
for(i=0;i<cn;i++){
    z=10*z;
}
は3回実行され、z←135.63×10、z←1356.3×10、z←13563×10から、z=135630
z=z+8すなわちz←135630+8からz=135638です。
if(y2==1){
    for(i=0;i<cn;i++){
         z=z/10;
    }
}
も3回実行され、z←135638÷10、z←13563.8÷10、z←1356.38÷10からz=135.638と、今回も期待通りの結果となります。

for(i=0;i<cn;i++){
    z=10*z;
}
は小数点を右にずらし、整数値に戻しています。そして、
if(y2==1){
    for(i=0;i<cn;i++){
         z=z/10;
    }
}

では、
for(i=0;i<cn;i++){
    z=10*z;
}
が小数点を右のずらした分を元に戻しているのです。

以上で、簡易電卓ソフトの話題を終了したいと思います。
長らくありがとうございました。

この講義では、第7講で2次元ループ、第8講でポインタを扱い、第9講では魔方陣に挑戦することになっています。



第7話へ 第7講第1話へ

a

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