Ir ao conteúdo
  • Cadastre-se

C Questão com condicionais em C


kampa896

Posts recomendados

Bom dia, pessoal. Estou com um problema em uma questão em C. Este exercício faz parte de um site de desafios de programação. Eu fiquei um tempo sem estudar por causa do serviço e estou voltando agora. A questão é a seguinte:

 

Tio Patinhas era um milionário que vivia em sua mansão, e tinha três sobrinhos: Huguinho, Zezinho e Luisinho. Ele se confundia facilmente entre os três sobrinhos, pois eram bem parecidos, apesar de terem idades diferentes. Um dia, os três fizeram uma aposta com o tio: se ele acertasse quem era o sobrinho do meio, ou seja, nem o mais novo, nem o mais velho, eles dariam uma moeda de ouro para ele, e se ele errasse, teria que dar uma moeda de ouro para cada um. Assim, o tio pede a tua ajuda para que ele possa ganhar essa aposta.

Entrada

A entrada consiste em vários casos de teste. Cada caso contém três valores inteiros H, Z e L, que representam as idades de Huguinho, Zezinho e Luisinho, respectivamente. 

Saída

Para cada caso de teste imprima o nome do sobrinho do meio, com letras minúsculas.

 

5 6 7

zezinho

7 5 6

luisinho

6 7 5

huguinho

 

#include <stdio.h>

int main() {

    int H, Z, L;
    char h[] = "huguinho", z[] = "zezinho" , l[] = "luisinho", enter;

    while(scanf("%d %d %d%c", &H, &Z, &L, &enter) != EOF){
        if(H < Z && Z < L){
            printf("%s\n", z);
        }
        else if(Z < L && L < H){
            printf("%s\n", l);
        }
        else{
            printf("%s\n", h);
        }
    }

    return 0;
}

 

De acordo com o site dos desafios, meu código apresenta 15% de erro do código correto. Alguém poderia me dar uma ajuda? Realizando alguns testes, a resposta sempre bate com a correta.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, kampa896 disse:

Realizando alguns testes, a resposta sempre bate com a correta

 

Que seriam "alguns testes"?

 

São 3 elementos, 2 a 2 são 3x2x1 = 3! o popular fatorial de 3, 6 possibilidades, então para teste.txt 

 

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2 
3 2 1

 

E com seu programa chamado tst vem

 

 cat teste.txt | ./tst
zezinho
huguinho
huguinho
huguinho
luisinho
huguinho

 

Sempre bate com a resposta? 🤔 São só 6, porque não testou com todas? O site por certo testa com todas.

 

Como são 6 possibilidades acho que não podia mesmo estar certo com 3 if apenas

 

Sobre seu programa:

 

    while(scanf("%d %d %d%c", &H, &Z, &L, &enter) != EOF) //...

 

Não precisa dessas coisas. Para scanf() e família o que importa é whitespace, então enter é a mesma coisa que TAB e espaço. Testou isso?

 

    char h[] = "huguinho", z[] = "zezinho" , l[] = "luisinho", enter;

    while(scanf("%d %d %d", &H, &Z, &L) != EOF){
        if(H < Z && Z < L){
            printf("%s\n", z);
        }
        else if(Z < L && L < H){
            printf("%s\n", l);
        }
        else{
            printf("%s\n", h);
        }
    }

 

Se usa as variáveis h z e l só para o printf() porque declarar?

 

Declare uma variável por linha, é grátis. Nem todo programa vai ter 20 linhas.

 

Não teste scanf() com EOF. Não é um bom hábito. O que você quer é 3. Teste com != 3

 

 

 

 

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

 

Imagino que já resolveu o que estava errado, e então compare com isso, que faz a mesma coisa

 

#include <stdio.h>
int main(void)
 {
    int H, Z, L;
    while( 3 == scanf("%d %d %d", &H,&Z,&L) )
    {
        // quando o primeiro e o do meio? H
        // tem que ser 2 ZHL ou LHZ
        if ( (H > Z && H < L) || (H > L && H < Z) )
        {
            printf("huguinho\n");
            continue;
        }
        
        // recortar e colar para os outros 2 casos

        // quando o segundo e o do meio? Z
        // tem que ser 2 HZL ou LZH
        if ( (Z > H && Z < L) || (Z > L && Z < H) )
        {
            printf("zezinho\n");
            continue;
        }
        // alguém tem que ser o do meio:
        // não e o primeiro
        // não e o segundo
        printf("luizinho\n");
    };  // while()

    return 0;
}

 

Ou esse minimalista

 

#include <stdio.h>
int main(void)
 {
    int H, Z, L;
    while( 3 == scanf("%d %d %d", &H,&Z,&L) )
    {   // quando o primeiro e o do meio? ZHL ou LHZ
        if ( (H > Z && H < L) || (H > L && H < Z) )
            printf("huguinho\n");
        else // quando o segundo e o do meio? HZL ou LZH
            if ( (Z > H && Z < L) || (Z > L && Z < H) )
                printf("zezinho\n");
            else // alguém tem que ser o do meio...
                printf("luizinho\n");
    };  // while()
}

 

Entenda: testa 4 condições, porque afinal alguém tem que ser o do meio.

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

como chegaram primeiro, apenas deixo uma dica pra agilizar sua vida.
use testes pra você não precisar ficar digitando na mão.
lembre-se que o resultado dos problemas depende da ordem em que entram os dados.
Pra ver tudo isso e fazer mais rápido tente usar testes assim:
 

#include <stdio.h>
int main() 
{
	// ordem de entrada:
	char *nomes[3] = {"huguinho", "zezinho" , "luisinho"};
	// teste que representa a ordem das idades dadas
	// se a primeira coluna for h, segunda z, e terceira l:
	int array[6][3] = {
		{0, 1, 2}, 
		{0, 2, 1}, 
		{1, 0, 2}, 
		{1, 2, 0}, 
		{2, 0, 1},
		{2, 1, 0} 
	};
	int h;
	int z;
	int l;
	for (int i=0; i<6; i++)
	{
		h = array[i][0];
		z = array[i][1];
		l = array[i][2];
		if( (h<z && z<l) || (l<z && z<h) )
		{
			printf("%s\n", nomes[1]);
		}

		else if( (h<l && l<z) || (z<l && l<h) )
		{
			printf("%s\n", nomes[2]);
		}

		else if( (z<h && h<l) || (l<h && h<z) )
		{
			printf("%s\n", nomes[0]);
		}
	}
	return 0;
}

 Ou como preferir...

  • Obrigado 1
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...