320 likes | 388 Views
例題 ex2a, ex2b, ex2c. 科学科プログラミング 2005 年 10 月 14 日. レポート全体について. プログラムのコメント コメントは重要ですので. 必ず 記入してください 今後は,プログラムの先頭に,「プルグラムのファイル名,プログラムの概要,作成者,作成日」 も記入するとよい 例: /* days2.c * * M 月 D 日から M` 月 D` 日までの日数を求めるプログラム *
E N D
例題ex2a, ex2b, ex2c 科学科プログラミング 2005年10月14日
レポート全体について • プログラムのコメント • コメントは重要ですので.必ず記入してください • 今後は,プログラムの先頭に,「プルグラムのファイル名,プログラムの概要,作成者,作成日」 も記入するとよい 例: /* days2.c * * M月D日からM`月D`日までの日数を求めるプログラム * * 作成者:浜 奈子 / 作成日:2004年10月7日 */
レポート全体について • プログラムのインデント • インデントをそろえることでプログラムの可読性が向上する • 特にrp2 以降は条件分岐や繰り返しが入ってくるので,気をつけること • プログラムを入力するときに1行ごとに Tab キーを押す癖をつけること (Meadow)
Cygwin のコマンド: pwd • プログラムのコンパイルをしたところ $ gcc ex2a.c -o ex2a gcc: ex2a.c: No such file or directry gcc: No input files とでた • pwd を使って現在いるディレクトリの確認をする • ○: /cygdrive/c/home/prog • ×: /cygdrive/c/home/
Cygwin のコマンド: pwd • lsを使って現在いるディレクトリのファイルの一覧を確認をする $ ls [Enter] prog ex2a.c がない $ cd c:/home/prog [Enter] $ ls [Enter] hello.c ex1b.c ex2a.c ○
Meadow のファイルについて • 例題ex2a ステップ3のように,あるプログラムをすでに入力していて,そのプログラムを別ファイルとして追加修正をしたい場合 • Cygwin 上でファイルのコピー $ cp [元ファイル名] [別名ファイル名] • Meadow 上でファイルの別名保存 CapsLock + x CapsLock + w のあと,別名ファイルの指定
if 文の使い方 • if ……必須 • else if …… if のあと0個以上 • else ……if (else if がある場合は最後の else if) のあとに1個か0個
○:正解 if (year == 2004){ printf(“thisyear\n”); } ×:間違い if (year = 2004){ printf(“thisyear\n”); } 条件の書き方の注意 • 例:year が 2004 だったら thisyear と表示する
○:正解 if (year == 2004){ printf(“thisyear\n”); } 何も表示されない ×:間違い if (year = 2004){ printf(“thisyear\n”); } 表示される 条件の書き方の注意 • もし year が 2003だったら?
if 文の使い方 • 一番単純な使い方 if (mode==1){ printf("Hello\n"); } /* 4 の時は何も表示されない */ • 変数 modeが 1以上の時に限り print("Hello\n");が実行される 考えられる状況 1.画面に Hello と表示される 2.何も起きない
if 文の使い方 • if と else の使い方 if (mode==1){ printf("Hello\n"); } else { printf("ByeBye\n"); }/* Hello と ByeBye のどちらかが必ず */ • 変数 modeが 1 の時に print("Hello\n"); それ以外の時に printf("ByeBye\n"); 考えられる状況 1.画面に Hello と表示される 2.画面に ByeBye と表示される
if 文の使い方 • if と else if の使い方 if (mode>=1){ printf("Hello\n"); } else if (mode>=-1){ printf("Oh No!\n"); } /* たとえば -2 では 何も実行されない*/ 考えられる状況 1.画面に Hello と表示される 2.画面に Oh No! と表示される 3.何も表示されない
if 文の使い方 • if と else if の使い方 if (mode>=1){ printf("Hello\n"); } else if (mode>=-1){ printf("Oh No!\n"); }else if (mode>=-3){ printf("Too small…\n"); }/* たとえば -6 では 何も実行されない*/ 考えられる状況 1.画面に Hello と表示される 2.画面に Oh No! と表示される 3.画面に Too small…と表示される 4.何も表示されない
if 文の使い方 • if と else if と else の使い方 if (mode==1){ printf("Hello\n"); } else if (mode==2){ printf("Byebye\n"); }else { printf("Oh No!\n"); }/* 3つのうちどれかが必ず表示される */ 考えられる状況 1.画面に Hello と表示される 2.画面に ByeBye と表示される 3.画面に Oh No! と表示される
例題: ex2a • 以下の4項目について学習 • ステップ0:コメント,日本語の入力 • ステップ1:if (等号, else) • ステップ2:if (不等号, else) • ステップ3:else if • http://edu.cs.inf.shizuoka.ac.jp/2005/から,例題ex2a を開いて演習開始
整数型と浮動小数点数 • 整数型同士の演算結果は整数 • 1+1 は 2 3 – 4 は -1 • 3 * 4 は 12 4 / 5 は 0 (0.8 や 1 ではない) • 整数型と浮動小数点数の演算結果は浮動小数点数 • 1 + 2.3 は 3.3 3 – 4.4 は -1.4 • 2 * 3.14 は 6.28 2 / 0.25 は8.0 (8ではない) • 整数型と浮動小数点数の演算結果は浮動小数点数 • 1.3 + 2 は 3.3 3.4 – 4 は -0.6 • 3.14 * 2 は 6.28 4.3 / 2 は2.15 • 浮動小数点数同士の演算結果は浮動小数点数 • 1.3 + 2.1 は 3.4 3.4 – 4.4 は -1.0 (-1ではない) • 3.14 * 2.0 は 6.28 4.3 / 0.5 は 8.6
整数型と浮動小数点数 • 整数型と浮動小数点数が混在する場合は? 入力された整数型 in を二分の一した結果を浮動小数点数 fl に代入するには? in には 21 が入っているとする. • fl = in / 2 の場合 • まず, in / 2 を計算する.整数型÷整数型 は 整数型なので,10 となる • 整数型 10 を 浮動小数点数 fl に代入するので,10.0 が fl に代入される • fl = in / 2.0 の場合 • まず, in / 2.0 を計算する.整数型÷浮動小数点数 は 浮動小数点数なので,10.5 となる • 浮動小数点数 10.5 を 浮動小数点数 fl に代入するので,10.5 が fl に代入される
浮動小数点数の表示 • 浮動小数点数の表示 printf("radius = %f", radius); radius = 53.6759 • 小数点以下の桁数を指定する printf("radius = %.2f", radius); radius = 53.68
初期化 • 初期化について • 初期化とは,『その変数を使う前にその変数にデフォルト値(標準値)を代入すること』 • 変数は宣言時には何が入っているかわからない • 初期化をしておかないと予期しない動作をすることがある
初期化 • 1から100の総和を求めるプログラム(間違い) #include <stdio.h> int main(void){ int i; /* ループ用 */ int sum; /* 合計用 */ i = 1; /* 1から */ while(i<101){ /* 100までループ */ sum = sum + i; i = i + 1; } /* 結果の表示 */ printf("1+2+..+99+100=%d\n", sum); return 0; }
初期化 • 1から100の総和を求めるプログラム(間違い) $ ./sum.exe 1+2+..+99+100=1627511018 • なぜ,5050にならないのか? • 変数 sum の初期化を忘れているから • この場合は,sum を 0 で初期化する必要がある
初期化 • 1から100の総和を求めるプログラム(正解) $ ./sum.exe 1+2+..+99+100=5050 • 初期化するときの値は,その変数をどのように用いるかで変わる • i は,1から100 まで変化させるから,1 で初期化 • sum は合計を入れる変数なので 0 で初期化
初期化 • 1から100の総和を求めるプログラム(正解) #include <stdio.h> int main(void){ int i; /* ループ用 */ int sum; /* 合計用 */ i = 1; /* 初期化 */ sum = 0; /* 合計の初期化 */ while(i<101){ /* 100までループ */ sum = sum + i; i = i + 1; } /* 結果の表示 */ printf("1+2+..+99+100=%d\n", sum); return 0; }
初期化 (宣言と同時バージョン) • 1から100の総和を求めるプログラム(正解) #include <stdio.h> int main(void){ int i = 1; /* ループ用 */ int sum = 0; /* 合計用 */ while(i<101){ /* 100までループ */ sum = sum + i; i = i + 1; } /* 結果の表示 */ printf("1+2+..+99+100=%d\n", sum); return 0; }
例題: ex2b • 以下の3項目について学習 • ステップ1:while • ステップ2:while と sscanf の合わせ技if • ステップ3:while と変数の最大値 • http://edu.cs.inf.shizuoka.ac.jp/2005/から,例題ex2b を開いて演習開始
型キャスト • 例えば,総得点 score と,科目数 num の両方が整数型で,平均点 ave を浮動小数点数で求めたいとき (仮に score = 648, num = 7) float ave; . ave = score / num; printf("ave = %f", ave); ave = 92.0000 あれ? 割り切れないはず
型キャスト • 例えば,総得点 score と,科目数 num の両方が整数型で,平均点 ave を浮動小数点数で求めたいとき (仮に score = 648, num = 7) float ave; . ave = (float)score / num; printf("ave = %f", ave); ave = 92.5714 今度は正解
型キャスト • 例えば,総得点 score と,科目数 num の両方が整数型で,平均点 ave を浮動小数点数で求めたいとき (仮に score = 648, num = 7) float ave; . ave = (float)score / num; printf("ave = %.1f", ave); ave = 92.6 表示桁数を1桁にしてみた
型キャスト • 例えば,総得点 score と,科目数 num の両方が整数型で,平均点 ave を浮動小数点数で求めたいとき (仮に score = 648, num = 7) ave = (float)score / num; printf("ave = %f", ave); 下のでも同じ score / (float)num (float) score / (float) num
複数の変数の表示について • 浮動小数点数を2つ同時に表示 float square; float length; square = 3.14159; length = 6.28310; printf(“squ. = %f , leng. = %f \n”, square, length); squ. = 3.14159, leng. = 6.28310 • 最初の%fには,squareの値が,2番目の%fにはlengthの値が入る
複数の変数の表示について • 整数と浮動小数点数を2つ同時に表示 int number; float ave; number = 4; ave = 84.34; printf(“[%d]ave. = %f \n”, number, ave); [4]ave. = 84.3400 • 最初の%dには,numberの値が,2番目の%fにはaveの値が入る
例題: ex2c • 以下の3項目について学習 • ステップ1:int と float • ステップ2:変数の型のキャスト • ステップ3:while の使い方2 • http://edu.cs.inf.shizuoka.ac.jp/2005/から,例題ex2c を開いて演習開始