プログラミング演習I 2002年度
目標 コンピュータに慣れる UNIXの基礎的な操作 メール、Web C言語によるプログラミングの基礎 蟹は甲羅にあわせて穴をほる
演習の流れ ログイン・ログアウト ファイル・ディレクトリ Unix メール・HTML C言語入門
UNIX 1969年 米国AT&Tベル研 マルチタスク・マルチユーザOS ほとんどC言語により記述 UNIXの開発を目的としてC言語を開発
パスワード 忘れないこと 大文字・小文字・数字を混ぜる 破られないこと 悪意ある者は英単語・名前などの辞書を活用する
ファイル 情報のまとまり 講義ノート メモ 取扱説明書 写真 システムのファイル プログラムファイル テキストファイル データファイル 他ユーザのファイル 自分のファイル 情報のまとまり 講義ノート メモ 取扱説明書 写真
ディレクトリ ファイルの整理整頓 (木) ファイルは葉、ディレクトリは節 ROOT 文書 講義ノート 取扱 説明書 画像 電磁気 ノート ファイルの整理整頓 (木) ファイルは葉、ディレクトリは節 講義ノート 取扱 説明書 画像 電磁気 ノート 憲法 洗濯機 取説 テレビ
ディレクトリの木構造 システム / cd .. home home usr cd /usr/bin bin bin a00500 ホームディレクトリ
UNIXのコマンド 英単語を省略したもの 省略の仕方に規則なし /bin, /usr/bin, /usr/local/bin などに保存 cd: Change Directory /Current Directory ls: LiSt pwd: Print Working Directory mkdir: MaKe DIRectory rmdir: ReMove DIRectory cp: CoPy
ファイル・ディレクトリの操作 cd dir0 : ディレクトリdir0への移動 cp file0 file1 : file0をfile1としてコピー mkdir dir0 :dir0を新しく作成 ls : ファイル・ディレクトリ一覧
特別なディレクトリ 現在地(カレントディレクトリ): . 親: .. ホームディレクトリ:
オンラインマニュアル man 各種マニュアル(MANual) man cd コマンドcdのマニュアルの表示 man man manのマニュアル SPCで次ページ、qで終了
UNIXとデバイス デバイス:機器 UNIXでは全ての機器の操作をファイル経由で行う /dev/
デバイスファイル / home usr dev a00500 a00501 stdout fd0
デバイスファイル stdin キーボードからの入力 stdout ディスプレイへの出力 (何文字かたまってから出力) (何文字かたまってから出力) stderr ディスプレイへのエラー出力 (一文字ずつすぐに出力)
テキストファイルの表示 テキストファイルの内容をstdoutに書き込む cat (conCATinate) cat file0 :file0のstdoutへの書き込み cat file0 file1 : file0 file1をつなげて書き込み cat > file1 : stdinの内容をfile1に書き込み cat file0 > file1 : file0をfile1に書き込み
テキストファイルの編集 emacs, muleの利用 テキストファイルの編集 統合環境(メール、コンパイル、シェル。。) マウスを使わない(でも済む)
バッファ モード ミニバッファ バッファ #include main(){ } a000% cd a000% emacs
ABC メモリ ABC キーボード ABC ハードディスク
ABC メモリ ABC キーボード C-x C-s 保存 filename.txt ABC filename.txt ハードディスク
インターネット TCP/IPを使った、唯一最大の国際的「ネットワークのネットワーク」 米国高等研究計画局 ARPA (Advanced Research Project Agency) (1971) TCP/IP (Transmission Control Protocol/ Internet Protocol) OSやメディアやネットワークモデルに依存しない
WWW World Wide Web 欧州核物理学研究所 ドキュメントの埋め込み
HTMLとブラウザ Hyper Text Markup Language タグによる修飾 ブラウザ:HTML文書の閲覧 mosaic 米イリノイ大学(1993) →大学当局の有料化反対・独立 → Netscape Communication 社 イリノイ大でも研究継続 →Microsoftへ→ Internet Explorer
URL(文書の位置) http://www.yamagata-u.ac.jp/ コンピュータ名 プロトコル(ファイルへのアクセス方法) 他に ftp: https: gopher: mailto:など コンピュータ名 http://www.yamagata-u.ac.jp/
HTTP (WWWサービス用プロトコル) 「ファイルの要求」と「転送」だけの単純な プロトコル
公開 公の場である 公開内容に対する責任 閲覧内容の「管理者による管理」 閲覧内容の自己管理
タグ(どのように見せるか) <HTML> <HEAD> <TITLE> ページの名前など </TITLE> </HEAD> <BODY> 公表したいことをここに書く。 </BODY> </HTML>
電子メール ネットワーク経由の郵便 好きな時間に読み書き 同時に複数の相手へ 第三者から閲覧の可能性
チェーンメール 人からのメールを大勢に転送 厳禁 多人数への情報伝達はWWWで
ウィルス アプリケーションを利用したシステムの破壊 要注意
マナー 半角かなは使わない 極端に長いメールは出さない subjectに日本語は使わない ウィンドウズアプリケーションを前提としない
メール 差出人 メールサーバ ホームディレクトリ ホームディレクトリ
メールアドレス ユーザID hontani@eie.yz.yamagata-u.ac.jp メールサーバ名
メールアドレス hontani@eie.yz.yamagata-u.ac.jp 学科. 米沢キャンパス. 山形大学. 学術. 日本
メールの構造 ヘッダ 本文 To: Subject: my first email! Reply-to: --- こんにちは。 さようなら。 タイトル あて先 ヘッダ To: Subject: my first email! Reply-to: --- こんにちは。 さようなら。 hontani@eie.yz.yamagata-u.ac.jp 本文
メールの送受信 相手 メールサーバ emacs の利用 ホームディレクトリ ホームディレクトリ
メールの送信 受取人 メールサーバ ホームディレクトリ ホームディレクトリ
C-x m C-c C-w C-c C-c ---Mule: *mail* emacs Sending … done To: Subject: Reply-to: a000@eiefs.yz.yamagata-u.ac.jp ---text follows this line--- ---Mule: *mail* hontani@eie.yz.yamagata-u.ac.jp progI メールの本文 C-c C-w --- 本谷秀堅 tel. 0238-26-3332 C-c C-c
メールの受信 差出人 メールサーバ ホームディレクトリ ホームディレクトリ
Esc-x rmail Date: Thu, 10 May 2001 From: a00500 To: hontani Reply-to: a00500@eie.yz.yamagata-u.ac.jp Content-type: text Content-Length: 151 メールの本文 --- 本谷秀堅 tel. 0238-26-3332 n: 次のメール p: 前のメール SPC: スクロール h: メール一覧 r: メールに返信 f: メールの転送 q: 終了 M-x rmail
シェル ユーザとOSとの仲介役 a00500@eiew00% ls abc abe kbe zze a00500@eiew00% ls a* a00500@eiew00% la *be abe kbe a00500@eiew00% ls *e abe kbe zze a00500@eiew00% ls abc abe kb kyz a00500@eiew00% ls k* kb kyz a00500@eiew00% la k? kb a00500@eiew00% ls k?? kyz
アクセス権モード ファイル・ディレクトリの公開の仕方 読み・書き・実行 自分・同一グループ・他人
アクセス権モード 自分 他人 同一グループ 読み ○ ○ × 書き ○ × × 実行 × × ×
グループ staff b00 a00 a01 hiranaka tamura kohda kobayashi … a00500 a00501
rwx rwx rwx アクセス権モード r: 読み w: 書き x: 実行 a00500@eie00% ls -l -rw-r----- 1 a00500 a00 316 5月10日 rwx rwx rwx r: 読み w: 書き x: 実行 自分 自グループ 他人
アクセス権モードの変更 chmod o+r filename r w x u g o 誰に なにを + -
テキストファイルに実行権 シェルが内容をOSに渡す
mkdir newdir file.txt file.txt
a00500@eiew% ls -l -rw-r--r-- file.txt file.txt 読み書きのみ可 実行は不可
a00500@eiew% ls -l -rw-r--r-- file.txt a00500@eiew% chmod u+x file.txt -rwxr--r-- file.txt a00500@eiew% ./file.txt 実行を許可 file.txtに書かれてることを実行 (mkdir newdir)
コマンド コンピュータに動作を命令 機械語 希望する動作をさせる命令を作成
プログラミング言語 希望する動作のリスト:プログラム プログラミング言語(C、FORTRAN、、、) 人間が読める
C言語 1972年 米ベル研 Dennis M. Ritchie 関数型 UNIX記述用 文字数自由 書式自由
コンパイル 翻訳 : プログラミング言語 → 機械語 Cコンパイラ : C言語を機械語へ cc (C Compiler) 翻訳 : プログラミング言語 → 機械語 Cコンパイラ : C言語を機械語へ cc (C Compiler) gcc (GNU C Compiler)
処理の流れ 作業ディレクトリの作成 プログラムソースの作成 コンパイル 実行 デバッグ
プログラムソース コンピュータに実行させたい命令の記載 emacsなどのエディタを利用 ファイル名は ***.c 関数の寄せ集め 関数の末尾に必ず ; をつける
関数 入力と出力 y=f(x)
ヘッダファイルの 組み込み #include <stdio.h> main(){ printf( “Hello, world\n” ); } main関数 最初に実行される関数 セミコロン 文章の末尾 printf関数 画面に表示するための関数 あらかじめ用意されている #include <stdio.h> main(){ printf( “Hello, world\n” );}
コンパイル 人が読める言語から機械語への翻訳 コンパイラ Cコンパイラには多数ある cc: C Compiler gcc: Gnu C Compiler 翻訳家によって翻訳結果も異なる 得手不得手
% ls hello.c % gcc hello.c a.out hello.c % ./a.out Hello, world %
デバッグ 誤りの修正 プログラミング=デバッグ パニックにならないこと エラーメッセージを読むこと
変数の宣言 #include <stdio.h> main(){ int i; i = 3 * 2; printf( “i=%d\n”, i ); } 上から実行
変数の宣言 使う変数をあらかじめ宣言 整数用、実数用など使い分け #include <stdio.h> main(){ int i; i = 3 * 2; printf( “i=%d\n”, i ); } 使う変数をあらかじめ宣言 整数用、実数用など使い分け
変数の宣言 結果を格納するための「メモリ上の領域」 整数用、実数用などでサイズが異なる int : 整数 double : 実数
変数の宣言 メモリ i i=6 i=6 a.out #include <stdio.h> main(){ int i; printf( “i=%d\n”, i ); } プロセッサ キーボード a.out 表示 a.out calc.c ハードディスク
変数の型 同じ値が違う意味 メモリ: 記録できる場所が1byteずつ1列に並んでいる アドレス: 先頭から何番目か
unsigned char a=1; unsigned char b=2; unsigned char c=20; unsigned short int d=785; unsigned long int e=999; 0000 0001 1 0000 0010 2 0001 0100 3 0000 0011 4 0001 0001 5 アドレス 0000 0000 6 0000 0000 7 0000 0000 8 1110 0111 9 0000 0111 10 11 12 13 14
変数の型 char 1byte 文字など short 4byte 整数 int 4byte 整数 long 4byte 整数 double 8byte 実数 unsigned 0以上の数のみ
signed と unsigned char -128 から127まで unsigned char 0から255まで 0000 0000 0 0 0000 0001 1 1 0000 0010 2 2 0000 0011 3 3 … 0111 1111 127 127 1000 0000 -128 128 1000 0001 -127 129 1000 0010 -126 130 1111 1111 -1 255 char unsigned char char -128 から127まで unsigned char 0から255まで
表示 printf( )関数に変数の型を教える C++では解決 %記号で表示の仕方を指定
i=12; printf( “%d”, i ); 12 printf( “%02d”, i ); 12 printf( “%03d”, i ); 012 printf( “%04d”, i ); 0012 printf( “%x”, i ); c i = 12 / 5; printf( “%d”, i ); 2 i = 12 / 13; printf( “%d”, i ); 0 i = 12 / 13 * 13; 桁数を指定 0で埋める 16進表記 小数点以下切捨て
i=3; j=4; 書式 %d の箇所に値。 printf( “値は %d です。次の値は %02d です。”, i, j ); 変数 値は3です。次の値は04です。
double x; x = 12.0; printf( “%f”, x ); 12.000000 printf( “%e”, x ); 1.200000e+1 printf( “%5.2f”, x); 12.00 printf( “%05.2f”, x ); 012.00 見慣れた表示 指数表示 桁数の指定
関数 よく使う機能をまとめる f(x): 引数 x と 出力 f
宣言 メイン関数 関数 #include <stdio.h> double MyFunc( double r ); main(){ double S; S = MyFunc( r ); printf( “%f\n”, S ); } double MyFunc( double r ){ S = 3.14 * r * r; return( S ) 宣言 メイン関数 関数
宣言 戻り値の型 引数の型 メイン関数 関数 値を戻す #include <stdio.h> double MyFunc( double r ); main(){ double S; S = MyFunc( r ); printf( “%f\n”, S ); } double MyFunc( double r ){ S = 3.14 * r * r; return( S ) 戻り値の型 引数の型 宣言 メイン関数 関数 値を戻す
#include <stdio.h> double MyFunc( double r ); main(){ double S, r; r = 1; S = MyFunc( r ); printf( “%f\n”, S ); } double MyFunc( double r ){ double S; S = 3.14 * r * r; return( S )
メモリ r コピー S r S a.out プロセッサ キーボード a.out 表示 a.out area.c ハードディスク 1.0 #include <stdio.h> double MyFunc( double r ); main(){ double S, r; r = 1.0; S = MyFunc( r ); printf( “%f\n”, S ); } double MyFunc( double r ){ double S; S = 3.14 * r * r; return( S ) S 3.14 S r 1.0 3.14 a.out プロセッサ キーボード a.out 3.14 表示 a.out area.c ハードディスク
くり返し文 変数の値を更新しつつくり返し
繰り返す条件 初期値 更新ルール for( i = 0 ; i < 10 ; i++ ){ printf( “%d”, i ); }
#include <stdio.h> main(){ int i; for( i = 0 ; i < 10 ; i++ ){ printf( “%d”, i ); } i = 1 i = 10 i = 0 i = 1 i = 0 i = 0 i = 1 i = 10 次の処理へ。。
i=0; while( i<10 ){ printf( “%d”, i ); i++; } i<10 の間ずっと繰り返す
条件 初期値 更新 for( i = 0 ; i < 10 ; i++ ){ printf( “%d”, i ); } i=0; while( i<10 ){ printf( “%d”, i ); i++; }
繰り返す条件 i=0; while( i<10 ){ printf( “%d”, i ); i++; }
条件文 条件に合致したか否かの判断 if (式) 文1; else 文2;
成立すると1になる 1 if( ){ printf(“…”); 文2; 文3; } else { 文4; 文5; x > y x >= y x < y x <= y x == y x != y 式1 && 式2 式1 || 式2
main(){ int i; i=0; while(1){ printf(“%d\n”, i*i ); if( i*i >= 300 ) break; i++; } printf( “%d\n”, i ); i が1ずつ増える
プロセス 実行中のプログラム UNIXはマルチプロセス 複数のプロセスを同時に実行 バックグラウンドとフォアグラウンド &をつけて実行するとバックグラウンド C-zで一時停止、C-cで中断 bg, fgで停止中のプロセス再開
usrid@eiew0% emacs emacsにかかりきり
usrid@eiew0% usrid@eiew0% emacs & emacsは動いたまま 他の仕事もできる。
既知の対象の内部にある 未知の対象の面積を求める =