University of Electro-Communications Human Interface section 基礎プログラミングおよび演習 第 2 回 担当 : 長谷川晶一 @5 階 522/520
復習 C 言語の基本 #include <stdio.h> int main(int argc, const char* argv[]){ // insert code here printf ( Hello, World! n ); return 0; } // insert code here printf ( Hello, World! n ); return 0; C 言語では この部分に書いたプログラムが上から順に実行されます // から行末までは コメントコンパイラはコメントを読みません 他の人がプログラムを読むときに助けなるようなことや 自分のためのメモを書くために使います このコメントは Xcode が書いたコメントで ここにコードを挿入してください ということです
復習 C 言語の書き方 // insert code here printf ( Hello, World! n ); return 0; printf という関数 (function: 機能 ) を呼び出しています printf( 出力したい文字列 ) ; 関数の名前 関数の引数 文の終わりをあらわすセミコロン 関数 printf は文字列を出力します n は表示すると 改行になります Mac と PC でフォントが違うので Mac では n の代わりに n= バックスラッシュ n になります
復習上から順に実行される 上から順に実行されることを確かめるために もう 1 つだけ関数を覚えましょう #include <stdio.h> int main(){ printf ( Plase hit ENTER key n ); getchar(); printf ( Thankyou n ); } 上から順に実行されます 1 文字入力 [ENTER] キーが押されるまで キーボードからの文字入力を待ちます [ENTER] が押されたら 最初に入力されたキーを読み出します
式と関数 University of Electro-Communications Human Interface section
式と printf() C 言語は 式が計算できます #include <stdio.h> int main(){ 10+20*3; } 20 を 3 倍して 10 足す計算をしてくれますが これでは結果がわかりません printf() は式の計算結果を表示できます #include <stdio.h> int main(){ printf( 計算結果は %d です n, 10 + 20*3); } 出力 : 計算結果は 70 です printf( 文字列, 式 ) として 文字列の中に %d を書くと %d が 式の値で置き換えられて表示されます
式と printf() %d をいくつも書くと printf( 文字列, 式 1, 式 2, 式 3 ) の式 1 式 2 が順番に %d に入ります #include <stdio.h> int main(){ printf( 式 1: %d 式 2:%d n, 13, 10 + 20*3); } 出力 : 式 1:13 式 2:70
整数の式 C 言語の計算では 自動で実数になりません 計算結果が実数になる場合は 小数点以下を切捨てます printf( %d n, 5 / 2 ); printf( %d n, 5 / 2 *2 ); 5/2 は 2.5 だけれども 小数は切り捨て 5/2*2 は 切り捨ててから 2 倍するので 出力 : 2 4
式の例と値 式の例 5 2*(2+8)+(5-3) 9/2 (9/2-3)*2 値 5 22 4 2
実数の式 実数を計算したいときは 5.0/2 か 5/2.0ように 最初から2つの数のどちらかを実数にします 実数を表示するためには %f を使います printf( %f n, 5.0 / 2 ); printf( %f n, 5 / 2.0 *3 ); printf( %f n, 5 / 2*3.0 ); %d と %f を間違えてもエラーメッセージは出ません printf( %d n, 2.5 ); printf( %f n, 2 ); printf( %f %d %d n, 1, 2, 3, 4 ); ですが出力は変になります 出力 : 1074003968 0.000000 0.000000 3 4 5.0/2 は 2.5 5/2.0 も 2.5 で 2.5 * 3 は 7.5 5/2 は 整数なので切り捨てで 2 なので 2*3.0 は 6.0 整数 2を %fで表示しようとしたので変にその後の %d にまで影響が (0.000000 2 3 になりそうなものですよね ) %fは整数を2 個食べちゃいます
式の計算の順番は 式の計算の順番 数学と一緒 a+b*c なら まず b*c をしてから aを足す 左から右 a+b+cは aとbを足してから cを足す 順番を変えたいときは () を使う printf( %f n, 5 / (2*3.0) ); 2*3.0 は 6.0 5 /6.0 は 0.8333333
式の例と値 式の例 値 型 5 2*(2+8)+(5-3) 9/2 5 22 4 整数整数整数 整数か実数かの区別を C 言語では型と言います (9/2-3)*2 2 整数 2.3 2.3 実数 4.0/2 2.0 実数 9.0/2 4.5 実数 1.0*5 5.0 実数 5.0/2-5/2 0.5 実数 1+9 + 0.0 10.0 実数
関数と式 式には 関数も使えます 数学関数を使うには #include が 1 行増えます #include <stdio.h> #include <math.h> int main(int argc, const char* argv[]){ // insert code here printf ( sin 1.5 = %f n, sin(1.5)); return 0; } 0.997495 標準入出力を使うことを宣言数学関数を使うことを宣言 無くても動きますが ないとコンパイラは printf() や sin() がどんな関数か知らない状態になります その結果 エラーメッセージが不親切になってしまいます sin(θ) の θ=1.5 のときの値を計算してくれます
関数いろいろ C 言語で使える数学の関数とその意味 上記は どれも実数値をとります 関数はとてもたくさんあります 自分で作ることもできます printf ( %f n, sin(1.5)/2); printf ( %f n, cos(1.5)/2); 0.498747 0.035369 1.5 は π /2 よりちょっと小さいので sin(π /2)=1.0 /2 に近い値のはず cos(1.5) は 0 に近い値でしょう
乱数を返す関数 rand() 整数値をとる関数 0~2147483647 の間のランダムな整数値を取ります #include <stdio.h> #include <stdlib.h> int main(int argc, const char* argv[]){ printf ( %d n, rand()); printf ( %d n, rand()); printf ( %d n, rand()); return 0; } rand() を使うことを宣言 ランダムな整数を表示 16807 282475249 1622650073
整数値をとる関数 0.0~1.0 を得るには printf ( %d n, rand() / 2147483647); printf ( %f n, rand() / 2147483647.0); 0 0.131538 これだと 0 ばっかり 1/2147483647 の確率で 1 が出る 0.0~1.0 が出る
式の例 式の例 2*(2+8)+(5-3) 9/2 1.0*5 sin(1.5) * 2 asin(1.0)*2 rand()*2 rand() / 2147483647.0 値 22 4 5.0 1.994990 3.141593 ランダムランダム (0.0~1.0) 型整数整数実数実数実数整数実数
課題 3 次のことをプログラムで確かめてください 整数同士の計算で 小数点以下が切捨られること 実数と整数の計算では 結果が実数になること printf() の %f, %d と引数の対応がおかしくてもコンパイルエラーにはならないことと 出力が変になること cos -1 (0)*2が π = 大体 3.14になること sin(π/4) と の数値が等しいこと プログラムができたら デバッガで 1 行ずつ実行してみてください
課題 4 実は,getchar() は 整数値をとる関数です getchar() が取る整数値を10 回表示するプログラムを作り 実行して様子を見てください [Enter] 以外のキーも押してみてください
ビルドがうまくいかない? いろいろ書いていると ビルドがうまくいかないことが起こりえます たとえば 次の例では #include <stdio.h> int main(int argc, const char* argv[]){ // insert code here machigai printf ( Hello, World! n ); return 0; } なぞの machigai という文字列があります コンパイラ (gcc) がその旨を伝えるためにエラーメッセージを出します (xcode が表示します )
ビルド時のエラー プロジェクト のエラーと警告を見るか main.c の赤丸 印にマウスをあわせるとメッセージが見られます
エラーメッセージを読もう 先ほどの例では error: `machigai undeclared (first use in this function) エラー :machigai は宣言されていません ( この関数の中では ここで初めて使われました ) と出ています C 言語には まだお話していない文法がたくさんあるので 意味が取りにくいと思います ですが コンパイラ (gcc) が machigai をどう解釈してよいかわからず なにか言っている この行の machigai のあたりに何か問題があるようだ ということは判ると思います メッセージはいろいろありますが 必ずよく読んで 意味を考えてください
エラーメッセージの例 #include <stdio.h> int main(){ printf ( Hello, World! n ); printf ( Hello, World! n ) } error:parse error before } token エラー : 語 } の前で構文解析エラーが起きました } の前に 何かが足りないために コンパイラ (gcc) がC 言語の解析 ( 解釈 ) ができなくなったと言っています この場合前の文の最後に足りない文字がありますね
エラーメッセージの例 #include <stdio.h> int main(){ printf ( Hello, World! n ); printf ( Hello, World! n); } error: missing terminating character エラー : 終わりの文字 が必要です error:parse error before } token エラー : 語 } の前で構文解析エラーが起きました 文字列の終わりの がないと言っています コンパイラは ); も表示する文字列 (Hello World! n) の続きだと思ったようです このため構文解析エラーも起きています このように ひとつの原因で複数エラーが出ることもあります エラーメッセージは最初の方から見て行きましょう ひとつ直すと全部直ることもあります こまめにビルドしましょう
エラーメッセージの意味 そのほかのエラーメッセージについては C 科大久保先生のページ http://www.tnlab.ice.uec.ac.jp/~sokubo/class/language/ref /error.html を見てください MacOS の gcc は日本語のエラーメッセージを出し てくれません Windows の場合 Visual C++ / Borland C++ / cygwin の gcc で日本語のメッセージが出ます
プログラムのデバッグ ビルドがうまくいっても プログラムが思ったよう に動作しないこともあります デバッグ デバッガとは? デバッグ : プログラムが正しく動作するように修正すること デバッガ : 修正を助けるプログラム プログラムを1 行ずつ実行 動作の様子をゆっくり見ることなどができる
デバッグの実際 メニューからデバッガを選んでデバッガを起動
ブレークポイントを設定 デバッグ ブレークポイントを設定してデバッグを始めると プログラムがブレークポイントのところで止まる int main(. の行にブレークポイントを設定して デバッグを開始してみてください
デバッグ ステップ実行 ブレークポイントで止まった後は ステップオーバーで 1 行ずつ実行して様子を見る ことができます 参考 main が終わってもしばらくプログラムは続きます C 言語のソースがないので アセンブリ言語やマシン語が表示されます 驚かないで ステップインを選ぶと関数の中にどんどん入っていきます printf の中身が全部わかるためには結構勉強が必要です
課題提出 Web サイト 課題と提出 http://haselab.hi.mce.uec.ac.jp/class/basic/ ここをクリックして指示に従って Web のアカウントを作る パスワードを設定させられます 一度ログアウトしてからログインしなおすよう指示されます