第二回授業用資料

第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で両方を一緒にコンパイルするよう
に書く
