Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング論 I 講義,テスト C言語復習 http://www.ns.kogakuin.ac.jp/~ct13140/Prog.

Similar presentations


Presentation on theme: "プログラミング論 I 講義,テスト C言語復習 http://www.ns.kogakuin.ac.jp/~ct13140/Prog."— Presentation transcript:

1 プログラミング論 I 講義,テスト C言語復習

2 概要 講義,テスト C言語復習

3 講義について

4 プログラミング論I 概要 諸問題を数学とコンピュータを用いて解くためのアルゴリズムを学ぶ. プログラミング力を付ける
アルゴリズムについて学ぶ 主に数学的問題を解く 使用する言語は C言語

5 プログラミング論Iと演習I 論Iで理論を学び,演習Iでそれを実践してみる. 両科目を併せて取ることをお勧めします.

6 教科書 必ず教科書を購入すること! 教科書なしでの学習は不可能. テストは許可書等持ち見込み可 新C言語入門 ビギナー編 林 晴比古 (著)
出版社: ソフトバンククリエイティブ

7 テスト プログラミング論I,II,プログラミング演習I,IIの試験は「紙媒体のものは全て持ち込み可」とします.
C言語の教科書の購入を強く推奨します. 当然,授業,演習も教科書を持参し参照することを強く推奨します. 試験は筆記試験のみです. 詳細は,Webページ参照

8 C言語復習 来週もこの資料を持参してください

9 C言語,ソースファイルの作成,コンパイル,実行

10 C言語 プログラムとは,“計算機を動かす手順を記述したもの”. C言語はプログラミング言語の1個
計算機に命令を与えて動かすには“プログラムを作成する”ことになる. C言語はプログラミング言語の1個 手続き型言語に分類される. C/C++ は非常に多くの場面で使われる言語 C++はC言語をオブジェクト指向に拡張したもの

11 C言語プログラミングの手順 ソースファイルを作成し,コンパイルし,実行. “hello.c” “hello.exe” ソースファイル
source file C言語 人間が記述する. コンパイルする compile 実行ファイル executable exe マシン語 通常人間に読めない コンパイラ compiler (Visual C++, gcc, bcc など) ・C言語では,ソースファイルを直接実行することができない.  ソースファイルをコンパイルして実行ファイルを作成し,実行ファイルを実行する. ・“ソースファイル” を “原始ファイル” と呼ぶこともある(ごくまれ). ・実行ファイルの拡張子はOSに依存する.Windows では “.exe” となる. ・厳密には,コンパイルとリンク(link)を行い実行ファイルを作る.

12 コンパイルとリンク エディタ コンパイラ ソースファイル “abc.c” コンパイル オブジェクト ファイル “abc.o” エディタ
リンカ 実行ファイル “xyz.exe” ソースファイル “def.c” コンパイル オブジェクト ファイル “def.o” リンク 標準ライブラリ

13 C言語のソースファイルの骨格 #include <stdio.h> void main(){ }
ヘッダ(header)ファイルの読み込み. 先頭に必ず書く. void main(){ } でプログラム本体を 挟む ここにプログラムの本体を記述する. void main(){ } でプログラム本体を 挟む

14 何も起きないプログラム 1 #include <stdio.h> 2 3 void main(){ 4 }
4 } 半角で記述する.大文字と小文字は明確に区別される. 上記を入力し,実行する. Error メッセージ,Warning(警告)メッセージ を確認する. Errorは明確な誤りへのメッセージ Warningは誤りではないが好ましくないことへのメッセージ

15 文字列を表示するプログラム 1 #include <stdio.h> 2 3 void main(){
printf("Hello, World!\n"); 5 } “Hello world!” と 表示するプログラム. printf を 使えば,” ” で囲った文字列を表示できる. “\n”は,改行を意味する. printf(“Hello\nWorld!\n”); として実行.動作を確認.

16 C言語の式と文 式 文 (式文) は 式; a 10 3+4 a+4 a++ a = 7 3 < a ”hello”
printf(”hello”) 文 (式文) は 式; printf(”hello”); a=3; a++; a; 正しいが, 通常あり得ない

17 C言語の文 (関数の呼び出し) printf("Hello, World!\n"); 関数の引数は()で囲み,中に式を書く. 関数名
セミコロン

18 文字列を表示するプログラム 1 #include <stdio.h> 2 3 void main(){
printf("Hello,\n"); printf(“C lang.\n"); printf("World!\n"); 7 } 上から下に進む hello01.c

19 インデントとフリーフォーマット プログラム内の 空白,TAB文字,改行は 無視される. よって,どのように 書いても問題ない.
#include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); } プログラム内の 空白,TAB文字,改行は 無視される. よって,どのように 書いても問題ない. 当然,見やすく書くことが 好ましい. #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); } #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); } ↑対応関係がわかりづらい. ↑対応関係が誤り. #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); }} ↑理解が困難.対応関係が分かりづらい.

20 コメント /* と */ で挟まれた領域は, コメントとして 無視される. 1 #include <stdio.h>
実行されない. // から行末までの領域も, コメントとして無視される. ただし,これはC++の機能であり C言語の機能ではない. (実際はほとんどのC言語のコンパイラにこの機能が付いている) コメント部にはデタラメに書いても問題ない. 正しいC言語の文も無視される. 1 #include <stdio.h> 2 3 void main(){ /* print hello */ // print hello printf("Hello,\n"); 7 /* printf("World!\n"); */ 11 } hello02.c

21 数値計算を行う 変数,演算

22 演算結果の型 X型とX型の演算結果はX型. int a=7, b=2; double d; d = a + b; d = a / b;
a + b は int型とint型の演算. 演算結果も int 型. a+b は 9 (int型). dには9.0 (double型)が入る. a / b は int型とint型の演算. 演算結果も int 型. a / b は 3 (int型). dには 3.0 (double型)が格納される. 3.5 は格納されない.

23 a / b は int型とdouble型の演算.
演算結果の型 X型とY型の演算結果はXorY型. 優先度の高い型が勝つ. double > float > long > int > char の優先順 int a=7; double d=2.0, e; e = a / d; a / b は int型とdouble型の演算. double型が勝つので, 演算結果はdouble型. 7.0 / 2.0 と解釈され, 演算結果は 3.5 (double型).

24 演算結果の型 double d; d = 7 / 2; /* intとintの演算.結果はintの 3 */
d = 7 / 2.0; /* intとdoubleの演算. 結果はdoubleの3.5 */ d = 7.0 / 2; /* doubleとintの演算. d = 7.0 / 2.0; /* doubleとdoubleの演算.

25 制御文

26 真偽 条件が成り立つ場合,その条件式は真である. 例えば, (3 < 4) は真 true (3 == 4) は偽 false

27 比較演算子 a==b : aとbが等しい a!=b : aとbが等しくない a<b : bはaより大きい
注意! OK NG 比較 代入 != <= >= =! =< => a==b a=b

28 論理演算子 条件 && 条件 条件 || 条件 !条件 論理積(and):両方成り立つ場合に真
論理和(or):少なくとも片方が成り立つ場合に真 !条件 否定(not):条件が成り立たないときに真. 真偽が逆転される

29 条件分岐 if 文 if( 条件式X ){ プログラムA } if( 条件式X ){ プログラムA } else { プログラムB }
実行される. 偽の場合(成り立たない場合)は 何も実行されない. if( 条件式X ){ プログラムA } else { プログラムB } 条件Xが真の場合 前半のプログラムAが 実行され, 偽の場合(成り立たない場合) 後半(else部)の プログラムBが実行される

30 条件分岐 if 文 if( 条件式X ){ プログラムA } else if( 条件式Y ){ プログラムB
} else if( 条件式Z ){ プログラムC } else { プログラムD } プログラムE 条件式Xが成り立つ場合, プログラムAが実行され, その後プログラムEに移る. プログラムB,C,Dは全て“条件式Xのelse”の 中にあるため,たとえ条件式Yや条件式Zが成り立っても実行されない. 条件式Xが偽の場合に限り,条件式Yが検証される. 条件式Xが偽で かつ 条件式Yが真 の場合,プログラムBが実行され,プログラムEに移る. プログラムC,Dは実行されない. 条件式Xが偽,条件式Yが偽,条件式Zが真の場合,プログラムC,Eが実行される. 全てが偽の場合,プログラムD, Eが実行される.

31 条件分岐 if 文 1 #include <stdio.h> 2 void main(){ 3 int a=12;
if( a < 10 ){ printf("a < 10 (a = %d)\n", a); } else { printf("10 <= a (a = %d)\n", a); } 9 }

32 条件分岐 if 文 1 #include <stdio.h> 2 void main(){ 3 int a=8;
if( a < 10 ){ printf("a < 10 (a = %d)\n", a); } else { printf("10 <= a (a = %d)\n", a); } 9 }

33 条件分岐 if 文 #include <stdio.h> void main(){ int a=8;
if( a < 10 ){ printf("A\n"); } printf("B\n"); 実行結果 A B

34 条件分岐 if 文 実行結果 A B #include <stdio.h> void main(){ int a=23;
printf("A\n"); } if( 20 <= a ){ printf("B\n"); if( 30 <= a ){ printf("C\n"); 実行結果 A B

35 条件分岐 if 文 実行結果 A #include <stdio.h> void main(){ int a=8, b=8;
if( b < 10 ){ printf("A\n"); } else { printf("B\n"); } if( b < 7 ){ printf("C\n"); printf("D\n"); 実行結果 A

36 条件分岐 if 文 実行結果 D #include <stdio.h> void main(){ int a=12, b=8;
if( a < 10 ){ if( b < 10 ){ printf("A\n"); } else { printf("B\n"); } if( b < 7 ){ printf("C\n"); printf("D\n"); 実行結果 D

37 おまけ 著しく読みづらいソースコード #include <stdio.h> void main(){
int a=12, b=8; if( a < 10 ){ if( b < 10 ){ printf("A\n"); } else { printf("B\n"); } if( b < 7 ){ printf("C\n"); printf("D\n");

38 条件分岐 if 文 #include <stdio.h> void main(){ int a=12, b=8;
if( a < 10 && b < 10 ){ printf("A\n"); } else { printf("B\n"); } 実行結果 B

39 条件分岐 if 文 #include <stdio.h> void main(){ int a=12, b=8;
if( a < 10 || b < 10 ){ printf("A\n"); } else { printf("B\n"); } 実行結果 A

40 条件分岐 if 文 #include <stdio.h> void main(){ int a=12, b=8;
if( ! (a<10||b<10) ){ printf("A\n"); } else { printf("B\n"); } 実行結果 B

41 真偽 厳密には,C言語には条件や真や偽はない. 値(式分)が「0以外」なら真,「0」なら偽とみなす.
注意:NULL は「0」なので 偽 である. if( 1+2 ){ プログラムA } else { プログラムB } 「3」は真を意味する. 結果,プログラムAに入る if( 4-4 ){ プログラムA } else { プログラムB } 「0」は偽を意味する. 結果,プログラムBに入る C言語になれるまでは,このような変な(?)表現は使わなくて良い.

42 繰り返し for 文 同じ処理を何度も繰り返すには for 文を使う. int i; for( i=0; i<5; i++){
処理A; } 処理Aを 5 回繰り返す. Hello! 結果 int i; for(i=0; i<3; i++){ printf("Hello!\n"); } World! 結果 int i; for(i=0; i<7; i++){ printf("World!\n"); }

43 繰り返し for 文 (i=0; i<3; i++) int i; for(i=0; i<3; i++){
printf("Hello,\n");  printf("World!\n"); } (i=0; i<3; i++) 「i が 0 から 3未満の範囲で(2まで), 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. i=0 → iが0から始まる. i<3 → iが3未満である限り続ける i++ → i は1ずつ増える i が“0から3未満(2まで)”なので, i =0, i =1, i=2 の3回繰り返す. i=0 として printf("Hello,\n"); printf("World!\n"); i=1 として printf("Hello,\n"); printf("World!\n"); printf("Hello,\n"); printf("World!\n"); i=2 として printf("Hello,\n"); printf("World!\n");

44 繰り返し for 文 int i; 「i が 10 から始まり 13未満の範囲で for(i=10; i<13; i++){
printf(“i=%d\n“,i); } 「i が 10 から始まり 13未満の範囲で (12まで),繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,i=10, i=11, i=12 の3回繰り返す. int i; for(i=0; i<6; i+=2){ printf(“i=%d\n“,i); } 「i が 0 から始まり 6未満の範囲で, 繰り返す.i は2ずつ増える.」 という意味の 繰り返し. 結局,i=0, i=2, i=4 の3回繰り返す. int i; for(i=2; 0<=i; i--){ printf(“i=%d\n“,i); } 「i が 2 から始まり 0 以上の範囲で, 繰り返す.i は1ずつ減る.」 という意味の 繰り返し. 結局,i=2, i=1, i=0 の3回繰り返す.

45 結局,(10<3が偽なので)1回も実行しない.
繰り返し for 文 int i; for(i=10; i<3; i++){ printf(“i=%d\n“,i); } 「i が 10 から始まり,3未満の範囲で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,(10<3が偽なので)1回も実行しない. int i; for(i=3; 0<=i; i++){ printf(“i=%d\n“,i); } 「i が 10 から始まり,0以上の範囲で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す. int i; for(i=0; ; i++){ printf(“i=%d\n“,i); } 「i が 0 から始まり,無条件で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す.

46 繰り返し for 文 for( 式1; 式2; 式3 ){ プログラム } int i; for (i=0; i<2; i++){
printf()を実行. ブロックが終わり,i++を行い,ブロックの最初に戻る. i<2 の真偽を調べる.真である(i=1). i<2 の真偽を調べる.偽である(i=2). よって,forを終了する. 最初に式1を行う 式2が真である限り, ブロックの中身を繰り返す. 1回繰り返すたびに式3を行う. int i; for (i=0; i<2; i++){ printf("i=%d\n"); }

47 繰り返し for 文 動作原理 N Y int i; for(i=0; i<3; i++){ printf("Hello,\n");
 printf("World!\n"); } printf("End\n"); N i<3? Y printf("Hello,\n"); printf("World!\n"); i++; printf("End\n");

48 繰り返し for 文 動作原理 終了 int i; for(i=0; i<3; i++){ printf("Hello,\n");
printf("World!\n"); int i; for(i=0; i<3; i++){ printf("Hello,\n");  printf("World!\n"); } i++; /*i=1となる*/ i<3? printf("Hello,\n"); printf("World!\n"); i++; /*i=2となる*/ i<3? printf("Hello,\n"); printf("World!\n"); i++; /*i=3となる*/ i<3? 終了

49 繰り返し for 文 for文の中にfor文 同義 黄:Helloと1回表示. 青:Helloと4回表示.黄色を4回繰り返す.
int i, j; for(i=0; i<3; i++){ printf("Hello\n"); } int i, j; for(i=0; i<3; i++){ for(j=0; j<4; j++){ printf("Hello\n"); } 同義 黄:Helloと1回表示. 青:Helloと4回表示.黄色を4回繰り返す. 結果,4回×3回=12回繰り返す.

50 繰り返し for 文 for文の中にfor文 『printf() をj=0~3の4回繰り返す』をi=0~2の3回繰り返す.
int i, j; for(i=0; i<3; i++){ for(j=0; j<4; j++){ printf("i=%d,j=%d\n",i,j); } 『printf() をj=0~3の4回繰り返す』をi=0~2の3回繰り返す. 結果,4回×3回=12回繰り返す.

51 繰り返し while 文 while( 条件式X ){ プログラムA } int i=0; while( i<2 ){
i<2 の真偽を調べる.真である(i=0). よって,whileの中のブロックに入る. printf()を実行. i++ により i が1になる. ブロックが終わり,ブロックの最初に戻る. i<2 の真偽を調べる.真である(i=1). i++ により i が2になる. i<2 の真偽を調べる.偽である(i=2). よって,whileを終了する. 条件Xが真である限り, 中身(プログラムA)を 繰り返し実行する. 毎回,条件式を評価してから, プログラムを実行する. int i=0; while( i<2 ){ printf("i=%d\n"); i++; }

52 中身(プログラムA)を繰り返し実行する.
繰り返し do-while 文 do{ プログラムA }while(条件式X ); iが0になる. printf()を実行. i++ により i が1になる. ブロックが終わり,i<2 の真偽を調べる.真である(i=1). よって,再度,whileブロックの中を実行. i++ により i が2になる. ブロックが終わり,i<2 の真偽を調べる.偽である(i=2). 条件Xが真である限り, 中身(プログラムA)を繰り返し実行する. 毎回,プログラムを実行してから, 条件式を評価する. よって,最低でも1回は実行される. int i=0; do{ printf("i=%d\n"); i++; } while( i<2 );

53 break による 繰り返しの中断 break; を実行すると, 繰り返しが中断される. 実行結果 int i;
for(i=0; i<10; i++){ printf(“i=%d\n“,i); if( i==3 ){ break; } printf(“Fin!\n“,i); 実行結果 i=0 i=1 i=2 i=3 Fin! 繰り返し中断 break; を実行すると, 繰り返しが中断される.

54 無限ループ for(;;){ printf("Hello, World!\n"); } while(1){
無条件で繰り返し. 無限ループとなる. for(;;){ printf("Hello, World!\n"); } while(1){ printf("Hello, World!\n"); } while文で条件部に1と書くと, 条件が必ず成立するので 無限ループとなる. (1は真偽における“真”であるため.)

55 例 1, 4, 9, 16, 25, 36,…,100と出力 int i, x; for(i=1; i<=10; i++){
x = i*i; printf("%d\n", x); }

56 配列

57 C言語:変数の宣言と利用 変数の宣言 int i; double d; i = 3; d = 5.7;
printf("i=%d, d=%lf\n", i, d); “ d ”という名前の 浮動小数点型変数を宣言. 変数 i に整数 3 を代入. 以後, i には 3 が入っている. プログラム 実行結果 i=3, d=

58 C言語:配列の宣言と使用 配列 int型が3個の配列. data[0]~data[2] が使用可能. int data[3]; int i;
for(i=0; i<3; i++){ printf("data[%d]", i); printf("=%d\n", data[i]); } "0から始めて,3未満" でfor文を使うと やりやすい. data[0]=3 data[1]=4 data[2]=5 実行結果 プログラム

59 C言語:2次元配列 int型が2×3=6個の配列. data[0][0]~data[2][1] が使用可能. 「長さ2個の配列」が3個.
(長さ3の配列が2個でない) int data[3][2]; int i, j; data[0][0] = 3; data[0][1] = 4; data[1][0] = 5; data[1][1] = 6; data[2][0] = 7; data[2][1] = 8; for(i=0; i<3; i++){ for(j=0; j<2; j++){ printf("data[%d][%d]", i, j); printf("=%d\n", data[i][j]); } data[0][0]=3 data[0][1]=4 data[1][0]=5 data[1][1]=6 data[2][0]=7 data[2][1]=8 プログラム 実行結果


Download ppt "プログラミング論 I 講義,テスト C言語復習 http://www.ns.kogakuin.ac.jp/~ct13140/Prog."

Similar presentations


Ads by Google