第12講 分割ファイル・分割コンパイル
第7話 グローバル変数を使用しないプログラム例
ヘッダーファイルa.hで代入してコンソール画面に出力させ
ヘッダーファイル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入門講義(基礎から応用まで)