Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング論 I 2008年5月22日 講義概要 C言語復習

Similar presentations


Presentation on theme: "プログラミング論 I 2008年5月22日 講義概要 C言語復習"— Presentation transcript:

1 プログラミング論 I 2008年5月22日 講義概要 C言語復習

2 おわび 長期間,休講してしまい失礼いたしました. その分,補講を行います.

3 概要 講義概要 C言語復習

4 講義概要

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

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

7 練習 0 画面に"Hello!"と表示し,改行し,終了するプログラムを記述せよ.

8 解答例 0 #include <stdio.h> void main(){ printf("Hello!\n"); }

9 練習 1 画面に"Hello,World.\n"と10回表示するプログラムを記述せよ.

10 解答例 1 #include <stdio.h> void main(){ int i;
for(i=0; i<10; i++){ printf("Hello,World.\n"); }

11 C言語復習

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

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

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

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

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

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

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

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

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

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

22 インデントとフリーフォーマット プログラム内の 空白,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); }} ↑理解が困難.対応関係が分かりづらい.

23 コメント /* と */ で挟まれた領域は, コメントとして 無視される. 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

24 練習 2 画面に"Hello!"と表示し,改行し,終了するプログラムを記述せよ.

25 解答例 2 #include <stdio.h> void main(){ printf("Hello!\n"); }

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

27 変数 変数 変数とは,データ(数値)の入れ物. 変数に数値を代入して,計算を行う. 変数はブロックの先頭で宣言してから使う.
変数には,型がある.名前がある. ブロックについては,後日解説.

28 変数の宣言,代入,表示 1 #include <stdio.h> 2 void main(){ 3 int age;
printf("age = %d\n", age); 6 } 変数 age に整数19を代入. 以後, age には19が入っている. 変数 age を表示する. 実行結果 age = 19

29 変数の宣言 型名 変数名; 変数の宣言方法 int age; int型変数 “age” の宣言
float x, y; float型変数“x”と“y”の宣言 型名 変数名;

30 変数の宣言 変数の宣言はブロックの先頭で行う. OK 最初に全変数を宣言 NG 変数宣言 宣言以外が開始された 再度、宣言が行われる
#include <stdio.h> void main(){ int x; int y, z; x = 3; y = 4; z = x + y; printf("z=%d\n", z); } 最初に全変数を宣言 NG #include <stdio.h> void main(){ int x; x = 3; int y, z; y = 4; z = x + y; printf("z=%d\n", z); } 変数宣言 宣言以外が開始された 再度、宣言が行われる

31 float, double, long double
変数のデータ型 変数のデータ型には, int, char, float などがある. 整数を格納 浮動小数点を格納 符号付き char, short int, int, long int, long long int float, double, long double 符号なし unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int long long 型は,計算機センターのVisual Studio .NET にはない?

32 整数型の大きさ char型:1バイト.-128~127を格納可能. unsigned char型:1バイト.0~255
int 型の大きさは定められていない. OS,CPU,コンパイラにより異なる. 必ず の関係にある 符号付き と 符号なしの大きさは同じ. short int ≦ int ≦ long int ≦ long long int

33 整数型の大きさ 工学院大学計算機センターの例では 4バイトの符号付き整数の場合 short int 型 : 2バイト
long int 型 : 4バイト 4バイトの符号付き整数の場合 ~ の範囲を格納可能. #include <stdio.h> void main(){ printf("short int=%d\n", sizeof(short int)); printf("int=%d\n", sizeof(int)); printf("long int=%d\n", sizeof(long int)); } このプログラムで確認可能

34 変数への値の代入 代入は,以下のように行う int age, x; 変数名 = 値; age = 19; age に19を代入.
x = age; x に age(19)を代入. 変数名 = 値; 右の値が,左の変数にコピーされる. 19 = age; はNG.

35 変数への値の代入 int i; 整数型変数 i を宣言. double d; 浮動小数点型変数 d を宣言.
d=3.7; i=d; i に 3(整数)が代入される.

36 変数の表示 printf を用いて変数の値を表示できる. %d に int型変数の値が入って表示される.
long intなら %ld, floatなら%f, doubleなら%lf printf("age = %d\n", age); 実行結果 age = 19 printf("i=%d, d=%lf\n", i, d);

37 四則演算 + 加算 - 減算 * 乗算 / 除算 % 剰余 (除算の余り) ++ インクリメント(1増やす) -- デクリメント(1減らす)

38 その他 演算子 関係演算子 < <= >= > 等価演算子 == != 論理演算子 && || ! ビット演算子 & | ^ ~ << >>
関係演算子 < <= >= > 等価演算子 == != 論理演算子 && || ! ビット演算子 & | ^ ~ << >> 代入演算子 = += ー= *= など 条件演算子 ?: 文式の結合 , sizeof演算子 sizeof ポインタ演算子 & * キャスト (型) メンバアクセス演算子 . ー>

39 定数の記述 12 整数の 12 12.0 浮動小数点の12.0 012 8進数表記の12 (10進数の10)
12 整数の 12 12.0 浮動小数点の12.0 012 8進数表記の12 (10進数の10) 0x12 16進数表記の12 (10進数の18) 0x1Aなら,10進数の26 3.456E ×104

40 定数の記述 ’A’ ‘A‘ という1文字. 実際は,‘A’の文字コードの“65” "Hello" ‘H’ ‘e’ ‘l’ ‘l’ ‘o’
という文字列.

41 演算結果の型 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 は格納されない.

42 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型).

43 演算結果の型 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の演算.

44 練習 3 int型変数x, y, zの3個を用意して, xに3を,yに5を,zにx+yを代入して zを表示するプログラムを記述せよ.

45 解答例 3 #include <stdio.h> void main(){ int x, y, z; x = 3; y = 5;
printf("%d\n", z); }

46 制御文

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

48 比較演算子 a==b : aとbが等しい a!=b : aとbが等しくない a<b : bはaより大きい

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

50 真偽 厳密には,C言語には条件や真や偽はない. 値(式分)が「0以外」なら真,「0」なら偽とみなす.
注意:NULL は「0」なので 偽 である. if( 1+2 ){ プログラムA } else { プログラムB } 「3」は真を意味する. 結果,プログラムAに入る if( 4-4 ){ プログラムA } else { プログラムB } 「0」は偽を意味する. 結果,プログラムBに入る

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

52 条件分岐 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が実行される.

53 条件分岐 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 }

54 繰り返し 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"); }

55 繰り返し 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");

56 繰り返し 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回繰り返す.

57 結局,(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ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す.

58 繰り返し 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回繰り返す.

59 繰り返し 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"); }

60 繰り返し 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? 終了

61 練習 4 画面に"Hello!\n"と10回表示するプログラムを記述せよ.

62 解答例 4 #include <stdio.h> void main(){ int i;
for(i=0; i<10; i++){ printf("Hello!\n"); }

63 繰り返し 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++; }

64 中身(プログラム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 );

65 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; を実行すると, 繰り返しが中断される.

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


Download ppt "プログラミング論 I 2008年5月22日 講義概要 C言語復習"

Similar presentations


Ads by Google