(1.1.1) 金沢大学理工学域数物科学類の 2 年生を主たる対象とする。 内容は、C 言語によるプログラミングの初歩とアルゴリズムの初歩である。
(1.1.2) この建物(金沢大学学術メディア創成センター)は禁煙・飲食禁止である。
(1.1.3) この授業では「説明」はおこなわない。 各自でプリントを読んで「実習」をおこなう。 諸君の間で自由に相談などをしてよい。歩き回ってもよい。 私は諸君の間を回って質問を受けるので、 通路は空けておくように。
(1.1.4) 単位の認定は、出席と課題の提出状況でおこなう。 学生証をタッチすることを忘れずに。 課題は、出しただけではだめで、「OK」と認められなければならない。 決してむずかしくはない。
(1.1.5) プリントと全く同じものが、 学内からだけ見える(いわゆる)ホームページとしておいてある。 (URL は (1.5.4) を見よ。授業期間終了後はインターネットで公開する予定である。)
(1.1.6) 担当教員の研究室は自然科学5号館(旧:理学部)数学管理棟 383 号室。 氏名の「瀬」の字は実は正字なので一番右は「頁」ではなく 「刀」の下に「貝」だが、この授業では「瀬」。
(1.2.1) センターのアカウントには、 「コンテンツ ID」と「ネットワーク ID」の二種類がある。 この授業では前者を配布し、それを「この授業のアカウント」と呼ぶ。 必ずこのアカウントを使うこと。
101 → 01 | 201 → 21 | 301 → 61 | 401 → 76 102 → 02 | 202 → 22 | 302 → 62 | 402 → 77 103 → 03 | 203 → 23 | 303 → 63 | 403 → 78 104 → 04 | 204 → 24 | 304 → 64 | 404 → 79 105 → 05 | 205 → 25 | 305 → 65 | 405 → 80 106 → 06 | 206 → 26 | 306 → 66 | 406 → 81 107 → 07 | 207 → 27 | 307 → 67 | 407 → 82 108 → 08 | 208 → 28 | 308 → 68 | 408 → 83 109 → 09 | 209 → 29 | 309 → 69 | 409 → 84 110 → 10 | 210 → 30 | 310 → 70 | 410 → 85 111 → 11 | 211 → 31 | 311 → 71 | 411 → 86 112 → 12 | 212 → 32 | 312 → 72 | 412 → 87 113 → 13 | 213 → 33 | 313 → 73 | 413 → 88 114 → 14 | 214 → 34 | 314 → 74 | 414 → 89 115 → 15 | 215 → 35 | 315 → 75 | 415 → 90 116 → 16 | 216 → 36 | 117 → 17 | 217 → 37 | 118 → 18 | 218 → 38 | 119 → 19 | 219 → 39 | | 220 → 40 | | 221 → 41 | | 222 → 42 | | 223 → 43 | | 224 → 44 | | 225 → 45 | | 226 → 46 | | 227 → 47 | | 228 → 48 | | 229 → 49 | | 230 → 50 | | 231 → 51 | | 232 → 52 | | 233 → 53 | | 234 → 54 | | 235 → 55 |
(1.2.2) 数物科学類 2 年生は、 アカウント受領証の z21sh0 の右に、 上の表に従って、2 桁の数を記入せよ。(3 桁の数は名列番号である。)
それ以外の人は、そこは空けておくように。アカウント受領証と引き換えにアカウントを渡す。
(1.2.3) パスワードは、ほかの人に知られないように保管せよ。 貸し借りなどは厳禁である。 また、授業の際には忘れずに持参すること。 (万が一、忘れた場合は、私の手元にコピーがあるので教えることが可能である。)
(1.2.4) アカウント名は公開だが、 必要がなければやたらに教えないように。 (末尾の数字だけを変えて SPAM が送られてくるおそれがある。)
(1.2.5) アカウントには 50 枚分の印刷ポイントがついている。 それを越えて印刷したい場合は、アカンサス印刷システムを利用せよ。 (有料、個人負担。)
(1.2.6) アカウントの有効期限は来年の三月 31 日までである。
電源の入れ方・切り方、ログイン・ログアウト、基本操作、 (いわゆる)日本語入力の On/Off, テキストの範囲指定と移動・コピーは、 諸君のパソコンと同様なので省略する。
(1.4.1) キーボード左下の Windows キー(四辺形が四つ書かれている) を打ち、続いて「z:」(ゼッドに続いてコロン)と打ち、 Enter キーを打つと、 ファイル管理ソフト Explorer で z ドライブを開いた画面になる。 (タスクバー上のアイコンからも行ける。)
(1.4.2) z ドライブが、諸君のファイルを置くところである。 ここに保存したファイルは、次にログインしたとき、そのまま残っている。 ここ以外(デスクトップなど)に置いたファイルは、ログアウトすると消えている。
(1.4.3) Explorer の操作法をおさらいしておこう。
(1.4.4) ほかの人のファイルでも、許可のあるものは見ることができる。 「PC > (Z:)」を消して 「\\s17samba01\%username%」と打ち込む。 ここで、「%username%」は実際には相手のユーザ名である。 フォルダ maildir が見えるので、 左上の「表示」タブをクリック、「隠しファイル」の前の四角にチェックを入れる。 フォルダ .windows をダブルクリック。
(1.4.5) 【一度だけおこなう操作】 担当教員のアカウント z21sht01 から、 ファイル bookmarks.html を自分のところへコピーせよ。 (「\\s17samba01\z21sht01」と打ち込むことになる。)
(1.5.1) (いわゆる)ホームページを見るためのブラウザは、 ここでは Internet Explorer が推奨である。 .html ファイルのアイコンをダブルクリックすれば起動する。
(1.5.2) Edge, Firefox, Google Chrome もインストールされているが、 Edge は後述の KAINS Webmail のサポート対象外である。
(1.5.3) ブックマークは次にログインしたときには消えているので、 意味がない。
(1.5.4) この授業のページ http://wwwedu.ipe.kanazawa-u.ac.jp/~z21sht01/ には、このプリントと同じものが置いてある。 そこへ行くには、(1.4.5) でコピーした bookmarks.html を開けばよい。
(1.6.1) Windows キーを打ち、続いて「cmd」と打ちかかると、途中で、 画面に「コマンド プロンプト」が検索結果として出てくる。 ここで Enter キーを打つと、それが起動する。
(1.6.2) それは黒い画面であり、中に「Z:\>」のような文字列が出ている。 それを「プロンプト」と呼ぶ。 プロンプトの出ているところでコンピューターへの命令を打ち込むと、 それが実行され、終わるとまたプロンプトが出て止まる。 これのくり返しで作業を進める。
(1.6.3) プロンプトの出ているところで「↑」「↓」キーを押すと、 前に打ったものが出てくる。それを修正して実行することもできる。
(1.6.4) コマンドプロンプトを終了する際には、 プロンプトが出て止まっている状態であることが望ましい。
(1.6.5) 【練習】 ファイル一覧を見るコマンド dir を試せ。 プロンプトが出ているところへこの文字列を打ち込み、最後に Enter キーを押す。 また、現在時刻を知るコマンド time も試せ。
(1.7.1) 「テキストファイル」とは、 (いわゆる)全角文字と(いわゆる)半角文字だけを扱い、 文字の大きさなどは変えられないものをいう。
(1.7.2) テキストファイルを編集するためのプログラムが「テキストエディタ」である。
(1.7.3) 「メモ帳」は Windows 付属のエディタであり、 機能は限られているが、十分に使えるものである。 諸君のパソコンにもはいっているはずである。 .txt ファイルのアイコンをダブルクリックすれば起動する。
(1.7.4) この授業では、hello.c のような名前の、 .c ファイルを使う。これもテキストファイルである。 .txt ファイルとして新規作成し、 拡張子 .txt も込めて名前を変更する、その際、警告が出るが、 「はい」を押す。 .c ファイルを「メモ帳」で編集するには、 アイコンをダブルクリックするのではなく、 右クリックして「プログラムから開く」「メモ帳」とする。
(1.7.5) 【練習】 Explorer, メモ帳 の練習をせよ。 次のような変形に不慣れなものは、ここでマスターしておくこと。
| ↔ |
| ↔ |
|
(1.7.6) 【重要な注意】 (いわゆる)日本語を含むファイルをメモ帳で作る場合、めんどうだが、次の操作をして、 メモ帳の画面右下の UTF-8 を ANSI に変えないと、コマンドプロンプトとの相性が悪い。
この操作は、ファイルに(いわゆる)日本語が含まれている状態で、 一つのファイルにつき一度だけおこなえよい。 また、ANSI のファイルをコピーしたものはまた ANSI となる。
(1.7.7) よって、次のようにすると便利かもしれない。 (いわゆる)日本語を含むファイルを一つ作って UTF-8 から ANSI に変え、 それを !.c という名前で保存しておく。 ソースファイルを新規作成するときは、代わりに !.c をコピーして使う。 そうすれば、この操作をファイルごとにしなくて済む。(ソースファイルについては後述。)
このセクションと次のセクションは、本日やってもよいし、あとに回してもよい。
(1.8.1) KAINS Webmail はブラウザの中でメール送受信をおこなう。 そのページへは、 「総合メディアセンター実習室」のページからリンクがはってある。 あるいは、(1.4.5) でコピーした bookmarks.html を Internet Explorer で開く。 (学外からはそのままではアクセスできない。)
(1.8.2) よく理屈を理解している人を除いては、 一つのアカウント宛てのメールの読み書きは一つのメールソフトでおこなえ。 そうでないと、いろいろなところに受信メールが分散してしまう。
(1.8.3) この授業のアカウントに付随したメールアドレスは z21sh0??@mailedu.ipe.kanazawa-u.ac.jp である。この授業のレポート提出には必ずこのアドレスを用いよ。 (実際には「?」は数字。)
(1.8.4) 【始め方】 「ユーザー名」には z21sh0??@mailedu.ipe.kanazawa-u.ac.jp を、「パスワード」にはパスワードを入力。 その後「ログイン」を押す。 右上に「電子メール」「連絡先」「設定」 および「ログアウト」が出ている画面になる。
(1.8.5) 【注意】 Webmail を使っている間は、ブラウザの“戻る”ボタン、 “再読み込み”ボタンを押さないこと。
(1.8.6) 【最初に一度だけおこなう設定】 「設定」をクリック、「設定項目」の中の「ユーザーインターフェイス」をクリック、 「インターフェイスのスキン」の中の「Larry」の左の白丸の中をクリックして黒い点を入れる。 (すでに黒い点がはいっていればそのままでよい。) その下の「保存」をクリック。
(1.8.7) 【最初に一度だけおこなう設定】 左上の「設定」の下の「識別情報」をクリック。 「識別情報」と書かれた枠の中に <z21sh0??@mailedu.ipe.kanazawa-u.ac.jp> と出ている。 それをクリック。 右側に「識別情報を編集」が出る。 「表示名」には、自分の氏名を、(できるだけ)大学に届けてあるとおりの文字で打ち込む。 この名前が、メールを受け取った相手に見えるのである。 「保存」をクリック。 これで「識別情報」の下が次のように変わる。
田中美佐子 <z21sh0??@mailedu.ipe.kanazawa-u.ac.jp>
氏名にかな漢字変換で出にくい文字がある人は、 アカンサスポータルからコピーしてもよい。 氏と名の間は「空けない」「半角スペース一つだけ空ける」 「全角スペース一つだけ空ける」のどれでもよい。
(1.8.8) 【「連絡先」の登録】 右上の「連絡先」をクリック。 画面左から二つ目の枠の「連絡先」の下の「+」をクリック。 右に入力枠が現れる。 「名」「姓」とあるが、 その通りに入力すると「美佐子 田中」になってしまう。 「名」は空白のままにし、「姓」に「田中美佐子」のように記入する。 下の方の「電子メール」に (1.8.3) のメールアドレスを入力し、「保存」をクリック。
自分と、担当教員のアドレスを登録せよ。 (担当教員の名前は「岩瀬順一」、 「電子メール」は 「z21sht01@mailedu.ipe.kanazawa-u.ac.jp」である。 ブラウザの画面からコピーすれば簡単だし、間違う心配がない。 「様」や「先生」は不要。)
(1.8.9) 【メールを読む】 右上の「電子メール」をクリックするとメール一覧が出る。 メールをクリックすればそのメールが右に表示される。 ダブルクリックするとメール一覧は消え、そのメールが広い画面に表示される。 そこから戻るには、ブラウザの「戻る」ではなく Webmail の「戻る」アイコンをクリック。 メール一覧を更新するには、ブラウザの「更新」ではなく Webmail の「再読込み」アイコンをクリックする。
(1.8.10) 【メールを送る】 右上の「電子メール」をクリックし、 Webmail の「新規作成」アイコンをクリックする。 新しいタブが開き、作成画面となる。 「宛先」の右の枠をクリック。 左の「連絡先」の下の「個人の住所」をクリックすると、 「連絡先」に登録した個人名が現れる。 名前をダブルクリックすればそれが宛先にはいる。 「Cc」に入れるには、「宛先」の下の「写し(Cc)を追加」をクリック、 それから名前をダブルクリック。 自分には Cc を送る習慣をつけるとよいだろう。 「件名」を記入。 本文を書き終えたら、Webmail の「送信」アイコンをクリックする。
(1.8.11) 【メールに返信する】 メール本文が表示された状態で Webmail の「返信」アイコンをクリック。 あとは新規作成と同じである。
(1.8.12) 【終わり方】 右上の「ログアウト」をクリックする。
(1.8.13) 【練習】 設定を済ませたのち、 自分のアドレス((1.8.3) で述べたもの)にメールを送ってみよ。 その際、あて先は必ず「連絡先」を使って記入せよ。 それを受信し、それに返信してみよ。それを受信してみよ。
(1.9.1) 担当教員にメールを送れ。
(1.9.2) メール設定を正しくおこなったかどうかの確認であるから、点数にはならない。 一週間以内に、受け取ったメールには返信を送る予定である。 設定が間違っているとの返信を受け取った場合には、 (次回の)この授業の時間内に送りなおせばよい。
(1.9.3) ふだんよく使うメールアドレスを持っている人は、そこにも課題の Cc を送ってもよい。 そうしてあれば、私からの返信も、そのアドレスに Cc を送るので、 家などでも返信が読める。
(1.10.1) プログラムを書くに当たっては、 テキストエディタで「ソースファイル」を作成し、 「コンパイラ」でそれを「コンパイル」し、「実行ファイル」を作る (のが普通である)。
+----------------+ +----------------+ | ソースファイル | ----------------------------> | 実行ファイル | +----------------+ コンパイラでコンパイル +----------------+ (テキストエディタで書く) (これを動かす) (読んでわかる) (機械にしかわからない)
(1.10.2) 「実行ファイル」はコンピュータが読んで実行するもので、 人間が読んでもまずわからない。 「ソースファイル」は文字だけが並んでいるテキストファイルで、 訓練をつめば読み書きできるようになる。 「コンパイル」はここでは「変換する」「翻訳する」ぐらいの意味。 ソースファイルを書く際に用いる言語はいろいろあるが、 ここでは「C 言語」(シーげんご)を用いる。 C 言語で書かれたソースファイルを実行ファイルにコンパイルするコンパイラのことを 「C コンパイラ」とも言う。 C コンパイラの使い方は、この授業で扱う範囲では極めて簡単である。 よって、 これから学ぶことの中心は C 言語によるソースファイルの書き方である。
(1.10.3) 【注意】 コンピュータにおいて、 バックスラッシュ「\」と円マーク「¥」 は半角文字では同じものと思ってよい。 スラッシュ「/」は別物である。向きが違う。混同するな。 右手で文字を書く人にとって書きやすいほうがスラッシュ、 逆向きがバックスラッシュと覚えるとよい。
(1.11.1) 次の例はカーニハン/リッチー著・石田晴久訳 「プログラミング言語 C 第 2 版」(共立出版) (以下 K&R2 と略す)の §1.1 とほとんど同じである。 画面に「hello, world」と出力するもの。
#include <stdio.h> int main() { printf("hello, world\n"); }
(1.11.2) このプログラムについては、 「(いわゆる)ホームページからコピー & ペースト(以下「コピペ」という。)」 「キーボードから自分で打ち込む」 の両方で試せ。解説と注意は、(1.11.4) 以下に書いてある。 まずはコピペで試すとよいだろう。
(1.11.3) これを作成し、コンパイルし、実行する際の手順は次の通り。
失敗したときは 3 に戻ってやり直し。
(gcc は、GNU Project の一環として、無償で配布されている C コンパイラである。感謝しよう。)
(1.11.4) 1 行目。 きょうのところはこれは「決まり文句」と考えよう。 「#」は Shift しながら 3 のキーを打つ。 この記号は「シャープ」と呼ばれることが多いが、正式には「番号記号」という。 include は英単語そのままだ。 この次にスペースを入れているが、入れなくてもよい。 stdio.h を囲む 「<」、「>」は不等号をカッコの代わりに使っているもの。 Shift しながら、それぞれ、カンマ、ピリオドのキーを打つ。 「stdio」は英単語ではないので、つづり字に注意しよう。
(1.11.5) 2 行目は空行である。見やすくするためにおいたもの。意味はない。
(1.11.6) 3 行目と 5 行目も C プログラムに必ずおくもの。 「int main」の次にあるのは小カッコの開きと閉じ。 Shift しながら 8 と 9 のキーを打つ。 この次にスペースを入れているが、入れなくてもよい。 その次にあるのは中カッコの開き。 5 行目にあるのが中カッコの閉じ。 中カッコは、Shift しながら大カッコのキー(Enter のすぐ左にある)を打つ。 これらの中カッコは 4 行目を囲んでいる。つまり、 「int main() { ... }」と同じである。 こう書かずに上のようにする理由はそのうちわかってくる。 また、この中カッコの書き方は K&R2 とやや異なる。 この授業では一貫して私の書き方で教えるので、 すでに自分流のつけ方を編み出している人以外はとりあえずそれにならえ。
(1.11.7) よって、4 行目がこのプログラムのうちで最も意味のある部分ということになる。
(1.11.8) 4 行目の冒頭には空白(半角スペース)を 2 文字、置く。 それから printf... を打ち込む。 空白を置く理由はそのうちわかってくる。 このように行頭に空白を置くことを「字下げ」「インデント」という。
(1.11.9) printf() は元々用意されている「関数」である。 「プリントエフ」と読むことが多いかと思う。 関数の原語は function で、ここでは本来の意味である「機能」に近い。 この関数の機能は後ろの小カッコの中の文字列を印字する(=画面に書く) ことである。 文字列は二重引用符「" "」 (Shift しながら 2 のキーを打つ)で囲む。 ここでは印字される文字列に「\n」が含まれている。 「\n」はこの二文字で「改行」を意味する。 すなわち、これを画面に書くとそこで改行する。 よって、「hello, world\n」を画面に書くということは、 「hello, world」を画面に書いて最後に改行する、 ということになる。
(1.11.10) 4 行目の最後にはセミコロン「;」がついている。 C 言語では文はセミコロンで終わることになっているので、忘れるな。 また、この「セミコロン」などの名称もこの機会にきちんと覚えよ。
(1.11.11) 練習: 出力される文字列を別のものに変えて、コンパイル、実行してみよ。 たとえば「"hello, world\n\nhello, world\n"」 とするとどうなる? (いわゆる)日本語を含めると、どうなるか? (もしもめちゃめちゃな文字列が出力された場合、(1.7.6) を忘れている可能性が高い。)
(1.11.12) 練習: 自分の氏名を出力するプログラムを書いてみよ。 その際、 「ソ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆」 を含む名前の人は要注意。 これらの文字のあとに \ を置かねばならないのが、 ここの gcc での約束である。 たとえば「十郎」と出力させたければ printf("十\郎"); としなければならない。 これは、gcc が十分に(いわゆる)日本語に対応していないことが原因である。
(1.12.1) 以下では、ファイル名は適当に決めよ。 C 言語のソースファイルは「.c」で終わる名前でなければならない。
(1.12.2) 次のプログラムは、まずはコピペして実行してみよ。 「2 たす 3 は 5 です.」と画面に書くだけのプログラムである。
(1.12.3) 細かい説明は (1.12.4) 以下に書いたが、1行目の 「/*」と「*/」とで囲まれた部分だけ先に説明する。 これはコメントである。 何を書いてもコンパイルしてできる実行ファイルには関係ないので、 自由にメモを書くことができる。 ここでは、何をするプログラムか、いつ誰が作ったかを書いている。 その下のコメントは、以下で説明する際の便宜のためにつけたものである。 これらは諸君は打ち込まなくてよい。
/* たし算 1990-04-28, written by Iwase */ #include <stdio.h> int main() { int a, b, s; /* 変数の宣言 */ a = 2; /* 代入 */ b = 3; s = a + b; printf("%d たす %d は %d です.\n", a, b, s); }
(1.12.4) 「変数の宣言」の行。 変数を使う場合、前もって「宣言」しておく必要がある。 ここでは「変数 a, b, s は int 型」と宣言している。 変数名には小文字を使うのが普通である。 「int 型」は整数のみを格納できる「整数型」の一つで、 この名前は整数 integer に由来している。 私は「イントがた」と読んでいる。 変数の宣言はこの位置(i.e. main() が始まってすぐのところ) でおこなわなければならない。 その次には空行をおくと見やすくなる。 なお、中カッコの中の行は、空行以外、すべて字下げする。
(1.12.5) 「代入」の行。 「a = 2;」は、「a は 2 に等しい」という平叙文ではなく、 「a に 2 を代入せよ」という命令文である。 その下の二行も同様。 プログラムは特に指定しなければ上から下へと実行されるので、 s = a + b; を実行したあとの s の値は 5 になる。 なお、 「=」は Shift しながら「-」のキー、 「+」は Shift しながらセミコロンのキーを打つ。 「a = 2;」の 「a」「=」「2」の間にはスペースを置いても置かなくてもよい。
(1.12.6) printf 文の行。 記号「%d」は、順に後ろの変数の値に置き換わって画面に出力される。 ここでは、 一つめの %d は a の値で、 二つめの %d は b の値で、 三つめの %d は s の値で置き換わる。
printf("%d たす %d は %d です.\n", a, b, s); -- -- -- - - - | | | | | | +-------|-----|------------+ | | +-----|---------------+ | +------------------+
よって、出力は「2 たす 3 は 5 です.」のあと改行、となる。 「%」は Shift しながら 5 のキーを打つ。 (句点「。」の代わりに半角のピリオドを使っているのは単に趣味の問題である。)
(1.12.7)
(1.12.8) 練習: 出力の文の二重引用符の間の文字列からスペースを除去し、 「printf("%dたす%dは%dです.\n", a, b, s);」 としたら出力はどう変わるか。 「printf("%d%d%d\n", a, b, s);」としたらどうなるか。
(1.13.1)
#include <stdio.h> int main() { int a, b; printf("数を入れてください.\n"); scanf("%d", &a); /* 数の入力 */ printf("もう一つ数を入れてください.\n"); scanf("%d", &b); printf("%d たす %d は %d です.\n", a, b, a + b); }
(1.13.2) 「数の入力」の行。 ここでプログラムは止まってキーボードからの入力を待つ。 関数 scanf() はそのための関数である。 私は「スキャンエフ」と読んでいる。 変数名 a の前に & がついて &a となっていることに注意。 なぜ & が必要かは、いまは説明しない。 & は Shift しながら 6 のキーを打つ。
(1.13.3) 練習:(1.12.7) で説明した、 割り算をする演算子「/」を試すプログラムを書き、 余りは切り捨てられることを確認せよ。 また、 余りを求める演算子「%」を試すプログラムを書け。 商と余りの両方を出力させるのもよい。 そのプログラムに負の数を入力するとどうなるか? 割る数・割られる数の両方で試してみよ。
(1.13.4) 練習:(1.12.7) で説明した、 演算子の優先順位を確認するプログラムを書け。 たとえば、a + b * c では乗法が先に計算されることを確かめる、など。
(1.13.5) 練習: 0 で割ったら何が起こるか確かめよ。 (答え:ここのシステムでは、しばらく止まるだけ。)