- 締切済み
商品の購入に関するプログラミング
大学の授業でC言語のプログラミングを習っています。初心者でほとんどわからず、作ってみたものの、ごちゃごちゃになってまとめられなくなりました。 先日の授業で、商品購入の流れをプログラミングする問題が出て、それについて質問させてください。 内容は、 客が購入した合計金額を提示し、客が出したお金から、おつりを表示すること、 商品Aを購入した場合、別の商品Bを勧めることという課題がついています。 まず、合計金額を表示するとあるのですが、この場合商品それぞれに変数宣言をして行ったほうがよいのかという疑問があります。つまり、100円の商品に、Xという変数を付けるべきなのかなどです。 それに、最終的におつりを表示しなくてはいけないので、合計金額、出された金額、おつりにそれぞれ変数を付けなくてはいけないことになるとすると、変数が多すぎるという不安があります。 次に、商品Aを購入すると、商品Bを勧めるという課題についてです。ifを使うことはわかるのですが、客によってBを勧めても断られるか、購入するかによって、合計金額が変化すると思いますが、その対応の仕方もわかりません。また、購入の過程の間で、客との会話を表示するように言われ、ますます困惑しています。例えば、Bを勧めると、客から、いる、または、いらないと表示できるようにします。このように、scanf、printfを入れながら、計算をしていく方法がわからなくて困っています。 自分でも混乱していて、かなりまとまりのない文章になってしまっているのですが、よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
すみません、1個だけ説明不足でした。 if (money>=total*1.05) break; else if (!money) { ・・・ ※元リストは i ですが誤りです。 printf("\n\nまたお越し下さい\n"); return 0; 支払金を 0 円 と入力すれば終了します。
最後にレシート入り修正リストです。 (多少、解かりやすいかと思います) #include <stdio.h> #include <conio.h> #define MAX 2000 enum _table{ pen, eraser, note, book, _count }; char name[_count][50]={"ペン","消しゴム","ノート","本"}, tani[_count][10]={"本","個","冊","冊"}; int price[_count]={100,80,240,2200}; int main(void) { int i,n,add,money,total=0,sType[MAX],sCount[MAX],sCur=0; while (1){ do { printf("何をお買い求めになりますか?(番号入力 / \"C\":レジ精算)\n\n"); for (i=0;i<_count;i++) printf("商品 %0.4d : %s [\\%d]\n",i,name[i],price[i]); printf("\n商品番号:****\b\b\b\b"); while (1) { for (add=0,i=1000;i;i/=10) { while (!((n=_getch())>='0' && n<='9' && sCur<MAX)) if ((n=='C' || n=='c' && total) || sCur>=MAX) { if (sCur>=MAX) printf("\n\nこれ以上は購入できませんので精算します\n"); printf("\n\n小計で %d 円、合計で %.0f 円になります\n",total,total*1.05); while (1){ printf("いくらで支払いますか?"); flushall(); scanf("%d",&money); if (money>=total*1.05) break; else if (!i) { printf("\n\nまたお越し下さい\n"); return 0; } else printf("%d 円ではお金が足りません、\n",money); } printf("%d 円からお預かりします( 何か押してください )\n",money); getch(); printf("\n%.0f 円のおつりと、以下レシートです、お買い上げありがとうございました。\n",money-total*1.05); printf("( 何か押してください )\n\n"); getch(); printf("商品名 / 個数 ・・・ 計\n\n"); for (i=0;i<sCur;i++) { printf("%s / %d ・・・ \\%d\n",name[sType[i]],sCount[i], price[sType[i]]*sCount[i]); } printf("-----------------------------------\n"); printf("小計 : %d\n合計 : %.0f\n入金 : %d\n釣り : %.0f\n", total,total*1.05,money,money-total*1.05); printf("\nまたお越し下さい\n"); return 0; } printf("%d",n-'0'); add+=(n-'0')*i; } if (add<_count) break; else printf("\b\b\b\b"); } printf("\n\nこの商品でよろしいですか? ( 1:OK / 2:NO )\n"); do ; while ((n=getch())-'1' && n-'2'); if (n=='2') printf("\n"); } while (n=='2'); while (1){ do{ printf("\n数量はいくつですか?(個数入力 \"<\":UP / \">\"DOWN)\n\n"); printf("個数:%0.2d\b\b",i=1); do { if ((n=getch())==',' && i-1) i--; else if (n=='.' && i-99) i++; printf("%0.2d\b\b",i); } while (n-'\r'); printf("\n%s %d %sで %d 円、現在合計で %d 円ですがよろしいですか?\n ( 1:OK / 2:CHANGE / 3:NG )", name[add],i,tani[add],price[add]*i,total+price[add]*i); do ; while ((n=getch())-'1' && n-'2' && n-'3'); printf("\n"); } while (n=='2'); if (n=='3') break; else { total+=price[add]*i; sType[sCur]=add; sCount[sCur++]=i; } if (add==book && sCur<MAX) { printf("合わせて %s の商品もご購入しませんか? ( 1:OK / 2:NG )",name[note]); while ((n=getch())-'1' && n-'2'); if (n=='2') break; add=note; } else break; } printf("\n他に"); } return 0; }
No.2,3 です。 精算判定で商品を購入していない処理ができていなかったので 以下に変更で、合計0円の処理を止めれますね。 大したことではないのですが…。 if (n=='C' || n=='c') … 未購入でも精算してしまう if (n=='C' || n=='c' && total) … 購入時のみ精算
すみません。 [正] if (i>=total*1.05) break; [誤] if (i>=total) break;
一応、サンプルとして作ったのですが、 商品数に応じて増える、変数はテーブルにまとめれば 良いかと思います。 <リスト> #include <stdio.h> #include <conio.h> enum _table{ pen, eraser, note, book, _count }; char name[_count][50]={"ペン","消しゴム","ノート","本"}; int price[_count]={100,80,240,2200}; int main(void) { int i,n,add,total=0; while (1){ do { printf("何をお買い求めになりますか?(番号入力 / \"C\":レジ精算)\n\n"); for (i=0;i<_count;i++) printf("商品 %0.4d : %s [\\%d]\n",i,name[i],price[i]); printf("\n商品番号:****\b\b\b\b"); while (1) { for (add=0,i=1000;i;i/=10) { while (!((n=_getch())>='0' && n<='9')) if (n=='C' || n=='c') { printf("\n\n小計で %d 円、合計で %.0f 円になります\n",total,total*1.05); while (1){ printf("いくらで支払いますか?"); flushall(); scanf("%d",&i); if (i>=total) break; else if (!i) { printf("\n\nまたお越し下さい\n"); return 0; } else printf("%d 円ではお金が足りません、\n",i); } printf("%d 円からお預かりします\n",i); printf("\n%.0f 円のおつりです、お買い上げありがとうがざいました。",i-total*1.05); printf("\n\nまたお越し下さい\n"); return 0; } printf("%d%c",n-'0',n-10?'\a':'\n'); add+=(n-'0')*i; } if (add<_count) break; else printf("\b\b\b\b****\b\b\b\b"); } printf("\n\nこの商品でよろしいですか? ( 1:OK / 2:NO )\n"); do ; while ((n=getch())-'1' && n-'2'); } while (n=='2'); while (1){ do{ printf("\n数量はいくつですか?(個数入力 \"<\":UP / \">\"DOWN)\n\n"); printf("個数:%0.2d\b\b",i=1); do { if ((n=getch())==',' && i-1) i--; else if (n=='.' && i-99) i++; printf("%0.2d\b\b",i); } while (n-'\r'); printf("\n%s %d 個で %d 円、現在合計で %d 円ですがよろしいですか? ( 1:OK / 2:NG )", name[add],i,price[add]*i,total+price[add]*i); do ; while ((n=getch())-'1' && n-'2'); printf("\n"); } while (n=='2'); total+=price[add]*i; if (add==3) { printf("合わせて %s の商品もご購入しませんか? ( 1:OK / 2:NG )",name[2]); while ((n=getch())-'1' && n-'2'); if (n=='2') break; add=2; } else break; } printf("\n他に"); } return 0; }
お礼
回答だけでなく、サンプルまで作っていただき、ありがとうございます。printf以降の、文章と変数の組み合わせ方、解りやすかったです。プログラムの流れも得ることができました。これから自分で作ってみようと思います。
- maslkjh
- ベストアンサー率45% (10/22)
ノートなどに流れ図を書いてみると多少考えが整理され分かりやすくなります。 あと変数が多すぎるという心配は無用です。変数が多くなるのは当たり前の事なので変数に自分の分り易いと思う名前を付ければいいです。
お礼
回答ありがとうございます。 さっそくノートで流れ図を書いてみようと思います。 変数の多さに自分でびっくりしてしまっていたので、そういっていただけると、ありがたいです。
お礼
ありがとうございます、サンプルを目で追い、理解しながら作成している最中です。