2011-02-03 7 views
4

ЭТО ДОЛЖНО. думал, что дам вам знать. если бы вы могли указать мне в направлении, которое поможет мне узнать, почему эта ошибка происходит, я был бы признателен. http://pastebin.com/hDUpfrsu - это мой текущий код (см. Ниже). почему он возвращает ONE, когда я вхожу (в этом порядке) 5, 6, 7 или в другие последовательности?найти среднее число в C

#include <stdio.h> 
#include <simpio.h> 
#include <genlib.h> 

/* finds the minimum among three integers using minimal amount of relational operations */ 

int main() 
{ 
    int myNumbers[2]; 
    bool lowest; 
    printf("Enter the first integer...\t"); 
    myNumbers[0] = GetInteger(); 
    printf("Enter the second integer...\t"); 
    myNumbers[1] = GetInteger(); 
    printf("Enter the third integer...\t"); 
    myNumbers[2] = GetInteger(); 

    if (myNumbers[0] < myNumbers[1] && myNumbers[0] < myNumbers[2]) 
    { 
     lowest = myNumbers[0]; 
    } 

    if (myNumbers[0] > myNumbers[1] && myNumbers[1] < myNumbers[2]) 
    { 
     lowest = myNumbers[1]; 
    } 

    if (myNumbers[0] > myNumbers[2] && myNumbers[1] > myNumbers[2]) 
    { 
     lowest = myNumbers[2]; 
    } 

    printf("\n%d", lowest); 
    getchar(); 
    return 0; 

}

+0

Ваш комментарий говорит, что «находит минимум из трех целых чисел, используя минимальное количество реляционных операций», но операции на самом деле не минимальны, как реализовано. –

+1

как я могу исправить это? – tekknolagi

+0

Вы можете исправить это, вставив ваши операторы if. Например, первый тест может быть myNumbers [0] btilly

ответ

3

Несколько вопросов:

  • низкий определяется как bool, она должна быть int с тем, как вы используете его

  • myNumbers[2] является массивом размера 2, он может содержать только 2 цифры. Изменение размера декларации до 3.

  • Рассмотрим, что произойдет, если два или более значений были равны ...
+0

myNumbers [2] действительно имеет значение myNumbersp [0-2] ... – tekknolagi

+0

'int myNumbers [2]' - массив размера 2, поэтому допустимые индексы - 'myNumbers [0]' и 'myNumbers [1]'. Чтобы использовать 'myNumbers [2]' вам нужно объявить массив размером 3 (например, 'int myNumbers [3]'). –

+3

, основываясь на других комментариях, кажется, что вы ошибаетесь в размерах массива. Определение размера массива [n] делает его имеющим n 'слотов', а потому, что оно индексируется нулем, действительные индексы равны 0..n-1. –

1

lowest является bool. Разве это не должно быть чем-то большим?

2

Заменить

bool lowest; 

по

int lowest; 

, так как вы хотите, чтобы сохранить целое число в 'низком', а не логическое значение.

0

Добавление к ответам других.

У вас есть:

int myNumbers[2]; 
... 
myNumbers[2] = GetInteger(); 

это неправильно. myNumbers - это массив из 2 элементов и действительные индексы массива: 0 и 1. Поскольку вы хотите сохранить 3 элементов в массиве, измените его размер на 3.

+0

Почему это неправильно? – tekknolagi

+0

myNumbers [2] действительно содержит myNumbersp [0-2], поэтому три значения – tekknolagi

+1

Когда вы объявляете массив в C, число в скобках представляет количество элементов, а не последний индекс. –

0

Предупреждение: Ваш массив не достаточно большой. Когда вы объявляете массив, индекс не максимальный индекс массива, а число элементов, что является максимальным индексом + 1.

+0

Сколько мне нужно?это ТРИ числа – tekknolagi

+0

Число, указанное в объявлении массива, - это количество элементов, а не последний индекс. –

0

Вы можете использовать Ternary Operator (? :) Чтобы найти наименьшее количество или высокий б/w три числа с минимальное количество реляционных операторов (как вы сказали).

int low, lowest; 
low = (number[0] < number[1]) ? number[0] : number[1]; 
lowest =(low < number[2]) ? low : number[2]; 
printf("%d",lowest); 
0

Другие указали на очевидные недостатки в программе (размер массива, тип данных результата). Вот немного, что поможет вам понять индексацию массивов, в частности w hy they start from zero?

PS: Мне нравится самый рейтинговый ответ, но я советую вам прочитать весь пост.

+0

спасибо, что – tekknolagi

1

Ответ на ваш вопрос в том, что, как и многие другие указали, что вы используете низкий как тип булево, а тип номера, такие как INT, который был бы в гармонии с остальной частью вашей программы.

bool lowest; 

булевы типы, как и ожидалось, может содержать в основном два состояния: правда и ложные. По историческим причинам (т. Е. В основном из-за наследования C) логические значения были связаны с целыми числами, для которых 0 означает false, а любое другое значение означает true.

Именно поэтому булевский тип по-прежнему совместим с целыми числами (это способ сказать это), а когда вы назначаете его нулевому значению, то он содержит false. Если вы присвоите ей любую другую значение int, она будет действовать верно. Это происходит в линиях, таких, как этот:

lowest = myNumbers[0]; 

Наконец, при выполнении:

printf("\n%d", lowest); 

Обратный процесс происходит, и истинный преобразуется в Int (так вы указали % d в строке printf) и true преобразуется в 1, что является значением целочисленного значения по умолчанию для true в bool тип, когда задано его целочисленное значение: (int) true (в вашей программе: (int) lowest).

Как вы можете себе представить, более 90% значений входных целых значений будут отличаться от нуля, поэтому вы получаете 1, независимо от ввода.

0

Этот вопрос уже был дан ответ, так что я отправлю решение, которое намного проще:

int lowest = myNumbers[0]; 
if (myNumbers[1] < lowest) 
{ 
    lowest = myNumbers[1]; 
} 
if (myNumbers[2] < lowest) 
{ 
    lowest = myNumbers[2]; 
} 
printf("lowest value is: %d\n", lowest); 

Вам нужно только, что многие условия!

+0

oh wow спасибо! это было потрясающе... – tekknolagi

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