2013-10-08 3 views
1

Я написал несколько функций, и я проверил несколько раз, чтобы увидеть, неправильно ли я написал формулу или какие-либо определенные переменные, но это кажется правильным. ИСПЫТАТЕЛЬНЫЕ СЛУЧАИ БЫЛИ ПРЕДНАЗНАЧЕНЫ МОИМ ИНСТРУКТОРОМ, И Я ПРИНИМАЮ, ЧТО ДОЛЖНО БЫТЬ РАБОТАЮТ! Я не уверен, где и что проблема в моем коде. Кстати, тестовые примеры для всех предыдущих функций до последнего прошли, это всего лишь последняя функция, оценка, которая дает мне проблемы.Почему мои тестовые примеры не работают?

ПРИМЕЧАНИЕ: Я объявил много постоянных переменных, и некоторые из них могут казаться неиспользованными прямо сейчас, но вы можете игнорировать это.

#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 является:

soilQuality (х, у) * sunExposure (х, у) * ((7- (абс (irrigationExposure (х, у) - 7)) + 1)/(2))

+0

пожалуйста очистить код от неиспользованной или неактуальной вещи – xmoex

+0

Конечно, нет проблем! – Karen

+0

Вы пытались проверить результаты вручную? Кстати: это домашнее задание? – xmoex

ответ

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; 
                                  ~~~ ~~~~~~~~~^~~~~~~~~~~~~~ 
+1

Это правильно. Я только что проверил локально, и я получу ожидаемые результаты. –

+1

СПАСИБО ВАС ТАКЖЕ СКОЛЬКО! Я изо всех сил старался найти, почему мои тесты не работают! – Karen

+1

@Paul, похоже, вы дали результат clang :). gcc дал мне: 'warning: преобразование в 'int' из 'double' может изменить его значение [-Wconversion]', в то время как clang дает мне то же предупреждение, что и вы. –

Смежные вопросы