配列を使って様々な値を求める方法(素人質問ですみません)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たろ

配列を使って様々な値を求める方法(素人質問ですみません)

#1

投稿記事 by たろ » 1年前

コード:

int main(void)
{
    int n, i, array[1000], times = 0, total = 0, max, min;

    for (i = 0; i < 1000; i++)
    {
        array[i] = 0;
    }

    for (i = 0; i < 1000; i++)
    {
        printf("数字を入力してください(0を入力するとプログラムは終了します)");
        scanf("%d", &n);
        if (n == 0)
        {
            break;
        }
        else
        {
            array[i] = n;
            times++;
        }

        if (times == 0)
        {
            max = min = n;
        }
        else
        {
            if (n > max)
            {
                max = n;
            }
            if (n < min)
            {
                min = n;
            }
        }
    }

    int newarray[times];

    for (i = 0; i < times; i++)
    {
        newarray[i] = array[i];
        total += newarray[i];
        printf("%d\n", newarray[i]);
    }
    // printf("%d\n", newarray[0]);
    printf("平均は %fです\n", (double) total / times);
    printf("最大値は%dです\n", max);
    printf("最小値は%dです\n", min);
}
0 が入力されるまで整数を配列に読み込み,0 が入力されたら,(最後の 0 を除いた)入力の最大値,最小値,平均値,中央値を出力するプログラムを作りたいのですが、現在のプログラムでは最大値にゴミ値が入ってしまいます。
またそもそもこのプログラムでは配列を使う意味があまりないような気がしているのですが、配列をつかったより良いプログラムがありましたら、ご教示いただきたいです。

素人質問で申し訳ございませんが、お教えいただけますと幸いです。
宜しくお願いいたします。

box
記事: 2002
登録日時: 13年前

Re: 配列を使って様々な値を求める方法(素人質問ですみません)

#2

投稿記事 by box » 1年前

コード:

        if (times == 0)
        {
            max = min = n;
        }
初回入力時に、入力値を仮の最大値・最小値にするという発想自体は
ええと思うんやけど、いかんせん書く場所がちょっと違うてるみたいやね。

それから、中央値を求める際はデータがソートされてなあかんのやけど、
配列を使わんと中央値を求める方法(変にこねくり回さない)があるんやったらこっちが知りたいくらい。
つまりやね、配列を使うことで変なロジックを使わんでも
いろんな値が求められるんやったら、それでええんとちゃう?ってこと。
配列を使うことで楽できるんやったら、それがいちばんええやろ?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 配列を使って様々な値を求める方法(素人質問ですみません)

#3

投稿記事 by box » 1年前

1000個も値を入力させる可能性があるのはあまり現実的とは思えないのと
main()に何でもかんでもやらせるのはあまりよろしくない(main()は全体の司令塔、
必要な処理は下請け関数に任せる)のとから、こんなサンプルを用意してみました。
関数分けが適切かどうかはよくわからないので、加工はお任せします。

コード:

#include <stdio.h>

#define N (30)      // データの最大個数

void inputData(int *a, int *c, int *t)
{
    int n;

    while (1) {
        printf("数字を入力(0で終了)");
        scanf("%d", &n);
        if (n == 0 || *c >= N) break;
        a[(*c)++] = n, *t += n;
    }
}

void sortData(int *a, int c)
{
    int i, j;

    for (i = 0; i < c - 1; i++) {
        for (j = i; j < c; j++) {
            if (a[i] > a[j]) {
                int t = a[i];

                a[i] = a[j], a[j] = t;
            }
        }
    }
}

void printMaxMin(int *a, int c)
{
    printf("最大値は%d\n", a[c-1]);
    printf("最小値は%d\n", a[0]);
}

void printAverage(int t, int c)
{
    printf("平均値は%f\n", (double) t / c);
}

void printMedian(int *a, int c)
{
    if (c % 2 == 1) {
        printf("中央値は%d\n", a[c/2]);
    }
    else {
        printf("中央値は%f\n", (a[c/2-1] + a[c/2]) / 2.);
    }
}

int main(void)
{
    int array[N] = { 0 }, count = 0, total = 0;

    inputData(array, &count, &total);
    sortData(array, count);
    printMaxMin(array, count);
    printAverage(total, count);
    printMedian(array, count);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 配列を使って様々な値を求める方法(素人質問ですみません)

#4

投稿記事 by box » 1年前

ちょっとだけ手直ししました。ご自由にどうぞ。

コード:

#include <stdio.h>

#define N (30)      // データの最大個数

void inputData(int *a, int *c, int *t)
{
    int n;

    while (1) {
        printf("数字を入力(0で終了)");
        scanf("%d", &n);
        if (n == 0 || *c >= N) break;
        a[(*c)++] = n, *t += n;
    }
}

void sortData(int *a, int c)
{
    int i, j;

    for (i = 0; i < c - 1; i++) {
        for (j = i; j < c; j++) {
            if (a[i] > a[j]) {
                int t = a[i];

                a[i] = a[j], a[j] = t;
            }
        }
    }
}

void printMaxMin(int *a, int c)
{
    printf("最大値は%d\n", a[c-1]);
    printf("最小値は%d\n", a[0]);
}

void printAverage(int t, int c)
{
    printf("平均値は%f\n", (double) t / c);
}

void printMedian(int *a, int c)
{
    if (c % 2 == 1) {
        printf("中央値は%d\n", a[c/2]);
    }
    else {
        printf("中央値は%f\n", (a[c/2-1] + a[c/2]) / 2.);
    }
}

int main(void)
{
    int array[N] = { 0 }, count = 0, total = 0;

    inputData(array, &count, &total);
    sortData(array, count);
    printMaxMin(array, count);
    printAverage(total, count);
    printMedian(array, count);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列を使って様々な値を求める方法(素人質問ですみません)

#5

投稿記事 by みけCAT » 1年前

box さんが書きました:
1年前
ちょっとだけ手直ししました。
貼ってあるコードは同じに見えます。
scanfの戻り値を無視している (値を読めたかを確認していない) のはあまり良くなさそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 配列を使って様々な値を求める方法(素人質問ですみません)

#6

投稿記事 by box » 1年前

ちゃんと動くよう、適切に手直ししてください。>質問者さん

コード:

#include <stdio.h>

#define N (30)      // データの最大個数

void inputData(int *a, int *c, int *t)
{
    int n, x;

    while (1) {
        printf("数字を入力(0で終了)");
        do {
            x = scanf("%d", &n);
        } while (x != 1);
        if (n == 0 || *c >= N) break;
        a[(*c)++] = n, *t += n;
    }
}

void sortData(int *a, int c)
{
    int i, j;

    for (i = 0; i < c - 1; i++) {
        for (j = i; j < c; j++) {
            if (a[i] > a[j]) {
                int t = a[i];

                a[i] = a[j], a[j] = t;
            }
        }
    }
}

void printMaxMin(int *a, int c)
{
    printf("最大値は%d\n", a[c - 1]);
    printf("最小値は%d\n", a[0]);
}

void printAverage(int t, int c)
{
    printf("平均値は%f\n", (double) t / c);
}

void printMedian(int *a, int c)
{
    if (c % 2 == 1) {
        printf("中央値は%d\n", a[c/2]);
    }
    else {
        printf("中央値は%f\n", (a[c/2 - 1] + a[c/2]) / 2.);
    }
}

int main(void)
{
    int array[N] = { 0 }, count = 0, total = 0;

    inputData(array, &count, &total);
    if (count == 0){
        fprintf(stderr, "データ数が0のため、処理を中断します。\n");
    }
    else {
        sortData(array, count);
        printMaxMin(array, count);
        printAverage(total, count);
        printMedian(array, count);
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 配列を使って様々な値を求める方法(素人質問ですみません)

#7

投稿記事 by box » 1年前

こんな時間に酒かっくらっていいかげんなコードしか
アップできなくてすまそ。
もう思考能力ゼロ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る