[お知らせ] vnc を利用して、栗野の作業(Note-PC の)画面が見れる IP : 10.8.154.222 PW : vnc-2018 VcXsrv のインストール インストール作業を、講義を聴きながらやっておく 後で、使い方を説明する ディスクトップに「XLaunch」というアイコンができているので起動 => いろいろきいてくるが、基本[次へ]でよい => 右下に「小さい Xアイコン」ができる => ubuntu から GUI (Window や画像) を利用するプログラムが使えるようになる ubuntu で GUI を利用するアプリをインストールする => ubuntu で「sudo apt install x11-apps」で、GUI 関係のソフトをインストール パスワードは「soft」 => インストールは一回だけやればよい GUI を利用する場合 export DISPLAY=:0.0 => ubuntu を起動するたびに行う必要があるが、次の命令実行すると、 次回からは不要 echo export DISPLAY=:0.0 >> ~/.profile [前回の復習] 前回まで プログラムとは何か ? => 作業手順を記述したもの 例: Hello World プログラム 「画面に『Hello, World』というメッセージを出力しないさい」という命令を記述したプログラム # printf ( "Hello, World\n" ); という命令によって、画面にメッセージが出力される プログラミング言語とは何か => プログラムを記述するための記述言語 => プログラムは、人間とコンピュータのコミュニケーション手段の一つ プログラムを(人間にとって)書きやすいように工夫されている いろいろ => 計算機向き(効率が良い):機械語.アセンブラ / 人間向き(わかりやすい).. 計算機は、最終的に機械語しか理解できない <= 他の言語で記述されたプログラムは、機械語に翻訳されないといけない => この翻訳作業を「コンパイル」 コンパイルの方法 ubuntu で、cc コマンドを利用して、コンパイルする C 言語 プログラミング言語のひとつ/ソフトウェア概論では、C 言語でプログラム作成 ソフトウェア概論の目標は、「C 言語で(いろいろな)プログラムが作れるようになる」 C 言語でいろいろなプログラムを作る (自分の目的にそった結果を得るために..それに対応した..)表現方法を学ぶ 0. hello.c (いろいろなおまじないがあるが => 後述) 1. printf を使うと、メッセージが出力できる 2. 命令を並べると、その並び順に命令が実行される(順接) sample-003.c 3. 命令の並びに、名前を付ける事ができて、名前を指定するだけで、それらの命令列が実行できる => 関数の定義と、関数利用(関数呼び出し) sample-004.c 関数 kyoku_1 と 関数 kyoku_2 では、いずれも、三つの命令を実行していて、 1 つめと 3 つめは同じだが、2 つ目だけが異なる -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_1(void) { uta(); printf ( "後の山に 棄てましょか\n" ); ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_2(void) { uta(); printf ( "背戸の小薮に 埋けましょか\n" ); ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- => この二つの関数を比較すると、2 つ目の命令のメッセージ部分が異なる => 異なる部分を「変数」にしてしまう (例えば「X」にしてしまう) -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_1(void) { uta(); printf ( X ); ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_2(void) { uta(); printf ( X ); ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- => 結果的に同じ表現(命令列)になる -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_123(void) { uta(); printf ( X ); /* 変数 X が利用されている.. */ ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- => 共通にした表現(命令列)になる関数を新しく作る(名前を kyoku_123 とする) -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_123(char *X) { /* 変数 X が利用されていることを引数の所に記述 */ uta(); printf ( X ); /* 変数 X が利用されている.. */ ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- => 引数 (関数の後ろの 「()」の中)に、利用する変数(今回の場合は「X」)を書き、 さらに、その前に(おまじないとして..)「char *」をつける => 結果的に、(「X」という一つの)引数付きの関数を作る事ができる 4. 関数には、引数を指定する事ができて、同じ関数だが、引数を変更する事により、 異なる結果を得る事が可能 # 異なる結果をえる、似た関数を、引数をつかって一つにまとめる 引数付き関数の呼び出しの場合は、「関数名(変数にいれたいもの);」という形で呼び出す。 sample-005.c 関数 kyoku_1 の所で、kyoku_123 をよびだしている。 この時に kyoku_123 の後ろには、kyoku_1 と同じ振る舞いをするように、 変数 center に入るものを指定する。 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_123 ( char *center ) { /* kyoku_1, kyoku_2, kyoku_3 をまとめた */ uta(); printf ( center ); /* kyoku 1 〜 3 で異る部分を変数 (center) にした */ ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- void kyoku_1(void) { uta(); printf ( "後の山に 棄てましょか\n" ); ieie(); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- <= kyoku_1 がなってほしい内容(kyoku_1 の本来の定義) => kyoku_1 と kyoku_123 を比較すると、 「center」と「"後の山に 棄てましょか\n"」が異なる # これは「当然」で # kyoku_1 と kyoku_2 の違い # [kyoku_1] # +---------------------------------------+ # |uta(); | # |printf ( "後の山に 棄てましょか\n" ); | # |ieie(); | # +---------------------------------------+ # [kyoku_2] # +-------------------------------------------+ # |uta(); | # |printf ( "背戸の小薮に 埋けましょか\n" ); | # |ieie(); | # +-------------------------------------------+ # [kyoku_123] # +-------------------------------------------+ # |uta(); | # |printf ( center ); | # |ieie(); | # +-------------------------------------------+ # => # kyoku_1 と kyoku_2 の違う所を変数 center にして kyoku_123 を作った # kyoku_1 と kyoku_123 の違いは、center の部分 # => # kyoku_123 の center が "後の山に 棄てましょか\n"であれば、 # kyoku_123 は kyoku_1 と同じ命令列になる kyoku_123 ( "後の山に 棄てましょか\n" ) <=> kyoku_1() => 関数の引数付き呼びだし 5. 引きつき関数 動作の変化が、引数の変化と連動している(連続な感じ) sample-005.c の kyoku_1, kyoku_2, kyoku_3 は連続な感じ => 引数の違いによって、動作の違いが説明できる kyoku_4 は、kyoku_1,2,3 に比べて変化が不連続な感じ まったく異なる行動をしているように見える 条件分岐 条件の成立、不成立によって、(まったく)異なる命令をする構文 => if 構文 (文法:書き方) if ( 条件 ) { 条件が成立した時の命令 } else { 条件が不成立の時の命令 } # if 構文を利用すると、状況によって、まったく異なる二つの命令列のどちらか一方を選んで、実行する事ができる 「条件」: 「!strcmp(一つ目、二つ目)」 もし、一つ目と二つ目が同じ文字列なら、成立する そうでなければ、不成立 => 「場合分け」が必要場合に、if 構文が利用される 例: 割り算をする場合は、分母が 0 の場合とそうでない場合に分ける必要がある sample-006.c の説明 6 行目に「おまじない(#include )」を追加 => strcmp を使う場合に必要 56 行目に「if 構文の利用例」がある C 言語では(どうゆうわけだか..) 文字列に +1 すると、先頭文字が欠ける => 文字列の長さが 1 だけ減る