prg-lang-2 / week12 / Exer08.java
Exer08.java
Raw
// 課題08 等差数列 番兵
/*
#include <stdio.h>

#define DATA_LIM 100
#define SENTINEL -1

等差数列か判定する関数
引数は,判定する数列の入った配列の先頭アドレス
戻り値は,等差数列なら 1,そうでなければ, 0
int isTousa(double *pSuuretsu) {
    int kekka = 1;
    int i;
    for(i=0; *(pSuuretsu+i+2) != SENTINEL; i++) {
        if(*(pSuuretsu+i+1)-*(pSuuretsu+i) != *(pSuuretsu+i+2)-*(pSuuretsu+i+1)) {
            kekka = 0;
            break;
        }
    }
    return kekka;
}


int main(void) {
    double data[DATA_LIM] = { 1.0, 3.0, 5.0, 7.0, 9.0, 11.5, 13.0, 15.0, SENTINEL };
    int flag;       // 1 であれば等差数列

    flag = isTousa(data);

    if (flag) {
        printf("OK\n"); //等差数列であればOKと出力
    } else {
        printf("NG\n"); //等差数列でなければNGと出力
    }

    return 0;
}
*/

public class Exer08 {
    public static final int DATA_LIM = 100;
    public static final int SENTINEL = -1;

    // 1 か 0 しかとらないint型の変数をbooelan型に変換
    public static boolean isTousa(double[] data) {
        boolean kekka = true;
        // 初期化式のところでループ用の変数を宣言できる.(昔のCはこれができなかった.今はCでもできる)
        for (int i = 0; data[i + 2] != SENTINEL; i++) {
            if (data[i + 1] - data[i] != data[i + 2] - data[i + 1]) {
                kekka = false;
                break;
            }
        }
        return kekka;
    }

    public static void main(String[] args) {
        // あえて,これまでとは別の配列初期化方法を記載する.
        // 要素を指定の値で初期化せずに配列を用意する場合はnewという演算しを使い new 型[要素数] のように初期化する.
        double[] data = new double[DATA_LIM];
        data[0] = 1.0;
        data[1] = 3.0;
        data[2] = 5.0;
        data[3] = 7.0;
        data[4] = 9.0;
        data[5] = 11.5;
        data[6] = 13.0;
        data[7] = 15.0;
        data[8] = SENTINEL;
        boolean flag; // true であれば等差数列

        flag = isTousa(data);

        if (flag) {
            System.out.printf("OK\n"); // 等差数列であればOKと出力
        } else {
            System.out.printf("NG\n"); // 等差数列でなければNGと出力
        }
    }
}