C言語について質問です。

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

C言語について質問です。

#1

投稿記事 by C言語初心者 » 16年前

すいません課題がどうしてもわからなくて悩んでます。
どうか教えてください。
問題が

1週間の売り上げ一覧を表示するプログラムを作成せよ。
   実行例  おにぎりの1週間の売り上げた合計数量と合計金額 
                            合計  合計
        種類 単価 月 火 水 木 金 土 日 数量  金額
        梅干 100 50 55 60 65 70 75 80  455  45500
        焼鮭 110 20 25 30 35 40 45 50  245  26950
        ツナ 120 10 15 20 25 30 35 40  175  21000
        焼肉 130  5 10 15 20 25 30 35  140  18200 
なのですが、
下のプログラムの中の下線部の部分がどういれたらいいかわかりません。
#include <stdio.h>
main()
{
	int i,j,suu;
	long kin;
	int a[4][8] = {{ 100, 50, 55, 60, 65, 70, 75, 80},
		       { 110, 20, 25, 30, 35, 40, 45, 50},
		       { 120, 10, 15, 20, 25, 30, 35, 40},
		       { 130,  5, 10, 15, 20, 25, 30, 35}};
	char b[4][5] = {"梅干","焼鮭","ツナ","焼肉"};

	printf("*** おにぎり1週間の合計数量と合計金額 ***\n");
	printf("                               合計    合計\n");
	printf("種類 単価 日 月 火 水 木 金 土 数量  金額\n"); 

	for(_________){  /*ここにどういれればいいかわかりません*/
	  printf("%s",b);
	    suu=0, kin=0;


	    printf("%5d",____);  /*単価の表示ってどうやるんでしょうか?*/

	    for(_________){ /*日~土の数量表示 */

		printf("%3d",____);
		______________________ /* 1週間分の数量合計 */
	}

	___________________________ /* 1週間分の売上金額合計 */

	printf("%6d%8ld\n",______); /* 合計数量と合計金額の表示 */
	}
}

non

Re:C言語について質問です。

#2

投稿記事 by non » 16年前

とりあえず、最初のforのところだけ、
まず、forは繰り返し処理で、特に繰り返す回数が決まってるときによく使われます。
ここでは、その下の行に、
printf("%s",b);
と、ありますから、カウンタ変数としてiが使われているだろうと想像できます。
bはおにぎりの種類の文字列ですから、おにぎりの種類だけ繰り返します。
for(i=初期値;i<最終値;iのカウントアップ)
で、この行を作ってみて下さい。

って、このレベルの解説でよろしいでしょうか?
授業の内容からすれば、もう2次元配列なので、for文の文法はわかると思いますが。

C言語初心者

Re:C言語について質問です。

#3

投稿記事 by C言語初心者 » 16年前

返信ありがとうございます。

for(i=0;i<4;i++)

最初のところはこれであってますかね?

紅葉

Re:C言語について質問です。

#4

投稿記事 by 紅葉 » 16年前

ざっくりとしか見ていないので何とも言えませんが
あっていると思います。
といいますか試してみてはw?

単価の表示 a[0]

後は他の方にお任せします><

non

Re:C言語について質問です。

#5

投稿記事 by non » 16年前

はい正解です。
では、次に
printf("%5d",____);
単価の表示ですから、単価が配列のどこに入っているかわかりますよね。
紅葉さんがかかれているから、いいですね。

次の
for(_________){ /*日~土の数量表示 */
です。
さっきと同じように、カウンタ変数を考えてみると、
最初の宣言でint i,j,suu;とあります。
suuは初期値に0を入れてるところがあるから、カウンタ変数ではなさそうです。
じゃ、たぶんjですね。
配列の日曜から、土曜は配列のどこにあるかを考えれば、jを何から何まで回せばいいか
わかると思います。

C言語初心者

Re:C言語について質問です。

#6

投稿記事 by C言語初心者 » 16年前

for(j=0;j<6;i++)
printf("%3d",a[1][6]);
ですかね?

box

Re:C言語について質問です。

#7

投稿記事 by box » 16年前

> for(j=0;j<6;i++)
> printf("%3d",a[1][6]);
> ですかね?

お手元にCのコンパイラがあるのでしたら、
「コードを書いたら、人に聞く前に自分で試す」という
考え方を身につけられる方がよいと思います。

上に引用したコードは、
6回まわるループの中で、毎回、a[1][6]という固定の値を出力している、
という時点で、おそらく仕様に合っていないでしょう。

C言語初心者

Re:C言語について質問です。

#8

投稿記事 by C言語初心者 » 16年前

学校の授業でやっている程度なので家にはコンパイラはないんですよ。。。
ダウンロードしてやれって言われそうなのですが、明後日課題提出でもうとりあえず教えてほしかったんです。
すいません丸投げみたいな感じで。。。

non

Re:C言語について質問です。

#9

投稿記事 by non » 16年前

> for(j=0;j<6;i++)
> printf("%3d",a[1][6]);
> ですかね?

jを0から5まで回しても間違いではありませんが、
配列の0列目は、単価ですよね。1列目が月曜日。
この曜日に対応させてjを回した方がわかりやすいと思います。
> printf("%3d",a[1][6]);
iとjを使わなきゃ、意味がないでしょう。

もう少し、よく考えましょう。

conio

Re:C言語について質問です。

#10

投稿記事 by conio » 16年前

------------------------------------------------------------------
int a[4][8] = {{ 100, 50, 55, 60, 65, 70, 75, 80},
		       { 110, 20, 25, 30, 35, 40, 45, 50},
		       { 120, 10, 15, 20, 25, 30, 35, 40},
		       { 130,  5, 10, 15, 20, 25, 30, 35}};
char b[4][5] = {"梅干","焼鮭","ツナ","焼肉"};
------------------------------------------------------------------
これの対応関係は分かりますか?
(配列のどれがどの値になるのか、という関係)

具体的には下記のようになります。
--------------------------------------------------------------------
  【梅干】     【焼鮭】     【ツナ】     【焼肉】
a[0][0] = 100     a[1][0] = 110     a[2][0] = 120     a[3][0] = 130 ※単価
a[0][1] =  50     a[1][1] =  20     a[2][1] =  10     a[3][1] =   5 ※(月)
a[0][2] =  55     a[1][2] =  25     a[2][2] =  15     a[3][2] =  10 ※(火)
a[0][3] =  60     a[1][3] =  30     a[2][3] =  20     a[3][3] =  15 ※(水)
a[0][4] =  65     a[1][4] =  35     a[2][4] =  25     a[3][4] =  20 ※(木)
a[0][5] =  70     a[1][5] =  40     a[2][5] =  30     a[3][5] =  25 ※(金)
a[0][6] =  75     a[1][6] =  45     a[2][6] =  35     a[3][6] =  30 ※(土)
a[0][7] =  80     a[1][7] =  50     a[2][7] =  40     a[3][7] =  35 ※(日)

b[0] = 梅干
b[1] = 焼鮭
b[2] = ツナ
b[3] = 焼肉
--------------------------------------------------------------------

で、梅干の月~日までの売り上げは 50, 55, 60, 65, 70, 75, 80です。
上記の対応関係を見ると、下記のようにすれば良いと分かると思います。
printf("%3d",a[0][1]);
printf("%3d",a[0][2]);
printf("%3d",a[0][3]);
printf("%3d",a[0][4]);
printf("%3d",a[0][5]);
printf("%3d",a[0][6]);
printf("%3d",a[0][7]);

そして、規則的に1ずつ増えている部分 があると思うので、
それをうまくfor文にしてみましょう。
(この課題のプログラムだと、i以外に使える変数は一つしかないですね)

まとめるとこんな感じです。
一部"?"で伏字となっています。
----------------------------------------------------------------------------------
	for(i = 0; i < 4; i++){  /*ここにどういれればいいかわかりません*/
	  printf("%s",b);
	    suu=0, kin=0;


	    printf("%5d",a[0]);  /*単価の表示ってどうやるんでしょうか?*/

	    for(_________){ /*日~土の数量表示 */

		printf("%3d",a[?]);
		______________________ /* 1週間分の数量合計 */
	}

	___________________________ /* 1週間分の売上金額合計 */

	printf("%6d%8ld\n",______); /* 合計数量と合計金額の表示 */
	}
}
----------------------------------------------------------------------------------

C言語初心者

Re:C言語について質問です。

#11

投稿記事 by C言語初心者 » 16年前

プログラマーさんすごくわかりやすく解説ありがとうございます。

for(j=1;j<=7;j++)
printf("%3d",a[j]);

これで合っていますか?

conio

Re:C言語について質問です。

#12

投稿記事 by conio » 16年前

>>for(j=1;j<=7;j++) 
>>printf("%3d",a[j]); 
>>これで合っていますか?
合っています。
(ついでに、for(j = 1; j < 8; j++)でもOKです)

残りは①、②、③ですね。
------------------------------------------------------------------------
#include <stdio.h>
int main(void)
{
	int i,j,suu;
	long kin;
	int a[4][8] = {{ 100, 50, 55, 60, 65, 70, 75, 80},
		       { 110, 20, 25, 30, 35, 40, 45, 50},
		       { 120, 10, 15, 20, 25, 30, 35, 40},
		       { 130,  5, 10, 15, 20, 25, 30, 35}};
	char b[4][5] = {"梅干","焼鮭","ツナ","焼肉"};

	printf("*** おにぎり1週間の合計数量と合計金額 ***\n");
	printf("                               合計    合計\n");
	printf("種類 単価 日 月 火 水 木 金 土 数量  金額\n"); 

	for(i = 0; i < 4; i++){  /*ここにどういれればいいかわかりません*/
	  printf("%s",b);
	    suu=0, kin=0;


	    printf("%5d",a[0]);  /*単価の表示ってどうやるんでしょうか?*/

	    for(j = 1; j < 8; j++){ /*日~土の数量表示 */

		printf("%3d",a[j]);
		①【       】  /* 1週間分の数量合計 */
	}

	②【       】 /* 1週間分の売上金額合計 */

	printf("%6d%8ld\n",③【    】); /* 合計数量と合計金額の表示 */
	}
}
------------------------------------------------------------------------

まず、①は一週間分の数量を合計する処理です。
梅干でいうと、下記のようになります。
----------------------------------------------------------------------------------------------
合計 = 50 + 55 + 60 + 65 + 70 + 75 + 80
合計 = a[0][1] + a[0][2] + a[0][3] + a[0][4] + a[0][5] + a[0][6] + a[0][7]
----------------------------------------------------------------------------------------------

で、a[j]という風にして、a[0][1] ~ a[0][7]まで変えて行く処理は完成しているので、
あとはそれを、変数に足していくだけです。
(プログラムでは明言されていませんが、数量を入れるための変数がありますね)


次に②は、売り上げ金額を求める処理です。
普通に考えて、
--------------------------------------
売り上げ金額 = 単価 × 売れた数量
--------------------------------------
です。
上記の式が、それぞれどの変数に対応しているかを考えれば問題ないと思います。


最後に、③は数量と売り上げ金額を表示するだけです。
表示したい変数(数量、金額)をprintf関数の中に入れるだけとなります。

C言語初心者

Re:C言語について質問です。

#13

投稿記事 by C言語初心者 » 16年前

①はよくわからないんですがこうでしょうか?
(a[j],sum)

②は①がよくわかってないんですが、
数量の合計 × a[0]

という考えでいいんですかね?

③はそれぞれどの変数を使ったらいいのかわかりません。。

conio

Re:C言語について質問です。

#14

投稿記事 by conio » 16年前

>>①はよくわからないんですがこうでしょうか?
>>(a[j],sum)
全然違います。
そもそもプログラム中に"sum"という変数は存在しません。

i,j以外の変数が2つありませんか?
プログラムの中から探してください。

そして、プログラムでの足し算は分かりますか?
仮に、合計を表す変数が"sum"だとして、それに5を足す場合は、
-----------
sum += 5;
-----------
となります。

(sum, 5)
↑このような記述では何も起こりません。エラーになります。


>>②は①がよくわかってないんですが、
>>数量の合計 × a[0]
>>という考えでいいんですかね?
そうです。単価の部分はそれであってます。


>>③はそれぞれどの変数を使ったらいいのかわかりません。。
プログラム中にある"suu""kin"って何だと思いますか?
それぞれ 何かの頭の文字を取った変数に見えませんか?

C言語初心者

Re:C言語について質問です。

#15

投稿記事 by C言語初心者 » 16年前

①はこうですか?
a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]=suu

②は
suu * a[0] = kin


printf("%6d%8ld\n",suu, kin)
ですかね?

conio

Re:C言語について質問です。

#16

投稿記事 by conio » 16年前

惜しいです。
が、あと少しです。

足し算などを行う場合、値を入れる変数が左側に来ます。
なので、②は下記のようになります。
--------------------
kin = suu * a[0];
--------------------

③もあっていますので、残るは①だけです。
①も同じく、プログラムで書くのであれば、
-------------------------------------------------------------------------------------
suu = a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7];
-------------------------------------------------------------------------------------
となります。

そして、for文で 変数jを1~7まで変化させてるので、
変数"suu"に足して行く値は"a[j]"という様に出来ます。

-----------------------------------------------
for(j = 1; j < 8; j++){ /*日~土の数量表示 */
printf("%3d",a[j]);
suu ?? ????/* 1週間分の数量合計 */
}
-----------------------------------------------
これが最後です。
suuに足して行く部分(???となっている部分)を作れば完成です。

C言語初心者

Re:C言語について質問です。

#17

投稿記事 by C言語初心者 » 16年前

suu = a[j] + a[j-1]
こんな感じですか?
的外れのような気がすごくします・・・。

conio

Re:C言語について質問です。

#18

投稿記事 by conio » 16年前

>>suu = a[j] + a[j-1] 
>>こんな感じですか? 
>>的外れのような気がすごくします・・・。 
全然違います。
試しにjが1から7まで変化した時を当てはめてみたら分かります。

------------------------------------------
※i = 0の時。

suu = a[0][1] + a[0][0]  (j = 1)
suu = a[0][2] + a[0][1]  (j = 2)
suu = a[0][3] + a[0][2]  (j = 3)
suu = a[0][4] + a[0][3]  (j = 4)
suu = a[0][5] + a[0][4]  (j = 5)
suu = a[0][6] + a[0][5]  (j = 6)
suu = a[0][7] + a[0][6]  (j = 7)
------------------------------------------
上記を見ても分かるように、a[0][1] ~ a[0][7]まで一回ずつ足されていないと思います。
おまけに、足しているのではなく代入しているので値が上書きされています。

例えば、"sum"に5 と6 を足す場合。
下記のようにすると、sumの値が6で上書きされて6になります。
11にはなりません。
--------
sum = 5;    //sumに5を代入 0 → 5
sum = 6;    //sumに6を代入 5 → 6
--------

sumに値を足して行くのならば、下記のようになります。
-------------------------------------------
sum += 5;    //sumに5を足す 0 + 5 = 5
sum += 6;    //sumに6を足す  5 + 6 = 11
-------------------------------------------

で、梅干で考えて見ましょう。
梅干の数量は、50 55 60 65 70 75 80 です。
それが a[0][1] a[0][2] a[0][3]a[0][4]a[0][5] a[0][6] a[0][7]に対応しています。

これを"suu"に足していく場合は下記のようにすればいいです。
--------------------------------------
suu += a[0][1];     //   0 + 50 =   50
suu += a[0][2];     //  50 + 55 =  105
suu += a[0][3];     // 105 + 60 =  165
suu += a[0][4];     // 165 + 65 =  230
suu += a[0][5];     // 235 + 70 =  300
suu += a[0][6];     // 305 + 75 =  375
suu += a[0][7];     // 380 + 80 =  455
--------------------------------------

printf関数のところは、下記の様な表示処理を
printf("%3d", a[j]);とし、
j の値を1~7まで増加させて実現させましたね。
-----------------------
printf("%3d",a[0][1]);
printf("%3d",a[0][2]);
printf("%3d",a[0][3]);
printf("%3d",a[0][4]);
printf("%3d",a[0][5]);
printf("%3d",a[0][6]);
printf("%3d",a[0][7]);
-----------------------

これを、suuに値を足していく処理にも応用すればよいだけとなります。
値を足して行く式で、規則的に1ずつ増えているところはありませんか?

閉鎖

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