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

プログラミング基礎

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング基礎"

Copied!
19
0
0

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

全文

(1)

CプログラミングⅡ

(2)

文字列name,身長height(double型),体重weight

(double型)をメンバとする構造体Dataを定義し,

それぞれのメンバの値をキーボードから入力した後,

BMIを計算するプログラムを作成しなさい

BMIの計算は関数化すること

BMI計算後,18.5 ≦ BMI < 25 のとき"標準",それ以外の

とき"標準ではない"と出力するようにすること

演習2-1(a) BMIによる判定

[ ]

(

[ ]

[ ]

)

BMI

=

体重 kg 身長 m

×

身長 m

(3)

演習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; }

(4)

2つの3次元ベクトルについて,それらの内積と合成

ベクトル(ベクトルの和)を計算するプログラムを作成

しなさい

ベクトルのデータを格納するための構造体として,ベクトル

要素 x,y,z (double型)をメンバとする構造体 Vec3 を定義

すること

内積を計算する処理を関数化すること

Vec3型変数 a,b を仮引数とし,それらの内積をdouble型で返す

合成ベクトル(ベクトルの和)を計算する処理も関数化する

こと

Vec3型変数 a,b を仮引数とし,それらの和をVec3型で返す

(5)

演習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) {

/* 合成ベクトルの計算 */ }

(6)

氏名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 に代入

(7)

検索処理は関数化すること

関数名を srchname とする

データ数(配列要素数) n(int型),List型配列 px[ ],検索したい

name(文字列)を仮引数とする

検索したいnameと一致したメンバを持つ要素を,List型変数

foundに格納してreturn文で返すようにすること

ポインタを用いた形でプログラミングしてもよい

文字列が一致しているかどうかの判定は,標準関数の

strcmp関数を用いること

ヘッダファイルstring.hをインクルードすること

二つの文字列str1,str2を引数とし,それらが同じ文字列の場合

は0を返すようになっている

演習2-2(a) 構造体配列の要素の検索

(8)

演習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; }

(9)

演習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; }

(10)

氏名name(文字列),点数score(int 型)をメンバとする構造体

scoreを定義し,score型配列x[ ]を以下のように初期化したとき,

x[ ]をメンバtallの値が高い順(降順)に並べ替えるプログラムを

作成しなさい

演習2-2(b) 構造体配列の要素の並べ替え

構造体score型の定義およびscore型配列x[]の初期化 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: #include<stdio.h> #define N 5 typedef struct { char name[10]; int test; } score; int main(void) { score x[N] = { "福岡太郎", 82, "福岡次郎", 64, "博多三郎", 98, "博多四郎", 75, "九州五郎", 57 };

福岡太郎

82

x[0]

name

test

x[2]

x[1]

福岡次郎

64

name

test

博多三郎

98

name

test

博多四郎

75

name

test

九州五郎

57

name

test

x[3]

x[4]

博多三郎

98

name

test

福岡太郎

82

name

test

博多四郎

75

name

test

福岡次郎

64

name

test

九州五郎

57

name

test

並べ替え前

並べ替え後

(11)

演習2-2(b) 構造体配列の要素の並べ替え

int型配列要素の並べ替え(昇順)のプログラムの例 (バブルソート) 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: #include <stdio.h> #define N 5 int main(void) { int a[N] = {88, 67, 100, 56, 25}; int i, j, t; for(i = 0; i < N - 1; i++){ for(j = 0; j < N - 1 - i; j++){ if(a[j] > a[j + 1]){ t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } for(i = 0; i < N; i++) printf("a[%d] = %d¥n", i, a[i]); return 0;

56

25

100

67

88

a[0] a[1] a[2] a[3] a[4]

初期状態

87

100 56

25

j=0のとき

67

88 100 56

25

j=1のとき

i = 0 のとき(最大値が右側に)

67

67

88 100 56

25

j=2のとき

67

88

56 100 25

j=3のとき

67

88 100 56

25

67

88

56 100 25

67

88

56

25 100

(12)

演習2-2(b) 構造体配列の要素の並べ替え

int型配列要素の並べ替え(昇順)のプログラムの例 (バブルソート) 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> #define N 5 int main(void) { int a[N] = {88, 67, 100, 56, 25}; int i, j, t; for(i = 0; i < N - 1; i++){ for(j = 0; j < N - 1 - i; j++){ if(a[j] > a[j + 1]){ t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } for(i = 0; i < N; i++) printf("a[%d] = %d¥n", i, a[i]); return 0; }

67

56

25 100

j=0のとき

67

88

56

25 100

j=1のとき

i = 1 のとき(2番目に大きい値が右側に)

88

67

56

88

25 100

j=2のとき

67

56

88

25 100

67

56

25

88 100

i = 2 のとき(3番目に大きい値が右側に)

i = 3 のとき(4番目に大きい値が右側に)

(13)

演習2-2(b) 構造体配列の要素の並べ替え

int型配列要素の並べ替え(昇順)のプログラムの例 (バブルソート) 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: #include <stdio.h> #define N 5 int main(void) { int a[N] = {88, 67, 100, 56, 25}; int i, j, t; for(i = 0; i < N - 1; i++){ for(j = 0; j < N - 1 - i; j++){ if(a[j] > a[j + 1]){ t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } for(i = 0; i < N; i++) printf("a[%d] = %d¥n", i, a[i]); return 0;

すなわち,

x[j].tall と x[j+1].tall を比較し,

(課題は降順にするので)

x[j].tall の方が小さかったら,

x[j]とx[j+1]を入れ替える

という処理を行うように

プログラミングすればよい

(14)

n個のデータ x[i],y[i] (i = 0, 1, ... , n-1) について回帰

分析を行うプログラムを作成しなさい

データはファイル”regression.txt”から読み込むようにする

ファイルは授業用ホームページからダウンロードすること

データの並びに注意すること

無関係な文字列なども入っているので,読み込み手順を

工夫すること

以下の値を出力すること(出力先は画面でよい)

データの平均値

データの偏差平方和,偏差積和

回帰直線の傾き,切片

相関係数

演習2-3(a) 簡単な統計処理(回帰分析)

(15)

回帰分析

回帰分析(単回帰分析)は,ある変数 y とそれに影響を及ぼす考えられる

変数 x との関係式を直線 y = ax + b で表すことを目的としたもの

変数 y および x について観測されたデータをもとに,直線の傾き a と

切片 b を最小二乗法で求める

相関係数 r により,データ x と y が求めた直線式にどれだけ従うかを

評価することができる

計算手順

ファイルからデータを読み込み,平均値を計算する.

演習2-3(a) 簡単な統計処理(回帰分析)

0 1 1 0 1 1 i n i n

x

x

x

x

y

y

y

y

− −

1 1 0 0

1

1

,

n n i i i i

x

x

y

y

n

n

− − = =

=

=

[データ]

[平均値]

(16)

計算手順(続き)

次に,x[i],y[i] についての偏差平方和,およびそれらの

偏差積和を計算する.

直線式のパラメータ,および相関係数を計算する.

演習2-3(a) 簡単な統計処理(回帰分析)

[偏差平方和]

[偏差積和]

(

)

2

(

)

2 1 1

,

n n xx i yy i i i

S

x

x

S

y

y

= =

=

=

(

)(

)

1 n xy i i i

S

x

x

y

y

=

=

,

xy xx

S

a

b

y

a x

S

=

= − ×

xy xx yy

S

r

S

S

=

×

[直線式のパラメータ]

[相関係数]

(17)

テキストファイル abstract.txt に含まれるアルファベット

の各文字数をカウントし,そのヒストグラムを出力する

プログラムを作成しなさい

大文字,小文字を区別せずにカウントすること

ヒストグラムについては,たとえば文字数2個につき‘*’を

1個出力するようにすればよい

演習2-3(b)

文字数のヒストグラム

int hist [26] :ヒストグラムデータ

hist [0] : ‘a’ もしくは ‘A’ の文字数

hist [1] : ‘b’ もしくは ‘B’ の文字数

hist [2] : ‘c’ もしくは ‘C’ の文字数

(18)

演習2-3(b) 文字数のヒストグラム

英単語中のアルファベット文字のカウント

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

18:

19:

20:

21:

#include <stdio.h>

int main(void)

{

char engstr[21] = "aabbbcddddeee";

int i, hist[26];

for(i = 0; i < 26; i++) hist[i] = 0;

i = 0;

while(str[i] != NULL){

if(str[i] >= 'a' && str[i] <= 'z')

hist[str[i] – 'a']++;

else ifif(str[i] >= 'A' && str[i] <= 'Z')

hist[str[i] – 'A']++;

else {}

i++;

}

return 0;

}

今見ている文字 str[i] に

'b' が格納されていたとき,

'b' - 'a' = 1 なので

hist[1] に +1 される

今見ている文字 str[i] に

'B' が格納されていたとき,

'B' - 'A' = 1 なので

hist[1] に +1 される

アルファベット文字以外は

カウントしない(何もしない)

(19)

演習2-3(b) 文字数のヒストグラム

ヒストグラムの出力例

1:

2:

3:

4:

5:

6:

7:

8:

9:

10:

11:

12:

13:

14:

15:

16:

17:

18:

19:

#include <stdio.h>

int main(void)

{

int i, j, hist[26];

/* hist[]にカウント数が格納されていたとする*

for(i = 0; i < 26; i++){

printf("%cおよび%cは%3d文字:", 'a' + i, 'A' + i);

for(j = 0; j < hist[i]; j += 2) printf("*");

printf("¥n");

}

return 0;

}

a および A は 60 文字 :****************************** b および B は 19 文字 :********* c および C は 34 文字 :***************** : : : y および Y は 10 文字 :*****

参照

関連したドキュメント

る、関与していることに伴う、または関与することとなる重大なリスクがある、と合理的に 判断される者を特定したリストを指します 51 。Entity

2008 ) 。潜在型 MMP-9 は TIMP-1 と複合体を形成することから TIMP-1 を含む含む潜在型 MMP-9 受 容体を仮定して MMP-9

噸狂歌の本質に基く視点としては小それが短歌形式をとる韻文であることが第一であるP三十一文字(原則として音節と対応する)を基本としへ内部が五七・五七七という文字(音節)数を持つ定形詩である。そ

2021] .さらに対応するプログラミング言語も作

注:一般品についての機種型名は、その部品が最初に使用された機種型名を示します。

C. 

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を

(a) ケースは、特定の物品を収納するために特に製作しも