演習12ー5
問: List12-9を書きかえて、移動目的地の座標を入力させる方法と、X方向とY方向の移動距離を入力させる方法の両方から選択できるように変更したプログラムを作成せよ。
例:現在地が{5.0, 3.0}で、{7.5, 8.9}に移動したいとする。座標入力時には7.5、8.9と入力させて、移動距離入力時には2.5と5.9を入力させる。
// Ex1205.c
#include <stdio.h>
#include <math.h>
#define sqr(n) ((n) * (n))
// 点の座標をあらわす構造体
typedef struct {
double x; //X座標
double y; //Y座標
} Point;
//自動車をあらわす構造体
typedef struct {
Point pt; //現在位置
double fuel; //残り燃料
} Car;
//点p1と点p2の距離を返す
double distance_of(Point p1, Point p2)
{
return sqrt(sqr(p1.x - p2.x) + sqr(p1.y - p2.y));
}
//自動車の現在位置と残り燃料を表示
void put_info(Car c)
{
printf("現在位置:(%.2f, %.2f)\n", c.pt.x, c.pt.y);
printf("残り燃料:%.2fリットル\n", c.fuel);
}
//cの指す車を目的座標destに移動
int move1(Car *c, Point dest, int n)
{
double d = distance_of(c->pt, dest); //移動距離
if (d > c->fuel) //移動距離が燃料を超過
return 0; //移動不可
c->pt = dest; //現在位置を更新(destに移動)
c->fuel -= d;
return 1; //移動成功
}
int main(void)
{
Car mycar = {{0.0, 0.0 }, 90.0};
while (1) {
int select;
int no;
Point dest; //目的地の座標
put_info(mycar); //現在地と残り燃料を表示
printf("移動しますか?【Yes...1/No...0】:");
scanf("%d", &select);
if (select != 1) break;
printf("目的地の座標を入力する・・・1/移動距離を入力する・・・2\n");
scanf("%d", &no);
if (no == 1) {
printf("目的地のX座標:"); scanf("%lf", &dest.x);
printf("目的地のY座標:"); scanf("%lf", &dest.y);
} else if (no == 2) {
printf("移動距離X:"); scanf("%lf", &dest.x);
printf("移動距離Y:"); scanf("%lf", &dest.y);
dest.x += mycar.pt.x;
dest.y += mycar.pt.y;
}
if (!move1(&mycar, dest, no))
puts("\a燃料不足で移動できません。");
}
return 0;
}
コメント
distance_ofでなにをしているか、移動距離をどこで加算するか、に注目すれば難しくないです。
書籍情報
コメント