プログラミング及び演習 第1回 講義概容・実行制御

Similar documents
プログラミング及び演習 第1回 講義概容・実行制御

memo

プログラミング及び演習 第1回 講義概容・実行制御

分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

プログラミング及び演習 第1回 講義概容・実行制御

file:///D|/C言語の擬似クラス.txt

memo

double float

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft Word - Training10_プリプロセッサ.docx

プログラミング実習I

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

Prog1_6th

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Condition DAQ condition condition 2 3 XML key value

r08.dvi

Microsoft Word - no15.docx

slide5.pptx

ohp08.dvi

プログラミング基礎

Microsoft PowerPoint - kougi11.ppt

2006年10月5日(木)実施

Prog1_12th

プログラミング基礎I(再)

NUMAの構成

II 3 yacc (2) 2005 : Yacc 0 ~nakai/ipp2 1 C main main 1 NULL NULL for 2 (a) Yacc 2 (b) 2 3 y

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

プログラミングI第10回

kiso2-09.key

Microsoft Word - 3new.doc

JavaプログラミングⅠ

第3回 配列とリスト

PowerPoint プレゼンテーション

プログラミング基礎

第5回お試しアカウント付き並列プログラミング講習会

橡Pro PDF

program7app.ppt

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

Microsoft PowerPoint - 09.pptx

第3回 配列とリスト

Microsoft Word - no11.docx

Microsoft PowerPoint - CproNt02.ppt [互換モード]

gengo1-12

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

スライド タイトルなし

8 / 0 1 i++ i 1 i-- i C !!! C 2

Microsoft PowerPoint - kougi9.ppt

変数を使えるようにする arithr.y を拡張して変数を使えるようにする 変数はアルファベット小文字一文字だけからなるものとする 変数の数はたかだか 26 なので,26 個の要素をもつ配列 vbltable に格納する 一行だけで計算が終わるのではなく数式を連続で計算できるようにし,$ が入力され

PowerPoint Presentation

講習No.1

Slide 1

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

gengo1-12

演算増幅器

Cプログラミング1(再) 第2回

第1回 プログラミング演習3 センサーアプリケーション

Microsoft PowerPoint - kougi10.ppt

memo

Microsoft Word - no02.doc

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - 12.ppt [互換モード]

PowerPoint プレゼンテーション

gengo1-12

Microsoft Word - 【第5分科会】ConcolicTestingグループ_付録_修正_ doc

Microsoft Word - 13

DVIOUT

Taro-2分探索木Ⅰ(公開版).jtd

二分木の実装

02: 変数と標準入出力

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

PowerPoint Presentation

プログラミング及び演習 第1回 講義概容・実行制御

memo

PowerPoint Presentation

Microsoft PowerPoint - kougi7.ppt

Prog1_15th

Microsoft PowerPoint - lec10.ppt

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

C

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

文法と言語 ー文脈自由文法とLR構文解析2ー

memo

Microsoft PowerPoint - 11.pptx

PowerPoint プレゼンテーション - 物理学情報処理演習

演算増幅器

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

第2回講義:まとめ

Microsoft PowerPoint - handout07.ppt [互換モード]

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

POSIXスレッド

Microsoft Word - no206.docx

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

CM-3G 周辺モジュール拡張技術文書 MS5607センサ(温度、気圧)

Microsoft PowerPoint pptx

Transcription:

プログラミング及び演習 第 12 回大規模プログラミング (2017/07/15) 講義担当大学院情報学研究科知能システム学専攻教授森健策大学院情報学研究科知能システム科学専攻助教小田昌宏

本日の講義 演習の内容 大きなプログラムを作る 教科書第 12 章 make の解説 プログラミングプロジェクト どんどんと進めてください 講義 演習ホームページ http://www.newves.org/~mori/17programming ところで, プログラミング及び演習もいよいよ終盤です

プログラムを分割しよう! プログラムを作成する上での重要点 プログラムの中で互いに関連の深い部分をひとまとめにし そのまとまりを明確にする プログラムを作成したり 修正 改良したりする際に一括して考慮しなければならない範囲を限定する 明確な思考の単位を作る 関数 に分割 例えば入力処理がある関数の中に完全に隔離されていれば 後々入力処理に関して何らかの修正や改良が必要になったとしても 見直さなければならない範囲が限定される

ソースファイルを分割する プログラム分割の単位 関数 ファイル 変数 関数の有効範囲 static 指定がある場合 ファイルの中 ( コンパイル単位内 ) のみで有効 static 指定がない場合 extern 宣言をつけることで他のコンパイル単位の変数をアクセス可能 関数の場合には extern は必要なく他のコンパイル単位の関数をアクセス可能

例教科書 p. 142 /* file 1 */ static int x; int y; void f(void) { x=y=0; void main(void) { f(); g(); printf("x=%d y=%d n",x,y); /*file 2*/ int x; extern int y; void g(void) { x=y=1;

分割して隠蔽せよ プログラムファイルを分割する際の原則 プログラムに何らかの変更を行う際に 同時に修正しなければならない ( 可能性の高い ) 関数を一つのファイルに集める 情報隠蔽 変数 関数の有効範囲は必要最小限度にとどめる 必要な物のみ外部からアクセスできるようにする データ構造の抽象化 データが内部で具体的にどのように保存されているのかわからないようにする データへのアクセスは関数を通してのみ

情報隠蔽とデータ構造の抽象化 /*file 2*/ void main(void) { writetable(1,20);... readtable(1); main.c table へのアクセスは関数を通じてのみ table がどのように実現されているかは外部からはわからない ( 配列以外の実装としても呼び出し ( この場合は main 関数 ) 側からはわからない ) #define TABLESIZE 50 static int table[tablesize]; void writetable(int i, int value ): { if(i>=0&&i<tablesize) table[i] = value; else exit(1); void readtable(int i) { if(i>=0&&i<tablesize) return table[i]; else exit(1); table.c

オブジェクト指向プログラミング言語が もつ 3 つの特色 カプセル化 プログラムコードとプログラムコードが扱うデータを一体化して外部の干渉や誤用から両者を保護する仕組み 非公開と公開 ポリモーフィズム 1 つの名前を 2 つまたはそれ以上の関連する目的に使用できるようにする性質 継承 1 つのオブジェクトが他のオブジェクトの性質を獲得するプロセス

ヘッダファイル ヘッダファイル 原型宣言 型宣言 マクロ定義などを複数のソースファイルで共有するために利用される 例 - addtree.h #ifndef _ADDTREE_H_ #define _ADDTREE_H_ #include "tnode.h" struct tnode *addtree(struct tnode *p, char *w); #endif addtree を使うソースファイルでは addtree.h をインクルードする

例 lec10-wordsearch.c を分割 プログラムのメイン main.c ノードの定義 tnode.h ノードのメモリ確保 talloc.c talloc.h 木構造へのノード追加 addtree.c addtree.h 木構造の印字 treeprint.c treeprint.h 入力から 1 単語取り出す getword.c getword.h

例 addtree.c #include <ctype.h> #include <string.h> #include "addtree.h" #include "talloc.h" struct tnode* addtree(struct tnode *p, char *w) { int cond; if(p==null){ p = talloc(); p->word = strdup(w); p->count = 1; p->left = p->right = NULL; else if ((cond=strcmp(w,p->word))==0){ p->count++; else if(cond<0){ p->left = addtree(p->left,w); else{ p->right = addtree(p->right,w); return p;

例 addtree.h #ifndef _ADDTREE_H_ #define _ADDTREE_H_ #include "tnode.h" struct tnode *addtree(struct tnode *p, char *w); #endif

例 main.c #include <ctype.h> #include <stdio.h> #include "tnode.h" #include "addtree.h" #include "treeprint.h" #define MAXWORD 100 int main(int argc, char **argv) { struct tnode *root; char word[maxword]; root = NULL; while(getword(word,maxword)!=eof){ if(isalpha(word[0])){ root = addtree(root,word); treeprint(root); return(0); addtree.h, treeprint.h の中でも tnode.h を include tnode.h の重複 include を防止する必要有

分割コンパイル 複数のソースファイルからなるプログラムをコンパイルする場合 cc -o prog file1.c file2.c file3.c 中間ファイルを生成後結合編集する場合 cc -c file1.c cc -c file2.c cc -c file3.c cc -o prog file1.o file2.o file3.o この場合 file1 を修正したとすれば 1 行目と 4 行目のみを実行すればよい

大規模プログラム開発によくある状況 あなたが開発しているプログラムは複数のプログラムから構成されています. つまりそれらをコンパイルし, リンクすることで 1 つの実行可能なプログラムが作成されます. 複数のプログラムのどれか 1 つを修正したときは, その修正ファイルのみをコンパイルし直し, 新しい実行プログラムを作成します. C. トンド, A. ネイサンソン, E. ヤント著,"Make の達人 ", Pearson Education Japan より

make make を使おう ファイルの更新時間をチェックし, 更新されていれば自動コンパイル Makefile と呼ばれるファイルに定義した指示に従って作業を実行 Makefile の記述例 prog: file1.o file2.o cc file1.o file2.o -o prog file1.o: file1.c file1.h cc -c file1.c file2.o: file2.c file2.h cc -c file2.c コンパイル方法 make prog を生成するための一連の手順を実行 make file1.o file1.o を実行するための一連の手順を実行

Makefile を記述する上での注意点 ターゲット / 依存関係行は 1 桁目から書きはじめる コマンド行は字下げ ( インデント ) する 行の内容が複数行に及ぶ場合は, 連続した行であることを示すため, 行末にバックスラッシュ記号をつける コメント行は # で始める

ターゲットと依存関係 Makefile の記述例 prog: file1.o file2.o cc file1.o file2.o -o prog file1.o: file1.c file1.h cc -c file1.c file2.o: file2.c file2.h cc -c file2.c ターゲット prog file1.o file2.o 依存関係 prog は file1.o file2.o に依存 file1.o は file1.c file1.h に依存 file2.o は file2.c file2.h に依存

マクロを利用した Makefile Makefile における変数 マクロには名前をつけて値を割り当て make が Makefile を実行時マクロを割り当てられた値に展開 例 CC = gcc CFLAGS = -c -W2 -O prog: prog1.o prog2.o $(CC) -o prog prog1.o prog2.o prog1.o: prog1.c prog1.h $(CC) $(CFLAGS) prog1.c prog2.o: prog2.c prog2.h $(CC) $(CFLAGS) prog2.c

依存関係記述にもマクロを利用可 CC = gcc CFLAGS = -c -W2 -O OBJS = prog1.o prog2.o TARGET = prog $(TARGET): $(OBJS) $(CC) -o $(TARGET) $(OBJS) prog1.o: prog1.c prog1.h $(CC) $(CFLAGS) prog1.c prog2.o: prog2.c prog2.h $(CC) $(CFLAGS) prog2.c

CC 内部マクロ ( よく使うもののみ ) C コンパイラのプログラム名が定義 (cc) $@ カレントターゲット prog: prog1.o prog2.o $(CC) -o $@ prog1.o prog2.o $* 拡張子を除くターゲット名 prog1.o: prog1.c prog1.h $(CC) $(CFLAGS) $*.c

推論規則 特定の拡張子を持った依存ファイルから特定の拡張を持つターゲットを生成できるような生成規則 ファイル名の拡張子に対して作用するため make ファイル中に記述するコマンドの簡略化に役立つ サフィックスルールとも呼ばれる

推論規則 ピリオド, 拡張子, もう一つのピリオド, もう一つの拡張子の順に記述する 例 1 例 2.c.o: $(CC) $(CFLAGS) $*.c.c ファイルをソースファイルとし.o ファイルを生成する.c.o: 例 1 と同様 $(CC) $(CFLAGS) $< $< は推論規則における依存ファイルを表す

推論規則を用いた Makefile CFLAGS = -c -W2 -O OBJS = addtree.o getword.o main.o talloc.o treeprint.o TARGET = wordsearch RM = rm $(TARGET): $(OBJS) $(CC) -o $@ $(OBJS) clean: $(OBJS) $(RM) -f $(OBJS).c.o: $(CC) -c $<

付録 curses で色付け int main(int argc, char **argv){ char text[128]; initscr(); start_color(); noecho(); cbreak(); curs_set(0); init_pair(1, COLOR_CYAN, COLOR_BLACK); init_pair(2, COLOR_RED, COLOR_BLACK); init_pair(3, COLOR_YELLOW, COLOR_BLACK); init_pair(4, COLOR_WHITE, COLOR_BLACK); bkgd(color_pair(4)); keypad(stdscr,true); go(); endwin(); return 0;

付録 curses で色付け void go() { char buffer[256][256]; char color_buffer[256][256]; for(j=0;j<256;j++){ for(i=0;i<256;i++){ buffer[j][i]=' '; color_buffer[j][i] = 0; while((ch=getch())!='q'){ attron(color_pair(4)); mvaddstr(blocy,blocx," "); mvaddstr(blocy+1,blocx," "); mvaddstr(blocy+2,blocx," "); for(j=0; j<lines; j++){ for(i=0; i<cols/2; i++){ attron(color_pair(color_buffer[j][i])); mvaddch(j, i, buffer[j][i] ); attron(color_pair(pattern+1)); for(jj=0; jj<3; jj++){ for(ii=0; ii<3; ii++){ mvaddch(blocy+jj, blocx+ii, blockpattern[pattern][jj][ii]); if( collisionbottomwall(blocx, blocy, LINES-3, pattern)){ for(jj=0; jj<3; jj++){ for(ii=0; ii<3; ii++){ buffer[blocy+jj][blocx+ii] = blockpattern[pattern][jj][ii]; color_buffer[blocy+jj][blocx+ii] = pattern+1; beep(); blocy = 5; pattern = (pattern+1)%patnum; sprintf(msg, "X %03d Y %03d Pat %02d", blocx, blocy, pattern ); attron(color_pair(4)); mvaddstr(2,cols-20,msg );

さらに工夫するとこんな画面も