1

私はいくつかの関数を書き、式を間違って書き留めていないか、または定義された変数を書き留めていないかを何度も確認しましたが、それらは正しいようです。テストケースは私のインストラクターによって与えられたので、それらが機能する必要があると思います! コードのどこに問題があるのか​​ わかりません。ところで、最後の関数までの以前のすべての関数のテスト ケースが合格しました。問題を引き起こしているのは、最後の関数、estimateYield だけです。

注: 多くの定数変数を宣言しましたが、そのうちのいくつかは現在使用されていないように見えるかもしれませんが、無視してかまいません。

#include "grove.h"
#include <math.h>
#include <stdlib.h>

#define SOILQUALACONST 10 /* Number subtracted from both x and y in typeA. */
#define SOILQUALBCONST 10 /* Number subtracted from both x and y in typeB. */
#define SUNEXPXTERM 8   /* Number you subtract from x in exponent.*/
#define SUNEXPDIV1 10   /* First denominator term in first fraction in exp.*/
#define SUNEXPYTERM 12   /* Number you subtract from y in exponent.*/
#define SUNEXPDIV2 5   /* Second denominator term in second fraction in exp.*/
#define SUNEXPEMULT 10   /* The constant you are multiplying e^(exp.) by.*/
#define IRRIEXPONUM 10   /* The numerator in irrigation exposure function.*/
#define ESTYIELDNUM1 7   /* First term in fraction part of estimated yield.*/
#define ESTYIELDNUM2 7   /* Last term in fraction part of estimated yield.*/

double soilQuality(int x, int y) {
   double typeA, typeB, soilQual;

   typeA = 1 + (sqrt((pow(x - SOILQUALACONST, 2)) + (pow(y - SOILQUALACONST, 2))      * (1.0)));
   typeB = (1 + ((abs(x - SOILQUALBCONST) + abs(y - SOILQUALBCONST))/(2.0)));
   soilQual = (((x + y) % 2) * typeB) + ((1 - ((x + y) % 2)) * typeA);

   return soilQual;
}

double sunExposure(int x, int y) {
   double exponent, sunexp;

   exponent = (-0.5) * (((pow(x - SUNEXPXTERM, 2))/(SUNEXPDIV1)) + ((pow(y -
      SUNEXPYTERM, 2))/(SUNEXPDIV2)));
   sunexp = SUNEXPEMULT * exp(exponent);

   return sunexp;
}

double irrigationExposure(int x, int y) {
   double denominator, waterexp;

   denominator = (1 + abs(x - y)) * (1.0);
   waterexp = ((IRRIEXPONUM)/(denominator));

   return waterexp;
}

double estimateYield(int x, int y) {
   double waterexp, soilqual, sunexp, numerator, estyield;

   waterexp = irrigationExposure(x, y);
   soilqual = soilQuality(x, y);
   sunexp = sunExposure(x, y);

   numerator = ((ESTYIELDNUM1) - (abs(waterexp - ESTYIELDNUM2))) + 1;
   estyield = (soilqual) * (sunexp) * ((numerator)/(2.0));

   return estyield;
}

つまり、基本的に、最後の関数のいくつかのテスト ケースが失敗し続け、その理由がわかりません。これが私のインストラクターが関与しているテストケースです:

#include <stdio.h>
#include "grove.h"
#include "checkit.h"

int main(){

   checkit_double(estimateYield(3,3), 0.023697  );
   checkit_double(estimateYield(1,19),0.067322 );
   checkit_double(estimateYield(7,8),  20.165240 );
   checkit_double(estimateYield(12,3),  0.007501);
   checkit_double(estimateYield(4,17), 2.371061);

   return(0);
}

そして、これを実行すると得られるものは次のとおりです。

Test passed on line 6.
Test FAILED on line 7.  estimateYield(1,19) is 0.088215, expected 0.067322.
Test passed on line 8.
Test passed on line 9.
Test FAILED on line 10.  estimateYield(4,17) is 2.766238, expected 2.371061.

必要な場合に備えて、estimateYield の式は次のとおりです。

土壌の質(x,y) * 日光暴露(x,y) * ((7-(abs(灌漑暴露(x,y) - 7)) + 1)/(2))

4

1 に答える 1

4

問題はここにあります:

numerator = ((ESTYIELDNUM1) - (abs(waterexp - ESTYIELDNUM2))) + 1;

値で整数abs関数を使用しているdoubleため、切り捨てられたint結果が得られます。この行を使用するfabsように変更すると、問題が解決するようです:

numerator = ((ESTYIELDNUM1) - (fabs(waterexp - ESTYIELDNUM2))) + 1;

これは、整数演算と浮動小数点演算を混在させる場合によくある問題です。intすべての定数と変数を作成し、全体doubleで浮動小数点演算 (およびfabs()!)を使用することをお勧めします。

gcc -Wall -Wconversion ...また、間違いをキャッチしたことに注意してください。

$ gcc -Wall -Wconversion soil.c 
soil.c:58:48: warning: implicit conversion turns floating-point number into integer: 'double' to 'int' [-Wconversion]
   numerator = ((ESTYIELDNUM1) - (abs(waterexp - ESTYIELDNUM2))) + 1;
                                  ~~~ ~~~~~~~~~^~~~~~~~~~~~~~
于 2013-10-08T08:06:46.973 に答える