【问题标题】:Printing random 2-dimensional array though a user-defined function in C通过 C 中的用户定义函数打印随机二维数组
【发布时间】:2015-10-19 03:27:43
【问题描述】:

我必须在 25x2 表中打印出数组的结果,但棘手的部分是数组必须在 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 中。任何帮助表示赞赏!此时我只想将它放入一个表格中,我不介意输出是否 100% 相同。

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

【问题讨论】:

  • 你不需要二维数组。使用您传递的数组来函数为什么重新声明。而且在你的函数calc_results 中有一个错字在for loop 中的printf

标签: c arrays output user-defined-functions


【解决方案1】:

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

#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 等常量。

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

【讨论】:

    【解决方案2】:

    新的 C 程序员遇到的最大问题是在他们完成代码逻辑之前拿起键盘并开始编写代码。这很正常,但效率很低。花点时间思考一下您的要求、需要什么价值观、这些价值观的来源和时间。

    第一个问题是数组,您将在main() 中声明并填充数组,然后将数组传递给calc_results。你的get_value 很好。第一个问题是calc_results 会返回什么值?如果没有值,则将其设为void,除非您需要返回成功/失败状态(您的输出在此处执行此操作)。

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

    void calc_results (int *a, int n)
    

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

    多少个循环?要回答这个问题,你首先要问,循环中到底发生了什么?好吧,您需要访问单个温度的所有内容都需要在循环中处理。那将是(1)值的打印; (2) 找到最大/最小温度和 (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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      相关资源
      最近更新 更多