0

基本上我正在编写一个代码,可以让我找到一个未成年人喝的最少咖啡数量。显然,在这种情况下,它是 14 岁的“1 杯咖啡”。但是输出给了我 0,即使他 25 岁(18 岁以上)

#include <stdio.h>
int main()
{
    int tabAges[] = {25, 22, 14, 19, 36, 17};
    int tabCoffee[] = {0, 4, 1, 3, 5, 2}; 
    int nbElements = sizeof(tabAges) / sizeof(int);
    int i, j, minCoffee;

    for(i=0; i<nbElements; i++){
        if (tabAges[i]<18)
            minCoffee = tabCoffee[i];
        for(j=0; j<nbElements; j++)
            if (tabCoffee[j]<minCoffee)
                minCoffee = tabCoffee[j];
    }

    printf("the minimum of coffee drunk by minor is %d", minCoffee);
    return 0;
}
4

3 回答 3

1

首先,您必须在使用它们之前初始化所有变量。也就是说, minCoffee 不仅应该是一个unsigned int,而且应该被初始化为UINT_MAX. 其次,您应该只检查当前检查的咖啡量是否低于最小值。再次重复数组是没有用的。只需检查:

unsigned int minCoffee = UINT_MAX;
...
if ((tabAges[i] < 18) && (minCoffee < tabCoffee[i]))
    minCoffee = tabCoffee[i];
于 2018-11-04T23:40:08.653 回答
0

尝试

#include <stdio.h>
int main()
{
  int tabAges[] = {25, 22, 14, 19, 36, 17};
  int tabCoffee[] = {0, 4, 1, 3, 5, 2}; 
  int nbElements = sizeof(tabAges) / sizeof(int);
  int i, j, minCoffee = INT_MAX;

  for(i = 0; i < nbElements; i += 1) {
    if(tabAges[i] < 18)
      if(tabCoffee[i] < minCoffee)
         minCoffee = tabCoffee[i];
  }
  if(minCoffee == INT_MAX) {
    minCoffee = 0;
  }

  printf("the minimum of coffee drunk by minor is %d", minCoffee);
  return 0;
}

根据马特的建议进行编辑。

于 2018-11-04T23:50:00.673 回答
0

正如其他人在评论中所说,不需要第二个循环。由于您只关心未成年人喝的咖啡数量,因此您只需将这些索引处的咖啡数量与您的minCoffee变量进行比较。这样做,你的循环可能看起来像这样:

for(i=0; i<nbElements; i++) {
    if (tabAges[i]<18) {
        if (tabCoffee[i]<minCoffee) {
            minCoffee = tabCoffee[i];
        }
    }
}

(顺便说一句,虽然单行控制语句可以在没有花括号的情况下工作,但如果您稍后返回并添加一行,它们有时会导致意外行为。始终包含它们更安全(并且可以说更具可读性)。

如果您愿意,可以将上述if语句压缩为一个语句:if (tabAges[i] < 18 && tabCoffee[i] < minCoffee.

现在我们仍然需要弄清楚如何初始化minCoffee变量,因为我们不知道里面可能有什么

一种选择是 import limits.h,并将其设置为INT_MAX(或者UINT_MAX如果您决定使用无符号整数)。

#include <limits.h>
// declare variables etc...
minCoffee = INT_MAX;

如果由于某种原因你不能/不想这样做,另一种方法是初始化minCoffee一些无意义的东西,然后在你的循环中有一个特殊情况将它设置为它检测到的未成年人的第一个值。

minCoffee = -1 //This doesn't make sense, you can't drink less than 0 coffees!
for(i=0; i<nbElements; i++) {
    if (tabAges[i]<18) {
        if (minCoffee == -1) {
            minCoffee = tabCoffee[i]
        } else if (tabCoffee[i]<minCoffee) {
            minCoffee = tabCoffee[i];
        }
    }
}

在实践中,这实现了与之前的解决方案完全相同的结果,但是它需要额外的测试并且阅读起来不那么直观,所以我不推荐这种方法。

现在,如果您将所有这些放在一起,您最终可能会得到一个看起来像这样的解决方案:

#include <stdio.h>
#include <limits.h>
int main() {
    int tabAges[] = {25, 22, 14, 19, 36, 17};
    int tabCoffee[] = {0, 4, 1, 3, 5, 2}; 
    int nbElements = sizeof(tabAges) / sizeof(int);
    int i, j, minCoffee;

    minCoffee = INT_MAX; 

    for(i=0; i<nbElements; i++){
        if (tabAges[i]<18)
            if (tabCoffee[i]<minCoffee)
                minCoffee = tabCoffee[i];
    }

    printf("the minimum of coffee drunk by minor is %d", minCoffee);
    return 0;
}
于 2018-11-04T23:59:25.403 回答