• ベストアンサー

C++プログラムでのおかしな挙動

XxXxXxXxXxの回答

回答No.1

こんなロジックの一部だけじゃ、理解できんだろ? 1.out[i]には元々何が入ってる? 2.どうやってnewしてる?因みにnewですべての領域持つんだから、tmp[1000][360]で持っても同じだろ? 3.「1.#INF00」は、どうやって見た?デバッガで値を見たのか、それとも出力ロジックで画面か、ファイルに出したのか?またそのロジック。 せめてこのくらいは情報が無いと、これだけのロジックじゃ、何にも解らんじゃん。

gardens
質問者

補足

わかりにくくて申し訳ありません。 out[i]はdouble型の同期加算結果を入れる為の物で、 初期化の為にout配列全てに0.0を入れてあります。 newの事はよく分からないまま使いました。 最初にtmp[1000][360]と宣言すると動作しなかったからです。 1.#INF00はファイルに出力して見ました。 for( i=0; i<360; i++ ){ fprintf(fp, "%lf\n",out[i]); } にて出力し、同期加算結果の正弦波をエクセルにて表示させようとしていました。 まだまだわかりにくくてすいません。

関連するQ&A

  • 数独のJavaプログラム

    数独の解答を一発で出すプログラムを考えています。 自分が考えたプログラムは下記の通りです。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ) break; count++; } count = 0; } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]); } System.out.print("\n"); } } } これを実行すると、正しい数独の解が出来るまでに実行を20~30回。多い時は200回前後実行しないと出来ません。 実行結果(0は数独のルール上数字が入らない所) 9 3 6 5 4 1 7 8 2 1 7 4 2 9 6 5 3 0 5 2 8 7 3 0 0 0 0 2 1 5 3 7 8 4 6 9 8 6 3 4 1 9 2 7 5 4 9 7 6 5 2 1 0 0 7 5 1 8 6 4 9 2 3 3 8 2 9 0 0 0 0 0 6 4 9 1 2 5 8 0 0 これを一発で0がない状態にしたいのです。 因みにC言語だと下記のプログラムで一発で出るのですが。(前回質問したプログラム) int main(void) { int i,j,k,l,chk=0,num=0,tmp,count=0; int a[9][9];  srand((unsigned) time(NULL)); start: count=0; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) a[i][j]=0; for(tmp=1;tmp<10;tmp++){ num=0; while(num<9){ i = rand() % 9; j = rand() % 9; chk=0; for(k=0;k<9;k++) if(a[i][k]==tmp)chk=1; for(k=0;k<9;k++) if(a[k][j]==tmp)chk=1; for(k=(i/3)*3;k<(i/3)*3+3;k++){ for(l=(j/3)*3;l<(j/3)*3+3;l++){ if(a[k][l]==tmp)chk=1; } } if((chk==0)&&(a[i][j]==0)){ a[i][j]=tmp; num++; } if(count%100==99){ count++; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) if(a[i][j]==tmp)a[i][j]=0; num=0; } if(count>10000) goto start; count++; } } for(i = 0; i < 9; i++){ for(j = 0; j < 9; j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0; } このプログラムを実行すると一発で解答が出ます。 上のJavaプログラムを下のプログラムのようにするにはどうしたら良いでしょうか。

    • ベストアンサー
    • Java
  • Javaで数独の自動問題作成プログラム

    Javaで次のようなプログラムを作りました。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; }       } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを実行すると、次のようになります。 2 5 3 6 8 4 9 1 7 4 7 9 1 3 5 2 6 8 8 1 6 9 2 7 3 4 5 7 3 5 4 1 6 8 9 2 9 2 1 8 5 3 6 7 4 6 4 8 7 9 2 5 3 1 1 9 4 2 6 8 7 5 3 5 6 2 3 7 1 4 8 9 3 8 7 5 4 9 1 2 6 あとは、ここからランダムに50個数字を抜いて数独の問題にしたいのですが、 どうやったらランダムに数字を抜くことが出来るでしょうか? プログラムソースを提示していただくとありがたいのですが。宜しくお願いします。

  • C++の数独をJavaに変換したいのですが

    C言語のプログラムをJavaに変換しようと思っているのですが、上手くいきません。 下記のプログラムを実行すると、一発で数独の解答が出来上がるようになっています。 Javaにはgotoがないので、そこをどのように変えたらいいのかで迷っています。 どう直したら良いのでしょうか。 #include<stdio.h> #include<stdlib.h> #include <time.h> int main(void) { int i,j,k,l,chk=0,num=0,tmp,count=0; int a[9][9]; srand((unsigned) time(NULL)); start: count=0; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) a[i][j]=0; for(tmp=1;tmp<10;tmp++){ num=0; while(num<9){ i = rand() % 9; j = rand() % 9; chk=0; for(k=0;k<9;k++) if(a[i][k]==tmp)chk=1; for(k=0;k<9;k++) if(a[k][j]==tmp)chk=1; for(k=(i/3)*3;k<(i/3)*3+3;k++){ for(l=(j/3)*3;l<(j/3)*3+3;l++){ if(a[k][l]==tmp)chk=1; } } if((chk==0)&&(a[i][j]==0)){ a[i][j]=tmp; num++; } if(count%100==99){ count++; for(i = 0; i < 9; i++) for(j = 0; j < 9; j++) if(a[i][j]==tmp)a[i][j]=0; num=0; } if(count>10000) goto start; count++; } } for(i = 0; i < 9; i++){ for(j = 0; j < 9; j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0; }

    • ベストアンサー
    • Java
  • C言語、プログラムについて・・・

    次のプログラムは完成させたものの、プログラムの機能と実行結果について教えてください。 [プログラム] class RepEx3{ public static void main)String[] args){ int i, j, ast[] = {3,1,4,5,2}; for(i = 0; i <ast.Length; i++){ System.out.print(ast[1]+": "); for (j = 1; j <= ast[i]; j++) System.out.print(*); System.out.print("\"); // \n は改行を表すエスケープシーケンス    } } } 

  • 最早開始時間と最遅完了時刻を求めるプログラムをC言語で作成せよ、という

    最早開始時間と最遅完了時刻を求めるプログラムをC言語で作成せよ、というものを学校の課題でやっているのですがうまく行きません。どこがおかしいのでしょうか。 内容としてはアローダイアグラムで表される業務についてです。所要日数は画像で記しておきました。 #include <stdio.h> int main() { int ES[7];//最早開始時刻 int LS[7];//最遅完了時刻 int i,j; //ループカウンタ int tmp; int node[7][7] = { {-1,5,-1,-1,-1,-1,-1},//1 {-1,-1,5,3,-1,-1,-1},//2 {-1,-1,-1,10,-1,12,-1},//3 {-1,-1,-1,-1,3,-1,-1},//4 {-1,-1,-1,-1,-1,0,3},//5 {-1,-1,-1,-1,-1,-1,6},//6 {-1,-1,-1,-1,-1,-1,-1}//7 }; for(i = 0;i <7;i++){ ES[i] = 0; LS[i] = 0; } //最早 for(j = 0;j <6;j++){ for(i = 0;i <6;i++){ if(node[i][j]==-1){ continue; }else{ tmp = node[i][j]+ES[i]; if(ES[j+1]==0){ ES[j+1]=tmp; }else{ if(ES[j+1]<tmp){ ES[j+1]=tmp; } } } } } printf("最早開始日\n"); for(i = 0;i <7;i++){ printf("[%2d] : %3d\n",i+1,ES[i]); } //最遅 LS[7] = ES[7]; for(i =6;i>-1;i--){ for(j =6;j>-1;j--){ if(node[i][j]==-1){ continue; }else{ tmp = LS[j+1]-node[i][j]; if(LS[i]==0){ LS[i]=tmp; }else{ if(LS[i]>tmp){ LS[i]=tmp; } } } } } printf("最遅完了日\n"); for(i = 0;i <7;i++){ printf("[%2d] : %3d\n",i+1,LS[i]); } return 0; } 最早開始日 [ 1] : 0 [ 2] : 5 [ 3] : 10 [ 4] : 20 [ 5] : 23 [ 6] : 23 [ 7] : 29 最遅完了日 [ 1] : 0 [ 2] : 5 [ 3] : 10 [ 4] : 20 [ 5] : 23 [ 6] : 23 [ 7] : 29 となるはずが、 最早開始日 [ 1] : 0 [ 2] : 0 [ 3] : 5 [ 4] : 5 [ 5] : 15 [ 6] : 8 [ 7] : 17 最遅完了日 [ 1] : -18 [ 2] : -14 [ 3] : -13 [ 4] : -9 [ 5] : -3 [ 6] : -6 [ 7] : 17 となってしまいます。

  • プログラム(tmp)の意味について

    プログラム(tmp)の意味について begin for i:=1 to n-1 do for j:=i+1 to n do if a[i]>a[j] then begin tmp:=a[i] ; a[i]:=a[j] ; a[j]:=tmp end というプログラムがあるのですが、tmpがどういう役割を持っているのかよくわかりません。 このプログラムでtmpの辺りのプログラムがどのような意味を持っているか教えてもらえませんか?

  • Javaで数独の自動解法プログラム

    Javaで次のようなプログラムを作りました。 次に、ここから実行で得られた数独を自動解法プログラムによって、解が「1つ or 複数」かを調べるようにしたいのですが、その自動解法プログラムは新しく作らなければいけないのでしょうか。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, m, n, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; Random rnd1 = new Random(); int ran1; Random rnd2 = new Random(); int ran2; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ )  //横列に入る数字をチェック if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ )  //縦列に入る数字をチェック if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ )  //ボックスに入る数字をチェック for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; } } for ( i=0; i<30; i++ ) {    //0を入れる回数 ran1 = rnd1.nextInt(9); m = ran1; ran2 = rnd2.nextInt(9); n = ran2; if ( a[m][n] == 0 ) {  //0にしようとした場所が既に0だったら直前に戻る i--; } a[m][n] = 0; } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを(最初に入れる0の数を30個として)実行すると、次のようになります。 0 7 6 9 4 1 8 2 5 2 0 5 3 7 0 9 4 0 9 0 4 8 2 5 0 3 7 1 0 2 0 0 0 5 0 6 6 9 3 1 0 0 0 8 2 7 0 8 0 0 0 0 1 4 0 0 0 0 0 0 0 0 3 4 3 0 5 6 8 2 7 9 5 2 9 4 3 7 0 0 8 皆さんの回答の程宜しくお願いします。

  • プログラム停止について。

    こんばんは。 今作成しているプログラムにout[i][j]という出力用の多次元配列があります。この出力が全て同じになった時、プログラムを停止するようにしたいと思っています。 そこで、以下のような方法を考えました。 for( ; ; ) { //無限ループ flag = 0; for( i = 0; i < 10; i++ ) { for( j = 0; j < 4; j++ ) { System.out.print( out[i][j] ); if( out_sub[i][j] != out[i][j] ) { flag = 1; out_sub[i][j] = out[i][j]; } } System.out.println(); } if ( flag == 0 ) { System.exit(0); } } ですが、これがうまくいかず行き詰っています。 何かいい方法があったらぜひ教えてください。また、間違い等、指摘していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Cで回転プログラムの高速化を

    Cで、90枚の画像を、それぞれ0度から90度まで回転させるプログラムを作りました。 回転の処理は重く時間がかかるため、 それぞれの角度の回転後の位置を配列に格納して、 その値を参照して画像を回転させていこうと思ったのですが、 例えば、画像が300*300としたら回転座標を入れる配列は2次元で2つとりますよね? kaitenX[90][300] kaitenY[90][300] これで、例えば元画像を50度回転させる時のx,y座標が10,50の所の回転後の座標は kaitenX[50][10]の値(回転後のx座標の値) と kaitenY[50][50]の値(回転後のY座標の値)を 参照さしてやればいいと思うのですが、 このとき、回転後の画像をtemp[300][300]という回転後の出力用配列に 代入していくとき、 どうやって代入していけばよいでしょうか? まさか、 for(r=0;r<90;r++) //rは角度情報 for(i=0;i<300;i++) for(j=0;j<300;j++) { temp[i][j] = Gengazo[r][kaitenx[r][j]][kaiteny[r][i]] } なんて風には書けませんよね^^;(自分で一応試したけどダメでした) 回転後の座標を格納するまでは出来ると思うのですが、 格納後、どうやってその値を参照させて、格納させていけばいいか わかりません。 教えていただけませんでしょうか? また、もっと高速化できる効率の良い方法があれば教えて下さい。

  • ラベリング処理プログラム

    画像のラベリング処理プログラムを作っているんですが どうもうまく実行できません。よければ教えていただけないでしょうか。 #include<stdio.h> #include<stdlib.h> int column, row; unsigned char val[4] = {0,0,0,0}; unsigned char tmp[255]; int pos_y[4] = {-1, 0, 1, 0}; int pos_x[4] = {0, 1, 0, -1}; int i, j, x, y, label, level, label1; int label_count = 1; unsigned char *in, *out; void labeling_main(); void labeling_search(); void labeling_main() { for(i = 0; i < y; i++){ for(j = 0; j < x; j++){ printf("aaa\n"); if(out[i * x + j] == 255){ printf("bbb\n"); fflush(stdout); out[i * x + j] = label_count; labeling_search(label_count, i, j); label_count++; } } } } void labeling_search(int label_count, int x, int y) { for(i = 0; i < 4; i++){ if(out[(pos_y[i] + y) * x + (pos_x[i] + x)] == 255){ out[(pos_y[i] + y) * x + (pos_x[i] + x)] = label_count; labeling_search(label_count,(pos_y[i]+y),(pos_x[i]+x)); } } printf("ccc\n"); } int main(int argc, char *argv[]) { int result; int head, Magic; unsigned char *image, *in, *out, *res, *ros; FILE *fin, *fout; if(argc!=3){ printf("Usage : %s input output\n",argv[0]); exit(1); } fin = fopen(argv[1],"rb"); /* -------------------- ヘッダ取得ここから -------------------- */ fgets(tmp,255,fin); if(tmp[0]!='P') return 0; sscanf(tmp,"P%d",&Magic); if(Magic < 1 || Magic > 6) return 0; do fgets(tmp,255,fin); while(tmp[0]=='#'); sscanf(tmp,"%d %d",&x,&y); if(x < 1 || y < 1) return 0; fgets(tmp,255,fin); sscanf(tmp,"%d",&level); /* ヘッダの確認 */ printf("P%d\n",Magic); printf("%d %d\n",x,y); printf("%d\n",level); /* 画素の読み込み */ in = (unsigned char *)malloc(sizeof(unsigned char) *x*y); fread(in,sizeof(unsigned char),x*y,fin); fout = fopen(argv[2],"wb"); fprintf(fout,"P%d\n",Magic); fprintf(fout,"# My new PGM\n"); fprintf(fout,"%d %d\n",x, y); fprintf(fout,"%d\n",level); fwrite(out, sizeof(unsigned char),x*y, fout); out = (unsigned char *)malloc(sizeof(unsigned char) *x*y); //2値画像 for (i = 0; i < y; i++) { for (j = 0; j < x; j++){ if(in[i * x + j] > 120){ out[i * x + j] = 0; }else if(in[i * x + j] <= 120){ out[i * x + j] = 255; } } } labeling_main(); printf("Max label number:%d\n",label_count); free(in); free(out); fclose(fin); fclose(fout); } コンパイルは通るのですが実行するとlabeling_mainの if文でセグメンテーションが出てしまいます。