打印数组的最大元素

Printing the largest element of an array

所以这个标题很垃圾,我真的不知道该怎么解释。不过,当您看到代码时就会明白,它是这样的:

#include <stdio.h>

void products(float values[], int prod_num);

int main(void) {
    int prod_num;
    printf("Enter the number of products: ");
    scanf("%d", &prod_num);
    float values[prod_num];
    for (int i = 0; i < prod_num; i++) {
        printf("Enter the value of the product: ");
        scanf("%f", &values[i]);
    }
    products(values, prod_num);
    return 0;
}

void products(float values[], int prod_num) {
    int i, j, t;
    float sum = 0, avg;
    for (i = 0; i < prod_num; i++) {
        sum = sum + values[i];
        avg = sum / prod_num;
    }
    printf("The average is: %f\n", avg);
    for (i = 0; i < prod_num; i++) {
        for (j = i + 1; j < prod_num; j++) {
            if (values[i] > values[j]) {
                t = values[i];
                values[i] = values[j];
                values[j] = t;
            }
        }
    }
    printf("Largest value: %f\n", values[]);
    printf("Smallest value: %f", values[0]);
}

因此,如您所知,这段代码正在使用函数 products 求出某些产品的平均值,效果很好,还可以从values数组。我认为最好的方法是按升序排列数组,然后打印 values[0],因为那将是最小值,然后打印最后一个元素。那是我的问题。当我不知道它的大小时,我如何告诉它打印出数组的最后一个元素,因为它是由用户输入的?实际上,我有不同的方式来完成这部分(我只展示了功能):

void products(float values[], int prod_num) {
    int i;
    float sum = 0, avg;
    for (i = 0; i < prod_num; i++) {
        sum = sum + values[i];
        avg= sum / prod_num;
    }
    printf("The average is: %f\n", avg);
    for (i = 1; i < prod_num; i++) {
        if (values[0] < values[i]) {
            values[0] = values[i];
        }
    }
    printf("Largest value: %f\n", values[0]);
    for (i = 1; i < prod_num; i++) {
        if (values[0] > values[i]) {
            values[0] = values[i];
        }
    }
    printf("Smallest value: %f\n", values[0]);
}

问题是它会打印出第二小的值,因为这些值会因为寻找最大值的 for 循环而改变,所以我尝试了我展示的第一种方法。解决方案可以是这两种方法中的任何一种,我不介意。或者我想这可能是一种完全不同的方法,不是完全垃圾,就像我怀疑我的两个可能是这样。

How do I tell it to print out the last element of the array, when I don't know its size

知道它的大小,实际上它被传递到函数中。

数组的大小是prod_num,所以最后一个元素是values[prod_num-1]

在侧节点上,不需要对列表进行排序以找到最大和最小。使用变量来跟踪当前的最小值和最大值,将两者初始化为数组的第一个元素。然后遍历数组,检查当前元素是否小于最小值或大于最大值,如果更新 min/max.

的值

你知道数组的大小。它被指定为第二个函数参数

void products (float values[], int prod_num){

所以你可以这样写

printf("Largest value: %f\n", values[prod_num-1]);

也不需要在for循环中计算平均值

for (i = 0; i < prod_num; i++) {
    sum = sum + values[i];
    avg= sum / prod_num;
}

你只能在 for 循环后计算一次。

一般来说,更改源数组是个坏主意。

找到你可以写的最小和最大元素

void products( const float values[], size_t prod_num ) 
{
    if ( prod_num != 0 )
    {
        float min = values[0];
        float max = values[0];
        float sum = values[0];

        for ( size_t i = 1; i < prod_num; i++ ) 
        {
            sum += values[i];
            if ( max < values[i] )
            {
                max = values[i];
            }
            else if ( values[i] < min )
            {
                min = values[i];
            }
        }
        printf( "The average is: %f\n", sum / prof_num );
        printf( "Largest value: %f\n", max );
        printf( "Smallest value: %f\n", min );
    }
    else
    {
        puts( "The array is empty." );
    }
}

为了在你的产品中找到最小值和最大值,你不需要对数组进行排序(尽管即使这样你也会找到正确的解决方案)因为它会影响你的程序在运行时的性能。 不管怎样,如果你还想排序, 使用值[prod_num-1]寻找最大元素。 要查找最小值和最大值 而无需对数组进行排序 您可以使用此示例:

float maxi = values[0];
float mini = values[0];
for (i=1;i<prod_num;i++)
{
    if(maxi<values[i])
        maxi=values[i];
    if(mini>values[i])
        mini = values[i];
}
void products(float values[], int prod_num) {
    float sum = 0, avg, least = values[0], largest = values[0];
    for (int i = 0; i < prod_num; i++) {
        sum = sum + values[i];
        largest = largest < values[i] ? values[i] : largest;
        least = least > values[i] ? values[i] : least;
    }
    avg = sum / prod_num;
    printf("The average is: %f\n", avg);
    printf("Largest value: %f\n", largest);
    printf("Smallest value: %f", least);
}