前回提示した実力確認テスト01の解答例です。キモの部分の説明もあります。

- 問1.解答
// =============================================================== // C言語問題 No.1 スコア表示 // =============================================================== #include <stdio.h> void main() { // 変数宣言 int nScore; // 得点 // 得点の入力 printf("得点を入力してください。\n"); scanf_s("%d", &nScore); // 得点の表示 printf("SCORE: %06d\n", nScore); }
// はコメントです。/*文字列*/ だと文字列の部分が無視されますが、// の場合はその後方の文字列が改行まで無視されます。
この問題で重要なのは、scanf_s で入力を指定する変数に&を付ける事と、スコア表示に %06d を指定する事です。&はその変数の場所を意味していますので、入力された数値をその場所に格納するという意味になります。%06d はゼロ埋め表示指定の書式文字列です。6桁指定ですので、不足桁数部分は 0 が表示されます。
この問題で重要なのは、scanf_s で入力を指定する変数に&を付ける事と、スコア表示に %06d を指定する事です。&はその変数の場所を意味していますので、入力された数値をその場所に格納するという意味になります。%06d はゼロ埋め表示指定の書式文字列です。6桁指定ですので、不足桁数部分は 0 が表示されます。
- 問2.解答
// =============================================================== // C言語問題 No.2 標準体重 // =============================================================== #include <stdio.h> void main() { // 変数宣言 float fHeight; // 体重 float fBestWeight; // 標準体重 // 体重の入力 printf("身長を入力してください(単位はcm)。\n"); scanf_s("%f", &fHeight); // 標準体重の計算と結果表示 fBestWeight = (fHeight - 100) * 0.9f; printf("あなたの標準体重は %5.2f Kg です。\n", fBestWeight); }
この問題は実数の入力の理解と標準体重を求める計算式の記述、そしてその結果を指定された書式で表示できるかという確認となります。実数の入力は %f を使います。計算式は問題ほぼそのままですが、0.9 の後ろに f が付いていればベストです。無くても、コンパイルは通ってしまいますし、実行も問題ないのですが、float 型の定数だとはっきりさせるクセは付けた方が良いと考えます。
小数点以下2桁までの表示の書式文字列ですが、大事なのは .2f の部分です。%5.2f が %6.2f でも正解となります(スペースの数の違いは出ますが)。この辺りは正解は一つじゃないですし、今後はどんどん解答はあくまでもひとつの例となっていきます。
- 問3.解答
// =============================================================== // C言語問題 No.3 主要3教科の平均点 // =============================================================== #include <stdio.h> void main() { // 変数宣言 int nNLang; // 国語の得点 int nScience; // 理科の得点 int nSocial; // 社会の得点 float fAverage; // 平均点 // 得点の入力 printf("国語と理科と社会の得点を入力してください。\n"); printf("国語: "); scanf_s("%d", &nNLang); printf("理科: "); scanf_s("%d", &nScience); printf("社会: "); scanf_s("%d", &nSocial); // 平均点の計算と結果表示 fAverage = (nNLang + nScience + nSocial) / 3.0f; printf("平均点は %6.2f 点です。\n", fAverage); }
この問題は複数の数値入力と、平均点を求めるための計算式の記述です。プログラム的には2行になっていますが、実際には質問表示と入力は同一行になる事を理解して欲しかった部分です。平均点ですが、最後に 3.0f で割らず 3 で割ると違う答えになってしまいます。3.0f という実定数で割るという処理が思いつけば、型変換は最低限は理解していると言えるかと思います。
※ 野菜がびっくりするほど冷蔵庫で長持ちします。不思議なんですけどね…- 問4.解答
// =============================================================== // C言語問題 No.4 四則演算の結果表示 // =============================================================== #include <stdio.h> void main() { // 変数宣言 int num1, num2; // 数値の入力 printf("二つの数値を入力してください。\n"); scanf_s("%d %d", &num1, &num2); // 計算結果の表示 printf("%d\t+\t%d\t=\t%d\n", num1, num2, num1 + num2); printf("%d\t-\t%d\t=\t%d\n", num1, num2, num1 - num2); printf("%d\t×\t%d\t=\t%d\n", num1, num2, num1 * num2); printf("%d\t÷\t%d\t=\t%d\n", num1, num2, num1 / num2); printf("%d\t余り\t%d\t=\t%d\n", num1, num2, num1 % num2); }
数値入力で私は scanf_s ひとつにまとめてしまいましたが、実は…
// 数値の入力 printf("二つの数値を入力してください。\n"); scanf_s("%d", &num1); scanf_s("%d", &num2);
このように2行に分けても全く同じ動作をします。これは C言語の入力では半角スペースは区切りコードと見なされるためです。また説明が前後してしまいますが、変数宣言でも今回は , で1行に二つの変数宣言を同時に行っています。こんな書き方も出来るという意味ですね。当然、2行に分けて宣言しても正解です。
そして、printf の書式文字列がとてもごちゃごちゃしてきました。¥tをあちこちに入れたためですが、こういう視認性の悪さは書式文字列の欠点かもしれません。あと、printf 内に直接計算式を記述していますが、これを下記のように別途変数を用意しても構いません。
#include <stdio.h> void main() { // 変数宣言 int num1, num2; int ansPlus, ansMinus, ansMulti, ansDiv, ansMod; // 数値の入力 printf("二つの数値を入力してください。\n"); scanf_s("%d %d", &num1, &num2); // 計算する ansPlus = num1 + num2; ansMinus = num1 - num2; ansMulti = num1 * num2; ansDiv = num1 / num2; ansMod = num1 % num2; // 計算結果の表示 printf("%d\t+\t%d\t=\t%d\n", num1, num2, ansPlus); printf("%d\t-\t%d\t=\t%d\n", num1, num2, ansMinus); printf("%d\t×\t%d\t=\t%d\n", num1, num2, ansMulti); printf("%d\t÷\t%d\t=\t%d\n", num1, num2, ansDiv); printf("%d\t余り\t%d\t=\t%d\n", num1, num2, ansMod); }
計算式が長い場合はこのように計算を事前に行う書き方の方が良いと思いますが、今回のように計算が短い場合は、表示する処理に計算しても良いと思っています。もちろん、その計算結果を後で何かに使う必要があるのなら、計算結果を変数に入れるべきだと考えます。
ついでと言ってはナンですが、このプログラムを実行して数値入力時に 500 0 と入力してみましょう。すると下記のようなエラーが表示されてプログラムが停止します。

これがゼロ除算エラーです。デバッグ実行しているのでソースコード側にエラー表示が出ていますが、成果物の状態でこのエラーが発生すると、いわゆるフリーズ状態になります。これを防止するには、もう少しこれからのプログラミングを学ぶ必要がありますね。
- 問5.解答
// =============================================================== // C言語問題 No.5 円周と面積の計算 // =============================================================== #include <stdio.h> void main() { // 変数宣言 float fRadius; // 半径 float fPI = 3.1415926f; // 円周率 // 数値入力 printf("円の半径を入力してください。\n"); scanf("%f", &fRadius); // 計算結果の表示 printf("円周の長さは%.2fです\n", 2 * fPI * fRadius); printf("円の面積は%.2fです\n", fPI * fRadius * fRadius); }
この問題では変数宣言を事前に明記しているため、問4 より実は簡単だったかもしれません。その代わり、その他の変数の使用を制限していますので、printf 内に直接計算式を書き込む事を求めています。
計算式で二乗をどう書くか、という部分が一番の問題だったんですが、これはこの問題を作った時の対象が小学校4年生だったためですね。二乗の説明を当時口頭で説明した記憶があります。
あと、ひっかけ的な部分がありまして、それが結果の表示に余分なスペースがないという点です。このような表示とする場合は、書式文字列で全体の表示長さを省略する必要があります。例えば %6.2f と記述してしまうと、円周の長さが 9.5 とかのように極端に短い数値の時にスペースが付いてしまいます。全体の長さを省略して %.2f と書けるかどうかが小さな引っ掛け部分でした。%6.2f と書いてしまった場合は、100点…に出来ない…かも、…かどうかはご自身で判断してください😁
>> C言語 実力確認テスト01 基本入出力に戻る
>> C言語008 エスケープシーケンスに進む
※ 折り畳み傘って濡れた状態だと鞄に入れられなくて結局持ち歩くんですよね。このケースがあれば、濡らさずに鞄に入れられます。
>> C言語 実力確認テスト01 基本入出力に戻る
>> C言語008 エスケープシーケンスに進む
YINZHOU


コメント