プログラミング演習I 2002年度 目標 • コンピュータに慣れる • UNIXの基礎的な操作 • メール、Web • C言語によるプログラミングの基礎 蟹は甲羅にあわせて穴をほる 演習の流れ 1. 2. 3. 4. 5. ログイン・ログアウト ファイル・ディレクトリ Unix メール・HTML C言語入門 UNIX • 1969年 米国AT&Tベル研 • マルチタスク・マルチユーザOS • ほとんどC言語により記述 UNIXの開発を目的としてC言語を開発 パスワード • 忘れないこと • 大文字・小文字・数字を混ぜる • 破られないこと 悪意ある者は英単語・名前などの辞書を活 用する ファイル テ キ ス ト フ ァ イ ル システムのファイル 情報のまとまり プ ロ グ ラ 他ユーザのファイル ム フ ァ イ ル 自分のファイル •講義ノート •メモ •取扱説明書 •写真 デ ー タ フ ァ イ ル ROOT ディレクトリ • ファイルの整理整頓 文書 (木) • ファイルは葉、ディレクトリは節 取扱 講義ノート ノ電 ー磁 ト気 ノ憲 ー法 ト 説明書 取洗 説濯 機 取テ 説レ ビ 画像 ディレクトリの木構造 / home usr システム cd .. a00500 a00501 ホームディレクトリ cd /usr/bin bin bin 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 cp file0 file1 mkdir dir0 ls : ディレクトリdir0への移動 : file0をfile1としてコピー :dir0を新しく作成 : ファイル・ディレクトリ一覧 特別なディレクトリ • 現在地(カレントディレクトリ): • 親: • ホームディレクトリ: . .. オンラインマニュアル • • • • man 各種マニュアル(MANual) man cd コマンドcdのマニュアルの表示 man man manのマニュアル SPCで次ページ、qで終了 UNIXとデバイス • デバイス:機器 • UNIXでは全ての機器の操作をファイル経 由で行う • /dev/ デバイスファイル / home a00500 usr a00501 dev 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の利用 テキストファイルの編集 統合環境(メール、コンパイル、シェル。。) マウスを使わない(でも済む) バッファ バッファ a000% cd a000% emacs モード ミニバッファ #include main(){ } ABC メモリ ABC キーボード ABC ハードディスク ABC メモリ ABC キーボード C-x C-s 保存 filename.txt filename.txt ABC ハードディスク インターネット • 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サービス用プロトコル) • 「ファイルの要求」と「転送」だけの単純な プロトコル 公開 • • • • 公の場である 公開内容に対する責任 閲覧内容の「管理者による管理」 閲覧内容の自己管理 タグ(どのように見せるか) <HTML> <HEAD> <TITLE> ページの名前など </TITLE> </HEAD> <BODY> 公表したいことをここに書く。 </BODY> </HTML> 電子メール • • • • ネットワーク経由の郵便 好きな時間に読み書き 同時に複数の相手へ 第三者から閲覧の可能性 チェーンメール • 人からのメールを大勢に転送 • 厳禁 • 多人数への情報伝達はWWWで ウィルス • アプリケーションを利用したシステムの破壊 • 要注意 マナー • • • • 半角かなは使わない 極端に長いメールは出さない subjectに日本語は使わない ウィンドウズアプリケーションを前提としない メール 差出人 メールサーバ ホームディレクトリ ホームディレクトリ メールアドレス [email protected] ユーザID メールサーバ名 メールアドレス [email protected] 学科. 米沢キャンパス. 山形大学. 学術. 日本 メールの構造 タイトル あて先 ヘッダ 本文 To: [email protected] Subject: my first email! Reply-to: --こんにちは。 さようなら。 メールの送受信 相手 emacs の利用 ホームディレクトリ メールサーバ ホームディレクトリ メールの送信 受取人 メールサーバ ホームディレクトリ ホームディレクトリ C-x m emacs To: [email protected] Subject: progI Reply-to: [email protected] ---text follows this line--- C-c C-w メールの本文 C-c C-c --本谷秀堅 tel. 0238-26-3332 ---Mule: *mail* Sending … done メールの受信 差出人 メールサーバ ホームディレクトリ ホームディレクトリ Esc-x rmail n: 次のメール p: 前のメール SPC: スクロール h: メール一覧 r: メールに返信 f: メールの転送 q: 終了 Date: Thu, 10 May 2001 From: a00500 To: hontani Reply-to: [email protected] Content-type: text Content-Length: 151 メールの本文 --本谷秀堅 tel. 0238-26-3332 M-x rmail シェル • ユーザとOSとの仲介役 a00500@eiew00% a00500@eiew00% lsls abc abc abe abe kbe kb kyz zze a00500@eiew00% a00500@eiew00% lsls a* k* abc kb kyz abe a00500@eiew00% a00500@eiew00% lala *be k? abe kb kbe a00500@eiew00% a00500@eiew00% lsls *e k?? abe kyz kbe zze アクセス権モード • ファイル・ディレクトリの公開の仕方 • 読み・書き・実行 • 自分・同一グループ・他人 アクセス権モード 自分 同一グループ 他人 読み ○ ○ × 書き ○ × × 実行 × × × グループ a01 a01500 a01501 a01502 … a00 a00500 a00501 a00502 a00503 … b00 b00500 b00501 b00502 … staff hiranaka tamura kohda kobayashi … アクセス権モード a00500@eie00% ls -l -rw-r----- 1 a00500 a00 316 5月10日 r: 読み w: 書き x: 実行 rwx rwx rwx 自分 自グループ 他人 アクセス権モードの変更 chmod o+r filename u g o 誰に + - r w x なにを テキストファイルに実行権 シェルが内容を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) gcc (GNU C Compiler) 処理の流れ 1. 2. 3. 4. 5. 作業ディレクトリの作成 プログラムソースの作成 コンパイル 実行 デバッグ プログラムソース • • • • • コンピュータに実行させたい命令の記載 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 % ls 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=6 i=6 a.out 変数の宣言 プロセッサ キーボード a.out #include <stdio.h> main(){ int i; i = 3 * 2; printf( “i=%d\n”, i ); i=6 表示 } 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 0000 0010 0001 0100 0000 0011 1 2 3 4 0001 0001 5 0000 0000 0000 0000 0000 0000 6 7 8 1110 0111 0000 0111 9 10 11 12 13 14 ア ド レ ス 変数の型 • • • • • • char 1byte short 4byte int 4byte long 4byte double 8byte unsigned 文字など 整数 整数 整数 実数 0以上の数のみ signed と unsigned char 0000 0000 • char 0000 0001 • unsigned 0000 0010 0000 0011 … 0111 1111 1000 0000 1000 0001 1000 0010 … 1111 1111 unsigned char 0 -128 から127まで 1 char 0から255まで 2 3 0 1 2 3 127 -128 -127 -126 127 128 129 130 -1 255 表示 • printf( )関数に変数の型を教える • C++では解決 • %記号で表示の仕方を指定 i=12; printf( “%d”, i ); printf( “%02d”, i ); printf( “%03d”, i ); printf( “%04d”, i ); printf( “%x”, i ); 桁数を指定 0で埋める 12 12 012 16進表記 0012 c 小数点以下切捨て i = 12 / 5; printf( “%d”, i ); 2 i = 12 / 13; printf( “%d”, i ); 0 i = 12 / 13 * 13; printf( “%d”, i ); 0 i=3; j=4; printf( “値は %d です。次の値は %02d です。”, i, j ); 書式 %d の箇所に値。 値は3です。次の値は04です。 変数 double x; x = 12.0; printf( “%f”, x ); printf( “%e”, x ); printf( “%5.2f”, x); printf( “%05.2f”, x ); 見慣れた表示 12.000000指数表示 1.200000e+1 桁数の指定 12.00 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 ){ double S; 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 ){ double S; 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 ) } メモリ 1.0 r S 3.14 r 1.0 S 3.14 a.out コピー #include <stdio.h> double MyFunc( double r ); プロセッサ main(){ double S, r; r = 1.0; S = MyFunc( r ); キーボード a.out 表示 3.14 a.out area.c printf( “%f\n”, S ); } double MyFunc( double r ){ double S; ハードディスク S = 3.14 * r * r; return( S ) } くり返し文 • 変数の値を更新しつつくり返し 繰り返す条件 初期値 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 = 10 10 i = 10 i=1 0 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になる if( 1 0 ){ 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++; i が1ずつ増える } printf( “%d\n”, i ); プロセス • • • • • • • 実行中のプログラム UNIXはマルチプロセス 複数のプロセスを同時に実行 バックグラウンドとフォアグラウンド &をつけて実行するとバックグラウンド C-zで一時停止、C-cで中断 bg, fgで停止中のプロセス再開 usrid@eiew0% emacs emacsにかかりきり usrid@eiew0% emacs & usrid@eiew0% emacsは動いたまま 他の仕事もできる。 既知の対象の内部にある 未知の対象の面積を求める =
© Copyright 2025 ExpyDoc