教科書P106〜109
[例題] 2つの整数を関数に渡し、加算結果を返す
#include <stdio.h> /* 関数プロトタイプ */ int sum(int,int); void main(void) { int a, b; scanf("%d %d", &a, &b); printf("%d + %d = %d\n", a, b, sum(a,b)); } int sum(int x,int y) { int z; z = x + y; return z; }[解説]
- main関数からsum関数を呼び出す際、引数として変数a、bの値をそれぞれ与える。
- sum関数は、与えられた値を変数x、yにそれぞれ格納し、処理を行う。
例題のプログラムをポインタを利用して作り直す
#include <stdio.h> /* 関数プロトタイプ */ int sum(int *,int *); void main(void) { int a, b; scanf("%d %d", &a, &b); printf("%d + %d = %d\n", a, b, sum(&a,&b)); } int sum(int *x,int *y) { int z; z =*x+*y; return z; }[解説]
- main関数からsum関数を呼び出す際、引数として変数a、bの
アドレスをそれぞれ与える。- sum関数は、与えられたアドレスを
ポインタ変数x、yにそれぞれ格納し、処理を行う。
(アドレスをもらうため、main関数の変数の値を直接触ることができる!)[関数にアドレスを渡すメリット]
- 引数にアドレスを利用することにより、
1つの関数で複数の値を同時に編集できる- (配列などを引数にする場合、)関数内で変数を宣言しないですむため、
プログラム実行時に使用するメモリの量を減らすことができる[例題2] 引数に与えられた2つの変数の内容を入れ替える
#include <stdio.h> /* 関数プロトタイプ */ void swap(int *,int *); void main(void) { int a, b; scanf("%d %d", &a, &b); printf("入れ替え前:a = %d, b = %d\n", a, b); swap(&a, &b); printf("入れ替え後:a = %d, b = %d\n", a, b); } void swap(int *x,int *y) { int z; z = *x; *x = *y; *y = z; }[例題3] 入力された文字列をすべて大文字に変換する
#include <stdio.h> /* 関数プロトタイプ */ void upper(char *); void main(void) { char str[80]; gets(str); printf("変換前:%s\n", str); upper(str); printf("変換後:%s\n", str); } void upper(char *pstr) { for ( ; *pstr!='\0' ; pstr++) { if ('a' <= *pstr && *pstr <= 'z') *pstr -= ('a' - 'A'); } }
問題1
教科書109ページ練習問題24
問題2
与えられた文字列の長さを返す関数str_lenを作成せよ。
#include <stdio.h> /* 関数プロトタイプ */ int str_len(char *); void main(void) { char str[80]; gets(str); printf("入力文字列の長さ:%d\n", str_len(str)); } int str_len(ここも考える) { ここの処理を考える }問題3
文字列を別の配列にコピーする関数str_cpyを作成せよ。
#include <stdio.h> /* 関数プロトタイプ */ 関数の型 str_cpy(引数の型); void main(void) { char str1[80], str2[80]; gets(str1); str_cpy(str1, str2); printf("str1:%s\n", str1); printf("str2:%s\n", str2); } 関数の型 str_cpy(引数の型) { ここの処理を考える }問題4
2つの文字列の内容が同じなら1を、1文字でも違っていたら0を返す関数str_chkを作成せよ。
#include <stdio.h> /* 関数プロトタイプ */ int str_chk(char *, char *); void main(void) { char str1[80], str2[80]; gets(str1); gets(str2); if (str_chk(str1, str2) == 1) printf("同じ\n"); else printf("違う\n"); } int str_chk(ここも考える) { ここの処理を考える }
教科書P110〜115
[例題] 配列内データの加算結果を返す関数
#include <stdio.h> /* 関数プロトタイプ */ int sum(int []); void main(void) { int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1}; printf("合計 = %d\n",sum(data)); } int sum(int d[]) { int i, goukei = 0; for(i=0 ;d[i]!=(-1) ; i++) goukei +=d[i]; return goukei; }[解説]
配列内の全データを関数に引き渡すことはできないため、配列の先頭アドレスを渡し、関数側で添え字を使って配列データを参照する。
つまり、アドレス渡しの別の書き方である。
[ポインタを使った書き方]
#include <stdio.h> /* 関数プロトタイプ */ int sum(int *); void main(void) { int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1}; printf("合計 = %d\n",sum(data)); } int sum(int *d) { int goukei = 0; for( ;*d!=(-1) ; d++) goukei +=*d; return goukei; }練習問題
- 教科書111ページ練習問題25
- 練習問題1のプログラムを、ポインタを使って作り直す。
教科書112〜113ページを参照。
とりあえず飛ばす。
教科書114〜115ページを参照。
とりあえず飛ばす。