CプログラミングⅡ
文字列name,身長height(double型),体重weight
(double型)をメンバとする構造体Dataを定義し,
それぞれのメンバの値をキーボードから入力した後,
BMIを計算するプログラムを作成しなさい
BMIの計算は関数化すること
BMI計算後,18.5 ≦ BMI < 25 のとき"標準",それ以外の
とき"標準ではない"と出力するようにすること
演習2-1(a) BMIによる判定
[ ]
(
[ ]
[ ]
)
BMI
=
体重 kg 身長 m
×
身長 m
演習2-1(a) BMIによる判定
BMIの計算プログラムの構造例 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: #include <stdio.h> typedef struct { char name[21];double height, weight; } Data; double calbmi(Data p); int main(void) { Data person; /* personの各メンバを入力 */ double bmi; bmi = calbmi(person); printf("%sのBMI判定:", person.name); /* bmiの判定 */ return 0; } BMIの計算プログラムの構造例(続き) 25: 26: 27: 28: 29: 30: 31: 32: double avecal(Data p) { double bmi; /* pのメンバheight,weightからBMI計算 */ return bmi; }
2つの3次元ベクトルについて,それらの内積と合成
ベクトル(ベクトルの和)を計算するプログラムを作成
しなさい
ベクトルのデータを格納するための構造体として,ベクトル
要素 x,y,z (double型)をメンバとする構造体 Vec3 を定義
すること
内積を計算する処理を関数化すること
Vec3型変数 a,b を仮引数とし,それらの内積をdouble型で返す
合成ベクトル(ベクトルの和)を計算する処理も関数化する
こと
Vec3型変数 a,b を仮引数とし,それらの和をVec3型で返す
演習2-1(b) ベクトルの内積,合成
ベクトルの内積,合成プログラムの構造例 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: #include <stdio.h> typedef struct { double x, y, z; } Vec3;double innervec(Vec3 a, Vec3 b); Vec3 compvec(Vec3 a, Vec3b); int main(void)
{
Vec3 vec1, vec2, vec3; double invec; printf("vec1.x ="); scanf("%lf", &vec1.x); printf("vec1.y ="); scanf("%lf", &vec1.y); printf("vec1.z ="); scanf("%lf", &vec1.z); /* vec2の入力 */ ベクトルの内積,合成プログラムの構造例(続き) 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
invec = innervec(vec1, vec2); vec3 = coompvec(vec1, vec2); printf("内積:%lf¥n", invec); printf("合成ベクトル:"); printf("(%lf, %lf, %lf)¥n",
vec3.x, vec3.y, vec3.z); return 0;
}
double innervec(Vec3 a, Vec3 b) {
/* 内積の計算 */ }
Vec3 compvec(Vec3 a, Vec3 b) {
/* 合成ベクトルの計算 */ }
氏名name(文字列),身長tall(int型)をメンバとする構造体
Listを定義し,List型配列x[ ]に格納されているデータの中
から,キーボードから入力したnameと一致するメンバname
を持つ要素を検索するプログラムを作成しなさい
演習2-2(a) 構造体配列の要素の検索
福岡太郎
175
x[0]
name
tall
x[2]
x[1]
福岡次郎
164
name
tall
博多三郎
182
name
tall
キーボードから入力
x[3]
博多四郎
168
name
tall
x[4]
九州五郎
170
name
tall
博多四郎
-1
key
name
tall
見つからない場合を考えて
-1 を入れておく
x[i].name と key.name を比較
一致したときの x[i].tall を
key.tall に代入
検索処理は関数化すること
関数名を srchname とする
データ数(配列要素数) n(int型),List型配列 px[ ],検索したい
name(文字列)を仮引数とする
検索したいnameと一致したメンバを持つ要素を,List型変数
foundに格納してreturn文で返すようにすること
ポインタを用いた形でプログラミングしてもよい
文字列が一致しているかどうかの判定は,標準関数の
strcmp関数を用いること
ヘッダファイルstring.hをインクルードすること
二つの文字列str1,str2を引数とし,それらが同じ文字列の場合
は0を返すようになっている
演習2-2(a) 構造体配列の要素の検索
演習2-2(a) 構造体配列の要素の検索
検索プログラムの構造例 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: #include <stdio.h> typedef struct { char name[10]; int tall; } List;List srchname(int n, List px[], char name[]); int main(void) { List x[5] = { "福岡太郎", 175, "福岡次郎", 164, "博多三郎", 182, "博多四郎", 168, "九州五郎", 170 }; List y; char name[21];
printf("検索氏名:"); scanf("%s", name); y = srchname(5, x, name);
if(y.tall != -1)
printf("%sの身長:%d¥n", name, y.tall); else printf("%sはデータにありません.¥n"); return 0; } 検索プログラムの構造例(続き) 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
List srchname(int n, List px[], char name[]) { int i; List found; /* nameと一致するメンバnameを持つ */ /* 配列px[]の要素の検索 */ return found; }
演習2-2(a) 構造体配列の要素の検索
二つの文字列の比較
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: #include <stdio.h>#include <string.h> /* strcmp関数を利用する場合,string.hをincludeする必要がある */
int main(void) { char str1[21], str2[21]; printf(“一人目の名前 : ”); scanf("%s", str1); printf(“二人目の名前 : ”); scanf("%s", str2); if(strcmp(str1, str2) == 0){ /* 文字列 str1 と str2 が一致していれば,strcmp関数は 0 を返す */ printf("二人の名前は一致¥n"); } else { printf("二人の名前は不一致¥n"); } return 0; }