Presentation is loading. Please wait.

Presentation is loading. Please wait.

ネットワークプログラミング 第3回「C言語の基礎~コマンドライン引数・構造体・ポインタ」

Similar presentations


Presentation on theme: "ネットワークプログラミング 第3回「C言語の基礎~コマンドライン引数・構造体・ポインタ」"— Presentation transcript:

1 ネットワークプログラミング 第3回「C言語の基礎~コマンドライン引数・構造体・ポインタ」
2009年秋学期 Rodney Van Meter

2 Last Week’s Excitement
2

3 授業Webページ SFC-SFShttps://vu.sfc.keio.ac.jp/sfc- sfs/ 課題・授業資料などの情報を掲示します
本講義を「MY時間割(仮)」へ登録してください 課題・授業資料などの情報を掲示します 課題は毎回こちらに提出!! 今日の課題締め切り 10/20(月)23:59分まで! 遅れて提出する方は要連絡

4 今期の授業スケジュール(予定) 第1回:イントロダクション 第2回:C言語の基礎~関数・変数・Makefile
第4回:C言語の基礎~ポインタと配列・リスト構造・file I/O 第5回:ネットワークとプログラミング(1) 第6回:ネットワークとプログラミング(2) 第7回:ネットワークプログラミング実践(1) 第8回:ネットワークプログラミング実践(2) 第9回:応用ネットワークプログラミング(1) 第10回:応用ネットワークプログラミング(2) 第11回以降:ミニプロ

5 今日のお題 Review last week’s homework コマンドライン引数 ポインタの基礎 構造体

6 課題1(2) argc,argvを用いて引 数を全て出力する。 実行例/出力例 コマンドライン引数
%./a.out arg[0]: ./a.out arg[1]: 123 arg[2]: 456 arg[3]: 789  コマンドライン引数 main( int argc, char **argv)‏ main( int argc, char *argv[])‏ argc には引数の数 argv[0] にはコマンド名 argv[1] には1番目の引数 argv[2] には2番目の引数

7 課題2‏: Homework Prob. 2 浮動小数点のレーンジ (fprange.c)‏
1. 最小: Write a program that starts with x = 1.0, and divides it by two repeatedly until it becomes zero 2. 最大: Do the same thing getting larger until something happens (what happens?) 3. Do for both “float” and “double”.

8 課題3 Makefileを作ってください 一行目は: all: hello size fortest cline numbers

9 コマンドライン引数

10 コマンドライン引数:argc,argv コマンドの引数を用いるには? % cat –n file
% cat file1 file2 file3

11 コマンドライン引数の利用法 main( int argc, char **argv)‏

12 引数を出力するプログラム #include <stdio.h>
int main(int argc, char *argv[])‏ { int i; for (i=0; i < argc; i++){ printf(“\t%s\n”, argv[i]); } return 0;

13 ポインタ

14 ポインタとは? ポインタ変数 int i = 10; int j = 20; int *ptr *の意味 「変数」を指す変数
アドレス ポインタ変数 「変数」を指す変数 int i = 10; int j = 20; int *ptr *の意味 「intへのポインタ型」であると宣言   するための指定子 108 i 104 j 100 ptr 変数とアドレス

15 ポインタ変数の操作(1)‏ int i = 10; int j = 20; int *ptr = &i
アドレス int i = 10; int j = 20; int *ptr = &i printf(“i=%d\n”, &i)‏ printf(“ptr=%d\n”, ptr)‏ printf(“i=%d\n”, i)‏ printf(“*ptr=%d\n”,*ptr)‏ ptrはiをさすポインタ変数 108 i 10 104 j 20 100 ptr 108 変数とアドレス

16 ポインタ変数の操作(2)‏ int x=1, y=5; int z[10]; int *p; p=&x; /* pはxを指す */
y=*p; /* yに1を代入 */ *p = 0; /* xが0になる */ p=&z[2]; /* pはz[2]を指す */

17 ポインタと関数(1)‏ #include <stdio.h> void swap(int x, int y)‏ {
int temp; temp = x; x = y; y = temp; } int main(){ int a = 5; int b = 3; swap (a,b); printf(“a=%d\n”, a); printf(“b=%d\n”,b); return 0; int型の変数を入れ替えるプログラム

18 ポインタと関数(2)‏ アドレス #include <stdio.h> void swap(int x, int y)‏ {
int temp; temp = x; x = y; y = temp; } int main(){ int a = 5; int b = 3; swap (a,b); printf(“a=%d\n”, a); printf(“b=%d\n”,b); return 0; 108 a 104 b 交換 94 x 5 90 y 3 変数とアドレス

19 ポインタと関数(3)‏ #include <stdio.h> void swap(int *x, int *y)‏ {
int temp; temp = *x; *x = *y; *y = temp; } int main(){ int a = 5; int b = 3; swap (&a,&b); printf(“a=%d\n”, a); printf(“b=%d\n”,b); return 0; int型の変数を入れ替えるプログラム 108 a *x 104 b *y 交換 94 x 108 90 y 104 変数とアドレス

20 構造体

21 構造体(structure)‏ 構造体を用いると、複数のデータを1つのまとまりと して取り扱うことができる
Ex: 1人の学生に対して学籍番号と成績 struct student{ int id; int score; }; 異なる型も混在できる struct student2{ char name[32];

22 構造体の定義 struct student{ int id; int score; }; 定義の方法 使用例 struct 構造体名{
型 メンバ名1; 型 メンバ名2; }; struct student{ int id; int score; };

23 構造体を用いた変数 定義した構造体を用いて変数はプリミティブな 型と同じ方法で宣言できる int a; struct student b;

24 構造体メンバへのアクセス(1)‏ 構造体メンバへのアクセスは.(ドット)演算子を 用いる
Ex: struct studentの変数bの点数(メンバ 名:score)を表示する struct student b = { ,70}; printf(“bの点数は%dです\n”, b.score);

25 構造体メンバへのアクセス(2)‏ 構造体へのポインタの変数のメンバへのアクセスは ->演算子を用いる
構造体へのポインタの変数のメンバへのアクセスは ->演算子を用いる Ex: struct studentの変数bの点数(メンバ名:score)を表 示する struct student b = { ,70}; struct student *c = &b; printf(“bの点数は%dです\n”, c->score); 構造体へのポインタ変数->メンバ名 は (*構造体へのポインタ変数).メンバ名 と同意

26 構造体(structure)(使用例1)‏
int main()‏ { int i; struct student{ int id; int score; } students[5] = { { ,80}, { ,70}, { ,60}, { ,75}, { ,49} }; for(i=0;i<5;i++){ printf("student id:%d, score:%d\n", students[i].id, students[i].score); } 構造体の定義、 構造体変数の宣言 構造体変数の初期化 を同時に行う場合

27 構造体(structure)(使用例2)‏
struct student{ int id; int score; }; Int main()‏ { int i; struct student students[5] = { { ,80}, { ,70}, { ,60}, { ,75}, { ,49} }; for(i=0;i<5;i++){ printf("student id:%d, score:%d\n", students[i].id, students[i].score); } 構造体の定義を分け た場合 変数の宣言、初期化 は同時に行っている

28 構造体(structure)(使用例3)‏
struct student{ int id; int score; }; Int main()‏ { int i; struct student students[5]; for(i=0; i<5; i++){ students[i].id = i; students[i].score = i; } for(i=0;i<5;i++){ printf("student id:%d, score:%d\n", students[i].id, students[i].score); 構造体の定義を分け た場合 初期化は行わずに 代入を行っている。

29 typedef struct student{ int id; int score; } STUDENT;
STUDENT students[5];

30 【補足2】構造体ポインタ struct student st; struct student *sp; sp = &st;
sp->id = ; (*sp).score = 23; sp st id score 23 printf(“%d\n”, sp->score);

31 練習1:構造体の練習 以下の情報をキーボードから入力し、後でまとめて出力する。
学籍番号 ログイン名 名前 %./a.out kazuhisa “kazuhisa matsuzono” Number: Login name: kazuhisa Name: kazuhisa matsuzono

32 構造体と関数 #include <stdio.h> struct student{ char name[20];
int math; int jlang; }; void clear(struct student *sei); int main(){ struct student seito; /* clearing data in seito */ clear(&seito); return 0; } void clear(struct student *sei){ strcpy (sei->name, “”); sei->math=0; sei->jlang=0; }

33 課題 Determine size of struct student
Determine size of array of struct student Use memcpy() to copy struct Use assignment to copy struct Use memset() to clear memory

34 実習(第2回課題)‏ 1. 2つの整数値を入力し,最小公倍数、最大公約 数を出力せよ
コマンドライン引数で値を2つ指定 関数を作成すること 2. 2つのint型の変数x,yを受け取り,その和と差 をwa及びsaが指すint型の変数に格納する関数  void calc(int x, int y, int *wa, int *sa)を 作成せよ. つぎのページにヒント

35 課題2‏ (numbers.c)‏ 1. 2つの整数値を入力し,最小公倍数、最大公約 数を出力せよ
コマンドライン引数で値を2つ指定 関数を作成すること 2. 2つのint型の変数x,yを受け取り,その和と差 をwa及びsaが指すint型の変数に格納する関数  void calc(int x, int y, int *wa, int *sa)を 作成せよ. つぎのページにヒント

36 課題2のヒント 最大公約数を先に求める ユークリッドの互除法 最小公倍数 n * m / (最大公約数)‏

37 実習ヒント 最大公約数を先に求める ユークリッドの互除法 最小公倍数 n * m / (最大公約数)‏


Download ppt "ネットワークプログラミング 第3回「C言語の基礎~コマンドライン引数・構造体・ポインタ」"

Similar presentations


Ads by Google