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

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

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

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


記事

引数「関数に情報を渡そう!」
引数パート2「関数に複数の情報を渡そう」
引数パート3「おおもとの情報は勝手には変えられない&近日メルマガ発行予定のお知らせ」
で、関数に情報を渡すには引数を使うんだよということをお話してきました。


今回は、関数の返り値についてお話しますね。


たとえば、あなたが計算が苦手だったとします。

学校の授業で、先生から「1~100までの和と5051の値どっちが大きい?」と聞かれたとします。


こんなときに、そろばんをやっている友達がいたら助かりますよね(笑)。


友達に「1~100までの和を教えて!」って言えばその友達がパッって暗算して教えてくれる。

そして、その答えと、5051どっちが大きいが比較して、答えればいいですから(笑)


実は、このような仕組みが関数の返り値というのを使うことで出来てしまいます。


使い方次第では非常に便利な機能ですので、是非マスターしてくださいね。


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


上の例

「友達に「1~100までの和を教えて!」って言えばその友達がパッって暗算して教えてくれる」を分析してみると、


この場合の友達・・・和を計算してくれる関数

1~100まで ・・・・情報(つまり、引数)

友達からの返答・・・返り値(返答)


のようになります。


つまり関数の返り値とは、友達関数君?が返答してくれる値と言えます。


まずは先に、

実際に上の例を実現する自作関数のサンプルを記載してみますね。


int  friend( int  start,  int  end  )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = start; ii <= end; ii++ )

    {

         sum += ii;

    }


    return(  sum );

}


引数のお話のときに、出てきた関数とよく似ていますね。

では、違うところはどこでしょうか?


そう、return( sum ); の部分ですね。

(関数名は、今回のストーリと関連付けるためfriendにしています)


関数からの返答(返り値)させるには、returnの後の( )の中に返したい値をいれることでOKです。


この例の場合は、合計値を返したいので、sumを入れていますね。


そして、ここでもう一つ大事な点があります。


関数名friendの前に、intという「変数の型」が記載されている点です。


ここの変数の型は、返り値の型と一致させる必要があります

ここでは、返り値sumの変数の型はintですので、intとしています。

もし仮に、sumがdouble型ならば、double friend( int start , int end )のようになります。



では、

次にこの新しい自作関数friendをmain関数から呼んであげることにしましょう。


まずは、サンプルプログラムを書いてみます。


#include <stdio.h>


/* プロトタイプ宣言(変わりますよ~) */

int friend( int first,  int end );


int  main( void )

{

     /* friendからの返り値を受けるための変数 */

     int  answer;

 

     /*  friendからの返り値を受ける方法 */

     answer = friend( 1, 100 );


     /*  先生に対して答えましょう */

     if( answer < 5051 )

     {

          printf("maxValu is 5051¥n"); 

      }

     else if( answer > 5051 )

     {

          printf("maxValu is sum¥n"); 

      }

      else

      {

          printf("Those value is equal¥n");

       }


      /* 友達にありがとうって言いましょう(笑) */

      printf("Thank you!, friend!!¥n");


       return( 0 );

}


/* 自作関数 */

int  friend( int  start,  int  end  )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = start; ii <= end; ii++ )

    {

         sum += ii;

    }


    return(  sum );

}


実行結果:

maxValu is 5051

Thank you!, friend!!


自作関数friendをmain関数から呼んであげて、その返り値を受ける方法は、


answer = friend( 1, 100 );


のようになります。


つまり、

main関数の中で呼ぶ自作関数は、返り値を発言していると捉えることができます。


なので、

それを answer = friend( 1, 100 )のように記載すると、自作関数からの返り値がanswerに代入されその値が自作関数の返り値になります。


今回は、関数の返り値に関して述べました。


返り値が必要かどうかを判断するには、


先の例「友達に「1~100までの和を教えて!」って言えばその友達がパッって暗算して教えてくれる。

そして、その答えと、5051どっちが大きいが比較して、答えればいい」


のイメージを掴むと分かりやすいかもしれませんよ。


是非、イメージしながら今日のサンプルプログラムを実際に書いて試して確認してくださいね。



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


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

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



今回は、技術者として、

すごく共感したとても素晴らしい動画をご紹介します。


この動画に出演されている方は、植松 努さんという方で

北海道の田舎で宇宙開発に取り組んでいらっしゃる技術者です。


私はこの動画を見るのは、初めてだったのですが、

たまたまネットサーフィンをしていて、見つけました。


この中で語られていることは、

すごく技術者として共感できるものでした。


また、私が常日頃から思っていることとも

すごく似ているなぁと思いました。


動画の中で、植松 努さんは


「”どうせ、無理”という言葉は、人の自信と可能性を奪う言葉ですよ。」

「出来ない理由を探すのでは無くて、出来る理由を探しましょうね!」

「思うは、招くですよ!」


ということを、自分の経験談、ユーモアを交えて語られています。


私はこの動画を見て、


「どうせ無理って」思っているときって、

「出来ない理由を、探している」
「出来ないことに目を向けている」


ということに気づかされました。


なので今後、


「どうせ無理」と思うような状況に出くわしたときは、


「いかん、いかん、出来ないことに目を向け、

出来ない理由を俺は、今探しちゃっている。。。


そうじゃなくて、自分が出来ることに目を向よう!」


と考えるようにしようと、凄く改めて思いました。



この動画では、

他にも色々と心に響くことを語られています。

本当に見る価値があると思います。


URL:http://youtu.be/gBumdOWWMhY


お時間があれば、見てくださいね。


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


読者の皆さんに、

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

起きますように。


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


記事
関数に情報を渡そう
関数に複数の情報を渡そう
で、

関数に情報を渡すには引数というものを用いる、そして引数は複数であっても良いというお話をしてきました。


今回も、引数の続きをお話したいと思います。


今回の内容を押さえておくことで、後々お話する”ポインタによる引数渡し”がグッと分かってくるので是非理解してくださいね。


なお、現時点では「ポインタ?、なんだそりゃ?」と思ったとしても全然OKです。

まずは、今回お話することに集中してください。


では具体的にお話します。


今回話す内容でまず押さえておいて欲しいのは、

引数は関数に情報を渡しているんだ」ということを再度意識するということです。


そして現時点では基本的に

引数として渡されたおおもとの情報は、自作関数の中では変えられない!

ということを覚えておいてください、基本的に。


実際にサンプルプログラムを書いて説明します。


#include <stdio.h>


/*  プロトタイプ宣言 */

int myFunc( int a, int b );


int  main( void )

   int  a;

   int  b;

   

   /* おおもとの情報 */

   a = 3;

   b = 5;

 

    /* 自作関数にa=3, b=5という情報を渡す */

    myFunc( a, b );


   /*  自作関数実行後のa, bの値を表示 */

   printf("a =%d\n",a);

   printf("b =%d\n",b);


   return( 0 );

}


/* 自作関数 */

int  myFunc( int a,  int b )

{

   /*  あえて、渡された情報を変えてみます !*/

   a = 30;   

   b = 50;


   return( 0 );

}


このサンプルプログラムでは、

1: おおもとの情報として、a = 3, b = 5を自作関数myFuncに渡し

2: 自作関数myFuncの中で、敢えて渡された引数(情報)を変更することを試みています

3: そして自作関数myFunc実行後のa, bの値を表示しています


さぁ、結果はどうなるでしょうか?


少し本ブログを読むのを止めて、

実際にサンプルプログラムを動かしてみてください。


・・・・・

・・・・・

・・・・・

・・・・・

・・・・・


実行結果:

a = 3

b = 5


そう、a = 30, b = 50になっていませんね!。


これが、先ほど述べた

引数として渡されたおおもとの情報は、自作関数の中では変えられない!

ということです。


今回は、このルールを実際にサンプルプログラムを書いて体験してください。そして実感として、「あっ、そうなんだ!」と感じるようにしてくださいね。


---

※最後に今日は「お知らせ」があります。


近々、「メルマガ」を発行しようと考えています。


メルマガの内容としては、無料購読してくださる方が、

プログラムを自分自身で考えだす能力を身につけられる

ようなものにしようと考えています。


私が思うに、初心者さんが出くわす壁として

1: C言語の基礎的文法理解

2: 基礎的文法理解後、その知識要素がバラバラで組立ることができない


の2点があると思います。


1に関しては、本ブログでカバーしようと考えています。


で、2の能力を開発するには、

一つのプログラムを最初から最後まで作るということを体験してもらう必要があるなぁと考えました。


そして、それを伝えるにはブログだけではどうしても限界があると思い、より親密な手段としてのメルマガでお伝えしようと考えました。


現在、皆さんが

「楽しく、分かりやすい」そして「プログラムを考え出す能力を身につけられる」には、どのようにメルマガでお伝えすればよいか構想中です。


構想出来上がりしだい、

本ブログで「メルマガ発行のお知らせ」を改めて致しますので、興味のある方は是非そのときに購読の程お願いします。


読者の皆さんに、すべてのよきことが

なだれのごとくおきますように。

N


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

記事"引数「関数に情報を渡そう」"

関数に情報を渡すには”引数”を使うんだということをお話しました。


今回は引数の続きをお話したいと思います。


前回は、

引数が一つだけのお話をしましたが、

実は引数は、必要とあれば好きなだけ関数に渡すことができます


つまり、

関数に様々な複数の情報を渡すことができます。


これをマスターすることで、自作関数の流用性が更にアップしますので是非マスターしてくださいね。


では具体的にお話しします。


まずは、前回のサンプルプログラムをもう一度記載します。


#include <stdio.h>


int sum( int end );


int  main( void )

   sum( 100 );


   return( 0 );

}


int  sum( int end )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = 1;  ii <= end;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


このサンプルプログラムは、

1~end(引数)の合計値を表示するというプログラムでした。


自作関数sumに引数endを持たすことで、たとえば、1~10の合計値、1~100の合計値というふうに、引数が1個でも無いときに比べると、関数の流用性がアップしたと思います。


しかしここで更に、

「うん、確かに流用性はアップしたなぁ」

「でも、最初の”1~end”の"1"の部分も自由な値にしたいなぁ」

「そうすれば、もっとこの自作関数の流用性がアップするなぁ」

と考えたとします。


つまり、

5~10までの合計値、3~100までの合計値といったように。


この場合、自由に変動する値(変数)が二つありますよね。

つまり、スタートの値とエンドの値。


そこで、

このスタートの値とエンドの値という二つの情報を自作関数sumに渡してしまおうと考えます。


実際にこの場合の自作関数sumを以下に書いてみますね。


int  sum( int start,  int end )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = start;  ii <= end;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


もう気づいた方もいるかもしれませんね。


そう、複数の引数を関数に渡す場合は、それぞれの引数を「,」(カンマ)で区切って追加していけばいいだけなんです


では、新しい自作関数sumをmainから呼んであげることにしましょう。


呼び方は前回の引数1つのときとよく似ています。違いは「,」(カンマ)で区切ってあげるということぐらいです。


たとえば、

5~10までの合計値ならば、sum( 5, 10 );

3~100までの合計値ならば、sum( 3, 100);

のようにします。


ここで、ひとつだけ注意点があります。それは、( )の中の順番です。


つまり、

自作関数sumを作成したときの、引数の並び順に対応した順に書く必要があります


先に上であげた例では、

int sum( int first, int end )と作成したので、sum( 5, 10 ); と書いています。


では、実際にプログラムを書いてみます。



#include <stdio.h>


/*  プロトタイプ宣言(ここも変わるので注意!) */

int sum( int first, int end );


int  main( void )

   /* 5~10までの合計値表示 */

   sum( 5, 10 );


   /* 3~100までの合計値表示 */

   sum( 3, 100 );


   return( 0 );

}


/* 自作関数 */

int  sum( int first,  int end )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = first;  ii <= end;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


実行結果:

sum = 45

sum = 5047


以上、今回は複数の情報を引数として自作関数に渡す方法について述べました。

自作関数の流用性がアップしてきているという感じを、実感するためにも、是非色々と今回のサンプルプログラムをいじって試して確認してみましょうね。


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


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

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


斉藤一人さんの本に


「このままでいいんだよ」


って口ずさもうと書かれています。


そして、


「普通は、


「ここがいけないよ」とか「あそこがいけないよ」

というふうに、人の欠点を見るのは、人の評価をマイナス点から始めちゃうからなんだよね。


人は誰でも「今よりよくなりたい」と思いながら生きているんだからそれをマイナスから評価してはいけないんです。


そして、それは自分に対しても同じなの。


”人間って、このままではいられない生き物”なんだよね。


それをマイナスを減らすために努力しているのか、プラスをさらにプラスにするために努力しているのか、で全然違ってくるんです。


だからまず、自分に対して「このままでいいんだよ」と言う。


それで、自分に言えるようになると、

相手に対しても「このままでいいんだよ」と思えるようになるんです。


と書かれています。


この「このままでいいんだよ」という言葉を、

実際に私も声に出して、寝る前に自分に投げかけるように

言っているんですよね。


最初は、ふーんって感じだったのですが、

最近はこの言葉「このままでいいんだよ」って凄いなぁ

って思っているんです。


何が凄いかっていうとね、

(あくまで、私個人的に感じてることなのですが)


自分が「このままじゃダメだ」って無意識に思っていることが

見えてくるところです。


つまり、

自分に対してこの言葉「このままでいいんだよ」っていうと、


その言葉が引き金となって、

自分の頭に「思いもよらない出来事やそのイメージ」が浮かんでくるんですよね。


で最初は、

この浮かんでくる「出来事やそのイメージって何?、何故浮かんでくるの?」

って不思議でした。


でも、よくよく「その浮かんでくる出来事やそのイメージ」を

自分なりに考えていると、


「あれ?、俺ってこのことについて、このままじゃダメだって思っているなぁ」

って気づいたんですよね。


でね、それに気づくと、思考が広がって、


「ということは、俺はこの出来事やイメージに関して、

マイナスの地点からスタートしようとしているのか」


「そうか、マイナスの地点からスタートするのではなくて、

私がいるこのままの地点から、スタートすればいいんだ」


「そうか、このままの地点からのスタートか・・・」


「じゃ、このままの地点からスタートする、

具体的な最初の一歩ってなんだろうなぁ?」


って考え出すことができやすくなりました。


すごく、面白い体験でした。


もしよろしければ、皆さんも一度


「このままでいいんだよ」


って自分に言ってあげてみてくださいね。




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


読者の皆さんに、

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

起きますように。


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


前回の記事"
自作関数「無いのなら、作ってしまえ、関数を!」"で、自作関数の作成の基本についてお話しました。


今回は、引数をもつ自作関数についてお話したいと思います。


引数を持たすことで、自作関数を部品のように使えるようになり

再利用しやすくなります。


再利用しやすい自作関数を多く作成しておくことで、

大規模なプログラムを作成する際に、それらを組み合わせて非常にプログラムを楽に作成できるようになります。


ですので、

今回は、引数がある自作関数の基礎を是非マスターしてみてくださいね。


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


まずは、

前回のサンプルプログラムを、もう一度記載してみますね。


#include <stdio.h>


int sum( void );


int  main( void )

   sum( );


   return( 0 );

}


int  sum( void )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = 1;  ii <= 50;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


この自作関数sumを実行すると、1~50までの合計値を表示されるプログラムでしたね。


でも、

この自作関数では、固定された1~50までの合計値しか表示することができません。


1~10までの合計値、或は1~100までの合計値を表示したいという場合を考えると、うーん、これは不便ですね。


何が不便だと感じるのでしょうか?


そう、今の自作関数sumは"50"という値で固定されているのが非常に不便ですね。


では、どうしたらいいのでしょうか?


そう、自作関数sumにもっと自由に終わりの数値を教えてあげることができれば自由が増しますね。


そこで、登場するのが”引数”なんです


この"引数"というのを使うことで、関数に情報を渡すことができます。


つまり、


引数とは、関数に渡す情報


と考えてください。


引数をもつ自作関数の作成方法は、


自作関数の( )の中に、渡す情報を格納する変数を記載すればOKです。


例えば、先ほど上で述べた


「自作関数sumにもっと自由に終わりの数値を教えてあげたい」


と考えた場合、自作関数sumは以下のように作成します


int  sum( int  end )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = 1;  ii <= end;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


int  sum( int  end )の部分では、int型のendという変数に情報を入れて自作関数sumに渡しますという意味になります。


そして、for( ii = 1; ii <= end; ii++ )の部分で、前回は50だったのをendとしています。

endは、引数として渡された情報が入る変数になります。


では、

この新しい自作関数sumをmainから呼んであげることにしましょう


呼び方は、簡単です。


main関数の中で、sum関数に渡したい実際の情報値をsumの( )の中に記載します。


例えば、sum関数に100という実際の情報値を渡したい場合は、sum( 100 );と書けばよいだけです。


サンプルプログラムを書いてみますね。


#include <stdio.h>


/* プロトタイプ宣言 */

int sum( int end );


int  main( void )

   /* 1~100までの合計値を算出する */

   sum( 100 );


   return( 0 );

}


/*  新しい自作関数sum */

int  sum( int end )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = 1;  ii <= end;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


実行結果:

sum = 5050


ここで、プロトタイプ宣言も変更していることも忘れないでくださいね。


プロトタイプ宣言は、自作関数の{ }の前の部分を取り出して;(セミコロン)を付けるのでしたね。


だから、int sum( int end ); となっていますね。


さて、ここまでくると


前回のサンプルプログラムの void の意味も分かってくると思います。


実は、voidとは「無し」という意味で、「引数はありません」ということを自作関数sumに教えていたのです。


以上、今回は自作関数に情報を伝えたい場合にどうしたら良いかの基本をお話しました。


サンプルプログラムの100の値を色々変えてみて、実際に試して確認してみてくださいね。


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


今までは

printf関数のように、あらかじめ用意された関数を用いたプログラムをお話してきました。


今回は、「自分で関数を作ってしまおう」というお話をします。


自作関数を作れるようになると、プログラムが更に楽しくなってくると思いますので是非マスターしてくださいね。

そもそも、関数とは何なんでしょうか?


例えば、printf関数ならば、

「これを実行することで、文字を画面上に表示する仕事をしてくれるもの」と言えます


つまり、

関数とは、「実行するとある仕事をしてくれるもので、それがあると便利、助かる!」


と考えることができます。


ちなみに、
このようにあらかじめ用意してくれている関数を、標準関数と呼んだりします。

では、自作関数とは何でしょうか?


自作関数とは、「~ができるオリジナルの関数」ということになります。


この”~”の部分には、「あると便利だなぁ」という機能を当てはめると思ってください。


つまり、自作関数とは、

「実行すると~という仕事をしてくれて、それがあると便利、助かる!」というものを自分で作成するということになります。


もっと言うならば、

標準関数に無いのならば、作ってしまえ、関数を!」って感じです(笑)。


では、

自作関数の作り方の基本について、具体的にお話していきます。


今までのプログラムで、必ず


int  main( void )

{

 変数定義;


 処理;


 return( 0 );

}


というmain関数を作成していました。


自作関数を作る場合も、実はこの作りとなんら変わりはありません。


つまり、main関数の名前を変えてしまうだけで作れてしまいます


例えば、

「1~50までの合計を表示する自作関数を作りたい」とします。


自作関数の名前を、sumと決めたとすると、


int  sum( void )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = 1;  ii <=50;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


のように、

main関数の名前の部分を変えて、後は今までお話してきたようにプログラムを書けば、自作関数sumが作成できます。


後は、

この自作関数sumを、main関数の中で使えばよいだけです。


使い方は、標準関数のprintf関数と同じ要領です。


つまり

printf関数の場合、printfの後に( )を付けて、その中に表示させたい引数を入れてあげました。


例えば、


int  main( void )

{


  printf("Hello");


  return( 0 );

}


のように。


ただ、この自作関数sumの場合は、引数がvoidと定義しているので、引数は入らないとなり、sum(); のように書けばOKです。


具体的にプログラムソースを記載すると、


#include <stdio.h>


/* 自作関数のプロトタイプ宣言 */

int  sum( void );


/* main関数 */

int  main( void )


   /* 自作関数の呼び出し */

   sum( );


   return( 0 );

}


/* 自作関数 */

int  sum( void )

{

    int  ii;

    int  sum;


    sum = 0;


    for( ii = 1;  ii <=50;  ii++ )

   {

      sum += ii;

   }


   printf( "sum = %d¥n", sum);


   return( 0 );

}


のようになります。


ここで、一つだけ補足説明をします。


main関数の前に、int sum(void); という文をいれていますね。


これは”プロトタイプ宣言”というもので、自作関数sumというものを使いますということを事前に宣言する必要があります


書き方は簡単で、自作関数の{ }の前部分をとりだして、終わりにセミコロン( ; )を付けるだけです。


今回は、自作関数の作成の仕方の基本を述べました。


纏めると、


1: 自作関数にさせたいことを決める

2: 自作関数を作成する

  ※作り方は、main関数のmainの名前を変えて作る

3: main関数の中で、その自作関数を使う(自作関数を"呼ぶ"と言ったりする)。

4: 自作関数を使う宣言をmain関数の前にする(プロトタイプ宣言)。

 ※プロトタイプ宣言の仕方は、自作関数の{ }の前の部分を取り出して、セミコロン( ; )を付ける。


となります。


次回以降で、自作関数について更に詳しく述べていきますが、

まずは、今日の自作関数の作成の基本を押さえておきましょうね。

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


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

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


斉藤一人さんの本に


「心というのは、何も考えていないと

否定的なことを思ってしまうようにできています。


だから、否定的なことが浮かんできたときには

「それは実際に自分に起きることだろうか」

と考えるの。


起きてもいない問題に対して「どうしよう」と心配するのは、

”考えてない”

から浮かんでくるんだよね。


そして実際に起きた問題には行動して対処する。

そうすれば問題は解決するんです。


とにかく私たちは、

この世に悩みにきたのではありません。


問題を解決するために生まれてきました。


その問題を解決することに挑戦したとき、

パッと人生の道が開けて、そこに無限の可能性が

必ず生まれるからね。


だから問題が起きたら一歩下がっちゃダメなんです。

目の前の問題というドアをノックして開ける。


すると

そのドアの向こう側に道が開けるようになっているんです。


それで、とにかくやってみる。

何度もやってみるの。


大きな問題を目の前にしたとき、

「足が震えて、勇気が出ない」っていう人がいます。


でも、「勇気がある」というのは「震えない」

ことじゃないんです。


震えながらでも一歩踏み出すことが勇気なんです。


何も怖がらない人というのは、ただ鈍感なだけです。


あなたのように怖がりながらでも一歩踏み出したとき

いいことが必ず起きるんです。


人前で話すコツなんかでも、

ヘタな人が頑張って改良して、改良に改良を加えるから

やっていると味が出て、うまくなるんです。


という文が出てきます。


私は、ロボットの制御設計(図面作成、プログラム作成)を

日々仕事で行っています。


そして、最近新しい分野の制御設計をしだしています。


新しいことに、チャレンジするときって、

すごく不安が出るんですよね。


「うわぁー、どうしよう」って心配したり、

「この問題から、逃げたい」って弱気になったり、

「すごく、怖いな」ってブルブルしたり、


そんな時に、この文章を読むと


「どうしようって心配している時は、何も考えてないんだぞ!」

「考えろ!、自分にできる具体的なことを、考えろ!、そして行動しろ!」


「問題が起きたら一歩下がっちゃダメ!

目の前の問題というドアをノックして、こじ開けろ!」


「”勇気がある”というのは、”震えない”ことじゃない!。

震えながらでも一歩踏み出すことが勇気なんだ!」


「何も怖がらない人というのは、ただ鈍感なだけだ!」


って、自分の中で声が聞こえてきて頑張れたりするんですよね。


もちろん、

時には、ふにゃーって休息するときもあるんですけどね(笑)。

そんな日々を送っている今日この頃です。


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


読者の皆さんに、

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

起きますように。


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

記事"break文「脱出!」"で、break文についてお話しました。

for, while, do~while, switchで使えて、breakに出会うとそれを囲んでる最も内側のそれらの{ }から抜けることができるというものでした。

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

continue文は、break文と比べるとそれほど出てこないかもしれません。ですが、そのため他人が書いたプログラムとかで「continue」に出会うと、「あれ、なんだっけ?」となりやすいです。

なので、仮に自分ではあまり使わないなぁと思っても、continue文の意味とbreak文との違いは押さえておきましょうね

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

break文は「脱出」「抜ける」という意味がありました。

一方、continue文には「スキップしてまた続けるか判断する」という意味があります。

またbreak文は、「何から脱出、抜けるの?」という問いに対して、for, while, do~while, switchの{ }から「脱出」「抜ける」ということでした。

では、continue文は「どこにスキップしてまた続けるか判断するの?」という質問をした場合、

continue文に出会うと、ただちに、continue文を囲んでいる最も内側のfor, while, do~while{ }の終わりへスキップして、それらの先頭に戻り、また続けるかどうか繰り返しの条件と照らし合わせて判断するとなります。

少し話しが複雑になりましたが、ここまでで押さえて欲しいのは、

1:  continue文は、「スキップして、また続けるか判断する」という意味があるんだなぁ。
2:  continue文は、for, while, do~whileと関係しているんだなぁ。break文ではswitchとも関係していたが、continue文はswitchとは関係しないんだなぁ。

ということです。

ではもっと、具体的にサンプルプログラムを用いてお話しますね。

int  main( void )
{
    int  ii;

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

   return( 0 );
}

実行結果:
ii = 0
ii = 1
ii = 2
ii = 3

このプログラムは、break文もcontinue文も入っていないので、実行結果のような表示がされますね。

では、次にbreak文を入れてみましょう。

int  main( void )
{
    int  ii;

   for( ii = 0;  ii <= 3; ii++ )
   {
       if( ii == 2 )
       {
           break;
        }
       printf("ii = %d¥n", ii );
   }

   return( 0 );
}

実行結果:
ii = 0
ii = 1

break文を入れたので、ii が2になったときにfor文から脱出して実行結果のようになりますね。

では、次にcontinue文にしてみましょう。

int  main( void )
{
    int  ii;

   for( ii = 0;  ii <= 3; ii++ )
   {
       if( ii == 2 )
       {
           continue;
        }
       printf("ii = %d¥n", ii );
   }

   return( 0 );
}

実行結果:
ii = 0
ii = 1
ii = 3

"ii = 2"という表示が、スキップされました!

これは、

Step1:  iiが2になったときに、continueと出会った
Step2:  continueと出会ったので、それ以降に記載されているprintf文はスキップ
Step3:  どこまでスキップするかというと、for文の{ }の終わり
Step4:  ii++が実行されて、iiは3になる
Step5:  for文の先頭に戻る
Step6:  繰り返し条件式 ii <= 3と照らし合わせた結果、for文を続行
Step7:  今度はcontinue文と出会わないので、printf文が実行される

その結果、ii = 2という表示が、スキップされたということになります。

どうでしょうか?continue文が少し分かりましたか?

今回のサンプルプログラム「break, continueが無いパターン」「break文があるパターン」「continue文があるパターン」を実際に書いてみて実行してその違いを確認してみてくださいね。

プログラムの上達の秘訣は、実際にプログラムを、「書いて」「試して」「確認する」という3つのステップを体験することが重要です。

是非、「試して確認する」を実行してくださいね。


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


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

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


斉藤一人さんの本に


「自分に自信がない人の特徴って、たとえば

「いついつまでに英語がはなせるようになります」とか

「いついつまでに一億円を手にします」とかね、

出来ないことを目標にするわけ。


そして「できないこと」が自分を苦しめちゃうんです。

うまくいかない人って、自分の中に罪悪感がいっぱいあるの。

親と約束したこと、先生と約束したこと、自分と約束したこと・・・。


それらを全部、不履行(契約などを実行しないこと)にしてるんです。だから、ものすごく罪悪感が自分の心の中で固まっていることが多い。だから、まずは、それを解きほぐさないとダメだよね。


たとえば、あなたが日記を書こうと思ったとします。

ところが、始めてみると三日坊主でやめてしまいました。

そんなときは、

「三日書いたけど、”自分には向かないこと”がわかったらやめます」

って言えばいいんです。


やってみたら、わかったって。


それを黙ってやめて、「続かなかった」とか「ダメだった」と思うから、それが罪悪感になって残るんです。


という文が出てきます。


私は小さい頃に、親とか学校の先生とかに

「中途半端に終わらせてはダメ、一旦始めたことは最後までやりなさい」

とよく言われました。


でも最近は、
「この親とか学校の先生に言われた言葉って違うんじゃない?」

って思うんです。


逆に、この言葉の呪縛から俺苦しんでないか?

「自分で決めたことが、出来なかった。。。」

「やり始めたからには、~しなければならない。。。、~すべきだ。。。」


まさに、斉藤一人さんが言うように

自分の中に罪悪感が一杯、親と約束したこと、先生と約束したこと、その他の人と約束したこと、自分と約束したことで。。。


おそらく、この親とか学校の先生に言われた言葉

「中途半端に終わらせてはダメ、一旦始めたことは最後までやりなさい」

を私は、過剰に一般化して


「"何でも"、"全てのことを"

   途中で終わらせることは良くないことなんだ」


と捉えてしまっていたのだと思います。


そして、この過剰な”何でも”,”全てのことを”という一般化した思考が私を苦しめていたのだなぁと思います。


実際、幸せそうな人、出来る人を観察していると、


「中途半端に辞めたのではなくて、やってみたら、これは違うということがわかった」


というふうに、徹底した終了処理を行っているなぁと思います。


なので、最近は、


「行動はやめているのに、心はbreak処理をしてない状態にするのではなくて、行動をやめたら、心の方もきちんとbreak処理をする!」


って心掛けています(笑)。


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


読者の皆さんに、

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

起きますように。