以下はいくつかの都市の都市名、年平均気温、年間降水量のCSVデータ である。これがファイル「data1.csv」に入っているものとする。
city,temprature,precitipation Sapporo,8.2,1129.6 Sendai,11.9,1204.5 Tokyo,15.6,1405.3 Kanazawa,14.1,2592.6 Oosaka,16.3,1318.0 Hiroshima,16.2,1511.8 Kouchi,16.4,2582.4 Fukuoka,16.2,1604.3 Naha,22.4,2036.8
これを読み込むのに以下のヘッダファイルにあるcsv_readを使うもの とする。
// csv.h --- csv file read/write API. struct csv { int num; char *cell[1]; }; typedef struct csv *csvp; int csv_read(char *fname, int limit, csvp arr[]); void csv_write(char *fname, int size, csvp arr[]);
テキストに掲載されている実装を一応示す。
// csv.c --- csv file read/write API impl. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include "csv.h" #define MAXLINE 1000 static char *readline(FILE *f) { char buf[MAXLINE], *str; if(fgets(buf, MAXLINE, f) == NULL) { return NULL; } int len = strlen(buf); if(buf[len-1] == '\n') { buf[--len] = '\0'; } str = (char*)malloc(len+1); strcpy(str, buf); return str; } static csvp read1(FILE *f) { char *arr[100], *s = readline(f); if(s == NULL) { return NULL; } int i = 0; arr[0] = s; for(arr[i++] = s; *s != '\0'; ++s) { if(*s == ',') { *s = '\0'; arr[i++] = s+1; } } csvp r = (csvp)malloc(sizeof(struct csv) + i*sizeof(char*)); r->num = i; for(i = 0; i < r->num; ++i) { r->cell[i] = arr[i]; } return r; } int csv_read(char *fname, int limit, csvp arr[]) { int size = 0; csvp line; FILE *f = fopen(fname, "rb"); if(f == NULL) { return -1; } while((line = read1(f)) != NULL) { if(size+1 >= limit) { size = -2; break; } arr[size++] = line; } fclose(f); return size; } void csv_write(char *fname, int size, csvp arr[]) { int i, j; FILE *f = fopen(fname, "wb"); if(f == NULL) { return; } for(i = 0; i < size; ++i) { fprintf(f, "%s", arr[i]->cell[0]); for(j = 1; j < arr[i]->num; ++j) { fprintf(f, ",%s", arr[i]->cell[j]); } fprintf(f, "\n"); } fclose(f); }
読み込んだ後、数値「年間降水量-年平均気温×80」の小さい順に 整列したいものとする。整列をおこなう関数sortを作成せよ。「size = csv_read("data1.csv", 1000, data);」で読み込んだあと 「sort(data+1, size-1);」で呼び出すことを想定している。整列アル ゴリズムは選択ソート、挿入ソート、バブルソートのいずれかとする。 下請け関数の中に配列の2要素を交換する関数swapを含める場合は下請 け関数の最初に記述すること。
コード | 選択肢 |
ア int minrange(csvp a[], int i, int j) {
イ int shiftrange(csvp a[], int i) {
ウ void sort(int *a, int n) {
エ void sort(csvp a[], int n) {
オ void swap(int *a, int i, int j) {
カ void swap(csvp a[], int i, int j) {
キ double val(csvp p) {
ク }
ケ return i;
コ return p;
サ return 100*atof(p->cell[1]) + atof(p->cell[2]);
シ return atof(p->cell[2]) - 80*atof(p->cell[1]);
ス while(!done) {
セ for( ; i > 0 && val(a[i-1]) > val(x); --i) {
ソ for(i = 0; i < n; ++i) {
タ for(i = 1; i < n; ++i) {
チ for(k = i+1; k <= j; ++k) {
ツ if(val(a[i-1]) > val(a[i])) {
テ if(val(a[k]) < val(a[p])) {
ト int i, j;
ナ int k, p;
ニ bool done = false;
ヌ csvp x = a[i];
ネ done = false;
ノ done = true;
ハ x = a[i];
ヒ x = a[k];
フ a[i] = a[i-1];
ヘ a[i] = a[j];
ホ a[i] = x;
マ a[j] = x;
ミ p = i;
ム p = k;
メ j = shiftrange(a, i);
モ swap(a, i, minrange(a, i, n-1));
ヤ swap(a, i-1, i);
|
選択肢の行をドラグして上のコード領域に配置してください。 コード領域の行はドラグにより位置が変更できます。 削除したい場合は選択肢の領域に戻してください。