• 締切済み

プログラムについて(UNIX)

以下のプログラムを部分的で結構ですので 解説していただけないでしょうか? 打ち込んだ数字を10進法に変換して、 その後どうなっているのかがよく分かりません。 よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define N 127 #define M 121 #define LENGTH 45539 int C[N] ; int d[LENGTH/N]; int b[LENGTH/N]; float r[LENGTH]; char message[LENGTH/N/7]; int PNread(int); int PXread(void); int main() { int i, m; /* Insert the process to input the user No. m here. */ printf("Input the user No. : "); scanf("%d", &m); if (m < 0 || m > M) { printf("You input a wrong user No.\n"); exit(-1); } printf("\nThe user No. m is %d. \n", m); /* Read the spread code for user No. m from data file */ if(PNread(m) == -1) exit(-1); /* Display the spread code. */ /* Here is an example to display the first 10 numbers */ if(PXread()== -1) exit(-1); int t,k; float hatD[LENGTH/N]; for(t=0; t < LENGTH/N; t++){ hatD[t]=0; for(k = t*N; k < (t+1)*N; k++) hatD[t]+= ((float)r[k]*C[k%N])/((float)N); d[t] = (hatD[t] >= 0)?1:-1; /*?はif文の省略形である*/ } for(t = 0; t < LENGTH/N; t++) b[t] = (d[t] >= 0) ? 0 : 1; /* 文字に変換する */ for(i = 0; i < LENGTH/N; i += 7) message[i/7] = b[i]*64 + b[i+1]*32 + b[i+2]*16 + b[i+3]*8 + b[i+4]*4 + b[i+5]*2 + b[i+6]; /* メッセージの表示 */ printf("Message:\n%s\n", message); return 0; } /* Function of spread code reading */ int PNread(int m) { FILE *in; /* Verify the data file */ if ((in = fopen("PN7.dat", "r"))== NULL) { /* Error message */ printf("Error: Cannot find the data file. \n"); return -1; } if(m>1) /* Set the file pointer to the m-th user's spread code */ fseek(in,(m-1)*N*sizeof(int),SEEK_SET); /* Read the spread code to array C */ fread(C,sizeof(int),N,in); fclose(in); return 1; } int PXread(void) { FILE *in; int count; float rtemp; if((in = fopen("Rx7_51.dat", "r"))== NULL) { printf("Error; Cannot find the date file. \n"); return -1; } for(count = 0; count < LENGTH; count++){ fscanf(in, "%f", &rtemp); r[count] = rtemp; } fclose(in); return 1; }

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

読み込んでいる2つのファイルの仕様を教えてください。

関連するQ&A

  • 因数分解プログラム(C言語)について(2)

    つづきです /*因数分解できるか判断する関数*/ int judge(int *a,int *b,int *c,float *D) { *D = (float)((*b) * (*b)) - (4 * (*a) * (*c)); if(D > 0 || D ==0){ printf("判別式は条件を満たしました。\n因数分解を行います。\n"); } else if(D < 0){ printf("判別式はD < 0であるため、因数分解できません。\n"); exit(1); } return 0; } /*因数分解をする関数*/ int bunkai1(int *a,int *b,int *q,int *n1,int *m1,float *D) { *q = sqrt(*D); *n1 = -(*b) + *q; *m1 = 2 * (*a); return 0; } int bunkai2(int *a,int *b,int *q,int *n2,int *m2,float *D) { *q = sqrt(*D); *n2 = -(*b) - *q; *m2 = 2 * (*a); return 0; } /*約分を行う関数*/ int yakubun1(int *m1,int *n1,int *min1,int *flag,int *i,int *d,int *e) { /*最大公約数を見つける*/ if(*m1 < *n1){ *min1 = *m1; } else{ *min1 = *n1; } *flag = 0; for(*i = min1; *i > 0; *i--){ if(*m1 % *i == 0){ if(*n1 % *i == 0){ *flag = 1; break; } } } つづく 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=474593

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • プログラムが始まりません

    以下のプログラムを書いたところ、コンパイルは出来たのですが 正しく動作するか動かしたところ、7行目のprintfも実行されませんでした。それより上の部分に不備があるのでしょうか。 何か基本的なことをなにか基本的なことを理解できてないのかもしれませんが、教えていただけませんでしょうか #include<stdio.h> int main(void) { FILE *fi; char fname[100], ss[255], *a, t, ch; int count, b, n, err, c[1000]; printf("file name?"); gets(fname); fi = fopen(fname,"r"); fgets(ss,255,fi); if(ss[0]!='P') err = 1; if(ss[1]!='3') err = 1; if(err ==1){ printf("file type is wrong\n"); exit(1); } while(count < 3){ *a = fgetc(fi); if(*a == 20){ count++; } } while(1){ *a = fgetc(fi); if(*a == EOF){ break; } if(*a == 20){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } ++a; } n == 0; while(c[n] !=0){ count == 0; while(count < 8){ if(c[n] == 1){ ch++; } ch == ch + ch; count++; } printf("%c",ch); } fclose(fi); }

  • C言語でmからnまでの合計を求めるプログラム

    これで動かないのですが、何が違っているのか、教えていただけますか。 #include <stdio.h> int main(void) { int m, n, sum, i, w ; printf("mからnまでの合計を求めます\n\n"); printf("m >> "); scanf(" %d", &m); printf("n >> "); scanf(" %d", &n); sum=0; if(m>n){ w=m; m=n; n=w; } sum=0; i=m; while(i<=n){ sum=sum+i; i=i+1; } printf("%d から %d の合計 = %d\n",m,n,sum); return 0; }

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • プログラムを組んだのにエラーが出る!!!

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int i, j; int m, flag, count; FILE *fp; if (NULL == (fp = fopen("prime.txt", "w"))) { printf("Cannot open output file\n"); exit(1); } count = 0; for (i = 2; i < 1000; i++) { m =sqrt(i); flag = 1; for (j = 2; j <= m; j++) { if (i % j == 0) { flag = 0; break; } count++; } if (flag) { printf("%4d ", i); fprintf(fp," %4d", i); } } printf("\n乗除回数:%d\n", count); fprintf(fp,"\n乗除回数 %d\n", count); fclose(fp); return 0; } (通常課題2-3 1000以下の正の整数値のうち,素数をすべて計算し,結果をファイルに格納するプログラムを作れ. .また、計算の実行の中で乗除を行った回数もあわせて表示し、ファイルに格納すること 実行結果 2 3 5 7 11 13 17 … 991 997 乗除回数:78022 どこが間違ってるのか指摘してください お願いします!

  • Gaussの消去法のプログラムなんですがこれを利用して、消去法による行

    Gaussの消去法のプログラムなんですがこれを利用して、消去法による行列式の計算プログラムをつくりたいのですが難しくてよくわかりません。。。 教えていただきたいです。 困ってるのでよろしくお願いします。 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); printf("-- before --\n"); for( m = k;m < n;m++){ printf("%lf\n",a[n * m + k]); } printf("-- --\n"); j = pivot(a,n,k); if(j == ERROR) { return ERROR; } else { if(j != k) { for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } printf("-- after --\n"); for( m = k;m < n;m++){ printf("%lf \n",a[n * m + k]); } for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS){ return(ERROR); } sum=0.0; for(j=k+1; j<n; j++){ sum+=a[n*k+j]*x[j]; } x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }