0

我有一个函数,如果获得特定的“徽章”或“成就”,则返回 1,如果未获得“徽章”,则返回 0,如果 x 和 y 不在区间 [1 , 20]。

为了让函数返回一个 1,或者换句话说,为了获得一个徽章,该字段必须支持一年四丰收(但不支持五丰收)

必须满足的第二个条件是每年累计种植成本在 190 到 250 单位之间。

第三个条件是该领域必须带来利润。

注意:我已经有了这些预定义的函数,可以用来帮助我编写这段代码: 在此处输入图像描述

我已经知道我的代码在第一个和第二个条件下可能存在问题,但我只是不知道如何将这些条件转换为我的代码。

这是我的代码:

#include <stdio.h>

#define YEAR 360
#define FULLHARVESTS 4.0

int badgeInQuattro(int x, int y) {
   double harv, annucost, fprofit, harvyear;
   int quattrobadge;

   if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
      harv = harvestTime(x, y);
      annucost = pricePerUnit(x, y);
      fprofit = fieldProfit(x, y);
      harvyear = (YEAR)/(FULLHARVESTS);

      if (harv == harvyear && annucost > 190 && annucost < 250 && fprofit > 0) {
         quattrobadge = 1;
      }
      else {
         quattrobadge = 0;
      }
   }
   else {
      quattrobadge = -1;
   }

   return quattrobadge;
}

任何帮助是极大的赞赏!

4

1 回答 1

0

实际上,我发现使用多个退出点可以使代码更具可读性,特别是那些可以及早检测到的代码,尤其是在可以轻松查看函数的情况下,例如下面的较短版本。

人们经常将多个退出点作为一个问题而不理解为什么。这是因为它会使控制流难以理解,而这对于非常短的函数来说是不会发生的。因此,我将从以下内容开始:

#include <stdio.h>

#define YEAR 360
#define FULLHARVESTS 4.0

int badgeInQuattro(int x, int y) {
    double harv, annucost, fprofit, harvyear;

    // Catch invalid ranges first.

    if (x < 1 || x > 20 || y < 1 || y > 20) return -1;

    harv     = harvestTime (x, y);
    annucost = pricePerUnit (x, y);
    fprofit  = fieldProfit (x, y);
    harvyear = (YEAR) / (FULLHARVESTS);

    //printf ("harv     = %f\n", harv);
    //printf ("annucost = %f\n", annucost);
    //printf ("fprofit  = %f\n", fprofit);
    //printf ("harvyear = %f\n", harvyear);

    // Reversing the checks allows for multiple independent return reasons.

    if (harv != harvyear)                   return 0;
    if (annucost <= 190 || annucost >= 250) return 0;
    if (fprofit <= 0)                       return 0;

    // All those failures above have been avoided, we MUST be okay here.

    return 1;
}

我也会(暂时)取消注释这些printf陈述,因为如果你的数据有问题,那应该很快就会显示出来。

于 2013-10-23T08:20:00.393 回答