Linux にログインし、以下の講義ページを開いておくこと C プログラミング入門 総機1 (月1) 02: C 言語のコンパイル Linux にログインし、以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/teachers/w483692/CPR1/ 2015-04-13
アンケート結果 単位:人 2015-04-13 C プログラミング入門 総機1 (月1)
C で書かれたプログラム(ソースコード)をテキストエディタで作成する 端末エミュレータでコンパイルをする できたプログラム(実行ファイル)を実行する うまく動くまで、プログラムを修正する 手順は、講義資料ページに掲載しているので、それを読みながら進めてください 2015-04-13 C プログラミング入門 総機1 (月1)
C プログラミング体験(1): ソースコード作成 前回ホームに作成したフォルダ CPR1 の中にフォルダ 02 を作成(今日の演習用) 右クリックして、新しいファイルを作成 名前を hello.c とする ダブルクリックして開く。 ただし、初期設定では前回使った gedit ではないエディタが開いてしまうので、まず右クリックしてプロパティを開き、「開き方」で gedit を選択して変更する。 2015-04-13 C プログラミング入門 総機1 (月1)
Hello, world #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } 環境によって、円マークで表示されたり、バックスラッシュ(\)で書かれる。スライド資料では、バックスラッシュを表示するのが難しいので、円マークで統一します。 2015-04-13 C プログラミング入門 総機1 (月1)
02 のフォルダ内で、ファイルのない部分を右クリックして、「端末の中に開く」 以下のコマンドを入力する(コンパイル) C プログラミング体験(2): コンパイル 02 のフォルダ内で、ファイルのない部分を右クリックして、「端末の中に開く」 以下のコマンドを入力する(コンパイル) gcc hello.c -o hello -Wall -Wextra 成功の場合は、何も表示されない プログラムにミスがある場合は、エラーメッセージが表示される プログラムを修正して、再度コンパイルをすることを繰り返す(デバッグ) 2015-04-13 C プログラミング入門 総機1 (月1)
C プログラミング体験(3): 実行 プログラムの実行ファイルを確認 実行 ls コンパイルに成功していれば hello.c のほかに実行ファイル hello が表示される 実行 ./hello 文字列が表示され、コマンドプロンプトが再び表示される 2015-04-13 C プログラミング入門 総機1 (月1)
1973 年、それまで機械語で書かれていた UNIX の開発を簡単にするために AT&T 研究所の Dennis Ritchie が開発 すでにつくられていたB言語を改良 1978年、Dennis Ritchie と Brian Kernighan が解説書 “The C Programming Language” を出版 (通称 K&R) 2015-04-13 C プログラミング入門 総機1 (月1)
言語仕様の規格 1978: K&R 1989: ANSI C (C89) 1999: C99 2011: C11 デファクト スタンダード “The C Programming Language” 1989: ANSI C (C89) ISO/IEC 9899:1990 JIS X 3010:1993 1999: C99 ISO/IEC 9899:1999 JIS X 3010:2003 2011: C11 ISO/IEC 9899:2011 C99/C11 に対応した教科書などは最近徐々に増加している デファクト スタンダード 大改訂 現在も C89 の仕様が一般的に使用されている (ANSI C 準拠などと書かれている) 2015-04-13 C プログラミング入門 総機1 (月1)
講義で学ぶ事項 文法 データ構造 アルゴリズム 標準ライブラリ 主に C89 キーワードや式 コンピュータでのデータの扱い 問題を解く方法 何が提供されているのか どのように使用するのか 主に秋期「C プログラミング」で扱う 2015-04-13 C プログラミング入門 総機1 (月1)
C のソースコードをコンピュータが理解する機械語に変換するためのプログラム コンパイラで変換を行うことをコンパイルという コンパイラ (compiler) C のソースコードをコンピュータが理解する機械語に変換するためのプログラム コンパイラで変換を行うことをコンパイルという コンパイラは、文法的に正しくないコードに対して、エラーまたは警告を報告する 今日は全員、コンパイルと実行ができるようになってください 2015-04-13 C プログラミング入門 総機1 (月1)
現在は、 C89 としてソースコードを解釈するが、オプションを付ければ C99 や C11 を使うこともできる GCC について Linux で標準的に使われるコンパイラ 詳しい説明は講義資料ページ参照 現在は、 C89 としてソースコードを解釈するが、オプションを付ければ C99 や C11 を使うこともできる 2015-04-13 C プログラミング入門 総機1 (月1)
プログラムの様々な名称:全体 ディレクティブ 関数定義 #include <stdio.h> int main(void) { 特殊な指定 #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } ※詳しい解説はあとで。 関数定義 main という関数を 定義している ※数学でいう関数とは 意味合いが異なる (詳細は次回) 2015-04-13 C プログラミング入門 総機1 (月1)
プログラムの様々な名称: 関数 #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } 関数名 文 (関数呼び出し) 文 (制御構造) キーワード 2015-04-13 C プログラミング入門 総機1 (月1)
疑問 #include って何しているの? int とか void って何? 最後の return 0 の意味は? 今後の講義で少しずつ、解説していきます 2015-04-13 C プログラミング入門 総機1 (月1)
幾つかの関数 (function) で構成される 手続き (procedure) とも呼ばれ、C は手続き型言語と呼ばれる。関数型言語ではない(詳しくは調べてください) main という名前の関数を必ず一つ含む 数学でいう関数とは似ているところもあるが異なる OS はプログラムを実行すると、 main 関数を呼び出す(=実行する) 2015-04-13 C プログラミング入門 総機1 (月1)
任意の関数名の後に引数列と呼ばれる部分を含む ( ) が付き、そのあとに文が続く 幾つかの文の列が { } に囲まれて書かれる 関数とは プログラムを構成する単位 任意の関数名の後に引数列と呼ばれる部分を含む ( ) が付き、そのあとに文が続く 幾つかの文の列が { } に囲まれて書かれる 上から順に実行される 1つの文は、; (セミコロン) で終わる 複数の文を { } で囲んでまとめたものをブロックといい、キーワードによって特別な制御がされる 関数の詳しい説明は次回以降説明 2015-04-13 C プログラミング入門 総機1 (月1)
字句(トークン)の区切りが明確なら、自由に空白や改行を入れることが出来る。 書き方のルールをコーディングスタイルという。 フリーフォーマット 字句(トークン)の区切りが明確なら、自由に空白や改行を入れることが出来る。 書き方のルールをコーディングスタイルという。 バグを減らす・他人と共有する・未来の自分が読むためには、読みやすくすることが重要 #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } タブで字下げ 空白で区切り 改行で区切り 2015-04-13 C プログラミング入門 総機1 (月1)
以下の3つの例はすべて同じプログラムですが、どれが読みやすいですか? フリーフォーマットの例 以下の3つの例はすべて同じプログラムですが、どれが読みやすいですか? #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } #include <stdio.h> int main ( void) { printf( "Hello, world!\n" ); return 0; } #include <stdio.h> int main(void){printf("Hello, world!\n");return 0;} 2015-04-13 C プログラミング入門 総機1 (月1)
ホワイトスペース (whitespace) タブ (tab) 幅が設定によって可変 改行文字 エディタ上では折り返して表示される 空白類文字 空白、タブ、改行(といくつか)の総称 ホワイトスペース(空白類文字列) 空白類文字の連続 Tab | Enter ↲ 2015-04-13 C プログラミング入門 総機1 (月1)
字下げ・インデント (indentation) ブロックの中を字下げして、読みやすくする 人によって書き方が違う 空白 8 つ 空白 4 つ 空白 2 つ タブ 1 つ 講義資料では 空白 2 つ分 タブと空白は見た目で区別ができませんが必ず使い分けること レポートの評価対象の一つ #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } 2015-04-13 C プログラミング入門 総機1 (月1)
コメント (comment, remark) /* と */ で囲まれた部分 内容は無視される 入れ子にはできない 内容は無視される ソースコード内に、情報を書き込むために使用 C99 では // で始まるコメントも追加された 行末までがコメントとなる もともと C++ 言語で使われる文法 一般的なコンパイラでは独自拡張として対応 C89 では仕様違反だが、使用しても問題になることはおそらく無い 2015-04-13 C プログラミング入門 総機1 (月1)
コメントの例 /* * こんにちは世界、と表示するプログラム * by Mochizuki */ #include <stdio.h> /* メイン関数 */ int main(void) { // print a message printf("Hello, world!\n"); // Cool! return 0; } 2015-04-13 C プログラミング入門 総機1 (月1)
コンピュータの計算の仕組み コンピュータ 記憶装置 CPU 周辺機器 (peripheral) 実行ファイルの中身=機械語 (machine language) 010001000011010101010101011111010101010101010101010101001010111111111100000001010101010110100101 CPU 記憶装置 (memory) 実行 読み書き I/O 制御 コンパイル 周辺機器 (peripheral) ソースコード int main(void) { printf(“... 2015-04-13 C プログラミング入門 総機1 (月1)
コンピュータが計算する=メモリの読み書き 2つの状態を持つスイッチのようなものがたくさん並んで入っている メモリ(記憶装置) CPU が読み書きする装置 コンピュータが計算する=メモリの読み書き 2つの状態を持つスイッチのようなものがたくさん並んで入っている 状態は変更するまで維持される(記憶) 電気を切ると状態が失われる(揮発性) 数、文字、画像、動画、音声などを記憶する どうやって? 2015-04-13 C プログラミング入門 総機1 (月1)
状態 1 つ分を bit, 8 つで byte という単位で表現する 例: 4GB のメモリ メモリのサイズ 状態 1 つ分を bit, 8 つで byte という単位で表現する 例: 4GB のメモリ = 4 × 1024 MB = 4 × (1024)2 KB = 4 × (1024)3 byte = 4 × (1024)3 × 8 bit = 68,719,476,736 bit 1 bit … 1 byte (B) 色で、状態 (スイッチの ON/OFF) を表現している 2015-04-13 C プログラミング入門 総機1 (月1)
メモリ上の表現: 数値 正の整数は 2 進法で表現 負の整数は最上位ビットを符号とみなす 小数 8bit では 0~255 の 256 通り表現可能 負の整数は最上位ビットを符号とみなす 複数の表現がある 小数 IEEE754 などの規格 難しいけどうまくできそうですよね? 正の整数 2進数 00000000 1 00000001 2 00000010 … 254 11111110 255 11111111 ■■■■■■□■■□□■■□□■■□ 253 25 メモリの状態を 0 か 1 とみなして、 8 bit ごとに整数だと思う場合の例 2015-04-13 C プログラミング入門 総機1 (月1)
メモリ上の表現: 文字 文字それぞれに番号(文字コード)を振る 文字コードにはたくさん種類がある ASCII: アルファベットのコード(右表) JIS 漢字コード: 日本語用の文字コード Unicode: 世界中の文字に番号を振ったコード 1 2 3 4 5 6 7 @ P ` p ! A Q a q " B R b r # C S c s $ D T d t % E U e u & F V f v ' G W g w 8 ( H X h x 9 ) I Y y * : J Z j z + ; K [ k { , < L \ l | - = M ] m } . > N ^ n ~ / ? O _ o 2015-04-13 C プログラミング入門 総機1 (月1)
メモリ上の表現: 画像 グレースケール画像の場合 サイズをあらかじめ決めておく 1ピクセルの濃淡値を 0~255 で表現 (0:黒, 255:白) メモリの中身 画像は画素の集まりでできている。これをディジタル画像という。 48 52 122 … 1マスは 8bit (1byte) で整数を表したもの カラーの場合は通常 RGB の 3 バイトで1ピクセルを表現 2015-04-13 C プログラミング入門 総機1 (月1)
どんなデータでも、数値として表すことができれば、メモリやファイルに格納できる データ表現 どんなデータでも、数値として表すことができれば、メモリやファイルに格納できる C 言語では、整数や小数だけでなく、画像のような複雑な構造を持ったデータを簡単に扱える機能がある 以下のデータをどうやってメモリやファイルに格納するか?どうやって探し出すか?を考えるのが秋期の講義の目的 学生の成績情報、回路の配線図、地震のシミュレーション、音楽、パズルの答え、 etc… 2015-04-13 C プログラミング入門 総機1 (月1)