c - 为什么我的程序不打印指定输入的输出?

标签 c if-statement switch-statement

我有一个如下所示的网格: enter image description here

我的程序所做的是,它将计算是否获得徽章,然后,如果特定输入是否获得徽章,它将打印出是或否(输入将是一个带有坐标的框) (x,y))。但由于某种原因,当我去打印输出时,我的程序仅针对黄色阴影区域进行计算。

在我的代码中,我通过以下方式解释了不在边缘的框:

if ((x >= 2 && x <= 19) && (y >= 2 && y <= 19))

但这似乎并不能解决我的问题。注意:如果输入 (x, y) 不在区间 [1, 20] 内,则返回 -1。

这是我打印结果时得到的结果: enter image description here

如您所见,不在边缘的字段中的银色徽章的输出不会显示。我似乎无法弄清楚为什么不在边缘的盒子没有被计算/打印出来。

注意:当某个领域获得两个或更多铜牌徽章时,Poly 徽章会返回"is"。

注意:任何颜色徽章在以下情况下返回徽章:

  1. 一个 field 获得 0 枚青铜徽章,并且如果所有邻近 field 都没有获得青铜徽章(邻近 field 包括西北、东北、西南和东南)

  2. 某个领域获得 1 个铜牌,且该领域的总体得分(声明为 fieldScore)为 20 或以上。

  3. 一 block 田地获得 2 个青铜徽章,并且至少满足以下条件之一:该田地没有产生任何利润(声明为 fieldProfit),收获时间少于 80 天(声明为 HarvestTime),或者它的日照暴露量(声明为 sunExposure)大于其灌溉暴露量(声明为irritationExposure)。

  4. 如果某个领域至少有两个直接邻居获得两个或更多青铜徽章,则该领域将获得 3 个或更多青铜徽章。 (直接邻居是北、南、东、西)。

这是我的两个银色徽章功能(Poly 徽章和 Any Color 徽章)的代码:

int countBadges(int x, int y) {
   int mavebadge, incirclebadge, herobadge, weatherbadge, inquattrobadge,
      total;

   mavebadge = badgeBoundaryMaven(x, y);
   incirclebadge = badgeInnerCircle(x, y);
   herobadge = badgeLocalHero(x, y);
   weatherbadge = badgeBoringWeather(x, y);
   inquattrobadge = badgeInQuattro(x, y);

   total = mavebadge + incirclebadge + herobadge + weatherbadge +
      inquattrobadge;

   return total;

   printf("Total number: %d\n", countBadges(2, 2));
}

int badgePoly(int x, int y) {
   int bronzebadges, polybadge;

   if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
      bronzebadges = countBadges(x, y);
      if (bronzebadges >= 2) {
         polybadge = 1;
      }
      else {
         polybadge = 0;
      }
   }
   else {
      polybadge = -1;
   }

   return polybadge;
}


int badgeAnyColor(int x, int y) {
   int bronzebadges, northbadges, northeastbadges, northwestbadges, eastbadges,
      westbadges, southbadges, southeastbadges, southwestbadges, colorbadge;

   double fs, ht, fp, sunexp, irrexp;

   if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
      fs = fieldScore(x, y);
      ht = harvestTime(x, y);
      fp = fieldProfit(x, y);
      sunexp = sunExposure(x, y);
      irrexp = irrigationExposure(x, y);
      bronzebadges = countBadges(x, y);
      northbadges = countBadges(x, y + 1);
      northeastbadges = countBadges(x + 1, y + 1);
      northwestbadges = countBadges(x - 1, y + 1);
      eastbadges = countBadges(x + 1, y);
      westbadges = countBadges(x - 1, y);
      southbadges = countBadges(x - 1, y - 1);
      southeastbadges = countBadges(x + 1, y - 1);
      southwestbadges = countBadges(x - 1, y - 1);

      switch (bronzebadges) {
         case 0: {
            if (x == 1 && y == 1){
               if (northbadges == 0 && northeastbadges == 0 &&
                  eastbadges == 0){
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 20 && y == 1) {
               if (northbadges == 0 && northwestbadges == 0 &&
                  westbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
           }
            if (x == 1 && y == 20) {
               if (eastbadges == 0 && southeastbadges == 0 &&
                  southbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
           }
            if (x == 20 && y == 20) {
               if (westbadges == 0 && southwestbadges == 0 &&
                  southbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y == 1)) {
               if (westbadges == 0 && northwestbadges == 0 && northbadges == 0
                  && northeastbadges == 0 && eastbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y == 20)) {
               if (westbadges == 0 && southwestbadges == 0 && southbadges == 0
                  && southeastbadges == 0 && eastbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 20) && (y >= 2 && y <= 19)) {
               if (northbadges == 0 && northwestbadges == 0 &&
                  westbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 1) && (y >= 2 && y <= 19)) {
               if (northbadges == 0 && northeastbadges == 0 && eastbadges == 0
                  && southeastbadges == 0 && southbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y >= 2 && y <= 19)) {
               if (northbadges == 0 && northwestbadges == 0 && westbadges == 0
                  && southwestbadges == 0 && southbadges == 0 &&
                     southeastbadges == 0 && eastbadges == 0 &&
                        northeastbadges == 0) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            break;
         }
         case 1: {
            if (fs >= 20) {
               colorbadge = 1;
            }
            else {
               colorbadge = 0;
            }
            break;
         }
         case 2: {
            if (fp <= 0 || ht < 80 || sunexp > irrexp) {
               colorbadge = 1;
            }
            else {
               colorbadge = 0;
            }
            break;
         }
         case 3:
         case 4:
         case 5: {
            if ((x >= 2 && x <= 19) && y == 1) {
               if (((westbadges + northbadges) >= 2) || ((northbadges +
                  eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 1 && y == 1) {
               if ((northbadges + eastbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 20 && y == 1) {
               if ((northbadges + westbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 1 && y == 20) {
               if ((southbadges + eastbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if (x == 20 && y == 20) {
               if ((southbadges + westbadges) >= 2) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && y == 20) {
               if (((westbadges + southbadges) >= 2) || ((southbadges +
                  eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 1) && (y >= 2 && y <= 19)) {
               if (((northbadges + eastbadges) >= 2) || ((eastbadges +
                  southbadges) >= 2) || ((northbadges + southbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x == 20) && (y >= 2 && y <= 19)) {
               if (((northbadges + westbadges) >= 2) || ((westbadges +
                  southbadges) >= 2) || ((northbadges + southbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            if ((x >= 2 && x <= 19) && (y >= 2 && y <= 19)) {
               if (((northbadges + westbadges) >= 2) || ((westbadges +
                  southbadges) >= 2) || ((southbadges + eastbadges) >= 2) ||
                     ((northbadges + southbadges) >= 2) || ((westbadges +
                        eastbadges) >= 2)) {
                  colorbadge = 1;
               }
               else {
                  colorbadge = 0;
               }
            }
            break;
         }
      }
   }
   else {
      colorbadge = -1;
   }
   return colorbadge;
}

最佳答案

您的 countBadges(x,y) 函数在 printf 之前有一个 return 语句,因此 printf 永远不会打印。您应该将其移至 return 上方,如果不需要则将其注释掉。您可能还有其他 printf 问题。

int countBadges(int x, int y)
{
    int mavebadge, incirclebadge, herobadge, weatherbadge, inquattrobadge,
        total;

    mavebadge = badgeBoundaryMaven(x, y);
    incirclebadge = badgeInnerCircle(x, y);
    herobadge = badgeLocalHero(x, y);
    weatherbadge = badgeBoringWeather(x, y);
    inquattrobadge = badgeInQuattro(x, y);

    total = mavebadge + incirclebadge + herobadge + weatherbadge +
        inquattrobadge;

    printf("Total number: %d\n", countBadges(2, 2));
    return total;
}

您经常检查网格位置,因此我建议使用一个函数(或宏)ongrid(x,y),并使用它来检查有效的网格边界位置,

int ongrid(x,y)
{
    return ( (x>=1) && (x<=20) && (y>=1) && (y<=20) );
}

您还应该检查您的边界条件,

  if( y + 1<=20 )
      northbadges = countBadges(x, y + 1);
  if( x + 1<=20 && y + 1<=20 )
     northeastbadges = countBadges(x + 1, y + 1);
  if( x - 1>=1 && y + 1<=20 )
     northwestbadges = countBadges(x - 1, y + 1);
  if( x + 1<=20 )
     eastbadges = countBadges(x + 1, y);
  if( x - 1<=20 )
     westbadges = countBadges(x - 1, y);
  if( y - 1>=1 )
     southbadges = countBadges(x, y - 1); //this value was probably not right
  if( x + 1<=20 && y - 1>=1 )
     southeastbadges = countBadges(x + 1, y - 1);
  if( x - 1>=1 && y - 1>=1 )
     southwestbadges = countBadges(x - 1, y - 1);

为了更加清晰,用 ongrid() 函数重写,

  if( ongrid(x,y + 1) )
      northbadges = countBadges(x, y + 1);
  if( ongrid(x + 1,y + 1) )
     northeastbadges = countBadges(x + 1, y + 1);
  if( ongrid(x - 1,y + 1) )
     northwestbadges = countBadges(x - 1, y + 1);
  if( ongrid(x + 1,y) )
     eastbadges = countBadges(x + 1, y);
  if( ongrid(x - 1,y) )
     westbadges = countBadges(x - 1, y);
  if( ongrid(x,y - 1) )
     southbadges = countBadges(x, y - 1);
  if( ongrid(x + 1,y - 1) )
     southeastbadges = countBadges(x + 1, y - 1);
  if( ongrid(x - 1,y - 1) )
     southwestbadges = countBadges(x - 1, y - 1);

您的青铜徽章 switch 语句没有默认值;如果您的徽章数量与明确说明的数量不同,您需要处理默认值,

     default : {
         break;
     }

关于c - 为什么我的程序不打印指定输入的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19577382/

相关文章:

c++ - 加速 Matlab 引擎调用

C 内存泄漏问题

javascript - 将包含字符串和数字的 JavaScript 数组排序为仅数字数组和仅字符串数组

arrays - 将 switch 语句与数组一起使用时,类型 '[String]' 的表达式模式无法匹配类型 '[String]' 的值

java - 如果输入了选项之外的内容,如何重复 if 或 switch 语句?

c - C程序的调试(Redis服务器)

计算字段中的 Excel IF 语句

JavaScript 重定向 URL

eclipse - 如何使用 eclipse 的代码格式化程序删除 'case' 之后的新行?

毕达哥拉斯三元组的 C 程序 - 输出不正确