前回の最後に出した、問題の解答例です。
<sample program 006-01>
#include <stdio.h> int main(void) { int data1 = 15; int data2 = 24; int work; work = data1; data1 = data2; data2 = work; printf("data1 = %d\n", data1); printf("data2 = %d\n", data2); return 0; } |
<実行結果>
data1 = 24 data2 = 15 続行するには何かキーを押してください・・・
他にも方法はありますが、一般的な例を書いてみました。
では、早速見てみましょう。
変数「work(作業)」を追加しています。
data1とdata2の2つの変数だけでは、入れ替えることは困難です。(が、計算式で出来る方法もありますので、考えてみてください)
そこで、もう1つの変数「work」の出番になります。
プログラム | data1 | data2 | work |
---|---|---|---|
入れ替え前 | 15 | 24 | 不定 |
work = data1; | 15 | 24 | 15 |
data1 = data2 | 24 | 24 | 15 |
data2 = work; | 24 | 15 | 15 |
そのまま、data2のデータをdata1に代入すると、元のdata1の内容が消えてしまうため、一旦workにデータを移しておき、最後にdata2に代入します。
変数同士のデータの入れ替えは、後々役に立つプログラムです。(データの並べ替え等に使います。)
この問題で何をやりたかったのかというと、後々役に立つことを説明するというよりは、「変数を1つ増やすという発想を試す」ためです。
他にも方法はありますが、どの方法もどうやったら出来るのかを考え、発想しなければ結果が出ません。
眺めただけ、習っただけでは、組めないのです。
それでは、初めての問題を出しましたので、「プログラムって?」を見ておいてください。
では、もう1つ。今回は文章で問題を出します。
何かの商品の、購入金額と支払金額を入力して、おつりを求めるプログラムを作ってください。
※ただし、購入金額は支払金額を超えないものとする。
とりあえず、変数に関することだけ決めておきましょうか。
用途 | 変数の型 | 変数名 |
---|---|---|
購入金額用 | int | buy |
支払金額用 | int | pay |
おつり用 | int | change |
変数は用途に応じて作るべきです。1つの変数を複数の意味で使うことは絶対に避けてください。
※例えば、支払い用金額変数payにおつりを代入する等(意味が分かりませんね)
実行結果をこの下に書いておきますので、実際にプログラムを想像し、打ち込んで実行してみてください。
なお、この問題の目的は、「日本語」で書かれた「やりたいこと」をどうやって「C言語」にしていくか、です。
<実行結果 VC++ Express Edition>
購入した金額を入力してください:478 支払った金額を入力してください:1000 おつりは522円です。 続行するには何かキーを押してください・・・
解答例です。
#include <stdio.h> int main(void) { int pay; int buy; int change; printf("購入した金額を入力してください:"); scanf("%d", &buy); printf("支払った金額を入力してください:"); scanf("%d", &pay); change = pay - buy; printf("おつりは%d円です。\n", change); return 0; } |
<実行結果>
購入した金額を入力してください:478 支払った金額を入力してください:1000 おつりは522円です。 続行するには何かキーを押してください・・・
入力の時にもメッセージ(文字列)を表示しているため、何を入力すれば良いか迷うことはありません。
とりあえず、「おつり」とは何か?ということが分かっていれば簡単に作れるプログラムだと思います。
「おつり」とは何か?ってそんなこと誰でも知ってるよ!と思うでしょうが、なかなか理解できない方も多いのです。
「おつり」=「支払金額」−「購入金額」
という式が組み立てられなければ、プログラムが書けません。
これが、「日本語」で書かれた「やりたいこと」をどうやって「C言語」にしていくかという意味です。
次は、BMIでも計算してみましょうか。
BMIとは「ボディ・マス・インデックス」といって、標準体重を計算するための式です。
googleなどの検索エンジンで「計算式」を探してプログラムを組んでみてください。
ちなみに、正しく出来ているかどうかを検証するために、1例を書いておきます。
体重65kg、身長170cmの方のBMIは「22.491349」です。
同じ結果が出るでしょうか。
これも変数は次のように決めておきます。
用途 | 変数の型 | 変数名 |
---|---|---|
身長用 | double | height |
体重用 | double | weight |
結果用(BMI値) | double | bmi |
double型を使う時は、scanfやprintfの書式指定を「%d」ではなく、scanfは「%lf(エルエフ)」printfは「%f」にすることを忘れないでください。
<実行結果 VC++ Express Edition>
あなたの体重(kg)を入力してください:65 あなたの身長(m)を入力してください:1.7 あなたのBMIは22.491349です。 続行するには何かキーを押してください・・・
解答例です。
<sample program 006-03>
#include <stdio.h> int main(void) { double weight; double height; double bmi; printf("あなたの体重(kg)を入力してください:"); scanf("%lf", &weight); printf("あなたの身長(m)を入力してください:"); scanf("%lf", &height); bmi = weight / height / height; printf("あなたのBMIは%fです。\n", bmi); return 0; } |
<実行結果>
あなたの体重(kg)を入力してください:65 あなたの身長(m)を入力してください:1.7 あなたのBMIは22.491349です。 続行するには何かキーを押してください・・・
なぜ、検索エンジンで式を探すようにしたのかといいますと、式の表現が2通りあるのです。
1つは、
「標準体重」=「体重(kg)」÷「身長(m)」÷「身長(m)」
です。 上のプログラムはこれを元に作りました。
もう1つは、
「標準体重」=「体重(kg)」÷「身長(m)」の2乗
です。
こちらを先に見つけた方は、ちょっと苦労したかも知れません。
2乗ってどうやるの?というのが最初の疑問でしょう。
同じ数を乗算すれば良いと思った方もきちんと結果がでましたでしょうか?
<sample program 006-04>
#include <stdio.h> int main(void) { double weight; double height; double bmi; printf("あなたの体重(kg)を入力してください:"); scanf("%lf", &weight); printf("あなたの身長(m)を入力してください:"); scanf("%lf", &height); bmi = weight / height * height; printf("あなたのBMIは%fです。\n", bmi); return 0; } |
<実行結果>
あなたの体重(kg)を入力してください:65 あなたの身長(m)を入力してください:1.7 あなたのBMIは65.000000です。 続行するには何かキーを押してください・・・
何か違いますね・・・
これには理由があります。
前に演算子の優先度について書きました。 *と/の優先度は同じです。
つまり、計算の手順としては、
「体重(weight)」/「身長(height)」
が行われ、その結果に
「身長(height)」
が乗算されるわけです。
ここで「!」と思った方は、プログラムを直してみてください。
やっていることは、「体重」を「身長」で割った結果に「身長」を掛けるです。
「10」を「2」で割って「2」を掛けるとどうなりますか?
元の「10」になりますよね。
では、正しい結果が表示されるプログラムです。
<sample program 006-05>
#include <stdio.h> int main(void) { double weight; double height; double bmi; printf("あなたの体重(kg)を入力してください:"); scanf("%lf", &weight); printf("あなたの身長(m)を入力してください:"); scanf("%lf", &height); bmi = weight / ( height * height); printf("あなたのBMIは%fです。\n", bmi); return 0; } |
<実行結果>
あなたの体重(kg)を入力してください:65 あなたの身長(m)を入力してください:1.7 あなたのBMIは22.491349です。 続行するには何かキーを押してください・・・
これなら、「体重」を「身長の2乗」で「割る」になります。
次も、文章で問題を出します。
3人のテストの得点の平均点が求めたい。(点数は整数で0〜100)
得点はキーボードから入力し、結果は小数で表示したい(桁数指定なし)。
※ただし、テストの得点入力時に入力ミスは無いものとする。
これまでの内容で十分できる問題だと思いますが、いかがでしょうか?
<実行結果>
1人目の得点を入力してください:14 2人目の得点を入力してください:15 3人目の得点を入力してください:16 平均は15.000000です。 続行するには何かキーを押してください・・・
解答例です。
<sample program 006-06>
#include <stdio.h> int main(void) { double data1; double data2; double data3; double sum; double average; printf("1人目の得点を入力してください:"); scanf("%lf", &data1); printf("2人目の得点を入力してください:"); scanf("%lf", &data2); printf("3人目の得点を入力してください:"); scanf("%lf", &data3); sum = data1 + data2 + data3; average = sum / 3.0; printf("平均は%fです。\n", average); return 0; } |
<実行結果>
1人目の得点を入力してください:14 2人目の得点を入力してください:15 3人目の得点を入力してください:16 平均は15.000000です。 続行するには何かキーを押してください・・・
これもやり方は、色々ありますので、上記のプログラムはあくまでも解答例としてとらえてください。
最初のうちは、自分なりに考えて正しい「結果」を出すことが大事だと思います。
もし、分からなかった場合は「解答例」を見て、よく考えることも大事だと思います。
なるほど、こんなやり方で結果がでるのか!と理解できれば次へつながります。
一番、避けたいのは、ただそのまま写して、「あー動いたね、次、次!」と理解しないまま次へ進むことです。
1つずつステップアップを考えてください、前のことが理解できていなければ後々苦労します・・・
最後は「おまけ」です。
上でやった、おつりを求めるプログラムを改良しましょう。
おつりの「金種」の枚数を求めるプログラムにします。
「金種」とは「お金の種類」で、500円玉とか100円玉とか10円玉とかです。
今回の条件は、1000円以内の商品を買って1000円を支払ったと仮定します。
支払った後のおつりに「何円玉が何枚あるか」を計算します。
※コンビニやスーパー、ファストフード店では、自動的におつりがでてくるものがありますよね
ただし、今の段階で作るのは非常に難しいので、ある程度書いておきます。
ヒントは「整数の割り算は、小数点以下切捨て」と」「割った余り」です。
<sample program 006-07>
#include <stdio.h> int main(void) { int pay; /* 支払金額 */ int buy; /* 購入金額 */ int change500; /* おつり 500円玉 */ int change100; /* 100円玉 */ int change50; /* 50円玉 */ int change10; /* 10円玉 */ int change5; /* 5円玉 */ int change1; /* 1円玉 */ int change; /* おつり計算用 */ pay = 1000; printf("購入金額を入力してください:"); scanf("%d", &buy); change = pay - buy; /* ここにプログラムを追加します */ printf("500円玉 %d枚\n", change500); printf("100円玉 %d枚\n", change100); printf("50円玉 %d枚\n", change50); printf("10円玉 %d枚\n", change10); printf("5円玉 %d枚\n", change5); printf("1円玉 %d枚\n", change1); return 0; } |
<実行結果>
購入金額を入力してください:684 500円玉 0枚 100円玉 3枚 50円玉 0枚 10円玉 1枚 5円玉 1枚 1円玉 1枚 続行するには何かキーを押してください・・・
解答例です。
#include <stdio.h> int main(void) { int pay; /* 支払金額 */ int buy; /* 購入金額 */ int change500; /* おつり 500円玉 */ int change100; /* 100円玉 */ int change50; /* 50円玉 */ int change10; /* 10円玉 */ int change5; /* 5円玉 */ int change1; /* 1円玉 */ int change; /* おつり計算用 */ pay = 1000; printf("購入金額を入力してください:"); scanf("%d", &buy); change = pay - buy; change500 = change / 500; change = change % 500; change100 = change / 100; change = change % 100; change50 = change / 50; change = change % 50; change10 = change / 10; change = change % 10; change5 = change / 5; change1 = change % 5; printf("500円玉 %d枚\n", change500); printf("100円玉 %d枚\n", change100); printf("50円玉 %d枚\n", change50); printf("10円玉 %d枚\n", change10); printf("5円玉 %d枚\n", change5); printf("1円玉 %d枚\n", change1); return 0; } |
<実行結果>
購入金額を入力してください:684 500円玉 0枚 100円玉 3枚 50円玉 0枚 10円玉 1枚 5円玉 1枚 1円玉 1枚 続行するには何かキーを押してください・・・
完成しなかった方も、仕組みは理解しておいてください。
色々と問題を出しましたので、こちらを見ておいてください。
次はいよいよ「基本制御文」に入ります。