Dokusyo-nissi Bessitu 2004-01-10 φ(-_-) ■ [etc]あざといいいわけ ちょっとしたかんちがいで、はてなに登録してしまった。 まずい! どうしよう? 自分の HP をたちあげて数ヵ月しかたってないのになに考えてるんだ... と、一瞬思ったが - まあいいか。 なんでも書いとけばそのうちテーマも決まってくるだろうし。 (それにこっちのほうが見栄えもいいし) ■ [web]UNIX ただいま学習中 初心者向けに - 手を抜かずに - 書かれたテキストを紹介します。 稚内北星学園大学の金山典世さんのC言語のページ http://www.wakhok.ac.jp/~kanayama/C/ takamitiさんのmimi's Indexにある Bourne Shell 自習テキスト http://www.tsden.org/takamiti/index.html ここでヘタな紹介をするより直接ポチッと押してもらったほうがナットクします。 2004-05-06 φ(-_-) ■ [lang]はじめての C 「設定変えるのが楽しすぎて未だにCの勉強もしてないんだよ」 "のびたのLinux奮闘記 #8" 04/04/27*1 テキストをながめてても上達するわけないので、課題を解くしかないか ... 整数どうしの割り算 2つの整数(a, b)を入力すると a ÷ b を計算して 割り切れるか否かを表示し 割り切れないときには その余りを表示する プログラムを作成せよ。 (↓インデントがないので見にくいね) 1. /* warizan */ 2. #include 3. main() 4. { 5. int a, b, p, q; 6. printf("今から割り算をしてみます。\n"); 7. printf("2つの数字を入力しなさい。\n"); 8. printf("Input a = "); 9. scanf("%d", &a); 10. printf("Input b = "); 11. scanf("%d", &b); 12. printf("\n"); 13. p = a / b; 14. q = a - p * b; 15. if (q == 0) { 16. printf("%d ÷ %d は割り切れました。\n", a, b); 17. } else { 18. printf("%d ÷ %d は割り切れません。\n", a, b); 19. printf("余りは %d ですネ。\n", q); 20. } 21. } これだと a < b だとちょっとヘン ... まっ、いいか。 *1:スレッドが 1ヶ月もたなかったヨ .. 2004-05-09 φ(-_-) ■ [lang]はじめての C 1 から 100 までの数を足して合計のみを表示するプログラムを作成せよ。 1. /* tasizan */ 2. #include 3. main() 4. { 5. int x, i; 6. x = 0; 7. printf("1 から 100 までの数を足すと?\n\n"); 8. for ( i = 0; i <= 100; i++ ) { 9. x = x + i; 10. } 11. /* 合計の表示はループを抜けた後で */ 12. printf("合計は %d です。\n", x); 13. } 900000円の中古車をローンで買った。金利は複利で年3%である。毎月の支払い限度 額を20000円としたら 支払いには何年かかるのか ? そして毎月の返済額はいくらか ? を 表示するプログラムをつくること。 変数は下の4つ ・ x : 中古車の価格 ・ y : 支払い期間 (年) ・ p : 月払いの限度額 ・ q : 1ヶ月の支払い額 1. /* hensai */ 2. #include 3. main() 4. { 5. int x, y, p, q; 6. x = 900000; 7. p = 20000; 8. printf("中古車の価格 : 900000円\n"); 9. printf("毎月の支払い限度額 : 20000円\n"); 10. printf("金利 : 複利で年3%\n\n"); 11. printf("返済には何年かかるの? それに毎月の支払い額はいくらなの?\n\n"); 12. for ( y = 1 ; ; y = y + 1 ) { 13. x = x * 1.03; 14. q = x / (y * 12); 15. if (p >= q) { 16. break; 17. } 18. } 19. /* 1ヶ月の支払い額(q)が限度額(p)を上回ったらループを抜ける */ 20. printf("支払いには %d 年かかります。\n, y"); 21. printf("毎月の返済額は %d 円になります。\n, q"); 22. } ループを抜けた時点では変数 q は p を上回ってるけど、for文は実行されずに終了する のだから、変数 q (それに変数 y も) はループを抜ける直前の数値になる。 ↑これでよかった ? あと、for文に含まれる if文の条件は ・ この条件でプログラムを実行せよ、ただし ・ 条件が満たされなくなった時点で for文を抜ける というこのなので普通の if文の条件とは性格が違う(条件のなかに含まれる変数値が変 化する)。 上の例でいえば、支払い額(q)が限度額(p)を上回ったらというところで if (p < q) { と書いてしまいそうになるので注意 !! break の前の if文の条件は ・ (for文の)実行条件であって ・ for文を抜ける(breakする)条件ではない ということですネ。 (追記) よく考えると この説明は スコブル怪しい ! 2004-05-13 φ(-_-) ■ [lang]はじめての C 整数どうしの割り算 プログラム warizan を手直しして 割り算の答と その余りを表示する プログラムを作成せよ。 ↑入力まちがいのチェックもつけて 1. /* warizan.2 */ 2. #include 3. main() 4. { 5. int a, b; 6. char buf[64]; 7. printf("いまから a, b 2つの数字を入力して、その商と余を求めます。\n\n"); 8. printf("もとの数字を入力してください a = "); 9. for ( ; scanf("%d", &a) != 1 ; ) { 10. printf("数字で入力してネ a = "); 11. scanf("%s", buf); 12. } 13. printf("割る数字を入力してください b = "); 14. for ( ; scanf("%d", &b) != 1 ; ) { 15. printf("数字で入力してネ b = "); 16. scanf("%s", buf); 17. } 18. printf("\n"); 19. printf("a ÷ b の答えは %d です。\n", a / b); 20. printf("a ÷ b の余りは %d です。\n", a - (a / b) * b); 21. } 真の返り値 4つの設問をだして 答えを数字で入力させて 正しければそこで終了し まちがいのときには 正解がでるまで終了しない プログラムを作成せよ。 1. /* kaeriti */ 2. #include 3. main() 4. { 5. int a; 6. printf("C言語で返り値が真なのはどれ ?\n"); 7. printf("(1) 2\n(2) 0\n(3) 1\n(4) -1\n"); 8. printf("番号で答えてください。\na = "); 9. for ( ; scanf("%d", &a) == 1 ; ) { 10. if (a != 3) { 11. printf("残念、もう一度。\na = "); 12. } else { 13. printf("正解 !\n"); 14. break; 15. } 16. } 17. } 2004-05-16 φ(-_-) ■ [lang]はじめての C プログラム hensai を見直して 各項目が入力できる 新しいプログラムを作成せよ。 ↑入力まちがいのチェックもいれて。 変数は下の5つ ・ x : 中古車の価格 ・ y : 支払いの期間 (年) ・ p : 月払の限度額 ・ q : 1ヶ月の支払額 ・ r : 年金利 - 複利で (%) 1. /* hensai.2 */ 2. #include 3. main() 4. { 5. int x, y, p, q, r; 6. char buf[64]; 7. printf("中古車ローンの\n(1)支払い期間と\n"); 8. printf("(2)毎月の返済額を\n計算します。\n\n"); 9. printf("車の価格を入力してください x = "); 10. for ( ; scanf("%d", &x) != 1 ; ) { 11. printf("数字を入力してネ x = "); 12. scanf("%s", buf); 13. } 14. printf("毎月いくらなら払えますか? p = "); 15. for ( ; scanf("%d", &p) != 1 ; ) { 16. printf("数字を入力してネ p = "); 17. scanf("%s", buf); 18. } 19. printf("ローンの金利を % で入力してください r = "); 20. for ( ; scanf("%d", &r) != 1 ; ) { 21. printf("数字を入力してネ r = "); 22. scanf("%s", buf); 23. } 24. /* 上の3つの for文は入力が正しいときには実行されない。*/ 25. for ( y = 1 ; ; y = y + 1 ) { 26. x = x * (1 + r / 100.0); 27. q = x / (y * 12); 28. if (p >= q) { 29. break; 30. } 31. } 32. printf("\n"); 33. printf("支払いには %d 年かかります。\n", y); 34. printf("毎月の返済額は %d 円になります。\n", q); 35. } 2004-05-18 φ(-_-) ■ [lang]はじめての C 論理演算というのは CPUの構造からみると ・ ! → NOT 回路 ・ && → AND 回路 ・ || → OR 回路 というふうに、演算論理回路の仕組みにいちばん当てはまってるように思う←まちがっ てる ? 三角形の3辺の長さを与えたとき その三角形がなりたつか否かを しらべるプログラムを作成せよ。 1. /* sankaku */ 2. #include 3. main() 4. { 5. int a, b, c; 6. printf("これから3つの数字を入力して\n"); 7. printf("それが三角形になるか否かを\n"); 8. printf("判定します。\n\n"); 9. printf("1つ目の数字を入力 a = "); 10. scanf("%d", &a); 11. printf("2つ目の数字を入力 b = "); 12. scanf("%d", &b); 13. printf("3つ目の数字を入力 c = "); 14. scanf("%d", &c); 15. if (a + b > c && b + c > a && c + a > b) { 16. printf("\n"); 17. printf("この3つの数字で三角形ができます。\n"); 18. } else { 19. printf("\n"); 20. printf("残念だけど三角形にはなりません。\n"); 21. } 22. } プログラム sankaku を手直しして 三角形の種類も判別できる プログラムを作成せよ。 1. /* sankaku.2 */ 2. #include 3. main() 4. { 5. int a, b, c, temp; 6. printf("これから3つの数字を入力して\n"); 7. printf("三角形になるか否かを判定し\n"); 8. printf("それが三角形なら\n"); 9. printf("どんな形状かを知らせます。\n\n"); 10. printf("1つ目の数字を入力 a = "); 11. scanf("%d", &a); 12. printf("2つ目の数字を入力 b = "); 13. scanf("%d", &b); 14. printf("3つ目の数字を入力 c = "); 15. scanf("%d", &c); 16. if (a < b) { 17. temp = a; a = b; b = temp; /* swap a, b */ 18. } 19. if (a < c) { 20. temp = a; a = c; c = temp; /* swap a, c */ 21. } 22. if ((a + b > c && b + c > a && c + a > b) != 1) { 23. printf("\n"); 24. printf("残念だけど三角形にはなりません。\n"); 25. } 26. for ( ; (a + b > c && b + c > a && c + a > b) == 1 ; ) { 27. if (a * a == b * b + c * c) { 28. printf("\n"); 29. printf("直角三角形になります。\n"); 30. break; 31. } else if (a * a > b * b + c * c) { 32. printf("\n"); 33. printf("鈍角三角形になります。\n"); 34. break; 35. } else if ( a * a < b * b + c * c) { 36. printf("\n"); 37. printf("鋭角三角形になります。\n"); 38. break; 39. } 40. } 41. } (break は余分だったかなあ) 2004-05-19 φ(-_-) ■ [lang]はじめての C 1 以上 max 未満の n の倍数の和を計算する プログラムを作成せよ。 まずは基本に戻って for文の { 中カッコ } のなかでインクリメントと同じように変数 x に 1 を加えていく には 増分処理に使ったくり返し変数 i を利用すること。 ・ x = x + i または x += i 変数はつぎの 5つ ・ n : もとの数 ・ max : 最大の数 ・ i : くりかえす回数←これは max / n になる ・ x : n にかける数 ・ y : n の倍数 n と max は変数だが、式の中では変化しないので、仮りに ・ max = 100 ・ n = 2 と固定して考えてみると 1. /* kotei */ 2. #include 3. main() 4. { 5. int i, x, y; 6. x = 0; 7. y = 0; 8. for ( i = 0 ; i < (100/2) ; i = i + 1 ) { 9. x = x + i; 10. y = x * 2; 11. } 12. printf("1 以上 100 未満の\n"); 13. printf("すべての 2 の倍数の和は\n"); 14. printf("%d になります。\n", y); 15. } ただしこれだと max / n がわりきれない場合に問題が起こるので、すこし工夫しないと ネ。 上の式を変えていく。 1. /* baisuu */ 2. #include 3. main() 4. { 5. int n, max, i, x, y; 6. x = 0; 7. y = 0; 8. printf("これから 1 以上 max 未満の\n"); 9. printf("すべての n の倍数の和を\n"); 10. printf("計算します。\n\n"); 11. printf("n の数を入力してください n = "); 12. scanf("%d", &n); 13. printf("max の数を入力してください max = "); 14. scanf("%d", &max); 15. if (max == (max/n) * n) { 16. for ( i = 0 ; i < (max/n) ; i++ ) { 17. x += i; 18. y = x * n; 19. } 20. } else { 21. for ( i = 0 ; i <= (max/n) ; i++ ) { 22. x += i; 23. y = x * n; 24. } 25. } 26. printf("\n"); 27. printf("%d 未満の\n", max); 28. printf("すべての %d の倍数の和は\n", n); 29. printf("%d になります。\n", y); 30. } 2004-05-21 φ(-_-) ■ [lang]はじめての C min 以上で n の最小の倍数を計算する プログラムを作成せよ。 1. /* mini */ 2. #include 3. main() 4. { 5. int n, min, x; 6. x = 0; 7. printf("min 以上で最小の\n"); 8. printf("n の倍数を\n"); 9. printf("算出します。\n\n"); 10. printf("n の数を入力してください n = "); 11. scanf("%d", &n); 12. printf("min の数を入力してください min = "); 13. scanf("%d", &min); 14. if ( min > (min/n) * n ) { 15. x = (min/n) * n + n; 16. } else { 17. x = min; 18. } 19. printf("\n"); 20. printf("%d 以上で最小の\n", min); 21. printf("%d の倍数は\n", n); 22. printf("%d ですネ。\n", x); 23. } min 以上 max 未満の n の倍数の和を計算する プログラムを作成せよ。 まず for文を組み立て直してみる。 ・ 初期化 : 初期値を min に ・ 継続条件 : 値が max になるまで ・ 増分処理 : 値に n を加えていく ↓こんな感じで 1. for ( i = min ; i < max ; i = i + n ) { 2. x = x + i; /* x が n の倍数になる */ 3. } 変数は下の5つ ・ n : もとの数 ・ min : 最小の数 ・ max : 最大の数 ・ i : くりかえす回数 ・ x : n の倍数 1. /* max */ 2. #include 3. main() 4. { 5. int n, min, max, i, x; 6. x = 0; 7. printf("これから min 以上 max 未満の\n"); 8. printf("すべての n の倍数の和を\n"); 9. printf("計算します。\n\n"); 10. printf("最初に n の数を入力してください n = "); 11. scanf("%d", &n); 12. printf("つぎに min の数を入力してください min = "); 13. scanf("%d", &min); 14. printf("最後に max の数を入力してください max = "); 15. scanf("%d", &max); 16. if ( min > (min/n) * n ) { 17. min = (min/n) * n + n; 18. } 19. for ( i = min ; i < max ; i += n ) { 20. x += i; 21. } 22. printf("\n"); 23. printf("%d 以上 %d 未満の\n", min, max); 24. printf("すべての %d の倍数の和は\n", n); 25. printf("%d になります。\n\n", x); 26. printf("(min は %d の倍数に直しました、不悪)\n", n); 27. } for文で初期化と増分処理をいじるということはまったく思いつかなかった。こんなこと ができるのか ... プログラム baisuu もこの方法で書きかえると、 変数は下の4つ ・ n : もとの数 ・ max : 最大の数 ・ i : くりかえす回数 ・ x : n の倍数 1. /* baisuu.2 */ 2. #include 3. main() 4. { 5. int n, max, i, x; 6. x = 0; 7. printf("これから 1 以上 max 未満の\n"); 8. printf("すべての n の倍数の和を\n"); 9. printf("計算します。\n\n"); 10. printf("n の数を入力してください n = "); 11. scanf("%d", &n); 12. printf("max の数を入力してください max = "); 13. scanf("%d", &max); 14. for ( i = 0 ; i < max ; i = i + n ) { 15. x = x + i ; 16. } 17. printf(\n"); 18. printf("1 以上 %d 未満の\n", max); 19. printf("すべての %d の倍数の和は\n", n); 20. printf("%d になります。\n", x); 21. } 2004-05-23 φ(-_-) ■ [lang]はじめての C 金山さんところの課題 6.1(論理演算) について ... この課題では scanf("%s",buf) を使わずプログラムを組み立てたほうがいい、と思う。 関数 scanf は標準入力から読み込んだデータを保管しておくので、次の入力のときにい ったん前のデータを破棄しないといけない。 ただしこれは入力エラーの場合であって、正常に入力されていれば変数は次の入力が実 行されると前のデータが消され新しいデータが格納される。 ちょっと実験してみると、 1. /* suuzi */ 2. #include 3. main() 4. { 5. int a; 6. printf("整数を入力してください a = "); 7. if (scanf("%d", &a)) { 8. printf("それは %d ですね。\n", a); 9. } 10. printf("整数を入力してください a = "); 11. if (scanf("%d", &a)) { 12. printf("それは %d ですね。\n", a); 13. } 14. printf("整数を入力してください a = "); 15. if (scanf("%d", &a)) { 16. printf("それは %d ですね。\n", a); 17. } 18. } 変数 a の値は入力の値によってつぎつぎ変化するはず。 課題 6.1 から char buf[64]; と scanf("%s",buf); を取り除くと↓ 1. /* mondai */ 2. #include 3. main() 4. { 5. int a, b, c, x, y, z; 6. y = 4; 7. z = 0; 8. printf("「問題」答が真なら(1)を偽なら(0)を入力しなさい。\n\n"); 9. /* sono_1 */ 10. a = 5; b = 3; 11. printf("a = %d, b = %d のとき\na > 1 && b > 2 は\n真(1)か偽(0)か? x = ", a, b); 12. scanf("%d", &x); 13. if (x == (a > 1 && b > 2)) { 14. z++; 15. } 16. /* sono_2 */ 17. a = 2; b = -2; 18. printf("\n"); 19. printf("a = %d, b = %d のとき\na < 0 || b < 0 は\n真(1)か偽(0)か? x = ", a, b); 20. scanf("%d", &x); 21. if (x == (a < 0 || b < 0)) { 22. z++; 23. } 24. /* sono_3 */ 25. a = -4; b = -2; 26. printf("\n"); 27. printf("a = %d, b = %d のとき\na < 0 && !b < 0 は\n真(1)か偽(0)か? x = ", a, b); 28. scanf("%d", &x); 29. if (x == (a < 0 && !b < 0)) { 30. z++; 31. } 32. /* sono_4 */ 33. a = 8; b = -2; c = 0; 34. printf("\n"); 35. printf("a = %d, b = %d, c = %d のとき\n", a, b, c); 36. printf("a > 0 && b > -2 || c > 1 は\n真(1)か偽(0)か? x = "); 37. scanf("%d", &x); 38. if (x == (a > 0 && b > -2 || c > 1)) { 39. z++; 40. } 41. printf("\n"); 42. printf("正解は %d 問のうち &d 問でした。\n", y, z); 43. if (y == z) { 44. printf("全問正解ですネ !\n"); 45. } else { 46. printf("もう一度挑戦する ?\n"); 47. } 48. } ただし関数 scanf がプログラムの中で実際どのように動いているのかを知っているわけ ではないので本当にこれでいいのかどうかは保証できないけど ... 2004-05-25 φ(-_-) ■ [lang]はじめての C 消費税が 5% から 10% に引き上げられた場合、政府の増収分はいくらになる ? 4000万人が年間 400万円を使うと仮定すること。 (プログラムは実数で) このままだと数字が大きくなりすぎて float の扱える範囲を越えてしまう。 そこのところを関数 printf のほうで調整してみると、 1. /* zeikin */ 2. #include 3. main() 4. { 5. float a, b, c, x; 6. a = 4000; 7. b = 400; 8. c = 10.0 - 5.0; 9. printf("全人口のうち 4000万人の人が\n"); 10. printf("1年に 400万円の買い物をするとして\n"); 11. printf("もし消費税が 5% から 10% に\n"); 12. printf("引き上げられたら\n"); 13. printf("政府はいったいいくらの増収になるの ?\n\n"); 14. x = a * b * (c / 100.0); 15. printf("増収分は %f 円になります。\n", x * 10000 * 10000); 16. } 1億人の人口が毎年 5% ずつ減少するとしたら 5000万人以下になるのは何年後か、 を算出するプログラムを作成せよ。 増分処理がインクリメント(i++)以外の場合に、文中でインクリメント(x++)が使えるの かを調べてみる。 1. /* sample */ 2. #include 3. main() 4. { 5. int i, x; 6. x = 0; 7. for ( i = 10 ; i > 0 ; i-- ) { 8. x++; 9. } 10. printf("answer = %d\n", x); 11. } ↑できそうだネ。 あとは for文の要素の中身をいじって、 1. /* hametu */ 2. #include 3. main() 4. { 5. int y; 6. float a, b, i; 7. a = 100000000; 8. b = 5.0; 9. y = 0; 10. printf("現在 1億人いるとして\n"); 11. printf("毎年 5% ずつ減少すると\n"); 12. printf("5000万人以下になるのは何年後 ?\n\n"); 13. for ( i = a ; i > a / 2 ; i *= (1 - b / 100.0) ) { 14. y++; 15. } 16. printf("それは .... わずか %d 年後です。\n", y); 17. } テストの点数を入力させて平均点を求める プログラムを作成せよ。 無限ループを使って { 文 } のなかに関数をいれてみる。 こんな感じで↓ 1. for ( ; ; ) { 2. printf("Input a = "); 3. scanf("%d", &a); 4. b = b + a; 5. if ( だめだめ ) 6. break; 7. } これでくり返し入力が可能になる。あとは要素にインクリメント(i++)を使えば、 1. /* heikin */ 2. #include 3. main() 4. { 5. int i; 6. float a, x; 7. x = 0; 8. printf("これからテストの平均点を計算します。\n\n"); 9. printf("数字の 0 を入力すると\n"); 10. printf("集計は終了して\n"); 11. printf("平均点が表示されます。\n\n"); 12. for ( i = 0 ; ; i++ ) { 13. printf("各自の点数を入力しなさい。\na = "); 14. scanf("%f", &a); 15. x = x + a; 16. printf("\n"); 17. if (a == 0) 18. break; 19. } 20. printf("テストの結果、合計 %d 人の\n", i); 21. printf("平均点は %f 点でした。\n", x / i); 22. } 2004-05-29 φ(-_-) ■ [lang]はじめての C キーボードから文字を1つ読み込み整数変数としての値を出力するプログラムを作成 せよ。 1. /* chtoint */ 2. #include 3. main() 4. { 5. int a; 6. char c; 7. printf("文字を1つ入力してください\nc = "); 8. scanf("%c", &c); 9. a = c; 10. printf("\n"); 11. printf("この文字の整数値は\n%d ですネ\n", a); 12. } for文をつかってアルファベットを順次、出力するプログラムを作成せよ。 1. /* abc */ 2. #include 3. main() 4. { 5. int i; 6. char c = 'a'; 7. for ( i = 0 ; i < 26 ; i++ ) { 8. c++; 9. printf("%c ", c - 1); 10. } 11. printf("\n"); 12. } 2004-05-31 φ(-_-) ■ [lang]はじめての C 0 から 9までの間の乱数をつくるプログラムを作成せよ。 乱数の種 (seed) はキーボードから入力できるように。 1. /* zeroto9 */ 2. #include 3. #include 4. main() 5. { 6. int seed, random; 7. printf("Input seed = "); 8. scanf("%d", &seed); 9. srand(seed); 10. random = rand() % 10; 11. printf("random : %d\n", random); 12. } 「ゲーム」 □ 乱数の種 (seed) はキーボードから入力させる。 □ 敵は 10 離れたところから 1つずつ前進してくる。 □ 敵との距離が 0 になったところで敗北→ゲームは終了。 □ 敵は 0 から 5 の 6つのコースのどこかにいる。 □ 敵は 1つずつ進むごとにコースを 1つ変える (または静止する) ことができる 。 □ レーダーとレーザ砲とを使えるが一度にどちらかしか操作できない。 □ レーザが命中したらつぎのステージに移る。 □ 全部で 5回戦あるがステージが上がると敵のスピードも速くなる。 1. /* game */ 2. #include 3. #include 4. main() 5. { 6. int seed, distance, cource, goal, round, laser, speed = 0; 7. printf("Input seed = "); 8. scanf("%d", &seed); 9. srand(seed); 10. printf("/n"); 11. for ( round = 1 ; round < 6 ; round++ ) { 12. printf("+++ stage %d +++\n\n", round); 13. cource = rand() % 6; 14. speed++; 15. for ( distance = 10 ; ; distance -= speed ) { 16. if (distance <= 0) { 17. printf("=== you lose (>_<) ===\n"); 18. exit(0); 19. } 20. if (cource == 0) { 21. cource += rand() % 2; 22. } else if (cource == 5) { 23. cource += rand() % 2 - 1; 24. } else { 25. cource += rand() % 3 - 1; 26. } 27. printf("(current distance = %d)\n\n", distance); 28. printf("select '1'(radar) or '2'(fight)\n); 29. printf("Input your choice = "); 30. scanf("%d", &laser); 31. printf("\n"); 32. if (laser == 1) { 33. printf("enemy cource >> %d <<\n",cource); 34. } else if (laser == 2) { 35. printf("select laser cource 0 - 5\n"); 36. printf("Input your choice = "); 37. scanf("%d", &goal); 38. if (goal == cource) { 39. printf("\n"); 40. printf("=== you win ! ===\n\n"); 41. break; 42. } 43. printf("\n"); 44. printf("== miss the target ==\n\n"); 45. } else { 46. printf("set '1' or '2' only\n"); 47. } 48. } 49. } 50. } main() のなかで %d と %c とを併用すると関数 scanf() のうち scanf("%c", &lazer) のほうがお亡くなりになるみたい。 しかたなくすべて変数を int に変更しました。 2004-06-04 φ(-_-) ■ [lang]はじめての C 整数を引数にとりその二乗を返す関数を使ったプログラムを作成せよ。 1. /* square */ 2. #include 3. square (int x) { 4. return x * x; 5. } 6. main() 7. { 8. int x; 9. printf("Input x = "); 10. scanf("%d", &x); 11. printf("x * x = %d\n", square(x)); 12. } ソースコード game.c を改良してレーダーで敵のコースが表示できる関数を使った プログラムを作成せよ。 1. /* game.2 */ 2. #include 3. #include 4. EnemyCource (int cource) { 5. if (cource == 0) { 6. printf("< 0....5 >\n"); 7. printf(" |E-----|\n"); 8. } else if (cource == 1) { 9. printf("< 0....5 >\n"); 10. printf(" |-E----|\n"); 11. } else if (cource == 2) { 12. printf("< 0....5 >\n"); 13. printf(" |--E---|\n"); 14. } else if (cource == 3) { 15. printf("< 0....5 >\n"); 16. printf(" |---E--|\n"); 17. } else if (cource == 4) { 18. printf("< 0....5 >\n"); 19. printf(" |----E-|\n"); 20. } else { 21. printf("< 0....5 >\n"); 22. printf(" |-----E|\n"); 23. } 24. } 25. main() 26. { 27. int seed, distance, cource, goal, round, lazer, speed = 0; 28. printf("Input seed = "); 29. scanf("%d", &seed); 30. srand(seed); 31. printf("\n"); 32. for ( round = 1 ; round < 6 ; round++ ) { 33. printf("+++ stage %d +++\n\n", round); 34. cource = rand() % 6; 35. speed++; 36. for ( distance = 10 ; ; distance -= speed ) { 37. if (distance <= 0) { 38. printf("=== you lose (>_<) ===\n"); 39. exit(0); 40. } 41. if (cource == 0) { 42. cource += rand() % 2; 43. } else if (cource == 5) { 44. cource += rand() % 2 - 1; 45. } else { 46. cource += rand() % 3 - 1; 47. } 48. printf("< current distance = %d >\n\n", distance); 49. printf("select '1'(lazer) or '2'(fight)\n"); 50. printf("Input your choice = "); 51. scanf("%d", &lazer); 52. printf("\n"); 53. if (lazer == 1) { 54. EnemyCource(cource); 55. } else if (lazer == 2) { 56. printf("select lazer cource 0 - 5\n"); 57. printf("Input your choice = "); 58. scanf("%d", &goal); 59. if (goal == cource) { 60. printf(\n"); 61. printf("=== you win ! ===\n\n"); 62. break; 63. } 64. printf("\n"); 65. printf("=== miss the target ===\n\n"); 66. } else { 67. printf(""set '1' or '2' only\n"); 68. } 69. } 70. } 71. } 2004-06-05 φ(-_-) ■ [lang]はじめての C ソースコード game.2.c を改良して敵との距離を表示する関数を使ったプログラム を作成せよ。 1. /* game.3 */ 2. #include 3. #include 4. EnemyCource (int cource) { 5. printf("(enemy cource)\n"); 6. if (cource == 0) { 7. printf("< 0....5 >\n"); 8. printf(" |E-----|\n"); 9. } else if (cource == 1) { 10. printf("< 0....5 >\n"); 11. printf(" |-E----|\n"); 12. } else if (cource == 2) { 13. printf("< 0....5 >\n"); 14. printf(" |--E---|\n"); 15. } else if (cource == 3) { 16. printf("< 0....5 >\n"); 17. printf(" |---E--|\n"); 18. } else if (cource == 4) { 19. printf("< 0....5 >\n"); 20. printf(" |----E-|\n"); 21. } else { 22. printf("< 0....5 >\n"); 23. printf(" |-----E|\n"); 24. } 25. } 26. EnemyDistance (int clength, int distance, char enemy) { 27. printf("(enemy distance)\n"); 28. printf("< 8 6 4 2 0>\n"); 29. printf("|"); 30. for ( clength = 10 ; clength > 0 ; clength-- ) { 31. if (clength == distance) { 32. printf("%c", enemy); 33. } else { 34. printf("-"); 35. } 36. } 37. printf("Y|\n\n"); 38. } 39. main() 40. { 41. int seed, distance, cource, goal, round, lazer, speed = 0; 42. int clength; 43. char enemy = 'E'; 44. printf("Input seed = "); 45. scanf("%d", &seed); 46. srand(seed); 47. printf("\n"); 48. for ( round = 1 ; round < 6 ; round ++ ) { 49. printf("+++ stage %d +++\n\n", round); 50. cource = rand() % 6; 51. speed++; 52. for ( distance = 10 ; ; distance -= speed ) { 53. if (distance <= 0) { 54. printf("=== you lose (>_<) ===\n"); 55. exit(0); 56. } 57. if (cource == 0) { 58. cource += rand() % 2; 59. } else if (cource == 5) { 60. cource += rand() % 2 - 1; 61. } else { 62. cource += rand() % 3 - 1; 63. } 64. EnemyDistance(clength, distance, enemy); 65. printf("select '1'(lazer) or '2'(fight)\n"); 66. printf("Input your choice = "); 67. scanf("%d", &lazer); 68. printf("\n"); 69. if (lazer == 1 ) { 70. EnemyCource(cource); 71. } else if (lazer == 2) { 72. printf("select lazer cource 0 - 5\n"); 73. printf("Input your choice = "); 74. scanf("%d", &goal); 75. if (goal == cource) { 76. printf("\n"); 77. printf("=== you win ! ===\n\n"); 78. break; 79. } 80. printf("\n"); 81. printf("=== miss the target ===\n\n"); 82. } else { 83. printf("set '1' or '2' only\n"); 84. } 85. } 86. } 87. }