Transcript 1週目

プログラミング言語1
• C言語の基礎の習得
• プログラミング言語 1 は講義形式(G302)
• 対応するプログラミング演習 1 は G401 で行う
• 成績は、数回のレポート+学期末試験で決定
教科書:
定本 明解C言語 入門編 柴田望洋著
Soft Bank Publishing 2,200円
参考書:
解きながら学ぶC言語 柴田望洋著
Soft Bank Publishing 1,700円
1
コンピュータ(計算機)の構成
モデム
イーサーネットなど
通信制御装置
入力装置
Input device
キーボード
マウス
外部記憶装置
(補助記憶)
中央処理装置
CPU
主記憶装置
ハードディスク, SSD
フロッピーディスク
CD-ROM, DVD など
出力装置
Output device
ディスプレイ装置(モニタ)
プリンタ
Main Memory
2
中央処理装置の構造
PC
制御回路
演算回路
レジスタ
命令解読
データバス
主記憶装置
Main Memory
外部の
入出力回路
命令とデータを保存
3
ハードウェアとソフトウェア
計算機の物理的な装置をハードウェア(hardware)という
Apple 社製 iMac などはハードウェアの固有名詞
ハードウェアの動作を利用して実際の処理を行うプログラムのことをソフト
ウェア(software)という
マイクロソフト社製の Word, Excel などのアプリケーションソフト
ソフトウェアの中でも、アプリの実行を手助けするものとして基本ソフトウェアが
ある。基本ソフトウェアはオペレーションシステム(Operation System)とも呼ばれ
る。
Windows 7, MacOS, Linux など
4
OSとは
キーボード入力、画面出力、ファイル操作や
メモリ管理等の基本的な操作やコンピュータ
本体の管理を行うソフトウェア
コンピュータに接続されている装置やメモリ等の大きさはそれぞれ
異なっている。
同じことを実行するにも、具体的な操作は個々のコンピュータで違ってく
る。
ハードウェアの抽象化 -- 装置の違いによるそうさ手順の相違を
統一的にあつかえる利用方法を提供
資源の管理 ------------------- 複数のソフトウェアが同時に実行する時、
競合が起こらないようにメモリや計算時
間を配分
計算機の効率な利用 --------複数のソフトウェア間での、実行順序や、
資源配分をうまく行うことで、全体としての効率を上げる
5
OS の種類
ワークステーションでは UNIX という OS が一般的
UNIX では複数ユーザの利用を前提としており、個人ファイルの保護、
プログラム実行時のプロセス管理がしっかりしている。
UNIX にもいくつかの種類(系列)がある。Linux はその1つ。
パソコンの OS としては
MS-DOS, Windows 7, Windows 8, MacOS, Android, iOS などがある。
最近のパソコンでは UNIX 系の OS も走るので、OS の種類によるワーク
ステーションとパソコンの区別は明確ではない。
6
プログラムとは?
プログラム=コンピュータへの指令書
コンピュータに、こういう手順に従って、こういう動作をせよ、という指令書
がプログラムである。
1つの結果を得るにも、一般に幾通りもの方法がある。
プログラムで用いる方法(計算手順)のことをアルゴリズムという。
アルゴリズムをコンピュータで実行可能な命令の集合として記述すること
をプログラミングという。命令の列をプログラムという。
アルゴリズムーー人間が理解出来る形で記述した計算の手順書
プログラム ーー計算機が理解出来る形で記述したの計算手順
7
プログラミング言語
コンピュータが直接理解できる命令(instruction)を機械語
(machine language)という。
機械語は 0 と 1 の列、すなわちビット列 (bit)、で表現され、人間には取
り扱いが非常に困難。
ビット列:2 進法で表現される 0 と 1 の列。
4 ビット列の例:
0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, .... 1111
2 の 4 乗= 16 通りの表現が可能
8
機械語の表現
通常、ビット列は 8 ビットを単位として 16 進法で表す。8 ビットの単位を 1
バイト (byte) と呼ぶ。
1バイトは、00000000, 00000001, ... 11111111 までの 256 通りを表現
機械語は通常、0, 1, 2, ..., 9, A, B, C, D, E, F の 16 個の記号を用いた
16 進数で表現する。
00, 01, 02, 03, ..., 09, 0A, 0B, 0C, 0D, 0E, 0F
10, 11, 12, 13, ..., 19, 1A, 1B, 1C, 1D, 1E, 1F
F0, F1, F2, F3, ..., F9, FA, FB, FC, FD, FE, FF
9
高級言語
機械語は人間にとって取り扱いにくい。そこで、人間が理解しやすいプログ
ラミング言語として高水準(高級)言語が考案されている。
FORTRAN, BASIC, COBOL, Pascal, C, C++, Java など。
FORTRAN: 古くから科学技術計算の分野で使用
COBOL: 事務処理系で広く使われている
BASIC: 入門用プログラミング言語
Pascal: 教育用言語として開発
C: 1972年代、アメリカベル研究所で開発
Java:インターネット時代の仮想計算機上の言語
10
実例
{ '03 4/15 }
{Pascal 言語}
/* '03 4/15
C 言語 */
program Example1;
#include <stdio.h>
begin
main()
{
writeln('Hello!');
printf("Hello!¥n");
end.
}
C '03 4/15
C FORTRAN 言語
WRITE(*,*) 'Hello!'
END
11
コンパイル
高級言語で書かれたプログラムを実行するためには、プログラムをコン
ピュータが理解できる機械語に変換(翻訳:コンパイル compile)する必要が
ある。
この変換を行うプログラムのことをコンパイラ(compiler)と呼ぶ。
高級言語で書かれたプログラムをソースプログラム(source)、
コンパイラが変換して出力したものをオブジェクトプログラム(object)と呼ぶ。
C 言語で書かれたプログラムをコンパイルするプログラムのことを、C コン
パイラと呼ぶ。
FORTRAN のプログラムには FORTRAN コンパイラ、
Pascal のプログラムには Pascal コンパイラ、、、
12
プログラム実行までの流れ
エディタでソースプログラムを作成
ソース
コンパイラ
オブジェクト
リンカー
コンパイラにソースを入力してコンパイル
機械語に翻訳されたオブジェクトが生成される
標準ライブラリから必要なライブラリをオブジェ
クトに追加し、実行可能なプログラムを仕立て
る作業をリンク(Link)という。
リンクを行うプログラムをリンカー(Linker)と呼
ぶ。
実行可能プログラム
13
言語処理系
コンパイルとリンクは通常 1 つの過程と見なすことが出来る。通常はコンパイ
ルとリンクを合わせて、単に「コンパイルする」という。
コンパイラとリンカーを合わせて、言語処理系と呼ぶ。
FORTRANでプログラムを書いて実行する為には、FORTRAN 言語処理系が、
C 言語のプログラムをするには C 言語処理系が必要になる。
UNIX 系の OS には、たいていの場合 C 言語処理系が含まれている。
パソコン系の OS では、C 言語処理系などのアプリケーションを別途
購入する必要がある。
14
プログラミング言語まとめ
コンピュータが直接理解可能(人間
には分かりにくい)
機械語
言語処理系(コンパイラ)が
両者の仲立ちをする
プログラムし易い
(コンピュータは直接実行不可能)
高級言語:FORTRAN, C など
15
アセンブリ言語への変換
.file
.LC0:
"x.c"
.section
.rodata
cc –s x.c で作成
.string "hallo\n"
#include <stdio.h>
.text
main(){
.globl main
printf(“hallo¥n”);
.type
main, @function
main:
}
pushl
%ebp
movl
%esp, %ebp
subl
$8, %esp
andl
$-16, %esp
movl
$0, %eax
subl
%eax, %esp
subl
$12, %esp
pushl
$.LC0
call
printf
addl
$16, %esp
leave
ret
.size
main, .-main
.section
.note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.2 20031218 (Vine Linux 3.3.2-0vl8)"
16
機械語への変換
% hd x.o
000000: 7f
000010: 01
000020: e4
000030: 0b
000040: 00
000050: ff
000060: 47
000070: 20
000080: 4c
000090: 29
0000a0: 61
0000b0: 6c
0000c0: 73
0000d0: 47
0000e0: 6e
0000f0: 00
000100: 00
45
00
00
00
00
83
43
32
69
00
62
2e
00
4e
74
00
00
4c
03
00
08
29
c4
43
30
6e
00
00
74
2e
55
00
00
00
46
00
00
00
c4
10
3a
30
75
2e
2e
65
72
2d
00
00
00
01
01
00
55
83
c9
20
33
78
73
73
78
6f
73
00
00
00
01
00
00
89
ec
c3
28
31
20
79
68
74
64
74
00
00
00
01
00
00
e5
0c
00
47
32
33
6d
73
00
61
61
00
00
00
00
00
00
83
68
00
4e
31
2e
74
74
2e
74
63
00
00
00
00
00
34
ec
00
68
55
38
33
61
72
64
61
6b
00
00
00
00
00
00
08
00
61
29
20
2e
62
74
61
00
00
00
00
00
00
00
00
83
00
6c
20
28
32
00
61
74
2e
2e
00
00
00
00
00
00
e4
00
6c
33
56
2d
2e
62
61
6e
63
00
00
00
00
00
00
f0
e8
6f
2e
69
30
73
00
00
6f
6f
00
00
1f
00
00
00
b8
fc
0a
33
6e
76
74
2e
2e
74
6d
00
00
00
00
00
28
00
ff
00
2e
65
6c
72
72
62
65
6d
00
00
00
00
00
00
00
ff
00
32
20
38
74
65
73
2e
65
00
00
00
: ELF
:
:
4
(
:
U
: )
h
:
hallo
:GCC: (GNU) 3.3.2
: 20031218 (Vine
:Linux 3.3.2-0vl8
:) .symtab .strt
:ab .shstrtab .re
:l.text .data .bs
:s .rodata .note.
:GNU-stack .comme
:nt
:
:
cc –c x.c で作成
17
機械語と数値の対応
movl
subl
andl
movl
subl
subl
%esp, %ebp
$8, %esp
$-16, %esp
$0, %eax
%eax, %esp
$12, %esp
;
;
;
;
;
;
89
83
83
b8
29
83
e5
ec
e4
00
c4
ec
08
f0
00 00 00
0c
18
C プログラミングの一般手順
1)ソースファイルの作成(編集)
エディターを用いてソースプログラムを書く。
ソースプログラムをソースファイルとして保存。
C 言語処理系では、ソースファイル名の最後に拡張子 .c をつけ
る。 例)my_first_program.c など。
2)ソースプログラムのコンパイル
コンパイル途中でソースプログラムに文法の誤りがあれば、コンパ
イルエラーとなり、コンパイルは中断。
ソースプログラムの欠陥や過ちをバグ bug という。バグを見つけて
修正する作業をデバッグ debug という。
バグが無くなるまでデバックを続ける。
文法の過ちによるバグとアルゴリズムのバグは別物であることに注意。
19
初めてのC言語
1)ソースプログラムの作成
エディタでプログラムを書き、sample.c というファイル名で保存
/* はじめてのプログラム */
#include <stdio.h>
int main(void)
{
printf("Hello!\n");
return(0);
}
/* と */ で囲まれた部分はコメント
文になる。コンパイラに無視される。
注釈文とも言う。
この部分は、C 言語のプログラムの
(とりあえず)決まり切った型。
記号の読み方:
/ スラッシュ, * アスタリスク, # シャープ, \ バックスラッシュ
" ダブルクォーテーション, ; セミコロン, { } 中カッコ
20
初めてのコンパイル
2)ソースプログラムのコンパイル
UNIX (Linux)系の OS では、C 処理系は cc コマンド(もしくは gcc)
で呼び出す。cc コマンドに続いてコンパイルするソールファイル名
を指定。
% cc sample.c
%
% ./a.out
./ とは今自分が作業しているディ
レクトリを意味する
コンパイルエラーが無ければ、a.out という名
前の実行可能プログラムが作成される。
実行可能プログラムを実行するには
./a.out と入力(エンターを忘れずに)。
もしコンパイルエラーがあればエディタに立ち
戻ってソースファイルの修正を行う。
修正したらソースの保存 save を忘れずに!
21
C言語のプログラムの構成
C では関数を基本単位としてプログラムを構成する
単純なプログラムは main 関数のみから成る
#include <stdio.h>
int main(void)
{
文1
文2
...
}
stdio.h というヘッダファイルをこの
場所に挿入する
stdio.h には標準的に使われる関数の
定義が書かれている
main 関数内に書かれた文 (statement)
は上から下へと順番に実行される
文はセミコロン ; で終わる
22
標準出力
#include <stdio.h>
int main(void)
{
printf("Hello!\n");
return(0);
}
文字の列を文字列という
文字列をプログラム中で表現するには "
" で囲む。これを文字列リテラルという
左の場合、"Hello!\n" が文字列リテラル
\n は特殊文字の一つで、改行を表す
文字列を表示するには printf 関数を用いる
printf 関数に文字列リテラルを引き渡すと、文字列が標準出力(画面)
に表示される。printf 関数は標準ライブラリ関数の一つ。ヘッダファイル
stdio.h で定義されている
23
printf を用いた例
#include <stdio.h>
int main(void)
{
printf("Hello!\n");
printf("How are you?\n");
printf("I am fine. And you?\n");
return(0);
}
2 つのプログラムを実行すると、
まったく同じ結果を得る。
#include <stdio.h>
int main(void)
{
printf("Hello!\nHow are you?\nI am fine. Are you?\n");
return(0);
}
24
プログラムの記述形式
C 言語では原則としてソースファイルの自由な位置にプログラムを記述す
ることが出来る(自由形式という)
#include <stdio.h>
int main(void){printf("こういう書き方もあり\n");return(0);}
#include <stdio.h>
int main(void)
{
printf(
"こんなのもOKよ\n"
);
return(0);
}
通常、プログラムを見易くするため
に段付け(インデント)をつける(タブ
キー)。
#include <stdio.h>
int main(void)
{
printf("読み易くない?\n");
return(0);
}
25
コメント(注釈)
プログラムの説明等、実際に実行されない任意の文章をプログラムの中
に入れる事が出来る。これをコメントという。プログラムの一部分を /* */
で囲ってコメント文にすることをコメントアウトという。また、//(スラッシュを
二つ)を付けるとそれ以後、行の終わりまでコメントとして処理される。
/* … */で囲ってコメント文を入力する場合に、 … の文章中に */ や /*の
文字列が含まれないように注意する必要がある。
// これはコメント(行の終わりまで)
/* これもコメント
加古富志雄 9999999 */
#include <stdio.h>
int main(void)
{
printf("読み易くない?\n");
return(0);
}
26
特殊文字について
\n:改行
\r:先頭にカーソルを移動
\t:タブ(タブ位置まで空白を出力)
\b:一文字前に戻る(バックスペース)
\':シングルクォーテーション '
\":ダブルクォーテーション "
\?:疑問符 ?
\a:警報文字(alert)
\\:バックスラッシュ(逆向きの斜め線) \
Printfの文字列中に%を書く場合
%%:パーセント記号 %
27
課題
0)各自のホームディレクトリにgengo1という名前でディレクトリ
を作成し、そのディレクトリに移動せよ。プログラム作成は
このディレクトリ内で行うこと。
1)標準出力に自分の氏名と、簡単な自己紹介を表示する
プログラムを作れ。
2)次に示すプログラムを作成してコンパイルせよ。
コンパイル時にエラーが出力される。出力されたメッセージを
提出せよ。また、間違いを探してプログラムを修正せよ。
#include <stdio.h>
main()
{
printf("hallo\a\n");
printf(");
}
(1) 作成したプログラムと実行結果(画面のコピー)を[email protected]までメイル
で送ること。
(2)メイルのタイトルは「プログラミング演習1」とすること。
(3)全てのプログラムには、必ず最初にコメント文で名前と学籍番号を記入すること。
28
プログラム作成から実行までの操作
0) これは、最初に一度だけ実行する
mkdir gengo1
#最初に一回行う
ch gengo1
#ディレクトリを移動(ログイン後一度)
1) ソースファイルを作成
emacs test.c &
# test.cという名前のファイルを編集(作成
# 編集画面が現れるのでそこで作成&修正
# 作成が終われば保存(メニューから)する
2) コンパイル
cc test.c
# ソースファイル test.cをコン
パイルして
# 実行
ファイルを作成する。
#何らかのメッセージが出力された場合はプログラムが
test.c:6:9: error: expected expression
#間違っているのでソースを修正してコンパイル仕直す。
2 warnings and 1 error generated.
3) 実行
./a.out
a.outという
# 実行する(実行ファイルは
29
UNIX の基本コマンド 1
pwd
ls
今自分がいるディレクトリの表示
ディレクトリ内容の一覧
詳細な使い方は、オンライン・マ
ニュアルを参照。
% man ls
% pwd
カレントディレクトリの絶対パスの表示。(Working directory とも言う)
% ls
カレントディレクトリの一覧
% ls -F
オプション -F を付けると、ディレクトリの後にスラッシュ / が、
実行形式のファイルの後にアスタリスク * が表示される。
% ls -l
オプション -l を付けるとファイル・ディレクトリの更新日時とサイズを表示。
30
基本コマンド 2
cat, more ファイルの内容の表示
mv
ファイル名の変更・ファイルの移動
rm
ファイルの削除
cc, gcc C コンパイラ呼び出し
% cat test.c
ファイル test.c の内容を表示。
% more test.c
ファイル test.c の内容を表示。
% mv file.c file_new.c
既存のファイル file.c を file_new.c という名前に変更する。
% mv file.c gengo1
既存のファイル file.c を既存のディレクトリ gengo1 に移動する。
gengo1というディレクトリが存在しない場合はファイル名の変更になる。
% rm file.c
既存のファイル file.c を削除(元に戻りません!)
% cc test.c
ファイル test.c をコンパイル。
31
基本コマンド 3
cd
mkdir
rmdir
ディレクトリの移動
ディレクトリの新規作成
ディレクトリの削除
% cd
ホームディレクトリへ移動
% cd ..
上位ディレクトリへ移動
% cd geogo1
ディレクトリgeogo1へ移動。gengo1が存在しないとエラー。
% mkdir my_dir
ディレクトリmy_dirを新規に作成。
% rmdir my_dir
ディレクトリmy_dirを削除。my_dirの中にファイルが存在すると削除できない
32