ここから本文です

#include <stdio.h>

gbj********さん

2020/6/2119:58:02

#include <stdio.h>

#define DATA_LIM 100
#define SENTINEL -1

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

/* ここに判定処理 */

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") ;
} else {
printf("NG\n") ;
} ;

return 0 ;
}
一つ前の質問の番兵版です。
こちらも教えてください。

閲覧数:
16
回答数:
2

違反報告

回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

Hermitさん

2020/6/2122:33:28

適当になチェックしかしてないから、違ってたらごめんね。

#include <stdio.h>
#define DATA_LIM 100
#define SENTINEL -1
int isTousa(double *pSuuretsu)
{
    if (pSuuretsu[0] == SENTINEL || pSuuretsu[1] == SENTINEL)
        return 0;
    {
        const double d = pSuuretsu[1] - pSuuretsu[0];   // 公差
        for (pSuuretsu += 2; pSuuretsu[0] != SENTINEL; pSuuretsu++) {
            double tmp = pSuuretsu[-1] + d - pSuuretsu[0];
            if ((tmp < 0.0 ? -tmp : tmp) >
                (pSuuretsu[0] < 0.0 ?
                 pSuuretsu[0] * -0.000001 : pSuuretsu[0] * 0.000001))
                return 0;
        }
    }
    return 1;
}
int main(void)
{
    double data[DATA_LIM] =
        { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, SENTINEL };
    int flag;
    flag = isTousa(data);
    if (flag) {
        printf("Ok\n");
    } else {
        printf("NG\n");
    }
    return 0;
}

mu54491102さん

2020/6/2121:40:54

数学は苦手なんで合ってるか分かりません。

isTousa()関数を以下のように書きました。

int isTousa(double *pSuuretsu) {
int kekka = 1;
int diff , i = 1;
diff = pSuuretsu[i] - pSuuretsu[0];
while( pSuuretsu[i] != SENTINEL){
if((pSuuretsu[i] - pSuuretsu[i-1]) != diff) kekka = 0;
++i;
}
return kekka;
}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

本文はここまでです