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