Net[c-1]

21
C言語 1

Transcript of Net[c-1]

C言語

1

#include <stdio.h>#define IP_NUM 16 #define MAC_NUM 18void initi(char *my_ip,char *my_mac){

int i;for(i=3;i<IP_NUM;i+4)

*(my_ip+i) = ‘\0’;for(i=2;i<IP_NUM;i+3)

*(my_mac+i) = ‘\0’;}void getIpandMac(char *my_ip,char *my_mac){

int i;for(i=0;i<4;i++)

scanf(“%3s”,my_ip);for(i=0;i<6;i++)

scanf(“%2s”,my_mac);}void print(char *my_ip,char *my_mac){

printf(“%s,%s,%s,%s\n”,my_ip,my_ip,my_ip,my_ip);printf(“%s:%s:%s:%s:%s:%s\n”,

my_mac,my_mac,my_mac,my_mac,my_mac,my_mac,my_mac);}int main(int argc,char *argv[]){

char my_ip[IP_NUM],my_mac[MAC_NUM];initi(my_ip,my_mac);getIpandMac(my_ip,my_mac);print(my_ip,my_mac);return 0;

}

2

コードの見方

main関数を探す関数と変数の名前には意味がある関数が積み重なっている{~}で関数や処理は閉じている

3

#include <stdio.h>#define IP_NUM 16 #define MAC_NUM 18void initi(char *my_ip,char *my_mac){

int i;for(i=3;i<IP_NUM;i+4)

*(my_ip+i) = ‘\0’;for(i=2;i<IP_NUM;i+3)

*(my_mac+i) = ‘\0’;}void getIpandMac(char *my_ip,char *my_mac){

int i;for(i=0;i<4;i++)

scanf(“%3s”,my_ip);for(i=0;i<6;i++)

scanf(“%2s”,my_mac);}void print(char *my_ip,char *my_mac){

printf(“%s,%s,%s,%s\n”,my_ip,my_ip,my_ip,my_ip);printf(“%s:%s:%s:%s:%s:%s\n”,

my_mac,my_mac,my_mac,my_mac,my_mac,my_mac,my_mac);}int main(int argc,char *argv[]){

char my_ip[IP_NUM],my_mac[MAC_NUM];initi(my_ip,my_mac);getIpandMac(my_ip,my_mac);print(my_ip,my_mac);return 0;

}

4

Point

始まりはmain()

変数と関数は意味のある名前に

フローチャートを思い浮かべながら

5

変数(variable)

値や文字を入れておく(記憶しておく) ”箱”

関数に変数を渡すのは、箱の中身(データ)を渡している

int 整数の箱、double 少数の箱、char 文字の箱

宣言:int num; char name[]=”variable”;

6

演算(operation)

数学の記号とは一部違う

”左辺=右辺”ではなく、”左辺に右辺を代入する”

上記より、左辺は変数や構造体になる

+→+、−→−、×→*、÷→/

例:a+3*(2-1)、num=a/3-3;数式は数学と同じ

”等しい”ではない

7

関数(function)

処理機能を入れた”箱”

関数の中に処理を書いて、別の関数で同じ処理が簡単に使えるようにする

宣言:void func(int num){printf(“%d\n”,num);}

char func2(){ char ch; scanf(“%c”,&ch); return ch; }

使う時はfunc(12);

みたいにできるch=func2();

8

演習

4文字の小文字のアルファベットを入力してその文字をカエサル暗号化し、表示するプログラム

文字は2だけシフトする

シフトする関数を作る

シフトの仕方:c = ’a’+1; //出力結果は’b’になる

9

制御(control)

繰り返し処理

for(初期化式;継続条件式;再初期化式){文}

for(i=0;i<10;i++){printf(“%d\n”,i);}

while(継続条件式){文}

while(n<10){printf(“%d\n”,n++);}

10

制御(control)

条件分岐処理if(分岐条件){}else{}

if(num>10){printf(“%d\n”,num)}else{num=0};

多方向分岐処理

switch(式){case:定数式 文;break;・・・ }

switch(num){case:1 a=10;break; case:4 a=1;break;}

11

比較演算子

条件式に使う事が多い

> >= < <= == !=

普通の演算式にも使える

int n = 0;

printf(“%d\n”, n>1 );

12

演算(operation)

カエサル暗号化のプログラムを制御文を使って簡単にする。また、以下の機能を追加する。

シフトする数は入力させる

シフト範囲をa-zにする(例:a→c、y→a、z→b)

補足)printf(“%d %d\n”,’a’,’z’)をやってみる

13

構造体(structure)

複数の変数をまとめて入れておける”箱”

struct 名前{変数1変数2・・・・・

};struct user{

char ip[12];char *hostname;short port ;

};14

struct user{char ip[12];char *hostname;short port ;

};

int main(){struct user client;

client.port=20;

printf(“%d\n”,client.port);return 0;

}

” . ”で中身を指定

15

演算(operation)

カエサル暗号化のプログラムで使っているシフトする数と入力する文字列が入る変数を構造体の中に入れて使うように変える。

関数には構造体を引数として渡す

16

ポインタ(pointer)

メモリ上での変数の位置を表すものを入れる”箱”

位置=アドレス=番地を入れるもの

宣言:char *str; int **num; ポインタのポインタ

17

int main(){int *p1 , *p2;int num1 = 1 , num2;

*p2 = &num2;p1 = &num1; *p2 = num;

printf(“%d %d %d %d\n”,num,*p1,*p2,num2);return 0;

}

出力は 1 1 1 1

“&”でアドレスは表す

18

void func(int *num , char *str){int i;for(i=0;i<strlen(str);i++)

str[i]+=*num;printf(“%s\n”,str);*num=strlen(str);

}int main(){

int num; char str[12];scanf(“%d”,&num); scanf(“%s”,str);func(&num , str);printf(“%d\n”,num);

}

strlen()は文字列の長さを取得する関数

19

演算(operation)

カエサル暗号化のプログラムで関数の引数をポインタの受け渡しに変更する。

関数に戻り値がある場合は、無い関数に変更する

20

お疲れ様でした

21