『キックオフC言語 2023年度用』のサポートページです。
配布物†
製本した印刷物は、授業の初回で配布します。
PDF は以下で公開します。
- 閲覧用
- 1章まで(目次など)を PDF の末尾に移動したので、書籍のページ番号と PDF のページ番号が一致します。
- ページ番号が、版面の上と下の2ヶ所にあるので、ページ全体が表示されてなくても確認が容易です。
- リンク部分の文字の色が「赤」です。
- 印刷用
- 用紙の端に、章ごとの帯のような印(ツメ)があります。
- リンク部分の文字の色が「黒」です。
- B5用紙の中にA5の領域の版面があります。
- 裁断できるのなら「B5用紙に原寸」で印刷してA5に裁断するか、「A4用紙に123%拡大」で印刷してB5に裁断します。(ツメが用紙の端まで印刷されます。)
- 通常は「A5用紙に原寸」「B5用紙に123%拡大」のどちらかで印刷します。(ツメが用紙の端までは印刷できないでしょう。)
- ソースコード閲覧
正誤表†
- p. 31 末尾
- マクロ定数についての補足です。「#define 文はインデントせずに、プログラムの冒頭部分(#include のすぐ下)に記述するのが習慣です。」例えば p.135 のソースコード8.8などの使い方を参考にしてください。
- p. 34 問題4.
- このスワップ動作は、3変数間で同時に行うことを意図しています。順次入れ替えるわけではありません。
- p. 34 問題8.
- マクロ YEAR_PER_CENTURY は2回使用することに気をつけてください。
- p.52
- 問題9.を7章に移動して、今回の提出対象から除外します。そして、問題6.と、問題4.の考察をオプションにします。
- p.52 問題9.
- 「x の逆正弦を弧度法で返す。」→「x の逆正弦を度数法(度)で返す。」弧度法はラジアンで表すことなので、オリジナルの asin(x) の動作と同じになります。
- p.71 問題3.
- 「1個のelse-if」は「1個のifと1個のelse」と数えます。
- p.71 問題5.
- 動作確認のmain()と補助関数を例示しておきます。
void print_exist_triangle(int a, int b, int c) {
printf("3辺の長さが %d, %d, %d の三角形は", a, b, c);
if (exist_triangle(a, b, c)) {
printf("存在する\n");
} else {
printf("存在しない\n");
}
}
int main(void) {
print_exist_triangle(1, 1, 1); // する
print_exist_triangle(3, 4, 5); // する
print_exist_triangle(1, 1, 10); // しない
print_exist_triangle(10, 5, 5); // しない
print_exist_triangle(1, 15, 5); // しない
}
- p.104 問題4.
- whileループは、結果として消滅しても構いません。(案3) は、forループだけにすることを提案しています。
- p.104 問題7.
- 数値の表示形式は、桁数を増やす工夫をしてください。数列Akの0への収束が早いため、数値の変化を確かめるのに、表示桁数を増やす必要があります。
- p.119 問題0.
- 以下を追加します。『 問題0.[仮引数のスコープ(3.4節の復習)] p.45 の ソースコード3.7 の5行目のtriangle_side()関数について、仮引数を「(double a, double b, double c)」から「(double x, double y, double z)」に変更すると、そのままではコンパイルエラーになる。エラーを解消するための最小限の修正を行え。実行結果は修正前と同じになるようにせよ。4行目のコメント中の「a,b,c」は「x,y,z」に修正し、これ以外に不必要な(実行結果に影響しない)修正は行ってはならない。』
- p.142 問題8.
- オプションの問題を追加しておきます。『問題8. [配列要素の全ペア] 東海道新幹線のぞみ号の停車する6つの駅の、東京駅からの距離(km)は、それぞれ
東京 品川 新横浜 名古屋 京都 新大阪
0.0 6.8 28.8 366.0 513.6 552.6
である。この距離を1次元配列に格納し、以下の表のように、各駅の間の距離を計算で求めて表示するプログラムを作れ。
・実行結果の、()内の駅名はヒントであるので、数値部分だけを表示すればよい。
・数値は "%8.1f" で表示すると、桁が揃いやすい。
・絶対値を返す数学関数 fabs(x) を用いてよい。
実行結果
( 東京)( 品川)(新横浜)(名古屋)( 京都)(新大阪)
( 東京) 0.0 6.8 28.8 366.0 513.6 552.6
( 品川) 6.8 0.0 22.0 359.2 506.8 545.8
(新横浜) 28.8 22.0 0.0 337.2 484.8 523.8
(名古屋) 366.0 359.2 337.2 0.0 147.6 186.6
( 京都) 513.6 506.8 484.8 147.6 0.0 39.0
(新大阪) 552.6 545.8 523.8 186.6 39.0 0.0
』
- p.162 問題3.
- 『2.5.1項』→『2.5.2項』
toupper()の参照先が間違っていました。p.25です。また toupper() 関数は、変換の必要のない文字はそのまま返すので、事前に小文字であるかどうかの検査は不要です。
- p.162 問題4.
- 関数のプロトタイプと、main()関数を例示しておきます。また、参考にしたURLがコメント中に記載されていれば、採点の際に考慮します。
void print_cancel_or_not(char weather[]) {
/* ここを作る */
}
int main(void) {
print_cancel_or_not("暴風雪警報");
print_cancel_or_not("大雪警報");
print_cancel_or_not("特別警報(大雪)");
}
- p.162 問題5.
- ヒントとして、p.131の8.4.3節を参照してください。
- p.162 問題6.
- ヒントを追加します。charからintへの変換の式は「c - '0'」です。関数に独立させると、次の通りです。
int char2int(char c) { return c - '0'; }
これを使うと、次のように、「1文字」から「整数」に変換されます。
char2int('0') → 0
char2int('1') → 1
...
char2int('9') → 9
10章†
- p.178 問題5.
- 『(ii. 信頼性) プログラムを正確に作れる』→『(ii. 信頼性) 動作検証が容易である』
(補足)レポートには「(i)関数呼び出しが有利。なぜなら... (ii)コピーして符号反転が有利。なぜなら... (iii)関数呼び出しが有利。なぜなら...」のように、3項目について、「関数呼び出し」と「コピーして符号反転」の2つの手法のどちらが有利かを述べること。
- p.178 問題6.
- 『逆数にする関数 frac_inv(*r) を追加せよ。』→『逆数を求める関数 frac_inv(*r, *x) を追加せよ。』引数を *r と *x の2個にして、*r = 1 / *x のように代入してください。
(補足)動作検証に用いる数値には、frac_t y = { -1, 4 }; のように、除数の分子をマイナスにした例を含めてください。
- p.178 問題7.
- 動作検証用のmain()を例示しておきます。
int main(void) {
quad_t q;
sol_t s = { 2.0, 3.0 };
quad_unsolve(&q, &s);
printf("a=%f, b=%f, c=%f\n", q.a, q.b, q.c); // 1.0, -5.0, 6.0
sol_solve(&s, &q);
printf("alpha=%f, beta=%f\n", s.alpha, s.beta); // 2.0 と 3.0
q.a = -2 * q.a;
q.b = -2 * q.b;
q.c = -2 * q.c;
sol_solve(&s, &q);
printf("alpha=%f, beta=%f\n", s.alpha, s.beta); // 2.0 と 3.0 のまま(入れ替わってもよい)
}
- p.178 問題8.
- 追加です。『[標準ライブラリの構造体を用いる] ⇒12.1.1項』とすべきところでしたが、参照先(P.203)の指示をさらに単純化します。『10章 現在時刻を取得する以下の関数を作り、main()関数では、この関数を呼び出して、現在の時分秒を表示しなさい。
#include <time.h>
struct tm *get_current_time(void) {
time_t t = time(NULL);
return localtime(&t);
}
struct tm の仕様は付録A.11(p.223)を参照し、ソースコード12.1(p.205)も参考にせよ。』