найти среднее число в C - PullRequest
       2

найти среднее число в C

4 голосов
/ 03 февраля 2011

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

#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;

}

Ответы [ 9 ]

3 голосов
/ 03 февраля 2011

Несколько проблем:

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

  • myNumbers[2] - массив размера 2, он может содержать только 2 числа.Измените объявление размера на 3.

  • Посмотрите, что произойдет, если два или более значений будут равны ...
2 голосов
/ 03 февраля 2011

Заменить

bool lowest;

по

int lowest;

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

1 голос
/ 03 февраля 2011

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

bool lowest;

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

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

lowest = myNumbers[0];

Наконец, когда вы выполните:

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

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

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

1 голос
/ 03 февраля 2011

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

0 голосов
/ 04 февраля 2011

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

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 голосов
/ 03 февраля 2011

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

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

0 голосов
/ 03 февраля 2011

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

int low, lowest;
low = (number[0] < number[1]) ? number[0] : number[1];
lowest =(low < number[2]) ? low : number[2];
printf("%d",lowest);
0 голосов
/ 03 февраля 2011

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

0 голосов
/ 03 февраля 2011

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

У вас есть:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...