#include #include #include #define CROSSING_SIZE 100 /* 交差点数=100 */ #define MAX_NAME_SIZE 50 /* 最大文字数50文字(半角) */ typedef struct { double x, y; /* 位置 x, y */ } Position; /* 位置を表す構造体 */ typedef struct { int id; /* 交差点番号 */ Position pos; /* 位置を表す構造体 */ double wait; /* 平均待ち時間 */ char jname[MAX_NAME_SIZE]; /* 日本語交差点名 */ /* 名前が二つに*/ char ename[MAX_NAME_SIZE]; /* ローマ字交差点名 */ /* なってます */ int points; /* 交差道路数 */ int next[5]; /* 隣接する交差点番号 */ } Crossing; Crossing cross[CROSSING_SIZE]; int map_read(char *filename) { /* すでに用意してありますので * int map_read(char *filename) のみ * readfile.c からコピーして下さい */ FILE *fp; int i, j; int crossing_number; /* 交差点数 */ fp = fopen(filename, "r"); if (fp == NULL) { printf("File %s is not created\n", filename); return -1; } /* はじめに交差点数を読み込む */ fscanf(fp, "%d", &crossing_number); if ((crossing_number < 1) || (crossing_number >= CROSSING_SIZE)) { printf("Illegal data number (%d)\n", crossing_number); return 0; } for (i = 0; i < crossing_number; i++) { fscanf(fp, "%d,%lf,%lf,%lf,%[^,],%[^,],%d", &(cross[i].id), &(cross[i].pos.x), &(cross[i].pos.y), &(cross[i].wait), cross[i].jname, cross[i].ename, &(cross[i].points)); for (j = 0; j < cross[i].points; j++) fscanf(fp, ",%d", &(cross[i].next[j])); } fclose(fp); /* ファイルから読み込んだ交差点数を返す */ return crossing_number; } void print_cross(int i) { /* i 番目の交差点 の表示関数 好きに改造してください*/ int j; printf("交差点番号:%2d, 座標(%5.2lf,%5.2lf), 名前: %s ( %s ),", cross[i].id, cross[i].pos.x, cross[i].pos.y, cross[i].jname,cross[i].ename); printf("\n 待ち時間:%5.1lf, 隣接交差点 :%d個 ( ", cross[i].wait, cross[i].points); /* 交差道路数だけ繰り返し */ for (j = 0; j < cross[i].points; j++) printf("%d ", cross[i].next[j]); printf(")\n\n"); } /* この辺りから入力していません */ int search_cross(int num) { /* 完全一致サーチのプログラムをこの行以降に入力して下さい */ int i; int f = -1; char input[200]; printf("交差点名を入力してください(ローマ字): "); scanf("%s", input); puts(""); for (i = 0; i < num; i++) { /* i番目の交差点名(ename)と入力したinput が一致したら: 考えてください */ // if(strcmp(cross[i].ename,input)==0) /* 一致したら*/ if(strstr(cross[i].ename, input)!=NULL) /*部分一致*/ { print_cross(i); /* 表示 */ f = i; /* 見つけた番号保持 */ } } if (f < 0) printf("%s はみつかりませんでした\n", input); return f; /* 見つかっていたら、それを、なければ -1 を返します */ } int main(void) { int crossing_number; /* 交差点数 */ /* ファイルの読み込み */ crossing_number = map_read("map2.dat"); printf("loaded %d crossings\n", crossing_number); search_cross(crossing_number); return 0; }