For循环不遵守带有数组的if语句

时间:2018-11-04 23:24:52

标签: c

基本上,我正在编写一个代码,使我能够找到未成年人所喝咖啡的最小数量。显然,在这种情况下,这是14岁的“一杯咖啡”。但是即使我25岁(高于18岁),输出也给了我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;

    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;
}

3 个答案:

答案 0 :(得分:1)

首先,必须在使用所有变量之前对其进行初始化。即,minCoffee不仅应为unsigned int,还应初始化为UINT_MAX。 其次,您应该只检查当前检查的咖啡量是否低于最小值。再次重申数组是没有用的。只需检查:

unsigned int minCoffee = UINT_MAX;
...
if ((tabAges[i] < 18) && (minCoffee < tabCoffee[i]))
    minCoffee = tabCoffee[i];

答案 1 :(得分: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;
}

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

答案 2 :(得分: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

由于我们have no idea what could be in there,现在我们仍然需要弄清楚如何初始化minCoffee变量。

一种选择是导入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;
}