質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

20452閲覧

c言語で自動販売機のフローチャートを作成

kmercy

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

1クリップ

投稿2017/03/31 15:51

編集2017/04/01 13:59

こんにちは。c言語の学習を始めて1ヵ月の初心者です。現在、教本の自動販売機のフローチャートの作成に挑戦しているのですが思ったように進まず困っています。
特におつりの処理がわかりません。
私は、おつりを{500、100、50、10}の配列で順に割っていきその枚数を自動販売機の保有硬貨の数から引けばいいと考えたのですが、保有硬貨が足りない場合を考えていないと指摘されてからわからなくなってしまいました。
教本自体に答えが載っていないためどんずまり状態です。みなさんならどういうふうに書くかまた、よろしければ、全体的にどのようにコーディングするのかお手本も知りたいので何卒、ご教授願います。

想定する自販機の仕様は
・1回1個の商品しか買えない
・商品は150円と120円が5個づつ
・扱えるお金は、1000円、500円、100円、50円、10円
・商品ボタンが押されるまで投入金を加算する機能
・返金ボタンの機能

・おつりは500円、100円、50円、10円で返す

・自販機の保有硬貨は各100枚づつ保有硬貨が足りない場合も考える

can110👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

答えが重要じゃなく、考え方が重要ですね。

1-仕様を処理と制約に分けましょう。
■処理
・投入機能
・返金機能
・購入機能

■制約
・1回1個の商品しか買えない
・商品A(150円,5個)
・商品B(120円,5個)
・購入用(1000円,500円,100円,50円,10円)
・おつりは500円、100円、50円、10円で返す
・お釣り用(500円,100枚)
・お釣り用(100円,100枚)
・お釣り用(50円,100枚)
・お釣り用(10円,100枚)

2-制約の中で、減ったり増えたりする物をさがしてください、これが変数なります。
また、減ったり増えたりする範囲を探してください、これが条件になります。
どちらでもないものは制約のまま残してください。
■処理
・投入機能
・返金機能
・購入機能

■制約
・1回1個の商品しか買えない
・購入用お金(1000円,500円,100円,50円,10円)
・おつりは500円,100円,50円,10円で返す
・商品Aは150円
・商品Bは120円

■変数
・商品Aの個数
・商品Bの個数
・お釣り用500円硬貨の枚数
・お釣り用100円硬貨の枚数
・お釣り用50円硬貨の枚数
・お釣り用10円硬貨の枚数

■条件
・商品Aは0個〜5個
・商品Bは0個〜5個
・お釣り用500円硬貨は0枚〜100枚
・お釣り用100円硬貨は0枚〜100枚
・お釣り用50円硬貨は0枚〜100枚
・お釣り用10円硬貨は0枚〜100枚

3-機能の実行によって増えたり減ったりする物を考えましょう。新しく変数に追加してください。
4-機能の実行が出来る条件(購入は投入額が商品額を超えないとできない等々)を考えましょう。
5-機能だけのフローチャートを描きます。
6-変数をフローチャートに追加します。
7-条件をフローチャートに追加します。

投稿2017/03/31 17:36

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

考え方についての質問なので、考えてみました。
1.500円,100円,50円,10円の枚数を決めます。
2.500円,100円,50円,10円の順に割っていき結果を表示します。
3.それぞれの商を初めに決めた500円,100円,50円,10円の枚数から引きます。
4.初めに決めた硬貨の枚数が0になった場合は該当する硬貨では割りません。
5.おつりが出せなくなったら繰り返しを終了します。
下のプログラムが意図したとおりに動くかどうかは分かりません。

Ruby

1#encoding : utf-8 2 3coin_500 = 100 4coin_100 = 100 5coin_50 = 100 6coin_10 = 100 7 8loop{ 9 input = gets.chomp.to_i 10 11 items = gets.chomp.to_s.split(",").map(&:to_i) 12 13 item1_price = items[0] 14 item1_num = items[1] 15 16 item2_price = items[2] 17 item2_num = items[3] 18 19 sum = (item1_price * item1_num) + (item2_price * item2_num) 20 res = input - sum 21 puts"合計金額:#{sum}円" 22 puts"おつり:#{res}円" 23 24 if coin_500 > 0 25 num_500 = res / 500 26 puts "500円:#{num_500}枚" 27 res = res - (500 * num_500 ) 28 coin_500 -= num_500 29 end 30 if coin_100 > 0 31 num_100 = res / 100 32 puts "100円:#{num_100}枚" 33 res = res - (100 * num_100) 34 coin_100 -= num_100 35 end 36 if coin_50 > 0 37 num_50 = res / 50 38 puts "50円:#{num_50}枚" 39 res = res - (50 * num_50 ) 40 coin_50 -= num_50 41 end 42 if coin_10 > 0 43 num_10 = res / 10 44 puts "10円:#{num_10}枚" 45 res = res - (10 * num_10 ) 46 coin_10 -= num_10 47 end 48 if coin_500 + coin_100 + coin_50+ coin_10 == 0 49 break 50 end 51 puts"-------------------------------------\n" 52}

投稿2017/03/31 16:44

編集2017/03/31 16:51
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

フローチャート

イベントが複数あるかと思い、
・お金投入イベント
・返金イベント
・商品選択イベント
で、フローチャートを分けています。

投稿2017/04/01 04:53

編集2017/04/01 12:19
otaks

総合スコア223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kmercy

2017/04/01 12:10

具体的な返答をしていただき、ありがとうございます。
guest

0

フローチャートを作るのですね。今できているものを、不完全でも見せていただけると回答がしやすいです。ともかく、回答します。


ソフトウェアというのは「現実をモデル化して、それをプログラムで実現したもの」です。フローチャートは、モデルの動作 (動き) を図で表現したものです。そういうわけですから、まずは現実の自動販売機を観察してみましょう。近所に自動販売機、ありますよね?

外側から見えるのは▽お金の投入口、▽商品のボタン、▽商品取り出し口、▽釣り銭や返金の返却口です。自販機が内部でどんな動作をしているのかは見ることができませんが、▽商品の保管場所と、▽保有硬貨の保管場所があることは想像がつきますね。

  • 自動販売機は、上記の構成要素から成るモデルで表現できます。

釣り銭返却処理にしぼって考えると、見えるものはもうひとつあります。釣り銭が返却口に出てくる順番です。私の見たところ、釣り銭が一度にまとめて出てくる機種は割と少ないです。たいてい、1枚ずつか数枚ずつ順番に出てきます。つまり、

  • 釣り銭返却処理は、保有硬貨から1枚あるいは数枚を取って、返却口に出すという動作を繰り返す処理です。

実際に観察してみるとわかりますが、硬貨が出てくる順番は私の知る範囲では (一度にまとめて出てくるものを除き) 少なくとも3種類あります。①大きな額面の硬貨から先に出す、②小さな額面の硬貨から先に出す、③異なる額面の硬貨1枚ずつを一緒に出す、のいずれかです。それぞれ、どういう考え方でお金を順番に出しているのか、実物を観察して考えてみるといいでしょう[1]。

「保有硬貨から1枚あるいは数枚を取って、返却口に出す」という処理を、①から③のどれかの方式でやるとします。これには▽すでに返却口から出した金額、▽投入金額、▽購入金額、▽保有硬貨の額面毎の枚数、が関係します。一方、処理の結果は▽返却口から出す額面と▽その枚数で表されます。そして、上で述べたように、この処理を繰り返せば釣り銭返却処理ができます。

以上のことを図にまとめれば、課題のフローチャートになると思います。


[1] ①の方式が多いのはなんとなく分かるような気がしますが、③も意外と多いです。③がどういう方式なのかの詳細説明は省きますので、もしも見つけたらよく観察してみて下さい (特定の製造メーカーの機種が比較的多いです)。

投稿2017/04/01 04:43

編集2017/04/01 04:57
ikedas

総合スコア4317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kmercy

2017/04/01 15:27

ありがとうございます。 もっと自動販売機を観察してみます
guest

0

目的とする処理をどうやって実装すればよいか判らない場合は、処理を小さく切り分けて考えると実装方法が分かってきます。コツは自分で勝手に想定した「都合がいい処理」が存在するものとして考えることです。「都合がいい処理」の中身は、後で別に考えればいいです。

今回の場合、問題は『お釣りを自動販売機から出したい。でも、自動販売機の中に存在しない硬貨を出すことはできない』ということですよね。
であれば、

「指定された金額のお釣りを得るために、自販機の中から都合がいい硬貨を1枚取り出す」

という処理が存在すると想定すると、保有硬貨が足りない場合を考慮した処理が作れそうな気がしてきませんか?(この処理を何回も繰り返して、お釣りとして出す必要があるだけ硬貨を1枚ずつ引っ張り出してくればいいのです)

そのあとで「指定された金額のお釣りを得るために、自販機の中から都合がいい硬貨を1枚取り出す」というのは具体的にどんな動きなんだ?と考えるわけです。

例:
【指定された金額のお釣りを得るために、自販機の中から都合がいい硬貨を1枚取り出す】の詳細

この処理では、500円、100円、50円、10円 のいずれかの硬貨を1枚取り出す。
この処理で硬貨を取り出すと、自販機の保有硬貨数が1枚減る。
この処理では、自販機の中に存在しない硬貨は取り出せない。
この処理では、取り出す硬貨の枚数が少なくて済むように、価値が高い硬貨を優先して取り出そうとする。
(例: 999円のお釣りなら、500円硬貨を1枚取り出そうとする)
(例: 499円をお釣りなら、100円硬貨を1枚取り出そうとする)

この処理は元の問題を切り分けたものなので、ここで考えなければいけない問題の難度は元の問題よりも下がっています。

それでもまだ難しいなら、この「都合がいい処理」を実装するには、どんな「もっと都合いい処理」が存在していればよいか…と言った具合に考えていくとよいとおもいます。

投稿2017/03/31 16:54

編集2017/03/31 16:57
ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問