第10講 関数の学習
第3話 関数の独立性と引数の個数

Visual C++の戻る前に、もう2つだけご説明させて頂きます。
関数の独立性ということと引数の個数についてです。
まず、関数の独立性ということから。
f.cppというファイルをクリックしてください。
#include<stdio.h>
void f1(void);
void f2(void);
int main(void){
  
int i;
  i=5;
  printf("mainのiの値%d\n",i);
  f1();
  f2();
  printf("mainのiの値%d\n",i);
}
void f1(void){
  int i;
  i=8;
  printf("f1のiの値%d\n",i);
}
void f2(void){
  int i;
  i=12;
  printf("f2のiの値%d\n",i);
}
コマンドラインから実行ファイルを作り、実行ファイルを実行させると、
となります。
実行結果のに注目してください。
mainでもf1でもf2でも同名の変数iが使われているのに、
お互いに何の影響も与えられていません。
これが関数の独立性です。

これは一見不便なように見えますが、ここにC++の強さがあります。
部品が完全に独立しているので、その部品のみの開発に専念することができます。
もし変数名が同じだと、書き換えられてしまうとすれば、プログラマーは常にプログラム全体を見ていなければならないことになります。
つまり、他の部品で変数の値が書き換えられないように、神経を使わなければならないのです。
BASICは実際にそうでした。
しかも、BASICの場合は、GOTO文によって、あっちいったりこっちに行ったりしていましたから、
プログラム全体がスパゲティのように絡み合い、プログラムが大変複雑でした。
BASICのプログラムは、スパゲティプログラムであると皮肉られていました。
それに対してC言語やパスカルの場合、
はじめから構造化プログラミングの思想が徹底していました。
構造化プログラミングというと名称は難しいのですが、
独立した部品をプラモデルのように組み立てるこを構造化プログラミングというのです。

関数内のみで有効な変数をローカル変数といいます。
#include<stdio.h>
void f1(void);
void f2(void);
int main(void){
  int i;
  i=5;
  printf("mainのiの値%d\n",i);
  f1();
  f2();
  printf("mainのiの値%d\n",i);
}
void f1(void){
  int i;
  i=8;
  printf("f1のiの値%d\n",i);
}
void f2(void){
  int i;
  i=12;
  printf("f2のiの値%d\n",i);
}
int i; int i; int i;はいずれもローカル変数です。
それに対してプログラム全体を通して使える変数をグローバル変数といいます。
f.cppをいじってg.cppとしてみましょう。

#include<stdio.h>
void f1(void);
void f2(void);
int k;
int main(void){
  int i;
  i=5;
  k=5;
  printf("mainのiの値%d\n",i);
  printf("mainのkの値%d\n",i);
  f1();
  f2();
  printf("mainのiの値%d\n",i);
  printf("mainのkの値%d\n",k);
}
void f1(void){
  int i;
  i=8;
  k=8;
  printf("f1のiの値%d\n",i);
  printf("f1のkの値%d\n",k);
}
void f2(void){
  int i;
  i=12;
  k=12;
  printf("f2のiの値%d\n",i);
  printf("f2のkの値%d\n",k);
}
そして、コマンドラインから実行させてみると、
です。
実行結果に注目してください。
#include<stdio.h>
void f1(void);
void f2(void);
int k;
int main(void){
  int i;
  i=5;
  k=5;
  printf("mainのiの値%d\n",i);
  printf("mainのkの値%d\n",i);
  f1();
  f2();
  printf("mainのiの値%d\n",i);
  printf("mainのkの値%d\n",k);
}
void f1(void){
  int i;
  i=8;
  k=8;
  printf("f1のiの値%d\n",i);
  printf("f1のkの値%d\n",k);
}
void f2(void){
  int i;
  i=12;
  k=12;
  printf("f2のiの値%d\n",i);
  printf("f2のkの値%d\n",k);
}
iは書きかえられることがないのに対してkは書き換えられています。
グローバル変数を使うには、関数mainの前で宣言すればよいのです。

先のBASICの問題は、すべてがグローバル変数でローカル変数がなかったといってもよいわけです。

今まで、引数が1つの例しか出していませんでしたが、引数は2個以上あったも構いません。
h.cppを開いてください。
#include<stdio.h>
int f1(int a,int b,int c);
int main(void){
  int y;
  y=f1(10,100,2);
  printf("10から100までの偶数の和=%d",y);
}
int f1(int p,int q,int r){
  int i;
  int w;
  w=0;
  for(i=p;i<q+1;i=i+r){
    w=w+i;
  }
  return(w);
}
これをコマンドラインから実施すると、

これは10から100まで偶数を足した際の合計を求めるプログラムです。

最後に問題と解答例を示して、この話を閉じたいと思います。
次話からいよいよVisual C++に戻り、C++をWindows上で展開したいと思います。
問題
@ 12+15+・・・+999
A 3×5×・・・×13
を求めるプログラムを作ってください。
解答例は例によって20行下に示します。



















@ i.cpp
#include<stdio.h>
int f1(int a,int b,int c);
int main(void){
  int y;
  y=f1(12,999,3);
  printf("12+15+・・・+999=%d",y);
}
int f1(int p,int q,int r){
  int i;
  int w;
  w=0;
  for(i=p;i<q+1;i=i+r){
    w=w+i;
  }
  return(w);
}

A j.cpp
#include<stdio.h>
int f1(int a,int b,int c);
int main(void){
  int y;
  y=f1(3,13,2);
  printf("3×5×・・・×13=%d",y);
}
int f1(int p,int q,int r){
  int i;
  int w;
  w=1;
  for(i=p;i<q+1;i=i+r){
    w=w*i;
  }
  return(w);
}





第2話へ 第4話へ

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