C - 获取随机生成的数字的最小值和最大值

时间:2017-08-26 14:42:02

标签: c

我的代码如下,这是我的第一个编程课程,所以期待一个可能是愚蠢的错误。

基本上我正在尝试获取它们的最小值/最大值和位置号。但是,我的max工作正常,直到生成6个数字,我似乎无法理解为什么。

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

int main(void) {
  int n, r, x, i;
  int max, min;
  int num[0];

  printf("Enter an integer");
  scanf("%d", &n);

  x = n;

printf("\n Pos | Val");
for(n=0; n<x; n++)
{
    r = ( rand()%1000 ) + 1;
    printf("\n %3d | %3d", n+1, r);
}

  max=num[0];
    i=0;

    while(i<x) // while loop determing the biggest number
    {
        if(num[i]>max)
        {
    max=num[i];
        }
        i++;
}   

  printf("\nMax : %d",max); // biggest number
  return 0;
}

5 个答案:

答案 0 :(得分:2)

实际上有几个地方需要改进代码。

首先,在代码int num[0];中声明一个大小为0的数组是无效的,所以我不确定为什么你的代码使用n最多6个。

其次,正如您可能很快就会了解到的那样,缩写在编程时非常重要,以便将来更好地理解和维护代码。此外,虽然C不是一种需要缩进的语言(并且被认为是其优势之一),许多常见语言(如Python)依赖于空格来区分函数,但需要仔细管理缩进。

第三,RAND_MAX不是1000的倍数,因此您在程序中不会获得相同的概率。还建议使用srand函数调用。

您想要的程序的可能实现(仍然很难看):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXN 1000
int main(void) {
    int n, r, i;
    int pos = 0;
    int max;
    int num[MAXN];

    printf("Enter an integer");
    scanf("%d", &n);
    srand(time(0));

    printf("\n Pos | Val");
    for (i = 0; i<n; i++)
    {
        r = (int)(((double)rand() / (RAND_MAX + 1)) * 1000) + 1;
        printf("\n %3d | %3d", i + 1, r);
        num[i] = r;
    }

    max = num[0];
    i = 0;
    for (i = 1; i < n; i++)
    {
        if (num[i] > max)
        {
            max = num[i];
            pos = i;
        }
    }

    printf("\nMax : %d | Pos : %d", max, pos); // biggest number
    //while (1);
    return 0;
}

就我的测试而言,这件作品效果很好

答案 1 :(得分:2)

正如众多答案和评论所指出的,您的主要问题是您的阵列。标准C不允许数组大小为零。 GCC会做,除非你告诉它抱怨。

然而,所有其他答案继续轻率地使用阵列。对于所述问题,根本不需要阵列。此外,问题文本提到“最小”以及“最大”,“位置”以及“价值” - 尽管显示的代码既不是最小值也不是位置。显然,如果这只是在将数据用于其他一些工作之前的初步阶段,那么您可能需要将数据保存在数组中。然后,您可以决定是使用C99(或更高版本)VLA - 可变长度数组 - 还是使用动态内存分配malloc()等,记住使用free()释放分配的空间。

这是一个简单的修订程序,不使用数组,管理最小和最大以及报告位置。它故意将值的范围更改为0..999,这样就不会有4位数字来关闭演示文稿。如果绝对必须使用1-based计数和1..1000范围内的值,您可以决定该怎么做。 (在所选位置使用+ 1是答案的一部分;决定用%3d%d替换%4d可能是答案的其余部分。

此代码使用时间作为随机数的种子值,并报告该种子值。如果该程序将被认真使用,我会让它接受可选参数,其中一个将是种子,以便可以重新创建以前的运行。我可能会接受一个关于要生成的随机值数量的参数。

代码验证输入了一个数字并验证该数字是否在1..999范围内,如果该值不可接受,则会出现写入标准错误的错误消息。请注意,错误消息会诊断出什么是有效的 - 没有什么比被告知某些内容无效更令人沮丧但不是为什么以及为了修复它而需要做什么(通常,它有助于显示程序读取的内容 - 它可能不是用户认为程序会读到的内容。)

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

int main(void)
{
    int n;
    printf("Enter number of random values to test: ");
    if (scanf("%d", &n) != 1 || n <= 0 || n >= 1000)
    {
        fprintf(stderr, "Didn't read a valid number in the range 1..999\n");
        return 1;
    }
    unsigned seed = time(0);
    srand(seed);
    printf("Seed: %u\n", seed);

    int minval = 0;
    int maxval = 0;
    int minidx = 0;
    int maxidx = 0;
    printf("\n Pos | Val\n");
    for (int i = 0; i < n; i++)
    {
        int r = (rand() % 1000);
        printf(" %3d | %3d\n", i, r);
        if (i == 0)
        {
            minval = r;
            maxval = r;
            minidx = i;
            maxidx = i;
        }
        else if (r > maxval)
        {
            maxval = r;
            maxidx = i;
        }
        else if (r < minval)
        {
            minval = r;
            minidx = i;
        }
    }

    printf("Minimum value was %3d at index %3d\n", minval, minidx);
    printf("Maximum value was %3d at index %3d\n", maxval, maxidx);

    return 0;
}

示例运行(从mnmx67编译的程序mnmx67.c):

$ mnmx67
Enter number of random values to test: 10
Seed: 1503763592

 Pos | Val
   0 | 201
   1 | 216
   2 |  85
   3 | 793
   4 | 382
   5 | 780
   6 | 341
   7 | 661
   8 |  75
   9 | 266
Minimum value was  75 at index   8
Maximum value was 793 at index   3
$

答案 2 :(得分:1)

您没有将随机数存储在num中,您还需要一些空间来存储这些数字。试试这个尺寸,我评论了我的更改

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

int main(void) {
  int n, r, x, i;
  int max, min;
  int * num;    // ++++++++ pointer to array

  printf("Enter an integer");
  scanf("%d", &n);

  x = n;
  num = malloc(x * sizeof(int));    // ++++++++++ allocate memory

printf("\n Pos | Val");
for(n=0; n<x; n++)
{
    r = ( rand()%1000 ) + 1;
    printf("\n %3d | %3d", n+1, r);
    num[n] = r;     // +++++++++  store your number
}

  max=num[0];
    i=0;

    while(i<x) // while loop determing the biggest number
    {
        if(num[i]>max)
        {
    max=num[i];
        }
        i++;
}   

  printf("\nMax : %d",max); // biggest number
  free(num);    // +++++++++ free memory

  return 0;
}

答案 3 :(得分:1)

你的第一个错误是数组的维度为零。您需要为数组设置大小。

我会通过将代码分成三个附加函数来实现:一个用于生成数字,另外两个用于查找最小值和最大值。

int *gennums(size_t n)
{
    int *nums;
    size_t i;

    if ((nums = malloc(n * sizeof (int))) != NULL) {
        for (i = 0; i < n; ++i)
            nums[i] = rand() % 1000;

        return nums;    // caller must free
    }
    return NULL;
}

int min(const int *arr, size_t n)
{
    assert(n > 0);
    int m = arr[0];
    size_t i;

    for (i = 0; i < n; ++i)
        if (arr[i] < m)
            m = arr[i];

    return m;
}

int max(const int *arr, size_t n)
{
    assert(n > 0);
    int m = arr[0];
    size_t i;

    for (i = 0; i < n; ++i)
        if (arr[i] > m)
            m = arr[i];

    return m;
}

答案 4 :(得分:0)

此处int num[0];

您不是将随机数存储在此数组中。搜索其中意义较少。

阵列的大小也应至少等于n