// 課題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と出力
}
}
}