第7話 第6話プログラムの改良
プログラム改良例
#include<iostream>
#include<process.h>
#include<math.h>
using namespace std;
void f1(void *a);
void f2(void *a);
void f3(void *a);
void f4(void *a);
void f5(void *a);
void f6(void *a);
char sh(int i);
char t1,t2,t3,t4,t5,t6;
int cn1,cn2,cn3,cn4,cn5,cn6;
long s1[10000000],s2[10000000],s3[10000000],s4[10000000],s5[10000000],s6[10000000];
void main(){
t1=1;
t2=1;
t3=1;
t4=1;
t5=1;
t6=1;
_beginthread(f1,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f1を働かせなさいの命令
_beginthread(f2,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f2を働かせなさいの命令
_beginthread(f3,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f3を働かせなさいの命令
_beginthread(f4,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f4を働かせなさいの命令
_beginthread(f5,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f5を働かせなさいの命令
_beginthread(f6,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f6を働かせなさいの命令
while (t1);
while (t2);
while (t3);
while (t4);
while (t5);
while (t6);
int i;
cout<<"7で割ると1余る素数"<<endl;
for(i=0;i<cn1;i++){
cout<<s1[i]<<" ";
if(i>0 && i%10==0)cout<<endl;
}
cout<<endl;
cout<<"7で割ると2余る素数"<<endl;
for(i=0;i<cn2;i++){
cout<<s2[i]<<" ";
if(i>0 && i%10==0)cout<<endl;
}
cout<<endl;
cout<<"7で割ると3余る素数"<<endl;
for(i=0;i<cn3;i++){
cout<<s3[i]<<" ";
if(i>0 && i%10==0)cout<<endl;
}
cout<<endl;
cout<<"7で割ると4余る素数"<<endl;
for(i=0;i<cn4;i++){
cout<<s4[i]<<" ";
if(i>0 && i%10==0)cout<<endl;
}
cout<<endl;
cout<<"7で割ると5余る素数"<<endl;
for(i=0;i<cn5;i++){
cout<<s5[i]<<" ";
if(i>0 && i%10==0)cout<<endl;
}
cout<<endl;
cout<<"7で割ると6余る素数"<<endl;
for(i=0;i<cn6;i++){
cout<<s6[i]<<" ";
if(i>0 && i%10==0)cout<<endl;
}
}
void f1(void *a){//7で割ると1余る素数の探索
cn1=0;
for(int i=29;i<1001;i+=14){
if(sh(i)){
s1[cn1]=i;
cn1++;
}
}
t1=0;
}
void f2(void *a){//7で割ると2余る素数の探索
s2[0]=2;
cn2=1;
for(int i=23;i<1001;i+=14){
if(sh(i)){
s2[cn2]=i;
cn2++;
}
}
t2=0;
}
void f3(void *a){//7で割ると3余る素数の探索
cn3=0;
for(int i=3;i<1001;i+=14){
if(sh(i)){
s3[cn3]=i;
cn3++;
}
}
t3=0;
}
void f4(void *a){//7で割ると4余る素数の探索
cn4=0;
for(int i=11;i<1001;i+=14){
if(sh(i)){
s4[cn4]=i;
cn4++;
}
}
t4=0;
}
void f5(void *a){//7で割ると5余る素数の探索
cn5=0;
for(int i=5;i<1001;i+=14){
if(sh(i)){
s5[cn5]=i;
cn5++;
}
}
t5=0;
}
void f6(void *a){//7で割ると6余る素数の探索
cn6=0;
for(int i=13;i<1001;i+=14){
if(sh(i)){
s6[cn6]=i;
cn6++;
}
}
t6=0;
}
char sh(int g){
if(g==1)return(0);
if(g==2)return(1);
if(g==3)return(1);
if(g>0 && g%2==0)return(0);
for(int i=3;i<=sqrt((double)g);i+=2)if(g%i==0)return(0);
return(1);
}
_beginthread関数の3番目の引数を_beginthread(f1,0,NULL)等のように、
NULUにしましたが、
この3番目の引数をNULL以外に指定することによって、
void f1(void *a){//7で割ると1余る素数の探索
cn1=0;
for(int i=29;i<1001;i+=14){
if(sh(i)){
s1[cn1]=i;
cn1++;
}
}
t1=0;
}
等の関数を1本にまとめることが出来ます。
3番目の引数は、void型ですので、
3番目の引数は
_beginthread(f, 0,(void *)1);
等とします。
そして、引き受け側の関数void f(void *a)も
a==(void *)1
として引数を受けます。
3番目の引数を利用して関数を1本化しましょう。