
大学の授業でC言語のプログラミングを習っています。初心者でほとんどわからず、作ってみたものの、ごちゃごちゃになってまとめられなくなりました。
先日の授業で、商品購入の流れをプログラミングする問題が出て、それについて質問させてください。
内容は、
客が購入した合計金額を提示し、客が出したお金から、おつりを表示すること、
商品Aを購入した場合、別の商品Bを勧めることという課題がついています。
まず、合計金額を表示するとあるのですが、この場合商品それぞれに変数宣言をして行ったほうがよいのかという疑問があります。つまり、100円の商品に、Xという変数を付けるべきなのかなどです。
それに、最終的におつりを表示しなくてはいけないので、合計金額、出された金額、おつりにそれぞれ変数を付けなくてはいけないことになるとすると、変数が多すぎるという不安があります。
次に、商品Aを購入すると、商品Bを勧めるという課題についてです。ifを使うことはわかるのですが、客によってBを勧めても断られるか、購入するかによって、合計金額が変化すると思いますが、その対応の仕方もわかりません。また、購入の過程の間で、客との会話を表示するように言われ、ますます困惑しています。例えば、Bを勧めると、客から、いる、または、いらないと表示できるようにします。このように、scanf、printfを入れながら、計算をしていく方法がわからなくて困っています。
自分でも混乱していて、かなりまとまりのない文章になってしまっているのですが、よろしくお願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
すみません、1個だけ説明不足でした。
if (money>=total*1.05) break;
else if (!money) { ・・・ ※元リストは i ですが誤りです。
printf("\n\nまたお越し下さい\n");
return 0;
支払金を 0 円 と入力すれば終了します。
No.5
- 回答日時:
最後にレシート入り修正リストです。
(多少、解かりやすいかと思います)
#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.4
- 回答日時:
No.2,3 です。
精算判定で商品を購入していない処理ができていなかったので
以下に変更で、合計0円の処理を止めれますね。
大したことではないのですが…。
if (n=='C' || n=='c') … 未購入でも精算してしまう
if (n=='C' || n=='c' && total) … 購入時のみ精算
No.2
- 回答日時:
一応、サンプルとして作ったのですが、
商品数に応じて増える、変数はテーブルにまとめれば
良いかと思います。
<リスト>
#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以降の、文章と変数の組み合わせ方、解りやすかったです。プログラムの流れも得ることができました。これから自分で作ってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- スーパー・コンビニ ずっと前の出来事なのですが、相談させて下さい。 ある日コンビニにいって商品を3つ購入しました。レジに 2 2022/04/24 11:11
- ZOZOTOWN 楽天に出店しているサプリメント会社が怪しいです 4 2022/06/03 00:10
- 営業・販売・サービス レジ打ちの仕事をしてる方 (飲食店や弁当屋等) レジ締めした時に金額が合わない場合は お釣りの渡した 1 2023/07/14 12:12
- 会社・職場 レジの打ち間違いについて お弁当屋でレジの仕事してるんですが… 1つの商品を打ち間違いして レジ締め 2 2023/07/14 14:57
- Excel(エクセル) グループの最後の行に書式、計算式なども同じ行を追加するマクロを教えてもらえませんか。 7 2022/05/18 10:13
- 会計ソフト・業務用ソフト Excelで売上げデータの中の任意の商品の合計を出したい 3 2023/01/18 18:19
- Amazon Amazonで、前回購入した履歴から全く同じ衣類(Tシャツ)の商品を購入したのですが、前回購入した時 2 2022/07/11 22:48
- Amazon アマゾン 7 2022/06/11 11:03
- その他(ビジネス・キャリア) 事業復活支援金の事前確認での売上高チェックについて 2 2022/03/26 13:47
- その他(ネットショッピング・通販・ECサイト) PSストアで商品を誤って購入した場合 ブラッドボーンのDLC込みの完全版をセール価格2194円で購入 2 2023/05/05 12:45
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
strcmp
-
printfの出力内の文字をdefine...
-
printf で二進表示を行いたい。
-
*を使ったジグザグのラインをプ...
-
Cプログラムについて
-
C言語での数字の花形表示
-
defineで定数が置き換えられな...
-
10個出力で改行したいのですが...
-
%P と %X の違い
-
C言語に関して質問です。 次の...
-
コンパイルエラーについて
-
cshの文字列操作(0埋め)
-
int型 00 を表示するのに0とな...
-
【C言語教えてください】sin波...
-
学校の課題で
-
2から120以下の素数を求める
-
文字列のprint文
-
Cのdoubleの浮動小数点表示につ...
-
ヘロンの公式を作ったプルグラ...
-
エラーの意味が…
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
printf で二進表示を行いたい。
-
10個出力で改行したいのですが...
-
テキストカーソル位置の取得
-
c言語でAからZまでを表示する...
-
strcmp
-
4の倍数を論理演算で表す。。
-
コマンドラインに出力した文字...
-
コマンドプロンプトがすぐ消える
-
(C言語)めちゃくちゃな値にな...
-
円の面積を求めるプログラミン...
-
【C言語教えてください】sin波...
-
C言語 プログラミング
-
unsigned int型について
-
入力したお金の金額からお札の...
-
WM_CLOSEで閉じれないウィンド...
-
c言語で2000年以降カレンダーを...
-
%P と %X の違い
-
switch分のケースを範囲数?に...
-
LU分解法のピボット選択機能実...
おすすめ情報