通过 C 中的用户定义函数打印随机二维数组

Printing random 2-dimensional array though a user-defined function in C

我必须在 25x2 table 中打印出数组的结果,但棘手的部分是数组必须在 main 中,而用户定义的函数必须输出数组。我不确定如何开始这个,更不用说获得所需的输出了:

    Temperature Conditions on October 9, 2015: 
    Time of Day     Temperature in degrees F 
    0               85
    1               80
    2               97
    3               90
    4               73
    ........
    Midnight        68

这是我目前的代码

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

    int get_value (void) 
    {
       return rand()%41+60; 
    }

    int calc_results (int a[], int n)
    {
        int i, j, maximum, minimum, average,sum;

    printf ("Temperature conditions on October 17th, 2015:\n");


        int a[25][2]; //not sure what to do here
        for(i = 0; i<25;i++)
            {
            for(j=0;j<2;j++)
                printf ("%d\n"), a[i][j];
            }


        maximum = a[0]; 
        for(i = 0; i < n; i++)
            {
            if(maximum < a[i])
                maximum = a[i];
            }
        printf("Maximum Temperature for the day: %d\n", maximum);


        minimum = a[0]; 
        for(i = 0; i < n; i++)
            {
            if(minimum > a[i])
                minimum = a[i];
            }
        printf("Minimum Temperature for the day: %d\n", minimum);


        float avg; 
        sum = 0;
        for(i = 0; i < 25; i++)
            sum+=a[i];

        avg=(float)sum/25;
        printf("Average Temperature for the day: %f\n", avg);


        return 0;
    }


    int main ()
    {
        srand(time(NULL));

        int average,i;

        //printf("These are the temperatures for the day\n");
        int temp[25];
            for (i=0;i<25;i++) 
            {
            temp[i]= get_value(); 
            printf("%d\n",temp[i]); //this prints out the temp results correctly but as a one dimensional array
            }

    calc_results(temp,i); 

    return 0;
    }

此外,所有这些循环都必须在 calc_results 中完成,我不能创建另一个用户定义的函数或将它们中的任何一个移动到 main 中。任何帮助表示赞赏!此时我只想把它变成 table,我不介意输出不是 100% 相同。

我也是编程新手,这是我第一次做这样的事情,所以如果我只是忽略了一些明显的错误或完全破坏了我的代码,我真的很抱歉。

下面的代码会做你想做的事

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

static const int MIN_TEMP = 60;
static const int MAX_TEMP = 101;

int get_value (void) 
{
    return rand()%(MAX_TEMP-MIN_TEMP)+MIN_TEMP; 
}

int calc_results (int a[], int n)
{
    int i, j, maximum = MIN_TEMP, minimum = MAX_TEMP, average,sum;
    float avg; 

    printf ("Temperature conditions on October 17th, 2015:\n");

    for(int i = 0; i<n; ++i){
        if(a[i] > maximum)
            maximum = a[i];
        if(a[i] < minimum)
            minimum = a[i];

        sum+=a[i];
        printf("%d\t%d\n", i, a[i]);
    }

    printf("Maximum Temperature for the day: %d\n", maximum);
    printf("Minimum Temperature for the day: %d\n", minimum);

    avg=(float)sum/n;
    printf("Average Temperature for the day: %f\n", avg);

    return 0;
}


int main ()
{
    srand(time(NULL));

    int average,i;

    //printf("These are the temperatures for the day\n");
    int temp[25];
    for (i=0;i<25;i++) 
    {
        temp[i]= get_value(); 
        //printf("%d\n",temp[i]); //this prints out the temp results correctly but as a one dimensional array
    }

    calc_results(temp,i); 

    return 0;
}

请注意:

  • 你不需要在calc_results中创建一个新数组,传递给calc_results的数组就足够了。鉴于您将数组的大小作为 n 传递,这将足以迭代并计算平均值、最大值和最小值。
  • 您可以使用适当的格式字符串(例如 "%d\t%d\n"
  • 在同一行中打印该索引的索引值和温度值
  • 您可以在同一迭代中完成所有操作(保持 maximumminimumsum
  • 对于像 get_value 这样的函数,我通常发现设置最大和最小值(例如 MAX_TEMPMIN_TEMP 并直接使用它们会更清楚。
  • 您必须至少将 maximumminimum 初始化为您的限制。通常的做法是使用常量,如 INT_MAXINT_MIN.

我想在需要的地方添加 'Midnight' 文本以及标题行的格式是相当简单的。

新手 C 程序员 运行 遇到的最大问题是在他们理解代码逻辑之前拿起键盘并开始编写代码。这很正常,但效率很低。花时间仔细考虑您的要求、需要什么价值、它们将在何时何地产生。

第一个问题是数组,你会在main()中声明并填充数组,然后将数组传递给calc_results。你的 get_value 没问题。第一个问题是 calc_results return 的值是多少?如果没有值,则将其设置为 void 除非您需要 return 一个 success/failure 状态(您的输出在此处执行)。

如何将填充的数组传递给calc_results?当数组作为函数参数传递时,数组的第一维将衰减为指针。这意味着当作为参数传递时 a[25] 将衰减为 *a。这告诉您 calc_results 的正确声明如下所示:

void calc_results (int *a, int n)

calc_results要做什么呢?查看您的问题,它将:(1) 打印每日温度的标题 (2) 通过以下 Midnight 输出所有 25 个值 0(第一个午夜)。唯一需要注意的是,第二次出现的午夜应输出为 Midnight 而不是 24。接下来您将找到 max/min 温度,sum 所有温度,最后除以 25 得到平均值。

多少个循环?要回答这个问题,您首先要问,循环中必须发生什么?好吧,访问个人温度所需的一切都需要在循环中处理。那将是 (1) 值的打印; (2) 找到 max/min 温度和 (3) 总结温度。有什么理由不能在同一个循环中完成这一切吗? (思考)

平均值呢?这需要在循环中吗?不,但它确实需要 sum 这将是循环的结果,因此 average 必须在循环完成后处理。

打印所有 max/min/avg 输出怎么样,有什么理由不应该在知道所需的值后立即发生?

回答完所有问题后,是时候拿起键盘了。通过您的心理轮廓,您可以得出类似于以下内容的结果:

#include <stdio.h>
#include <stdlib.h> /* for rand ()          */
#include <limits.h> /* for INT_MIN/INT_MAX  */
#include <time.h>   /* for srand ()         */

int get_value (void)
{
    return rand () % 41 + 60;
}

void calc_results (int *a, int n)
{
    /* declare & initialize needed variables */
    int i, maximum, minimum, average, sum;
    float avg = 0.0;

    i = average = sum = 0;
    maximum = INT_MIN;
    minimum = INT_MAX;

    /* print header */
    printf ("Temperature conditions on October 17th, 2015:\n"
            "Time of Day     Temperature in degrees F\n");

    /* only one loop is needed */
    for (i = 0; i < n; i++) {

        /* print hourly data */
        if (i < 24)
            printf ("%-16d%d\n", i, a[i]);
        else
            printf ("%-16s%d\n", "Midnight", a[i]);

        /* find max/min, compute sum */
        if (a[i] > maximum)
            maximum = a[i];

        if (a[i] < minimum)
            minimum = a[i];

        sum += a[i];
    }

    /* compute average */
    avg = (float) sum / 25;

    /* print remaining statistics */
    printf ("Maximum Temperature for the day: %d\n", maximum);
    printf ("Minimum Temperature for the day: %d\n", minimum);
    printf ("Average Temperature for the day: %f\n", avg);
}

int main (void)
{
    /* declare & initialize needed variables */
    int i = 0;
    int temp[25] = {0};

    srand (time (NULL));  /* set random seed */

    /* fill array */
    for (i = 0; i < 25; i++)
        temp[i] = get_value ();

    /* calcumate stats, ouput data */
    calc_results (temp, i);

    return 0;
}

输出

$ ./bin/array_temp
Temperature conditions on October 17th, 2015:
Time of Day     Temperature in degrees F
0               81
1               85
2               98
3               67
4               82
5               65
6               96
7               98
8               62
9               77
10              88
11              63
12              96
13              81
14              74
15              73
16              62
17              79
18              85
19              96
20              68
21              90
22              86
23              94
Midnight        96
Maximum Temperature for the day: 98
Minimum Temperature for the day: 62
Average Temperature for the day: 81.680000