技術者が教える初心者さんのためのC言語 -3ページ目

技術者が教える初心者さんのためのC言語

〜最小限の知識でプログラム〜

いつも感謝しています。Nです。

前回までの記事で、「条件分岐処理」として、
if文「もし~だったら・・・」
else「そうでなくて!」
switch「~の時はこう!」

「繰り返し処理」として、
while文「~の間は繰り返す」
for文「3つの式で繰り返し制御!」

についてお話してきました。

今回は、break文についてお話ししたいと思います。

このbreak文を使えるようになると、繰り返し処理の途中でも条件がそろえば、その繰り返し処理を中断して脱出できるようになります。

例えば、繰り返し処理の途中で、あるイベント(出来事)が発生したら、その繰り返し処理を中断したいといった場合にも使えますので、是非マスターしてくださいね。

では、具体的にお話していきます。

◆「break文」
まず押さえておくこととして、

break文には「抜ける!」とか「脱出する!」という意味がある

ということです。

では、何から「抜ける」のか?

それは、

1: break文を囲んでいる最も内側の、
 for文, while文, do~while文の{ }から抜けて、その「繰り返し処理」を終了する
2: break文を囲んでいる最も内側の、
 switch文の{ }から抜けて、そのswitch文の実行を終了する

になります。

つまり、
break文は、for文, while文, do~while文, switch文の{ }から脱出するためのもので、その{ }の中でbreak文に出会うとその後の処理を行わずに、break文を囲んでいるfor文, while文, do~while文, switch文の{ }から抜けて、その繰り返し処理やswitch処理を終了します。

例えば、
8時から17時まで通常会社で働くが、今日は10時になったら会社から脱出して外へ出かけるというようなプログラムを考えてみると、

int main( void )
{
 int  time;

   for( time = 8;  time <= 17;  time++ )
   {
        if( time == 10 )
        {
            /* timeが10になったから会社脱出! */
            printf("time:%d I will go out!¥n", time);
             break;
        }

        printf("time:%d I work in my office¥n", time);
   }
   return( 0 );
}
実行結果:
time:8 I work in my office
time:9 I work in my office
time:10 I will go out!

のようにbreak文を用いて書くことができます。

更に、「break文を囲んでいる最も内側の・・・の{ }」とは、出会ったbreak文が属しているfor文, while文, do~while文, switch文の{ }という意味です。

例えば、以下のようなfor文の中にfor文があるプログラムがあったとします。

int main( void )
{
    int  time;
    int  minute;

   for( time = 0;  time < 1;  time++ )
   {
       for( minute = 0; minute <= 60; minute ++ ) 
    {
             if( minute == 3 )
            {
                  break;
             }
             printf("I can not  concentrate...¥n");
             printf("%d[min] past….¥n", minute);
       }

       printf("I can  concentrate!!¥n");
       printf("I work very hard!¥n", time);
   }

   return( 0 );
}

実行結果:
I can not  concentrate...
1[min] past….
I can not  concentrate...
2[min] past….
I can  concentrate!!
I work very hard!

この場合、breakによって脱出するのは、赤色で示したfor文になります。最初のfor文を抜けるのではなくて、あくまでもbreakが属しているfor文を抜けるんだということに注意してくださいね。

そして、このことはfor文だけでなく、break文が使えるwhile文、do~while文、switch文についても同様です。

理解するためにも是非、今回のサンプルプログラムをいじって、色々と試してみてくださいね。
いつも感謝しています。Nです。

while文「~の間は繰り返す」で、「構造化定理」(順次、選択、繰り返し)というものがあるとお話しました。

「構造化定理」とは、プログラムのアルゴリズムは3つの基本ロジック(順次、選択、繰り返し)を組み合わせることで、全て書けてしまうというものでした。

今日は、”繰り返し”の中でも最もプログラムでよく使うfor文について、お話したいと思います。

このfor文は、まだ説明していませんが配列、構造体といったものと組み合わせて使うことで構造化プログラムというものを行うときに、非常に便利です。

構造化プログラムについては、また別の機会にお話したいと思います。

ここでは、for文というのは、繰り返し処理の中でもよく使うし、また構造化プログラムというものをするときにも後々重要になってくるんだなぁ、と押さえておいてくださいね。

では、具体的にfor文の基本についてお話していきます。

まず、for文では

3つの式で繰り返しを制御するんだ!

ということを押させておくことが重要です。

for文の基本型を書くと、

for( 初期化;継続条件;変化  )
{
 繰り返し処理;
}

のようになります。

うーん、「初期化式」「継続条件式」「変化式」難しい用語ですね。

要は、簡単に言うとfor文は、

forの後に続く( )の中のセミコロン(;)で区切られた3つの式で、{  }の中の繰り返し処理を
実行する
ものだということです。

非常に簡単な、サンプルプログラムを用いながら説明しますね。

int   main(  void  )
{
   int   a;

   for( a = 0;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

   return( 0 );
}

実行結果:
a=0
a=1
a=2

この場合、"a = 0", "a < 3", "a++"という3つの式で、繰り返し処理"printf("a=%d¥n", a );"を実行するということになります。

( )の中の左の式 "a = 0" の部分は、for文の実行時に、はじめの1回だけ実行されます。
つまり、「aという変数を0に初期化しなさい」という意味になります。

( )の中の真ん中の式 "a < 3"の部分は、「この条件式が成立している間は、繰り返し処理を実行しなさい」という意味になります。

( )の中の右の式 "a++"の部分は、「1回繰り返し処理が終わる毎にこの式を実行しなさい」という意味になります。

つまり、

   for( a = 0;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

の部分をステップに分解して説明すると、

Step0:初期化式 (a = 0;)を実行する(1回だけ)
Step1:継続条件式 (a < 3;) の条件が成立しているか判断する
    条件が成立している場合は、Step2へ進む
    条件が成立していない場合は、for文終了
Step2:成立しているならば、繰り返し処理文(printf文)を実行する
Step3:成立しているならば、変化式 (a++)を実行する
Step4:Step1へ戻る

a = 0;

a = 0 ・・・・・a < 3 OK
a = 0を表示
a++を実行・・・a = 1

a = 1・・・・・ a < 3 OK
a = 1を表示
a++を実行・・・a = 2

a = 2・・・・・ a < 3 OK
a = 2を表示
a++を実行・・・a = 3

a = 3・・・・・ a < 3 NG
→ for文終了

のようになります。


ここで、理解をよく間違えてしまう点として、上記の「Step3:成立しているならば、変化式 (a++)を実行する」の部分です。


つまり、このサンプルプログラムにおいて、for文を抜けた後のaの値は3になっているということです。

これを理解するために、次のサンプルプログラムを実行してみてください。

int   main(  void  )
{
   int   a;

   for( a = 0;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

   printf(" Final a = %d¥n", a);
   return( 0 );
}

実行結果:
a=0
a=1
a=2
Final a = 3

この例で言うと、「for文を抜けた後のaの値は3なのに、2だ」と非常に勘違いしやすい人が多いです。これは潜在的バグになる可能性がありますので注意してくださいね。

では、もう二つほど例を出しておきますね。

◆1つ目の例

int   main(  void  )
{
   int   a;

   for( a = 0;  a <= 2;  a++ )
  {
       printf("a=%d¥n", a );
   }

   printf(" Final a = %d¥n", a);
   return( 0 );
}

◆2つ目の例

int   main(  void  )
{
   int   a;

   for( a = 5;  a < 3;  a++ )
  {
       printf("a=%d¥n", a );
   }

   printf(" Final a = %d¥n", a);
   return( 0 );
}


この各々の場合のFinal aの値は、何になるでしょうか?実際にプログラムを書いて実行して確かめてくださいね。


いつも感謝しています。Nです。


この「番外編:Nのつぶやき」では、

私がいいなぁと思ったことなどを記載しています。


斉藤一人さんの本に


「失敗って、自分が未熟だから失敗するんです。

そして、あなたに失敗が必要だから起きたんです。

今はまだ、そんなことで失敗する腕しか持ってないの。

でもあなたは、「これで失敗する」ってことが学べました。

だから改良してまた挑戦すればいいんです。

最後に勝つのは自分なんだよ。

100回負けてもかまわないの。最後に勝てば、それで自分の

勝ちなんです。」


という文が出てきます。


自慢ではありませんが、私は結構失敗をします。

仕事でも、プライベートでも、人間関係でも、色々と。。。


そんな時、
「あー、やっぱり、”あれ”しなかった方が良かったよなぁ、はぁー」

って後悔の念が出てくるんですよね。

そして、しばらく落ち込んだりするんですよね。


でも、

ある程度落ち込んだときに、ふと、この斉藤一人さんの文章を

思い出すんですよね。


そして、


「そっか、俺はまだ、そんなことで失敗する腕しか持ってないのか」

「俺がまだ未熟だから、失敗したんだなぁ」

「でもこの失敗は、きっと必要だから起きたんだろうなぁ」

「うーん、まぁ確かにこれで失敗することが学べたな」

「そうか、改良して挑戦すればいいんだ、よし改良挑戦!、頑張ろう!」


って考え直します。


そうやっていると、落ち込んでいた自分から少しずつ回復しだして、


「今の自分に出来る具体的なことって何かなぁ?」

っていう思考が戻ってきます。


そして、具体的に自分ができることの中でも、一番簡単なことを見つけて、それを実行しだします。


どうやら、私にはこのような、繰り返し文がプログラミングされているようです(笑)。


読者の皆さん、いつも感謝しています。


読者の皆さんに、

すべての良きことがなだれのごとく

起きますように。


いつも感謝しています。Nです。

前回までの3つの記事
if文「もし~だったら・・・」
else「そうでなくて!」
switch文「~の時はこう!」
で条件分岐をお話してきました。

今日から、繰り返し処理(ループ処理)についてお話したいと思います。

「構造化定理」と呼ばれる定理があって、その定理によるとプログラムのアルゴリズムは以下の3つの基本的ロジックを組み合わせることで、全て書けてしまうと述べられています。

その3つの基本的ロジックとは、
順次
選択
繰り返し
です。

「順次」とは、「上から下に順番に実行文を書く」
「選択」とは、「条件分岐させて実行文を書く」
この2つは、すでに皆さんにこのブログを通してお話ししてきました。

実際、私も長年プログラムをしていて、細かいテクニックとかは、もちろんあるが、
この「順次」「選択」「繰り返し」の3つのロジックを基本的に組み合わせてプログラムをしているし、実際書けてしまうなぁと実感しています。

ですから、
今回からのテーマ「繰り返し」をマスターすることで、皆さんもこの3つを手に入れることができます。是非、「繰り返し」もマスターしこの3つの能力を手にいれてくださいね。

では、具体的に今日のテーマ「while文:~の間は繰り返す」についてお話していきます。

while文とは、同じことをある条件が成立している間は何度も行うという処理のことです。
while文の基本形としては、

while( 条件 )
{
 実行文;
}

while( 条件 )の部分では、「この条件が成立している間は」という意味になります。
{  }の中の部分が、「その間は、この処理を繰り返しなさい」という意味になります。

たとえば、「体力がある間は、働く」というのを考えてみましょう。

日本語を介したイメージ的なプログラムを書くならば、

while( 体力がある)
{
    働く
}

のような感じになります。

実際のプログラムの一例として書くならば

int  main( void )
{
    int   hp;   /* 体力 */

 hp = 10;  /* 体力の初期値 */

    while(  hp > 3 )
    {
        /*  体力が3より大きい間は */
  printf(" HP=%d ¥t", hp);
  printf("I work !!¥n");
       /*  体力1ずつ減少 */
     hp--;
    }
    return( 0 );
}

実行結果:
HP=10   I work !!
HP=9     I work !!
HP=8     I work !!
HP=7     I work !!
HP=6     I work !!
HP=5     I work !!
HP=4     I work !!

のようになります。実際にプログラムを書いて実行して確認してみましょうね。

さて、while文のもう一つの形として、

do
{
   実行文;
} while( 条件 );

というのもあります。

do{  }の部分では、「まずは有無を言わさず、{  }する」という意味になります。
while( 条件 );の部分で、「条件が成立しているなら、また繰り返す」という意味になります

先ほどの体力の例でプログラムを書くと

int  main( void )
{
    int   hp;   /* 体力 */

 hp = 10;  /* 体力の初期値 */

    do
    {
        /*  以下を実行する! */
  printf(" HP=%d ¥t", hp);
  printf("I work !!¥n");
       /*  体力1ずつ減少 */
     hp--;
    } while( hp > 3 );

    return( 0 );
}

実行結果:
HP=10   I work !!
HP=9     I work !!
HP=8     I work !!
HP=7     I work !!
HP=6     I work !!
HP=5     I work !!
HP=4     I work !!

のようになります。

ここで、「あれ?、while文とdo~while文の実行結果一緒だなぁ?」と思われた方がいると思います。「すごく、良いセンスをしている」と思います。

では、上記のwhile文の例、do~while文の例の中の、

hp = 10;  /* 体力の初期値 */ → hp = 2;  /* 体力の初期値 */

にして、実行しなおしてみてください。

どうなりましたか?
次の実行結果は、出来れば実際に実行してからみてくださいね。


whileの例の実行結果:
何も表示されない
do~whileの例の実行結果:
HP=2     I work !!

そう、
while文の場合は、最初に条件をみて繰り返しを実行するかどうかを決定します。
一方、
do~while文の場合は、ともかく”do”、する、そして条件を見て次繰り返すかどうかを決定する

という違いがあります。

今回の体力のプログラムの例をイメージ的に例えると、

while文の例は、
「会社に行く前に、今日は体力ないなぁ」と自己判断し、会社を休んだ。
do~while文の例は、
「ともかく会社に行って働いた、でも今日体力ない」と分かり、会社を早退した。

みたいなイメージですかね(笑)。

以上のことを、while文では押さえておけば良いかと思います。
また、while文とdo~while文の違いが、まだいまいち掴めないなぁという方は、まずは、while文だけでもマスターしましょうね。
(私の経験則では、do~while文はあまり使わないかなぁという感じがしています)

いつも感謝しています。Nです。

if文「もし~だったら・・・」else「そうでなくて!」の記事で、この"if"とか"else"を使うことで、その条件に応じて処理を分岐できるというお話をしました。

今日は、switch文についてお話したいと思います。

このswitch文も、カテゴリー的にいうと条件分岐のためのものです。

しかし、私は初心者のときに混乱しました。

「同じようなことをするのに、何故色々と方法があるの?」
「条件分岐とか言って、ifとかswitchとかあって、使い分けの基準は?」
などなど。

今日は、この使い分けの基準はどうするのかについても述べていこうと思います。

では、具体的に述べて行きます。

まずは、switch文は以下のように書きます。

◆switchの型
switch( 変数 )
{
    case  値1:
  処理1;
  break;
    case  値2:
  処理2;
  break;
    case  値3:
  処理3;
  break;
 ・
 ・
 ・
    case  値n:
  処理n;
  break;
    default:
  処理;
        break;
}



switch( 変数 )の部分では、「この変数の値が、」という意味になります。
case  値**: の部分では、「値**であるときこうしなさい」という意味になります。
処理**の部分では、こうしなさいという実際の処理を記載します。
break:の部分では、「switch文を終了しなさい」という意味になります。

default:
  処理;
  break;
の部分では、「どのcaseにもならないときは、ここの処理を実行しなさい」という意味になります。

switch文を使ったプログラムを実際に書いてみますね。
たとえば、順位に応じて、メダルの色を表示するプログラムを考えると、

int  main( void )
{
 int   rank;    /*  順位 */

 rank = 1;    /* 今回は順位に1を代入 */

 switch( rank )
    {
     case 1:    /* 順位が1位 */
  /*  金メダルと表示 */
         printf("Gold !!!¥n");
  /*  switch文をぬける(break!終了) */
         break;
     case 2:    /* 順位が2位 */
  /*  銀メダルと表示 */
         printf("Silver!!¥n");
  /*  switch文をぬける(break!終了) */
         break;
     case 3:    /* 順位が3位 */
  /*  銅メダルと表示 */
         printf("Bronze!¥n");
  /*  switch文をぬける(break!終了) */
         break;
     default:   /*  それ以外 */
  /*  メダル無しと表示 */
         printf("Nothing…¥n");
  /*  switch文をぬける(break!終了) */
         break;
     }
     return( 0 );
}

のように書けます。

つまり、switch文は、switch( 変数 )の変数の値が、「~の時はこう!」という処理を記載していきます。

上の例だと、順位rankの変数が1なので、case の後の数字が一致するcase 1: に記載されている処理を行います。

仮に変数の値が2の時は、case 2:に記載されている処理を、変数の値が3の時は、case 3:に記載されている処理、それ以外の変数の値のときは、default:に記載されている処理をしなさいというプログラムになります。

また、1位、2位、3位、99位の人には花束をあげるというような同じ処理をする場合には、caseを重ねて以下のように書くこともできます。

int  main( void )
{
 int   rank;    /*  順位 */

 rank = 1;    /* 今回は順位に1を代入 */

 switchrank )
    {
     case 1:    /* 順位が1位 */
     case 2:    /* 順位が2位 */
     case 3:    /* 順位が3位 */
     case 99:  /* 順位が99位 */
  /*  花束あげる */
         printf("We will give you flower !¥n");
  /*  switch文をぬける(break!終了) */
         break;
     default:   /*  それ以外 */
  /*  花束無し */
         printf("Nothing…¥n");
  /*  switch文をぬける(break!終了) */
         break;
     }
     return( 0 );
}

switch文の文法については、ここまでを押さえておけばよいと思います。

さて、上記の例(金、銀、銅、無し)をif文でも書いてみましょう。

int  main( void )
{
 int   rank;    /*  順位 */

 rank = 1;    /* 今回は順位に1を代入 */

   if( rank == 1 )
   {
        printf("Gold !!!¥n");
   }
   else if( rank == 2 )
   {
         printf("Silver!!¥n");
   }
   else if( rank == 3 )
   {
         printf("Bronze!¥n");
   }
   else
  {
         printf("Nothing…¥n");
   }
   return( 0 );
}

そう、書けてしまうんですよね。そしてこれが、書けるのだったら、どっちを使えばよいの?使い分けの基準は?という混乱が生じてしまうんですよね。

ここで思い出して欲しいのが、記事「面倒くさがり屋さんは素質がある」です。

プログラムを整理するポイント
1: 同じようなコードを何度も書いているところは無いか
2: 思考の流れが止まってしまうところは無いか

上記のif文だとrankというのを何度も書いている。
更に、if文は「もし~だったら」という思考、switch文は「~の時はこうする」という思考
です。

上記のプログラムのswitch文とif文の思考を言葉で表すと、
switchの場合は
「1位の時は、case1を実行」
「2位の時は、case2を実行」
「3位の時は、case3を実行」
「それ以外は、defaultを実行」
if文の場合は、
「順位が1位ならば、~を実行」
「そうでなくて、順位が2位ならば、~を実行」
「そうでなくて、順位が3位ならば、~を実行」
「そうでない場合は、~を実行」
となります。

今回のように、あらかじめ「値がこの時はこう」と分かっている場合は、switch文の方が思考の流れが途絶えません。また、後で新しい値が出てきたときも、switch文の方がコードを修正しやすいです。

まとめると、

1:   「一つの変数の値」に応じて、処理を変える場合
2: 「値がこの時はこう!」とある程度事前に分かっている場合
3:  「新しい値の時の処理が後で追加になる可能性」がある場合


はswitch文を使うと思ってもよいと思います。

例えば、ロボットの状態に応じて処理を振り分ける場合とかは、このswitch文を使うと非常にプログラムそして思考が整理されます。

ロボットのプログラム設計段階で、ロボットの状態を大きく分けて5段階に分けたとします。プログラムをしている段階で、もしかしたらロボットの状態を更に細分化するかもなぁと考えたとします。

この場合、ロボットの状態を1の時は、10の時は、20の時は、30の時は、40の時はと飛び飛びでswitch文を作ります。そして後で1の動作をもう少し細分化したいなと思ったら、2の時は、3の時はと追加することもswitch文なら楽にできてしまいます。

イメージ的なプログラムとしては、
int main( void )
{
    int  robotSts;   /*  ロボット状態 */

    switch( robotSts )
 {
     case 1:
         /* ロボットの状態が1の時の処理 */
         break;
     case 2:
         /* ロボットの状態が2の時の処理(1の処理を更に細分化の為追加) */
         break;
     case 3:
         /* ロボットの状態が3の時の処理(1の処理を更に細分化の為追加) */
         break;
     case 10:
         /* ロボットの状態が10の時の処理 */
         break;
     case 20:
         /* ロボットの状態が20の時の処理 */
         break;
     case 30:
         /* ロボットの状態が30の時の処理 */
         break;
     case 40:
         /* ロボットの状態が40の時の処理 */
         break;
     default:
         /* ロボットの状態がそれ以外の時の処理 */
         break;
    }
 return( 0 );
}

のようになります。

以上、今日は色々書きましたが、初心者の方はまずはswitch文の型を知っておくこと、
意味は「~の時はこう!」なんだということを押さえておけば良いと思います。

実際にプログラムをされている方で、あまりswitch文を使ってなかった方は、switch文を使うことで、思考が整理される書き方ができるかなぁと考えてみてくださいね。



いつも感謝しています。Nです。


この「番外編:Nのつぶやき」では、

私がいいなぁと思ったことなどを記載していきます。


斉藤一人さんの本に


「とにかく大切なのは、

夢に対して具体的にできることから始めること。

どんな遠い道のりでも、一歩踏み出せば、

その分、必ず夢に近づくことができるからね

忘れちゃいけないよ。」


という文が書かれています。


私は、プログラムを長年書いているためなのか分かりませんが、

実生活においても、

結構自分の頭の中でif文を多用し、その結果自分自身が動けなくなるときがあります。

しかも、そのif文は悪いパターンのif文で、

「もし、~ならば・・・こうなって・・・うーん駄目だ」のように。


そんな時、この斉藤一人さんの文章を思い出し、

「夢に対して具体的に出来きることから始めるんだった」

「今の自分に出来る具体的なことって何だろう?」
と考え直します。


そして、具体的に自分が出来ることの中でも

一番簡単なことを見つけて、それを実際にやります。


そうやってやると、案外自分が最初にこれは無理だ~って思ったことも少しずつできるようになってくるのを実感できたりします。


読者の皆さんに、いつも感謝しています。

読者の皆さんに、

すべての良きことがなだれのごとく

起きますように。



いつも感謝しています。Nです。

前回の記事「if文「もし~だったら・・・」」で、if文の基本を紹介しました。
ifの( )の中の条件式が成立したときに、{ }の中の文を実行するというものでした。

今回は、その続きです。
その条件式が成立しない場合に、実行させたい文がある時どうすればよいかについてお話しますね。

前回、今回のif文をマスターすることで、場合分けをするプログラムが書けるようになります。そしてこれをマスターすることで、かなりのことがプログラムで書けるようになりますので、是非マスターしてくださいね。

では、具体的にお話していきますね。

例えば、
「降水確率が30%以上ならば」→「傘をもって出かける」
そうでないならば」→「傘はもって出かけない」
というパターンの場合です。

このような場合には、C言語ではif-else文を用います。if-else文の形式は、

if( 条件式 )
{
 実行文A;
}
else
{
    実行文B;
}

のようになっていて、

もし条件式が成立するならば、実行文Aを行い、そうでないならば、実行文Bを行う」という意味になります。
つまり、elseの後の{ }の中で、条件式が成り立たないときに実行させたいものを書きます。

上の降水確率の例をプログラムで書くと、一例として

int  main( void )
{
   int  rainRate;

   rainRate = 20;   /* 今日の降水確率 20% */

   if( rainRate  >= 30 )
  {
      /* 降水確率 が30%以上の時に実行させたい */
       printf("I will go out  with my umbrella");
  }
  else
 {
  /* そうではない場合(降水確率が30%以上でない場合) */
      printf("I will go out  without my umbrella");
 }

  return( 0 );
}

のようになります。

更に、このelse文には条件を付けることもできます。
「そうでなくて、~ならば」というようにすることもできます。

例えば、

「もし降水確率が80%以上ならば」
→「傘をもって出かける」
そうではなくて、降水確率が30%より大きくて80%未満ならば
→「折りたたみ傘をもって出かける」
「そうでないならば、」
→「傘をもって出かけない」

このような場合、elseの後にifを付け加えます。形式としては、

if( 条件式 )
{
   実行文A;
}
else if( 条件式2 )
{
   実行文B;
}
else
{
   実行文C;
}

のようになっていて、

もし条件式が成立するならば、実行文Aを行い、そうでなく条件式2ならば、実行文Bを行い、そうでないならば、実行文Cを行う」という意味になります。

上の降水確率をプログラムで書くならば、一例として、

int  main( void )
{
    int   rainRate;

   int  rainRate = 40;

  if( rainRate >= 80 )
  {
      /*  降水確率が80%以上の時の実行文を書く */

  }
  else if(  (30 < rainRate) && (rainRate < 80) )
  {
  /*  そうでなくて、もし30% < 降水確率 < 80% ならばの実行文を書く */

  }
  else
 {
 /* そうでない場合の実行文を書く */

  }

  return( 0 );
}

のようになります。

elseがつくと、「そうでなくて」となると覚えておくとよいと思います。


if文に関しては、ここまで押さえておけば大丈夫だと思います。

いつも感謝しています。Nです。

今日は、if文「もし~だったら・・・」というものについてお話したいと思います。

私たちは日常生活で「もし~だったら・・・」のような思考を用いて、自分の行動を振り分けたりしています。

例えば、
天気予報を見て傘を持って出かけるかどうか判断するときに

「もし雨が振っていたならば(降水確率100%)」
→「傘をさして出かける」
「もし今日の降水確率80%以上ならば」
→「傘を持って出かける」
「もし今日の降水確率30%より大きくて80%未満ならば」
→「折りたたみ傘を持って出かける」
「もし今日の降水確率30%以下ならば」
→「傘は持って出かけない」

のようなことを考えると思います。

今日のif文をマスターすることで、C言語のプログラムにおいても、コンピュータにこのような条件分岐をさせて、実行する処理を振り分けることができますので、是非マスターしてくださいね。

では、具体的にif文「もし~だったら・・・」について話していきますね。

◆if文の基本形1
if文の基本形1は以下のような形をとります。

if(条件式)
{
   実行文;
}

if(条件式)の部分が「もし~だったら」に相当します。
「・・・する」の部分が{ }でくくられた中に記載されている実行処理文に相当します。

例えば、上の例で「もし今日の降水確率80%以上ならば、傘を持って出かける」をC言語でプログラムするならば、一例として

int   main( void )
{
 int   rainRate;   /* 降水確率を入れる変数 */

 rainRate = 80;  /* 今日の天気予報の降水確率が80% */

 if( rainRate >= 80 )
 {
  /* もし、今日の降水確率が80%以上ならば */

  /* 傘を持って出かける */
  printf("I will go out with my umbrella¥n");
 }

 return( 0 );
}

のように書きます。

ここで、if( 条件式 )の括弧の中に、「~以上」「~以下」「より大きい」「~未満」「等しい」「等しくない」などの条件式をいれます。

C言語での条件式の表現としては、まず覚えておいて欲しいのは、
 「a == b」: aとbは等しい
 「a != b」 :aとbは等しくない
 「a >= b」:aはb以上( bはa以下 )
 「a <= b」:aはb以下( bはa以上 )
 「a < b」  :aはb未満( bはaより大きい )
 「a > b」  :aはbより大きい( bはa未満 )
となります。

更にこの条件式を組み合わせる方法もあります。

上の例で言うならば、「もし今日の降水確率30%より大きくて80%未満ならば」というところに相当します。

これは、「今日の降水確率が30%より大きく」 且つ 「80%未満」ならばと考えることができます。

この場合、if( (30 < rainRate) && (rainRate < 80) )のように「&&」を用いて、条件式を組み合わせて、表現することができます。

C言語での条件式の組み合わせ表現としては、覚えておいて欲しいのは、

 「A && B」 : A 且つ B
 「A || B」 」 : A 或は B

となります。

今回はif文の基本形1「もし~だったら・・・」について、お話しました。身の回りのものを、このif文を使ったらどう表されるだろうなぁと考えてみて、できればプログラムで表現してみてくださいね。

いつも感謝しています。Nです。

前回の記事「変数のイメージをつかもう」から、Helloシリーズは一旦停止し文法の説明に入っています。

今日は、足し算、引き算、かけ算、わり算についてお話したいと思います。

足し算、引き算、かけ算、割り算って小学校の算数でならいましたね。基本的にはC言語でも一緒です。

一方、C言語特有の数値演算子もあります。例えば "++,  += "とかです。C言語のプログラムでは結構この特有の数値演算子が出てきます。これについても、説明していきますので是非マスターしてくださいね。

では具体的に話していきます。

四則演算子
いわゆる算数でならった足し算、引き算、わり算です。

1: 足し算
 記号は" + "を用います。
2: 引き算
 記号は" - "を用います。
3: かけ算
 記号は" * "を用います。
4: わり算
 記号は" / "を用います。
5: 余り
 記号は" % "を用います。

上記の5、"余り"について、少し説明しますね。
例えば、"5 ÷ 3 = 1 余り2" と算数ではなりました。この"余り"をC言語で取得したい場合に"%"という記号を用います。

具体的にプログラムを書くと、

int  main(  void  )
{
 int  x;

 x =  5 % 3;
 printf("x=%d¥n", x);

 return( 0 );
}

x = 5 % 3; の部分で5÷3の余りを xに代入しなさいと指示しています。
上記プログラムを実行すると、x=2 と表示されます。

代入を伴う演算子(代入演算子)
代入を伴う演算子(代入演算子)?、難しい言葉ですね。
要は、+=, -=, *=, /=, %= の記号を使ったものです。
x = x + 3; のような形をした式は、x += 3; と記載することも出来るということです。

もう少し具体的に述べると
 x += 5; ならば、x = x + 5; 「x + 5を計算してその値を再度xに代入しなさい」
 x -=  5; ならば、x = x - 5;  「x - 5を計算してその値を再度xに代入しなさい」 
 x *= 5; ならば、x = x * 5;  「x * 5を計算してその値を再度xに代入しなさい」
 x /=  5; ならば、x = x / 5;   「x / 5を計算してその値を再度xに代入しなさい」
 x %= 5;ならば、x = x % 5; 「x % 5を計算してその値を再度xに代入しなさい」

プログラムを書くと、
int  main( void )
{
   int  x;

  x = 7;
  x += 5;   /* x = x + 5; */
  printf("x=%d¥n", x);

  x = 7;
  x -= 5;   /* x = x -5; */
  printf("x=%d¥n", x);

  x = 7;
  x *= 5;  /* x = x * 5; */
  printf("x=%d¥n", x);

  x = 7;
  x /= 5;  /* x = x / 5; */
  printf("x=%d¥n", x);

  x = 7;
  x %= 5;  /* x = x % 5; */
  printf("x=%d¥n", x);

 return( 0 );
}

実行結果:
x=12
x=2
x=35
x=1
x=2

となります。実際にプログラムを書いて実行してみましょうね。

◆単項演算子(インクリメント演算子、デクリメント演算子)
また、難しい言葉ですね。
要は、++, -- の記号を使ったものです。
これは、その変数の値を1増加させなさい、1減少させなさいという意味になります。

具体的にプログラムを書くと、
int  main( void )
{
   int  x;

   x = 3;
   x++
   printf("x=%d¥n", x);

   x = 3;
   x--
   printf("x=%d¥n", x);

  return( 0 );
}

実行結果:
x=4
x=2

x++の部分で、「xの値を1増加させた値をxの値にしなさい」
x--の部分で、「xの値を1減少させた値をxの値にしなさい」
ということになります。

まずは、足し算、引き算、かけ算、わり算につて以上のことを押さえておきましょう。

最後に、今日のプログラムの具体例も「3つの手順」で、実際に実行してくださいね。
いつも感謝しています。Nです。

前回の記事「Helloを自分の好きな位置に表示しよう」
http://ameblo.jp/engineertalksc/entry-12093085578.html
で、端末の特定の位置に文字を表示することが出来るようになったと思います。

次に、この「Hello」を時間とともに移動させたいと考えているのですが、その前にいくつかの文法的知識を学ぶ必要があります。

今日は「変数」について、少しお話ししたいと思います。

変数の概念を知ることは、非常に重要で、これを知らずしてプログラムを書くというのは不可能と言っても過言でないぐらい重要です。
また、今後予定している「Helloを動かすプログラム」を作成していくときにも、「変数」は使いますので、是非マスターしてみてくださいね。

では、「変数」の説明にはいりますね。

中学生のときに、数学で方程式というものを習ったのを覚えていますか?
「x」とか「y」とかを使った、そう、"あれ"です。

例えば、「y = 2x + 3」という方程式があったとします。

この方程式の変数xに2を代入すると、変数yには2 × 2 + 3で7が代入され、変数yの値は7になりましたね。

実は、プログラムの「変数」はこの方程式の「変数」の概念に非常に近いのです。

つまり、
「変数」とはデータをその中に代入することができ、それを用いることが出来るものなのです。

では、プログラムの「変数」と方程式の「変数」は全く一緒かというと違う点があります。それは、

方程式の変数には、数値しか代入出来なかったのですが、プログラムの変数には数値以外にも文字列とかを代入することが出来るという点です。

そのためプログラムで変数を使う場合、何を代入する為の変数かを最初にコンピュータに宣言してあげる必要があります

「文字列を代入するための変数を、私は使いますよ、準備してください」
「整数を代入するための変数を、私は使いますよ、準備してください」
「小数を代入するための変数を、私は使いますよ、準備してください」

変数の宣言方法としては、
 型式 変数名;
のように記載します。
型式は、その変数に何を代入したいかで決まってきます。

まずは少し大雑把ですが、以下3つのような分類で覚えておいてもOKだと思います。

1:文字列を代入できる変数を宣言したい場合
 char   変数名;
2:整数を代入できる変数を宣言したい場合
 int   変数名;
3:小数を代入できる変数を宣言したい場合
 double   変数名;

では、具体的に
上の方程式「y = 2x + 3」において、変数xに2を代入したときのyの値を表示するプログラムを書いてみたいと思います。

int  main( void )

{

int  x;

int  y;  


x = 2;


y = 2 * x + 3;


printf("y=%d", y);


return( 0 );

}


int x;  int  y;  の部分で
「私は整数を代入する変数xとyを使いますので、準備してください」とコンピュータに宣言しています。

x = 2; の部分で
「準備してくれた変数xに2を代入してください」とコンピュータに指示しています。

y = 2 * x + 3; の部分で
「その変数xを用いて、2x + 3を計算して、準備してくれている変数yにその結果を代入してください」とコンピュータに指示しています。

以上のことを、「変数」に関してはおさえておけば、まずは大丈夫だと思います。

最後に、今日の具体例のプログラムも「3つの手順」で実行してみてくださいね。