プログラミング入門 II 2008年後期 プログラミング入門 II 担 当 教 員 : 上村 技術スタッフ: 月川、北本、細島 ティーチング・アシスタント(TA): 鈴木、高階、川和、木島、高野、 根岸、皆川、山下、矢口 100%なら任意 レポート満点 レポート:必須2回、任意2回の合計4回 コースナビ: C言語入門編 達成度60%以上 出席: 2/3以上(試験は含めない) 10回以上 20分以内の遅刻は0.5回 20分以上の遅刻は入室は認めるが、出席は0 単位修得の要件: 10回以上 2/3以上(試験は含めない)の出席 2回 必須レポートの提出 コースナビ(e-learning)のC言語入門編 60%以上 「期末試験 + レポート」の60%以上 注意! レポートのファイルは保存しておくこと 成績評価法: 上記要件を満足した者について 期末試験80点+レポート合計20点=100点満点 のうち 90点以上:秀、80点以上:優、70点以上:良、60点以上:可 講義予定(前半): 回 1 月 日 10月3日 内 容 (予定) レポート 講義の概要・コースナビの説明 第17章 その他の制御文・第18章 マクロ 2 10月10日 第11章 関数について オーバーヘッド、大域変数 3 10月17日 第10章 関数 10.9 関数と配列の演習 第12章 関数と配列 4 10月24日 第1回レポート(必須) (10/24提出) 第13章 文字の取り扱い方 文字、文字列、文字型配列、問題13.3,13.5 5 10月31日 第15章 文字列処理 文字列処理用ライブラリ関数、問題15.1 6 7 11月7日 11月14日 第14章 ファイル操作 第2回レポート(任意) 問題14.1,14.5 (11/14提出) 第16章 構造体 定義、構造体関数 8 11月28日 第16章 構造体 演習、ゲーム作成 講義予定(後半): 回 9 月 日 12月5日 内 容 (予定) レポート コマンドプロンプト操作 ディレクトリ移動、コンパイル、実行 10 12月12日 コマンドプロンプト操作 リダイレクト、パイプ 11 12 12月19日 1月9日 第14章 ファイル操作(コマンドプロンプト版) 第3回レポート(必須) Excelとの連携、CSVファイル (1/9提出) Excelとの連携 リサージュ、対数グラフ 13 14 1月23日 1月30日 Excelとの連携 第4回レポート(任意) 3次元グラフ (1/30提出) Gnuplotとの連携 デモ、各種グラフ 15 2月6日 期末テスト 各自のコースナビ「C言語入門編」の進度を毎週、発表予定。 積極的に自習を進めて下さい。 第17章 その他の制御文 17.1 17.2 17.3 17.4 17.5 do-while文 goto文とラベル break文による繰返し制御 continue文による繰返し制御 return文 17.1 do-while文 #include <stdio.h> /* ex17_1_1.c */ int main(void) { int i; 条件を満たさなく i = 0; ても1回は実行 do { printf("繰返し\n"); i = i + 1; } while (i < 10); return 0; } p.161 例17.1.1 p.22 例5.1.1 #include <stdio.h> /* ex5_1_1.c */ int main(void) { int i; i = 0; while (i < 10) { printf("繰返し\n"); i = i + 1; } 条件を満たす return 0; ときのみ実行 } 17.1 do-while文 p.162 例17.1.2 2) 12 #include <stdio.h> ...0 2) 6 /* 整数の2進表現を下位から表示 */ 2) 3...0 int main(void) 2) 1...1 { 0...1 int n, b; while 文を使って n = 12; n = 0 としたとき 書き直せ do { どうなるか? b = n % 2; printf("%d\n", b); n = 0 としたときにも n /= 2; 同じ結果を得るには } while (n > 0); どうすればよいか? return 0; } 17.2 goto文とラベル #include <stdio.h> /* ex17_2_1.c */ int main(void) { int i; i = 0; loop: if (i >= 10) goto next; printf("繰返し\n"); i = i + 1; goto loop; next: return 0; } p.162 例17.2.1 p.22 例5.1.1 #include <stdio.h> /* ex5_1_1.c */ int main(void) { int i; i = 0; while (i < 10) { printf("繰返し\n"); i = i + 1; } return 0; } 17.2 goto文とラベル p.164 例17.2.2 #include <stdio.h> #define MAX 10 /* ex17_2_2.c */ i2 + j2 = k2 を満たす自然数の組を探す int main(void) { int i, j, k; for (k = 1; k < MAX; k++) { for (i = 1; i < k; i++) { for (j = i; j < k; j++) if (k * k == i * i + j * j) goto found; } } printf("not found\n"); return 0; found: printf("%d * %d + %d * %d = %d * %d\n", i, i, j, j, k, k); return 0; } p.166 例17.3.2 17.3 break文による繰返し制御 #include <stdio.h> 800未満の素数 #define MAX 800 10個ごとに改行 #define N 10 /* ex17_3_2.c */ エラトステネスの篩(ふるい) int main(void) { int primes[MAX]; // 素数判定結果用配列 int i, j, p; // i: 範囲, p: 素数カウンタ for (i = 2; i < MAX; i++) primes[i] = 1; p = 0; "真"で初期化 17.3 break文による繰返し制御 for (i = 2; i < MAX; i++) { 素数を印刷 if (primes[i]) { 10個ごとに改行 printf("%5d", i); if ((++p) % N == 0) printf("\n"); ループの 100個めで強制終了 if (p == 100) break; 外に脱出 for (j = 2 * i; j < MAX; j += i) primes[j] = 0; // 偽 ここで篩に かけている } } return 0; break は、ループ(iのfor文)の外に出る } p.169 例17.4.2 17.4 continue文による繰返し制御 #include <stdio.h> #define MAX 100 完全数を探し、その総和を求める /* ex17_4_2.c */ int main(void) { int i, j, sum, total = 0; for (i = 2; i < MAX; i++) { sum = 0; 完全数: ある自然数に対して、その数以外の約数の和がその数に等しいもの 17.4 continue文による繰返し制御 for (j = 1; j < i; j++) j が i の約 if (i % j == 0) sum += j; 数なら加算 if (sum != i) continue; 完全数でない printf("%d\n", i); ならスルー total += i; 完全数なら印刷 } printf("total = %d\n", total); return 0; } continue は、ループ(iのfor文)の最後に飛ぶ 17.5 return文 #include <stdio.h> #define NEGATIVE (-1) /* ex17_5_1.c */ int factorial(int x); p.170 例17.5.1 階乗の計算 int main(void) { int x, y; printf("入力 = "); scanf("%d", &x); y = factorial(x); 17.5 return文 if (y == NEGATIVE) printf("負の数が入力されました\n"); else 入力値が負なら終了 printf("%d! = %d", x, y); return 0; } 入力値が正なら答えを印刷 17.5 return文 int factorial(int x) 階乗の計算ルーチン { int i, result = 1; if (x < 0) return NEGATIVE; if (x == 0) return result; else { for (i = 1; i <= x; i++) result *= i; return result; 階乗計算 } } return は、その関数から抜けて、値を返す 第18章 マクロ 18.1 引数を持たないマクロ 18.2 引数を持つマクロ 18.1 引数を持たないマクロ p.172 例18.1.1 #define PI 3.1415926 ex18_1_1.c という名前で保存 #define WORD 32 #define ROOT sqrt #define NEWLINE printf("\n") int main(void) { double x, y; int w; x = PI * 2.0: y = ROOT(x); printf("%f\n", x); NEWLINE; w = WORD / 8; } 18.1 引数を持たないマクロ Z:\nyumon2> cl -E ex18_1_1.c プリプロセッサの出力を表示 int main(void) { double x, y; int w; x = 3.1415926 * 2.0: y = sqrt(x); printf("%f\n", x); printf("\n"); w = 32 / 8; } 18.2 引数を持つマクロ p.174 例18.2.1 #include <stdio.h> #define larger(x, y) (((x) > (y)) ? (x) : (y)) #define smaller(x, y) (((x) < (y)) ? (x) : (y)) int main(void) { int x[] = {6, 10, 4, 1, 3, 9, 11, 3, 20, 3, 4, 4, 6, 3, 2}; int n = sizeof x / sizeof x[0]; int i, max, min; max = min = x[0]; if (x > y) max = x; for (i = 1; i < n; i++) { else max = y; max = larger(max, x[i]); min = smaller(min, x[i]); if (x < y) min = x; } else min = y; printf("最大値 = %d\n", max); printf("最小値 = %d\n", min); return 0; } 数当てゲーム 人が思い浮かべた数をコンピュータが数を当てるプログラム #include <stdio.h> int loop(void); int check(int k); /* number.c */ int main(void) { printf("1~100までのうち、 数字を一つ思い浮かべてください。\n"); printf("%d回で当たりました!¥n", loop()); } int loop(void) { int inc = 50, sgn, est = 50; int ans, nloop = 1; case 1: sgn = 1; while (1) { break; ans = check(est); case 2: sgn = -1; switch (ans) { } case 0: inc /= 2; return nloop; if (inc == 0) inc = 1; 数当てゲーム(つづき) est += sgn * inc; nloop++; } } 数当てゲーム(つづき) int check(int k) { int ans; do { printf("あなたの考えている数字は%dですか?\n", k); printf("はい=0, もっと大きい=1, もっと小さい=2: "); scanf("%d", &ans); } while ( ); ? return ans; } 当てるまでの回数が多い → 改良の余地アリ
© Copyright 2024 ExpyDoc