Como usar correctamente as funções booleanas?

Estou a ter problemas com a seguinte missão, principalmente porque não entendo como funciona uma função booleana. "Write a function called Divisible that takes in two numbers as parameters. Devolve verdadeiro se o primeiro número for uniformemente divisível (nenhum restante) pelo segundo número. Caso contrário, devolve falso. Sugestão: Usar % "

actualmente, o que tenho é:

int Divisible()
{
     int firstNum;
     int secondNum;
     int result;
     cout << "Please enter any integer: ";
     cin >> firstNum;
     cout << "Please enter another integer: ";
     cin >> secondNum;
     result == firstNum%secondNum;
}
Não sei o que fazer para além disso. Eu pensei que poderia atribuir bool = 0 como verdadeiro, mas isso não parece ser caso. Ainda sou muito novo em C++, por isso qualquer ajuda seria apreciada.

 2
c++
Author: Fredrik E, 2014-02-06

7 answers

A pergunta pede-lhe para escrever um método que tome os números como parâmetros, NÃO vamos introduzi-los a partir da entrada padrão.

O booleano é um tipo próprio em C++, por isso quer que o método devolva o bool e não o int. Uma solução fácil de ler:

bool Divisible(int a, int b) {
    int remainder = a % b; // Calculate the remainder of a and b.

    if(remainder == 0) {
        return true; //If the remainder is 0, the numbers are divisible.
    } else {
        return false; // Otherwise, they aren't.
    }
}

Ou mais conciso:

bool Divisible(int a, int b) {
    return (a % b) == 0;
}

Ainda mais conciso:

bool Divisible(int a, int b) {
    return !(a % b);
}
 3
Author: Fredrik E, 2014-02-06 16:19:37

Nos métodos que devolvem o booleano, você quer primeiro determinar qual será o valor do resultado quando o método retornar verdadeiro, e então usar o operador == para avaliar qualquer resultado que você obtém contra o resultado aceitável.

Então, no teu caso, estás a tentar determinar se deves devolver verdadeiro ou falso, dependendo se o primeiro número é divisível uniformemente pelo segundo.

A primeira coisa a fazer é pegar num caso que deve funcionar., ex:
  • 4, 2
Como é que sabes que 4 é divisível por 2? Bem, isto significa que se eu dividir 4 por 2, então o resto deve ser zero. Isto é o que o operador % devolve. Se o fizer 4 % 2 o valor é zero.

Ok então agora você tem o Resultado Correto então o que você simplesmente faz agora é avaliar qualquer resultado que você obtém contra o resultado aceito assim:

int isDivisible(int a, int b)
{
    const int acceptedAnswer = 4 % 2;
    if ( a % b == acceptedAnswer )
        return 1;
    return 0;
}
E aí tens, qualquer valor que tenhas que não iguale a tua resposta aceite. voltará 0 ou not equal (!=) e qualquer outra resposta voltará 1 ou equal (==)
 1
Author: smac89, 2014-02-06 16:26:50

Ao criar funções ou usá-las, lembre-se sempre de começar com a assinatura.

Pense com o que esta função precisa de trabalhar, e com o que irá voltar. Você precisa retornar se algo é verdadeiro ou falso, que são valores do tipo de dados bool. Assim como em uma declaração condicional tal if você pode usar operadores booleanos como ==, != e etc.

Então você precisa retornar um bool e verificar se dois números são divisíveis. Portanto:

bool Divisible(int a, int b){

          // == boolean operator that will return true if a%b evaluates to 0
          // false if not
          return (a % b) == 0 
}
Uma vez que você comece a pensar em funções desta forma, cada programa se torna um grande quebra-cabeça!
 1
Author: , 2015-02-13 21:18:23

Você não retorna, ou atribui um resultado...

result = firstNum%secondNum;
return (result == 0); // Assuming you want 0 as true.

Em geral, o valor 0 é falso e qualquer valor que não é (!0) é verdadeiro. Por convenção, isto é 1.

 0
Author: Elliott Frisch, 2014-02-06 16:10:44

O que fez está correcto, mas na última linha está a comparar um inteiro não inicializado com o resultado (resto da divisão).

Conjunto int result=0; e depois fazer isto:

return result==firstNum%secondNum; // checks if remainder is zero (true if zero)

Você também poderia simplesmente fazer return (firstNum%secondNum)==0

Além disso, a sua atribuição pede uma função que assume dois números como parâmetros (argumentos de entrada). Então o seu protótipo de função deve ser algo como:

bool Divisible(int a, int b);

E você deve usar a e b na função em vez de receber dados do stdin como estás a fazer agora.

 0
Author: Wajahat, 2014-02-06 16:11:08

bool é um tipo que pode conter apenas dois valores: true e false. Você o usa para expressar valores de verdade, como se um número divide outro ou não.

No seu caso, a função poderia ter sido implementada do seguinte modo:

bool is_divisible(int a, int b)
{
    return a % b == 0;
}
 0
Author: , 2014-02-06 16:14:01

Na atribuição está escrito claramente que a função deve ter dois parâmetros. Assim, a função poderia ser vista da seguinte forma (C++)

inline bool Divisible( int n, int m ) { return ( n % m == 0 ); }

Ou (C)

inline _Bool Divisible( int n, int m ) { return ( n % m == 0 ); }

No último caso pode substituir o tipo de devolução _Bool por int. No primeiro caso que é quando C++ é usado, é melhor usar o tipo de retorno bool. O pedido de inscrição de dois números deve estar fora da função. A função apenas permite determinar se um número é divisível por outro número.

 0
Author: Vlad from Moscow, 2014-02-06 16:19:31