2018年5月26日土曜日

C - 小さなツールの作成 - 1つのことだけをうまくやる(if文、return文、エラー状態)

Head First C ―頭とからだで覚えるCの基本 (David Griffiths (著)、Dawn Griffiths (著)、中田 秀基 (監修)、木下 哲也 (翻訳)、オライリージャパン)の3章(小さなツールの作成 - 1つのことだけをうまくやる)、エクササイズ(p. 115)を取り組んでみる。

エクササイズ(p. 115)

Makefile

```CC = cc

all: sample run

sample: sample.c
\$(CC) sample.c -o sample

run: sample gpsdata.csv
./sample < gpsdata.csv
```

コード

```#include <stdbool.h>
#include <stdio.h>

int main() {
float latitude;
float longitude;
char info[80];
int started = false;

puts("data=[");
while (scanf("%f,%f,%79[^\n]", &latitude, &longitude, info) == 3) {
if (started) {
puts(",");
} else {
started = true;
}
if (latitude < -90 || 90 < latitude) {
printf("Invalid latitude: %f\n", latitude);
return 2;
}
if (longitude < -180 || 180 < longitude) {
printf("Inavlid longitude: %f\n", longitude);
return 2;
}
printf("{latitude: %f, longitude: %f, info: %s}", latitude, longitude,
info);
}
puts("\n]");
}
```

```\$ make
cc sample.c -o sample
./sample < gpsdata.csv
data=[
{latitude: 42.363400, longitude: -71.098465, info: Speed = 21},
{latitude: 42.363327, longitude: -71.097588, info: Speed = 23},
{latitude: 42.363255, longitude: -71.096710, info: Speed = 17},
{latitude: 42.363182, longitude: -71.095833, info: Speed = 22},
{latitude: 42.363110, longitude: -71.094955, info: Speed = 14},
{latitude: 42.363037, longitude: -71.094078, info: Speed = 16},
{latitude: 42.362965, longitude: -71.093201, info: Speed = 18},
{latitude: 42.362892, longitude: -71.092323, info: Speed = 22},
{latitude: 42.362820, longitude: -71.091446, info: Speed = 17},
{latitude: 42.362747, longitude: -71.090569, info: Speed = 23},
{latitude: 42.362675, longitude: -71.089691, info: Speed = 14},
{latitude: 42.362602, longitude: -71.088814, info: Speed = 19},
{latitude: 42.362530, longitude: -71.087936, info: Speed = 16},
{latitude: 42.362457, longitude: -71.087059, info: Speed = 16},
{latitude: 42.362385, longitude: -71.086182, info: Speed = 21}
]
\$ echo \$?
0
\$ ./sample  < gpsdata1.csv
data=[
{latitude: 42.363400, longitude: -71.098465, info: Speed = 21},
{latitude: 42.363327, longitude: -71.097588, info: Speed = 23},
{latitude: 42.363255, longitude: -71.096710, info: Speed = 17},
{latitude: 42.363182, longitude: -71.095833, info: Speed = 22},
{latitude: 42.363110, longitude: -71.094955, info: Speed = 14},
{latitude: 42.363037, longitude: -71.094078, info: Speed = 16},
{latitude: 42.362965, longitude: -71.093201, info: Speed = 18},
{latitude: 42.362892, longitude: -71.092323, info: Speed = 22},
Invalid latitude: -90.362823
\$ echo \$?
2
\$ ./sample  < gpsdata2.csv
data=[
{latitude: 42.363400, longitude: -71.098465, info: Speed = 21},
{latitude: 42.363327, longitude: -71.097588, info: Speed = 23},
{latitude: 42.363255, longitude: -71.096710, info: Speed = 17},
{latitude: 42.363182, longitude: -71.095833, info: Speed = 22},
{latitude: 42.363110, longitude: -71.094955, info: Speed = 14},
{latitude: 42.363037, longitude: -71.094078, info: Speed = 16},
Inavlid longitude: -180.093201
\$ echo \$?
2
\$
```