情報基礎及び演習 プログラミング基礎① 電気・佐藤亮一
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習 5時限 main関数とユーザ定義関数 ユーザ定義関数の型
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習 5時限 main関数とユーザ定義関数 ユーザ定義関数の型
プログラミングの手順 1.テキストエディタ(メモ帳等)でプログラムを作成 3.コマンドプロンプト上で「実行」 (a.exe) 2.コマンドプロンプト上で「コンパイル」 (gcc ファイル名 or mygcc ファイル名) ファイル名は,最後に「.c」をつける.
C言語:コンパイルの流れ ソースファイル(.c) プリプロセッサ コンパイル アセンブルファイ(.s) アセンブラ 1.プログラムを作成 ソースファイル(.c) プリプロセッサ 2.コンパイル コンパイル アセンブルファイ(.s) アセンブラ オブジェクトファイル(.o) 実行ファイル(.exe) 3.プログラムの実行
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
Cの基本構造 #include <stdio.h> int main(void) { printf(“This is a short program in C. ”); return (0); } 「独習C」より #include <stdio.h> ヘッダファイルstdio.hをプログラムに組み込むための命令. stdio.hにはprintf()に関する情報が含まれている. このように,行の先頭に「#」がつく命令は,プリプロセッサへの命令となる(1行で書くこと). プリプロセッサへの読み込みは,ヘッダファイル以外も可能で,自分で作成したファイルも 読み込める.その際は「#include “***.c”」と「” ”」でファイル名を囲む形となる.
Cの基本構造 #include <stdio.h> int main(void) { printf(“This is a short program in C. ”); return (0); } 「独習C」より int main(void) この行からmain()関数がはじまる. int はmain()関数の返し値が整数であることを宣言することを意味する. カッコ内のvoidはmain()関数が引数を取らないことをコンパイラに知らせることを意味する. 最後の行のreturn 0; はmain()関数から値0を,プログラムを呼び出したプロセス(この場合 はOS: Windows)に返すという意味. main()関数から値0を返すことで,プログラムが正常に終了したことを表す,取り決められて いる.
Cの基本構造 #include <stdio.h> int main(void) { printf(“This is a short program in C. ”); return (0); } 「独習C」より printf(“This is a short program in C. ”); “ ”で囲まれた文字を出力します. 「;」を忘れずに! あと,改行したいときは“\n”を入れてください. printf(“This is a short program in C. \n ”);
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
型と変数 情報の単位について の前に ビット 0か1を表わす. 2進数で表現され,例えば3bitだと, 000, 001, 010, 011, 100,101, 110, 111 のように,23=8通りの組み合わせとなる. バイト 一般に,8bitを一つとした単位.1byte=8bit コンピュータの情報を表わす単位. 8bitなので,28=256通りの組み合わせが表現できる. 例えば,整数だと 符号なしの場合, 0から255 符号ありの場合, -128から127 を,文字だと256文字を割り当てることができる.
型と変数 情報の単位について の前に 問題1 2バイトだと何通りの整数を表現できますか? また,符号なし(unsigned)と符号あり(singed)の場合の値の範囲を示してください. 問題2 4バイトだと何通りの整数を表現できますか? また,符号なし(unsigned)と符号あり(singed)の場合の値の範囲を示してください.
型と変数 #include <stdio.h> int main(void) { int i,j; double x,y; printf(“integer i= %d”, i); printf(“double x= %f”, x); return (0); }
型と変数 型 オブジェクト int型 i j double型 x y 箱の大きさ等をあらかじめ決めて おく必要がある (オブジェクトのための設計図) 数値等を格納する箱
型と変数 型 大きさ等 int 2バイト~4バイト(システムに依存) 整数 1バイト. - 256種類の文字,あるいは - signed char(-127~127)か - unsigned char(0~255)の範囲の数値. char (8bit整数) 4バイト. float 実数 double 8バイト.
型と変数 #include <stdio.h> int main(void) { int i,j; double x,y; printf(“integer i= %d”, i); printf(“double x= %lf”, x); return (0); } 型 %d int型 %f float型 %lf double型 %c char型 *double型の場合,%lfが基本なのですが,%fを実数型の標準として使うようになってきたので,「%f」でもOKです.
型と変数 問題1 前ページのプログラムを作成し,実行してみてください.ディスプレイに表示された内容を メモしてください. 問題2 問題1の回答が1行毎に出力されるように,プログラムを改良してください. 問題3 問題2のプログラムを,i+jが出力されるように改良してください. 問題4 問題3のプログラムを,jの値をラジアンに変換して表示できるように改良してください. おまけ yの数値は何?(有名?)
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
if文,for文(if文) コードブロックを用いた表現. if(条件) 真の時; if(条件) 真の時; else 偽の時; if(条件){ 真の時1; 真の時2; : 真の時N; } if(条件){ 真の時1; 真の時2; : 真の時N; } else{ 偽の時1; 偽の時2; 偽の時N;
if文,for文(if文) 例1 #include <stdio.h> No a>b int main(void) { int a,b; a=1; b=10; if(a>b){ printf(“aはbより大きい.”); } return (0); Yes “aはbより大きい.” と表示.
if文,for文(if文) 例1 #include <stdio.h> int main(void) { int a,b; 演算子 意味 > ~より大きい >= ~より大きいか、等しい(~以上) < ~より小さい(~未満) <= ~より小さいか、等しい(~以内) == ~と同じ(等しい) != ~以外(等しくない) int main(void) { int a,b; a=1; b=10; if(a>b){ printf(“aはbより大きい.”); } return (0);
if文,for文(if文) 例2 #include <stdio.h> a>b No int main(void) { int a,b; a=1; b=10; if(a>b){ printf(“aはbより大きい.”); } else{ printf(“aはbより小さい.”); return (0); Yes “aはbより大きい.” と表示. “aはbより小さい.” と表示.
if文,for文(if文) 練習1 int型の変数aを用い,その値が80以上のときは「優(Yuu)」,60点以上80点未満の ときは「可(Ka)」,60未満の場合は「不可(Fuka)」と表示するプログラムを作成せよ. 書き方の例1 if(条件1){ 条件1が真の時の処理; } else{ if(条件2){ 条件2が真の時の処理; 条件2が偽の時の処理; 書き方の例2 if(条件1){ 条件1が真の時の処理; } else if(条件2){ 条件1が偽で,条件2が真の時の処理; else{ 条件1が偽で,条件2も偽の時の処理;
if文,for文(if文) 練習1 int型の変数aを用い,その値が80以上のときは「優(Yuu)」,60点以上80点未満の ときは「可(Ka)」,60未満の場合は「不可(Fuka)」と表示するプログラムを作成せよ. 条件1 フローチャートの例 No Yes 条件1が真のときの処理 条件2 No Yes 条件2が真のときの処理 条件2が偽のときの処理
if文,for文(if文) 練習2 2つのdouble型の変数a,bを用意し,a/bを計算した結果をdouble型の変数cに代入し,cを表示するプログラムを作成してください.ただし,b=0のときは「ゼロで除算することはできません」と表示するようにしてください. 練習3 変数aを用意し,aの値が偶数ならば「(aの値)は偶数です」,奇数ならば「 (aの値)は奇数です」と表示するプログラムを作成してください. (ヒント) 偶数か奇数かは「余り」を考えると すぐに判定できます. 「余り」を計算するには amari=a%4; とします(aを4で割った時の余り) (念のため) a=7; とした場合は, 「7は奇数です」 と表示するようにします.
if文,for文(for文) コードブロックを用いた表現. for(初期設定部; 条件判定部; インクリメント部) 文; 文1; 文2; : 文N; }
if文,for文(for文) 実行結果は 1 2 3 4 5 6 7 8 9 10 終わり となる. 例1a #include <stdio.h> int main(void) { int num; for(num=1; num<11; num=num+1){ printf(“%d”, num); } printf(“終わり”); return (0); 実行結果は 1 2 3 4 5 6 7 8 9 10 終わり となる.
if文,for文(for文) 実行結果は 終わり となる. 例1b #include <stdio.h> int main(void) { int num; for(num=11; num<11; num=num+1){ printf(“%d”, num); } printf(“終わり”); return (0); 実行結果は 終わり となる.
if文,for文(for文) 実行結果は 1 2 3 4 5 6 7 8 9 10 終わり となる. 例1c #include <stdio.h> int main(void) { int num; for(num=1; num<11; num++){ printf(“%d”, num); } printf(“終わり”); return (0); インクリメント演算子 num++ num=num+1 デクリメント演算子 num-- num=num-1 実行結果は 1 2 3 4 5 6 7 8 9 10 終わり となる.
if文,for文(for文) 練習 int型の変数i, sumを用意し,iを繰り返し文の変数とし1から10まで変化させて表示してください.さらに,1から10の足し算を計算し,その結果を変数sumに代入して「1回だけ」表示させてください. sum 0回目のループ(ループ前) 中身は「空」 (考え方) sum 1回目のループ i 「i」には「1」が入っている. 2回目のループ i 「i」には「2」が入っている. sum 「sum」には一つ前のループまでの和が入っている. + sum
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
演習(復習) for文では時間tを変数として計算します. また,for文のループから抜けるにはbreak文を使います.例えば 演習1 (前回の問題) 斜め上方に初速度v0,入射角thetaで小球を投射した.小球の軌道(x,y)を計算してください.ただし,y<=0になったとき,計算を停止してください. (ヒント) for文では時間tを変数として計算します. また,for文のループから抜けるにはbreak文を使います.例えば if(y<0) break; といった感じで使います.break文は,特別な条件が発生したときにループを ただちに終了する命令です. #include <math.h> も忘れずに!
演習(復習) (x,y)の集合は楕円です.a=b=1, alpha=0のとき円になります. 演習2 角度thetaを媒介変数として,(x,y)を計算してください.thetaは0度から360度まで変化させた場合の(x,y)を出力し,エクセルで形を確認してください. (ヒント1) (x,y)の集合は楕円です.a=b=1, alpha=0のとき円になります. a,bを[0,1]で,alphaを[0,pi/2]で変化させてみてください. (ヒント2) 出力先を変更するのはプログラムを変更しても良いのですが,以下のように コマンドラインで簡単に「ディスプレイ」から「ファイル」に変更できます. ただし,printfでは数値だけを出力するようにしてください. p10a777z> a.exe >test.dat (test.datに(x,y)の値が保存されます)
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
main関数とユーザ定義関数 #include <stdio.h> int main(void) { int a; double b; a=123; b=3.14; printf(“integer a= %d”, a); printf(“double b= %lf”, b); return (0); }
main関数とユーザ定義関数 #include <stdio.h> void hyouji(int a, double b) { printf("integer a=%d\n", a); printf("double b=%lf",b); } void hyouji(int a, double b); int main(void) { int a; double b; a=123; b=3.14; hyouji(a,b); return (0); } プロトタイプ hyouji関数で処理 処理が終わるとmainへ戻る void型の関数
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
ユーザ定義関数の型 #include <stdio.h> 型 kansuu(型 a, 型 b, 型 c) { 型 d return d; } 型 kansuu(型 a, 型 b, 型c); int main(void) { 型 a,b,c; 型 d; d=kansuu(a,b,c); printf(“enzan no kekka = %d”, d); return (0); } ここで「戻り値」の関数の「型」を宣言する. main関数で戻り値を利用している. 「戻り値」を利用する場合,int でもdoubleでも自由に宣言できる
ユーザ定義関数の型 #include <stdio.h> 型 kansuu(型 a, 型 b, 型 c) { 型 d return d; } 型 kansuu(型 a, 型 b, 型c); int main(void) { 型 a,b,c; 型 d; d=kansuu(a,b,c); printf(“enzan no kekka = %d”, d); return (0); } ここで「引数」の「型」を宣言する.
ユーザ定義関数の型 例1a #include <stdio.h> int main(void) { int a,b,c,d; d=(a+b)*2+c; printf(“enzan no kekka = %d”, d); return (0); }
ユーザ定義関数の型 例1b #include <stdio.h> int enzan(int a, int b, int c) { return (a+b)*2+c; } int enzan(int a, int b, int c); int main(void) { int a,b,c,d; a=123; b=456; c=789; d=enzan(a,b,c); printf(“enzan no kekka = %d”, d); return (0); } プロトタイプ int型の関数 int enzan(int a, int b, int c) { int z; z=(a+b)*2+c; return z ; } int型の関数 ローカル変数
本日の内容 4時限 プログラミングの手順(復習) Cの基本構造(復習) 型と変数(復習) if文,for文(復習) 演習(復習) 5時限 main関数とユーザ定義関数 ユーザ定義関数の型 演習
演習 for文では時間tを変数として計算します. また,for文のループから抜けるにはbreak文を使います.例えば 演習1 (前回の問題) 斜め上方に初速度v0,入射角thetaで小球を投射した.小球の軌道(x,y)を計算してください.ただし,y<=0になったとき,計算を停止してください. この計算をkansuu1に. この計算をkansuu2に. (ヒント) for文では時間tを変数として計算します. また,for文のループから抜けるにはbreak文を使います.例えば if(y<0) break; といった感じで使います.break文は,特別な条件が発生したときにループを ただちに終了する命令です. #include <math.h> も忘れずに!
演習 X軸上をm回,y軸上をn回振動する信号の合成です. 演習2 (リサジュー図形) 角度thetaを媒介変数として,(x,y)を計算してください.thetaは0度から360度まで変化させた場合の(x,y)を出力し,エクセルで形を確認してください. この計算をkansuu1に. この計算をkansuu2に. (ヒント) X軸上をm回,y軸上をn回振動する信号の合成です. a,bを[0,1],alphaを[0,pi/2]の範囲で,m,nは適当に変化させてみてください.
演習 演習3 (下保先生リクエスト) 「整数では,前期の栽培Iで,最大公約数と最小公倍数を求めよう,と いうのをやりましたが,ちっともできてませんでした。また,やってみ てもいいかもしれません.」 演習4 (下保先生リクエスト) 「個体群動態で N(t+dt) - N(t) = (r - hN(t)) N(t) として,rを増 殖率,hをこみあいの効果とする。適当な,N(0) r, h を与えて, N(t) の変化を示しなさい。 」