早朝の時給:1200円、昼間の時給:900円、深夜の時給:1500円のときに、それぞれx時間、y時間、z時間働いた場合の平均時給を求めるプログラムを作成してください。
/* a4-1-1.c */ #include <stdio.h> #define ASA 1200 /* 早朝 */ #define HIRU 900 /* 昼間 */ #define YORU 1500 /* 深夜 */ int main(void) { int x, y, z; printf("早朝は何時間働きましたか。> "); scanf("%d", &x); printf("昼間は何時間働きましたか。> "); scanf("%d", &y); printf("深夜は何時間働きましたか。> "); scanf("%d", &z); /* 平均時給を表示する */ printf("平均時給は%d円です。\n", (x * ASA + y * HIRU + z * YORU) / (x + y + z)); return 0; }
x + y + z を()で囲むのを忘れないようにしてください。
コメントを参考に空欄部を埋めてプログラムを完成してください。このプログラムは、商品a、b、cの合計金額と送料込みの金額、税込み金額を求めます。
/* a4-2-1.c */ #include <stdio.h> int main(void) { int a = 600, b = 800, c = 700; int kekka; /* 合計金額を求める */ kekka = a + b + c; printf("合計金額 = %d円\n", kekka); /* 500円の送料込みの金額を求める */ kekka += 500; printf("送料込み金額 = %d円\n", kekka); /* 5%の税込み金額を求める */ kekka *= 1.05; printf("税込み金額 = %d円\n", kekka); return 0; }
それぞれの金額を格納する変数を用意した場合には複合代入演算子を使う必要はありませんが、ここでは練習用に複合代入演算子を使いました。
買い物のお釣りの札と硬貨の枚数を求めるプログラムを作成してください。
/* a4-2-2.c */ #include <stdio.h> int main(void) { int kingaku; int kaimono; int turi, maisu; printf("何円の買い物をしましたか。> "); scanf("%d", &kaimono); printf("何円出しましたか。> "); scanf("%d", &kingaku); printf("\n【お釣りの枚数】\n"); /* 五千円札の枚数を求める */ turi = kingaku - kaimono; maisu = turi / 5000; printf("五千円札の枚数 = %d\n", maisu); /* 千円札の枚数を求める */ turi %= 5000; maisu = turi / 1000; printf("千円札の枚数 = %d\n", maisu); /* 五百円玉の枚数を求める */ turi %= 1000; maisu = turi / 500; printf("五百円玉の枚数 = %d\n", maisu); /* 百円玉の枚数を求める */ turi %= 500; maisu = turi / 100; printf("百円玉の枚数 = %d\n", maisu); /* 五十円玉の枚数を求める */ turi %= 100; maisu = turi / 50; printf("五十円玉の枚数 = %d\n", maisu); /* 十円玉の枚数を求める */ turi %= 50; maisu = turi / 10; printf("十円玉の枚数 = %d\n", maisu); /* 五円玉の枚数を求める */ turi %= 10; maisu = turi / 5; printf("五円玉の枚数 = %d\n", maisu); /* 一円玉の枚数を求める */ maisu = turi % 5; printf("一円玉の枚数 = %d\n", maisu); return 0; }
468円の買い物をして10000円札を出した場合で考えてみましょう。
それぞれの変数はint型なので小数点以下は切り捨てられます。ですから、釣り銭を5000で割ると釣りの5000円札の枚数を求めることができます。
maisu = turi / 5000;
1枚 ← 9532 / 5000
次に、9532円の中から5000円札を釣りとして用意したので、9532円を5000で割った余りが残りの釣りになります。
turi %= 5000;
4532 ← 9532 % 5000
釣り4532円を1000で割ると、釣りの1000円札の枚数が求められます。
maisu = turi / 1000;
4枚 ← 4532 / 1000
この手順で5円玉の枚数まで求めることができます。最後に残った数が1円玉の枚数になります。
次のプログラムの実行結果を考えてください。
/* a4-3-1.c */ #include <stdio.h> int main(void) { int a, b, c; a = 3; ++a; b = ++a; printf("前置演算 : a = %d b = %d\n", a, b); a = 3; a++; c = a++; printf("後置演算 : a = %d c = %d\n", a, c); return 0; }
【実行結果】 前置演算 : a = 5 b = 5 後置演算 : a = 5 c = 4
a = 3;
++a; aは+1され4になります。
b = ++a; 先にaが+1されてからbに代入されます。
a = 3;
a++; aは+1され4になります。
c = a++; 先にaがbに代入されます。代入の後にaは+1されます。
次のプログラムの実行結果を考えてください。
/* a4-3-2.c */ #include <stdio.h> int main(void) { int array[5] = {1, 2, 3, 4, 5}; int i; i = 0; printf("前置演算 array[i] = %d\n", array[++i]); i = 0; printf("後置演算 array[i] = %d\n", array[i++]); return 0; }
【実行結果】 前置演算 array[i] = 2 後置演算 array[i] = 1
array[++i] 先にiをインクリメントしてから配列要素を参照します。
array[i++] 配列要素を参照してからiをインクリメントします。
真(1)と偽(0)の&&演算、||演算、!演算を調べるプログラムを作成してください。
/* a4-4-1.c */ #include <stdio.h> int main(void) { int false = 0, true = 1; printf("%d && %d の演算結果は %d です。\n", false, false, false && false); printf("%d && %d の演算結果は %d です。\n", false, true, false && true); printf("%d && %d の演算結果は %d です。\n", true, false, true && false); printf("%d && %d の演算結果は %d です。\n", true, true, true && true); printf("%d || %d の演算結果は %d です。\n", false, false, false || false); printf("%d || %d の演算結果は %d です。\n", false, true, false || true); printf("%d || %d の演算結果は %d です。\n", true, false, true || false); printf("%d || %d の演算結果は %d です。\n", true, true, true || true); printf("!%d の演算結果は %d です。\n", false, !false); printf("!%d の演算結果は %d です。\n", true, !true); return 0; }
次のプログラムの実行結果を考えてください。
/* a4-6-1.c */ #include <stdio.h> int main(void) { int a; double x; printf("10 / 3 = %d\n", 10 / 3); printf("10 / 3.0 = %f\n", 10 / 3.0); a = 10 / 3; printf("10 / 3 a = %d\n", a); a = 10 / 3.0; printf("10 / 3.0 a = %d\n", a); x = 10 / 3; printf("10 / 3 x = %f\n", x); x = 10 / 3.0; printf("10 / 3.0 x = %f\n", x); return 0; }
【実行結果】 10 / 3 = 3 10 / 3.0 = 3.333333 10 / 3 a = 3 10 / 3.0 a = 3 10 / 3 x = 3.000000 10 / 3.0 x = 3.333333
x = 10 / 3; は、右辺演算時に3となるため、double型のxに代入しても小数点以下は切り捨てられたままになります。
ローレル指数を求めるプログラムを作成してください。ただし、各変数はint型で宣言してください。
ローレル指数は、 体重(kg)÷身長3(cm)×107 で求めます。
/* a4-6-2.c */ #include <stdio.h> int main(void) { int height; int weight; int rohrer; printf("身長を入力してください。> "); scanf("%d", &height); printf("体重を入力してください。> "); scanf("%d", &weight); rohrer = (double)weight / (height * height * height) * 10000000; printf("ローレル指数 = %d\n", rohrer); return 0; }
ローレル指数の算出方法をそのまま式にすると、
rohrer = weight / (height * height * height) * 10000000;
になります。このとき、各変数はint型なので、「weight / (height * height * height)」を計算した時点で結果が0未満になってしまい、小数点以下が切り捨てられて0になります。ですから、浮動小数点型でキャストする必要があります。
計算結果が0未満にならないように、
rohrer = weight * 10000000 / (height * height * height);
としてもよいでしょう。
連立方程式
ax + by = c
dx + ey = f
の解x、yを求めるプログラムを作成してください。ただし、a〜fの変数は整数であり、連立方程式の解が一意に存在するように与えるものとします。
/* a4-6-3.c */ #include <stdio.h> int main(void) { int a, b, c, d, e, f; double x, y; printf("a > "); scanf("%d", &a); printf("b > "); scanf("%d", &b); printf("c > "); scanf("%d", &c); printf("d > "); scanf("%d", &d); printf("e > "); scanf("%d", &e); printf("f > "); scanf("%d", &f); x = (double)(c*e - b*f) / (a*e - b*d); y = (-a*x + c) / b; printf("x = %f\n", x); printf("y = %f\n", y); return 0; }
(c*e - b*f) / (a*e - b*d) は int型 / int型 なので小数点以下の数値を扱えません。doubleでキャストをする必要があります。
(-a*x + c) / b は x がdouble型なので暗黙の型変換が働くためキャストの必要はありません。
Copyright© 2006,2012 Tomoko Sugawara. All Rights Reserved.