Comments
Transcript
caesar2.c 論述へのコメントおよびアドバイス 村川 猛彦 2009 年 12 月 7 日
caesar2.c 論述へのコメントおよびアドバイス 村川 猛彦 2009 年 12 月 7 日 1. 添削例 以下の各項目は「間違った記述 ⇒ 適切な記述 // コメント」という構成になっている. 「⇒ 適切な記述」,「// コメント」がないものもある. -1 文字ずらした ⇒ 1 文字前にずらした // ここの説明でマイナスを使うことに合理性 はない. . / c a e s a r 2 U y i y w y k y // どこが空白か分からないのは,まずい. /caesar2 Uyiywyky ⇒ ./caesar2 Uyiywyky // 実行ファイルを実行する際の「./」は, カレントディレクトリにあるファイルを実行するという(シェルへの)指示である. コンパイルの cc や,ls などのファイル操作コマンドは,カレントディレクトリに実行 ファイルがあるわけではないので, 「./」を付けない. 14~19 行目で,間違った出力を回避している ⇒ 14~19 行目で,間違った出力になる 可能性をチェックしている // if 文を説明するときの文末には, 「判定する」 「検査する」 「チェックする」などが用いられやすい. 14~19 行目の構文では ⇒ 14~19 行目の for ループでは // 「構文」は,「for の構文 は…」のように,文の組み立てを説明するときに使う.14 行目のみなら「for 文」,終 わりまで含めて一つの反復のことを言及したければ「for ループ」と書くのがよい. 14~19 行目は,alphabet の文字がアルファベット順であるかどうかを調べている // それを調べるためのコードではない.ただし, 「『This program may produce a strange output.』と出力するときは,文字コードがアルファベット順で連続していないか,7 行目のアルファベットを打ち間違えている」というのは妥当である. 16 行目を発動させる ⇒ 16 行目の処理を行う // プログラムの説明で「発動」という 言葉は聞いたことがない. 1 つ前の文字に出力する ⇒ 1 つ前の文字に変換する // 出力処理は別に行っている. 23 行目から 34 行目は入れ子の for ループであり ⇒ 23 行目から 34 行目までは入れ子 の for ループであり // 「…から…まで」と書く. 「23~34 行目」 「23-34 行目」でもよ い. 「23~34 行目まで」 「23 行目~34 行目まで」 (「~」を「-」にしても同じ)は間違 い.「~」の字に,「から・まで」の意味が含まれているからである. 24 行目で「Wakayama」という出力になる ⇒ 25 行目に「24: Wakayama」を出力す る // 出力の 1 行目は「 0: Uyiywyky」である. 24 行目の for 文では,はじめに p に text のアドレスを代入し,入力された文字列の終 了を判定している // for 文の説明では,「何を行っているループなのか」が分かるよう な記述にしてほしい. 27-31 行目は,文字が ASCII コードでない場合でも正しく出力できるよう,剰余演算 を利用している // ASCII コードでなければ正しく出力できない可能性がある.ちなみ にこのプログラムでは, 「'a'か」 「'a'を除く英小文字か」 「'A'か」 「'A'を除く英大文字か」 の 4 通りに場合分けをすれば,剰余演算を用いることなく,同じ出力にすることがで きる. 27~28 行目の if 文は,参照した文字が a~z なら実行され ⇒ 27~28 行目の if 文は, 参照した文字が a~z のいずれかであるかを判定し,もしそうなら // 参照した文字が 何であっても実行される(比較判定がなされる). 「文字が a~z なら」のところは,述 語動詞を補うと「文字が a~z であるなら」となり,主語と述語の対応がとれていない. 27~31 行目の if 文で,27 行目は ⇒ 27~31 行目の if 文のうち,27 行目は // 「で」 や「は」などは,いろいろなところで使いたい助詞だが,多すぎると単調になる.意 味を考えて,他の助詞や,「のうち」といったより適切な表記がとれないか,考えると よい. 28 行目では,a の次が z になることを書いている // 他の英字(ここでは小文字)も変 換している. 「a の次が z」は読み手を混乱させるので(今回は教員と TA の 2 名だけが 読んだが,将来,プレゼンテーションをしたり卒業論文などを書いたりするときに, どんな人に読まれるかをイメージしてほしい) , 「a を z に置き換える」などの表現がで きるようになってほしい. 2 つずつずらしていく // そういうことはしていない.出力をよく見てほしい.もし実 際の出力が「2 つずつずらしていく」のなら,どこかに打ち間違いがある. 9~12 行目で入力が存在しないとき,no input.と出力する ⇒ 入力が存在しないとき, 9~12 行目の処理で no input.と出力し,プログラムを終える // 「…と出力する」と書 くと,プログラムはそこで終了することなく続くという意味になり,ここでは適切と は言えない. 9~19 行,21~34 行で違っている ⇒ 9~19 行目,21~34 行目で異なる処理を行って いる // 「19 行」と「19 行目」は,別のものを指す.「違う」は文法的には動詞だが, 「違う内容」のように,連体修飾として用いると効果的なことがある. 「違う処理」 Uyiywyky と入力すると,Wakayama と出力する // もっと多くの情報を出力している. Z を A にかえす ⇒ Z を A に替える // 「返す」 「帰す」 「孵す」のいずれも不適切. 「替 える」か「変える」ならよい.「換える」はグレーゾーン(「置き換える」はよい) . a よりどれだけ大きいかを計算して 26 を足したものから 1 を引き,26 で割った余りを 出し,a の文字コードを足したものを新たな文字コードとし //「何をしているのか(how ではなく what)」「なぜこんな式になっているのか」を書くべきである. char 型の変数として,alphabet と c を定義している // char の配列として alphabet を, char 型の変数として c を定義している // 配列(配列変数)とオブジェクト型(配列や ポインタでない変数)は分けて記述する. text は入力された文字列を格納し ⇒ text は入力された文字列を参照し //「格納」 は, 配列に対して使う.ポインタ変数の場合,「アドレスを格納する」なら間違いではない が,「文字列を格納する」ではない. 『c』や『p』を変数として使っている ⇒ 変数 c, p を使用している // 変数名など,プ ログラムコードの一部は原則としてカギカッコをつけない.変数名の単純な列挙は, 「, 」 (カンマ)で区切る(「変数 c および p」でもよい). これは,"Uyiywyky"から始まり"Uyiywyky"で終わるようにアルファベットを並べたプ ログラムである // 「これは何?」の答えを簡潔に説明すべきところで,例を挙げるの はよくない.その一方で,並べ方(文字列変換の方法)の説明がほしいところ. そのポインタを配列に置き換えている ⇒ そのポインタ変数を使って配列を参照して いる // 配列とポインタの違いを復習してほしい.よく用いられる表現に「配列領域を 用意する」「ポインタが参照する」「ポインタが指し示す値」などがある. もし argc が 1 以下なら ⇒ 9 行目の if 文により,もし argc が 1 以下なら,コマンド ライン引数が指定されていないことを意味し // 判定式を日本語に置き換えるのは, 「how」である.それが何を意味するのか,すなわち「what」を書けるようになって ほしい. アドレス関数 text に ⇒ ポインタ変数 text に // 文章全体はたとえ良くても,このよ うな単純ミス一つで「分かっていない」と思われるのは損なので,普段から日本語表 現を磨き,提出前によく読むようにしよう.「ポインタ text に」でもよい.「アドレス 変数 text に」は,試験では減点しないが,2 年以降や社会人になっても,この表現を 使っていると,初心者プログラマのように思われるかもしれない. アルファベットの並びがきっちりしているか ⇒ 'a'~'z'が文字コード上で連番になっ ているか // 「きっちり」は論述にふさわしくない. アルファベットを一つ巻き戻して ⇒ 英字については一つ前の文字に置き換えて // 「アルファベットを巻き戻す」では,伝えたいことが表現できていない. アルファベット以外(数字やカナなど)はそのまま表示される // カナや日本語は,今 回は考えなくてよい. アルファベット順にならんでるか ⇒ アルファベット順に並んでいるか // 漢字を使 うようにしよう(とくに,名詞や,用言の語幹).正しい助詞・助動詞で表記しよう. コマンドライン引数のそれぞれに対して判定を行う // argv の使われ方(参照のされ方) を,isbn13.c と見比べること. コマンドライン引数を,p という char *型の変数に代入し ⇒ コマンドライン引数の先 頭アドレスを,p という char *型の変数に代入し // 文字列そのものはポインタ変数に 代入できない.ただし,char *p = "abc";と宣言して「文字列 p」と書く慣習もあるの で,正しいかどうかはケースバイケースである. コマンドライン引数を取得. ⇒ コマンドライン引数を取得する. // 体言止めにしな い. コンパイルして caesar2.c を作成し ⇒ コンパイルして caesar2 を作成し // ソースフ ァイルのファイル名は「.c」で終え,実行ファイルは,ソースファイルから「.c」を取 り除いたものが通例である. シーザー暗号をすべて出力する ⇒ シーザー暗号による平文の候補をすべて出力する // プログラムの説明にあたっては, 「何を」出力するのかに細心の注意を払う. シーザー暗号化された文字列を ⇒ シーザー暗号で暗号化された文字列を // 「シーザ ー」では通じず,「シーザー暗号」と書く. ポインタ変数 p に文字列を代入して ⇒ ポインタ変数 p を文字列の先頭から始めて // ポインタには,配列や文字列を代入できない.配列や文字列の先頭アドレスを代入す るのである.文字列の走査については「先頭から順に~する」と書けばよい. 為の ⇒ ための // 「為」「時」「事」などの形式名詞はひらがなで書く. 隠されていた文字列を表示する ⇒ 元の平文を求める // 暗号の話なので, 「平文」 ( 「ひ らぶん」という.英語では plaintext)という熟語は,知っておいてほしい. 奇数番目の文字を…,偶数番目の文字を… // isbn13.c の論述例に引きずられたのかも しれないが,今回のプログラムでは,文字列の各文字に対して(偶数奇数に関係なく) 処理をしている. 逆のぼって ⇒ 遡って // 正しい漢字を知り,使おう. 及び ⇒ および // 「及び」「又は」 「従って」などの接続詞はひらがなで書く. 後 32 つ ⇒ 後ろ 2 つ // 「3」と「ろ」は書き分けよう. 最後から 3 行目が「24: Wakayama」と出力される ⇒ 最後から 3 行目が「24: Wakayama」となる // 主語と述語のペアを適切なものにすること. 指定された文字列がない場合 ⇒ 引数が指定されていない場合 // 「指定された文字列 がない」は,訳文調(例えば no string is specified の訳に思える)で意味が分かりに くい. 実行方 ⇒ 実行方法 // 「…の方法」の省略形は「…法」であって「…方」ではない. ただし「実行法」は,プログラミングの分野ではまず見られない. 処理の本体は 14-18 行目の for ループである // 違う. 処理の本体は,23 行目の for ループからである // どこまでかを明記すること. 処理の本体は,9 行目から 32 行目である // 対象とする行が広すぎる. 正しくなければ「This program may produce a strange output.¥n」と出力する ⇒ 正 しくなければ「This program may produce a strange output.」と出力する // 日本語 で説明する際には「¥n と出力する」とは言わない.1 文字出力のときに「¥n を出力す る」は一応問題ない.「改行文字を出力する」「…を出力して改行する」といった表現 でもよい. 対象はアルファベットの大文字あるいは小文字である ⇒ 対象は英字の大小文字であ る // 和集合に「あるいは」はおかしい(条件文として書くのなら,OR 条件なので「あ るいは」「または」となる).意味としては「大文字および小文字」であるが,ここは 合成して,字数を減らすべきである. 中心部は 27~32 行目. ⇒ 処理の中心部は,27~32 行目の for ループである. // 体 言止めにしない.少し修飾語を加えることで, 「自分だけのメモのような情報」が, 「論 述に欠かせないキーセンテンス」に変身する. 途中で p と c が一致しないとき ⇒ 途中で*p と c が一致しないとき // 比較する二つの 値の型を合わせる.式の中の「*p」は,ポインタ変数 p が指し示す値を意味する. 入力がなかったりすると ⇒ 入力がないときには // 「X したりする」と書くと, 「X の ほかにもすることがある」という意味を暗に含む. 入力した文字列それぞれをアルファベット順に ⇒ 入力した文字列の各文字をアルフ ァベット順に // 「文字列それぞれ」は,文字列が複数あって,その一つ一つという意 味になる.ここでは一つの文字列に対して,そこに含まれる一つ一つの文字を対象に 処理している. 入力した文字列を,1 つ戻した文字を表示し ⇒ 入力した文字列に対して,各アルファ ベットを 1 つ前の文字に変換して表示し // 「文字列」は戻せない.前後関係(順序関 係)があるのは文字である.複数の「を」が連続するとき,前のほうを「について」 または「に対して」とするのが効果的なこともある(多用は禁物だが). 配列 p ⇒ ポインタ p // ポインタとして宣言された変数は,ポインタである.配列とし て宣言された変数は, (第 8 回授業で取り上げるが,関数の仮引数として宣言する場合 を除いて)配列である. 復合 ⇒ 復号 // 「ふくごう」の同音異義語は「復号」と「複合」の二つである.違い は,辞書を引いて確認しておくこと. 文字を p に代入する // p はポインタ(char *型)なので,文字(char 型の値)を代入 することはできない. 文字コードが a~z を順番に登録している ⇒ 文字コードで a~z が連番になっている // 登録は,していない. 文字例 ⇒ 文字列 // 専門用語は正しく書けるように.例年,「再帰」と書くべきとこ ろを「再起」としてしまっているレポートの答案が見られる. 文字列に text ポインタを付ける ⇒ 文字列をポインタ変数 text で参照する // 初出の 変数名を書くときは,「ポインタ変数 text」(または「ポインタ text」)のようにする. 文字列全てを表現するプログラムである ⇒ 文字列全てを出力するプログラムである // 「表現」とすると,必ずしも出力しないことを意味する.なお,この授業では「出 力する」を使うように努めているが,「表示する」でもよい(細かいことを言うと,表 示しているのは OS やウィンドウシステムなどである.「…が表示される」なら,全く 問題ない). 2. 心がけ 白紙またはそれに近い答案をはじめ,前項で書くのが困難なものを取り上げる. 「1」と書いてから,線を書き加えて「2」としているのは,見苦しい.消しゴムで消 して書き直す習慣をつけよう. 「Z」 「z」を書くときには,中心(右上から左下に走らせたところ)を横切るように小 さな線を入れること.これで,「2」と区別される. プログラムの挙動を正しく理解すること. 箇条書きは,情報の整理に使う.論述をすべて箇条書きにするのは良くない. 限られた時間で必要かつ十分のことを書けるようになってほしい.授業(講義)の聞 き取り・書き取りから始めるとよい. 細かい知識を身につけても,試験で書けなかったら不合格だし,自分の作っているプ ログラムを友人や教員に説明できなかったら,プログラミング能力は伸ばせない.こ れからの授業をよく聴き,言葉で表せるよう練習してほしい. 試験でもこの形式で論述してもらうので,まずは授業でこちらが話す「音声」を「文 字」として記録する習慣をつけよう. 「受身からの脱皮」を心がけること. 字が汚いと,試験で解答の意図が読み取られず,減点される可能性がある.就職活動 で不利になるかもしれない.一文字一文字,丁寧に書くこと. 消し跡が汚い.必要なときにきれいに消せるような筆記具を選んで使おう. 書いてある内容は, 「論述」の前に,ノートなどで書くこと(メモ)のように思われる. 情報を組み上げること,論述にあたっては主語と述語を対応させることを,心がけて ほしい. 全出力を書くのは,答案スペースの無駄と言わざるを得ない.試験でも報われない. 主要なところのみを書くようにしよう. 筆記体とブロック体の混在は良くない.プログラムの説明で筆記体を用いる必要はな く,すべてブロック体のほうがよい.その際,(1)大文字・小文字の区別をつけること, (2)どこに空白があるのかを分かりやすく書くこと,が必須となる. 11月30日の授業で見かけたもの ✕scratchバッファでCファイル作成 間違い:Emacs起動 間違 起動 → 起動時のメッセージを消す 起動時 ジを消す → Cのプログラムを書く → ファイルに保存 正しい:Emacs起動 → Cのファイルを開く → Cのプ 「emacs Cファイル名」を ログラムを書く → 保存 実行してEmacsを起動 「c‐mode」にすれば,Cに合わせた するのでもよい 色付け表示,自動インデントなどをしてくれる. デ ✕ソースファイルの名前が「caesar2」 正しくは「caesar2.c」.ソースファイルと実行ファイ ルを区別しよう. 赤入れの読み方 • 情報処理Ⅲの授業は,毎週月曜日の2時限 Ⅱ 誤記 • にA103A601で行われている.11月3日は, 0 不要な記述 脱字 • A601で中間テストを実施した. ? 意味不明