モバイルプログラミング第2回 C言語の基礎 (1)
C言語とは? 歴史 手続き型高級言語 マシン依存の実行ファイル ケン・トンプソン(ベル研)が1970年に、Unix開発言語として、B言語を開発 翌年デニス・リッチーが改良しC言語誕生 手続き型高級言語 マシン依存の実行ファイル Javaとはことなる
Cプログラミングの基礎知識 コンパイルをしてみよう データ型 関数 (引数、返り値) 条件文、繰り返し処理(if, for, while文) 配列 構造体
Cプログラムのコンパイル方法 mobile2.zip の hello_world.c を使います c:¥cygwin¥home¥ユーザ名 の下にコピー $ gcc hello_world.c ./a.out
C言語の書式 #include <stdio.h> ←標準入出力ライブラリ int main(void){ printf("Hello world!!\n"); return 0; } main関数は実行時に一番初めに呼ばれる特別な関数 整数(int)型の値を返す
データ型 おさらい 符号付整数型 short型(16bit): -32768から32767 int型(32bit*): -2147483648から 2147483647 浮動小数点型 float型(一般的に32bit): 単精度 double型(一般的に64bit): 倍精度 文字列 char型(8bit):
関数の書式 書式 例 返り値や引数がない場合は 返り値 関数名(引数の型 引数の名前,・・・); 返り値 関数名(引数の型 引数の名前,・・・); 例 返り値や引数がない場合は int plus(int, int); void となる int plus(int a, int b){ return a+b; int four(void){return 4;} }
実際に関数を作ってみる func.c のプログラムに以下を追加する 補足 printf 関数は" "で囲まれた文字を出力する 引き算を行う minus 関数 掛け算を行う multiply関数 割り算を行う divide関数 補足 printf 関数は" "で囲まれた文字を出力する printf("plus: %d + %d is %d\n",a, b, answer); %d は引用符後の変数を表示します \n は改行を表します
条件文 (if else文) 書式 if (条件式) { 条件式が正しい場合(真)の実行内容 } else { 条件式が違う場合(偽)の実行内容 } else 文はなくても可です
条件文 (if else 文) if.c を実行する scanf(“%d”, &c); ←入力された数字を変数Cに代入 printf("number is < 5\n"); }else if(c == 5){ printf("number is 5\n"); }else{ printf("number is > 5\n"); }
条件式 (if else 文) if.c を改変して、入力した値が奇数か偶数かを判定する 剰余演算子(%) を用いると簡単にできます ex) 5%3 = 2 (5 / 3 = 1・・・2) 7%3 = 1 (7 / 3 = 2・・・1)
繰り返し (for 文) 書式 for(初期値;条件式; 再初期化値){ 実行内容; }
繰り返し (for文) for.c を実行する (1から10までの和、積が表示される) int sum = 0, mul = 1; for (i=1; i<=10; i++) { sum = sum + i; mul = mul * i; } 1が i の初期化値 i が 10以下になるまで{}をループ ループのたびに i が 1ずつ増える
繰り返し (for文) for.c を変更して100を割り切れる全整数を表示する 100, 50, 25, 20, 10, 5, 4, 2, 1 剰余式を利用
繰り返し (while文) 書式 while(条件式){ 実行内容; } 条件式が真である場合、繰り返し実行 条件式が始めから偽である場合は1度も実行されない
繰り返し (while文) while.c を実行する (1から10までの和、積が表示される) i = 1; while (i<=10){ sum = sum + i; mul = mul * i; i = i + 1; }
繰り返し (while文) while.c を変更して以下のように表示する 01 012 0123 01234 01 012 0123 01234 012345 while 文をネスト 0123456 01234567 012345678 0123456789
大量のデータを扱う(配列) … a[0] 1 a[1] 2 a[2] 3 同じデータ型を複数並べたもの ex) int array[10] データ型 配列名 [配列の大きさ]; ex) int array[10] - 10だと4*10=40バイト - array[0] ~ array[9] a[2] 3
配列 初期化方法 実際にarray.cを実行する int cnt[4] = {6,10,31,76}; float x,y[] = { 2.1,1.8,4.5 }; char a[3]; a = { x, y, z }; 実際にarray.cを実行する int cnt[2] = {6,10}; int y[] = {1,2}; x = 3; x = x + y[0]; x = cnt[0] + y[1]; y[1] = y[1] + cnt[1];
配列 新しいファイルarray2.cを作成し、以下のことを実行するプログラムを作成しなさい。 以下のようなデータを持つ配列を用意し、 int data1[6] = { 10, 29, 53, 19, 3, 76 }; int data2[6]; data2 の配列へdata1の順番が逆になるよう、 data2 の配列へデータを格納しなさい。 ex) data2の1番目が76、 data2 の2番目が3、・・・
いろいろなデータを扱う(構造体) 複数のデータ型を組み合わせて、新しく作るデータ型 struct grade{ int id; char name[20]; double avg; }; struct タグ名 { データ型 メンバ名; };
構造体 struct.c を実行してみる 構造体の宣言 struct タグ名 変数名の並び; struct grade student1;
構造体 cont. 構造体の初期化 構造体変数の初期化 { } の間に、メンバ名をカンマで区切る { } の間に、メンバ名をカンマで区切る { } の間に、メンバ名をカンマで区切る struct grade student1 = {4, "TANAKA", 80.5}; { } の間に、メンバ名をカンマで区切る struct grade student2[20] = {{1, "SUZUKI", 68.1 }, {2, "SAITO", 59.2 }, {3, "NAKATA", 48.4 }, };
構造体 cont. 構造体の参照 構造体変数名. メンバ名 printf("%d %s %5.1f\n\n", 構造体変数名. メンバ名 printf("%d %s %5.1f\n\n", student1.id, student1.name,student1.avg); printf("%d %s %5.1f\n", student2[i].id, student2[i].name, student2[i].avg); student1.id = 5; sutdent1.name = “HOGE”; のように使用できる
構造体演習問題 新たにstruct2.c というファイルを作成し、以下の処理を行なってください。 以下の表を構造体で表し、平均点を求めてく 番号 国語 数学 化学 英語 平均点 1111 69 50 70 96 71.25 2222 98 39 60 60 64.25 3333 89 78 88 90 86.25 4444 40 50 98 60 62.00 5555 63 60 89 95 76.75
構造体データ {{ 1111, 69, 50, 70, 96, 0.0 }, { 2222, 98, 39, 60, 60, 0.0 }, { 3333, 89, 78, 88, 90, 0.0 }, { 4444, 40, 50, 98, 60, 0.0 }, { 5555, 63, 60, 89, 95, 0.0 },};
演習課題 提出方法:授業のWebよりアップロード 提出物 提出期限:4月26日 23:59まで プログラムのソース 出力結果 感想など(あれば) 提出期限:4月26日 23:59まで
演習問題1 2×3 = 6 ユークリッド互除法を用い、m、n の最大公約数を求めよ。 euclid.c に追加。 ヒント:整数m, n があったとき、その最大公約数は m-n, n の最大公約数。 m-n, n も同様なことを繰り返し、最終的にm=nとなったときのmが最大公約数になる 2×3 = 6
演習問題2 prime.c を改良し、入力された数字が素数かどうかを判断するプログラムを作成しなさい 素数は1と自分自身以外約数を持たない ヒント:nが素数かどうかは、n以下の整数で割り切れるかどうかを繰り返せばいい。 nを√n以上で割っても割り切れないので、開始は√n からでよい。
演習問題2 ルート計算は sqrt(int); でできます。 for文は、break で抜けられます。 ex) limit = sqrt(n); sqrt関数を使用した場合、 gcc –lm prime.c とコンパイルしてください。 for文は、break で抜けられます。 ex) for(…){ if( n%i == 0){ break; }
演習問題3 combi.cのファイルを新たに作成し、組み合わせを求める関数を作成せよ。 0 C 0 = 1 2 C 0 = 1 2 C 1 = 2 2 C 2 = 1 3 C 0 = 1 3 C 1 = 3 3 C 2 = 3 3 C 3 = 1 4 C 0 = 1 4 C 1 = 4 4 C 2 = 6 4 C 3 = 4 4 C 4 = 1 5 C 0 = 1 5 C 1 = 5 5 C 2 = 10 5 C 3 = 10 5 C 4 = 5 5 C 5 = 1
演習問題3 ヒント:組み合わせの公式