思い通りの実行結果にならない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Drop

思い通りの実行結果にならない

#1

投稿記事 by Drop » 13年前

プログラミングの初心者です。
ある課題を出され、実行結果が思った通りにならなくて困り、
どのようにすれば思った通りの実行結果になるかずっと悩んでおります。

値を入力(例として1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4を入力)したとき
1 2 3 4
5 6 7 8
9 0 9 8
7 6 5 4

と表示されるような実行結果にしたいのです。
自分は以下のようにプログラムを組んだのですが、値を例のように入力したとき

1 5 9 7
5 9 7 6
9 7 6 5
7 6 5 4

となり、入力した例が4ずつとび、斜めに同じ数字が表示されてしまいます。

ただ

コード:


#define N 4		
void m(int *a, int n) /*   void m(int *a, int n);かも知れません   */

コード:

m((int *)a, N);
の部分に関しては変更せず、[]を使用してはならないという制限があります。どのようにすればポインタ(配列の配列)を使い、思った通りの実効結果にできるのか教えていただきたいです。よろしくお願いします。



コード:

#include  <stdio.h>

#define N 4		
void m(int *a, int n)
{
   int i,j;
   
	for (i = 0; i < N; i++)
		for (j = 0; j < n; j++)
	
		scanf("%ld", (a+i+j));

	for (i = 0; i < N; i++) {
		for (j = 0; j < n; j++) 
		printf("%6.1ld  ", *((a+i)+j));
		printf("\n");
		}
}
		
int main(void)
{
	int a[N][N];
	
	m((int *)a, N);
	
	return 0;
}



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

Re: 思い通りの実行結果にならない

#2

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

コード:

scanf("%ld", (a+i+j));

コード:

scanf("%ld", (a+i*N+j));
に、

コード:

*((a+i)+j))

コード:

*((a+(i*N)+j))
としたらどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 思い通りの実行結果にならない

#3

投稿記事 by beatle » 13年前

もう少しインデントを頑張りましょう。

さて、以下の4行

コード:

    for (i = 0; i < N; i++)
        for (j = 0; j < n; j++)
    
        scanf("%ld", (a+i+j));
のfor文を実際に展開したときの様子を書いてみてください。こんな感じに。

コード:

scanf("%ld", (a+0+0));
scanf("%ld", (a+0+1));
scanf("%ld", (a+0+2));
...
N x N = 16なので、16行に展開できるはずです。

ちなみに、int型なのでscanfの書式指定は「%ld」ではなく「%d」です。
参考:http://linuxjm.sourceforge.jp/html/LDP_ ... anf.3.html

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

Re: 思い通りの実行結果にならない

#4

投稿記事 by box » 13年前

本題とは直接関係ないのですが、
Drop さんが書きました:

コード:

void m(int *a, int n)
せっかく行・列の数をnで渡しているのですから、
Drop さんが書きました:

コード:

	for (i = 0; i < N; i++)
Nよりもnにする方がいいのではないか、と思います。
Nでよいのであれば、わざわざ引数で渡す意味がないですよね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Drop

Re: 思い通りの実行結果にならない

#5

投稿記事 by Drop » 13年前

これほど早く返事がいただけると思っておらず、返事が遅れてしまい申し訳ございませんでした。


>みけCATさん

コード:

*((a+i)+j))

コード:

*((a+(i*N)+j))
と変更すると「,」を付け忘れています。というエラーが返ってきたので、

コード:

*((i * n)+a+j))
という順番に変えることで無事思うような結果を表示できるようになりました。


>beatleさん
インデントまた、書式指定に関しては自分の力不足でありプログラムにもっと触れるべきであると反省しております。
解答に関しては今回N=4とまだ小さい数字なのでいいのですがこれが大きい数字になるととんでもないことになるので
1つの参考とさせていただきたいと思います。

>boxさん
ご指摘ありがとうございます。これはこちらのミスです。
見直してみたところなぜjではnを渡しているのに、iではNを渡しているのか未だに謎です。
n,Nでも実行結果が同じなので直さないままここに記載してしまった可能性がありますので
気をつけたいと思います。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 思い通りの実行結果にならない

#6

投稿記事 by beatle » 13年前

Drop さんが書きました:解答に関しては今回N=4とまだ小さい数字なのでいいのですがこれが大きい数字になるととんでもないことになるので
1つの参考とさせていただきたいと思います。
そんなことは分かります。私は、この出題を通してDropさんの理解度が向上すればいいなと思ったのです。
課題に答えようとすれば、ヒントが得られると思ったから出題したのです。
実際のプログラムで16行に展開して書け、という話ではありません。Dropさんの勉強のために、16行に展開してみたらいかがですか、と提案したのです。
僕の出題に本質的な問題の解決策があると、少なくとも僕は感じています。(だから出題しているのです)

閉鎖

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