从C中的数组中查找最大值和最小值

时间:2016-06-18 02:22:03

标签: c arrays loops

该程序的目的是在一维数组中读取10个双精度值,然后在标准输出上搜索并打印出数组中的最大值和最小值。我尝试在纸上做一些伪代码,以帮助我更好地理解这个问题,到目前为止,我认为可行的是使用if语句检查最小值和最大值的函数。由于我在C中缺乏知识,我不确定使用数组函数的正确格式。如果你能给我一个关于函数应该如何使用数组的框架,这将是很好的,因为我想学习和尝试该程序。
下面我已经附加了循环10次的主程序并将用户输入收集为数组:

#include<stdio.h>

// main program 
int main() {
    int i;
    double num[10];
    for (i = 1; i <= 10; i++) {
        printf("Enter a number: ");
        scanf("%lf",&num);
    }
    return 0;
}

8 个答案:

答案 0 :(得分:2)

scanf("%lf",&num);将调用未定义的行为,因为double(*)[10]会在预期double*的位置传递。

如果要使用数组,则应该读取每个元素。请注意,C中的数组索引从0开始,而不是1.您还应检查读取是否成功。

#include<stdio.h>

// main program 
int main(void){
    int i;
    double num[10];
    for (i=1;i<=10;i++){
        printf("Enter a number: ");
        if (scanf("%lf",&num[i - 1]) != 1){
            puts("read error");
            return 1;
        }
    }
    // calculate max and minimum values and print them
    return 0;
}

或此代码使用i范围内更好的内容。

#include<stdio.h>

// main program 
int main(void){
    int i;
    double num[10];
    for (i=0;i<10;i++){
        printf("Enter a number: ");
        if (scanf("%lf",&num[i]) != 1){
            puts("read error");
            return 1;
        }
    }
    // calculate max and minimum values and print them
    return 0;
}

答案 1 :(得分:2)

如果除了其他答案之外,您打算编写/调用函数以查找 max min 值你的双打数组,你的第一个挑战是克服只有一个单值(或指针)可以由C中的函数返回的公理。有几个选项可用于确定 max <函数(或函数)中的/ em>和 min

第一个也是显而易见的替代方案是同时编写 max min 函数并调用每个函数。 (但这需要迭代你的数组两次 - 这将不是最佳的)。您的下一个选项是传递一个单独的数组(至少有2个双精度值)来存储您的 max min 值,并更新值或返回指向该值的指针数组

(传递数组会自动使存储在 maxmin 数组中的值可用于您的调用函数(在您的情况下为main()),但要立即使用同一调用中的值,为方便起见,您可以返回指向 max / min 数组的指针。您还可以在出错时返回NULL以指示失败)

或者,由于只需要2个值,您可以将单个指针传递给 max min 作为参数,并更新函数中每个指向的值。选择一些返回类型来指示成功/失败也是一个好主意。在这种情况下,int与其他任何一种一样有效(从数字转换的角度来看更好)

考虑到这一点,一个简单的 maxmin 函数获取指向double值数组的指针,指向每个 max min 的指针,最后数组中的值的数量可以写成:

/** find the max and min in array of 'n' doubles `ad`.
 *  update 'max' and 'min' pointers so values are available back
 *  in calling function.
 */
int maxmin_dbl (double *ad, double *max, double *min, size_t n)
{
    if (!ad || !max || !min) return 0;  /* validate parameters */

    *max = (double)LLONG_MIN;   /* initialize max/min to sufficiently */
    *min = (double)LLONG_MAX;   /* large negative/positive values.    */

    size_t i;
    for (i = 0; i < n; i++) {
        if (ad[i] > *max) *max = ad[i];  /* test for new max */
        if (ad[i] < *min) *min = ad[i];  /* test for new min */
    }

    return 1;
}

注意:如果您的数据值超出LLONG_MINLLONG_MAX的范围,则需要相应地调整初始值。)

一个简短的示例程序,从作为第一个参数(或默认情况下来自stdin)的文件名中读取值,并写入数组值和最大最小值 stdout可以写成:

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

enum { MAXD = 10 };  /* constant for no. of values */

int maxmin_dbl (double *ad, double *max, double *min, size_t n);

int main (int argc, char **argv) {

    size_t i, n;
    double max, min, tmp, ad[MAXD] = {0.0};
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* read double values from fp until at most 10 values read */
    for (n = 0; n < MAXD && fscanf (fp, " %lf", &tmp) == 1; n++)
        ad[n] = tmp;

    if (fp != stdin) fclose (fp);     /* close file if not stdin */

    printf ("\narray values:\n\n");   /* output the values read  */
    for (i = 0; i < n; i++)
        printf ("  ad[%2zu] : %13.2lf\n", i, ad[i]);

    if (maxmin_dbl (ad, &max, &min, n))  /* get max/min from array */
        printf ("\n maximum : %.2lf\n minimum : %.2lf\n\n", max, min);
    else {
        fprintf (stderr, "error: maxmin_dbl failed.\n");
        return 1;
    }

    return 0;
}

/** find the max and min in array of 'n' doubles `ad`.
 *  update 'max' and 'min' pointers so values are available back
 *  in calling function.
 */
int maxmin_dbl (double *ad, double *max, double *min, size_t n)
{
    if (!ad || !max || !min) return 0;  /* validate parameters */

    *max = (double)LLONG_MIN;   /* initialize max/min to sufficiently */
    *min = (double)LLONG_MAX;   /* large negative/positive values.    */

    size_t i;
    for (i = 0; i < n; i++) {
        if (ad[i] > *max) *max = ad[i];  /* test for new max */
        if (ad[i] < *min) *min = ad[i];  /* test for new min */
    }

    return 1;
}

示例使用/输出

$ ./bin/arrdbl_maxmin <../dat/10int_nl.txt

array values:

  ad[ 0] :       8572.00
  ad[ 1] :      -2213.00
  ad[ 2] :       6434.00
  ad[ 3] :      16330.00
  ad[ 4] :       3034.00
  ad[ 5] :      12346.00
  ad[ 6] :       4855.00
  ad[ 7] :      16985.00
  ad[ 8] :      11250.00
  ad[ 9] :       1495.00

 maximum : 16985.00
 minimum : -2213.00

查看所有答案,即直接解决错误的答案,如果您有任何其他问题,请告诉我们。

答案 2 :(得分:1)

如果您询问函数应该如何工作,请尝试理解这个伪代码:

您的功能可以这样定义:

double max(double arr[], int size) {
    // have a variable that stores the current max number
    double currmax = -1;
    // loop over arr and for each element,
      // compare if it's greater than the current max number
      // if it is, replace the current max number to this element's value
    // after you've gone through all the elements in arr, return the current max number
    return currmax;
}

您可以像这样调用您的函数:

double the_biggest_number_ever = max(arr, 10);

你必须传递数组大小的原因是因为没有它,函数max将不知道你的数组中有多少元素。您可以使用它来遍历max函数中的元素。

答案 3 :(得分:0)

MikeCAT关于数组索引的东西是正确的。您希望在每个索引处读入num

此外,关于拥有一个带数组的函数,签名将是double arr[],其中arr是参数的名称。请注意,C数组不会存储大小,因此您经常需要将其与数组一起传递:

double max(double arr[], int size) { ... }

int main(int argc, char **argv) {
  double arr[10];
  /* ...  fill arr ... */
  double maximum = max(arr, 10);
  /* ... */
  return 0;
}

答案 4 :(得分:0)

#include <stdio.h>

int main()
{
  int array[100], maximum, size, c, location = 1;

  printf("Enter the number of elements in array\n");
  scanf("%d", &size);

  printf("Enter %d integers\n", size);

  for (c = 0; c < size; c++)
    scanf("%d", &array[c]);

  maximum = array[0];

  for (c = 1; c < size; c++)
  {
    if (array[c] > maximum)
    {
       maximum  = array[c];
       location = c+1;
    }
  }

  printf("Maximum element is present at location %d and it's value is %d.\n", location, maximum);
  return 0;
}

在这里,您可以制作数组长度并获取最高编号的位置

答案 5 :(得分:0)

感谢所有人提供的所有信息,我设法在不使用功能的情况下回答了这个问题。这是我的代码:

#include <stdio.h>

// main program 
int main(void){
    int i;
    double num[10],max,min;
    for (i=0;i<10;i++){
        printf("Enter a number: ");
        if (scanf("%lf",&num[i]) != 1){
            puts("invalid input");
            return 1;
        }
    }
    // calculate max and minimum values and print them
    min=num[0];
    max=num[0];
    for(int i=1;i<10;i++)
    {
        if(min>num[i])
        {
            min=num[i];
        }
        else if(max<num[i])
        {
            max =num[i];
        }
    }
    printf("The max is %lf and the min is %lf",max,min);
    return 0;
}

答案 6 :(得分:0)

最好的方法是按升序或降序对包含元素的数组进行排序,并将show first和last值作为最小值和最大值。

for(int i=0;i<n;i++)
{
   for(int j=i+1;j<n;j++)
     {
       if(data[i]<data[j])
        {
          double temp;
          temp=data[i];
          data[i]=data[j];
          data[j]=temp;
        }
     }
}

答案 7 :(得分:0)

未来考虑的迂腐说明:许多系统允许double可以采用not-a-number 。在这种情况下,如果a > bNaN,则NaN将为false。通常,在查找包含NaN的列表的最小值/最大值时,将忽略这些值。由于第一个数字可能是not <=,因此最多使用>代替#include <math.h> #include <stdio.h> #define N 10 int main(void) { size_t i; double num[N]; for (i = 0; i < N; i++) { printf("Enter a number: "); if (scanf("%lf",&num[i]) != 1) return -1; } double maximum = num[0]; double minimum = num[0]; for (i = 1; i < N; i++) { if (isnan(num[i])) continue; if (!(num[i] >= minimum)) minimum = num[i]; if (!(num[i] <= maximum)) maximum = num[i]; } printf("min: %e\n", minimum); printf("max: %e\n", maximum); }

{{1}}