特別付録
特1
「練習してみよう」解答例
特1
1章
整数による簡単な計算
#include <stdio.h> int main(void) { printf("平年の場合、一年の日数は%d日です。\n", 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31); return 0; } 解答例 例題010
1年の日数
#include <stdio.h> int main(void) { printf("合計金額%d円\n", 750 + 800 + 1200 + 1000 + 4 * 200); return 0; } 解答例 例題011
家族でファミリーレストラン
#include <stdio.h> int main(void) { printf("収入の合計%d円\n", 15400 + 22600 + 10360 + 36080 + 20400 + 19900); return 0; } 解答例 例題012
アルバイトの給料計算
#include <stdio.h> int main(void) { printf("6人に配ると、1人あたり%d個もらえて%d個余る。 \n", 128 / 6, 128 % 6); printf("14人に配ると、1人あたり%d個もらえて%d個余る。\n", 128 / 14, 128 % 14); return 0; } 解答例 例題013
お餅を分ける
392ページ「3 プログラムコードの記述と保存」の
1の手順のようにプログラムコー
ドを入力できる状態にするには、先に以下の手順を行ってください。
「付録A」補足
「新しいファイル」ダイアログで「カ テゴリ:」に[Visual C++]、「テン プレート:」に[ C++ ファイル (.cpp)]を選んでダブルクリックする か、[開く(O)]ボタンをクリックしま す。するとコードが記述できる状態に なります。2
「Visual C++ 2008 Express Edition」を起動して[ファイル]-[新 規作成]-[ファイル...]を選択しま す。1
3章
変数の利用
2章
整数と実数
#include <stdio.h> int main(void) { printf("2GHzの時、電圧が1回振動する間に光が進む距離は%.2fcmです。\n", (299792.457 * 1000 * 100) / (2.0 * 1000.0 * 1000.0 * 1000.0)); printf("3GHzの時、電圧が1回振動する間に光が進む距離は%.2fcmです。\n", (299792.457 * 1000 * 100) / (3.0 * 1000.0 * 1000.0 * 1000.0)); return 0; } 解答例 例題022
微少時間に光が進む距離
#include <stdio.h> #define PRICE 200.0 /* 1枚の単価 */ int main(void) { double combination; /* 組み合わせ */ combination = (43.0 * 42.0 * 41.0 * 40.0 * 39.0 * 38.0) / (6.0 * 5.0 * 4.0 * 3.0 * 2.0 * 1.0); printf("全部の組み合わせは%.0f通りです。\n", combination);printf("半分の組み合わせを購入するには%.0f円かかります。\n", PRICE * combination / 2.0);
printf("全部の組み合わせを購入するには%.0f円かかります。\n", PRICE * combination);
return 0; } 解答例 例題
027
ロト6のプログラムを分かりやすくする
#include <stdio.h> #include <math.h> int main(void) { printf("7Wの場合、1ヶ月の電気代は%.1f円です。\n", 7.0 * 24.0 * 30.0 * (22.0 / 1000.0)); printf("40Wの場合、1ヶ月の電気代は%.1f円です。\n", 40.0 * 24.0 * 30.0 * (22.0 / 1000.0)); printf("300Wの場合、1ヶ月の電気代は%.1f円です。\n", 300.0 * 24.0 * 30.0 * (22.0 / 1000.0)); return 0; } 解答例 例題020
ひと月の電気代
#include <stdio.h> int main(void) { printf("光は1秒間に地球を%lf周する速さです。\n", 299792.457 / (6378.137 * 2 * 3.14159265358979)); return 0; } 解答例 例題021
光の速さで地球の周りを回ったら、1秒間に何周できる?
#include <stdio.h> int main(void) { int subtotal; /* 小計 */ int total; /* 合計 */ printf("回転寿司の会計金額を計算します。\n"); subtotal = total = 120 * 8;printf("120円皿は8枚で%d円で、ここまでの合計は%d円です。\n", subtotal, total);
subtotal = 180 * 4;
total += subtotal;
printf("180円皿は4枚で%d円で、ここまでの合計は%d円です。\n", subtotal, total);
subtotal = 240 * 5;
total += subtotal;
printf("240円皿は5枚で%d円で、ここまでの合計は%d円です。\n", subtotal, total);
subtotal = 360 * 3;
total += subtotal;
printf("360円皿は3枚で%d円で、ここまでの合計は%d円です。\n", subtotal, total);
subtotal = 480 * 1;
total += subtotal;
printf("480円皿は1枚で%d円で、ここまでの合計は%d円です。\n", subtotal, total);
subtotal = 600 * 2;
解答例
4章
数学関数の利用
#include <stdio.h> #define RADIUS (5.0 * 100) /* 池の半径 (cm) */ #define HEIGHT 30.0 /* 水面の高さ (cm) */ #define SPEED 200.0 /* 入れる水の速さ (平方cm毎秒) */ #define PI 3.1415926535897932 /* 円周率 */ int main(void) { double V, r, h; /* 池の体積、半径、高さ */ double hour; /* かかる時間 */ r = RADIUS; h = HEIGHT; V = PI * r * r * h; /* 貯まる水の体積(平方cm) */hour = V / SPEED / (60.0 * 60.0); /* 毎秒SPEEDリットル入れた場合にかかる時間 */
printf("噴水に貯まる水の量は%.1flで、貯まるまでにかかる時間は%.2f時間です。\n", V / 1000.0, hour); return 0; } 解答例 例題
029
池の水量
#include <stdio.h> #include <math.h> #define EARTH 6378.137 /* 地球の半径 (km) */ int main(void) { double distance; /* 距離 */ double height; /* 高さ */ height = 2.0 / 1000.0;distance = sqrt(pow((EARTH + height), 2.0) - pow(EARTH, 2.0));
printf("海辺から見える水平線の距離は%.2fkmです。\n", distance);
height = 5.0 / 1000.0;
distance = sqrt(pow((EARTH + height), 2.0) - pow(EARTH, 2.0));
printf("桟橋の上から見える水平線の距離は%.2fkmです。\n", distance);
height = 3776.0 / 1000.0;
distance = sqrt(pow((EARTH + height), 2.0) - pow(EARTH, 2.0));
printf("%.2fkm離れると富士山は見えません。\n", distance); return 0; } 解答例 例題
034
水平線までの距離
total += subtotal;printf("600円皿は2枚で%d円で、ここまでの合計は%d円です。\n", subtotal, total);
printf("すべてのお皿の料金の合計は%d円です。\n", total); return 0; } 解答例 #include <stdio.h> #include <math.h> int main(void) { double a, b, c, x; /* 2次方程式の項と解 */ /* * 黄金比は1の次の方程式の正の解の比 * x * x = x + 1 * x * x - x - 1 = 0 */ a = 1.0; b = -1.0; c = -1.0; /* 解の公式 */ x = (-b + sqrt(b * b - 4 * a * c)) / (2 * a); printf("黄金比は1:%.15fです。\n", x); return 0; } 解答例 例題
035
黄金比
5章
数値の入力
#include <stdio.h> #include <math.h> #define PI 3.1415926535897932 /* 円周率 */ int main(void) {printf("建物の高さは%.1fmです。\n", tan(80.0 / 180.0 * PI) * 50.0 + 1.0);
return 0; } 解答例 例題
037
建物の高さ
#include <stdio.h> int main(void) { int money; /* 商品代金総額 */int shortcake, montblanc, cheesecake, fruitcake; /* ケーキの種類 */
printf("店員さん「いらっしゃいませ。ショートケーキを何個買いますか?」\n"); scanf("%d", &shortcake); printf("店員さん「モンブランを何個買いますか?」\n"); scanf("%d", &montblanc); printf("店員さん「レアチーズケーキを何個買いますか?」\n"); scanf("%d", &cheesecake); printf("店員さん「フルーツケーキを何個買いますか?」\n"); scanf("%d", &fruitcake);
money = 500 * shortcake + 350 * montblanc + 400 * cheesecake +
450 * fruitcake; printf("店員さん「合計で%d円になります。ありがとうございました」\n", money); return 0; } 解答例 例題
043
購入したケーキの合計金額
#include <stdio.h> #include <math.h> #define TSUBO 3.3057 /* 1坪の平米 */ #define TANKA 650000 /* 坪単価 */ int main(void) { double a, b, c, s, S1, S2; /* ヘロンの公式で使う変数 */ double tsubo; /* 面積(坪) */ double square_meter; /* 面積(平米) */ double price; /* 価格 */ /* ヘロンの公式で面積を求める(1つ目の三角形) */ a = 15.22; b = 10.14; c = 7.20; s = (a + b + c) / 2.0; S1 = sqrt(s * (s - a) * (s - b) * (s - c)); // printf("S1=%f\n", S1); /* ヘロンの公式で面積を求める(2つ目の三角形) */ a = 15.22; b = 12.54; c = 14.89; s = (a + b + c) / 2.0; S2 = sqrt(s * (s - a) * (s - b) * (s - c)); // printf("S2=%f\n", S2); /* 土地全体の面積を計算する */ square_meter = S1 + S2; /* 平米を坪に変換 */tsubo = square_meter / TSUBO;
/* 坪単価を計算する */
price = floor(tsubo * TANKA);
/* 結果の表示 */
printf("土地の面積は%f坪で値段は%.0f円です。\n", tsubo, price);
return 0; } 解答例 例題
036
土地の値段の計算
#include <stdio.h> #include <math.h> int main(void) { double distance; /* 距離 */ double speed; /* 速さ */ double time; /* 時間 */ double hours; /* 時間 */ double minutes; /* 分 */ printf("距離(km)と速さ(km/h)を入力してください:");scanf("%lf%lf", &distance, &speed);
time = distance / speed;
hours = floor(time);
minutes = (time - hours) * 60.0;
printf("かかる時間は「%.0f時間%04.1f分」です。\n", hours, minutes);
return 0;
}
解答例
6章
式を考える
#include <stdio.h>
int main(void)
{
int hour0, minute0; /* 入庫時刻 */
int hour1, minute1; /* 出庫時刻 */
int hour, minute; /* 駐車時間 */
int past; /* 駐車時間を分で表した値 */
int charge; /* 金額 */
printf("入庫時刻を時、分で入力してください: ");
scanf("%d%d", &hour0, &minute0);
printf("出庫時刻を時、分で入力してください: ");
scanf("%d%d", &hour1, &minute1);
past = (hour1 * 60 + minute1) - (hour0 * 60 + minute0);
hour = past / 60; minute = past % 60; charge = (past / 20 + 1) * 100; // printf("駐車時間は%d分\n", past);
printf("駐車時間は%d時間%d分で、料金は%d円です。\n", hour, minute, charge);
return 0; } 解答例 例題
045
コインパーキングの料金計算
#include <stdio.h> int main(void) { double price0; /* 原価 */ double price1; /* 定価 */ double price2; /* 販売価格 */ double discount; /* 販売するときの値引率 */ double profit0; /* 定価販売時の利益率 */ double profit1; /* 最終的な利益 */ /* 原価、利益、割引率の入力 */ printf("原価は何円?"); scanf("%lf", &price0); printf("定価を付けるときに見込む利益は何%?"); scanf("%lf", &profit0); printf("割引率は何%?"); scanf("%lf", &discount); /* 定価、販売価格、利益の計算 */price1 = price0 * (1.0 + profit0 / 100.0);
price2 = price1 * (1.0 - discount / 100.0);
profit1 = price2 - price0;
/* 結果の出力 */
printf("原価%.0f、定価%.0f、販売価格%.0f、利益%.0f\n",
price0, price1, price2, profit1);
return 0; } 解答例 例題
050
原価計算
#include <stdio.h> #include <math.h> /* ディスプレイの縦横比 */ #define HEIGHT 9.0 #define WIDTH 16.0 int main(void) { double inch; /* 画面のサイズ */ double diagonal;/* 縦横比計算のための対角線 */ double height; /* 画面の高さ */ double width; /* 画面の横幅 */ /* 画面の大きさの入力 */ printf("画面の大きさ(インチ):"); 解答例 例題051
ディスプレイの大きさ
7章
条件分岐(
if
文)
scanf("%lf", &inch);
/* 対角線の長さと、横、縦の長さを求める */
diagonal = sqrt(HEIGHT * HEIGHT + WIDTH * WIDTH);
width = inch * 2.54 * WIDTH / diagonal;
height = inch * 2.54 * HEIGHT / diagonal;
/* 結果の出力 */
printf("%fインチ画面の大きさは、高さ%fcm、横幅%fcmです。\n", inch, height, width);
return 0; } 解答例 #include <stdio.h> #include <math.h> #define SUN_RADIUS 696000.0 /* 太陽の半径 */ #define SUN_DISTANCE 149597870.0 /* 太陽までの距離 */ #define GOENHOLL_RADIUS (2.5 / 1000.0) /* 五円玉の穴の大きさ */ #define GOENHOLL_DISTANCE (50.0 / 100.0) /* 五円玉の穴への距離 */ #define PI 3.1415926535897932 /* 円周率 */ int main(void) { double sun_radian; /* 太陽の半径 */ double sun_degree; /* 太陽の見かけの角度 */ double goenholl_radian; /* 五円玉の穴の半径 */ double goenholl_degree; /* 五円玉の穴の見かけの角度 */ /* 太陽と五円玉の角度をラジアンで求める */
sun_radian = atan(SUN_RADIUS / SUN_DISTANCE);
goenholl_radian = atan(GOENHOLL_RADIUS / GOENHOLL_DISTANCE);
/* 角度への変換 */
sun_degree = sun_radian * 180.0 / PI;
goenholl_degree = goenholl_radian * 180.0 / PI;
/* 計算結果の出力 */ printf("太陽の大きさ%lf°、五円玉の穴の大きさ%lf°\n", sun_degree * 2.0, goenholl_degree * 2.0); return 0; } 解答例 例題
052
太陽の大きさ
#include <stdio.h> int main(void) { double temperature; /* 気温 */ double preset; /* 設定温度 */ /* 現在の気温とエアコンに設定する温度の入力 */ printf("現在の気温:"); scanf("%lf", &temperature); printf("エアコンに設定する温度:"); scanf("%lf", &preset); /* 運転するモードの出力 */ if (temperature > preset) printf("冷房運転します\n"); else printf("暖房運転します\n"); return 0; } 解答例 例題059
エアコンの冷房・暖房繰り替え
#include <stdio.h> #include <math.h> int main(void) { double temperature; /* 気温 */ double preset; /* 設定温度 */ double difference; /* 差 */ /* 現在の気温とエアコンに設定する温度の設定 */ printf("現在の気温:"); scanf("%lf", &temperature); printf("エアコンに設定する温度:"); scanf("%lf", &preset);difference = fabs(temperature - preset);
/* 運転する風量の出力 */ if (difference <= 0.5) printf("停止\n"); else if (difference <= 1.5) printf("微風\n"); else if (difference <= 2.5) printf("弱\n"); else if (difference <= 3.5) printf("中風\n"); 解答例 例題
060
エアコンの風量調節
/* 今年の誕生日がまだ来ていないときに1を引く */
if (birth_month >= today_month && birth_day > today_day)
old--;
// /* デバッグ用 */
// printf("%d年%d月%d日生まれの人の、%d年%d月%d日現在の",
// birth_year, birth_month, birth_day,
// today_year, today_month, today_day);
printf("年齢は%d歳です\n", old); return 0; } 解答例 #include <stdio.h> int main(void) { int old; /* 年齢 */ /* 年齢の入力 */ printf("年齢を入力してください:"); scanf("%d", &old); /* 入場料金の出力 */ printf("入場料金は"); if (old <= 4) printf("無料");
else if (5 <= old && old <= 7)
printf("300円");
else if (8 <= old && old <= 15)
printf("400円");
else if (16 <= old && old <= 22)
printf("500円");
else if (23 <= old && old <= 59)
printf("600円"); else printf("400円"); printf("です。\n"); return 0; } 解答例 例題
061
天文宇宙科学館の入館料
else if (difference <= 4.5) printf("強風\n"); else printf("ターボ強風\n"); return 0; } 解答例 #include <stdio.h> #include <math.h> int main(void) { double amount; /* 合計 */ double price; /* 金額 */ /* 使用した電気量の入力 */ printf("電気料金を計算します。\n"); printf("使用した電気の量(kWh):"); scanf("%lf", &amount); /* 電気料金の計算 */ price = 800.0; if (amount > 300) { price += (amount - 300.0) * 26.0; amount = 300.0; } if (amount > 100) { price += (amount - 100.0) * 22.0; amount = 100.0; } price += amount * 18.0; /* 電気料金の出力 */ printf("電気料金は%.0f円です。\n", floor(price)); return 0; } 解答例 例題063
電気料金の計算
#include <stdio.h> int main(void) {int today_year, today_month, today_day; /* 今日の日付 */
int birth_year, birth_month, birth_day; /* 生まれた日 */
int old = 0; /* 何才か */
/* 今日の日付と生まれた日付の入力 */
printf("今日の日付を入力してください(年 月 日):");
scanf("%d%d%d", &today_year, &today_month, &today_day);
printf("生まれた日付を入力してください(年 月日):");
scanf("%d%d%d", &birth_year, &birth_month, &birth_day);
/* 年齢の計算 */
old = today_year - birth_year;
解答例
8章
繰り返し処理(
for
文)
#include <stdio.h> int main(void) { int sheep; /* 羊の数 */ int start; /* 数えはじめの数 */ int end; /* 数え終わりの数 */ /* 数える羊の始めの数と終わりの数の入力 */ printf("羊の数を数えます。\n"); printf("数え始め:"); scanf("%d", &start); printf("数え終わり:"); scanf("%d", &end); /* 羊の数を出力 */for (sheep = start; sheep <= end; sheep++)
printf("羊が%d匹 ", sheep); printf("\n"); return 0; } 解答例 例題
070
羊がn匹、羊がn+1匹、羊がn+2匹..
#include <stdio.h> int main(void) { int fact = 1; /* 求める階乗の値 */ int n; /* nの階乗を求める */ int i; /* ループカウンタ */ /* 求める階乗の入力 */ printf("階乗を求めます:"); scanf("%d", &n); /* 階乗の計算 */ for (i = 2; i <= n; i++) fact *= i; /* 結果の出力 */ printf("%d!=%d\n", n, fact); return 0; } 解答例 例題071
階乗の計算
#include <stdio.h> #define START_HOUR 12 /* 開始時刻 (時) */ #define START_MINUTE 30 /* 開始時刻 (分) */ #define BREAK_INTERVAL 90 /* 休憩の間隔 */ #define BREAK_TIME 20 /* 休憩時間 */ #define PRESEN_TIME 12 /* 発表時間 */ #define PRESEN_INTERVAL 1 /* 発表の間隔 */ #define NUMBER 18 /* 発表者の人数 */ int main(void) { int s; /* 開始時刻 (start) */ int e; /* 終了時刻 (end) */ int nx; /* 次の休憩時刻 (next) */ int i; /* ループ変数 */ /* 開始時刻の設定 */ s = START_HOUR * 60 + START_MINUTE; nx = s + BREAK_INTERVAL; /* スケジュール表の出力 */for (i = 1; i <= NUMBER; i++) {
/* 発表時刻の出力 */ e = s + PRESEN_TIME; printf("No.%2d: %2d:%02d ∼ %2d:%02d\n", i, s / 60, s % 60, e / 60, e % 60); s = e + PRESEN_INTERVAL; /* 休憩の処理 */ if (nx <= e) { s -= PRESEN_INTERVAL; e = s + BREAK_TIME; printf("\n休憩: %2d:%02d ∼ %2d:%02d\n\n", s / 60, s % 60, e / 60, e % 60); s = e; nx = s + BREAK_INTERVAL; } } return 0; } 解答例 例題
072
研究発表会のスケジュール
9章
繰り返し処理(
while
文)
#include <stdio.h> #define LIMIT 500.0 /* エレベーターに乗れる最大重量 */ int main(void) { double weight; /* 重さ */ double sum = 0.0; /* 合計 */ int people = 0; /* 人数 */ /* 重量の入力と合計重量の計算、判定 */ while (1) {printf("現在%d人、重量合計%.1lfkgです。%d人目の人の重量は?:", people, sum, people + 1);
scanf("%lf", &weight);
if (sum + weight > LIMIT)
break; sum += weight; people++; } /* 結果の出力 */
printf("乗れるのは%d人目までです。重量の合計は%.1fkgです。\n", people, sum);
return 0; } 解答例 例題
077
エレベーターの定員
#include <stdio.h> int main(void) { int ans; /* 回答 */ /* クイズの問題の出力 */ printf("問題です。次の中で岡山の名産は?\n" "1. りんご 2. もも 3. バナナ\n" "答えは? "); /* 回答の入力 */ while (1) { if (scanf("%d", &ans) != 1) { printf("入力エラーです\n"); return 1; }if (1 <= ans && ans <= 3)
break; printf("1∼3の数字を入力してください。\n" "答えは? "); } /* 判定結果の出力 */ if (ans == 2) printf("おめでとう。正解です!\n"); else printf("残念でした。不正解です。\n"); return 0; } 解答例 例題
078
クイズプログラム
#include <stdio.h> int main(void) { double money = 10000.0; /* お金 */ int month = 0; /* 月 */ /* 積み立て貯金額の計算 */ while (money < 1000000.0) { money = money * 1.001 + 10000.0; month++;printf("%2d月後: %8.0f円\n", month, money);
}
/* 最終結果の出力 */
printf("%d年%dヶ月で100万円達成できました!\n", month / 12 , month % 12);
return 0;
}
解答例
10章
2重ループ
#include <stdio.h> int main(void) { int x, y; /* 描く図形の横軸と縦軸の座標 */ for (y = 1; y <= 10; y++) { for (x = 1; x <= 10; x++) if (x <= 10 - y) printf(" "); else printf("*"); printf("\n"); } return 0; } 解答例 例題084
三角形を描くの発展編
#include <stdio.h> int main(void) { int x, y; /* 描く図形の座標 */ for (y = -5; y <= 5; y++) { for (x = -5; x <= 5; x++)if (y <= x + 5 && y <= -x +5 && y >= -x -5 && y >= x - 5)
printf("*"); else printf(" "); printf("\n"); } return 0; } 解答例 例題
086
ダイヤを描く
#include <stdio.h> int main(void) { int x, y; /* かけ算九九の2つの数字 */ /* タイトルの出力 */ printf(" かけ算九九の表\n"); /* 掛けられる数の出力 */ printf(" "); for (x = 1; x <= 9; x++) printf("%3d", x); printf("\n"); /* 上の線の出力 */ printf(" +--+--+--+--+--+--+--+--+--+\n"); /* 九九の表の本体の出力 */ for (y = 1; y <= 9; y++) { printf("%d|", y); for (x = 1; x <= 9; x++) printf("%2d|", x * y); printf("\n"); } /* 下線の出力 */ printf(" +--+--+--+--+--+--+--+--+--+\n"); return 0; } 解答例 例題084
かけ算九九の表を完成させる
#include <stdio.h> int main(void) { int x, y; /* 描く図形の座標(横軸、縦軸) */ int xn, yn; /* 描く図形の長さ(横、縦) */ /* 横の長さと縦の長さを入力 */ printf("横の長さは:"); scanf("%d", &xn); printf("縦の長さは:"); scanf("%d", &yn); /* 図形の描画 */for (y = 1; y <= yn; y++) {
for (x = 1; x <= xn; x++) printf("*"); printf("\n"); } return 0; } 解答例 例題
083
長方形を描く
11章
複数データの入力処理
#include <stdio.h> int main(void) { double value; /* 入力値 */ double minimum; /* 最小値 */ double maximum; /* 最大値 */ double sum; /* 合計 */ int minimum_hour; /* 最小の時刻 */ int maximum_hour; /* 最大の時刻 */ int n; /* データの個数のカウント */ /* 気温データの入力 */ printf("0時から23時までの気温データを入力してください:\n"); if (scanf("%lf", &value) != 1) { printf("入力エラーが発生しました\n"); return 1; } 解答例 例題092
最高気温、最低気温、平均気温
/* 最低気温、最高気温、平均気温を求める */sum = minimum = maximum = value;
minimum_hour = maximum_hour = 0;
n = 1;
while (scanf("%lf", &value) == 1) {
sum += value; if (value > maximum) { maximum = value; maximum_hour = n; } if (value < minimum) { minimum = value; minimum_hour = n; } n++; } /* 計算結果を出力する */
printf("最低気温は%4.1lf°Cで、時刻は%2d時です。\n", minimum, minimum_hour);
printf("最高気温は%4.1lf°Cで、時刻は%2d時です。\n", maximum, maximum_hour);
printf("平均気温は%4.1lf°Cです。\n", sum / (double) n);
return 0; } 解答例 #include <stdio.h> int main(void) { int money; /* 給与 */ int month = 0; /* 月 */ int sum = 0; /* 合計 */ int average;; /* 変形 */ /* 金額の入力と合計を求める */ while (1) { if (scanf("%d", &money) != 1) break; sum += money; month++; } /* 平均を求める */
average = sum / month;
/* 計算結果を出力する */
printf("今までに%dヶ月間働きました。給料の平均は%d円で、合計は%d円です。\n",
month, average, sum);
return 0; } 解答例 例題
091
アルバイトの給与計算
#include <stdio.h> #include <math.h> int main(void) { double a, b, c, s, S; /* ヘロンの公式で使用する変数 */ double sum = 0.0; /* 合計 */ /* 三角形の辺の長さの入力、面積の計算、面積の合計の計算 */while (scanf("%lf%lf%lf", &a, &b, &c) == 3) {
s = (a + b + c) / 2.0; S = sqrt(s * (s - a) * (s - b) * (s - c)); sum += S; } /* 計算結果の出力 */ printf("面積の合計は%lfです。\n", sum); return 0; } 解答例 例題
093
三角法で面積を求める
12章
配列
#include <stdio.h> //#define DEBUG #define CHANGE 10 /* 貨幣の種類 */ int main(void) { int currency[CHANGE] = {1, 5, 10, 50, 100, 500, 1000, 2000, 5000, 10000}; /* 貨幣の額面データ */ int number[CHANGE]; /* 貨幣の枚数 */ int total_change; /* 引き出す金額の合計 */ int change; /* 引き出すお金計算のためのテンポラリ */ int i; /* ループ変数 */ /* 引き出す金額の入力 */ printf("預金口座から引き出す金額を入力してください:"); scanf("%d", &change); /* 必要な貨幣の種類ごとの枚数を計算 */ total_change = change;for (i = CHANGE - 1; i >= 0; i--) {
number[i] = change / currency[i];
change -= number[i] * currency[i];
}
/* 結果の出力 */
printf("%d円を引き出します。\n", total_change);
for (i = CHANGE - 1; i >= 0; i--)
if (number[i] >= 1)
if (currency[i] >= 1000)
printf("%5d円札:%d枚\n", currency[i], number[i]);
else
printf("%5d円玉:%d枚\n", currency[i], number[i]);
#ifdef DEBUG /* DEBUG文の中で変数を宣言したい場合には、他に影響を与えないようにするため、 DEBUG文を{ }で囲んでブロックにしましょう。 */ { int sum = 0;
for (i = CHANGE - 1; i >= 0; i--)
sum += number[i] * currency[i];
printf("検算:%d円\n", sum); } #endif return 0; } 解答例 例題
097
2000円札対応ATM
#include <stdio.h> #include <math.h> #define N 5 /* 解答者の数 */ int main(void) { double correct; /* 正解 */ double answer[N + 1]; /* 解答者の回答 */ double difference; /* 差 */ double minimum; /* 最小 */ int i; /* ループ変数 */ /* 解答と正解の入力 */ printf("解答者の回答を入力してください\n"); for (i = 1; i <= N; i++) scanf("%lf", &answer[i]); printf("正解を入力してください\n"); scanf("%lf", &correct); /* |正解 - 回答| の最小値を探す */minimum = fabs(correct - answer[1]);
for (i = 1; i <= N; i++) {
difference = fabs(correct - answer[i]);
if (minimum > difference) minimum = difference; } /* |正解 - 回答| の最小値と同じ解答者の出力 */ printf("1番近い解答者は\n"); for (i = 1; i <= N; i++)
if (minimum == fabs(correct - answer[i]))
printf("%d番の解答者の%f\n", i, answer[i]); printf("です。\n"); return 0; } 解答例 例題
098
1番近い正解者
#include <stdio.h> int main(void) { double data[] = {0.0, 6.8, 28.8, 366.0, 513.6, 552.6, 589.5, 732.9, 894.2, 1129.4, 1196.6}; /* 距離データ */ int x, y; /* 縦横の欄 */ for (y = 1; y <= 10; y++) { for (x = 0; x < y; x++)printf("%6.1f ", data[y] - data[x]);
printf("\n"); } return 0; } 解答例 例題
099
駅間距離の表示
13章
関数の作成
#include <stdio.h> #define DATA 6 int main(void) { int userid[DATA] = {10001, 10002, 20001, 20002, 20003, 40004}; /* ユーザーID */ int password[DATA] = { 1122, 9521, 5588, 428, 3618, 777}; /* パスワード */ /* 注: 428、777を0428、0777と書いてはいけない。数字の先頭に0を付けると8進数として 扱われるので注意。scanfの%dで入力する値は0428、0777でも10進数として扱われる。 */ int point[DATA] = { 0, 50000, 100, 300, 20000, 8000}; /* ポイント残高 */ int uid; /* ユーザーIDの入力値 */ int pass; /* パスワードの入力値 */ int i; /* ループカウンタ */ /* ユーザーIDとパスワードの入力 */ printf("ユーザーID:"); scanf("%d", &uid); printf("パスワード:"); scanf("%d", &pass); /* ユーザーIDとパスワードのチェック */for (i = 0; i < DATA; i++)
if (userid[i] == uid) break; if (userid[i] != uid) { printf("ユーザーIDが間違っています。\n"); return 1; } if (password[i] != pass) { printf("パスワードが間違っています。\n"); return 1; } /* ポイント残高の出力 */ printf("認証できました。\n");
printf("ユーザID[%d]のポイント残高は%dです。\n", uid, point[i]);
return 0; } 解答例 例題
100
ユーザIDとパスワードの検査
/********************************************************************* * 入力したデータから棒グラフを描くプログラム version 1.0 * 2009. 7. 1 Yukio Murayama *********************************************************************/ #include <stdio.h> void bar(int n); int main(void) { int n; /* 棒グラフの長さ */ printf("数字を入力してください:");while (scanf("%d", &n) == 1)
bar(n); return 0; } /********************************************************************* * int bar(int n); * * 引数 * int n 表示する*(アスタリスク)の数 * * 戻り値 * 表示したアスタリスクの数 * * 機能 * nで指定された個数の*を標準出力に出力し、改行する。 *********************************************************************/ void bar(int n) { while (n > 0) { printf("*"); n--; } printf("\n"); } 解答例 例題
106
棒を描く関数
/********************************************************************* * 関数を使って三角形の面積を求めるプログラム version 1.0 * 2009. 7. 1 Yukio Murayama *********************************************************************/ #include <stdio.h> #include <math.h>
double heron(double a, double b, double c);
int main(void) { double a, b, c; /* 三角形の3辺の長さ */ a = 15.22; b = 10.14; c = 7.20; printf("三辺の長さが%f、%f、%fの三角形の面積は%fです。\n", a, b, c, heron(a, b, c)); a = 15.22; b = 12.54; c = 14.89; printf("三辺の長さが%f、%f、%fの三角形の面積は%fです。\n", a, b, c, heron(a, b, c)); return 0; } /*********************************************************************
* double heron(double a, double b, double c);
* * 引数 * double a, b, c 三角形の3辺の長さ * * 戻り値 * 三角形の面積 * * 機能 * ヘロンの公式を使って三角形の面積を求める *********************************************************************/
double heron(double a, double b, double c)
{ double s; /* ヘロンの公式の小文字のs */ s = (a + b + c) / 2.0; return sqrt(s * (s - a) * (s - b) * (s - c)); } 解答例 例題
108
三角形の面積を求める関数
/********************************************************************* * 関数を使ってロト6の組合せ、買い占める場合の金額を求めるプログラム * version 1.0 * 2009. 7. 1 Yukio Murayama *********************************************************************/ #include <stdio.h> #define PRICE 200.0double combination(int n, int m);
double factrial(int n); int main(void) { printf("全部の組み合わせは%.0f通りです。\n", combination(43, 6)); printf("半分の組み合わせを購入するには%.0f円かかります。\n", PRICE * combination(43, 6) / 2.0); printf("全部の組み合わせを購入するには%.0f円かかります。\n", PRICE * combination(43, 6)); return 0; } /*********************************************************************
* int combination(int n, int m)
* * 引数 * int n; 総数 * int m; 選ぶ数 * * 戻り値 * 組み合わせの数 * * 機能 * 異なるn個のものから異なるm個を選ぶ組み合わせのを求める。 * 計算には次の式を使う。 * nCm = n! / (m! * (n - m)!) *********************************************************************/
double combination(int n, int m)
{
return factrial(n) / (factrial(m) * factrial(n - m));
} /********************************************************************* * double factrial(int n); * 引数 * int n; 数値 * 戻り値 * double 数値nの階乗 * 機能 * 数値nの階乗を求める *********************************************************************/ double factrial(int n) { double fact = 1.0; /* 階乗の値を格納 */ int i; /* ループカウンタ */ for (i = 2; i <= n; i++) fact *= (double) i; return fact; } 解答例 例題
107
組合せの和を求める関数
特2
1 stdio.h(スタンダード・アイ・オー・ドット・ヘッダ)
1 printf(プリント・エフ)
書式
int printf(const char *format, ...);
意味 書式付き出力。戻り値は出力したバイト数。
format
について 第1引数に指定した文字列を出力する文字列は
"
と
"
で囲
む。文字列の中に
%
ではじまる書式指定を書くことで、その
箇所に第2引数以降に指定した値を挿入することができる。
本書では
%d
と
%f
の2つの書式指定を使用した。
%d
の
%
と
d
の
間、
%
と
f
の間に数字、
-
、
+
、などを書くことにより、細か
い書式指定ができる。表示する桁数には、
+
や
-
の符号や小
数点も数に数える。
書式指定 意味 %d 整数(int型)を10進数(decimal)で出力 %5d 5桁の幅で出力。右詰め。5桁を超えるときには、右側にはみ出す %-5d 5桁の幅で出力。左詰め。5桁を超えるときには、右側にはみ出す %+d 正の数のとき、値の左側に+を出力 %f 実数(double型)の表示。小数点以下を6桁の幅で出力 %10f 小数点、小数点以下6桁を含めて、合計10桁の幅で出力 %.1f 小数点以下1桁まで出力 %.0f 小数点以下0桁まで出力(整数部分のみ出力) %10.3f 整数部分6桁、小数点、小数点以下3桁の合計10桁の幅で出力。右詰め %-10.3f 整数部分6桁、小数点、小数点以下3桁の合計10桁の幅で出力。左詰め 使用例 プログラム 実行結果 printf("(%d,%d,%d)\n", 123, -123, 1234567890); (123,-123,1234567890) printf("(%5d,%5d,%5d)\n", 123, -123, 1234567890); ( 123, -123,1234567890) printf("(%-5d,%-5d,%-5d)\n", 123, -123, 1234567890); (123 ,-123 ,1234567890) printf("(%+d,%+d,%+d)\n", 123, -123, 1234567890); (+123,-123,+1234567890) printf("(%f,%f)\n", 3.1415926, -3.1415926); (3.141593,-3.141593) printf("(%10f,%10f)\n", 3.1415926, -3.1415926); ( 3.141593, -3.141593) printf("(%.1f,%.1f)\n", 3.1415926, -3.1415926); (3.1,-3.1) printf("(%.0f,%.0f)\n", 3.1415926, -3.1415926); (3,-3) printf("(%10.3f,%10.3f)\n", 3.1415926, -3.1415926); ( 3.142, -3.142) printf("(%-10.3f,%-10.3f)\n", 3.1415926, -3.1415926); (3.142 ,-3.142 )%f
の場合、表示される小数点以下の値を四捨五入するか切り捨てるか規定されてい
ないため、処理結果が微妙に異なる場合がある。
2 scanf(スキャン・エフ)
書式
int scanf(const char *format, ...);
意味 書式付き入力
戻り値 入力できた項目数。入力がEOFの場合、-1が返る。
第1引数(
format
)について 第1引数(
const char *format
と書かれている部
分)で、入力する値の「取り込む書式」「個数」「順番」を指定する。
int
型、
double
型変数に値を格納するときには変数名の左側に
&
を付ける必要がある。
書式指定 意味 %d 符号付き10進整数(int型) %f 浮動小数点型実数(double型)
第1引数で記述した書式指定と同じ数の変数を第2引数以降に書く必要がある。
キーボード(標準入力)から2つの値を入力して、順番に
price
、
length
に格納す
る。戻り値は次のようになる。入力する数字のと数字の間は、空白、タブ、改行のいずれ
かで区切る。
入力がEOFの場合 EOF 入力が数字以外の英字や記号の場合 0 priceだけに値が格納できた場合 1 priceとlengthの両方に値が格納できた場合 2
1 ceil(セイル)
書式
double ceil(double x);
意味 小数点以下切り上げ
数学の書式とそれに対応するC言語の書式
→
y = ceil(x)
2 floor(フロアー)
書式
double floor(double x);
意味 小数点以下切り捨て
数学の書式とそれに対応するC言語の書式
→
y = floor(x)
3 fabs(エフ・アブス、エフ・アブソリュート)
書式
double fabs(double x);
意味 絶対値
数学の書式とそれに対応するC言語の書式
→
y = fabs(x)
4 sqrt(スクエア・ルート)
書式
double sqrt(double x);
意味 平方根(ルート)
数学の書式とそれに対応するC言語の書式
→
y = sqrt(x)
5 pow(パワー)
書式
double pow(double x, double y);
意味 べき乗
数学の書式とそれに対応するC言語の書式
→
z = pow(x, y)
6 log(ログ、ナチュラル・ログ)
書式
double log(double x);
意味 自然対数(ナチュラル・ログ)
数学の書式とそれに対応するC言語の書式
→
y = log(x)
2 math.h(マス・ドット・ヘッダ、
マセマティクス・ドット・ヘッダ)
double length; int price;scanf("%d%f", &price, &length)