ページ 1 / 1
ファイル
Posted: 2013年12月21日(土) 14:58
by KC
学校の課題で ある24時間営業のコンビニエンスストアでの1日分の売り上げデータを利用して、時間帯別および売り上げ金額別の客数を出力するものである。空欄を埋めて、プログラムを完成させなさい。というプログラム作成がだされました
プログラムの8行目のtableの後と15行目の%11dの後のところだけ分かりません 教えてください
#include <stdio.h>
int main(void)
{
int table[24][6] = 0 ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF{
prank = (price / 1000) > 5 ? 5 : price / 1000;
table ++
}
printf("%21s"-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", );
printf("¥n");
}
return 0;
}
Re: ファイル
Posted: 2013年12月21日(土) 16:32
by 初級者
配列 table[24][6]
は、何を格納するために
存在していると思いますか?
Re: ファイル
Posted: 2013年12月22日(日) 10:25
by KC
時刻と金額を格納するためでしょうか?
Re: ファイル
Posted: 2013年12月22日(日) 11:48
by へにっくす
KC さんが書きました:時刻と金額を格納するためでしょうか?
ではなぜminが要るのでしょう?
要りませんよね?
まあそれより、どの部分が穴埋めなのか分かりませんね。
コードをみる限り、コンパイルできないですけど。
なので、
KC さんが書きました:プログラムの8行目のtableの後と15行目の%11dの後のところだけ分かりません
上記はひとまず後回しでとりあえず指摘。
コード:
int table[24][6] = 0,…
配列を初期化する際には{0}のように{}で囲ってください。
コード:
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF{
whileの括弧がおかしいよ。またscanfの戻り値は値を代入した数ですよ。EOFはおかしいよ。
コード:
printf("%21s"-999 1000-1900 2000-2999 "," ");
文字列の"のくくりがおかしいよ。
修正したら、修正したコードを掲示してください。
またコードは、
[code
]~
[/code
]で囲ってくださいね。
Re: ファイル
Posted: 2013年12月22日(日) 12:03
by KC
ヘニックスさん 訂正しました 空欄の部分は,tableと++の間と printf("%11d" の後の部分です。 minの方は例文のほうで初めからあるので外せないみたいです
#include <stdio.h>
int main(void)
{
int table[24][6] = {0} ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF){
prank = (price / 1000) > 5 ? 5 : price / 1000;
table ++
}
printf("%21s-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", );
printf("¥n");
}
return 0;
}
Re: ファイル
Posted: 2013年12月22日(日) 12:06
by KC
code 付け忘れました
quote="KC"]ヘニックスさん 訂正しました 空欄の部分は,tableと++の間と printf("%11d" の後の部分です。 minの方は例文のほうで初めからあるので外せないみたいです
コード:
#include <stdio.h>
int main(void)
{
int table[24][6] = {0} ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF){
prank = (price / 1000) > 5 ? 5 : price / 1000;
table ++
}
printf("%21s-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", );
printf("¥n");
}
return 0;
}
/quote]
Re: ファイル
Posted: 2013年12月22日(日) 12:17
by みけCAT
へにっくす さんが書きました:EOFはおかしいよ。
おかしいとは限りません。scanfの返り値はEOFになることがあります。
最初の変換が成功する前に入力の最後に達して、一致の失敗が起こった場合には、 EOF が返される。また、 読み込みエラーが発生した場合にも EOF が返される。
http://linuxjm.sourceforge.jp/html/LDP_ ... anf.3.html
ただ、whileのかっこが足りないのと、余計なセミコロンが入っているのはおかしいですね。
Re: ファイル
Posted: 2013年12月22日(日) 12:19
by みけCAT
へにっくす さんが書きました:KC さんが書きました:時刻と金額を格納するためでしょうか?
ではなぜminが要るのでしょう?
要りませんよね?
KC さんが書きました:minの方は例文のほうで初めからあるので外せないみたいです
おそらくここでのminはminuteの略だと思うので、minを入力するのは自然だと思います。
確かに結果的には使用せず、%*dで読み飛ばしても良さそうですが、外せないならそのままでもいいと思います。
Re: ファイル
Posted: 2013年12月22日(日) 12:23
by K C
ログインしたので続きはそちらで大丈夫ですか?
Re: ファイル
Posted: 2013年12月22日(日) 12:29
by みけCAT
K C さんが書きました:ログインしたので続きはそちらで大丈夫ですか?
このスレッドで続けてもらって構いません。
「そちら」ってどちらですか?
Re: ファイル
Posted: 2013年12月22日(日) 12:38
by へにっくす
みけCAT さんが書きました:へにっくす さんが書きました:EOFはおかしいよ。
おかしいとは限りません。scanfの返り値はEOFになることがあります。
そうですか?そのあとにpriceを使ってるのに。
priceの値は、3つ数値を入力されないと入らないですよね(hour、min、priceの順で入るのだから)?
だからここはEOFでなく3で比較するのがいいのではないかと思うのですけど・・・
まあ課題でEOFになってるのなら別にそのままでいいと思います。
Re: ファイル
Posted: 2013年12月22日(日) 12:45
by みけCAT
へにっくす さんが書きました:みけCAT さんが書きました:へにっくす さんが書きました:EOFはおかしいよ。
おかしいとは限りません。scanfの返り値はEOFになることがあります。
そうですか?そのあとにpriceを使ってるのに。
priceの値は、3つ数値を入力されないと入らないですよね(hour、min、priceの順で入るのだから)?
だからここはEOFでなく3で比較するのがいいのではないかと思うのですけど・・・
まあ課題でEOFになってるのなら別にそのままでいいと思います。
そうですね。確かにこの場合は3と比較して判定する方がより良いと思います。
ただし、
へにっくす さんが書きました:scanfの戻り値は値を代入した数ですよ。
これが常に正しいわけではない、ということですね。
Re: ファイル
Posted: 2013年12月22日(日) 12:52
by k c
EOFの方は置いといて 空欄の所どうしたらいいですか?
Re: ファイル
Posted: 2013年12月22日(日) 12:54
by K C
コード:
#include <stdio.h>
int main(void)
{
int table[24][6] = {0} ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF){
prank = (price / 1000) > 5 ? 5 : price / 1000;
table 空欄 ++
}
printf("%21s-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", 空欄);
printf("¥n");
}
return 0;
}
場所は空欄と書いてある所です
Re: ファイル
Posted: 2013年12月22日(日) 13:49
by みけCAT
最初の空欄は、hourとprankによって決められるtableの適切な要素に1を加算し、
コンパイルエラーを防ぐために後についている余分な++をコメントアウトするといいと思います。
2番目の空欄は、これまたhourとprankによって決められるtableの適切な要素にアクセスすればいいと思います。
Re: ファイル
Posted: 2013年12月22日(日) 13:52
by みけCAT
ヒントとして、二次元配列を使用して九九の表を出力するコードです。
コード:
#include <stdio.h>
int main(void) {
int table[9][9];
int i,j;
/* テーブルに値を格納 */
for(i=1;i<=9;i++) {
for(j=1;j<=9;j++) {
table[i-1][j-1]=i*j;
}
}
/* テーブルの値を表示 */
for(i=0;i<9;i++) {
for(j=0;j<9;j++)printf("%d%c",table[i][j],j+1<9?' ':'\n');
}
return 0;
}
Re: ファイル
Posted: 2013年12月22日(日) 14:10
by K C
[coad]
#include <stdio.h>
int main(void)
{
int table[24][6] = {0} ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF){
prank = (price / 1000) > 5 ? 5 : price / 1000;
table [hour+1][prank+1]
}
printf("%21s-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", 空欄);
printf("¥n");
}
return 0;
}
[/coad]
こんな感じですか? 二番目はよく分からないです
Re: ファイル
Posted: 2013年12月22日(日) 14:11
by K C
コード:
#include <stdio.h>
int main(void)
{
int table[24][6] = {0} ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF){
prank = (price / 1000) > 5 ? 5 : price / 1000;
table [hour+1][prank+1]
}
printf("%21s-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", 空欄);
printf("¥n");
}
return 0;
}
こんな感じですか? 二番目はよく分からないです
Re: ファイル
Posted: 2013年12月22日(日) 14:16
by みけCAT
両方とも+1する必要はないと思います。あとはtable [hour][prank]に1を足す処理ですね。
Re: ファイル
Posted: 2013年12月22日(日) 14:40
by K C
[quote="K C"]
コード:
#include <stdio.h>
int main(void)
{
int table[24][6] = {0} ,hour,min,prank,price;
printf("時刻と金額を入力してください!¥n");
while((scanf("%2d%2d%6d",&hour,&min,&price;)) != EOF){
prank = (price / 1000) > 5 ? 5 : price / 1000;
table [hour+1][prank]
}
printf("%21s-999 1000-1900 2000-2999 "," ");
printf("3000-3999 4000-4999 5000-¥n");
for(hour = 0; hour <= 23; hour++){
printf("%2d:00-%2d:59", hour, hour);
for(prank = 0; prank <= 5; prank++)
printf("%11d", 空欄);
printf("¥n");
}
return 0;
}
こんな感じですか? 頭の中がごちゃごちゃしてきました 空欄が二個
なので新たに付け足すの出来ないです
Re: ファイル
Posted: 2013年12月22日(日) 14:48
by みけCAT
違います。両方とも(+1する必要はない)と思います。すなわち、hourに+1する必要も、prankに+1する必要も、ないと思います。
K C さんが書きました:空欄が二個
なので新たに付け足すの出来ないです
どういうことですか?問題がtable [<A>][<B>] ++のAおよびBを埋めよ、というようになっているということですか?
Re: ファイル
Posted: 2013年12月22日(日) 15:07
by K C
table と ++の間に空欄があってその空欄を埋めろという物です
Re: ファイル
Posted: 2013年12月22日(日) 15:08
by K C
長方形型の空欄です
Re: ファイル
Posted: 2013年12月22日(日) 15:09
by みけCAT
じゃあNo: 15の方針で大丈夫そうですね。
Re: ファイル
Posted: 2013年12月22日(日) 15:14
by みけCAT
今、この図のような表(のようなもの)が用意されています。

- 二次元配列のイメージ
- table_image.png (29.15 KiB) 閲覧数: 10104 回
この表を用いて、入力の(hour,prank)の組それぞれをカウントしたいのですよね?
だとしたら、どうすればいいでしょうか?
Re: ファイル
Posted: 2013年12月22日(日) 15:21
by K C
table[hour][prank]++ ということですか?
Re: ファイル
Posted: 2013年12月22日(日) 15:30
by みけCAT
最初の空欄はそんな感じでいいと思います。
二番目の空欄も、for文で指定されているhourとprankに対応する表の値を表示したいのですよね?
ということは…
Re: ファイル
Posted: 2013年12月22日(日) 15:36
by K C
コード:
printf("%11d",prank);
ですか?
Re: ファイル
Posted: 2013年12月22日(日) 15:38
by みけCAT
違います。tableを使いましょう。
Re: ファイル
Posted: 2013年12月22日(日) 15:46
by K C
コード:
printf("%11d",table);
ですか?
Re: ファイル
Posted: 2013年12月22日(日) 15:53
by みけCAT
違います。最初の空欄の解答を応用してください。
Re: ファイル
Posted: 2013年12月22日(日) 16:06
by 初級者
手で求める場合、[24][6]
という144個の箱があるとして、
時間帯と価格に応じて
どの箱に入れますか?