第3講 社員(関数)の学習その1
第5話 箱(変数)の有効範囲(スコープ)
おはようございます。
今日はよい天気ですね。
明日も晴れるといいですね。
1+2+3+4+5+6+7+8+9+10=55
1から10までの積=3628800
を実現するプログラム例
#include<stdio.h>
void f();
int g();
int h();
int main(){
f();
printf("1+2+3+4+5+6+7+8+9+10=");
printf("%d\n",g());
printf("1から10までの積=");
printf("%d\n",h());
return(0);
}
void f(){
printf("おはようございます。\n");
printf("今日はよい天気ですね。\n");
printf("明日も晴れるといいですね。\n");
}
int g(){
int w; //整数専用の箱
w=0;
w=w+1;
w=w+2;
w=w+3;
w=w+4;
w=w+5;
w=w+6;
w=w+7;
w=w+8;
w=w+9;
w=w+10;
return(w);
}
int h(){
int w; //整数専用の箱
w=1;
w=w*1;
w=w*2;
w=w*3;
w=w*4;
w=w*5;
w=w*6;
w=w*7;
w=w*8;
w=w*9;
w=w*10;
return(w);
}
コピペ用添付ファイル
重要な話を忘れていました。
#include<stdio.h>
void f(){
printf("おはようございます。\n");
}
int g(){
return(3+5);
}
float h(){
float a=10,b=3; //h専用の箱で同じ名前でもmain専用の箱bとは異なる箱
return(a/b);
}
int main(){
int a;
float b;
f(); //コンソールに「おはようございます。」と表示する仕事を行う社員fに仕事をせよと命じている
a=g(); //3+5の計算を行う社員gに仕事を命じ、gから報告された答え8を専用の受け皿(箱)aに代入
b=h(); //10÷3の計算を行う社員hに仕事を命じ、hから報告された答え3.333・・を専用の受け皿(箱)bに代入
printf("3+5=");
printf("%d\n",a);
printf("10÷3=");
printf("%f\n",b);
return(0);
}
コピペ用添付ファイル
それは、
float a=10,b=3; //h専用の箱で同じ名前でもmain専用の箱bとは異なる箱
についての解説です。
mainとgで同じ名前の箱(変数)を宣言しています。
実は、箱の名前が同じでも異なる箱です。
理由は、箱はあくまでその社員(関数)専用のもので、
hの箱を、h以外の社員が使うことは出来ません。
絶対的な社長であったmainであってもです。
関数の中で宣言された変数は、その関数内でのみ有効なのです。
変数の有効な範囲をスコープといいます。
スコープは、次のようになっています。
スコープ(変数の有効範囲)が関数内に限定されている
(=箱がその社員の専用になっている)変数をローカル変数いいます。
変数名=箱の名前が同一であっても、
mainとaとhのaは別の箱です。
変数の宣言を関数(社員)ごとで行うなんて面倒だ!
と思いになるでしょうが、
C言語が王道を歩んできたのは、
スコープを関数内に限定してきたからなのです。
かつてのBASICは、すべての箱はプログラム全体で有効な箱でした。
言い換えると、
BASICが用意する変数のスコープは、プログラム全体でした。
BASICにも関数に当たるサブルーチン(弟子プログラム)という考え方がありましたが、
BASICが用意する箱はすべてプログラム全体で使える箱でしたから、
弟子プログラムによって勝手に箱の中身が置き換えられてしまう心配がありました。
つまり、プログラマーは常にすべての副プログラムも見ていなければならなかったのです。
しかも、BASICの場合Goto文というのがあり、プログラムはあちらこちらに飛びました。
プログラムが混線してしまうので、
スパゲッティープログラムと皮肉られました。
見通しの悪いプログラミングになっていたわけです。
それに、対してC言語の場合は、
箱はあくまで社員専用=変数のスコープは関数内に限定されているので、
変数名=箱の名前が同じでも、
他の関数によって変数の内容が書き換えられてしまう心配がないのです。
ということは、C言語は他の関数のことは気にしないで、
対象にしている関数のみの開発に専念すれば良かったのです。
ですから、分業が可能だったのです。
関数fはAさんが担当して、関数gはBさんが担当というように。
今では、かつてのBASICはVisual Basicとなり、
C言語と同じようにスコープは関数内に限定されるようになっています。
そして、C言語の影響ですべてのプログラム言語において、
関数内に限定されるようになっています。
C言語は、まさにキングオブキング=王様の中の王様です。
C言語が他のプログラム言語を先導してきたのです。
尚、BASICはスパゲッティープログラムの元凶(原因)といわれましたが、
Visual BasicはC言語に劣らないすばらしいプログラム言語です。
Visual Basicの縮小版をVBAといい、
VBAはエクセルやワードの最初から入っています。
VBAでもかなりのプログラムが組めることは、
私が開発した良問難問数独自動生成アプリVer.4(対称形)
等を見て頂ければ一目瞭然です。
本サイトは、平日であれば、1日に少ない日でも4千、
多い日には2万のアクセス数を頂いていますが、
アクセス数を爆発的に伸ばすきっかけとなってものが、
VBA入門講義である初心者のための vb 入門講義でしたから、
Visual Basic(略称VB)やVBAにも、
私は深い愛着を持っています。
VBA入門講義の成功がなければ、
その後の種々のプログラミング講義もなかったですし、
この『小学生からエンジニアまでのC言語 入門』講義もなかったわけです。
ところで、
第3講第1話でC言語の関数は数学の関数と同じ仕組みをもっているというお話をしましたが、
今までのところは数学の関数との関連はまったく見られませんね。
同じ仕組みとはどういうことなんでしょうか。
気になる方は、第6話をクリック!
第4話へ 第6話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ