Presentation is loading. Please wait.

Presentation is loading. Please wait.

基礎プログラミングおよび演習 第3回 担当:長谷川晶一@5階522/520.

Similar presentations


Presentation on theme: "基礎プログラミングおよび演習 第3回 担当:長谷川晶一@5階522/520."— Presentation transcript:

1 基礎プログラミングおよび演習 第3回

2 復習 式とprintf() C言語は、式の値を計算してくれる。 printf() は式の計算結果を表示できます。 整数と実数を区別
整数/整数は切捨で整数になる。 printf() は式の計算結果を表示できます。 printf(文字列 , 式); として、文字列の中に %dや%f を書と、 %dや%fが、式の計算結果で置き換えられて表示されます。 整数は%d , 実数は%f #include <stdio.h> int main(){ printf(”計算結果は %d と %f です。 \n ”, *3, 9/2.0); } 出力: 計算結果は70 です。

3 C言語の関数と式

4 関数らしくない関数/数式らしくない数式 第1回に、 printf()やgetchar()も関数だと言いました。
出力した文字数(整数値)をとります。 printf(”abc\n”)+printf(”def\n”)*printf(”ghi\n”); abc def ghi printf(”abc”) printf(”def”) printf(”ghi”) が計算された後 * + が計算されます。 printf( ”文字数は%d\n”, printf(”abc\n”)+printf(”def\n”) ); abc def 文字数は8 \n は \n で「改行」という1文字になります。 abc\ndef\n なので、全部で8文字

5 数学の関数との比較 関数(function )の関数らしいところ 引数を入れると値が返ってくるところ 数学の関数を思い出すと 関数の定義
f(x) は xを引数にとって、 x2 +3x+4を計算した値をとる C言語の関数の定義は そのうち説明します。 関数の使用 f(2)の値は、f(x)の定義から 計算すると14   今回は、 C言語での関数の使い方を 説明しました。

6 式と変数

7 式と変数 C言語は、式が計算できます。 数学でも文字を使いましたが、 C言語でも使います。でも結構違います。 20を3倍して、10足す
  数学でも文字を使いましたが、 C言語でも使います。でも結構違います。 #include <stdio.h> int main(){ 10+20*3; } 20を3倍して、10足す 計算をしてくれますが、これでは結果がわかりません #include <stdio.h> int main(){ int x; x = 10+20*3; } 整数 x を用意 (数学と違って、xをつかうから  用意しろとコンパイラに教えて  やる必要があります) 整数 x に10+20*3を代入 (数学とちょっと違います。  xが右辺に等しいのではなくて代入です

8 式と変数 C言語では式に出てくる文字のことを「変数」 といいます。 #include <stdio.h> int main(){
int x; int a; a = 2; x = a * a; printf (”%d”, x); a = 3; } 整数 x を用意 (C言語用語で宣言っています) 整数 a を宣言 aに2を代入 xに a*aを代入 aに3を代入

9 式と変数 2 2 2*2 4 3 C言語の変数は、メモリに作られます。 x x a x a x a x a
#include <stdio.h> int main(){ int x; int a: a = 2; x = a*a; printf (”%d”, x); a = 3; } メモリ x a メモリ 2 x a メモリ 2 2*2 x a メモリ 4 3 x a メモリ

10 数学の=と違うところ1 代入(let)と 数学の=(equal)はぜんぜん違う 数学 C言語 を代入 よく考えると、
#include <stdio.h> int main(){ int x; int a: a = 2; x = a*a; printf (”%d”, x); a = 3; } を代入 整数 x を宣言 整数 a を宣言 aに2を代入 xに a*aを代入 aに3を代入 (xは4) (xは4のまま) よく考えると、 数学の = は 意味がいろいろ

11 数学の=と違うところ2 Cの=はいつも代入の意味 = は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。
= は、 右辺を左辺に代入する演算です。 なので、右辺は変数でないとだめです。 int x; x = 3; 3 = x; これはOK これはエラー invalid lvalue in assignment 代入で左辺値が無効です int x; 3*x = 30; これもエラー。 x=10とはならない。 =は、方程式を解いてはくれない。

12 変数の宣言 変数の宣言 宣言だけ 宣言してついでに代入 型名 変数名 型名 変数名 式
型名は、 int (整数 integer の略)か、 double(実数 サイズが倍 doubleなので) のどちらか。 変数名は、変数の名前。 最初は英字、2文字目以降は英数字と_なら何でもOK ただし、 int とか doubleのような、C言語で別の意味がある単語はだめ。 (コンパイルエラーがでるので分かります) 代入の式はあってもなくてもOK。 宣言ついでに代入することを、初期化と呼びます。 宣言だけ 宣言してついでに代入 int var1_Name; double var2_Name = 10*sin(1.2); 型名 変数名 型名  変数名  式

13 式と変数 変数の型 C言語は、整数と実数をしっかり区別します。 変数も整数と実数で違います。 int x; x = 2; x = 2.5;
代入しても型は変わらない double x; x = 2; x = 2.5; x = 5/2; x = x*5/4; 実数の変数 x を用意 x は2.0 (実数) 代入しても型は変わらない x は2.5 (実数) 5/2が先に計算される。 5/2の計算にxの型は影響しない x は2.0 (実数) x は2.5 (実数) 今xが2.0なので、 x*5 は、10.0、10.0/4 は2.5

14 実数の変数 x x a 2.5 x a 2.0 x a 2.0 2 x a double はメモリ上 での大きさが倍 なので、double
といいます。 double x; int a; x = 2.5; x = 2; a = 2.5 メモリ x a メモリ 2.5 x a メモリ 2.0 x a メモリ 2.0 2 x a メモリ

15 課題5 変数の様子をデバッガで追ってみる デバッガで、変数に値が代入される様子を 見てみてください。 プログラムは、整数と実数の変数が宣言されていて、数値が代入されていれば 何でもかまいません。 資料を見てもデバッガの使い方が分からない場合は、必ずTAか先生に質問してください。

16 1行ずつ実行する方法 デバッガを使ってみてください 問題点の発見に、とても役立ちます
デバッガの使い方 前編 1行ずつ実行する方法 デバッガを使ってみてください 問題点の発見に、とても役立ちます

17 デバッグ 1 ブレークポイントの設定 カーソルを int main( … の行にあわせて ブレークポイントをクリック

18 デバッグ 2 メニューからデバッガを選んでデバッガを起動

19 デバッグ 3 デバッグを開始 ビルドとデバッグ をクリック

20 デバッグ 3-1 もしボタンが出ていなかったら メニューから [表示]-[ツールバーを表示] を選んで表示する ここに ボタン がない!

21 デバッグ3-2 すると、ボタンがあらわれるので、「デバッグ」を押す。

22 デバッグ 4 デバッグを開始すると、ブレークポイントで停止します。 デバッガの窓の下半分に実行中のソースコードが表示されます。

23 デバッグ 5 – ステップ実行 1 ブレークポイントで止まった後は、 ステップオーバーで1行ずつ実行して様子を見ることができます。
デバッグ 5 – ステップ実行 1 ブレークポイントで止まった後は、 ステップオーバーで1行ずつ実行して様子を見ることができます。 実行中の行

24 デバッグ 6 – ステップ実行 2 getchar()のようなキー入力が必要な関数を通るときは、 実行中の行

25 デバッグ 7 – ステップ実行 3 キー入力が終わるまで、実行したままになり、 デバッガに帰ってきません。 実行中の行

26 デバッグ 8 – ステップ実行 4 そんなときは、「標準I/Oログ」をメニューから選び

27 デバッグ 9 – ステップ実行 5 標準I/O ウィンドウを出して、 キー入力して([ENTER]を押して)ください。

28 デバッグ 10 – ステップ実行 6 次の行に進むことができます。

29 デバッグ 11 – ステップ実行 7 どんどん実行すると、プログラムが終わります。 参考
デバッグ 11 – ステップ実行 7 どんどん実行すると、プログラムが終わります。 参考 プログラムが終わっても、デバッガは終了しません。 アセンブラが表示されますが、気にしないでください。

30 デバッガの使い方 後編 変数の値を見る

31 デバッガ12 デバッグ中、ブレークポイントで止まると、 「ステップオーバー」をおすとこの行が実行される。 変数と 現在の 値が表 示される

32 デバッガ13 実行すると、変化した変数が赤くなる aに2が代入 されている

33 デバッガ14 また「ステップオーバー」を押すと xにa*aが代入 される。aは2な のでxは4になる。

34 デバッガ15 さらに進めると aに3が代入 された様子 xは変化なし

35 式と文

36 式が書けるところ もうお気づきだと思いますが、 式はいろんなところに書けます。 は式 #include <stdio.h>
int main(){ int x = 10; double a = sin(1.2): x = a*a; printf (”%d”, x*2) ; return 0; } xを宣言して10で初期化 aを宣言してsin(1.2)で初期化 x に a*aを代入 printf()の呼び出し =関数 printf()の値を、引数、 ”%d” と x*2で計算 は式

37 コメントと空白と改行 コメント・空白・改行は結構自由に入れられます。 間違ったC言語
コメントには、 // から改行までのほかに、 /* から */までという書き方もあります。 (読みにくいが) 正しいC言語 間違ったC言語 #include <stdio.h> int  /*コメント*/ main ( /*コメント*/ ) { /*コメント*/    int x = // コメント    10 /*コメント*/ ;    x = a * /*コメント*/ a /*コメント*//2 ;    printf (”%d”, /*コメント*/ x*2) ; return 0; } #include <stdio.h> int ma in(){ i nt x = 10; pri ntf ( ”2x=   %d”, x*2) ; } #で始まる行は 勝手に改行しちゃだめ 単語の途中で改行 してはだめ 単語の途中に空白 を入れてはだめ 文字列の中で改行をれると改行も文字列 の一部になる

38 式と文 C言語では、「式; 」を文と言います。 文の例 他にも文がいくつかあります。 式の文→式を計算する 3 * 10 ; int i;
double d; int x = 3*10; 式の終わりを表すセミコロン 式の文 宣言文→整数の変数iを宣言する 宣言文→実数の変数dを宣言する 宣言文→整数の変数xを宣言し、 3*10を代入(で初期化)する 型名 変数名 初期化の式 セミコロン 宣言文

39 if文 式の値によって、実行したりしなかったりするのがif文です。 if (式) 文かブロック1 else 文かブロック2 次の文
  文かブロック1 else   文かブロック2 次の文 if (式)   文かブロック1 次の文 まず、式を計算します。 式の値が0以外なら、 「文かブロック1」を実行して 次にすすみます。 式の値が0なら「文かブロック1」 を飛ばして次に進みます。 まず、式を計算します。 式の値が0以外なら、 「文かブロック1」を実行して 次に進みます。 式の値が0なら、 「文かブロック2」を実行して 次に進みます。

40 if文 式の値によって分岐する特殊な文 if (式) 式が0以外の時に実行する文かブロック else 式が0の時に実行する文かブロック
  式が0以外の時に実行する文かブロック else   式が0の時に実行する文かブロック 無くてもOK #include <stdio.h> int main(){ if (10/3) printf(”0以外のとき\n”); else printf(”0の時\n”); } #include <stdio.h> int main(){ if (10/3) printf(”0以外のとき\n”); } 0以外の時

41 ブロックとは? いくつかの式をまとめたのをブロックといいます。 0の時 x = 0 #include <stdio.h>
int main(){ int x ; if (2/3) { x = 1; printf(”0以外のとき\n”); } else x = 0; printf(”0の時\n”); printf(”x = %d”, x); 2/3は0 0以外の時に実行するブロック 0の時に実行するブロック 0の時 x = 0

42 ブロックと変数の有効範囲 main()の中身は、文だけでなくブロックもOKです。 変数はブロックの中だけで使えます。 aの有効範囲
int main(){ int a;  { int x; x = 2*3;    printf(”%d\n”, x); } printf(”%d\n”, x); return 0; aの有効範囲 xの有効範囲 コンパイルエラー: `x' undeclared (first use in this function)

43 if 文の例 flag には確率1/2で、0か1が入る 結果は試してみてください。 #include <stdio.h>
int main(){ int flag = rand() / ; if (flag) printf(”rand > ”); else printf(”rand <= ”); flag = rand() / ; flag = rand() / ; : return 0; } flag には確率1/2で、0か1が入る 結果は試してみてください。

44 ここでありがちなエラー 同じ名前の変数を2回宣言するとエラー redeclaration of ‘flag' with no linkage
#include <stdio.h> int main(){ int flag = rand() / ; if (flag) printf(”rand > ”); else printf(”rand <= ”); } redeclaration of ‘flag' with no linkage リンケージの無い‘flag’の 再宣言です。 同じ変数が2回宣言されました それも、1回目との関係について 言及されていないので、どうして よいかわかりません。

45 while 文 何度も繰り返す特殊な文が while 文です。 式の値が0になるまで、文かブロックを 繰り返し実行します。具体的には、
#include <stdio.h> int main(){ int i=5; while(i){ printf(”i = %d\n”, i); i = i–1; } while(式)   文かブロック 式の値が0になるまで、文かブロックを 繰り返し実行します。具体的には、 まず、式を計算します。 式の値が0以外なら、 文かブロックを実行します。 式の値が0なら、4に進みます。 1に戻ります。 while文を終わり次に進みます。 i = 5 i = 4 i = 3 i = 2 i = 1

46 while文の例 無限ループ エラーではないですが、終わらないプログラムです。 i = 5 i = 4 i = 3 i = 2 i = 1
#include <stdio.h> int main(){ int i=5; while(1){ printf(”i = %d\n”, i); i = i–1; } i = 5 i = 4 i = 3 i = 2 i = 1 i = -1 i = -2 i = -3 : 永遠に終わりません

47 課題6 乱数を使って円周率πを求めてみてください。 モンテカルロ法と言います。 正方形の面積は1 1 4分の1円の面積は、π/4 1
(0,0)~(1,1)の間のランダムな点(x,y)が、1/4円の中に入る確率Pを考えると 面積の比になるので P=0.25π/1 になるはず。 ということは、π=4P。 x, y は、 double x; x = rand() / ; で 0~1の乱数になります。 x2+y2 <1ならば円の中、 x2+y2 >=1ならば円の外なので、 int r; r = x2+y2 ; とすると、r が0なら円の中、1以上なら円の外になります。 while文を使って 10万回くらい計算して、確率からπを求めてみてください。


Download ppt "基礎プログラミングおよび演習 第3回 担当:長谷川晶一@5階522/520."

Similar presentations


Ads by Google