寻找随机数的最大值和最小值

Finding MAX and MIN of random numbers

我正在编写一个程序,用户在其中输入数字,程序将找到 MAX 和 MIN 以及这些数字的位置。我想给用户一个选择,让程序使用 rand().

为他填写数字

它几乎完美地工作:程序将找到 MAX 数字和位置,但是在打印 MIN 数字和位置时出现问题 -- 它总是打印数字 8 和位置 1。

问题出在哪里?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct elementposition {
    int min;
    int max;
    int positionMax;
    int positionMin;
} elementposition;

int main() {
    struct elementposition minmax;

    srand(time(NULL));
    int a[500], i;
    int c = sizeof(a) / sizeof(a[0]);
    char y;

    printf("How many numbers you want to enter: ");
    scanf("%d", &c);
    minmax.positionMax = minmax.positionMin = 0;

    printf("Want to fill with random numbers? (Y/N)");
    scanf(" %c", &y);

    if (y == 'Y' || y == 'y') {
        for (i = 0; i < c; i++) {
            a[i] = rand() % 10000 + 1;

            if (minmax.max < a[i]) {
                minmax.max = a[i];
                minmax.positionMax = i;
            }

            if (minmax.min > a[i]) {
                minmax.min = a[i];
                minmax.positionMin = i;
            }
        }

        for (i = 0; i < c; i++) {
            printf("Number #%d: %d\n", i + 1, a[i]);
        }
    } else {

        printf("------------------------------------ \n");

        printf("Enter (%d) numbers: \n", c);
        scanf("%d", &a[0]);
        minmax.max = minmax.min = a[0];

        for (i = 1; i < c; i++) {
            scanf("%d", &a[i]);

            if (minmax.max < a[i]) {
                minmax.max = a[i];
                minmax.positionMax = i;
            }

            if (minmax.min > a[i]) {
                minmax.min = a[i];
                minmax.positionMin = i;
            }
        }
    }
    printf("\nMax number is %d, number position %d. \n", minmax.max, minmax.positionMax + 1);
    printf("Min number is %d, number position %d. \n", minmax.min, minmax.positionMin + 1);

    printf("------------------------------------ \n");

    getch();
    return 0;
}

在随机情况下,您永远不会初始化 minmax.minminmax.max。该代码具有未定义的行为,因为它依赖于未初始化的值,这些值可以是任何东西,包括一些罕见架构上的陷阱值。

您应该将 input/generation 阶段与扫描阶段分开,并为此使用一个公共循环。还要检查 c 是否为正且不超过数组的长度。

这是修改后的版本:

#include <stdio.h>
#include <stdlib.h>

typedef struct elementposition {
    int min;
    int max;
    int positionMax;
    int positionMin;
} elementposition;

int main() {
    struct elementposition minmax;
    int a[500];
    int i, count, len = sizeof(a) / sizeof(a[0]);
    char y = 'y';

    printf("How many numbers you want to enter: ");
    if (scanf("%d", &count) != 1 || count < 1 || count > len) {
        printf("invalid count\n");
        return 1;
    }

    printf("Want to fill with random numbers? (Y/N)");
    scanf(" %c", &y);
    if (y == 'Y' || y == 'y') {
        srand(time(NULL));
        for (i = 0; i < count; i++) {
            a[i] = rand() % 10000 + 1;
            printf("Number #%d: %d\n", i + 1, a[i]);
        }
    } else {
        printf("Enter (%d) numbers:\n", c);
        for (i = 0; i < count; i++) {
            if (scanf("%d", &a[i]) != 1) {
                printf("invalid input\n");
                return 1;
            }
        }
    }

    minmax.positionMax = minmax.positionMin = 0;
    minmax.max = minmax.min = a[0];

    for (i = 1; i < count; i++) {
        if (minmax.max < a[i]) {
            minmax.max = a[i];
            minmax.positionMax = i;
        }
        if (minmax.min > a[i]) {
            minmax.min = a[i];
            minmax.positionMin = i;
        }
    }

    printf("------------------------------------\n");
    printf("Max number is %d, number position %d.\n", minmax.max, minmax.positionMax + 1);
    printf("Min number is %d, number position %d.\n", minmax.min, minmax.positionMin + 1);
    printf("------------------------------------\n");

    getch();
    return 0;
}

您在 初始化它们之前使用 minmax.minminmax.max 。这里找到最小值的问题可能是 minmax.min 碰巧 初始包含值 8 并且所有值都更大。

通常的方法是将最小值初始化为可能的最高值,将最大值初始化为最低值。当您使用 int 值时:

struct elementposition minmax = { INT_MAX, INT_MIN };

应该够了。