Executando verificação de segurança...
2

Duvida exercicio em C

Estou estudando um pouco de C (o básico até agora) e hoje resolvi fazer um pequeno exercício. Resumo: Usuário insere um valor e o programa retorna as cédulas que ele poder ter com o valor inserido (sendo as cédulas: 1, 5, 10, 50, 100).
Como da pra ver no fim do "case" estou utilizando uma função recursiva, até o momento aparenta quase tudo estar certo, mas me deparei com algo que me deixou confuso, pois pra qualquer valor que eu colocar, o máximo que o programa retorna para cada cédula é 1, seguindo o formato que está abaixo, porém se eu tirar o operador pipe "||" o programa armazena corretamente, por que isso acontece ?

Pequena explicação de como está a estrutura do programa
Tem uma função que executa todos os cálculos, ela é chama na main() e recebe 2 parâmetros: o valor inserido e o tamanho do array (para que percorra corretamente todos os valores de cédulas.
Cada cédula possui uma variável que armazena sua quantidade que será retornada, são declaradas no topo da função.

Exemplo do código que calcula a quantidade de cédulas, única coisa de uma cédula para outra (no código) são os valores

if(value){
    case 100:
    {
        printf("case = 100");
        resto = value%cedulas[cont];
        qtd100 = value / cedulas[cont] || 0;
        printf("\n%d\n", qtd100);
        return conta(resto, cont -1);
    }
}

Revisando o codigo consigo ver que nao tem porque usar o pipe nessa situacao, mas mesmo assim fiquei curioso do porque disso acontecer

Carregando publicação patrocinada...
6

Em outra resposta vc disse:

Sobre o pipe, ele não é utilizado como um "ou" ? No sentido de que tipo, sla, por algum motivo a divisão n de certo a variavel vai ser = 0, é o que eu me lembro

Mas não é assim que funciona. Se a divisão não der certo (por exemplo, se dividir por zero), vai dar erro. Ele não vai magicamente setar o outro valor.

Se vc não tem certeza sobre como algo funciona, a primeira coisa a fazer antes de sair usando é ler a documentação - no caso do operador ||, está aqui. Ele é o operador lógico "ou", mas não do jeito que vc imaginou. Ele retorna 1 se alguma das expressões for verdadeira (e em C, qualquer valor diferente de zero é considerado verdadeiro), e retorna 0 se as expressões forem falsas (no caso, se o valor delas for zero).

Ou seja, value / cedulas[cont] || 0 sempre vai retornar 1 ou 0, pois esses são os valores que o operador || retorna. Se o primeiro operando (value / cedulas[cont]) for zero, o resultado da expressão será 0 || 0, que é zero. Mas se value / cedulas[cont] for diferente de zero, o resultado será valor_diferente_de_zero || 0, que resulta em 1.

Por isso não faz sentido usar || neste caso.


Outro ponto é que eu não usaria recursão, e sim um loop. Embora "funcione", é importante entender que muitos problemas são melhor resolvidos sem recursão - na verdade, a esmagadora maioria dos problemas que vc for resolver no dia-a-dia não precisa de recursão.

Olha só como um loop é simples:

int notas[] = {100, 50, 10, 5, 1};
int valor = 378;

for (int i = 0; i < 5; i++) {
    int nota = notas[i];
    if (valor >= nota) {
        int qtd = valor / nota;
        printf("%d notas de %d\n", qtd, nota);
        valor %= nota;
        if (valor == 0) // valor zerou, não precisa mais verificar notas e sai do for
            break;
    }
}

Claro que não estou considerando casos mais complexos, como por exemplo limitar a quantidade disponível de cada nota (se só tiver uma nota de 100, teria que usar mais notas de 50 ou de 10, por exemplo). Mas ainda sim, para fazer essa alteração não precisa de recursão (e usá-la não deixaria mais fácil, muito pelo contrário).

2

Eae pedrao, eu tambem estou iniciando em C, mas vou tentar responder sua pergunta

suponha:

value = 350; cedulas[cont] = 100;

então o teu code vai calcular quantas celulas
value / cedulas[cont]
350 / 100 = 3

3 || 0,

true || false = 1

o operador pipe compara dois valores, e diz se true(1) é verdadeiro, ou false(0) é falso,
ah vale lembrar que C cosidera tudo verdadeiro que é diferente de 0

pra ser sincero, não entendi muito bem porque você quis usar o pipe, talvez garantir que não haja divisão por 0, mas isso você deveria fazer no inicio do bloco, ou na entrada na função.

1

Obrigado pela resposta primeiramente.
Essa questão do 0 fui perceber só depois kkkk.
Sobre o pipe, ele não é utilizado como um "ou" ? No sentido de que tipo, sla, por algum motivo a divisão n de certo a variavel vai ser = 0, é o que eu me lembro plmns.

1
0