【问题标题】:how to record multiple max values from a 2D array in C using stdio.h如何使用 stdio.h 从 C 中的二维数组记录多个最大值
【发布时间】:2017-05-28 17:26:34
【问题描述】:

我在课堂上有一项作业,要求我将 30 个值硬编码到一个二维数组中(4 周 7 天,每天记录温度)。然后制作我的程序,以便它找到并打印最大值,以及记录它的日期和星期。但是,在 3 个不同的日子里有 3 个最大值。我假设必须打印所有 3 个案例。

我还是个初学者,以前没有遇到过这样的问题。我写了一个代码来打印 3 的一个最大值。下面提到:

#include <stdio.h>

#define y 4
#define x 7

int main()
{
    int max = 0, week, i, j, day;
    int table[y][x] = {
        {32,31,30,31,32,33,32},
        {33,32,34,35,34,36,36},
        {34,34,36,36,37,38,38},
        {38,37,36,35,34,33,32}};

    for (i = 0; i < y; i++)
    {
        for (j = 0; j < x; j++)
        {
            if (max <= table[i][j])
            {           
                max = table[i][j];
                day = j + 1;
                week = i + 1;           
            }
        }
    }

    switch (day)
    {
        { case 1: printf("The highest temperature %d was recorded on Monday of week %d\n", max, week); break; }
        { case 2: printf("The highest temperature %d was recorded on Tuesday of week %d\n", max, week); break; }
        { case 3: printf("The highest temperature %d was recorded on Wednesday of week %d\n", max, week); break; }
        { case 4: printf("The highest temperature %d was recorded on Thursday of week %d\n", max, week); break; }
        { case 5: printf("The highest temperature %d was recorded on Friday of week %d\n", max, week); break; }
        { case 6: printf("The highest temperature %d was recorded on Saturday of week %d\n", max, week); break; }
        { case 7: printf("The highest temperature %d was recorded on Sunday of week %d\n", max, week); break; }
    }
    return 0;
}

你们能否帮我编写这段代码,如果有 x 个最大值,则所有 x 值的情况都会打印出它们的日期和星期。另外,因为我们还没有涵盖我班上的所有图书馆。他们希望我只使用 stdio.h 来编写程序。

感谢您花时间阅读。也提前感谢您的回复。

PS:如果你们能提出使用&lt;stdio.h&gt;、数组、指针和循环的解决方案,我将不胜感激,因为我还没有涉及到编码的其他方面。

【问题讨论】:

  • 你所要做的就是在获得最大值后,再次遍历二维数组。如果值等于最大值,则在每个元素处打印它们的日、周和最大值(在循环内)!

标签: c arrays for-loop switch-statement stdio


【解决方案1】:

您的代码正常运行,它确实会生成记录了最高温度的最后一天。然而,这里有一些改进的领域:

  • 避免使用#define 定义简单的小写标识符,例如xy
  • 您应该使用数组作为星期几的名称,以避免冗长的 switch 语句包含大量冗余代码。
  • 您应该将max 初始化为记录的第一个温度值:按照编码,如果所有温度均为负值,您将无法找到最大值。

您注意到最高温度是在多天记录的,这是一个非常好的点,并且规范对于输出的内容有些含糊。产生多个结果可能不是预期的结果,但如果手动验证分配肯定是一个奖励。

要打印所有匹配的天数,首先确定最高温度,然后使用第二个循环枚举记录的天数。

这是修改后的版本:

#include <stdio.h>

#define NWEEKS 4
#define WEEKDAYS 7

int main(void) {
    int max, week, day;
    int table[NWEEKS][WEEKDAYS] = {
        { 32, 31, 30, 31, 32, 33, 32 },
        { 33, 32, 34, 35, 34, 36, 36 },
        { 34, 34, 36, 36, 37, 38, 38 },
        { 38, 37, 36, 35, 34, 33, 32 }};
    const char *dayname[WEEKDAYS] = {
        "Monday", "Tuesday", "Wednesday", "Thursday",
        "Friday", "Saturday", "Sunday" };

    max = table[0][0];
    for (week = 0; week < NWEEKS; week++) {
        for (day = 0; day < WEEKDAYS; day++) {
            if (max < table[week][day]) {           
                max = table[week][day];
            }
        }
    }
    printf("The highest temperature is %d\n", max);
    for (week = 0; week < NWEEKS; week++) {
        for (day = 0; day < WEEKDAYS; day++) {
            if (table[week][day] == max) {
                printf("It was recorded on %s of week %d\n",
                       dayname[day], week + 1);
            }
        }
    }
    return 0;
}

【讨论】:

  • 非常感谢您提供此解决方案。这真是令人头疼。与上面的 cmets 一样,我进行了两次迭代以找到最大值并记录它在哪几天,并且效果很好。但是您的解决方案更重要。再次感谢您。
【解决方案2】:

试试这个。如果有多个,则将日期的详细信息存储在一个链接列表中。

#include<stdio.h>
#define y 4
#define x 7
typedef struct record{
int week;
int day;
record* next;
}dayRecord;

int main()
{
    int max=0,week,i,j,day;
    int table[y][x]={{32,31,30,31,32,33,32},{33,32,34,35,34,36,36},{34,34,36,36,37,38,38},{38,37,36,35,34,33,32}};
    dayRecord* list = NULL; 

    for(i=0; i<y ; i++ )
    {
        for(j=0; j<x ; j++)
        {
            if(max<table[i][j])
            {           
                max=table[i][j];
                dayRecord* d = malloc(sizeof(dayRecord));
                d->day=j+1;
                d->week=i+1;
                d->next = NULL;
                list = d;
            }else if(max == table[i][j]){
                dayRecord* d = malloc(sizeof(dayRecord));
                d->day=j+1;
                d->week=i+1;
                d->next = list;
                list = d;
            }
        }   

    }
    while(list->next != NULL){
        int day = list->day;
        int week = list->week;
        list = list->next;
        switch(day)
        {
            {case 1: printf("The highesest tempreture %d was recorded on Monday of week %d\n",max,week);break;}
            {case 2: printf("The highesest tempreture %d was recorded on Tuesday of week %d\n",max,week);break;}
            {case 3: printf("The highesest tempreture %d was recorded on Wednesday of week %d\n",max,week);break;}
            {case 4: printf("The highesest tempreture %d was recorded on Thursday of week %d\n",max,week);break;}
            {case 5: printf("The highesest tempreture %d was recorded on Friday of week %d\n",max,week);break;}
            {case 6: printf("The highesest tempreture %d was recorded on Saturday of week %d\n",max,week);break;}
            {case 7: printf("The highesest tempreture %d was recorded on Sunday of week %d\n",max,week);break;}
        }
    }
    return 0;
}

【讨论】:

    【解决方案3】:

    如果你是初学者,我想说最好的办法是拥有 2 组迭代器。

    迭代器基本上是

    for(i=0;i<n;i++)
    {
    for(j=0;j<m;j++)
    {
    // Do something here.
    }
    }
    

    所以你要做的是,在第一个迭代器中找到最大温度,并让一个 if 条件将最大值与第二个迭代器中的当前值相匹配。如果值匹配,则运行您已经编写的 switch case。

    这样您就不必编写复杂的链接列表。

    但是,如果您想在编程中拥有载体,强烈建议使用链接列表。

    【讨论】:

      猜你喜欢
      • 2014-01-16
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2014-12-27
      相关资源
      最近更新 更多