/* このファイルは、「Cによる統計データの解析入門」で説明したプログラムのファイルである。 program1.txtには1-7章のプログラムが、program2.txtに8-13章のプログラムがテキスト形式で収録されている。 これらのファイルは、通常の運用に関してはなんら問題のないことを確認しているが、運用はすべて自己責任で行うものとする。 運用の結果、万一損害が発生したとしても著者および出版社はいかなる責任も負わない。 これらのファイルに収録されたプログラムおよびソースコードの著作権は著者に属する。 ただし、読者が個人的に使用する場合および非営利団体において教育目的に使われる場合に関しては複写、改変、その一部の流用は自由である。 商用利用に関しては著者の同意が必要である。特に、著者の文書による同意なしに収録されたプログラムおよびソースコードを使って有料の著作物や製品の作成、 サービスの供与などを行うことは固く禁じる。詳細は出版社に連絡頂きたい。*/ /* 1章のプログラム */ /* Program 1-1(簡単なプログラム) */ #include main( ) { int a,b,c; a=1; b=2; c=a+b; printf("a=%d\n",a); printf("b=%d\n",b); printf("a+b=%d\n",c); return 0; } /* Program 1-2(画面からの数値の入力のプログラム) */ #include main( ) { int a,b,c; printf("a?"); scanf("%d", &a); printf("b?"); scanf("%d", &b); c= a+b; printf("a=%d\n",a); printf("b=%d\n",b); printf("a+b=%d\n",c); return 0; } /* Program 1-3(intのバイト数を求めるプログラム) */ #include main() { int a; a = sizeof(int); printf("%d\n",a); return 0; } /* Program 1-4(8進数、16進数の入力のプログラム) */ #include main( ) { int a,b; a = 0731; b=0x2AD6; printf("%d\n", a); printf("%d\n", b); return 0; } /* Program 1-5 (実数の計算のプログラム) */ #include main( ) { float a; a=4/7*1.23; printf("%f\n",a); return 0; } /* 2章のプログラム */ /* Program 2-1(関数を使ったプログラム) */ #include void sum1(); void main() { sum1(); } /* データの処理を行う関数 */ void sum1( ) { int a,b,c; printf("a?"); scanf("%d", &a); printf("b?"); scanf("%d", &b); c = a+b; printf("a=%d\n",a); printf("b=%d\n",b); printf("a+b=%d\n",c); return; } /* Program 2-2(for文による繰り返しのプログラム) */ #include void sum1(); void main() { int i; for( i = 1; i<=3; i++) sum1( ); } /* データの処理を行う関数 */ void sum1( ) { int a,b,c; printf("a?"); scanf("%d", &a); printf("b?"); scanf("%d", &b); c = a+b; printf("a=%d\n",a); printf("b=%d\n",b); printf("a+b=%d\n",c); return; } /* Program 2-3(階乗の計算プログラム) */ #include double factorial(int n); void main() { double k; int n; n=5; k=factorial(n); printf("%d",n); printf("!=%g\n",k); } double factorial(int n) { int i, m; double k; k=1; if(n == 0) m=1; else m=n; for(i=1; i<=m; i++) k=k*i; return k; } /* Program 2-4(順列数計算のプログラム) */ #include double factorial(int n); double perm(int m, int n); void main( ) { double k; int n, r; n=5; r=2; k=perm(n,r); printf("P(%d",n); printf(",%d",r); printf(")=%f\n",k); } double factorial(int n) { int i, m; double k; k=1; if(n == 0) m=1; else m=n; for(i=1; i<=m; i++) k=k*i; return k; } double perm(int n, int r) { int nr; double n1, nr1, p; nr = n - r; n1 = factorial(n); nr1 = factorial(nr); p = n1 / nr1; return p; } /* Prgram 2-5(組み合せ数計算のプログラム) */ #include double factorial(int n); double perm(int m, int n); double comb(int n, int r); void main() { double k; int n, r; n=5; r=2; k=comb(n,r); printf("C(%d",n); printf(",%d",r); printf(")=%f\n",k); } double factorial(int n) { int i, m; double k; k=1; if(n == 0) m=1; else m=n; for(i=1; i<=m; i++) k=k*i; return k; } double perm(int n, int r) { int nr; double n1, nr1, p; nr = n - r; n1 = factorial(n); nr1 = factorial(nr); p = n1 / nr1; return p; } double comb(int n, int r) { double c, p, r1; p = perm(n, r); r1 = factorial(r); c = p / r1; return c; } /* Program 2-6(グローバル変数を使ったプログラム) */ #include int n; double factorial( ); void main( ) { double k; n=5; k=factorial( ); printf("%d",n); printf("!= %g\n",k); } double factorial( ) { int i, m; double k; if(n == 0) m=1; else m=n; k=1; for(i=1; i<=m; i++) k=k*i; return k; } /* program 2-7 (グローバル変数を関数内でローカル変数として使ったプログラム) */ #include int n; double factorial( ); void main( ) { double k; int n; n=5; k=factorial( ); printf("%d",n); printf("!= %g\n",k); } double factorial( ) { int i, m; double k; if(n == 0) m=1; else m=n; k=1; for(i=1; i<=m; i++) k=k*i; return k; } /* Program 2-8 (算術関数を使ったプログラム) */ #include #include void main( ) { double a,b,c; a=5.1; b=2.1; c=pow(a,b); printf("%f^%f=%f\n",a,b,c); } /* Program 2-9 (変数を共有しないプログラム) */ #include void func1(int a); void main( ) {int a; a=0; func1(a); printf("a=%d\n",a); } void func1(int a) {a=a+1;} /* Program 2-10 (変数を共有するプログラム) */ #include void func1(int *a); void main( ) {int a; a=0; func1(&a); printf("a=%d\n",a); } void func1(int *a) {*a=*a+1;} /* 3章のプログラム */ /* Program 3-1(配列を使ったプログラム) */ #include void main( ) { float a, x[3]; int i; x[0]=1.0; x[1]=2.0; x[2]=3.0; a=0; for(i=0; i<=2; i++) a = a + x[i]; printf("合計 %g\n", a); } /* Program 3-2(初期値の設定を行うプログラム) */ #include void main( ) { float a=0, x[3] = {1.0,2.0,3.0}; int i; for(i=0; i<=2; i++) a = a + x[i]; printf("合計 %g\n", a); } /* Program 3-3(2次元の配列を使ったプログラム) */ #include void main( ) { float x[2][3]={ {1,2,3}, {3,4,5}}; int i,j; for(i=0; i<=1; i++) { for(j=0;j<=2; j++) printf(" %g", x[i][j]); printf("\n"); } } /* Program 3-4(配列変数を関数へ引き渡すプログラム) */ #include #define N 3 float sum(float x[N]); void main( ) { float a, x[N]={1.0,2.0,3.0}; a=sum(x); printf("Total = "); printf("%f\n",a); } float sum(float x[N]) { float a = 0; int i,n; n=N-1; for(i=0; i<=n; i++) a= a+ x[i]; return a; } /* Program 3-5(2次元以上の配列を引き渡すプログラム) */ #include # define K 2 # define M 3 # define N 2 float sum2(float x[K][M], int k, int m); float sum3(float x[K][M][N], int k, int m, int n); void main() { float x2[K][M],x3[K][M][N], a, b; int i,j,k; for(i=0; i<=K-1; i++) for(j=0; j<=M-1; j++) {x2[i][j]=(float)i+j; for(k=0; k<=K-1; k++)x3[i][j][k]=(float)i+j+k; } a=sum2(x2,K,M); b=sum3(x3,K,M,N); printf("Total= %f\n",a); printf("Total= %f\n",b); } float sum2(float x[K][M], int k, int m) {float a; int i,j; a=0; for(i=0; i<=k-1; i++) for(j=0; j<=m-1; j++)a=a+x[i][j]; return a; } float sum3(float x[K][M][N], int k, int m, int n) {float a; int i,j,h; a=0; for(i=0; i<=k-1; i++) for(j=0; j<=m-1; j++) for(h=0; h<=k-1; h++)a=a+x[i][j][h]; return a; } /* Program 3-6(scanfによる入力を行うプログラム) */ #include #define N 3 void main( ) { int i, n; float a, b, x[N]; n=N-1; printf("Please Input Data (n =%2d): ",n+1); for(i=0; i<=n; i++) {scanf("%f",&a); x[i]=a;} b=0; for(i=0; i<=n; i++) b=b+x[i]; printf("Data: "); for(i=0; i<=n; i++) printf("%10.3f",x[i]); printf("\n"); printf("Total=%15.7e\n",b); } /* Program 3-7(while文を使ったプログラム) */ #include #define N 20 void main( ) { int i, n; float a, b, x[N]; printf("Please Input Data: "); i=0; a=0; while(a != -9999) {scanf("%f",&a); x[i]=a; i=i++; } n=i-2; b=0; for(i=0; i<=n; i++) b=b+x[i]; printf("Data: "); for(i=0; i<=n; i++) printf("%10.3f",x[i]); printf("\n"); printf("Total=%15.7e\n",b); } /* Program 3-8(do-while文を使ったプログラム) */ #include #define N 20 void main( ) { int i, n; float a, b, x[N]; printf("Please Input Data: "); i=0; do{ scanf("%f",&a); x[i]=a; i=i++; }while(a != -9999); n=i-2; b=0; for(i=0; i<=n; i++) b=b+x[i]; printf("Data: "); for(i=0; i<=n; i++) printf("%10.3f",x[i]); printf("\n"); printf("Total=%15.7e\n",b); } /* Program 3-9(break文を使ったプログラム) */ #include #define N 20 void main( ) { int i, n; float a, b, x[N]; printf("Please Input Data: "); i=0; do{ scanf("%f",&a); x[i]=a; i=i++; }while(a != -9999); n=i-2; b=0; for(i=0; i<=n; i++) b=b+x[i]; printf("Data: "); for(i=0; i<=n; i++) printf("%10.3f",x[i]); printf("\n"); printf("Total=%15.7e\n",b); } /* 4章のプログラム */ /* Program 4-1(文字変数を使ったプログラム) */ #include void main( ) { char a, b,c; a='a'; b='b'; c='A'; printf("a: %c\n",a); printf("b: %c\n",b); printf("c: %c\n",c); } /* Program 4-2(文字コードを出力するプログラム) */ #include void main( ) { char a, b,c; a='a'; b='b'; c='A'; printf("a: %d\n",a); printf("b: %d\n",b); printf("c: %d\n",c); } /* Program 4-3(文字コード表を出力するプログラム) */ #include void main( ) { char c; int n; c=32; while(c<126) { printf(" %3d",c); printf(":%c",c); c++; n=(c-31)%10; if(n==0) printf("\n"); } printf("\n"); } /* Program 4-4(大文字を小文字に変換するプログラム) */ #include void main( ) { char a ='a', A ='A', z = 'z', Z ='Z'; char c, d; d=a-A; printf("文字を入力して下さい: "); scanf("%c",&c); if(c >= A && c <= Z) c=c+d; if(c >=a && c <= z) printf("小文字: %c\n", c); else printf("アルファベットでありません\n"); } /* Program 4-5(文字列の入力を行うプログラム) */ #include #include void main( ) { char ch[10]; strcpy(ch,"abc"); printf("%s\n",ch); } /* Program 4-6(画面から1文字の入力を行うプログラム) */ #include void main( ) { int c; scanf("%c",&c); printf("%c\n",c); } /* Program 4-7(getchar,putcharを使ったプログラム) */ #include void main( ) { int c; c=getchar( ); putchar(c); printf("\n"); } /* Program 4-8(gets,putsを使ったプログラム) */ #include void main( ) { char c[80]; gets(c); puts(c); } /* Program 4-9(scanfにより文字入力を行うプログラム) */ #include void main( ) { char c[80]; scanf("%s",c); printf("%s\n",c); } /* Program 4-10(sacnfにより文字入力を行うプログラム2) */ #include void main( ) { char c1[80], c2[80]; scanf("%s",c1); scanf("%s",c2); printf("%s\n",c1); printf("%s\n",c2); } /* Program 4-11(getcharにより1行の入力を行うプログラム) */ #include #define N 80 void main() { int a,i; char c[N]; for(i=0; i<=N-1; i++) { a=getchar( ); c[i]=a; if(a=='\n')break; } c[i]='\0'; printf("%s",c); } /* 5章のプログラム */ /* Program 5-1(まるめ誤差の影響を示すプログラム) */ #include void main( ) { int i; float a,b; a=1234567.0; b=0.01234567; for(i=1; i<=10000000; i++)a=a+b; printf("%g\n",a); } /* Program 5-2(まるめ誤差の影響を少なくするプログラム) */ #include void main( ) { int i,j; float a, b, c,d; a=1234567.0; b=0.01234567; c=0; for(i=1; i<=10000; i++) { d=0; for(j=1; j<= 10000; j++) d=d+b; c=c+d; } a=a+c; printf("%g\n",a); } /* 6章のプラグラム */ /* Program 6-1(ポインタを使ったプログラム) */ #include void main( ) { int a,b,c; int *p1; a=1; b=2; c=a+b; p1=&a; printf("%d\n",p1); p1=&b; printf("%d\n",p1); p1=&c; printf("%d\n",p1); } /* Program 6-2(ポインタのアドレスにある値を取り出すプログラム) */ #include void main( ) { int a,b,c; int *p1; a=1; b=2; c=a+b; p1=&a; printf("%d\n",*p1); p1=&b; printf("%d\n",*p1); p1=&c; printf("%d\n",*p1); } /* Program 6-3(ポインタを使って計算を行うプログラム) */ #include void main( ) { int a,b,c; int *p1,*p2,*p3; p1=&a; p2=&b; p3=&c; *p1=1; *p2=2; *p3=*p1+*p2; printf("a=%d, b=%d, c=%d \n",a,b,c); } /* Program 6-4(ポインタの加減) */ #include void main( ) { int a,b,c; int *p1,*p2,*p3; p2=&b; p1=p2+1; p3=p2-1; *p1=1; *p2=2; *p3=*p1+*p2; printf("%d\n",c); } /* Program 6-5(配列変数とポインタを使ったプログラム) */ #include void main( ) { char x[4]={'a','b','c','\n'}; char *p; int i; p=x; for(i=0; i<=3; i++) { printf("%c",*p); p++; } } /* Program 6-6(2次元の配列とポインタを使ったプログラム) */ #include void main( ) { int x[2][3]={{11,12,13},{21,22,23}}; int *p; int i; p=x[0]; for(i=0; i<=5;i++) { printf("%d\n",*p); p++; } } /* Program 6-7(高速化のプログラム1) */ #include #include void main( ) { double a,x[2][10000]; clock_t t1; int i,j,k,d; for(i=0; i<=9999; i++) for(j=0; j<=1; j++) x[j][i]=0; for(k=1; k<=10000; k++) {a = 0; for(i=0; i<=9999; i++) for(j=0; j<=1; j++) a=a+x[j][i]; } t1=clock( ); d=t1/CLOCKS_PER_SEC; printf("time = %d\n",d); } /* Prigram 6-8(高速化のプログラム2) */ #include #include void main( ) { double a,x[2][10000]; clock_t t1; int i,j,k,d; for(j=0; j<=1; j++) for(i=0; i<=9999; i++)x[j][i]=0; for(k=1; k<=10000; k++) {a = 0; for(j=0; j<=1; j++) for(i=0; i<=9999; i++)a=a+x[j][i]; } t1=clock( ); d=t1/CLOCKS_PER_SEC; printf("time = %d\n",d); } /* Program 6-9(高速化のプログラム3) */ #include #include void main( ) { double a,x[2][10000]; double *pa, *px; clock_t t1; int i,k,d; pa=&a; px=x[0]; for(i=0; i<=19999; i++){*px=0; px++;} for(k=1; k<=10000; k++) {*pa = 0; px=x[0]; for(i=0; i<=19999; i++) {*pa=*pa+*px; px++; } } t1=clock( ); d=t1/CLOCKS_PER_SEC; printf("time = %d\n",d); } /* 7章のプログラム */ /* Program 7-1(ファイルからデータを読み込むプログラム) */ #include void main( ) { float num[10],x[10],y[10],z[10]; float a1,a2,a3,a4; int i; FILE *fdata; fdata=fopen("data1.txt","r"); for(i=0; i<=9; i++) { fscanf(fdata,"%f%f%f%f",&a1,&a2,&a3,&a4); printf("%g %g %g %g \n",a1,a2,a3,a4); num[i]=a1; x[i]=a2; y[i]=a3; z[i]=a4; } fclose(fdata); } /* data1.txt のデータ*/ 1 175 61 1 2 165 62 1 3 162 48 0 4 164 52 1 5 170 55 1 6 169 69 1 7 155 48 0 8 153 44 0 9 162 49 0 10 158 58 0 /* Program 7-2(ファイルから文字データの入力を行うプログラム) */ #include #include void main( ) { char c[80]; int i; FILE *fdata; if((fdata=fopen("data1.txt","r"))==NULL) {printf("File Does Not Exist!\n"); exit(1);} for(i=0; i<=9; i++) { fgets(c,80,fdata); printf("%s",c); } fclose(fdata); } /* Program 7-3(ファイルの終了を感知するプログラム) */ #include void main( ) { char c[80]; int i; FILE *fdata; fdata=fopen("data1.txt","r"); i=0; while(fgets(c,80,fdata)!=NULL) { printf("%s",c); i++; } printf("No. of Lines = %d\n",i); fclose(fdata); } /* Program 7-4(fgetcを使ったプログラム) */ #include void main() { char a,c[80]; int i; FILE *fdata; fdata=fopen("data1.txt","r"); while((a=fgetc(fdata))!=EOF) { i=0; while(a!='\n'){ c[i]=a; i++; a=fgetc(fdata); } c[i]='\0'; printf("%s\n",c); } fclose(fdata); } /* Program 7-5(フォーマットが指定されたデータの入力を行うプログラム) */ #include #include void main( ) { char c[80],c1[20]; int i,j,i0,j1,n,num[10]; double x[10],y[10],z[10]; int ds,dsize[ ]={2,3,2,1}; FILE *fdata; fdata=fopen("data2.txt","r"); n=0; while(fgets(c,80,fdata)!=NULL) {i0=0; for(i=0; i<=3; i++){ ds=dsize[i]; for(j=0; j<=ds-1; j++){ j1=j+i0; c1[j]=c[j1];} c1[j]='\0'; i0=i0+ds; switch(i){ case 0: num[n]=atoi(c1); case 1: x[n]=atof(c1); case 2: y[n]=atof(c1); case 3: z[n]=atof(c1);} } printf("%d %g %g %g \n",num[n],x[n],y[n],z[n]); n++; } } /* data2.txtのデータ */ 1175611 2165621 3162480 4164521 5170551 6169691 7155480 8153440 9162490 10158580 /* Program 7-6(ファイルへの出力を行うプログラム) */ #include void main( ) { FILE *fout; int i = 3; double a =123.45; char c[ ]={'a','b','c','\0'}; int j; fout=fopen("out1.txt","w"); fprintf(fout,"%5d, %10.3f, %s \n", i,a,c); fputs(c,fout); fprintf(fout,"\n"); for(j=0; j<=2; j++)fputc(c[j],fout); fclose(fout); } /* Program 7-7(データフォーマットの変更を行うプログラム) */ #include #define N 80 void main( ) { char c[N],c1[20]; int i,j,i0,j1,n; int ds,dsize[ ]={2,3,2,1}; FILE *fdata,*fout; fdata=fopen("data2.txt","r"); fout=fopen("data3.txt","w"); n=0; while(fgets(c,N,fdata)!=NULL) {i0=0; for(i=0; i<=3; i++){ ds=dsize[i]; for(j=0; j<=ds-1; j++){ j1=j+i0; c1[j]=c[j1];} c1[j]='\0'; i0=i0+ds; fputs(c1,fout); if(i!=3)fprintf(fout,","); } fprintf(fout,"\n"); } fclose(fdata); fclose(fout); } /* Program 7-8(必要な項目を抽出するプログラム) */ #include #define N 80 void main( ) { char c[N]; int i,n0,n1,n2; FILE *fdata,*fout; fdata=fopen("data3.txt","r"); fout=fopen("data4.txt","w"); n1=2; n2=3; while(fgets(c,N,fdata)!=NULL) {i=0; n0=1; while(c[i]!='\n') { if(c[i]==',') {n0++; if(n0==n1) i++;} if(n0>=n1 && n0<=n2){fputc(c[i],fout); putchar(c[i]);} i++;} fprintf(fout,"\n"); printf("\n"); } fclose(fdata); fclose(fout); }