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

Slides:



Advertisements
Similar presentations
University of Electro-Communications Human Interface section 基礎プログラミングおよび演 習 第7回.
Advertisements

第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
ループで実行する文が一つならこれでもOK
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
ゲームプログラミング講習 第1章 DXライブラリ入門
基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520.
第2章 数値の入力と変数 scanfと変数をやります.
基礎プログラミングおよび演習 第9回
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第8回.
C言語講座 第4回 ポインタ.
第6章 2重ループ&配列 2重ループと配列をやります.
第7回 条件による繰り返し.
第2回 Microsoft Visual Studio C++ を使ってみよう
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
第二回 VB講座 電卓を作ろう.
関数の定義.
プログラミング応用 printfと変数.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング入門 電卓を作ろう・パートIV!!.
プログラミング序論 2. n人のインディアン.
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
前回の練習問題.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
Cの実行モデル.
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
C言語 はじめに 2016年 吉田研究室.
オブジェクト プログラミング 第2回 プログラムの基本.
第1章 いよいよプログラミング!! ~文章の表示 printf~
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
第5回 プログラミングⅡ 第5回
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
プログラミング基礎演習 第4回.
第2章 printf(“変数と入力”); scanf(“%d”,&num);
標準入出力、変数、演算子、エスケープシーケンス
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
情報実習I (第1回) 木曜4・5限 担当:北川 晃.
コンパイラ 2012年10月11日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
第10回 関数と再帰.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
printf・scanf・変数・四則演算
第2章 数値の入力と変数 scanfと変数をやります.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
第5回 配列.
知能情報工学演習I 第10回( C言語第4回) 課題の回答
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

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

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

C言語の関数と式

関数らしくない関数/数式らしくない数式 第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文字

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

式と変数

式と変数 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が右辺に等しいのではなくて代入です

式と変数 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を代入

式と変数 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 メモリ

数学の=と違うところ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のまま) よく考えると、 数学の = は 意味がいろいろ

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

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

式と変数 変数の型 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

実数の変数 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 メモリ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

式と文

式が書けるところ もうお気づきだと思いますが、 式はいろんなところに書けます。 は式 #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で計算 は式

コメントと空白と改行 コメント・空白・改行は結構自由に入れられます。 間違った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) ; } #で始まる行は 勝手に改行しちゃだめ 単語の途中で改行 してはだめ 単語の途中に空白 を入れてはだめ 文字列の中で改行をれると改行も文字列 の一部になる

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

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

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以外の時

ブロックとは? いくつかの式をまとめたのをブロックといいます。 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

ブロックと変数の有効範囲 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)

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

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

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

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 : 永遠に終わりません

課題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() / 2147483647.0; で 0~1の乱数になります。 x2+y2 <1ならば円の中、 x2+y2 >=1ならば円の外なので、 int r; r = x2+y2 ; とすると、r が0なら円の中、1以上なら円の外になります。 while文を使って 10万回くらい計算して、確率からπを求めてみてください。