• 締切済み

このプログラムの問題点を教えてください。

//数独 #include <iostream.h> const int num_Max = 100; //一辺のマス最高値 void input_data( int a, int [num_Max][num_Max] ); //入力関数 void yoko_data( int a, const int [100][100], int & ); //判定 void tate_data( int a, const int [100][100], int & ); void block_data( int a, int b, const int [100][100], int & ); main() { int num; //一辺のマスの数 int m; //一ブロックの一辺にあるマスの数 int okey; //numが正常か判別 int dx, dy, dz; int masu[num_Max][num_Max]; //全部のマス cout << "\n埋められた数独が正しいかどうか判断するプログラムです。\n"; while(1){ cout << "横何マスありますか? (4-100)>>" ; cin >> num ; if( num > num_Max || num < 4){ cout <<"範囲外です。再入力して下さい。" ; }else{ m = sqrt( num ); okey = num - m * m; if(okey != 0) cout << "その数字は数独として成り立ちません。再入力して下さい。"; } } //マスの入力 input_data( num, masu ); //横判定 yoko_data( num, masu, dx ); if(dx = 0){ //縦判定 tate_data( num, masu, dy ); if(dy = 0){ //マス判定 block_data( num, m, masu, dz ); } } if(dx == dy == dz == 0) cout <<"\n大正解♪ おめでっとー。\n"; return 0; } //入力 void input_data( int kazu, const int matrix[num_Max][num_Max]) { cout <<"\nマスの数字の入力を左上から順に、右へと行って下さい。"; for(int i = 0; i < kazu; i++){ for(int j = 0; j < kazu; j++){ cout << i+1 << "行目の" << j+1 << "列目 >>"; cin >> matrix[i][j] ; } } } //横列(行)を順に判定 void yoko_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vx = 0; //かぶっていたと判定されたかどうかを見る用 for(int i = 0; i < kazu; i++){ //横一列取り出しました。 for(int j = 0; j < kazu; j++){ for( int k = 1; j+k < kazu; k++){ kaburi = matrix[i][j] - matrix[i][j+k]; if(kaburi == 0){ //かぶってたらループから抜け出す vx++; break; } } } } if(vx > 0) cout << "\n横列(行)検索時に不適切な部分を発見しました。\n"; return vx; } //縦列(列)を順に判定 void tate_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vy = 0; //かぶっていたと判定されたかどうかを見る用 for(int j = 0; j < kazu; j++){ //縦一列取り出しました。 for(int i = 0; i < kazu; i++){ for( int k = 1; k < kazu-1; k++){ kaburi = matrix[i][j] - matrix[i+k][j]; if(kaburi == 0){ //かぶってたらループから抜け出す vy++; break; } } } } if(vy > 0) cout << "\n縦列(列)検索時に不適切な部分を発見しました。\n"; return vy; } //1ブロックごとに判定 void block_data( int kazu, int ruto, int matrix[num_Max][num_Max]) { int hantei[num_Max][num_Max] ; //判定する部分を切り出す用 int kaburi; int vz; //まずブロックごとに切り出してみる for(int i = 0; i < ruto-1; i++){ for(int j = 0; j < ruto-1; j++){ int h = 0; //何ブロック目か int g = 0; //そのブロックの何個目か (h-1)++; for(int l = 0; l < ruto-1; l++){ for(int k = 0; k < ruto-1; k++){ hantei[h][g++] = matrix[i * m + k][j * m + l]; } } } } //かぶっているか判定する for(int x = 0; x < kazu; x++){ for(int y = 0; y < kazu; y++){ for( int z = 1; z < kazu-1; z++){ kaburi = hantei[x][y] - matrix[x+z][y]; if(kaburi == 0){ //かぶってたらループから抜け出す vz++; break; } } } } return vz; } C++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?

noname#32335
noname#32335

みんなの回答

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

コンパイルエラーが出る原因はプログラムが間違っているからなんだけど, 普通はエラーメッセージを見ればわかるんじゃないかなぁ. ちなみに, どんなエラーメッセージが出てます?

noname#26650
noname#26650
回答No.1

>コンパイルエラーが出てしまうのですが、原因を教えていただけませんか? きちんと設計せずにコードを書かれているからだと思います。

noname#32335
質問者

お礼

課題で作ったものなので、コーディング前提作業は適当に なっています。 それが原因といえば原因なんでしょうけど、そういうところは 目をつぶって、具体的にエラーコードと修正方法だけ明示して いただけないものでしょうか。 車が走らないのは何故か聞きたいだけであって、設計が悪いから 燃費が悪いだのまっすぐ走らないだのっていうことが聞きたいのでは ありません。

関連するQ&A

  • 設定した値が意図せぬ値に

    POJ 3176の問題です。 http://poj.org/problem?id=3176 #include <iostream> #include <algorithm> #define MAX 100 using namespace std; int main() { int n; cin >> n; int line[n-1][MAX]; int num[n-1][MAX]; cin >> line[0][0]; if(n==0) { cout << 0 <<endl; return 0; } else if(n==1) { cout << line[0][0] << endl; return 0; } for (int i =1;i < n;i++) { for (int j=0;j < i+1;j++) { int x; cin >> x; line[i][j]= x; } } for (int k= 0 ; k<n;k++) { num[n-1][k]= line [n-1][k]; } for (int k= n-2; k > 0 ; k--) { for (int l=0 ; l<k+1; l++) { num[k][l] = max (num[k+1][l],num[k+1][l+1]) + line[k][l]; } } num[0][0] = max(num[1][0],num[1][1]) + line[0][0]; cout << line[0][0] <<" "<<num[0][0]<<endl; return 0; } 入力 4 3 1 3 1 2 3 1 3 4 5 出力 1 12 最後に出力でline[0][0]をするようにしているのはバグチェックのためです。 ここで僕がわからないのはどうしてline[0][0]が3で宣言し、ほかでいじっていないにも関わらず、最後に1になっているのかということです。 どなたかわかる方がいらっしゃったらよろしくお願いします。

  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java
  • プログラミングで二番目に大きい数を表示する

    指定された個数(100個以下)だけ整数を読み込んで,読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムを作成。最大となる値が複数入力された場合も正しく処理する。 このプログラムで入力した数字が全部同じ時、二番目に大きい値はありません。と表示したいのですが、どのようにしたらいいのかわかりません。教えてください。あとこのプログラムで最大値と二番目に大きい値出せたのですが、念のため問題ないか確認お願いします。 #include <stdio.h> #define NUMBER 100 /*整数の個数の上限*/ int main(void) { int i; int num; int kazu[NUMBER]; int max; int sec; printf("整数は何個ですか:"); scanf("%d", &num); puts("整数を入力してください。"); for(i = 0; i<num; i++){ printf("%3d個目:",i+1); scanf("%d", &kazu[i]); } printf("入力された整数は%d個で、\n",num); for(i=0;i<num;i++) printf("%d ",kazu[i]); printf("です。\n"); sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>max) max=kazu[i]; } for(i=0;i<num;i++){ if(kazu[i]>max){ sec=max; max=kazu[i]; }else if((max>kazu[i]) && (kazu[i]>sec)) sec=kazu[i]; } printf("最大値は%dです。 \n",max); printf("二番目に大きい値は%dです。\n", sec); return(0); }

  • 【Java】ある数列から、素数を探すプログラムについて

    Java初心者です。独学なので質問できる環境が無く、 こちらで質問致します。回答をお願い致します。 以下のプログラムについて質問です。 class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } 上記の「配列の初期化」の個所、 for(int i = 0; i < max; i++) a[i] = true; ここでなぜ、a[i] = true;となるかわかりません。 0と1はどちらも素数ではないと思うので、 私はtrueではないと思うのですが・・・。 ぜひとも教えて頂きたいと思います。

    • ベストアンサー
    • 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; 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
  • 最大値を求める

    3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; }

  • 小さい順に並べ替えるプログラム

    コンピュータに10個のてきとうな数字を入力させ それを、小さい順に並べ替えるプログラムです。 以下のようにしたのですが、エラー0 警告0 なのに動きません。 どこが違うのでしょうか? #include<iostream> #include<cstdlib> #include<ctime> using namespace std; const int NUM_ELEMENTS=10; void sort(int*); void generation(int*); void exchange(int&,int&); void sort(int* a){ int min, locate, i, j; for(i=0; i<NUM_ELEMENTS-1; i++){ min = a[i]; locate = i; for(j=i; j<NUM_ELEMENTS; j++){ if(min > a[j]){ min = a[j]; locate = j; } } exchange(a[i],a[locate]); } } void generation(int* a){ int i; srand(time(NULL)); for(i=0; i<NUM_ELEMENTS; i++){ a[i] = rand(); } } void exchange(int& a,int& b){ int t; t=a; a=b; b=t; } int main(){ int data[NUM_ELEMENTS]; generation(data); sort(data); return 0; }

  • マージソート内の再帰処理にすいて

    #include<stdio.h> #define MAX 4 int temp[MAX]; void marge(int num[],int left,int right) { int i,j,mid,k   if(left>=right)return; mid=(left+right)/2; marge(num,left,mid);//(1) maege(num,mid+1,right);//(2) for(i=left;i<=mid;i++) temp[i]=num[i]; for(i=mid+1,j=right;i<=right;i++,j--) temp[i]=num]j]; i=left; j=right; for(k=left;k<=right;k++) if(temp[i]<=temp[j]) num[k]=temp[i++]; else num[k]=temp[j--] } マージソート内はこういった関数を記述してエラーもでないのですが、(1)と(2)の処理がよくわかりません。 (1)は再帰的に処理していってif(left>=right)return;の条件を満たした場合に(2)の処理に入っていきますよね? その場合、(2)の処理を行う際に(1)が(2)の再帰より前に記述されているので(1)がまた処理されるのでしょうか? 一連の流れを(1)、(2)を使って表してほしいです。

  • 最頻度のプログラム

    以下のような最頻度のプログラムを作成しました.最頻度が1つしか存在しないような場合はうまく動くと思います.しかし最頻度の数字が2つ以上存在すると,一番はじめに書い最頻度の数字しか表示しないと思います.どう改良すれば,すべての最頻度の数字を拾ってくれますかね. /*最頻値を求めるプログラム*/ #include<stdio.h> int main(void) { int i,j; int count=0,COUNT=0; double num[20]; double max; printf("最頻値を求めます.数字を20個入力してください.\n"); for(i=0;i<20;i++) { printf("%d\t",i+1); scanf("%lf",&num[i]); } for(i=0;i<20;i++) { count=0; for(j=i+1;j<20;j++) { if(num[i]==num[j]) { count++; } if(COUNT<count-1) { COUNT=count; max=num[i]; } } } printf("%lfが最頻値です.\n",max); return 0; }

  • C言語の事で・・・

    C勉強し始めたばかりなんですが気になってるプログラムがあります。 ttp://akabas.net/lib/CTask.aspx?id=105のページのナンバーズっていうゲームなんですがよく分からない部分があります。どなたか解説してもらえませんか? for( turn = 1 ; ; turn++ ){ int num; int test[4]; int kazu = 0; int keta = 0; int i, j; printf( "数を当ててください。\n" ); scanf( "%d", &num ); test[3] = num % 10; test[2] = ( num / 10 ) % 10; test[1] = ( num / 100 ) % 10; test[0] = ( num / 1000 ) % 10; for( i = 0 ; i < 4 ; i++ ){ for( j = 0 ; j < 4 ; j++ ){ if( numbers[i] == test[j] ){ kazu++; if( i == j ) keta++; のとこです。お願いします。

専門家に質問してみよう