• 検索結果がありません。

ヒントスライドPDF プログラミング演習2 #prog2bkc net

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPDF プログラミング演習2 #prog2bkc net"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

第4週 ポインタ引数と文字列処理

(2)

今週習得すること

関数のプロトタイプ宣言

値渡し

ポインタ渡し

ポインタによる文字列渡し

文字列操作<string.h>

• strlen

• strcpy

• strcat

• strcmp

(3)

3

値渡し

void clear( int value ); int main(){

int v = 10; clear( v );

printf("v = %d¥n", v ); return 0;

}

void clear( int value ){ value = 0;

};

関数のプロトタイプ宣言

プログラム内で利用する関数の

名前、引数、型を指定する文法規則

(4)

値渡し

void clear( int value ); int main(){

int v = 10; clear( v );

printf("v = %d¥n", v ); return 0;

}

void clear( int value ){ value = 0;

};

clear

10

main

値がコピーされる

(5)

5

値渡し

void clear( int value ); int main(){

int v = 10; clear( v );

printf("v = %d¥n", v ); return 0;

}

void clear( int value ){ value = 0;

};

clear

0

valueに値が代入されても vとvalueは別物なので vに影響しない

main

(6)

値渡し

void clear( int value ); int main(){

int v = 10; clear( v );

printf("v = %d¥n", v ); return 0;

}

void clear( int value ){ value = 0;

};

main

v = 10

出力結果

(7)

7

ポインタ渡し

void clear( int *value ); int main(){

int v = 10; clear( &v );

printf("v = %d¥n", v ); return 0;

}

void clear(int *value ){ *value = 0;

};

main

(8)

ポインタ渡し

void clear( int *value ); int main(){

int v = 10; clear( &v );

printf("v = %d¥n", v ); return 0;

}

void clear(int *value ){ *value = 0;

};

&v

clear

2週目のポイント3

ポインタ変数の宣言は 型名 * ポインタ変数名;

main

2週目のポイント2

変数の前に&をつけると 変数のアドレスを取得できる

(9)

9

ポインタ渡し

void clear( int *value ); int main(){

int v = 10; clear( &v );

printf("v = %d¥n", v ); return 0;

}

void clear(int *value ){

*value = 0; };

&v

clear

main

2週目のポイント5

ポインタ変数に*をつけると ポインタ変数の指している先 の変数の値を参照できる

(10)

ポインタ渡し

void clear( int *value ); int main(){

int v = 10; clear( &v );

printf("v = %d¥n", v ); return 0;

}

void clear(int *value ){ *value = 0;

};

main

v = 0

出力結果

(11)

関数 -復習-

入力(引数)に対しまとまった処理を行い結果を出力

#include <stdio.h> void swap(int x, int y);

int main(){ int x,y;

x = 2; y = 5; swap(x,y);

printf("x=%d, y=%d¥n",x,y); }

void swap(int x, int y){ int temp = x;

x = y;

y = temp; }

プロトタイプ宣言

関数型(戻り値の型を指定) return で戻り値を返す

仮引数

関数内の変数宣言

11

(12)

必須課題4-1:理解補助シート

main

swap

x y

x y

(13)

13

必須課題4-2:理解補助シート

main

swap

x y

x y

(14)

C 標準ライブラリ

汎用性の高いプログラムをまとめたもの

• ヘッダファイルをインクルードして利用

• 入出力に便利なプログラムをまとめたライブラリ

– printf, scanf, fgets などが利用できる

#include <stdio.h>

(15)

文字列操作のライブラリ string.h

char str1[20], str2[20]

strlen:文字列長を返す

strcpy:文字列のコピー

strcat:文字列の連結

strcmp:文字列の比較

strlen( str1 );

str2の内容をstr1へコピー

strcpy( str1, str2 );

str1にstr2を連結する

strcmp( str1 );

str1の長さを返す(¥0は含めない)

strcat( str1, str2 );

str1 = str2 ⇒ 0

str1 > str2 ⇒ 0より大きい値 str1 < str2 ⇒ 0より小さい値

15

(16)

strlen: 文字列のサイズを返す

#include<stdio.h>

#include<string.h> int main(){

char str[10] ="ABCD";

printf("str size is %d¥n", strlen(str)); return 0;

}

size_t strlen( char *s );

返り値:文字列の長さ

¥0はカウントされない str size is 4

実行結果

文字列操作の関数(strlen,strcpy, strcat, strcmpなど)を利用するには string.hをインクルードすること

(17)

17

strcpy: 文字列のコピー

int main(){ char s1[10]; char s2[10];

strcpy(s1, “ABCD”);// strcpy(s2, s1); //

printf(“s1 = %s s2 = %s¥n”,s1, s2); return 0;

}

strcpy( char *s1, char*s2 );

文字列s2s1の領域にコピーする

注意:s1がs2よりサイズが小さいと データを壊す可能性あり

s1 = ABCD s2 = ABCD 実行結果

文字列のコピー

strcpy(s1, “ABCD”); strcpy(s2, s1);

(18)

strcat: 文字列の連結

int main(){

char s1[10] = “ABCD”; char s2[5] = “DEFG”; strcat(s1, s2);

printf(“s1 = %s s2 = %s¥n”,s1, s2); return 0;

}

strcat(s1, s2);

strcat( char *s1, char*s2 );

文字列s2s1の末尾連結する

注意:s1のサイズが小さいと データを壊す可能性あり

連結後の文字列 s1 = ABCDDEFG s2 = DEFG

実行結果

(19)

19

strcmp: 文字列の比較

int main(){

char s1[4] = "ABC"; char s2[4] = "ABC"; char s3[5] = "ABB"; char s4[5] = "ABCD";

printf("strcmp(s1, s2) = %d¥n", strcmp(s1, s2) ); printf("strcmp(s1, s3) = %d¥n", strcmp(s1, s3) ); printf("strcmp(s1, s4) = %d¥n", strcmp(s1, s4) ); return 0;

}

int strcmp( char *s1, char*s2 );

s1s2の文字列を比較

返り値:

0:s1s2が同じ

正の整数:s1の方が大 (s1s2より辞書順で後) 負の整数:s1の方が小 (s1s2より辞書順で先)

strcmp(s1, s2) = 0 strcmp(s1, s3) = 1 strcmp(s1, s4) = -68

実行結果

‘C’ – ‘B’ = 1 ‘¥0’ – ‘D’ = -68

‘¥0’ – ‘¥0’ = 0

値は処理系依存

(20)

ポインタによる文字列渡し

#include<stdio.h>

size_t mystrlen(char *s); int main(){

char s1[5] = "ABCD"; int len;

len = mystrlen( s1 );

printf("len = %d¥n", len); return 0;

}

size_t mystrlen( char *s ){ size_t len = 0;

while( *s != '¥0' ){ len++;

s++; }

mystrlen main

ポインタを利用することで

関数の引数に文字列を渡すこと

ができる

(21)

21

必須課題4-3:作成手順

1. create_word_pair(char *a, char *b)

レジュメのp10の指示通りに、構造体のメンバを

設定する

2. 標準出力に1で作成した構造体のメンバをすべて

出力する

(22)

必須課題4-3 ポインタによる文字列渡し

以下の関数を作成

word_pair_t create_word_pair(char *a, char *b)

main関数から以下のように呼び出し

char str1[SIZE1], str2[SIZE2]; /* SIZE1,2は適当に決めていい */

w = create_word_pair(str1, str2);

関数create_word_pair()はアドレスstr1, str2 (char型配列str1, str2の 先頭のアドレス) を受け取る

受け取った先頭アドレスを用いて文字列にアクセス

main関数側でも値が変わる

0 0 1 0

0 1 0 1

0 0 0 0

create_word_pair関数からの アクセス

•知っているのはstr1,2の先頭のア ドレスのみ.配列サイズを知らない

str1 (main関数) アドレス0 str2 (main関数)

アドレス6 a=0

(create_word_pair)

(23)

著者リスト

23

1. 安積 卓也(情報システム学科)

2. 泉 朋子 (情報コミュニケーション学科)

3. 原田 史子(情報システム学科)

参照

関連したドキュメント

活性 クロマ チン構 造の存在... の複合体 がきわ

本研究は,地震時の構造物被害と良い対応のある震害指標を,構造物の疲労破壊の

(実被害,構造物最大応答)との検討に用いられている。一般に地震動の破壊力を示す指標として,入

物語などを読む際には、「構造と内容の把握」、「精査・解釈」に関する指導事項の系統を

この P 1 P 2 を抵抗板の動きにより測定し、その動きをマグネットを通して指針の動きにし、流

・ 研究室における指導をカリキュラムの核とする。特別実験及び演習 12

授業は行っていません。このため、井口担当の 3 年生の研究演習は、2022 年度春学期に 2 コマ行います。また、井口担当の 4 年生の研究演習は、 2023 年秋学期に 2

SDGs を学ぶ入り口としてカードゲームでの体験学習を取り入れた。スマ