プロが教える店舗&オフィスのセキュリティ対策術

配列aにはn個の整数が格納されているとする。これらの整数を小さい順に並べた時、できた数列が等差数列にになっているかどうかを確かめる関数
int arithmetic _seq(int a[], int n)
を作成せよ。
という問題が解けなくて困っています。
分かる方がいらっしゃったら、是非教えていただきたいです。

質問者からの補足コメント

  • ここまではやってみたんですが、等差数列になる数値を入力しても等差数列ではないと判定されてしまいます。

    「c言語プログラミング 等差数列になってい」の補足画像1
      補足日時:2020/05/23 23:29
  • ここまではやってみたんですが、等差数列になる数値を入力しても等差数列ではないと判定されてしまいます。

    「c言語プログラミング 等差数列になってい」の補足画像2
      補足日時:2020/05/23 23:29
  • ここまではやってみたんですが、等差数列になる数値を入力しても等差数列ではないと判定されてしまいます。

    「c言語プログラミング 等差数列になってい」の補足画像3
      補足日時:2020/05/23 23:30
  • 続きの写真です

    「c言語プログラミング 等差数列になってい」の補足画像4
      補足日時:2020/05/23 23:32
  • 今日初めてやるところで何をどうしたらいいのか見当もつきません。scanfで入力した値を配列にどのように入れれば良いのでしょうか?

      補足日時:2020/05/24 00:08
  • ご回答、ご指摘ありがとうございます。
    そのやり方でやってみようと思います。

      補足日時:2020/05/24 00:19

A 回答 (5件)

スコープに関しては


https://programming.pc-note.net/c/scope.html
の『ブロック内で同名の変数宣言』辺りを参照したうえで、main()内のa[]とnがどうなっているのか考えましょう。
等差数列については#2さんが回答しているので。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
これを参考にしてやってみます。

お礼日時:2020/05/24 00:32

訂正。

ループ中に毎回nが0に…というのはないか。

>scanfで入力した値を配列にどのように入れれば良いのでしょうか?

scanf()をコールする度に、第2引数に渡すアドレスが変わればいい。
scanf("%d", &a[n]);
辺りが妥当でしょう。
スコープに注意しないと駄目なのは変わりませんが。

あと、環境によってはint型1000個のローカル変数は駄目な場合があるので注意しましょう。
    • good
    • 0

そもそも…



int a[1000];
に対して、
scanf("%d", &a);
では配列に数値を取り込めませんが、そこらへんはどうなんですかね?
あと、scanf()に渡しているa[]と、arithmetic _seq()に渡しているa[]は別ものかと思われます。
配列の中身が不定値で、関数には0個として渡しているんじゃないかな?
main()のn=0は保持したまま、do〜whileループては別に用意したnを、毎回0にしてから+1して、ループ抜ける際に1にした内容と入力して値を捨ててますし。

arithmetic _seq()は昇順ソートして最小値とその次の値の差を返しているだけ…ですね。
nが0だった場合は、バッファオーバーランの可能性を残してます。
# 今回はmain()内の未処初期化配列a[]が十分ねサイズがあるのでバッファオーバーランはしませんが。
    • good
    • 1

こんなんで。

ソートは手抜きですので自分の使ってください。
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *p1, const void *p2)
{
    return *(int *) p1 - *(int *) p2;
}
int arithmetic_seq(int a[], int n)
{
    int i, diff;
    qsort(a, n, sizeof a[0], cmp);
    if (n < 2)
        return 0;
    for (i = 2, diff = a[1] - a[0]; i < n; i++)
        if (a[i] - a[i - 1] != diff)
            return 0;
    return 1;
}

int main()
{
    int i;
    int arr[] = { 10, 8, 2, 4, 6, 0 };
    if (arithmetic_seq(arr, sizeof arr / sizeof arr[0]))
        fputs("等差です:", stdout);
    else
        fputs("等差ではありません:", stdout);
    for (i = 0; i < sizeof arr / sizeof arr[0]; printf("%d ", arr[i++]));
    return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。助かりました!

お礼日時:2020/05/23 23:47

で、どこまでできているんです?



渡された配列を昇順に並び替えて、べつの配列に格納することはてきますか?
# というか、元の配列の内容書き換えてもいいのか不明ですが。
配列内の要素数でループを回しつつ内容の参照をすることはできますか?
ループ中に一つ前(またへ一つ後)の要素を参照する方法はわかりますか?
関数のコール元に結果を返す方法はわかりますか?# 今回の場合、int型でとう返すんですかね?等差数列なら0、非等差数列なら非0…とか???
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!