printf( “%d”, i )

プログラミング演習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は動いたまま
他の仕事もできる。
既知の対象の内部にある
未知の対象の面積を求める
=