C言語での消費税計算とお釣りの計算方法

このQ&Aのポイント
  • C言語を使用したプログラミング方法で、消費税を計算してお釣りの枚数を表示するプログラムについて質問です。
  • 購入金額に消費税をかけて合計金額を算出し、100,000円から合計金額を引いた値をお釣りとして計算します。
  • お釣りの枚数は、500円玉と50円玉の使用有無によって異なります。それぞれの使用有無に対応したプログラムを追加したいと考えています。どなたか教えて頂けますか?
回答を見る
  • ベストアンサー

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 ); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まず、それぞれの処理を独立させましょう。 今の書き方だと、 // 五十円玉の枚数を求める // turi = turi % 100; maisu = turi / 50; printf( "五十円 = %d\n",maisu ); の最初の行は、実は、100円玉の処理です。 これに対して、 // 五十円玉の枚数を求める // maisu = turi / 50; printf( "五十円 = %d\n",maisu ); turi = turi % 50; とすると、この3行は完全に50円玉の処理になります。 それぞれの処理が独立しましたから、 if (coin_50 == 1) { // 50円玉の処理 } のようにすれば、どの金種でも事由に禁止・許可できます。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

どの質問も同じようなタイトルを付けられていますが、 何となくもう一工夫あってもいいのではないか、などと思っています。 小学生が作文を書いたとき、「これは作文です」なんていうタイトルを付けるでしょうか? 「中身をぜひ読んでみたい!」と思わせるようなタイトルを付ける方が 得策ではないかなぁ、なんて思います。

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.1

ループを使わないで処理されている分、かなり力技な感じもしますが、それがかえってシンプルで分かり易いですね。 難しく考えずに、500円玉、50円玉で支払うかどうかのフラグをそれぞれ用意しておいて、 500円玉、50円玉の枚数をカウントする処理をスキップしてあげる、と共に、 そのすぐ下の100円玉、10円玉をカウントする処理もそのフラグによって turi = turi % 500 か turi = turi % 1000 にするかの条件文を入れてあげれば、良いかと思います。 もし、500円玉フラグが1ならば、     1000円の枚数計算後のお釣りから、500円玉の枚数を計算     500円玉の枚数計算後のお釣りから、100円玉の枚数を計算 そうでなければ、     1000円の枚数計算後のお釣りから、100円玉の枚数を計算 50円玉も同様ですね。 もう少しだけすっきりさせるなら、枚数計算した時にお釣りも計算させて、その次の処理に渡してあげる方がすっきりします。 1000円の枚数計算 お釣りの更新 もし、500円玉フラグが1ならば、    500円玉の枚数計算 と お釣りの更新 100円玉の枚数計算 お釣りの更新 もし、余力があれば、1000円、500円、100円…などお釣りの種類を配列化して、ループで計算する方法にも挑戦してみると、かなりすっきりすると思います。 ご参考に。

関連するQ&A

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • c言語のプログラミングについて聞きたいのですが

    自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

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

    以下の処理にバブルソートで小さい順からの比較結果をprintfで出力したいのですが、どこにバブルソートを追加すればよろしいですか? 追加した文を教えて頂けますか? 今は値を16進数から10進数に変換した数字を出力しているが、これを小さい順に出力したいんです。 宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /*printf("%d\n",k);*/ for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } }

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • プログラミング(C言語)についての質問です

    3つの整数の入力を受け付け、最大と最小を求める関数を作成し得られた結果を表示するプログラミングを作成したつもりなのですが、うまく作動しません。(コンパイルはできますが、結果が無茶苦茶になります。) ご教授宜しくお願いします。 それと、課題文にはポインタを使って最大値と最小値を同時に求めるようにと書いてあったのですが、それもよくわからないです。 今回初めてポインタと配列の受け渡しについて習ったのでよくわかっていない部分も多いと思うのですが、何卒宜しくお願いします。 ちなみに関数の形自体は void minmax(int data[],int *min,int *max){} で決まっています。 #include <stdio.h> void minmax(int data[],int *min,int *max){ int i; *min=*max=data[0]; printf("1st intenger:"); scanf("%d",&data[0]); printf("2st intenger:"); scanf("%d",&data[1]); printf("3st intenger:"); scanf("%d",&data[2]); for(i=1;i<3;i++){ if(*max<data[i]){ *max=data[i]; } if(*min>data[i]){ *min=data[i]; } } } int main(void){ int data[3],min,max; minmax(data,&min,&max); printf("最小値は%dで最大値は%dです",min,max); return 0; }

  • 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言語で詰将棋のプログラミングをしたのですが、実行して答えを入力してもうまくいきません。どこがまちがってるのか教えていただけませんか?なおprintfを使って場を表現した部分が長すぎて4000文字に収まらないので、そこは割愛しています。 #include<stdio.h> int main(int argc, const char * argv[]){ int yoko,tate,yoko2,tate2,yoko3,tate3; char koma,koma2,koma3; printf("詰め将棋をしましょう\n"); ~printf略~ printf("持ち駒:なし\n相手の駒は玉(1二)、歩(1三)、角(1四)、飛(2五)、あなたの駒は龍(3二)、と(3一)、角(2二)です。\n\n残り3手ですが、何を動かしますか?\n"); printf("龍、と、角のいずれかを入力:"); scanf_s("%c\n", &koma); if(koma == '龍'){ printf("どこに動かしますか? (例:「9九」なら「9 9」と入力):"); scanf_s("%d %d\n",&yoko,&tate); if((yoko==2)&&(tate==1)){ ~printf略~ printf("王手です。玉を守りましょう。最長手となるように動かしてください。\n\n残り2手ですが、何を動かしますか?\n"); printf("玉、歩、角、飛のいずれかを入力:"); scanf_s("%c\n",&koma2); if(koma2=='玉'){ printf("どこに動かしますか?:"); scanf_s("%d %d\n",&yoko2,&tate2); if((yoko2==2)&&(tate2==3)){ ~printf略~ printf("残り1手です。この1手で相手を詰みにしてください。何を動かしますか?:"); printf("龍、と、角のいずれかを入力:"); scanf_s("%c\n",&koma3); if(koma3=='角'){ printf("どこに動かしますか?:"); scanf_s("%d %d\n",&yoko3,&tate3); if((yoko3==4)&&(tate3==4)){ ~printf略~ printf("あなたの勝ちです!\n"); } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } } else{ printf("残念!\n"); } return 0; }

  • 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); }

専門家に質問してみよう