2013-04-15 5 views
0

У меня проблема, когда мои функции, кажется, только возвращают. Я думал, что правильно возвращаю функции, но, похоже, я этого не делаю.функции только возвращают 1?

char goAgain() 
{ 
char ch; 
do 
{ 
    printf("Would you like to go again? "); 
    ch = getchar(); 
    while(fgetc(stdin) != '\n'); 
}while(ch != 'n' || 'y'); 

return ch; 
} 


double findMedian(int array[], int length) 
{ 
int mid; 
double median, medianLeft, medianRight; 
if(length % 2 == 0) 
{ 
    mid = length/2; 
//  medianLeft = array[mid]; 
//  medianRight = array[mid + 1]; 
} 
else 
{ 
    mid = length/2; 
    median = array[mid]; 
} 

return median; 
} 

это, как я называю средний

double mean = findMedian(array, length); 

почему он только дает мне один в моем возвращении. также, когда я пытаюсь повторить goAgain, я тоже не получаю правильный ch.

option = goAgain(); 

В мире c все намного отличается от мира java.

do 
{ 
    int num = menu(); 

    if(num == 1) 
     fillArray(array, size); 
    else if(num == 2) 
    { 
     int newSize = readNum(); 
     fillArray(array, newSize); 
    } 
    else if(num == 3) 
    { 
     int length = size; 
     sortArray(array); 
     double mean = findMean(array, length); 
     double median = findMedian(array, length); 
     printResults(mean, median); 
    } 
    else 
    { 
     printf("Please enter a valid number\n"); 
     num = menu(); 
    } 

    option = goAgain(); 
}while(option == 'y'); 
+3

Что следует 'findMedian' вернуться, если' (длина% 2! = 0) ' ? 0? – raina77ow

+3

'if (length% 2 == 0)', тогда вы не инициализируете «медианную» для любого значения и, следовательно, возвращаете что-то случайное. – RichieHindle

+3

'while (ch! = 'N' || 'y')' не делает того, что вы думаете. –

ответ

8

Это условие:

(ch != 'n' || 'y') 

, вероятно, не делать то, что вы хотите. Это интерпретируется компилятором как это:

((ch != 'n') || 'y') 

Что означает «если ch не символ n ИЛИ если символ y». Если ваша машина использует ASCII, то y имеет значение 121. Что произойдет, если вы:

((whatever) || 121) 

Для булева OR оператора (||) значение 0 представляет ложным и каждое другое значение представляет собой истинное. И что вы получаете, когда верны хотя бы по меньшей мере операнды логической операции OR? Вы становитесь правдой.

Итак, ваше состояние, по существу, такой же, как просто писать

(1) 

Похоже, что вы хотите:

(ch != 'n' && ch != 'y'); 
+1

Собственно, '(ch! = 'n' || 'y');' всегда будет оценивать 'true', потому что' 'y 'всегда всегда равно нулю. –

+2

Разве это не то, что у меня есть? –

+0

Нет ... '(ch! = 1)' подразумевает, что он мог бы оценивать 'false', если' ch == 1' - вы бы имели в виду '(ch! = 'N' || 'y')' - это то же самое, что сказать '(true)' –

0

Когда:

if(length % 2 == 0) 

... оценивает true, вы не вычисляете значение для median, но все же возвращаете его.

(А затем добавить в любой становится от ответа Карла, который имеет дело с «а также» часть вашего вопроса!)

+0

вещь, которую я сейчас делаю, - это просто нечетная длина для массива, как только я получу нечетную часть работы, я сосредоточусь на том, что даже вернется – kevorski