プログラミング基礎演習 第 1 回プログラミングとは
演習室の環境 VMware Horizon のサーバにログイン Ubuntu を選択 ログイン名とパスワードは共通 まだホームが共有されていない 今日作ったファイルは 自分宛のメールで送ったり USB メモリを使うなどして 保存する 近日中に設定される予定
本演習で学ぶ内容が主に対象とする範囲 プログラミング学習の段階 語学に例えると 命令が実行される様子の理解 個々の命令の意味の理解 隔たり 一連の命令の並びが 全体として何をしているか理解する 計算機にさせたい作業の全体を命令の並びで表現する 隔たり 協働作業で大きなソフトウェアを作る ( ソフトウェア工学 ) 文法や単語を覚える 長文の読解長文の作文 共著で本を書く 2017.04.12
本演習について そもそもプログラミングなるものの基礎から 最低限の UNIX の使い方を含む C 言語のプログラミングを基礎から学ぶ プログラムを構成する個々の要素を学ぶ 要素を組み合わせる手順の構成方法を学ぶ 小さなプログラムから大きなプログラムへ 学期末には 数百行程度のプログラムを独力で書けるように プログラミングを楽しんで欲しい 最低限楽しむためにもトレーニングが必要
本演習の成績評価について 出席 (20%) と演習 (30%) 出席を毎回確認する 出席確認が演習問題のこともある 最終課題 (50%): レポートを課す 時間をかけて少し大きめのプログラムを書く 期末試験は実施しない
本演習における心得 他人に説明することは 自分の訓練になる 分からないことがあったとき 1. まず自力での解決を試みる 2. 自分で分からなければ 周りの友人に聞く 聞かれた側の訓練にもなる 3. それでも解決しなければ寺方さんか山口に聞く とにかく試してみる 間違いから学べ 学生として当然の姿勢 プログラムを動かしてみて分かることが多い 面倒臭がらずに小さなプログラムをたくさん試す システムを破壊するようなプログラムは簡単には書けません
授業の資料の紹介 本演習用の特設 Web ページ : http://sun.ac.jp/prof/yamagu/2017fpp/ 練習問題を用意する ( 予定 )
今日のお題 プログラミングとは プログラミングに使う道具 C 言語の言語構造 : ブロック 文字列を表示する命令 :printf
プログラム プログラミング コード 計算の手順を表現したものをプログラムと呼ぶ プログラムを書くことを プログラミングと呼ぶ 計算手順を決めて 表現することを言う データを表現する構造を決めることも含む プログラムの一部 ( 断片 ) をコードと呼ぶことがある ) すでに決められたデータ構造に従ってデータを記述することを (HTMLの記述などを) プログラミングと呼ぶことには違和感がある
プログラミング言語 プログラムを記述するための言語 言語なので文法がある C 言語はこちらのタイプ CPU が直接解釈できるのは機械語だけ 機械語は人間には分かりにくいので さまざまなプログラミング言語が開発された プログラムを機械語に翻訳してから 実行する方法 プログラムを読みながら解釈して実行するプログラム ( インタプリタ ) を使う方法
C 言語 比較的古い言語 いまだに現役 多くの言語が C 言語を参考にして作られている 手順の考え方や文法が似た言語がたくさんある 将来的には 手順の考え方 が異なる言語も学ぶとよい C 言語のプログラムは 実行できる形式 ( 機械語 ) に翻訳してから実行される 実行前にコンパイルという操作を必要とする 機械語への変換 用意されているプログラムとの結合を行う
プログラミングは伝える技術 考えたことを計算機が解釈できるように表現する技術 人間には相手の意図を汲み取る能力がある人に伝えられないようでは考えがまとまっていない 計算機は人間の意図を汲み取らないプログラムに書かれた通りに動く 正しければ 人間には不慣れな考え方でも動く動くものが説明できないのは 修行不足 Computational Thinking を鍛えよう
プログラミングに使う道具 ターミナル : 計算機への入出力をする ubuntu では Ctrl-Alt-t で起動する 実行ファイルを指定すると それを実行する シェル : 命令の実行を指示するインタフェース ターミナルを起動すると 最初はシェルが動いている 命令実行中は ターミナルへの入出力が実行中の命令に取られて シェルは命令の終了を待っている 命令の実行が終了するとシェルに戻る エディタ : テキストファイルを作成 編集する 本演習では emacs を使う コンパイラ : コンパイルする 本演習では gcc を使う
UNIX のシェルコマンド cd [ 移動先ディレクトリ ] カレントディレクトリを変更する 省略するとホームディレクトリに移動する mkdir 新規のディレクトリ名ディレクトリを作成する ls [ 閲覧するディレクトリ ] ディレクトリにあるファイルを一覧する 省略すると カレントディレクトリのファイルを一覧する pwd 現在のディレクトリ名を表示する emacs [ 編集するファイル名 ] emacs ( テキストエディタ ) を起動する gcc コンパイルするソースファイル名 gcc (C 言語コンパイラ ) を起動する
emacs のコマンド Ctrl-x Ctrl-s Ctrl-x Ctrl-c Ctrl-g Ctrl-z Ctrl-p Ctrl-n Ctrl-b Ctrl-f : 上書き保存 : 終了 : 入力途中のコマンドの取り消し : emacs ウィンドウのアイコン化 : カーソルの上移動 : カーソルの下移動 : カーソルの左移動 : カーソルの右移動 emacs がおかしくなったら とりあえず Ctrl-g 手をホームポジションから動かさずに作業できる 他にもいろいろあるが とりあえず これだけ覚えよう
やってみよう 1. ターミナルを起動する 2. emacs を起動する : シェルへ emacs hello.c & 3. 右のプログラムを入力する 4. 保存する : emacs で Ctrl-x Ctrl-s 5. コンパイルする : シェルへ gcc hello.c と入力する と入力する エラーが無ければ a.out という実行ファイルが作られる 6. 実行する : シェルへ./a.out と入力する #include <stdio.h> main() { プログラムが実行されて hello と表示される } この & は 命令をシェルの背後 (background) で実行せよ という指定 printf("hello\n"); プログラム例 カレントディレクトリにある a.out を指定
よくある間違い 1 行目の <> の中は stdio.h studio とかになっていないか? 3 行目の最初は printf print とかになっていないか? #include <stdio.h> main() { printf("hello\n"); } プログラム例 3 行目の最後に ; ( セミコロン ) を忘れていないか? 間違っていたら emacs で修正して 保存し コンパイルして実行してみること
プログラム例の解説 以下で標準入出力の関数 (printf) を使うので それがどんなモノであるかが書かれたファイルを読んでおく main(){...} は main の定義 この {} 内が実行される #include <stdio.h> main() { printf("hello\n"); } printf は表示をする命令 ( 関数 ) 丸括弧の中に表示したい文字列を与える 文字列は " ( ダブルクォート ) で括って表す \n は改行を表す これで 1 つの文字として扱われる
空白や改行 プログラムを構成する字句 ( 意味のある文字列 ) の間の空白や改行は無視される ただし 英数字から成る字句がつながってしまう場合には一つ以上の空白や改行が必要 いくつ入れてもいいし 入れなくてもよい 読みやすくなるように入れようこれ大事 printf や main は一つの字句なので これらの途中に空白や改行を入れてはいけない 文字列 (" から " まで ) も一つの字句 文字列中の空白や改行は無視されない ただし # で始まる行は 行単位で意味を持つので 途中で改行してはならない
main C 言語のプログラムでは 必ず一つ main の定義が必要 実行の起点になる 一つだけ必要
ブロック {} で括られた範囲をブロックと呼ぶ ブロックの中に並べられた命令 ( 文 ) が順番に実行される
文法 プログラムは決まった形式で書かれる この形式を文法と呼ぶ 本演習では 文法についての厳密な話をしない パターンとして紹介する ただし 以下の 3 つが区別されることは覚えておくとよい 式 : 値を表す 文 : 実行される何らかの動作 計算を表す 宣言 : プログラム中で使うものを明示する 例 ) ブロックは次のようなパターンをいう { 宣言 宣言文 文 } 0 個以上の宣言 0 個以上の文
文法 ( の一部 ) の例 識別子とは 名前のこと 英字で始まる英数字の列は識別子 ( ただし予約されているものを除く ) 文字列は式識別子 ( 式, ) というパターンも式式 ; というパターンは文 printf は識別子 "hello\n" は文字列 これは式 printf("hello\n") は式 printf("hello\n"); は文
複数の printf を実行させよう printf の直後に丸括弧の括りがあり 丸括弧の中に文字列がある 文字列は " で括る 文字列の中身は自由に決めてよい printf( 文字列 ) の直後にセミコロンが必要 printf( 文字列 ); を {} の中に いくつか並べてみよう プログラムを書き換えたら コンパイルして実行してみること 今後はこの指示をしない
特殊な文字 ( エスケープシーケンス ) \ に続く文字と合わせて 特殊な文字を表す例 ) \n : 改行 \" : ダブルクォート \\ : バックスラッシュ このような特殊な文字を表すための文字の並びをエスケープシーケンスと呼ぶ
手続き型プログラミング言語の考え方 function 単一の機能を持つ命令が いくつもある 例 )printf: 表示する機能を持つ 制御構造を使って組み合わせる 条件分岐 ( 第 3~4 回 ) 繰り返し ( 第 5~6 回 ) ( 明示されないが ) ブロックも制御構造の一種 関数 ( 第 7 回 ) も制御を表現できる 次回は変数 この授業では あまりたくさんは紹介しない 変わる値がないと 意味のある条件が書けない