第12講 分割ファイル・分割コンパイル 
第7話 グローバル変数を使用しないプログラム例
ヘッダーファイルa.hで代入してコンソール画面に出力させ
c
ヘッダーファイルb.hで置換変換をして表示させ
初心者
ヘッダーファイルc.hにおいて左右対称変換をして表示させる
基礎
プログラムグローバル変数をもちいない解答例
ソースファイルm.cpp
#include"d.h"
#include"b.h"
#include"a.h"
#include"c.h"
int main(){
   int **a,i;
   a=(int **)malloc(40);
   f(a);
   g(a);
   h(a);
}
ヘッダーファイルa.h
void f(int **a){
  int i,j;
   cout<<"自然配列"<<endl;
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
       a[i][j]=10*i+j+1;
       if(a[i][j]<10)cout<<" "<<a[i][j]<<" ";
       if(a[i][j]>=10 && a[i][j]<100)cout<<" "<<a[i][j]<<" ";
       if(a[i][j]>=100)cout<<a[i][j]<<" ";
     }
     cout<<endl;
   }
   cout<<endl;
}
ヘッダーファイルb.h
void g(int **a){
  int i,j;
   cout<<"置換変換"<<endl;
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
       a[i][j]=a[j][i];
     }
   }
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
       if(a[i][j]<10)cout<<" "<<a[i][j]<<" ";
       if(a[i][j]>=10 && a[i][j]<100)cout<<" "<<a[i][j]<<" ";
       if(a[i][j]>=100)cout<<a[i][j]<<" ";
     }
     cout<<endl;
   }
   cout<<endl;
}
ヘッダーファイルc.h
void h(int **a){
   int i,j,b[10][10];
   cout<<"左右対称変換"<<endl;
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
       b[i][j]=a[i][j];
     }
   }
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
       a[i][j]=b[i][9-j];
       if(a[i][j]<10)cout<<" "<<a[i][j]<<" ";
       if(a[i][j]>=10 && a[i][j]<100)cout<<" "<<a[i][j]<<" ";
       if(a[i][j]>=100)cout<<a[i][j]<<" ";
     }
     cout<<endl;
   }
   cout<<endl;
}
ヘッダーファイルd.h
#include<iostream>
using namespace std;

ほんのわずかの工夫で、
超グローバル変数とも言うべきファイルを超える適応できるグローバル変数を解消することができることがわかります。
ただ、今回のローカル変数はmainの変数で、プログラムが起動している間、
mainはメモリー上に常駐しているので、
メモリーの節約にはなっていません。

私が分割ファイルにした理由は、EXEファイルの最大容量の制限を破るためでした。
今回演習したプログラムでは、分割ファイルの意味が活かされていません。
v.hにグローバル変数long a0[1000],cn0;を
w.hにグローバル変数long a1[1000],cn1;を
x.hにグローバル変数long a2[1000],cn2を
y.hにグローバル変数long a3[1000],cn3;を
z.hにグローバル変数long a4[1000],cn4;を用意して、
5で割ったときに余りが0のときはa0[1000]に、
5で割ったときに余りが1のときはa1[1000]に、
5で割ったときに余りが2のときはa2[1000]に、
5で割ったときに余りが3のときはa3[1000]に、
5で割ったときに余りが4のときはa4[1000]に、
と分けて保存することにしましょう。
cn0は5で割ったときに余りが0のタイプの個数を数えるもの、
cn1は5で割ったときに余りが1のタイプの個数を数えるもの、
cn2は5で割ったときに余りが2のタイプの個数を数えるもの、
cn3は5で割ったときに余りが3のタイプの個数を数えるもの、
cn4は5で割ったときに余りが4のタイプの個数を数えるものとします。
#include<iostream>
using namespace std;
の2行は、今回はm.cppファイルの冒頭に置くことして、コードは
#include<iostream>
using namespace std;
#include"v.h"
#include"w.h"
#include"x.h"
#include"y.h"
#include"z.h"
#include"a.h"
int main(){
   long i;
   cn0=0;cn1=0;cn2=1;cn3=0;cn4=0;   //;閉められた文は何個でも並べて書くことができる。
   a2[0]=2;
   for(i=3;i<100000;i++){
     if(f(i)== 1){
       cout<<i<<" ";
       if(i%5==0){
         a0[cn0]=i;
         cn0++;
       }
       if(i%5==1){
         a1[cn1]=i;
         cn1++;
       }
       if(i%5==2){
         a2[cn2]=i;
         cn0++;
       }
       if(i%5==3){
         a3[cn3]=i;
         cn3++;
       }
       if(i%5==4){
         a4[cn4]=i;
         cn4++;
       }
     }
   }
}
とします。ですから関数fはint型にして、returnは素数であると判定したときは1、素数でないと判定したときは0
ということにします。

cn2だけ1に初期化されている理由は、2は5で割ると余りが2の素数であるからです。

ではみなさん、各ファイルを考えてみましょう。



第6話へ 第8話へ


戻る

C言語講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)