Erro de lógica em codigo C

1. Erro de lógica em codigo C

JoaoVictor Azeredo de Morais
joaovcc

(usa Outra)

Enviado em 11/03/2022 - 12:12h

Tenho esse exercício da facul em C e falta so um detalhe de lógica que nao consigo achar o erro. O programa deve ler 3 numeros digitados pelo usuario e coloca-los em ordem crescente e dizer se o maior deles é par ou impar. Meu codigo coloca em ordem crescente certinho, le os numeros, mas quando é pra dizer se é par ou impar ele diz que o numero é impar quando é par e vice-versa. As funções tem que ser void, e int como estão ai e tem que ser usados os ponteiros. Segue o código abaixo:



#include <stdio.h>

void Ler(int *n1,int *n2,int *n3);
void Ordenar(int *menor,int *meio,int *maior);
int Par(int num);

int main(void){

int num1,num2,num3,par;
char opc;

do {

Ler(&num1,&num2,&num3);
Ordenar(&num1,&num2,&num3);
par= Par(num3);

if(par%2==0){
printf("( par)");
}else{
printf("( Impar)");

}
fflush(stdin);
printf("\nQuer continuar? (S/N)");
scanf(" %c",&opc);

} while(opc=='S' || opc=='s');

return 0;
}

void Ler(int *n1,int *n2,int *n3){
printf("\n\nExercicio 1\n\n");
printf("Digite tres numeros inteiros: ");
scanf("%d", n1);
scanf("%d", n2);
scanf("%d", n3);
}

void Ordenar(int *menor,int *meio, int *maior){
if((*menor>=*meio) && (*menor>=*maior)){
if(*meio>=*maior){
printf("\nOs numeros ordenados sao: %d,%d,%d",*maior,*meio,*menor);
}else{
printf("\nOs numeros ordenados sao: %d,%d,%d",*meio,*maior,*menor);
}
}else if((*meio>=*menor) && (*meio>=*maior)){
if(menor>=maior){
printf("\nOs numeros ordenados sao: %d,%d,%d",*maior,*menor,*meio);
}else{
printf("\nOs numeros ordenados sao: %d,%d,%d",*menor,*maior,*meio);
}
}else if((*maior>=*menor) && (*maior>=*meio)){
if(*menor>=*meio){
printf("\nOs numeros ordenados sao: %d,%d,%d",*meio,*menor,*maior);
}else{
printf("\nOs numeros ordenados sao: %d,%d,%d",*menor,*meio,*maior);
}
}
}

int Par(int num){

if(num%2==0){
return 1;
}else{
return 0;
}
}




  


2. Re: Erro de lógica em codigo C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/03/2022 - 15:35h

Se você tem uma função para testa se o número é par e informa o resultado do teste, por que pega novamente o resultado retornado pela função e testa novamente se esse resultado é par? Eu diria que você pode simplesmente usar o resultado da função, sem nenhuma outra manipulação, para decidir qual mensagem imprimir.


Dito isso, eu me pergunto se você seguiu corretamente o que o enunciado do seu exercício pedia. Por exemplo, pelo que você colocou em sua mensagem, a instrução era “colocá-los em ordem crescente e dizer se o maior deles é par ou ímpar”, e acho que você teve o sentimento de que deveria ter uma função de ordenação para isso, recebendo elementos que são ponteiros, que são ideias absolutamente corretas. Entretanto, sua função de ordenação não ordena realmente os números lidos, mas apenas os imprime de forma ordenada, de modo que, quando você realiza o teste de paridade, faz esse teste sobre o terceiro número lido originalmente, não sobre o terceiro elemento de uma sequência que foi efetivamente ordenada de modo crescente.

Outros pontos menores:

  • fflush(stdin) é uma construção não padronizada†. Evite usá-la (ou, dizendo de maneira devidamente enfática, nunca a use), preferindo sempre formas padronizadas de lidar com caracteres presentes na entrada que não sejam do seu interesse (em tempo: você já faz isso, quando coloca um espaço em branco antes de especificar a conversão %c para ler a opção de se o usuário quer repetir a execução ou não).

  • Ao testar a paridade de um número inteiro com uma operação tal como num%2 ou num&1 (esta última podendo ser muito mais eficiente em compiladores que não têm otimização de código), você já tem um valor que só pode produzir como saída os valores 0 e 1. Fica, então, um bocado redundante ter algo como if(num&1!=0){ return 1; } else { return 0; }: toda essa construção poderia ser substituída por return num&1; (ou, no caso de você inverter a condição de teste num suposto if para num&1==0, pode usar a expressão de retorno 1-(num&1) ou !(num&1)).

  • Testar a paridade é uma operação tão simples (a sua versão tem apenas um teste com if, mas que pode ser reduzido ainda mais para se tornar apenas uma expressão, como se viu acima) que é um desperdício ter uma função para ela. Compiladores espertos (a maioria dos que nós usamos nos nossos PCs com Linux ou Windows hoje em dia) provavelmente já fazem isso automaticamente, mas possivelmente ainda vale a pena indicar que tal função pode ser inline‡, de modo a tentar economizar o custo potencialmente muito mais alto de chamar a função do que o custo da operação que ela realiza.

----
† O padrão do C somente especifica o comportamento de fflush() para fluxos de saída de dados, deixando indefinido o comportamento que a função pode ter em fluxos de entrada. Quando um comportamento não é definido, cada implementação pode decidir agir de um modo diferente de outras implementações (desde, é claro, que ela não deixe de implementar de forma correta as partes que têm comportamento definido). No seu sistema, provavelmente fflush(stdin) realiza um descarte de dados de leitura que já tenham sido recebidos mas ainda não consumidos, mas outra implementação pode escolher não fazer coisa alguma, ou agir como se fosse um fluxo de saída e gerar algum efeito estranho, ou dar pau no programa ou no sistema operacional, ou, exercitando bastante a imaginação, até mesmo reapontar para a sua casa todos os mísseis nucleares do arsenal russo, e ainda ser considerada de acordo com o padrão. Por isso o bom conselho é sempre fugir de comportamentos indefinidos.

‡ Uma função é dita inlined quando seu conteúdo (tipicamente pequeno) é substituído diretamente no código que indica uma chamada a tal função, em lugar de provocar uma passagem de argumentos como parâmetros e um desvio do fluxo de execução para outra região de memória, seguida pela limpeza dos argumentos passados como parâmetros. Por exemplo, com um compilador que faça inlining, a compilação dos dois códigos abaixo produziria exatamente o mesmo resultado.
inline void imprime_dobro(int n){ printf("%d", n+n); }

int main(void){
int num1, num2;
/* ... */
imprime_dobro(num1);
imprime_dobro(num2);
/* ... */
}
int main(void){
int num1, num2;
/* ... */
{ printf("%d", num1+num1); }
{ printf("%d", num2+num2); }
/* ... */
}



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts