Ir ao conteúdo
  • Cadastre-se

C lógica em programação C


BeilFelix27

Posts recomendados

#include <stdio.h>

#include <stdlib.h>

 

 

int main(){ 

 

    /*Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou

    5, mas nao simultaneamente pelos dois.*/

    int valor; 

    printf("Digite um valor: "); 

    scanf("%d" ,&valor);

    if(valor%5 == 0 || valor%5 == 5 && valor%3 == 0){

        printf("Divisivel por 3 e 5");

    }

    else if(valor%5 == 0 || valor%5 == 5){

        printf("Divisivel por 5 mas nao por 3");

    }

    else if(valor%3 == 0){

        printf("Divisivel por 3 mas nao por 5");

    }

    

}    

Link para o comentário
Compartilhar em outros sites

84047389_Interrogao.png.b7a9a181492934b6f7a318af48fd4866.png

image.png.5e7602cb263896568faed639d89c1a04.pngComo te ajudar ?

Suponho que todo conteúdo de lógica quer unicamente aquele com explicação que melhor se adequar ao código.

 

 

Em C,

image.png.5e7602cb263896568faed639d89c1a04.pngoperador de negação - Not é exclamação;

image.png.5e7602cb263896568faed639d89c1a04.pngoperador lógico conectivo - E é eitza duplo;

image.png.5e7602cb263896568faed639d89c1a04.pngoperador lógico conectivo - OU é barra dupla;

image.png.5e7602cb263896568faed639d89c1a04.pngoperador aritmético que devolve o resto da divisão inteira é porcento.

 

 

Citação

Faça um programa para verificar se um determinado numero inteiro e divisível por 3 ou 5, mas não simultaneamente pelos dois.

 

Proposição

image.png.5e7602cb263896568faed639d89c1a04.pngA: (Inteiro % 3 == 0) 

image.png.5e7602cb263896568faed639d89c1a04.pngB: (Inteiro % 5 == 0)

image.png.5e7602cb263896568faed639d89c1a04.png😄 (A && B)

 

Uma resposta: (A || B) && !C 

 

 

Link para o comentário
Compartilhar em outros sites

Retornei só para posta uma codificação de exemplo que pode ser uma resposta ao não <depende da moderação>

 

C'11

#include <stdio.h>
int main (void) {
        int meu_numero_inteiro =  0;
        scanf (" %i", & meu_numero_inteiro);
        
        int const A =  (0 == meu_numero_inteiro % 3);
        int const B =  (0 == meu_numero_inteiro % 5);
        int const C =  (A && B);
        
        int const R =  ((A || B) && !C);
        printf ("%d", R);
}

 

Boa Sorte

Link para o comentário
Compartilhar em outros sites

Citação

 /*Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou

    5, mas nao simultaneamente pelos dois.*/

 

Pense bem em suas condições e escreva seu programa em torno dos dados. SEMPRE.

 

Sua terceira condição é mais abrangente e é conhecida pelo nome de ou exclusivo e tem um operador para isso, o   ^ . Em geral é abreviada por XOR

 

Assim deve escrever apenas A^B, porque pode ser só uma pegadinha esse enunciado...

 

Se
 

    int valor = n;

 

Então pode escrever sua condição como 
 

    if ( (valor%3 == 0) ^ (valor%5 == 0) ); // esse serve

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em C, os operadores lógicos são aqueles mesmo.

 

Outros semelhante são os chamados operadores bitwise.

Bitwise-Operators-i-Bitwise-operators-cannot-be-applied-to-float-or-double-They-can.png.86b95f52bef69950b11853db2f36340e.png

 

*Semelhantes não quer dizer igual.

 

Só para ter mais uma ideia errada de resposta,

Resposta: A-B

 

Ora, porque se A e B são simultaneamente de divisores então

Resposta: 1-1 = 0 (Falso)

 

Citação

Em C, tudo que não FALSO (0) é verdadeiro.

 

Contudo, 

Citação

if ( (valor%3 == 0) - (valor%5 == 0) ); //não serve

 

Mesmo sendo mais inteligente, eu não aceito.

Boa Sorte

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 horas atrás, BeilFelix27 disse:

#include <stdio.h>

#include <stdlib.h>

 

 

int main(){ 

 

    /*Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou

    5, mas nao simultaneamente pelos dois.*/

    int valor; 

    printf("Digite um valor: "); 

    scanf("%d" ,&valor);

    if(valor%5 == 0 || valor%5 == 5 && valor%3 == 0){

        printf("Divisivel por 3 e 5");

    }

    else if(valor%5 == 0 || valor%5 == 5){

        printf("Divisivel por 5 mas nao por 3");

    }

    else if(valor%3 == 0){

        printf("Divisivel por 3 mas nao por 5");

    }

    

}    

São códigos semelhantes...

C'11

#include <stdio.h>

int main (void) { 
/*  
 * Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou
 * 5, mas nao simultaneamente pelos dois.
 */

        int valor; 
        printf("Digite um valor: "); 
        scanf(" %i" , & valor);
        
        int const A =  (0 == valor % 3);
        int const B =  (0 == valor % 5);
        
        if (A && !B) printf ("Divisivel por 3 mas nao por 5"); else
        if (B && !A) printf ("Divisivel por 5 mas nao por 3"); else
        if (B &&  A) printf ("Divisivel por 5 e 3");
}    

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

15 horas atrás, Mauro Britivaldo disse:

Em C, os operadores lógicos são aqueles mesmo.

 

 

Se está sugerindo que XOR não é um operador lógico, recomento a leitura de um livro sobre isso, qualquer sobre o assunto. Ou qualquer manual de C. Para citar algo mais técnico, leia no glossário da Intel, conhecida por fabricar chips com operadores lógicos e aritméticos
 

Veja uma ilustração de lá:

 

image.png.af721c4136f7fdc28ee5fe577c775a21.png

 

De volta à questão:

 

Citação

/* * Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou * 5, mas nao simultaneamente pelos dois. */

 

Isso é chamado OU EXCLUSIVO. É uma pergunta comum em testes de emprego para estagiários.

 

E uma vez que agora está claro o que é seria ingênuo não escrever como tal e ao invés disso dar voltas pela definição.

 

Para uma bibliografia mais consagrada, recomendo 
 

An Investigation of the Laws of Thought de George Boole

 

é do século 19 mas já se sabia sobre operações lógicas. Esse autor é o pai disso tudo, e um ícone da filosofia e matemática.

 

Em C como seria?

 

 Eis o resultado 
 

image.png.b82118067b03f10162b67779a56110c2.png

 

Desse pequeno programa
 

#define _mmCRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i = 0;
    char res[2] = { 'N', 'S' }; // so 0 eh falso 
    const int valor[] =
    {
        12, 15, 18, 30, 2,
        10, 15, 20, 25, 8
    };

    printf("Divisivel por 3 ou 5 mas nao pelos dois?\n\n");
    for (i = 0; i< sizeof(valor)/sizeof(int); i+=1)
    {
        int condicao_1 = valor[i] % 3 == 0;
        int condicao_2 = valor[i] % 5 == 0;
        printf(
            "\t%4d: %c\n", valor[i],

            res[condicao_1 ^ condicao_2]
        );
    };
    printf("\n\t%d valores testados\n", i);
};

 

Note a linha 
 

            res[condicao_1 ^ condicao_2]

 

que é a condição do enunciado. Se você que está lendo isso tiver que responder algo assim numa entrevista de emprego, lembre que eu avisei ;) . George Boole criou a disciplina, chamada hoje ainda de álgebra de Boole, e praticamente todas as linguagens tem esse operador. COBOL não tem. até onde eu sei.

 

Todos os processadores tem. É essencial em criptografia pela conhecida propriedade de ser reversível.
A^B^A para todo A
 

16 horas atrás, Mauro Britivaldo disse:

Outros semelhante são os chamados operadores bitwise

 

Isso está errado :( os operadores lógicos são chamados bitwise quando operam, quem diria, com bits. Mas são operadores lógicos. Como são && || e ! para expressões. Muda o alvo, não o conceito. 

 

Leia mais sobre isso, por exemplo nos locais que citei acima e em algum livro sobre C que você aprove. Ou apenas leia a gramática de C se conhecer a notação

Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

Se está sugerindo que XOR não é um operador lógico

Não é sugestão, é uma afirmação com base no padrão C, mas se apontar na norma C outros operadores lógicos então você está certo. Por enquanto,  está errado

"

 

 

@BeilFelix27  SIm.

 
2 horas atrás, BeilFelix27 disse:

@Mauro Britivaldo  você poderia me explicar essa lógica:

                         

         int const A = (0 == valor % 3);

         int const B = (0 == valor % 5);

 

não entendi ela , se poder explicar agradeço mais uma vez

 

 

Declara-se uma constante do tipo inteiro de nome A. 

Na inicialização de A, salva-se o resultado da expressão booleano a direita.

Essa expressão tem duas etapas:

  1. Aritmética: Calcula-se o resto da divisão de valor por 3
  2. Booleano: Usando o operador relacional de igualdade (==), Se resto é igual a 0: retorna 1, senão retorna 0.

 

Na linha seguinte, tem-se o mesmo...

 

 

Declara-se uma constante do tipo inteiro de nome B. 

Na inicialização de B, salva-se o resultado da expressão booleano a direita.

Essa expressão tem duas etapas:

  1. Aritmética: Calcula-se o resto da divisão de valor por 5
  2. Booleano: Usando o operador relacional de igualdade (==), Se resto é igual a 0: retorna 1, senão retorna 0.

Agora as constantes A, e B são respectivamente a resposta para se o número é divisível inteiro por 3 e por 5.

 

Resumindo:

Se A alberga 1 então o valor é divisível inteiro por 3

Se B alberga 1 então o valor é divisível inteiro por 5

 

Depois basta aplicar os operadores lógicos  (&&, ||)

C'11

#include <stdio.h>

int main (void) { 
/*  
 * Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou
 * 5, mas nao simultaneamente pelos dois.
 */

        int valor; 
        printf("Digite um valor: "); 
        scanf(" %i" , & valor);
        
        int const A =  (0 == valor % 3);
        int const B =  (0 == valor % 5);
        
        if (A && !B) printf ("Divisivel por 3 mas nao por 5 \n"); else
        if (B && !A) printf ("Divisivel por 5 mas nao por 3 \n"); else
        if (B &&  A) printf ("Divisivel por 5 e 3 \n");
        
        if ((!B && A) || (B && !A)) printf ("Divisivel por 3 ou 5 \n");
}    

 

Se precisar mais explicação fale.

Até ...

"

 

Link para o comentário
Compartilhar em outros sites

5 horas atrás, Mauro Britivaldo disse:

Não é sugestão, é uma afirmação com base no padrão C, mas se apontar na norma C outros operadores lógicos então você está certo. Por enquanto,  está errado

 

Eu mostrei o porque. mostrei quem criou a Álgebra de Boole, e deve imaginar que o nome Bool vem de George Boole e que a álgebra de Boole vem do trabalho desse cidadão e em especial do livro que eu citei. Te mostrei no glossário da Intel quais são os operadores lógicos. e lá estão eles de novo.

 

Mesmo que você não tenha nenhuma formação matemática pode achar essa leitura interessante, o referido livro.

 

Entenda que em C os tais operadores bitwise só tratam bits e tem os lógicos, cuja lista imagino que já saiba, AND OR NOT e  XOR e os de shift que deslocam bits. Seria redundante ficar acrescentando que eles são lógicos porque se imagina que todo mundo saiba, apesar da intel ter colocado no glossário, quais são os operadores. 
 

Talvez saiba que todos os processadores tem essas instruções lógicas 

Ou fosse pesquisar no Google por eles. Olha só a primeira página no Google pesquisando por isso
xor.png.f4b4fb417f5398e08376f50ab25037d2.png

 

pois é: nem precisa abrir a pesquisa.

 

Acho que só quer criar polêmica afinal

 

 

Postei um exemplo da solução e a linha em questão é óbvia
 

image.png.ab4bd0334e10342b663dfcc251b64a5c.png

 

Claro que é equivalente ao código que postou
 

        
        int const A =  (0 == meu_numero_inteiro % 3);
        int const B =  (0 == meu_numero_inteiro % 5);
        int const C =  (A && B);
        
        int const R =  ((A || B) && !C);

 

Ou esse que é mais comum e simples
 

       
		int const C =  (A && !B) || (B && !A); // a definicao de ou exclusivo

 

No entanto se espera que o aluno (ou o candidato, é uma pergunta comum em teste de emprego)  aluno perceba que se trata de XOR e escreva o óbvio
 

		int const C =  A ^ B; // o obvio, desde George Boole, 
        // no seculo XIX, antes do bool, do C, do FORTRAN


Para uma coisa que está nos livros desde o século XIX devia ser mais fácil de você aceitar.
 

image.png.cef3773abd9cd1a30239d85c79c32a98.png
Eis a tabela, como em todo processador. Cortesia de https://en.wikipedia.org/wiki/Bitwise_operations_in_C#Bitwise_XOR_^

 

Sobre não ter um operador ^^ apesar de ter && e ||  pode ser que "aceite" a opinião de Dennis Ritchie, o criador da linguagem, como está no C`FAQ em c-faq.com/misc/xor.dmr.html 

 

Estou citando isso tudo porque outros podem estar lendo isso e o seu aparente interesse em criar polêmica com qualquer coisa ao ponto de não aceitar algo como Álgebra de Boole possa distrair outros da simples e descomprometida informação de o que é o que.

 

Citação

Em resumo XOR existe e o operador em C, C# e C++, as 3 linguagens neste forum,  é ^. Assim como em java e javascript por exemplo

 

 

image.png

Link para o comentário
Compartilhar em outros sites

Pelo que todos sabem os operadores lógicos em c são (&&, || e !), de acordo com a Norma atualizada em 2020 e do dialeto C'18 [6.5.14-15] ISO/IEC 1990-2018.: Continuo orientando por esse Padrão que até o momento é a escolha mais certa quando faz distinção entre operadores para lógica e para bits (bitwise).

 

Agora, Sr.

 

Se realmente deseja fazer algo em relação a isso, proponha mudanças na redação do Padrão C. [eu duvido que consiga]

"

Link para o comentário
Compartilhar em outros sites

@BeilFelix27 Uma resposta simplesmente correta

é usando operador relacional desigual (!=).

 

C'11

#include <stdio.h>

int main (void) { 
/*  
 * Faça um programa para verificar se um determinado numero inteiro e divisivel por 3 ou
 * 5, mas nao simultaneamente pelos dois.
 */

        int valor; 
        printf("Digite um valor: "); 
        scanf(" %i" , & valor);
        
        int const A =  (0 == valor % 3);
        int const B =  (0 == valor % 5);
        
        if (A && !B) printf ("Divisivel por 3 mas nao por 5 \n"); else
        if (B && !A) printf ("Divisivel por 5 mas nao por 3 \n"); else
        if (B &&  A) printf ("Divisivel por 5 e 3 \n");
        
        if (A !=  B) printf ("E Divisivel por 3 ou 5 \n");
}    

 

Tem o mesmo resultado e está de acordo.

"

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...