<解決しました>全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
po_po
記事: 38
登録日時: 9年前

<解決しました>全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプログラム

#1

投稿記事 by po_po » 9年前

入力は、初めにいくつの命令があるか、次に命令の種類、その次に行列の要素を0にする範囲を指定しています

入力が1,1,3,2,6のときは95
2,1,3,2,6,1,3,4,7なら94
4,1,3,2,6,2,6,3,8,1,8,2,6,2,2,3,6なら82を表示すれば正しいのですが、違った値が表示されます。
プログラムのどこが間違っているのか教えてください。

コード:

#include <stdio.h>


// 配列にサイズを定義する。
#define MATRIX_SIZE (10)

void show_data(int state[MATRIX_SIZE][MATRIX_SIZE]) {
  int i, j;
  printf("------\n");
  for (i = 0; i < MATRIX_SIZE; i++ ) {
    for (j = 0; j < MATRIX_SIZE; j++) {
      printf("%d ", state[i][j]);
    }
    printf("\n");
  }
  printf("------\n");
}



void order(int state[][], int n,int c, int s, int e){// nが1ならc列のs行からe行に0を代入し、2ならc行のs列からe列に0を代入する
	int i ;
	if(n == 1){
	for(i = s; i <= e ; i++){
		state[i][c] = 0;
	}
}
    else if(n == 2){
    int i;
	for(i = s; i <= e ; i++){
		state[c][i] = 0;
	}
    }
    
}
	
void execute(int state[][], int a){// aの値の数だけorderを実行する
	int i;
	int n, c, s, e;
	
	for(i = 1; i <= a; i++){
		scanf("%d%d%d%d", &n, &c, &s, &e);
		printf("%d %d %d %d \n",n ,c ,s ,e );
		order(state , n, c, s, e);
	}
}
	
main(){
	int a;
	int state[10][10];
    int i;
    int j;
    int sum = 0;
    for(i = 0; i < 10; i++ ){
    	for( j = 0; j < 10; j++){
    		state[i][j] = 1;
    	}
    }
    
	scanf("%d", &a );
	printf("%d\n",a);
	execute(state, a);
	for(i = 0; i < 10; i++ ){
    	for( j = 0; j < 10; j++){
    		sum = sum + state[i][j];
    	}
    }
    show_data(state);
	printf("%d",sum);
}
最後に編集したユーザー po_po on 2015年6月23日(火) 16:41 [ 編集 1 回目 ]

アバター
へにっくす
記事: 634
登録日時: 12年前
住所: 東京都

Re: 全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプログラムが動きま

#2

投稿記事 by へにっくす » 9年前

とりあえずそのままでは、VC++に通すことはできなかったので、以下のように修正しました。

コード:

#include <stdio.h>


// 配列にサイズを定義する。
#define MATRIX_SIZE (10)

void show_data(int state[MATRIX_SIZE][MATRIX_SIZE]) {
    int i, j;
    printf("------\n");
    for (i = 0; i < MATRIX_SIZE; i++ ) {
        for (j = 0; j < MATRIX_SIZE; j++) {
            printf("%d ", state[i][j]);
        }
        printf("\n");
    }
    printf("------\n");
}



void order(int state[MATRIX_SIZE][MATRIX_SIZE], int n,int c, int s, int e) { // nが1ならc列のs行からe行に0を代入し、2ならc行のs列からe列に0を代入する
    int i ;
    if(n == 1) {
        for(i = s; i <= e ; i++) {
            state[i][c] = 0;
        }
    }
    else if(n == 2) {
        int i;
        for(i = s; i <= e ; i++) {
            state[c][i] = 0;
        }
    }

}

void execute(int state[MATRIX_SIZE][MATRIX_SIZE], int a) { // aの値の数だけorderを実行する
    int i;
    int n, c, s, e;

    for(i = 1; i <= a; i++) {
        scanf("%d%d%d%d", &n, &c, &s, &e);
        printf("%d %d %d %d \n",n ,c ,s ,e );
        order(state , n, c, s, e);
    }
}

void main() {
    int a;
    int state[10][10];
    int i;
    int j;
    int sum = 0;
    for(i = 0; i < 10; i++ ) {
        for( j = 0; j < 10; j++) {
            state[i][j] = 1;
        }
    }

    scanf("%d", &a );
    printf("%d\n",a);
    execute(state, a);
    for(i = 0; i < 10; i++ ) {
        for( j = 0; j < 10; j++) {
            sum = sum + state[i][j];
        }
    }
    show_data(state);
    printf("%d",sum);
}
実行結果

コード:

C:\Users\MIX-C\Documents>1
1
1
1 3 2 6
1 3 2 6
------
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
------
95
C:\Users\MIX-C\Documents>1
2
2
1 3 2 6
1 3 2 6
1 3 4 7
1 3 4 7
------
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
------
94
C:\Users\MIX-C\Documents>1
4
4
1 3 2 6
1 3 2 6
2 6 3 8
2 6 3 8
1 8 2 6
1 8 2 6
2 2 3 6
2 2 3 6
------
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
------
83
C:\Users\MIX-C\Documents>
実行結果を見る限りだと、最後の値だけ83と違いますが、このことを言っていますか?
もしかして最後のは2,2,3,6でなく2,2,3,8では?

コード:

C:\Users\MIX-C\Documents>1
4
4
1 3 2 6
1 3 2 6
2 6 3 8
2 6 3 8
1 8 2 6
1 8 2 6
2 2 3 8
2 2 3 8
------
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
------
82
C:\Users\MIX-C\Documents>
written by へにっくす

box
記事: 2002
登録日時: 13年前

Re: 全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプログラムが動きま

#3

投稿記事 by box » 9年前

po_po さんが書きました:入力は、初めにいくつの命令があるか、
まあこれはわからなくはないですが、
po_po さんが書きました: 次に命令の種類、その次に行列の要素を0にする範囲を指定しています
このあたりに来ると「???」となってしまいます。
命令の種類って何でしょうか?
要素を0にする範囲の指定方法は何でしょうか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

po_po
記事: 38
登録日時: 9年前

Re: 全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプログラムが動きま

#4

投稿記事 by po_po » 9年前

解決しました。ありがとうございました。
二次元配列の関数への渡し方がよくわかっていなかったのが原因でした。
あと最後の入力は6じゃなく8でした。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: <解決しました>全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプ

#5

投稿記事 by みけCAT » 9年前

解決したら、解決チェックをお願いします。
タイトルの変更を含めた不要な編集はおやめください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: 全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプ

#6

投稿記事 by naohiro19 » 9年前

タイトルを変更しただけでは解決したとみなせません。
タイトルを変更せず解決にチェックをするようお願いします。
また、解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
同じ事で困っている人の為に過去ログに有用な情報を残すようお願いします。

po_po
記事: 38
登録日時: 9年前

Re: <解決しました>全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプ

#7

投稿記事 by po_po » 9年前

すいません・・・
解決チェックというのはどうすればできるのでしょうか?

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: <解決しました>全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプ

#8

投稿記事 by Dixq (管理人) » 9年前

「返信」をクリックして出てくる返信を書く入力欄の下に
dome.png
dome.png (32.26 KiB) 閲覧数: 4552 回
上記のような「解決」のチェックボックスがあると思います。

また、解決チェック時にはどのように解決したかを書いて頂けると
後に閲覧した人のためになるので、よければご協力お願いします。

po_po
記事: 38
登録日時: 9年前

Re: <解決しました>全ての要素が1である10×10行列の要素をある条件に従って0にし、要素の合計を表示するc言語のプ

#9

投稿記事 by po_po » 9年前

へにっくす様
ありがとうございました。
配列を受け取る関数を作るとき、1次元目の要素数は省略できるけれどそれ以降は省略できないことを知らなかったので起きた間違いでした。
修正してもらったとおり、show_data以降の引数がstate[][]と2次元目に具体的な数が入っていなかったので、state[MATRIX_SIZE][MATRIX_SIZE]とすることで解決しました。
最後の入力はこちら側の間違いでした。

box様
すいません。
次からはより具体的にわかりやすく質問します。

みけCAT様、naohiro19様
すいません
利用の際のルールをよく把握していませんでした。以後気を付けます。

Dixq様
丁寧に教えてくれてありがとうございます。助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る