構造体を使用したプログラミング1:交差点データのキーボード入力

目次

  1. 課題1
  2. 課題1の答え

1. 課題

 各交差点の交差点番号,交差点名,位置(x,y),平均待ち時間,交差道路数,隣接する
交差点番号を読みとりデータを構造体へ格納するプログラムを作成して下さい。
 下記にサンプルを示します.
 テキストのプログラムでは入力する交差点数を5と固定していますが、これを入力時に変更
できるようにすると便利ですね。



2. 課題の回答例

これは未完成のプログラムですので、必要な箇所を追記してプログラムを完成させてください。

/* Crossing2.c --- 構造体の格納と表示 */
#include <stdio.h>
#include <string.h>

#define CrossingNumber  5  /* 交差点数=5 */
#define MaxName        50  /* 最大文字数50文字(半角) */

typedef struct {
	double x, y;           /* 位置 x, y */
} Position;                /* 位置を表す構造体 */

typedef struct {
	int id;                /* 交差点番号 */
	Position pos;          /* 位置を表す構造体 */
	double wait;           /* 平均待ち時間 */
	char name[MaxName];    /* 交差点名 */
	int points;            /* 交差道路数 */
	int next[5];           /* 隣接する交差点番号 */
} Crossing;


Crossing cross[CrossingNumber];

int main(void)
{
	int i,j;
	int crossing_number=0;                         /* 入力した交差点情報の数 */
	char YesNo[16];                                /* 入力継続の問い合わせに使用 */

	for (i = 0; i < CrossingNumber; i++) {         /* データの入力 */
    

	/* 構造体crossへデータを代入するプログラムを記入しなさい */

		crossing_number++;                         /* 交差点数を1増やす */

		printf("交差点番号=");
		scanf("%d", &(cross[i].id));               /* 交差点番号の入力 */
		printf("名前=");
		scanf("%s", cross[i].name);                /* 交差点名の入力 */
		printf("x座標=");
		scanf("%lf", &(cross[i].pos.x));           /* x座標の入力 */
		printf("y座標=");
		scanf("%lf", &(cross[i].pos.y));           /* y座標の入力 */
		printf("待ち時間=");
		scanf("%lf", &(cross[i].wait));            /* 待ち時間の入力 */
		printf("交差道路数=");
		scanf("%d", &(cross[i].points));           /* 交差道路数の入力 */

		/* 交差道路数だけ繰り返し */
		for (j = 0; j < cross[i].points; j++) {
			printf("隣接交差点番号(No.%d)=", j);
			scanf("%d", &(cross[i].next[j]));      /* 隣接交差点番号の入力 */
		}

	/* 判定文 */
		printf("次のデータを入力しますか?(Yes:\"y\")>");
		scanf("%s", YesNo);
		if (strcmp(YesNo, "y") != 0) break;        /* 入力文字が"y"以外ならループを抜ける */ 

	}

	for (i = 0; i < crossing_number; i++) {       /* データの表示 */
		printf("配列[%d] 番号(%d), x(%lf), y(%lf), 名(%s), 待ち(%lf)\n",
			i, cross[i].id, cross[i].pos.x, cross[i].pos.y,
			cross[i].name, cross[i].wait);

		printf("\t交差道路数(%d)\t", cross[i].points);

		for(j=0; j<cross[i].points; j++){         /* 交差道路数だけ繰り返し */
			  printf("No.%d(%d) ", j, cross[i].next[j]);
		}

		puts("");                                /* 改行 */
	}

	return 0;
}

    解説
	1. 変数 crossing_number (交差点数)を新たに設け、交差点の入力がある毎に+1している。
           交差点情報表示の時には、crossing_number で与えられる数だけループさせている。

	2. 1つの交差点情報の入力が終ると、次の交差点を入力するか尋ねてくる。
           ここで y を入れると継続、それ以外は入力終了となる。 

	3. 隣接交差点IDは(直前に入力した)交差道路数だけ入力させている。

 
戻る