• 締切済み

商品の購入に関するプログラミング

大学の授業でC言語のプログラミングを習っています。初心者でほとんどわからず、作ってみたものの、ごちゃごちゃになってまとめられなくなりました。 先日の授業で、商品購入の流れをプログラミングする問題が出て、それについて質問させてください。 内容は、 客が購入した合計金額を提示し、客が出したお金から、おつりを表示すること、 商品Aを購入した場合、別の商品Bを勧めることという課題がついています。 まず、合計金額を表示するとあるのですが、この場合商品それぞれに変数宣言をして行ったほうがよいのかという疑問があります。つまり、100円の商品に、Xという変数を付けるべきなのかなどです。 それに、最終的におつりを表示しなくてはいけないので、合計金額、出された金額、おつりにそれぞれ変数を付けなくてはいけないことになるとすると、変数が多すぎるという不安があります。 次に、商品Aを購入すると、商品Bを勧めるという課題についてです。ifを使うことはわかるのですが、客によってBを勧めても断られるか、購入するかによって、合計金額が変化すると思いますが、その対応の仕方もわかりません。また、購入の過程の間で、客との会話を表示するように言われ、ますます困惑しています。例えば、Bを勧めると、客から、いる、または、いらないと表示できるようにします。このように、scanf、printfを入れながら、計算をしていく方法がわからなくて困っています。 自分でも混乱していて、かなりまとまりのない文章になってしまっているのですが、よろしくお願いします。

みんなの回答

noname#50176
noname#50176
回答No.6

すみません、1個だけ説明不足でした。 if (money>=total*1.05) break; else if (!money) {  ・・・ ※元リストは i ですが誤りです。 printf("\n\nまたお越し下さい\n"); return 0; 支払金を 0 円 と入力すれば終了します。

noname#50176
noname#50176
回答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; }

noname#50176
noname#50176
回答No.4

No.2,3 です。 精算判定で商品を購入していない処理ができていなかったので 以下に変更で、合計0円の処理を止めれますね。 大したことではないのですが…。 if (n=='C' || n=='c') … 未購入でも精算してしまう if (n=='C' || n=='c' && total) … 購入時のみ精算

noname#50176
noname#50176
回答No.3

すみません。 [正] if (i>=total*1.05) break; [誤] if (i>=total) break;

syusyu2
質問者

お礼

ありがとうございます、サンプルを目で追い、理解しながら作成している最中です。

noname#50176
noname#50176
回答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; }

syusyu2
質問者

お礼

回答だけでなく、サンプルまで作っていただき、ありがとうございます。printf以降の、文章と変数の組み合わせ方、解りやすかったです。プログラムの流れも得ることができました。これから自分で作ってみようと思います。

  • maslkjh
  • ベストアンサー率45% (10/22)
回答No.1

ノートなどに流れ図を書いてみると多少考えが整理され分かりやすくなります。 あと変数が多すぎるという心配は無用です。変数が多くなるのは当たり前の事なので変数に自分の分り易いと思う名前を付ければいいです。

syusyu2
質問者

お礼

回答ありがとうございます。 さっそくノートで流れ図を書いてみようと思います。 変数の多さに自分でびっくりしてしまっていたので、そういっていただけると、ありがたいです。

関連するQ&A

  • C言語でfor文を用いたプログラミングについてです。

    C言語のプログラミングの課題で以下のような表をfor文を用いて作るというものが出ました。 商品名 単価(円)個数(円) 計  A  50   20   ***  B  90   30   ***  C  30   80   ***        合計金額   *** A,B,C及びそれぞれの単価、個数の値はキーボードからの入力で、***は演算によりその結果を出力するようにします。つまり、商品名(1文字)と単価、そしてその個数をキーボードから入力すると、単価と個数をかけた値と、それら全ての合計が出力されるようなプログラムを作るということです。 私は以下のようなプログラムを作りました #include<stdio.h> int main(void) { int a,b,c,sum,allsum,i; printf("商品名 単価 個数 計\n"); for(i=1;i<=3;i++) { a=getchar(); scanf("%d %d",&b,&c);  sum=b*c; allsum +=sum; putchar(a); printf(" %d %d %d \n",b,c,sum); } printf("合計金額 %d\n",allsum); return 0; } しかしこれでは合計金額がちゃんと表示されなかったりしてうまくいきません。おそらくfor文の中身に問題があると思うんですが…。どうか正しいプログラムと、なぜこのプログラムではうまくいかないのかを教えていただきたいです。なにぶん初心者なもんで、よろしくお願いします。

  • プログラミングC言語の問題ですがわかりません。

    プログラミングC言語の問題ですがわかりません。 5つのint型変数a,b,c,ans,responseを宣言する。a,b,cの値はscanf関数で読みこむことにより初期化する。 a(1)b(2)c= と表示して、scanf関数によりユーザーの答案をresponseに読み込み、演算結果が正しければ1、間違っていたら0を表示するプログラムを作成しなさい。ここで(1)と(2)には算術演算子(+,-,*,/,%)がはいる。5×5=25通りの演算をすべて実行するようにしなさい。 特に正しければ1、間違っていたら0を表示するプログラムがわかりません。 まだprintfとscanf関数と演算子しかやっていないのでそれを踏まえたプログラムを1通りだけでいいので書いて頂けると幸いです。

  • プログラミングについて教えてほしいんですが・・・

    プログラミングについて教えてほしいんですが・・・ プログラミングで四則演算プログラムをやっているのですが余りの求め方がわかりません。足し算の求め方は /*lesson2.c*/ #include<stdio.h> int add(int,int); int main(){ int a,b,c; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); c=add(a,b); printf("a+b=%d\n",c); } int add(int x, int y){ return x+y; } というやり方で求めることができたのですが、余りは上のプログラムのどこを変えたらいいのでしょうか? 誰かわかる人がいたら教えてください。お願いします。

  • Cのプログラミングを勉強中です。

    Cのプログラミングを勉強中です。 Aの値のBに対する割合を表示すしたいのですが、以下のように記述してもうまくいきません。 どこを直したらよいか教えていただけますか。 #include <stdio.h> int main(void) { int n1 , n2 ; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d", &n1); printf("整数B:"); scanf("%d", &n2); printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 ); return(0); }

  • プログラミング合っているか教えて下さい。

    5つの整数をキーボードから入力し、合計値と平均値を出すプログラミングです。 (1)キーボードからの数値入力は「Enter 1st=○」のように表記。 (2)平均値は小数第二位まで表示。 (3)ループ文を使用する事。 #include<stidio.h> main() { int a sum=0; printf("データを5つ入力せよ\n"); scanf( %d",&a); switch(a) { case 1: printf("Enter 1st=%d",a); break; case 2: printf("Enter 2nd=%d",a); break; case 3: printf("Enter 3rd=%d",a); break; case 4: printf("Enter 4th=%d",a); break;   case 5: printf("Entre 5th=%d,a); break; } for (i=1;i<5;i++) {scanf("%d",&a; sum=sum+a;} printf("5つの合計値=%d",sum); printf("5つの平均値=%4.2f",(float)sum/5); } まだ初心者で勉強中のため、文法がおかしいかもしれませんが間違い等のご指摘、宜しくお願いします。

  • プログラミングの問題

    【問題】 2つの数 a,b を入力し、aをbで割ったときの商と余りを求め、表示するプログラミングを作りなさい。 【ヒント】aとbを整数型で宣言しておき、a/bの計算をすると、小数点以下が切り捨てられ、整数化される。 a => 10 b => 3 商  = 3 余り = 1 上記の解答は、下記のようになるのですが、下記以外の解答方法はありませんでしょうか?プログラムに詳しい方解答おねがいします! #include <stdio.h> main() { int a, b, syo, amari; printf ("a => "); scanf("%d",&a); printf ("b => "); scanf("%d",&b); syo = a / b; amari = a % b; printf ("商  = %d\n",syo); printf ("余り = %d\n",amari); return (0); }

  • プログラミング 実数 合計値

    プログラミング 実数 合計値 3つの実数を読み込んで合計を表示するというプログラムのソースについてなんですが #include <stdio.h> int main(void) { double na, nb, nc; puts("3つの実数を入力してください。"); printf("実数:"); scanf("%5.lf", &na); printf("実数:"); scanf("%5.lf", &nb); printf("実数:"); scanf("%5.lf", &nc); printf("合計は%5.lfです。\n", (double)(na + nb + nc); return (0); } でコンパイルしてみたんですが、構文エラーでreturnの前の行で')'が';'の前にありません というのが出てきてコンパイルできないのですが、これはどこが間違ってるんでしょうか?

  • while文のデータの終わり

    C言語なんですが 購入合計金額を求めるプログラムで、 1回のプログラム実行で、続けて何回でも計算を行い、 えんぴつの購入数に999を入力すると計算を終了するようなプログラムを作りたいのですが、 #include <stdio.h> main() { int a,b,c,goukei; a=b=c=0; while(a!=999){ printf("商品をいくつ買いますか??\n"); printf("えんぴつ   = "); scanf("%d",&a); printf("消しゴム   = "); scanf("%d",&b); printf("ボールペン = "); scanf("%d",&c); goukei=a*100+b*150+c*200; printf("合計購入価格は%d円です\n\n",goukei); } } 上のようなソースを作ったのですが えんぴつのところに999を入力してもプログラムが終了せずに続いてしまいます… 試行錯誤してもうまくいきません。 どこが間違っているのでしょうか?

  • プログラミングで質問があります。

    プログラミングで質問があります。 実数値を入力して、その平均を出すプログラミングを作ったのですが、うまく行きません。 どこが間違っているのか教えてほしいです #include <stdio.h> int main (void) { float a=1,sum=0; int b=0,i; while(a!=0) { printf("整数値を一つ入力してください。"); scanf("%f",&a); if(a!=0) { b=b+1; } for(i=0;i<=b;i=i++) { sum=sum+a; } } printf("平均値は%fです\n",sum/b); } 実行して、10、10、10と入力すると、90になってしまいます(..;)

  • C言語を使用したプログラミング方法で質問です。

    以下のプログラミングで質問です。 以下のプログラミングはscanfで入力した値に消費税(1.05)して、10万円-出力結果(消費税含み) の合計金額のお釣りの枚数を表示してます。この処理に以下のプログラムを追加したいのですが分かりません。どなたか教えて頂けますか? 五百円玉=1or0 入力 五十円玉=1or0 入力 1=有り 0=無し 1&1のとき500円玉、50円玉を使ってお釣りを支払う。 1&0のとき50円玉は使わない 0&1のとき500円玉は使わない 0&0のときどちらも使わない。 #include <stdio.h> int main(void) { int i; int buy; int turi, maisu; int coin_500; int coin_50; printf("購入金 = "); scanf("%d",&i); buy=i*1.05; printf("支払額 = %.d\n",buy); turi = (100000-buy); printf("おつり = %.d\n",turi); printf("五百円玉 = "); scanf("%d",&coin_500); printf("五十円玉 = "); scanf("%d",&coin_50); // 一万円札の枚数を求める // maisu = turi / 10000; //おつりの金額に10000円で割った値 printf( "一万円 = %d\n",maisu ); // 千円札の枚数を求める // turi = turi % 10000; //おつりの金額を10000円で割った余りの値 maisu = turi / 1000; //余りの値を1000で割った数 printf( " 千円 = %d\n",maisu ); // 五百円玉の枚数を求める // turi = turi % 1000; maisu = turi / 500; printf( "五百円 = %d\n",maisu ); // 百円玉の枚数を求める // turi = turi % 500; maisu = turi / 100; printf( " 百円 = %d\n",maisu ); // 五十円玉の枚数を求める // turi = turi % 100; maisu = turi / 50; printf( "五十円 = %d\n",maisu ); // 十円玉の枚数を求める // turi = turi % 50; maisu = turi / 10; printf( " 十円 = %d\n",maisu ); // 一円玉の枚数を求める // maisu = turi % 10; printf( " 一円 = %d\n",maisu ); }

専門家に質問してみよう