C言語関係掲示板

過去ログ

No.102.おつりの計算


No.545

配列の問題で質問です。
投稿者---int(2001/11/15 00:21:32)


こんにちは。またちょっとわからない問題があったので質問です。

「次のプログラムを改変し、自動販売機のプログラムを配列変数を用いて作成、実行せよ。
この際、おつりとして必要な情報のみを出力する
(0枚の情報は出力しない)プログラムとし、
また、printf文を二つ使い("%d円札が%d枚\n"、"%d円玉が%d枚\n”)
紙幣と硬貨を区別して出力せよ。
配列変数を用いることによりプログラムが
(下のプログラムと比べて)どのように簡潔になったかを述べよ。 」
「#include <stdio.h>
main(){
int i,ma10000,ma5000,ma1000,ma500,ma100,ma50,ma10,ma5,ma1,
change,man,inmoney;

printf("1: Milk -- 80円\n");
printf("2: Coke -- 110円\n");
printf("3: 煙草 -- 230円\n");
printf("4: Beer -- 330円\n");
printf("5: Film -- 450円\n");
printf("何を買いますか?(1-5): ");
scanf("%d",&i); /* 品物番号を入力 */
do {
printf("いくらいれますか?(ex.1000): ");
scanf("%d",&inmoney); /* 投入金額を入力 */
switch(i){ /* 品物番号によりおつりを計算 */
case 1:
change=inmoney-80;
break;
case 2:
change=inmoney-110;
break;
case 3:
change=inmoney-230;
break;
case 4:
change=inmoney-330;
break;
case 5:
change=inmoney-450;
break;
}
} while(change<0); /* 投入金額が不足の場合は再度入力し直す */
printf("おつりは %d 円です\n",change);
man=change/10000; /* 1万円札が何枚いるかをmanに求める */
change=change-man*10000; /* おつりのさらなる残額を計算 */
ma10000=man; /* 1万円札の枚数をma10000に保存 */
/* 以下同様に5000円札から5円玉まで必要な枚数を各々の変数に保存 */
man=change/5000; change=change-man*5000; ma5000=man;
man=change/1000; change=change-man*1000; ma1000=man;
man=change/500; change=change-man*500; ma500=man;
man=change/100; change=change-man*100; ma100=man;
man=change/50; change=change-man*50; ma50=man;
man=change/10; change=change-man*10; ma10=man;
man=change/5; change=change-man*5; ma5=man;
ma1=change; /* 最後の残が1円玉の必要な枚数 */
printf("以下のようにおつりが出ます\n");
printf("1万円札%d枚\n",ma10000);
printf("5千円札%d枚\n",ma5000);
printf("千円札%d枚\n",ma1000);
printf("5百円玉%d枚\n",ma500);
printf("百円玉%d枚\n",ma100);
printf("50円玉%d枚\n",ma50);
printf("10円玉%d枚\n",ma10);
printf("5円玉%d枚\n",ma5);
printf("1円玉%d枚\n",ma1);
}

と言う問題なんですけど、

お釣りまでのプログラムは
#include <stdio.h>
main(){
int i,j,k,inmoney;
int nedan[5]={80,110,230,330,450};
int kinsyu[9]={10000,5000,1000,500,100,50,10,5,1};
int mai[9]={1,2,3,4,5,6,7,8,9};

printf("1: Milk -- 80円\n");
printf("2: Coke -- 110円\n");
printf("3: 煙草 -- 230円\n");
printf("4: Beer -- 330円\n");
printf("5: Film -- 450円\n");
printf("何を買いますか?(1-5): ");
scanf("%d",&i);
do {
printf("いくらいれますか?(ex.1000): ");
scanf("%d",&inmoney);
k=inmoney-nedan[i-1];
} while(k<0);
printf("おつりは %d 円です\n",k);
}
で出来たんですけど、配列を使ってお釣りの枚数をどうやってやるのかわかりません。
for文をつかって、お釣りを出せないかなぁ。と思ってるんですがうまくいきません。
またお手数かと思いますが、ぜひ一緒に考えてください。では。



No.546

Re:配列の問題で質問です。
投稿者---shu(2001/11/15 14:03:06)


>この際、おつりとして必要な情報のみを出力する
>(0枚の情報は出力しない)プログラムとし、
>また、printf文を二つ使い("%d円札が%d枚\n"、"%d円玉が%d枚\n”)
>紙幣と硬貨を区別して出力せよ。
>配列変数を用いることによりプログラムが
>(下のプログラムと比べて)どのように簡潔になったかを述べよ。 」

  #include <stdio.h>

  #define MAX_TYPE  7 /* お金の種類数 */

  int main(void)
  {
    int money_type[] = {
      10000, 5000, 1000, 500, 100, 50, 10
    }; /* お金の種類 */
    int price[] = { 80, 110, 230, 330, 450 }; /* 商品の値段 */
    int in_money = 0;   /* 自販機に入れるお金 */
    int menue_no;     /* 商品番号 */
    int ret_money;     /* おつり */
    int count;
    int i;
    
    /*-- お金を入れる --*/
    printf("お金をいくらいれますか?: > ");
    scanf("%d", &in_money); /* 金額入力 */
    
    /*-- メニュー選択 --*/
    puts(
      " 0: Milk -- 80円\n"
      " 1: Coke -- 110円\n"
      " 2: 煙草 -- 230円\n"
      " 3: Beer -- 330円\n"
      " 4: Film -- 450円\n\n"
      " 何を買いますか?(0 〜 4): > ");
      
    scanf("%d", &menue_no); /* 商品番号入力 */
    
    
    /*-- おつりを求める --*/
    ret_money = in_money - price[menue_no];
      
    printf("おつりは %d 円です\n", ret_money);
      
    for (i = 0; i < MAX_TYPE; i++) {
      count = ret_money / money_type[i];
      ret_money -= money_type[i] * count;
      printf(" %5d 円 %2d 枚\n", money_type[i], count);
    }
    
    return 0;
  }


こんなんじゃだめですか?


No.578

Re:配列の問題で質問です。
投稿者---int(2001/11/20 23:27:13)


shuさんのおかげでここまでは出来ました。
#include <stdio.h>
main(){
int i,j,k,l,m,t,inmoney;
int nedan[5]={80,110,230,330,450};
int kinsyu[9]={10000,5000,1000,500,100,50,10,5,1};
int mai[10]={0,1,2,3,4,5,6,7,8,9};

printf("1: Milk -- 80円\n");
printf("2: Coke -- 110円\n");
printf("3: 煙草 -- 230円\n");
printf("4: Beer -- 330円\n");
printf("5: Film -- 450円\n");
printf("何を買いますか?(1-5): ");
scanf("%d",&i);
do {
printf("いくらいれますか?(ex.1000): ");
scanf("%d",&inmoney);
k=inmoney-nedan[i-1];
} while(k<0);
printf("おつりは %d 円です\n",k);
k = inmoney - nedan[i-1];

for(l=0;l<3;l++)
{
t = k / kinsyu[l];
k -= kinsyu[l] * t;
printf(" %5d円札が%2d枚\n", kinsyu[l], mai[t]);
}

for(m=3;m<9;m++)
{
t = k / kinsyu[m];
k -= kinsyu[m] * t;
printf(" %5d円玉が%2d枚\n", kinsyu[m], mai[t]);
}


return 0;
}

これで、枚数まで出たんですけど、
後、0枚の時の表示は消すって言うのができません。
if文でt=0のときは表示しないってやれば出来そうですが、
どうすればいいでしょう?
それでは。

No.579

できました。
投稿者---int(2001/11/21 00:02:26)


#include <stdio.h>
main(){
int i,j,k,l,m,t,inmoney;
int nedan[5]={80,110,230,330,450};
int kinsyu[9]={10000,5000,1000,500,100,50,10,5,1};
int mai[10]={0,1,2,3,4,5,6,7,8,9};

printf("1: Milk -- 80円\n");
printf("2: Coke -- 110円\n");
printf("3: 煙草 -- 230円\n");
printf("4: Beer -- 330円\n");
printf("5: Film -- 450円\n");
printf("何を買いますか?(1-5): ");
scanf("%d",&i);
do {
printf("いくらいれますか?(ex.1000): ");
scanf("%d",&inmoney);
k=inmoney-nedan[i-1];
} while(k<0);
printf("おつりは %d 円です\n",k);
k = inmoney - nedan[i-1];

for(l=0;l<3;l++)
{
t = k / kinsyu[l];
k -= kinsyu[l] * t;

if(t==0)
continue;

printf(" %5d円札が%2d枚です。\n", kinsyu[l], mai[t]);
}

for(m=3;m<9;m++)
{
t = k / kinsyu[m];
k -= kinsyu[m] * t;

if(t==0)
continue;

printf(" %5d円玉が%2d枚です。\n", kinsyu[m], mai[t]);
}


return 0;
}
continueを入れれば飛ばせれるんですね…全然知りませんでした。
ご迷惑をおかけしました。それではまたわからない問題があったらお願いします。

No.581

Re:できました。
投稿者---shu(2001/11/21 10:53:10)


>
>if(t==0)
>continue;
>
>printf(" %5d円玉が%2d枚です。\n", kinsyu[m], mai[t]);

>continueを入れれば飛ばせれるんですね…全然知りませんでした。
>ご迷惑をおかけしました。それではまたわからない問題があったらお願いします。

if(t != 0) {
  printf(" %5d円玉が%2d枚です。\n", kinsyu[m], mai[t]);
}

ゼロでない時出力するでもいいと思いますよ。

・・・1円や5円いれるっ自販機ってあんまり無いような気が?

No.580

Re:配列の問題で質問です。
投稿者---kikk(2001/11/21 00:45:03)


ども。


よこやり。


このプログラムだとmai[t]はtでよいのでは?
# int mai[10]をつかうと10万円以上入れたときに自販機が壊れます

みたところ課題のようですが、現在のプログラムは出題者の意図とは
おそらく違います。もとのプログラムを見る限り、計算部と出力部は分けて
書く方式を、解答者が導きだすように問題が作られています(おつりを配列に
格納)。


では。

p.s. ほんとにどーでもいいこと。
プログラムをみて最初におもったこと。
「2000円札は?」
でも、よく考えたら2000円札が「出てくる」自販機ってありませんね。。
それに2000円札がない場合は金種を格納せずに/2と/5を繰り返すという方法
でもできるようになりますし。。。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved