『新・明解C言語 入門編 第2版』演習問題解答例 12ー5

演習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でなにをしているか、移動距離をどこで加算するか、に注目すれば難しくないです。

 


書籍情報


『新・明解C言語 入門編 第2版』演習問題解答例 12ー4

演習12ー4

問: List12-7を次のように書きかえたプログラムを作成せよ。

・名前と身長などのデータは、初期化子として与えるのではなく、キーボードから読み込む。
・身長の昇順にソートするのか、名前の昇順でソートするのかを選べるようにする。

// Ex1204.c

#include <stdio.h>
#include <string.h>

#define    NUMBER 3
#define NAME_LEN 64

//学生を表す構造体
typedef struct {
    char    name[NAME_LEN];
    int     height;
    double  weight;
} Student;

//xおよびyが指す学生を交換
void swap_Student(Student* x, Student* y)
{
    Student temp = *x;
    *x = *y;
    *y = temp;
}

// 学生の配列aの先頭n個の要素を名前の昇順にソート
void sort_by_name(Student a[], int n)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = n - 1; j > i; j--) {
            if (strcmp(a[j - 1].name, a[j].name) > 0)
                swap_Student(&a[j - 1], &a[j]);
        }
    }
}

// 学生の配列aの先頭n個の要素を身長の昇順にソート
void sort_by_height(Student a[], int n)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = n - 1; j > i; j--) {
            if (a[j - 1].height > a[j].height)
                swap_Student(&a[j - 1], &a[j]);
        }
    }
}


void scan_student(Student *std, int n)
{
    for (int i = 0; i < NUMBER; i++) {
        printf("%d人目\n", i + 1);
        printf("氏名:");  scanf("%s", std[i].name);
        printf("身長:");  scanf("%d", &std[i].height);
        printf("体重:");  scanf("%lf", &std[i].weight);
    }
}

int main(void)
{
    int no;
    Student std[NUMBER];

    printf("%d名分の名前・身長・体重を入力せよ。\n", NUMBER);
    
    scan_student(std, NUMBER);

    printf("ソートの基準を選んでください。【身長順・・・1/名前順・・・2】");
    scanf("%d", &no);
    
    if (no == 1) {
        sort_by_height(std, NUMBER);
    } else if (no == 2) {
        sort_by_name(std, NUMBER);
    }

    if (no == 1) {
        puts("\n身長順にソートしました。");
        for (int i = 0; i < NUMBER; i++)
            printf("%-8s %6d%6.1f\n", std[i].name, std[i].height, std[i].weight);
    } else if (no == 2) {
        puts("\n名前順にソートしました。");
        for (int i = 0; i < NUMBER; i++)
            printf("%-8s %6d%6.1f\n", std[i].name, std[i].height, std[i].weight);
    }

    return 0;
}

コメント

 特になし。

 


書籍情報


『新・明解C言語 入門編 第2版』演習問題解答例 12ー3

演習12ー3

問: 名前と身長と体重を読み込んで、その値をメンバとしてもつStudent型の値を返却する関数を作成せよ。

 Student scan_Student(void)

// Ex1203.c

#include <stdio.h>
#include <string.h>

#define    NUMBER 1
#define NAME_LEN 64

typedef struct {
    char    name[NAME_LEN];
    int     height;
    double  weight;
} Student;

Student scan_Student(void)
{
    
    Student type;
    
    printf("氏名:");  scanf("%s",  type.name);
    printf("身長:");  scanf("%d",  &type.height);
    printf("体重:");  scanf("%lf", &type.weight);
    
    return type;
}

int main(void)
{
    Student std = { 0 };

    printf("%d名分の名前・身長・体重を入力せよ。\n", NUMBER);

    std = scan_Student();

    printf("氏名:%s\n",   std.name);
    printf("身長:%d\n",   std.height);
    printf("体重:%.1f\n", std.weight);
    
    return 0;
}

コメント

 特になし。

 


書籍情報



Copyright (C) 2016 "HYOGOKURUMI" All Rights Reserved./「来未炳吾・平極ルミ・HYOGOKURUMI」の発達障害考察を主とした全ての発信は、相互不干渉など特別な約束をした者達を除き、どなたでもご活用できます。ただし著作権は放棄しておりません。あしからずご了承ください。詳細は著作権に関するガイドラインをご一読ください。/「HYOGOKURUMI.site」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。