• 締切済み

相互相関関数

相互相関関数を求めるプログラムを書いたのですが、入力信号のずらし幅が負の時と正の時で処理を分けた場合、結果の波形の整合性が取れずに困っております。計算上の根本的違いやコードのミスも含めて、ご指南頂きたいです。 ちなみに参考にしたのは、 http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j5ec02/taro12-sjt0_p13_2... の最後の2ページで、入力のサンプルデータは、 http://www.mech.tohoku-gakuin.ac.jp/nken/java/new2/crosscorr7/cross... のデータを用いました。結果画像を添付します。 #include "stdafx.h" #include <stdio.h> #include <math.h> #include <stdlib.h> #define MAX 10000000 #define buf 256 int main (){ FILE *fpi; //_入力ファイル FILE *fpo; //_出力ファイル int num; //_対象波形全点数 double *x,*y; //_波形データ double *cxy1,*cxy2;//結果 char filename[buf]; /////////ファイルオープン/////////// (省略) ////////////データ読み込み/////////////////// if(((x=(double*)malloc(MAX))==NULL)||((y=(double*)malloc(MAX))==NULL)){ fprintf(stderr,"Can't_allocate_memory.\n"); return 0; } num=0; while ( fscanf(fpi,"%lf,%lf",&x[num],&y[num]) != EOF && num < MAX ){ num++; } printf("%d",num); ////////相互相関関数////////////////////////// if(((cxy1=(double*)malloc(MAX))==NULL)||((cxy2=(double*)malloc(MAX))==NULL)){ fprintf(stderr,"Can't_allocate_memory.\n"); return 0; } int i,j,n; double sum; n = num-1; //////////////ずらし幅が負の時の演算//////////// for( i=0; i<n; i++ ) { sum = 0.0; for( j=0; j < n-i; j++ ) { //k = (j + i) % num; sum = sum + x[j] * y[j+i]; } cxy1[i]=double(sum/(n-i)); } ////ずらし幅が正の時の演算/// n = num-1; for( i=0; i<n; i++ ) { sum = 0.0; for( j=0; j < n-i; j++ ) { //k = (j + i) % num; sum = sum + x[i+j] * y[j]; } cxy2[i]=double(sum/(n-i)); } /////////結果の出力/////////////// for(i=0;i<n;i++){ fprintf(fpo,"%f\n",cxy1[i]); } for(i=0;i<n;i++){ fprintf(fpo,"%f\n",cxy2[i]); } ///////////////////////// fclose(fpi); fclose(fpo); free(x); free(y); free(cxy1); free(cxy2); }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「404 になる」自体は本当はどうでもよくて本題は「あと」以降なんだけどなぁ.... 特に, 最も重要なのは あなたはどのような順序で出力したいのでしょうか? のところ. たとえば, 画像のグラフにおいて横軸の 1 とか 1600 とかにはどのようなものが対応するのですか? そして, それはどのようにして得られるはずのものなんですか?

endzweck2
質問者

補足

説明不足でしたので、お答えしますと、 横軸はずらし幅、で実際には0を中央として、右に行くほど正の方向へずれ、左に行くほど負の方向へずれるようなグラフにしたいのです。 縦軸は各ずれ幅における相関係数になるのだと思います。 ちなみに上記のプログラムには、負方向のにずらした時の相関を現在とは逆の順序に並べ替える必要があることは分かりました。

回答No.2
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

2つの URL がどちらも 404 になるので見えません. あと, この画像は何を意味するのでしょうか? あなたはどのような順序で出力したいのでしょうか? 蛇足ですが, 「malloc で MAXバイトとっておきながらそのあとの while ループで num < MAX という比較を行っている」ところはおかしい可能性が高い (sizeof(double)==1 という環境でない限りおかしい)です.

endzweck2
質問者

補足

申し訳ありません。一つ目が、以下URLの [後期:Javaで試しながら学ぶ信号処理]の欄、 1.自己相関と相互相関の項目の右側のPDFファイルになります。 http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/j5ec02/ 2つ目が以下URLの[周波数解析など]の欄、相互相関の項目になります。 http://www.mech.tohoku-gakuin.ac.jp/nken/java/java.html

関連するQ&A

  • 関数宣言

    3次元で領域を確保するプログラムをmalloc関数を用いて書きました。しかし、プログラムが長いので関数宣言をしなさいといわれたために、以下のプログラムを書きました。しかし、途中でつまづいてしまい、どのように関数を用いたり、関数を定義すれば良いのか混乱しています。初心者ですが、どうかお願いします。 /*ソース*/ #include<stdio.h> #include<stdlib.h> int main(){ double ***C; f3Malloc(C,.,.); //数値を代入(関数の使い方?) f3Free(C,.,.); } /*3次元配列(返し方?)*/ double*** f3Malloc(C,,){ int i,j,x,y,z; x = 2; y = 3; z = 4; C=(double***)malloc(sizeof(double**)*x*y*z); for(i=0;i<y;i++){ C[i]=(double**)malloc(sizeof(double*)*y*z); for(j=0;j<z;j++){ C[i][j]=(double*)malloc(sizeof(double)*z); } } } /*メモリの解放(返し方?)*/ void f3Free(C,.,.){ int i,j,x,y; x = 2; y = 3; for(i=0;i<x;i++){ for(j=0;j<y;j++){ free(C[i][j]); } free(C[i]); } free(C); }

  • ファイル入力の仕方

    下記のような入力ファイル(input.txt)を配列に格納するプログラムを作成しています。 下のソースコードは行数・列数が一定の場合のものですが、実際の入力データは行数・列数とも不定です。つまり、行数・列数をプログラムで読み取らなければなりません。この場合、ソースコードをどのようにすれば良いのでしょうか? 大変お手数ですが、教えてください。よろしくお願いします。 x y1 y2 y3 y4 10.0 1.2 1.5 1.0 2.1 10.5 1.3 1.4 1.2 2.2 11.0 1.8 1.2 2.2 3.1 11.5 2.1 1.0 1.2 4.5 12.0 1.9 1.1 1.1 5.5 13.0 2.4 1.1 2.1 4.2 ・1行目をchar型配列に格納したい。 ・2行目以降はdouble型配列で1列目をX[]、2列目以降をY[][]に格納したい。 ・行数は20(2行目以降)まで、列数は10(2列目以降)まで #include <stdio.h> #include <stdlib.h> int main(){ int i,j; double X[20],Y[20][4]; char x[2],y[10][4]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"Cannot open file.\n"); exit(1); } fscanf(fpi,"%s %s %s %s %s",x,y[0],y[1],y[2],y[3]); printf("%s %s %s %s %s\n",x,y[0],y[1],y[2],y[3]); for(i=0;i<6;i++){ fscanf(fpi,"%lf",&X[i]); printf("%4.1lf ",X[i]); for(j=0;j<4;j++){ fscanf(fpi,"%lf",&Y[i][j]); printf("%4.1lf ",Y[i][j]); } printf("\n"); } printf("\n"); return 0; }

  • C言語のプログラミングの解答例又は修正箇所をおしえていただきたいのですが

    #include <stdio.h> int main(int argc, char **argv){ int a,b,c,g,r,i,j,ll;  int blue,green,red;  FILE *fpi,*fpo; unsigned long size,head,width,height,offset;  unsigned long comp,isize,ucolor,icolor; unsigned short plane,bitsize;  unsigned long wreso,hreso; unsigned char *image;  char infile[1024] = "t.bmp";  char outfile[1024] = "g.bmp"; long ww,hh;  long w3,h3;  unsigned char *img;  unsigned char *img2; int bai1,bai2;  bai1=1,bai2=3; fpi=fopen(infile,”rb"); for(i=0;i<2;i++){c=getc(fpi);} for(i=0,size=0;i<4;i++){size += (getc(fpi))<<(8*i);} for(i=0;i<4;i++){c=getc(fpi);} for(i=0,offset=0;i<4;i++){offset += (getc(fpi))<<(8*i);} ↑と同じようhead,width,height,plane,bitsize,comp,isize,wreso,hreso,ucolor,icolorを書く(ただしplane,bitsizeはi<2) hh=height*bai1/bai2; ww=width *bai1/bai2; img2 = (unsigned char*)malloc(sizeof(char)*3*ww*hh); for(j=0;j<hh;j++){ for(i=0;i<ww;i++){ int i1,j1,i2,j2; double x,pa,pb,pc,pd,x11,x21,x12,x22; int bb,gg,rr; i1=(i*(width-1))/(ww-1); i2=i1+1; x=(i*(width-1)*1.0)/((double)(ww-1)); pa=x-i1; pb=i2-x; j1=(j*(height-1))/(hh-1); j2=j1+1; x=(j*(height-1)*1.0)/((double)(hh-1)); pc=x-j1; pd=j2-x; x11=(double)img[j1*width*3+i1*3+0;] x21=(double)img[j1*width*3+i2*3+0]; x12=(double)img[j2*width*3+i1*3+0]; x22=(double)img[j2*width*3+i2*3+0]; bb=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd); x11=(double)img[j1*width*3+i1*3+1]; x21=(double)img[j1*width*3+i2*3+1]; x12=(double)img[j2*width*3+i1*3+1]; x22=(double)img[j2*width*3+i2*3+1]; gg=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd); x11=(double)img[j1*width*3+i1*3+2]; x21=(double)img[j1*width*3+i2*3+2]; x12=(double)img[j2*width*3+i1*3+2]; x22=(double)img[j2*width*3+i2*3+2]; rr=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd);; img2[j*ww*3+i*3+0]=(unsigned char)(bb&0xff); img2[j*ww*3+i*3+1]=(unsigned char)(gg&0xff); img2[j*ww*3+i*3+2]=(unsigned char)(rr&0xff); } } w3=ww*3; h3=hh*3; if((w3*3)%4==0){size=offset+w3*h3*3;} else{size= offset+w3*h3*3-(4-(w3*3)%4);} isize = size-offset; fpo=fopen(outfile,"wb"); putc('B', fpo); putc('M', fpo); for(i=0;i<4;i++){putc(((size>>(8*i))&0xff),fpo);} for(i=0;i<4;i++){putc(0x0,fpo);} for(i=0;i<4;i++){putc((((offset)>>(8*i)&0xff),fpo);} ↑と同じようhead,width,height,plane,bitsize,comp,isize,wreso,hreso,ucolor,icolorを書く(ただしplane,bitsizeはi<2) fwrite(&w3 ,sizeof(long),1,fpo); ↑と同じように&h,&offset,&head,&width,&height,&plane,&bitsize,&comp,&isize,&wreso,&hreso,&ucolor,&icolorを書く for(jj=0;jj<3;jj++){ for(j=hh-1;j>=0;j--){ ll=0; for(ii=0;ii<3;ii++){ for(i=0;i<ww;i++){ putc(img2[j*ww*3+i*3+0],fpo); putc(img2[j*ww*3+i*3+1],fpo); putc(img2[j*ww*3+i*3+2],fpo); ll+=3; } } ll=ll%4; if(ll!=0){for(i=0;i<(4-ll);i++)putc(0x0,fpo);} } } printf("Done\n"); fclose(fpo); printf("%s -> %s\n",infile,outfile); }

  • 加算できない

    #define NUM 1 void main(int argc, char *argv[]) { int i; float su01[NUM],suetc[NUM],j; FILE *fpi,*fpl; fpi = fopen(argv[1],"r"); fpl = fopen(argv[2],"r"); for(i=0;i<NUM;i++){ fscanf(fpi,"%f",&su01[i]); } for(i=0;i<NUM;i++){ fscanf(fpo,"%f",&suetc[i]); } for(i=0;i<NUM;i++){ suetc[i] += su01[i]; } for(i=0;i<NUM;i++) printf("%f\n",suetc[i]); } このプログラムで「aaa.txt」に入った30と「bbb.txt」に入った20を足して、50が入った「ccc.txt」というファイルを作りたいのですが、足し算をすることが出来ません。 よろしければご指摘をお願いします。

  • GUI~ボタン処理~

    このプログラムはファイル操作を使ったプログラムです。 import java.io.*; class k203 { public static void main(String args[]) throws IOException { int num,max,test[][]; double sum[]; String name[]; String Subj[] = {"国語","数学","社会","理科","英語"}; num = Read.readInt("人数"); test = new int[num][Subj.length]; sum = new double[Subj.length]; name = new String[num]; for(int i=0; i<num; i++) { System.out.print( (i+1)+"人目の名前:"); name[i] = Read.readString(); } System.out.print("\n"); for(int i=0; i<num; i++) { System.out.println(name[i]+"さんの点数"); for(int j=0; j<Subj.length; j++) { test[i][j] = Read.readInt(Subj[j]); sum[j] += test[i][j]; } } System.out.print("\n"); for(int j=0; j<Subj.length; j++) { max = 0; for(int i=0; i<num; i++) { if(test[i][j]>test[max][j]) { max = i; } } System.out.println(Subj[j]); System.out.println("最高点:"+test[max][j]+" "+name[max]+"さん"); System.out.println("平均点:"+sum[j]/num); System.out.print("\n"); } } } このプログラムをGUIをつかってボタンをクリックすると実行できるように したいのですがどんな感じにすればよいか教えてください!

    • ベストアンサー
    • Java
  • 画像処理プログラム

    以下の問題でプログラムを改良したのですが合っていますか?間違ってたら教えてください 図3 は、画像中の全ての画素に対する、濃度値の頻度分布を示すヒストグラムの例である。サンプルプロググラムhistogram.c をもとに、入力画像の濃度値のヒストグラムを作成するプログラムを完成させる。 1. Histogram.c をそのまま実行すると、ダミーデータを用いた結果画像が出力される。 $ gcc □ Histogram.c -o □ Histogram ↓ $ ./Histogram ○○○.pgm □ Histogram.pgm ↓ 2. Histogram.c を次のように変更し、プログラムを完成させる。 (a)入力画像のヒストグラムを求める。 各画素を参照し、その画素値img[i][j] に対応する番号の配列histogram[0255] の値を1 増やす。 (b)頻度の最大値を求める。 濃度値i=0255 について調べ、もし頻度histogram[i] の値がそれまでの最大値max frequency より大きければ、最大値max frequency を更新する。 (c)ヒストグラム画像を作成する。 最大頻度を1 としたときの割合(histogram[i]/max frequency)を求め、それに画像の大きさH_height を掛けることで各濃度値のグラフの長さlength を求める。 length = H height * histogram[i] / max frequency #include <stdio.h> #include <stdlib.h> #define V_width 320 #define V_height 240 #define amp 1.0 #define GLEVEL 256 /* 最大階調 */ #define MAX_BRIGHTNESS 255 #define H_width GLEVEL #define H_height 256 int d[9]; int i, j, dat; float z, zz; unsigned char img [V_height][V_width]; /* input image */ unsigned char work[H_height][H_width]={0}; /* work space */ long int histogram[GLEVEL]={0}; /* ヒストグラム */ long int max_frequency=0; /* 頻度の最大値 */ float length; /* 頻度を表すグラフの長さ */ int main(int argc, char* argv[]) { FILE *fpi, *fpo; unsigned char data; char str[ 256]; int width, height; /* check arg number */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* open input file */ if ((fpi = fopen(argv[1], "rb")) == NULL) { fprintf(stderr, "input file open error!\n"); exit(1); } /* open output file */ if ((fpo = fopen(argv[2], "wb")) == NULL) { fprintf(stderr, "output file open error!\n"); exit(1); } /* read PGM header */ while(1){ fgets(str, 256, fpi); if(str[0] == '#'){ fprintf( stderr, "%s", str); } else if( !strncmp( str, "P5", 2)){ fprintf( stderr, "This file is a PGM file.\n"); } else if( !strncmp( str, "255", 3)){ fprintf( stderr, "The file is opened.\n"); break; } else{ sscanf( str, "%d %d", &width, &height); fprintf( stderr, "SIZE: %3d x %3d\n", width, height); } } /* read data */ for (i=0; i<height; i++) { for (j=0; j<width; j++) { fread( &data, 1, 1, fpi); img[i][j] = data; } } /* (a) 入力画像のヒストグラムを求める */ for(i=0; i<height; i++){ for(j=0; j<width; j++){ // histogram([i][j])++; } } /* (b) 頻度の最大値を求める */ for ( i=0; i<GLEVEL; i++) { // if (histogram[i]>max_frequency) max_frequency = histogram[i]; } /* (c) ヒストグラム画像を作成する */ for (j=0; j<H_width; j++) { length = (float) H_height * j / H_width; //仮のデータ for (i=0; i<length; i++) { work[H_height-1-i][j] = MAX_BRIGHTNESS; length = H_height * histogram[i] / max_frequency } } /* write data */ fprintf(fpo,"P5\n %d %d\n 255\n", H_width, H_height); for (i= 0; i<H_height; i++) { for (j= 0; j<H_width; j++) { fwrite( &work[i][j], 1, 1, fpo); } } fclose(fpi); fclose(fpo); return 0; }

  • 風の抵抗を考慮した放物運動

    風の抵抗を考慮した放物運動のプログラムを作ったのですが、無限ループが終了しません。どうすればよいでしょうか?以下、プログラムです。 #include<stdio.h> #include<math.h> #define MAX 2 double g=9.8; /*重力加速度*/ double k=0.0; /*抵抗係数*/ void main() { int rhs(double,double*,double*); double x,y[MAX]; double h=0.01; double x_old,y_old[MAX],f[MAX]; double k1[MAX],k2[MAX],k3[MAX],k4[MAX],k_work[MAX]; double z; int i,j; x=0;y[0]=28.3;y[1]=0.0;y[2]=28.3;y[3]=0.0; printf("%f %f %f\n",x,y[1],y[3]); for(i=1; ;i++){ /*ここは無限ループに*/ if(y[3]>0.0){ break; } /*地面に落ちたら計算終了*/ x_old=x; for(j=0;j<MAX;j++)y_old[j]=y[j]; x=i*h; rhs(x_old,y_old,f); for(j=0;j<MAX;j++){k1[j]=h*f[j];k_work[j]=y_old[j]+k1[j]/2.;} rhs(x_old+h/2,k_work,f); for(j=0;j<MAX;j++){k2[j]=h*f[j];k_work[j]=y_old[j]+k2[j]/2.;} rhs(x_old+h/2,k_work,f); for(j=0;j<MAX;j++){k3[j]=h*f[j];k_work[j]=y_old[j]+k3[j];} rhs(x_old+h,k_work,f); for(j=0;j<MAX;j++) k4[j]=h*f[j]; for(j=0;j<MAX;j++) y[j]=y_old[j]+(k1[j]+2*k2[j]+2*k3[j]+k4[j])/6; if(i%1==0)printf("%f %f %f\n",x,y[1],y[3]); } } int rhs(double x,double y[],double f[]) { f[0]=y[1]; f[1]=y[3]; f[2]=-k*pow(f[0]*f[0]+f[1]*f[1],0.5)*f[0]; f[3]=-k*pow(f[0]*f[0]+f[1]*f[1],0.5)*f[1]-g; return 0; }

  • ファイルをオープンするときのエラー

    C言語であるファイルにある数値を100ごとに合計して,ほかのファイルに書き出す。しかし,実行するとエラーでてきます。原因はわからないです。因みに,オープンしたいファイルをほかのディレクリに置いたら,ファイルが見付かりませんとのエラーがありました、WindowsのC言語でカレントディレクトリを探すときは何の関数を使えばいいでしょうか? int main(void) { int i,k; int num; char filename[64],fileread[64],filewrite[64]; FILE *fp0,*fp1; double sum1,sum2,sum3; int *ch[3]; sum1=sum2=sum3=0.0; printf("ファイル名を入力ください!\n"); scanf("%s",filename); fprintf(stderr,"\n%s\n",filename); sprintf(fileread,"C:\\%s.txt",filename); fprintf(stderr,"%s\n",fileread); sprintf(filewrite,"C:\\%s.csv",filename); for (i=0;i<3;i++) { if ( (ch[i]=(int *)malloc(4*30))==NULL ) { fprintf(stderr,"Cannot get memory <ch[%d]>.",i); return -1; } } fprintf(stderr,"%s\n",filewrite); if ((fp0=fopen(fileread,"rb"))==NULL) { fprintf(stderr,"Cannot open file %s\n",fileread); return 0; } fscanf(fp0,"%d", &num); if((fp1=fopen(filewrite,"wb"))==NULL) { fprintf(stderr,"Cannot open file!%s\n",filewrite); return 0; } for(i=0;i<50;i++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); } for(i=0;i<num/100;i++) { for (k=0;k<100;k++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); if ( feof(fp0) != 0 ) break; sum1=sum1+*(ch[0]); sum2=sum2+*(ch[1]); sum3=sum3+*(ch[2]); } fprintf(fp1,"%d %d %d\n",sum1,sum2,sum3); } fclose(fp0); fclose(fp1); return 0; }

  • ファイル入力方法について

    下記の入力ファイルinput.datの内容を出力するプログラムを作っています。 ・1001,1002,・・・はデータ番号 ・データ番号の下は、行数1~20,列数4のデータ ・「DATAEND」で入力停止 1001 aa bb 01 02 cc dd 03 04 1002 ee ff 05 06 gg hh 07 08 ii jj 09 10 1003 kk ll 11 12 mm nn 13 14 DATAEND データ番号なしの入力データを出力するソースが下記のものです。データ番号が入った入力データではうまくファイル入力できません。 大変お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,j,n=0,N=0,num[20],c[10][20],d[10][20]; char str[20][100],a[10][20][5],b[10][20][5]; FILE *fpi; if((fpi=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<10;i++){ for(j=0;j<20;j++){ fgets(str[i],sizeof(str[i]),fpi); if(sscanf(str[i],"%s %s %d %d",a[i][j],b[i][j],&c[i][j],&d[i][j]) != 4){ break; } n++; } num[i]=n; n=0; if(num[i]==0){ break; } N++; } for(i=0;i<N;i++){ for(j=0;j<num[i];j++){ printf("%s %s %d %d\n",a[i][j],b[i][j],c[i][j],d[i][j]); } printf("\n"); } fclose(fpi); return 0; }

  • C言語での質問

    プログラミングの課題をやっているのですが、一部どうしてもわからないことがあるので質問させて下さい。 課題では100個の点のX座標、Y座標を0から5の間でランダムに設定し、ファイルに書き出すといった内容なのですが、この点を設定した時、任意の2点のX座標、Y座標の差が0.01以下になる場合は設定し直さないといけません。 これは後々の課題に関係してくるから、みたいなのですが。 そこで点の設定の関数として以下のようなプログラムを考えてみました。(ちなみに構造体pointを前に宣言してあり、p[].xは点のX座標、p[].yは点のY座標です。また、NUM=100と最初に宣言してあります。) void tensettei(point p[], int num){ int i, j, k; double sa; for(i=0; i < num; i++){ p[i].x = ((double) rand()) / ((double) RAND_MAX) * 5; p[i].y = ((double) rand()) / ((double) RAND_MAX) * 5; } for(j=0; j < (num - 1); j++){ for(k=j+1; k < num; k++){ if(p[j].x > p[k].x) sa = p[j].x - p[k].x; else sa = p[k].x - p[j].x; if(sa < 0.01) tensettei(p, NUM) } } for(j=0; j < (num - 1); j++){ for(k=j+1; k < num; k++){ if(mp[j].y > mp[k].y) sa = mp[j].y - mp[k].y; else sa = mp[k].y - mp[j].y; if(sa < 0.01) tensettei(p, NUM) } } } しかし、実行してもエラーが起こったのかすぐに終了してしまい、この後に点データを出力するプログラムを書いているのですが、ちゃんと出力されません。 いろいろプログラムを変えて試した結果、原因は「tensettei(p, NUM)」にあることはわかりました。 それさえ変えればすればうまく動作しましたので。 再帰と同じ感じでいけるかと思ったのですがどうやら駄目のようです。 そこで質問なのですが、ループの中である条件が起こったら最初からやり直し、てなプログラムはどんな風にすればいいのでしょうか?

専門家に質問してみよう