【问题标题】:Finding MAX and MIN of random numbers查找随机数的 MAX 和 MIN
【发布时间】:2021-12-14 11:53:39
【问题描述】:

我正在编写一个程序,用户输入数字,程序将找到 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.positionMaxminmax.positionMin。但是你在哪里初始化minmax.maxminmax.min?我建议你在定义minmax 时这样做,如struct elementposition minmax = { 0, 0, 0, 0 };
  • 如果只需要最小值和最大值,则不需要全部存储。

标签: arrays c random struct


【解决方案1】:

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

您应该将输入/生成阶段与扫描阶段分开,并为此使用一个公共循环。还要检查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;
}

【讨论】:

  • 感谢您的帮助! :)
【解决方案2】:

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

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

struct elementposition minmax = { INT_MAX, INT_MIN };

应该够了。

【讨论】:

  • 谢谢!它现在正在工作! :)
猜你喜欢
  • 2016-11-02
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2015-06-05
  • 2021-01-23
相关资源
最近更新 更多