課題解説: 関数の引数にポインタを使って2数を入れ替える /*swap*/ #include <stdio.h> void swap(int *x, int *y); main() { int m, n; scanf(“%d %d”,&m, &n); printf(“yomikomiti= %d, %d\n”,m,n); swap(&m, &n); printf(“irekaego %d, %d\n”, m,n); } void swap(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp;
住所録(名前、住所、郵便番号、電話番号など) 複素数(実部、虚部) 円(中心のx, y 座標、半径) 構造体 (structure) 関連するデータをひとかたまりで扱う方法 例: 住所録(名前、住所、郵便番号、電話番号など) 複素数(実部、虚部) 円(中心のx, y 座標、半径) * 配列との違い: 違う「型」の変数もまとめて扱える。 int, char など混じっていてもよい。 「大きさ」はバラバラでよい。 「名前」は10字、住所は50字など
配列に文字列を入れる関数。構造体に限らず使える。 構造体 の使い方 住所録 #include <stdio.h> #include <string.h> struct address_book { char name[20]; char address[100]; int zip_code; }; main() struct address_book mybook; strcpy(mybook.name,”umebu”); strcpy(mybook.address,”seaside1005”); mybook.zip_code=7315135; printf(“name is %s\n”,mybook.name); } 構造体タグ名 メンバ名 構造体タグ名:変数の型と同じ 構造体変数名 配列に文字列を入れる関数。構造体に限らず使える。
課題 構造体を使って自分の住所を入力し、表示せよ。
#include <stdio.h> #include <string.h> struct address_book 構造体 の使い方 住所録 (100人分) 構造体 の使い方 住所録 #include <stdio.h> #include <string.h> struct address_book { char name[20]; char address[100]; int zip_code; }; main() struct address_book mybook[100]; strcpy(mybook[1].name,”umebu”); strcpy(mybook[1].address,”seaside1005”); mybook[1].zip_code=7315135; printf(“name is%s\n”,mybook[1].name); 構造体は、1人分と同じ 構造体配列名
構造体の応用: 複素数の和を計算する関数(例題 c26.c 改) #include <stdio.h> struct complex {float re; float im;}; struct complex add(struct complex c1, struct complex c2); main( ) { struct complex z1, z2, z3; z1.re = 1.0; z1.im = 2.0; z2.re = 3.0; z2.im = 4.0; z3 = add(z1, z2); printf(“z3.re=%f z3.im=%f\n”,z3.re, z3.im); } struct complex add(struct complex c1, struct complex c2) struct complex c3; c3.re = c1.re + c2.re; c3.im = c1.im + c2.im; return (c3); これは関数のプロトタイプ宣言
課 題 教科書 p188 問題 4-45, 4-46 を解け。
構造体の応用: 複素数の差を計算する関数(問題 4-45) #include <stdio.h> struct complex {float re; float im;}; struct complex dif(struct complex c1, struct complex c2); main( ) { struct complex z1, z2, z3; z1.re = 1.0; z1.im = 2.0; z2.re = 3.0; z2.im = 4.0; z3 = dif(z1, z2); printf(“z3.re=%f z3.im=%f\n”,z3.re, z3.im); } struct complex dif(struct complex c1, struct complex c2) struct complex c3; c3.re = c1.re - c2.re; c3.im = c1.im - c2.im; return (c3);
構造体の応用: 複素数の積を計算する関数(問題 4-45) #include <stdio.h> struct complex {float re; float im;}; struct complex mul(struct complex c1, struct complex c2); main( ) { struct complex z1, z2, z3; z1.re = 1.0; z1.im = 2.0; z2.re = 3.0; z2.im = 4.0; z3 = mul(z1, z2); printf(“z3.re=%f z3.im=%f\n”,z3.re, z3.im); } struct complex mul(struct complex c1, struct complex c2) struct complex c3; c3.re = c1.re * c2.re - c1.im * c2.im; c3.im = c1.im * c2.re + c1.re * c2.im; return (c3);
構造体の応用: 複素数の絶対値を計算する関数(問題 4-46) #include <stdio.h> #include <math.h> struct complex {float re; float im;}; float cabs(struct complex c); main( ) { struct complex z; float abs; z.re = 3.0; z.im = 4.0; abs = cabs(z); printf(“abs(%f + i %f)=%f\n”,z.re, z.im, abs); } float cabs(struct complex c) float a; a = sqrt(c.re * c.re + c.im * c.im); return (a);
構造体の応用: 共役複素数を計算する関数 #include <stdio.h> struct complex {float re; float im;}; struct complex conj(struct complex c); main( ) { struct complex z, zc; z.re = 1.0; z.im = 2.0; zc = conj(z); printf(“conj(%f + %f i)= (%f - %f i) \n”, z.re, z.im, zc.re, -zc.im); } struct complex conj(struct complex c) struct complex cc; cc.re = c.re; cc.im = - c.im; return (cc);
構造体の応用: 複素数の商を計算する関数(問題 4-45) #include <stdio.h> #include <math.h> struct complex {float re; float im;}; struct complex div(struct complex c1, struct complex c2); struct complex conj(struct complex c); struct complex mul(struct complex c1, struct complex c2); float cabs(struct complex c); main( ) { struct complex z1, z2, z3; z1.re = 1.0; z1.im = 2.0; z2.re = 3.0; z2.im = 4.0; z3 = div(z1, z2); printf(“(%f+i%f)/(%f+i%f)=%f+i%f\n”, z1.re, z1.im, z2.re, z2.im, z3.re, z3.im); } /* 次ページに続く */ その1
struct complex div(struct complex c1, struct complex c2) { struct complex c3,c4; float cabs2; cabs2 = cabs(c2)*cabs(c2); c3 = mul( c1, conj(c2)); c3.re = c3.re/cabs2; c3.im = c3.im/cabs2; } struct complex mul(struct complex c1, struct complex c2) struct complex c3; c3.re = c1.re * c2.re - c1.im * c2.im; c3.im = c1.im * c2.re + c1.re * c2.im; return (c3); } /* 次ページに続く */ その2
float cabs(struct complex c) { float a; a = sqrt(c.re * c.re + c.im * c.im); return (a); } struct complex conj(struct complex c) struct complex cc; cc.re = c.re; cc.im = - c.im; return (cc); その3