【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21273

配列について
投稿者---ひかる(2005/06/08 18:53:18)


分からない点がいくつかあるので、誰か教えてもらえないでしょうか?
#include <stdio.h>

int main(void)
{
    int men[10]={300,330,320,350,490,100,200,150,290,300};
    int i;
    int j;
    int g;
    char me[10][13]={"ラーメン","味噌ラーメン","豚骨ラーメン","塩ラーメン","特製ラーメン","ライス[小]","ライス[大]","キムチ","餃子","サラダ"};
    i=0;
    j=0;
    g=0; 
    printf("メニューを選択してください\n");
    printf("0:ラーメン 1:味噌ラーメン 2:豚骨ラーメン 3: 塩ラーメン 4:特製ラーメン 5:ライス[小] 6:ライス[大] 7:キムチ 8:餃子 9:サラダ\n");

    while(10>j || j<-1){
        scanf("%d",&j);
        g=g+men[j];
    }
    printf("食べた合計は%d円です\n",g);
    
    return 0;
}


問題点1:scanfで10以上、−1以下の数字を入力するとプログラムを終了させたいのですが、−1以下を入力しても終了しない。
問題点2:食べた合計の出力が変な数字が出る。
問題点3:合計と共に、今まで食べたメニューを一緒に出力したいのですが、そのプログラムが分かりません。
例:scanfで1,3,5と入力すると、食べた合計780円、食べたメニュー:味噌ラーメン、塩ラーメン、ライス[小]と出力したいのです。

どうか、お願いします。
OS:windowsxp
コンパイラ:c++



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列について 21276 まきじ 2005/06/08 19:11:44
<子記事> Re:配列について 21277 si 2005/06/08 19:18:05
<子記事> Re:配列について 21280 円零 2005/06/08 19:53:46
<子記事> Re:配列について 21282 iijima 2005/06/08 20:09:28


No.21276

Re:配列について
投稿者---まきじ(2005/06/08 19:11:44)


>問題点1:scanfで10以上、−1以下の数字を入力するとプログラムを終了させたいのですが、−1以下を入力しても終了しない。

j < 10 && j>-1 の間繰り返し。

>問題点2:食べた合計の出力が変な数字が出る。

j がインクリメントされていない。

>問題点3:合計と共に、今まで食べたメニューを一緒に出力したいのですが、そのプログラムが分かりません。

me[j] を出力したらよい。


この投稿にコメントする

削除パスワード

No.21278

Re:配列について
投稿者---まきじ(2005/06/08 19:24:36)


>>問題点2:食べた合計の出力が変な数字が出る。
>
>j がインクリメントされていない。

は間違いで、ループ条件がおかしいのが原因です。


この投稿にコメントする

削除パスワード

No.21277

Re:配列について
投稿者---si(2005/06/08 19:18:05)


scanf関数の注意事項をネットで検索してみて下さい。


この投稿にコメントする

削除パスワード

No.21280

Re:配列について
投稿者---円零(2005/06/08 19:53:46)


>問題点2:食べた合計の出力が変な数字が出る。

例えば、-1を入力してループを抜けた場合に
men[-1]が加算されてしまうのが原因です。


この投稿にコメントする

削除パスワード

No.21282

Re:配列について
投稿者---iijima(2005/06/08 20:09:28)


> 問題点1:scanfで10以上、−1以下の数字を入力するとプログラムを終了させた
> いのですが、−1以下を入力しても終了しない。

while(10>j || j<-1){
}

条件式をよく考えましょう。
「jが10未満、または、jが-1未満の間、{}内を実行する」
となっていますよ。
つまり、10未満なら繰り返されるようになっています。


> 問題点2:食べた合計の出力が変な数字が出る。

scanfで読み込んだjの値が10以上でも0未満でも、その次の文

    g=g+men[j];

は実行されますから、men配列の範囲を超えた場所のメモリを読んでいるのでしょう。
この問題は、問題点1を解決しても解決されません。
jがmen配列の要素番号の範囲(0〜9)を超えたらループを終了されるということなら、
gの計算をする前に判定してループを抜けるようにすべきです。


> 問題点3:合計と共に、今まで食べたメニューを一緒に出力したいのですが、その
> プログラムが分かりません。

食べたメニューの番号を保存しておく配列と、食べた品数をカウントするための変数
を別に用意し、入力が終了したらそれらを使って食べたメニューを出力するのが簡便
と思われます。
その場合、メニュー番号を保存する配列の要素数を十分大きくしておくとか、注文で
きる品数を制限するなどの工夫も考えるべきですね(それは次のステップかも知れま
せんが)。



この投稿にコメントする

削除パスワード

No.21325

Re:配列について
投稿者---ひかる(2005/06/10 15:59:18)


みなさまお答えいただき有難うございました。
問題点1、2は解決しましたが、未だに問題点3が解けません。
食べたメニューの番号を保存しておく配列というのは分かるのですが、それが、どのようなプログラムなのか思いつきません。
すみませんが、もう少しだけお力をお貸しください。


この投稿にコメントする

削除パスワード

No.21326

Re:配列について
投稿者---まきじ(2005/06/10 18:07:25)


>食べたメニューの番号を保存しておく配列というのは分かるのですが、それが、どのようなプログラムなのか思いつきません。

for 文の中で、j を、配列に格納していき、合計金額表示後、
その配列に格納されている値を添え字として、
me を表示すれば良いと思います。


この投稿にコメントする

削除パスワード

No.21328

Re:配列について
投稿者---si(2005/06/10 20:10:53)


素直に、オーダーを記録する配列を作り
int order[10] = {0,0,0,0,0,0,0,0,0,0};
g = g + mem[j];の下に
order[j]++;を追加して、オーダーを記録すれば如何ですか?
#include <stdio.h>

int main(void)
{
    int men[10]={300,330,320,350,490,100,200,150,290,300};
    int i,j,g;
    char *me[]={"ラーメン","味噌ラーメン","豚骨ラーメン","塩ラーメン","特製ラーメン","ライス[小]","ライス[大]","キムチ","餃子","サラダ"};
    int order[10] = {0,0,0,0,0,0,0,0,0,0};
    i=0; j=0; g=0; 
    printf("メニューを選択してください\n");
    printf("0:ラーメン 1:味噌ラーメン 2:豚骨ラーメン 3: 塩ラーメン 4:特製ラーメン 5:ライス[小] 6:ライス[大] 7:キムチ 8:餃子 9:サラダ\n");
    while( 1 ){
        scanf("%d",&j);
        if ( j < 0 || j > 9) break;
        g=g+men[j];
        order[j]++;
    }
   printf("ご注文は\n");
   for ( i = 0; i < 10; i++){
     	if ( order[i] > 0) {
     		printf("%s %dつ ",me[i],order[i]);
     	}
    }
   printf("ですね。\n合計は%d円です\n",g);
   return 0;
}



この投稿にコメントする

削除パスワード

No.21346

Re:配列について
投稿者---ひかる(2005/06/11 18:46:49)


みなさんのおかげで問題を解くことができました。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧