毎度毎度、続くかわからないシリーズものです。
ところで、僕にとって一番のチーム内の悩み事は、チーム内の初心者のC++の理解ってところです。
もちろん、募集項目では、技術の有無は求めている点ではないのですが、9割5分はこちらから教えなくてはいけません。
増して、ブログなどで技術記事を書いている人たちを引き抜いてきているつもりのものの、本のソースの発展させた形やひどい場合には本の丸写しだってあります。
それらを見極めてスカウトしてはいるのですが、やっぱり応用力というものがない人が多いのです。
確かにある程度の事であれば、webページの切り貼りで十分ですし、本に付属しているサンプルソースなども利用可能です。
でも、それはあくまでもそこまでのはなしです。
僕は本に付属するソースの使い方と言うのは、そうじゃないとおもうんですよ。やっぱり。
例えば、C++だろうがCだろうが、最初に本に書いてあるソースって、大体以下みたいな感じですよね?
#include <stdio.h>
int main(){
printf("Hello World!!");
return 0;
}
|
そしたら、まだまだできる場所は少ないと思うのですが、とりあえず自分でわかる範囲で書き換えてみるべきだと思うんです。
たとえば、ダブルクォーテーションの中身を書き換えて表示される文字列を変えてみたり・・・
はたまた、ソース中のコメントを自分なりに書き換えることでもいいんだと思います。
人から与えられたものをその形通りに学んだって、決して応用が利くはずがないんですよ。
コンピューターの中の事を本で読んでサイトで読んで、わかった''つもり''になっていませんか??
実際に組んでみることは、【発展】させるための試み。作ることの【喜び】を教えてもらうことができます。
そうでしょう?学校で与えられたものをやるより、自分からやらなければいけないんですね。
本を読むというのはあくまでも受動的であって、自分から行動しなければいけないんですね。
あ、そうそう。別にインターネット上の解説サイトを見るという事を否定はしませんけど、サイトだけでプログラムを習得できるというのは間違っていますよ。
なぜなら、プログラムにはバグがつきもので、バグ一つに1週間悩むこともあれば、1か月悩むこともあるんです。
つまり、、バグ=忍耐しなければならないこと
さて、その中でサイトで学習するより本で学習したほうがいいという決定的な理由があります。
それは、人はある程度損をしなければ投げ出してしまうという特徴があるからなのです。
でも、一番の敵は、わかっているつもりでわかっていないことなのです。
わかっているつもりだからそこがバグでも気づきづらい。
わかっているつもりだから本も読み飛ばしてしまえ。
わかっているつもりだからソースはコピーでいいか。
そんな感じになっていたりするんです。
んじゃあ今回からの、不定期更新及び続くかわからない、本当にわかっているのだろうか講座。
わかっているようでわかっていない。そんな人に向けての講座です。
ちなみに、今回の内容というか理論(コードはもちろん使えないと思うよ)は''だいたい''の場合C++以外の言語でも使えるはずです。
①、無口な関数使ってませんか?
さて、C++言語を半年やたことがある人に「関数わかってる?」って聞いたとしましょう。
当然、わかっているとおもいます。いや、わかっててもらわないと困るんです。なぜなら、C++の基本中の基本であるからです。
これからは、チーム内であった実話です。
「与えた2つの整数値を掛け合わせた数を返す関数を作り、それを利用して2×3をしなさい」
#include <stdio.h>
int cross(int x,int y){
return x*y;
}
int main(){
printf("2*3の結果は%dです。\n",cross(2,3));
return 0;
}
|
こんな感じなのが僕が書いたものですが答えだと思います。
では次に彼が書いた答えを見てみましょう。
彼はたしかこんな感じに答えたんです。
#include <stdio.h>
int z;
void cross(int x,int y){
z=x*y;
return;
}
int main(){
printf("2*3の結果は%dです。",z);
return 0;
}
|
厳格に間違いであるとは言いづらいですが、グローバル変数をこのような形で使うのはもったいない限りであると思います。
こんなちょっぴりしたところでグローバル変数使われたらたまったもんじゃありません。
すぐに名前空間などを使わなければ使える変数名や関数名等が減っていってしまいます。
そうなんですよ、彼はreturnの使い方を知らなかったんです。(これは決して彼が悪いわけではなく、解説書などが、一連のよく使う処理を関数としてまとめておくと便利だという記述がよくあるためかと思います。)
関数。数学で関数って何に使いますか?
例えばこんなものがありますね。
関数のタイプ |
例とか |
x=1のときのy |
x=2のときのy |
一次関数 |
y=2x+1 |
y=3 |
y=5 |
二次関数 |
y=2x2+3x+4 |
y=9 |
y=18 |
三角関数 |
y=sin(xπ+1/4π) |
y=-1/√2 |
y=1/√2 |
さて3つの例を挙げました。
ここで気が付いてほしいのは,xにある数を渡すと、yにそれに応じた値が帰ってくるという点がすべて共通しているという点です。
そう、プログラムの関数も同じなんです。ある数を与えたらそれに応じて何か数を返すというのが本質なんですね。
と、、数学的というにはあまりにも雑ではありますがこういう解説だと、どうも人は好かないらしく、参考書などでは、そういうものなんだという解説が多いのが、プログラムの解説書の難点です。
では、ここでわかったことをプログラムで置き換えてみましょう。
返値型 関数名(引数型 引数名、引数型 引数名...){
return 返値;
} |
となる関数の定義方法ですが、返値型と言うのは、上の3つの例でいう、yにあたります。
例えば、一次関数の例でいえば、2x+1が何に置き換わるか、その型を指します。
そしてreturnの後に返値を入れるんですね。
もちろん、条件分岐などでreturnが1関数の中で複数使われることがありますが、最初にreturnに出会えば、呼び出し先に戻ります。
したがって、同じ関数の中でreturnが呼び出されるとそれ以降の関数内の処理は実行されません。
例えば、関数内にreturn 0;とかかれていたとしたら、その関数は0におきかわります。
return "こんばんわ";
こんなのも当然のごとくありです。当然ですが、返値の型をしっかり指定してやらなければなりませんけどね。
[1回]