цикл массива не работает правильно? C ++ - PullRequest
3 голосов
/ 02 апреля 2010

Попытка подсчитать, сколько элементов в массиве не равно 0, что-то настроено неправильно?

Я хотел бы проверить все значения в массиве (это доска судоку), а затем, когда все элементы заполнены, мне нужно вернуть true. Что-то выключено?

bool boardFull(const Square board[BOARD_SIZE][BOARD_SIZE])
{
    int totalCount=0;
    for (int index1 = 0; index1 < BOARD_SIZE; index1++)
        for (int index2 = 0; index2 < BOARD_SIZE; index2++){ 
             if(board[index1][index2].number!=0)
                totalCount++;
        }
    if(totalCount=81)
        return true;
    else 
        return false;

Ответы [ 4 ]

12 голосов
/ 02 апреля 2010

У вас есть =, а не ==

if (totalCount == 81)

- правильная строка.

Выполнение этого с одним «=» фактически присваивает значение totalCount 81, поэтому ваш тест очень важен:

if (81)

А поскольку в C ++ все ненулевое значение истинно, это всегда верно

1 голос
/ 02 апреля 2010

У вас есть =, который должен быть ==. Это все, что я скажу, поскольку это домашнее задание.

Кроме того, почему у вас есть константа для BOARD_SIZE, а затем проверьте с 81 в конце? Разве проверка против BOARD_SIZE * BOARD_SIZE не будет лучше?

0 голосов
/ 02 апреля 2010

Вы можете выйти из функции, как только найдете первые 0, и это можно решить с помощью одного цикла:

bool boardFull(const Square board[BOARD_SIZE][BOARD_SIZE])
{
    const Square* p = board[0];
    for (int n = BOARD_SIZE * BOARD_SIZE; n; --n, ++p)
    {
        if (p->number == 0) return false;
    }
    return true;
}

Но я предпочитаю алгоритмы рукописным циклам:

struct Square
{
    int number;

    bool is_zero() const
    {
        return number == 0;
    }
};

#include <algorithm>
#include <functional>

bool boardFull(const Square board[BOARD_SIZE][BOARD_SIZE])
{
    return std::find_if(
        board[0],
        board[BOARD_SIZE],
        std::mem_fun_ref(&Square::is_zero)
    )== board[BOARD_SIZE];
}
0 голосов
/ 02 апреля 2010

Является ли If (totalCount = 81) опечаткой в ​​этом сообщении или в вашем коде? Похоже, вы там присвоили значение.

...