第2回ネットワークプログラミング 中村 修
今日のお題 代入文 C言語の予約語 データの型 関数と戻り値(返り値) 基本入出力関数 ソースファイルの分割 Makefile if,for,while,switch,break,continue データの型 関数と戻り値(返り値) 基本入出力関数 ソースファイルの分割 Makefile
データ型 整数 浮動小数点 配列 int, char, short, long double, float int a[10]; 次のページに詳細あり
型の大きさを出力してみよう #include <stdio.h> int main() { printf("size of char:\t%d bytes\n", sizeof(char)); printf("size of short:\t%d bytes\n", sizeof(short)); printf("size of int:\t%d bytes\n", sizeof(int)); printf("size of long:\t%d bytes\n", sizeof(long)); printf("size of float:\t%d bytes\n", sizeof(float)); printf("size of double:\t%d bytes\n", sizeof(double)); }
型の大きさ size of char: 1 bytes size of short: 2 bytes size of int: 4 bytes size of long: 4 bytes size of float: 4 bytes size of double: 8 bytes
代入文 変数=式 例: x = y+z-3*a;
ifを使った条件文 if(式){ 処理1; … } else{ 処理2; 例: if( x == 1){ y = 3; z = 2;
forを使った条件文 for( 式1; 式2; 式3 ){ 処理; … } 例: for( x = 0; x < 10; x = x +1 ){ printf(“%d\n”, x);
whileを使った条件文 while(式){ 処理; … } 例: x = 0; while( x < 10 ){ printf(“%d\n”,x); x = x + 1;
switch文 複雑な if 文を簡素化する際に使用 switch(式){ case 定数: 処理;…; break; … default: 処理;…; break; } int monthday( int month ){ switch(month){ case 1: return 31; case 2: return 28; case 12: return 31;
break文とcontinue文 break continue for( i=0; i<100; i++ ){ 処理1; ループを抜ける continue 残りのループをスキップして、次のループを開始 for( i=0; i<100; i++ ){ 処理1; if ( i>=10 ) continue; 処理2; if ( i==90 ) break; 処理3; }
練習問題1 forの練習 1から10までの和を出そう
#include <stdio.h> int main() { int sum = 0; int i; for(i = 1; i <= 10; i++){ sum += i; } printf("sum = %d\n", sum);
入出力関数 printf 標準出力へ変数等を整形して出力 fprintf 出力先が指定できるprintf scanf 標準入力から書式に従い読み込み fscanf 入力先を指定できるscanf gets 標準入力から1行読み込み fgets 入力先を指定して1行読み込み read 入力先とバイト数を指定して読み込み write 出力先とバイト数を指定して書き込み getc 標準入力から1文字読み込み putc
練習問題2 for,fgets(scanf)の練習 1からnまでの和を出力しよう
#include <stdio.h> int main() { char inputstr[8]; int sum = 0; int max; int i; printf("input value at next line\n"); fgets(inputstr, 8, stdin); max = atoi(inputstr); for(i = 1; i <= max; i++){ sum += i; } printf("sum = %d\n", sum);
return文 return 式; #include <stdio.h> int sub(int a) { return a*b; } int main() intb = 10; printf("%d\n", sub(5)); return 0;
プログラムが大きくなった時の問題点 コンパイル時間がかかる 複数人での開発が困難 ⇒ファイルの分割と分割コンパイルが必要(extern宣言が必要) 変数のスコープに注意 <ファイル1> /* source1.c */ extern b; int sub(int a) { return a*b; } <ファイル2> /* source2.c */ #include <stdio.h> int b; int main() { b = 10; printf("%d\n", sub(5)); return 0; }
コンパイルのおさらい 単一ファイルの場合 %gcc -o program source1.c 複数ファイルの場合 %gcc -o program source1.c source2.c もしくは %gcc -c source1.c %gcc -c source2.c %gcc -o program source1.o source2.o
ライブラリ 関数群のこと プログラムの先頭で、#include <stdio.h>のように使用 関数に必要なライブラリはmanを参照 特殊なライブラリを使う場合はコンパイルオプション(-lライブラリ名)で指定 例)%gcc program.c -lpcap
Makefileの活用 再コンパイルの煩雑さを解消 基本文法 ターゲット:依存するファイル <tab>コマンド 例: main : source1.o source2.o gcc -o program source1.o source2.o source1.o : source1.c gcc -c source1.c source2.o : source2.c gcc -c source2.c
Makefileの簡素化 .cから.oファイルの生成ルール all : source1.o source2.o gcc -o program source1.o source2.o コンパイルオプションの変数化 <command> %gcc -Wall -g -c source1.c <Makefile> CFLAGS = -Wall gcc ${CFLAGS} -c source1.c
ヘッダファイルの活用 ファイル分割時に共通部分のくくりだし .hファイルとして作成 各ファイルで、#include “header.h”のように宣言
Makefile main : source1.o source2.o gcc -o program source1.o source2.o source1.o : source1.c gcc -c source1.c source2.o : source2.c gcc -c source2.c
練習問題3 source1.c source2.cを gcc –o でコンパイルしよう。 Makefileを書いてみよう。 /home/kaizaki/osamuNP/2/source1.c source2.c
講義終了 休憩でーす
実習 2つの整数値を入力する 最小公倍数、最大公約数を出力 できたら、TA/SAを呼びつける 2つ以上のファイルに分割する Makefileをもちいる できたら、TA/SAを呼びつける 出力結果、sourceを確認 Makefileのあるディレクトリをsoiで提出 つぎのページにヒント
実習ヒント 最大公約数を先に求める ユークリッドの互除法 最小公倍数 n * m / (最大公倍数)
ユークリッドの互助法とは?(1) 最大公約数を求めるアルゴリズム 原理:2つの整数m,n(m>n)の最大公約数はm-nとnの最大公約数を求める方法に置き換えることができる →mとnの問題をm-nとnの小さな数の問題に置き換える m=nになった時のm(nでも良い)が最大公約数 つぎのページに続く
ユークリッドの互助法とは?(2) 1.mとnが等しくない間以下を繰り返す 3.m(nでもよい)が求める最大公約数である 2.m>n なら m=m-n そうでないなら n=n-m 3.m(nでもよい)が求める最大公約数である 例:24と18の最大公約数を求める問題 1. 24-18=6:18と6の問題に置き換わる 2. 18-6=12:12と6の問題に置き換わる 3. 12-6=6: 6=6なので6が答えになる
実習ヒント:機能及びファイル分割の例 mainの他にeuclid互助法を行う int euclid(int m, int n) というeuclidという名前の関数を作る Main関数とeuclid関数をそれぞれmain.c euclid.cに書く Makefileで両方を一緒にコンパイルするように書く