第2回ネットワークプ ログラミング 中村 修 今日のお題 代入文 C言語の予約語 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; } else{ y = 5; z = 4; } 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; 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; 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 scanf fscanf gets fgets read write getc putc 標準出力へ変数等を整形して出力 出力先が指定できるprintf 標準入力から書式に従い読み込み 入力先を指定できるscanf 標準入力から1行読み込み 入力先を指定して1行読み込み 入力先とバイト数を指定して読み込み 出力先とバイト数を指定して書き込み 標準入力から1文字読み込み 練習問題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の活用 再コンパイルの煩雑さを解消 コンパイル時は%makeと打つだけ 基本文法 ターゲット:依存するファイル <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つの整数値を入力する 最小公倍数、最大公約数を出力 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が等しくない間以下を繰り返す なら そうでないなら 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で両方を一緒にコンパイルするよう に書く
© Copyright 2024 ExpyDoc