// 課題08 等差数列 番兵 /* #include #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と出力 } } }