情報処理Ⅱ 2008年1月30日(水)
本日の内容 小テスト これからのプログラミング学習について おさらい問題の解説 試験について 様々なCの仕様,様々なコンパイラ 春休みに考えてみよう おさらい問題の解説 試験について
様々なCの仕様 K&R (-traditional) ANSI (-ansi),C89 (-std=c89) C99 (-ctd=c99) “The C Programming Language”, またはその本における仕様を指す. 著者, Brian W. Kernighanと Dennis M. Ritchieとの頭文字による. K&R (-traditional) int main(argc, argv) int argc; char *argv[]; { ANSI (-ansi),C89 (-std=c89) この授業で用いた仕様 C99 (-ctd=c99) 論理型(_Bool),複素数型,可変長配列,複合リテラルなど C言語の歴史: http://www.bohyoh.com/CandCPP/C/history.html 「man gcc」を実行しても,-ansiオプションしか出てこない. http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html#SEC6 -traditional 伝統的なCコンパイラが持ついくつかの特性をサポートするよう試みます。 http://libc.blog47.fc2.com/blog-entry-7.html -std=<standard> <standard>で指定した標準規格に従いま す。指定できる主な値は、"c89", "c99", "gnu89", "gnu99"です。文字通り、"c89"を指定すればANSI X3.159-1989に、"c99"を指定すればISO/IEC 9899:1999に従います。"gnu89"および"gnu99"は、それぞれ"c89"と"c99"にGNU拡張を加えたものです。このオプションが なければ、"gnu89"が選択されます。 この色は,演習室Cコンパイラ(GCC)のオプション
様々なコンパイラ GCC Borland C++Compiler インテル コンパイラー GNU Compiler Collection.フリーで,多くのアーキテクチャで使用可能.クロスコンパイルにも使われる. 「//」によるコメント,ブロック途中の変数宣言,関数定義の入れ子などは,GCC拡張あるいはGNU拡張と呼ばれる (-std=gnu89, -std=gnu99). Borland C++Compiler バージョン5.5は個人使用ならフリー.Windowsで手軽に使える. インテル コンパイラー ハイパフォーマンスを謳う商用コンパイラ C++Builder ダウンロード: http://www.codegear.com/jp/downloads/free/cppbuilder インテル® コンパイラー: http://www.intel.com/cd/software/products/ijkk/jpn/compilers/295842.htm
春休みに考えてみよう これは何? アドバイス アルゴリズム演習Ⅰの例年最初の課題 http://www.wakayama-u.ac.jp/~kato/algorithm_pre/ これは何? アルゴリズム演習Ⅰの例年最初の課題 構造体の定義,構造体の配列,ファイル読み出し,並べ替えといった技術要素を含む アドバイス プログラムを書く前に,問題をよく読み,データをよく見て,プログラムにする方法を考える. 隠されている課題に気づく(この問題では,構造体の活用). 並べ替えは,「最大の人口密度を持つ県」を求め,次にそれを除いて「最大の人口密度を持つ県」を求め,…を繰り返す.
試験の心構え しっかり準備をする. Webページでは,授業スライドだけでなく,復習問題にも 目を通しておく. 特に,「演算子」「配列とポインタの違い」「構造体」を理解しておく. Webページでは,授業スライドだけでなく,復習問題にも 目を通しておく. プログラムコードを見て,日本語で説明できるよう,訓練する. 何をするプログラムか? 何をする関数か? この行は,何をする処理か? 複数の解の候補がある問題は,「すべて」という指示がない限り,一つでよい.最善と思うものを選んで書く.
大問3の解説(1) 解答例 コメント 7行目と8行目の間に,int sum = 0; と書く. 変数宣言では,「どこで宣言するか」「型名」「初期化の必要性」に注意する. 「10行目と11行目の間」や「12行目と13行目の間」だと,25行目で参照できない. このsumについては初期化が必要である.変数の参照が,代入よりも先のときには,初期化しなければならない. 初期化が必要なときに忘れると減点. 初期化が不要なところに初期化をしても減点はしない. とすれば,試験対策として,初期化もするという戦略をとってもいい. (実際にプログラムを作る際には,初期化を必須とするか,変数ごとに決めるべき(必須としない)かは, コーディングスタイルの問題だと思う. 「どこで宣言するか」「型名」「初期化の必要性」に加えて,「修飾子(static, extern, constなど)」 「初期値(定数を与えるだけでいいか?定数はオブジェクト形式マクロにすべきではないか,など)」も 考えられるようになってほしい.
大問3の解説(2) 解答例 チェックデジットを除く各数字について,奇数番目(先頭の文字を1番目とする)ならそのまま足し,偶数番目なら3倍して足して,合計した値の1の位を10から引いたもの(ただし,10なら0にする)が,チェックデジットである. コメント 中核となる処理を,説明できるようにしよう. str[0]が文字列の先頭である点に注意.
大問3の解説(3) 解答例 コメント 「./isbn13 978427406337」を実行する.結果は 「978427063374」である. 「この入力には何を出力するか?」は試験に出さない.出力を見て,「どんな入力を与えたらその出力になるか」を考られるようにすること(未知のプログラムを実行するときにも重要). 「978427063374」は,『スーパーリファレンス編』のISBN13である.
大問3の解説(4) 解答例 これは,標準ライブラリ関数のprintfを用いて,文字列strと整数値dの値を連接して標準出力に書き出し,改行するものである.ライブラリ関数を用いるには適切なヘッダファイルを取り込む必要があり,printfについては,1行目の 「#include <stdio.h>」が該当する. コメント 「ライブラリ関数」については,それを使うためにインクルードすべき「ヘッダファイル」も合わせて理解する.
大問3の解説(5) 解答例 誤答例 コメント if (c >= '0' && c <= '9') { 問題文但し書きは,『スーパーリファレンス編』p.28による. ライブラリ関数を使うほうが,一般に,バグは起こりにくい. 関数が定義されているときに,「関数プロトタイプを記述しなさい」や「同じ意味の関数形式マクロを答えなさい」といった問題にも答えられるようにすること.
大問3の解説(6) 解答例 コメント +=, -, *, &, ? : カッコは演算子ではない.(関数呼び出しを除く.) 「? :」は,これで一つの演算子なので,間にカンマを入れない. 演算子の優先順位と結合の向き,暗黙の型変換(演算,代入時)を確認しておくこと.
大問2の解説(1)~(5) 解答例 コメント (1)オペランド / 被演算数 / 被演算子 (2)sizeof (3)左 / 前 (4)100 (5)-> コメント 「非演算数」は間違い(『Cプログラム入門以前』の記述は誤記と思われる). 「構造体オブジェクト.メンバ」と「構造体ポインタ->メンバ」の違いも確認しておく.
大問2の解説(6)~(10) 解答例 コメント (6)ループカウンタ / カウンタ変数 (7)i <= 7 / i < 8 (8)11,10,9,8,7,6,5 (9)i=10;i>=4;i-=2 (10)(8,8),(4,4),(2,0),(1,-4) コメント 『スーパーリファレンス編』p.256より.最後のみオリジナル. 実際には,もう一度更新した値で終わる.「2つずつ増加」の例で,forループを終えた時点でのiの値は,9ではなく11である.表は,forループで処理に使われる値(の変化)を書いている. 最後の例は,1/2が0になることを用いている.
大問2の解説(11)~(14) 解答例 コメント (11)交換 (12)値渡し (13)char *x, char *y (14)変数名の前に&をつける コメント 「関数の値の受け渡し」がテーマ.参照渡しをするときは,ポインタの知識も不可欠である. 「交換」「最大値」「(文字列)走査」など,定番の処理は名称とコードを覚える.
大問1の解答 (1) ② (2) ① (3) ② (4) ② (5) ② (6) ② (7) ① (8) ① (9) ① (10) ②
大問1の解説 (2)負の値で231個,0で1個,正の値で231-1個,合計232個. (5)α<<β は α・2β (6)ナル文字を忘れずに.配列に対する初期化の注意点(一つではない)も要確認. その他コメント 授業で見聞きしたことを思い出す. おさらい問題の問題文は,本番でも,表現を変えて出題するかもしれない.
試験について 実施上のルール 配点 解答解説など 日時・場所:2月4日(月)10:50~12:20 A103 持込:自筆ノート1冊のみ可 日時・場所:2月4日(月)10:50~12:20 A103 持込:自筆ノート1冊のみ可 「用紙1枚」は不可(カンニング防止のため). 挟み込み,糊付けも不可. 「ルーズリーフ」は,バインダに綴じており,試験中取り外さないなら可. 配点 レポート:10点×2,試験:80点 解答解説など 試験問題,おさらい問題と合わせて, できるだけすみやかにWebで公開する.