演習問題8解答例

問1 個人データの構造体による記述
問2 3 次元空間上の点の構造体による記述
問3 個人データの構造体による記述(関数の引数,構造体のネスト)
問4 構造体メンバーの出力
問5 英文のリスト構造( 2 進木)

[問1]n (入力)人の名前( char ),給与( int ),及び,年齢( int )を入力し,出力するプログラムを書け(各人のデータを構造体で記述せよ).
/****************************/
/* 名前,給与,年齢         */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>

struct kojin {
	char name[20];
	int kyuyo;
	int nenrei;
};

int main()
{
	struct kojin x;
/*
     入力
*/
	printf("名前は? ");
	scanf("%s", x.name);
	printf("給与は? ");
	scanf("%d", &x.kyuyo);
	printf("年齢は? ");
	scanf("%d", &x.nenrei);
/*
     出力
*/
	printf("名前 %s  給与 %d 年齢 %d\n", x.name, x.kyuyo, x.nenrei);

	return 0;
}
		
[問2]n (入力)個の 3 次元空間の点の座標を入力した後,原点からの平均距離を計算し,平均距離以上離れた点の個数を出力するプログラムを書け( 3 次元空間の 1 つの点の座標を構造体で記述せよ)
/****************************/
/* 3次元空間の点           */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct ten {
	double x,y,z,r;
};

int main()
{
	struct ten *p;
	double mean = 0.0;
	int i1, kosu = 0, n;
/*
     入力
*/
	printf("点の数は? ");
	scanf("%d", &n);

	p = (struct ten *)malloc(n*sizeof(struct ten));

	for (i1 = 0; i1 < n; i1++) {
		printf("点の座標は(x y z)? ");
		scanf("%lf %lf %lf", &p[i1].x, &p[i1].y, &p[i1].z);
		p[i1].r  = sqrt(p[i1].x * p[i1].x + p[i1].y * p[i1].y + p[i1].z * p[i1].z);
		mean    += p[i1].r;
	}
/*
     点の個数
*/
	mean /= n;

	for (i1 = 0; i1 < n; i1++) {
		if (p[i1].r >= mean)
			kosu++;
	}

	printf("   平均距離 %f 個数は %d\n", mean, kosu);

	return 0;
}
		
[問3]自分の名前,住所(県,市,番地),年齢,及び,性別を構造体で記述し,その構造体を関数に引数として受け渡し,内容を出力するプログラムを書け.ただし,住所は,上の構造体に含まれる別の構造体として記述する事(構造体のネスト).
/****************************/
/* 構造体のネスト           */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>

struct kojin {
	char name[20];
	struct jusho {
		char ken[10];
		char shi[10];
		char ban[20];
	} ju;
	int nen;
	char sei[3];
};

void output(struct kojin);

int main()
{
	struct kojin x;
/*
     入力
*/
	printf("名前は? ");
	scanf("%s", x.name);
	printf("住所(県)は? ");
	scanf("%s", x.ju.ken);
	printf("住所(市)は? ");
	scanf("%s", x.ju.shi);
	printf("住所(番地)は? ");
	scanf("%s", x.ju.ban);
	printf("年齢は? ");
	scanf("%d", &x.nen);
	printf("性別は? ");
	scanf("%s", x.sei);
/*
     出力
*/
	output(x);

	return 0;
}

/*******************/
/* 構造体の出力    */
/*      x : 構造体 */
/*******************/
void output(struct kojin x)
{
	printf("名前 %s 住所 %s%s%s 年齢 %d 性別 %s\n",
           x.name, x.ju.ken, x.ju.shi, x.ju.ban, x.nen, x.sei);
}
		
[問4]名前,住所,電話番号を構造体で記述し,名前を入力すると電話番号を出力するプログラムを書け.
/****************************/
/* 名前,住所,電話番号     */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct kojin {
	char name[20];
	char jusho[50];
	char tel[15];
};

int main()
{
	struct kojin *p;
	char name[20];
	int i1, n, sw = 1;
/*
     入力(データベースの作成)
*/
	printf("人数は? ");
	scanf("%d", &n);

	p = (struct kojin *)malloc(n*sizeof(struct kojin));

	for (i1 = 0; i1 < n; i1++) {
		printf("   名前は? ");
		scanf("%s", p[i1].name);
		printf("   住所は? ");
		scanf("%s", p[i1].jusho);
		printf("   電話番号は? ");
		scanf("%s", p[i1].tel);
	}
/*
     探索
*/
	printf("探索\n");

	while (sw > 0) {
		printf("   名前は?(endで終了) ");
		scanf("%s", name);
		sw = strcmp(name, "end");
		if (sw != 0) {
			for (i1 = 0; i1 < n && sw != 0; i1++) {
				sw = strcmp(name, p[i1].name);
				if (sw == 0)
					printf("      電話番号は %s\n", p[i1].tel);
			}
			if (sw != 0)
				printf("      見つかりません\n");
			sw = 1;
		}
	}

	return 0;
}
		
[問5]英語の単語を入力し,それを 2 進木として記憶するプログラムを構造体を利用して書け.ただし,新しい単語が入力されたとき,記憶されている単語よりアルファベット順で前にあるなら左,そうでなければ右の枝をたどるものとする.例えば,11 個の単語が,「 network parameters are optimized from empirical data and the optimal number 」 という順に入力された場合は以下のようになる.
/****************************/
/* リスト処理               */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list {
	char *name;
	struct list *mae;
	struct list *ato;
};

void add(char *, struct list **);
void output(struct list *, int);
struct list **search(char *, struct list **, int *);

int main()
{
	struct list *base = NULL, **add_a;
	int sw = 1, same;
	char tango[50];
/*
     単語の入力とリストの作成
*/
	while (sw != 0) {
					// 単語入力
		printf("単語を入力して下さい(終了はピリオド) ");
		scanf("%s", tango);
					// 終了判定
		sw = strcmp(tango, ".");
					// リスト作成
		if (sw != 0) {
			add_a = search(tango, &base, &same);   // 探索
			if (same == 0)
				add(tango, add_a);   // 追加
		}
	}
/*
     リストの出力
*/
	output(base, 0);

	return 0;
}

/**************************************************************/
/* 単語の探索                                                 */
/*      tango : 入力された単語                                */
/*      base : 単語が入っている構造体のアドレスへのポインタ   */
/*      same : =0 : 単語を追加                                */
/*             =1 : 既に同じ単語がリスト上にある              */
/*      return : 追加する単語構造体のアドレスに対するポインタ */
/**************************************************************/
struct list **search(char *tango, struct list **base, int *same)
{
	struct list **add_a;
	int sw;

	*same = 0;
/*
     最初の単語
*/
	if (*base == NULL)
		return base;
/*
     単語の比較
*/
	sw = strcmp(tango, (*base)->name);

	if (sw == 0) {   // 同じ単語
		*same = 1;
		return base;
	}
	else {
		if (sw < 0)
			add_a = search(tango, &((*base)->mae), same);   // 左
		else
			add_a = search(tango, &((*base)->ato), same);   // 右
		return add_a;
	}
}

/************************************************************/
/* 単語の追加                                               */
/*      tango : 入力された単語                              */
/*      base : 単語が入っている構造体のアドレスへのポインタ */
/************************************************************/
void add(char *tango, struct list **base)
{
	int len;

	*base         = (struct list *)calloc(1, sizeof(struct list));

	len           = strlen(tango) + 1;
	(*base)->name = (char *)malloc(len*sizeof(char));

	strcpy((*base)->name, tango);
}

/**********************************************************/
/* 単語の出力                                             */
/*      base : 対象とする単語が入っている構造体のアドレス */
/*      dep : リストの深さ                                */
/**********************************************************/
void output(struct list *base, int dep)
{
	int i1;

	if (base != NULL) {

		for (i1 = 0; i1 < dep; i1++)
			printf("   ");

		printf("%s\n", base->name);

		dep++;
		output(base->mae, dep);
		output(base->ato, dep);
	}
}
		

菅沼ホーム 演習解答例目次 本文目次 付録 索引