たなしょのメモ

日々勉強していることをつらつらと

C++に挑戦してみよう。構造体と標準出力 2日目

学習内容

タイトルは「C++に挑戦してみよう」だが、今やっているのはC言語

C++に入る前にC言語の知識がベースとなると聞いたので(特にポインタの概念)C言語も久しぶりなこともあり、忘れている箇所も多いので復習がてらC言語からやっている。

コード

#include <math.h>
#include <stdio.h>

#define sqr(n) *1

typedef struct {
double x;
double y;
} Point;

typedef struct {
Point pt;
double fuel;
} Car;

double distance_of(Point pa, Point pb)
{
return sqrt(sqr(pa.x - pb.x) + sqr(pa.y - pb.y));
}

double distance_of2(Point pc)
{
return sqrt(sqr(pc.x) + sqr(pc.y));
}

void put_info(Car c)
{
printf("現在位置:(%.2f, %.2f)\n", c.pt.x, c.pt.y);
printf("残り燃料:%.2fリットル\n", c.fuel);
}

int move(Car *c, Point dest)
{
double d = distance_of(c->pt, dest);
if(d > c->fuel)
return 0;
c->pt = dest;
c->fuel -= d;

return 1;
}

int move2(Car *c, Point dest)
{
double d = distance_of2(dest);
if(d > c->fuel){
return 0;
}

c->pt.x += dest.x;
c->pt.y += dest.y;
c->fuel -= d;

return 1;
}

int main(void)
{
Car mycar = {{0.0, 0.0}, 90.0};
while(1){
int select, choice;
int cnt = 0;
Point dest;
put_info(mycar);
printf("移動しますか【Yes・・・1/No・・・0】:");
scanf("%d", &select);
if(select != 1) break;
do{
printf("移動方法を入力して下さい(目的地入力・・・0/移動距離入力・・・1)");
scanf("%d", &choice);
if(choice == 0){
printf("目的地のX座標:"); scanf("%lf", &dest.x);
printf("目的地のY座標:"); scanf("%lf", &dest.y);
if(!move(&mycar, dest)){
puts("\a燃料不足で移動できません。");
cnt = 1;
}
cnt = 1;
}else if(choice == 1){
printf("X方向の移動距離:"); scanf("%lf", &dest.x);
printf("Y方向の移動距離:"); scanf("%lf", &dest.y);
if(!move2(&mycar, dest)){
puts("\a燃料不足で移動できません。");
cnt = 1;
}
cnt = 1;
}else{
printf("0か1を入力して下さい。\n");
}
} while(cnt != 1);
cnt = 0;
}
return 0;
}

コードを書いてみて

構造体ほとんだ忘れてた(汗)やっといてよかった。

今回のお題は、目的地の座標を入力する場合と各座標間の移動距離を入力させる方法を選ばせて、実際燃料の減りが一緒かどうかを検証する問題。

要するに、(5.0, 3.0) → (7.5, 8.0)へ移動したいなら目的地の座標を入力する場合は(7.5, 8.0)と入力して、各座標間お距離移動の場合は(2.5, 5.0)を入力する感じ。

特に苦戦もなく。ただ自分で作ったdo~while文に引っ掛かり無限ループ見たくなってしまったのでcntというフラグを持たせてchoiceで0か1以外を選択された場合は、再入力を促すことにした。

次回はファイル処理。ではではー

*1:n) * (n