二次元配列の問題で質問です

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

二次元配列の問題で質問です

#1

投稿記事 by ぷれこ » 16年前

はじめまして、ぷれこと申します。
先日、入力した五つの金額を金種別にに分けて合計して出力する宿題が出たのですが、どうにも上手くいきません。
#include <stdio.h>
void main(void)
{
	int m[7][11]={{0,10000,5000,2000,1000,500,100,50,10,5,1},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},};
	int i,j;
	
	for (i = 1;i < 6;i++){
		printf("%d人目の金額を入力してください",i);
		scanf("%d", &m[0]);
	}
	
	printf("支払い金額 ");
	
	for (j = 1;j < 11;j++){
	printf("%5d ", m[0][j]);
	}
	printf("\n");
	for (i = 1;i < 6;i++){
		
		m[1] = m[0];
		printf("%10d ", m[0]);
		
		for (j = 1;j < 11;j++){
			
			m[j+1] = m[j] % m[0][j];
			m[j] = m[j] / m[0][j];
			printf("%5d ", m[j]);
			
			if(m[j+1] <= 0){
				j =11;
			}
		}
		printf("\n");
	}
	
	printf("----------------------------------------------------------------------\n");
	
	for (j = 0; j < 11; j++){
		m[6][j] = 0;
		for (i = 1; i < 6; i++){
			m[6][j] += m[i][j];
		}
		if(j == 0){
			printf("%10d ", m[6][j]);
		}
		else{
		printf("%5d ", m[6][j]);
		}
	}
	
		printf("\n");
}


現状、このようにC言語でプログラムを組んでいるのですが、どこが問題なのでしょうか?
アドバイスをお願いいたします。

non

Re:二次元配列の問題で質問です

#2

投稿記事 by non » 16年前

計算することと、出力することを分けて考えた方がいいでしょう。
プログラムは長くなっても、わかりやすいプログラムになります。

初級者

Re:二次元配列の問題で質問です

#3

投稿記事 by 初級者 » 16年前

二次元配列を使うことが条件なのですか?

もし、そうでなければ、配列としては金種の一次元を定義するだけで
答が求まる方法があります。

今のソースは、簡単に書けるものをわざわざむずかしくしているように見えます。

itoyan

Re:二次元配列の問題で質問です

#4

投稿記事 by itoyan » 16年前

えーと,途中のfor文で
for (j = 1;j < 11;j++){
  m[j+1] = m[j] % m[0][j];
  ....
}
と書いてるけど,j=10のときの,左辺のm[11]は
想像と違う場所を指しているはずです.
次の行の先頭m[i+1][0]と同じ場所になっているのでは?
(メモリの話が絡むので正しくないということだけでとりあえず.)

結論として直すところを言うと,for文でj<10とすればOKなはず.

あとは定数はdefine,enumするなりしておきましょう.
可読性が増します.11というよりも,
#define BillandCoinNum 11(紙幣と硬貨の枚数)などとしたら
後で解読に苦労しないですよ.
(本当は右に合計金額があるから,名前としてはあまり良くないのだが)

上の方も述べられておりますが,
二次元配列でやらなくてもねえとは思いますが,課題だから仕方ないか.

やそ

Re:二次元配列の問題で質問です

#5

投稿記事 by やそ » 16年前

>現状、このようにC言語でプログラムを組んでいるのですが、どこが問題なのでしょうか?
アドバイスをお願いいたします。

どのような結果が表示されて?
本来どうなって欲しかった?
という情報が欠落しています。

何をどうしたいのか、ドウ表現すれば相手に伝わるのか(わかってもらえるのか)
を考えて投稿願います。

最終地点(ゴール)の認識がずれていたら何にもならないからね^^;

やそ

Re:二次元配列の問題で質問です

#6

投稿記事 by やそ » 16年前

int main()
{
    int m[7][11]={{0,10000,5000,2000,1000,500,100,50,10,5,1},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},};
	int i,j;
	
	for (i = 1;i < 6;i++){
		printf("%d人目の金額を入力してください",i);
		scanf("%d", &m[0]);
	}

/* ↑これで6人分の金額がとりあえず入力されたわけですな */
    int kingaku;

    for(i=1;i<7;i++)
    {
        kingaku=m[0];
        for(j=1;j<11;j++)
        {
            m[j]=kingaku/m[0][j];/* 金種別の枚数を計算&保管 */
            kingaku=kingaku%m[0][j];/* 残り金額を計算 */
        }
    }
	printf("----------------------------------------------------------------------\n");
    for(i=0;i<7;i++)
    {
        for(j=0;j<11;j++)
	        printf("%6d ", m[j]);
    }

ぷれこ

Re:二次元配列の問題で質問です

#7

投稿記事 by ぷれこ » 16年前

皆さん、申し訳ありませんでした。
このプログラムでは

1人目の金額を入力してください187200
2人目の金額を入力してください79063
3人目の金額を入力してください50020
4人目の金額を入力してください111101
5人目の金額を入力してください227629

このように入力すると、

支払い金額 10000 5000 2000 1000 500 100 50 10 5 1
187200 18 1 1 0 0 2
79063 7 1 2 0 0 0 1 1 0 3
50020 5 0 0 0 0 0 0 2
111101 11 0 0 1 0 1 0 0 0 1
227629 22 1 1 0 1 1 0 2 1 4
----------------------------------------------------------------------
655013 63 3 4 1 1 4 1 5 1 8

このような形の表で表示されるようにしたいのですが。

現状では、

支払い金額 10000 5000 2000 1000 500 100 50 10 5 1
-9408 0
13527 1 0 1 1 1 0 0 2 1 2
-15516 0
-19971 0
31021 3 0 0 1 0 0 0 2 0 1
----------------------------------------------------------------------
-347 2 -24895 1 2 1 0 0 4 1 3

と表示されています。

入力部分がおかしいのでしょうか?

やそ

Re:二次元配列の問題で質問です

#8

投稿記事 by やそ » 16年前

それならば一度入力を分けましょう。
int main()
{

    int m[7][11]={{0,10000,5000,2000,1000,500,100,50,10,5,1},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0},};
	int i,j;
         int kingaku;
	
	for (i = 1;i < 7;i++){
		printf("%d人目の金額を入力してください",i);
		scanf("%d", &kingaku);
                  m[0]=kingaku;
	}

/* 一度この段階でm[0]を人数分表示して入力した金額が正しく入っているか確かめてみると良い */

for(i=1;i<7;i++)
        printf("%7d ",m[0]);

/* 問題ないようなら計算に進みましょう */

やそ

Re:二次元配列の問題で質問です

#9

投稿記事 by やそ » 16年前

あ、おしりの</pre>忘れた^^;
恥ずかすぃ~(笑)

ねこ

Re:二次元配列の問題で質問です

#10

投稿記事 by ねこ » 16年前

>やそさん
僕もよくやります(笑)
削除キー入れておくと、後で編集して修正できますよ。

non

Re:二次元配列の問題で質問です

#11

投稿記事 by non » 16年前

添付のプログラムを、私の環境(BC++5.0)で実行すると下のようになります。
1人目の金額を入力してください187200
2人目の金額を入力してください79063
3人目の金額を入力してください50020
4人目の金額を入力してください111101
5人目の金額を入力してください227629
支払い金額 10000  5000  2000  1000   500   100    50    10     5     1
    187200    18     1     1     0     0     2
     79063     7     1     2     0     0     0     1     1     0     3
         0     0
    111101    11     0     0     1     0     1     0     0     0     1
         0     0
----------------------------------------------------------------------
    377364    36     2     3     1     0     3     1     1     0     4
ぶれこさんの実行結果になりません。187200が-9408になるということは、intが4バイトという
ことですね。コンパイラは何を使ってますか?

toyo

Re:二次元配列の問題で質問です

#12

投稿記事 by toyo » 16年前

intが2バイトなのでしょうね
intをlongにしてprintfの%dを%ldにしたらいいでしょう

intが2バイトのコンパイラってLSI C-86でしょうかね

non

Re:二次元配列の問題で質問です

#13

投稿記事 by non » 16年前

>intが2バイトなのでしょうね
あらら、うっかりとしてしまいました。2バイトですね。

やそ

Re:二次元配列の問題で質問です

#14

投稿記事 by やそ » 16年前

ということは金額が32767までなら上手くいくかどうかやってもらったほうがいいかも。

sizeeofで調べてもらってもいいけどね^^

non

Re:二次元配列の問題で質問です

#15

投稿記事 by non » 16年前

longにしないと駄目かもね。
どっちにしても、 itoyan さんが言われているところを直さないと駄目ですけどね。
そのためには、私が最初に言った
>計算することと、出力することを分けて考えた方がいいでしょう。
これを、やらなきゃね。堂々巡り。

スレ主さん、進んでんの?

ぷれこ

Re:二次元配列の問題で質問です

#16

投稿記事 by ぷれこ » 16年前

確認したら、確かにLCI C-86の試食版を使っていました。
言われた所を直したらこうなりました。
#include <stdio.h>
#define BCN 11

void main(void)

{

	int m[7][BCN]={{0,10000,5000,2000,1000,500,100,50,10,5,1},

			{0,0,0,0,0,0,0,0,0,0,0},

			{0,0,0,0,0,0,0,0,0,0,0},

			{0,0,0,0,0,0,0,0,0,0,0},

			{0,0,0,0,0,0,0,0,0,0,0},

			{0,0,0,0,0,0,0,0,0,0,0},

			{0,0,0,0,0,0,0,0,0,0,0},};

	int i,j;

	

	for (i = 1;i < 6;i++){

		printf("%d人目の金額を入力してください",i);

		scanf("%d", &m[0]);

	}	
	
	for (i = 1;i < 6;i++){

		m[1] = m[0];
		

		for (j = 1;j < BCN - 1;j++){

			m[j+1] = m[j] % m[0][j];

			m[j] = m[j] / m[0][j];
			

		}


	}

	
	printf("支払い金額 ");
	
	for (j = 1;j < BCN;j++){

	printf("%5d ", m[0][j]);

	}

	printf("\n");

	for (i = 1;i < 6;i++){

		printf("%10d ", m[0]);

		for (j = 1;j < BCN;j++){

			printf("%5d ", m[j]);


		}

		printf("\n");

	}

	

	printf("----------------------------------------------------------------------\n");

	

	for (j = 0; j < BCN; j++){

		m[6][j] = 0;

		for (i = 1; i < 6; i++){

			m[6][j] += m[j];

		}

		if(j == 0){

			printf("%10d ", m[6][j]);

		}

		else{

		printf("%5d ", m[6][j]);

		}

	}

	

		printf("\n");

}


この状態で、入力額が32767以下なら問題なく動作しました。

授業で、int と char 以外の関数を使っていないこと、学校のパソコンではLSI C-86を使用していないことから、このままでも問題ないと思います。

皆様、どうもありがとうございました。

あと、追加問題としてそれ以降0しかない時は省略する。(187200の場合は50,10,5,1の桁が表示されない)
というのがあり、最初の文の
if(m[i][j+1] <= 0){
		j =11;
	}

はそこを表そうとしたのですが、この場合はどうしたらよいですか?

やそ

Re:二次元配列の問題で質問です

#17

投稿記事 by やそ » 16年前

>追加問題としてそれ以降0しかない時は省略する。(187200の場合は50,10,5,1の桁が表示されない)
これって、現状のレベルからしたらちょっと難しいかもしれませんね。
#define NINZU 3
#define BCN 11



中略
int m[3][11]={{0,10000,5000,2000,1000,500,100,50,10,5,1},
              {19999,1,1,2,0,1,4,1,4,1,4},
              {7700,0,1,1,0,1,2,0,0,0,0}};



中略

int keisan=0;

for(i=1;i<NINZU;i++) /* 人数 */
{
  printf("%5d",m[0]);
  keisan=0;
  for(j=1;j<BCN;j++) /* 金種 */
  {
    if(keisan<m[0])
    {
      printf(" %d",m[j]);
      keisan=keisan+(m[j]*m[0][j]); 
    }
    else {
      j=BCN;
      printf("\n");
    }
  }
}

テスト用にデータは2人分で。
コンパイル&テストなどはしていませんが、
こんなんでどうでせう?

non

Re:二次元配列の問題で質問です

#18

投稿記事 by non » 16年前

>あと、追加問題としてそれ以降0しかない時は省略する。(187200の場合は50,10,5,1の桁が表示されない)

確かに、このレベルの問題でいきなり、この課題はどうかと思う。
省略するのは、0になった以降の計算の方では?
表示をしないのは、かえって不自然だと思う。
課題なんだから、不自然でもしょうがないけど。

ぷれこ

Re:二次元配列の問題で質問です

#19

投稿記事 by ぷれこ » 16年前

やそさんの物を参考にして、どうにか完成しました。

とりあえず0以降が表示されなくなったので、これで行くことにします。

皆様、どうもありがとうございました。

itoyan

Re:二次元配列の問題で質問です

#20

投稿記事 by itoyan » 16年前

もう解決済みだから良いかとは思うけどおまけ.

if(m[j+1] <= 0){
j =11;
}
ではj=11の代わりにcontinue;
と書けば良いと思うよ.

閉鎖

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