Ir ao conteúdo

Posts recomendados

Postado

O programa recebe nome, local e valor do ingresso de 4 eventos e deve retornar qual é o evento mais barato e o mais caro. Contudo, o programa não está retornando nenhum dos printf e não sei o motivo.

 

#include <stdio.h>
#include <stdlib.h>
#define N 4

    typedef struct{
        char nome[50];
        char local[50];
        int valor;
    }ingresso;

int main(void){
    
    ingresso a1, a2, a3, a4;
    int valor1, valor2, valor3, valor4;
    
    fgets(a1.nome, 50, stdin);
    fgets(a1.local, 50, stdin);
    scanf("%d", &a1.valor);
    
    fgets(a2.nome, 50, stdin);
    fgets(a2.local, 50, stdin);
    scanf("%d", &a2.valor);

    fgets(a3.nome, 50, stdin);
    fgets(a3.local, 50, stdin);
    scanf("%d", &a3.valor);
    
    fgets(a4.nome, 50, stdin);
    fgets(a4.local, 50, stdin);
    scanf("%d", &a4.valor);
    
    valor1 = a1.valor;
    valor2 = a2.valor;
    valor3 = a3.valor;
    valor4 = a4.valor;
    
    if(valor1 < valor2 && valor3 && valor4){
        printf("Mais Barato: %s (R$%d.00)", a1.nome, a1.valor);
    }   
    else if(valor2 < valor1 && valor3 && valor4){
        printf("Mais Barato: %s (R$%d.00)", a2.nome, a2.valor);
    }
    else if(valor3 < valor1 && valor2 && valor4){
        printf("Mais Barato: %s (R$%d.00)", a3.nome, a3.valor);
    }
    else if(valor4 < valor1 && valor2 && valor3){
        printf("Mais Barato: %s (R$%d.00)", a4.nome, a4.valor);
    }
    
    
    if(valor1 > valor2 && valor3 && valor4){
        printf("Mais Caro: %s (R$%d.00)", a1.nome, a1.valor);
    }
    else if(valor2 > valor1 && valor3 && valor4){
        printf("Mais Caro: %s (R$%d.00)", a2.nome, a2.valor);
    }
    else if(valor3 > valor1 && valor2 && valor4){
        printf("Mais Caro: %s (R$%d.00)", a3.nome, a3.valor);
    }
    else if(valor4 > valor1 && valor2 && valor3){
        printf("Mais Caro: %s (R$%d.00)", a4.nome, a4.valor);
    }
    
  return 0;
}

 

  • Haha 1
Postado

@immoraesz

Que tecla você aperta quando finaliza a leitura?

Essa tecla não é um número, de nada interessa na leitura e gravação de um valor inteiro.

Acaba sendo lida e gravada na string por fgets(). Já te foi mostrado como solucionar isso, mas você não lê nada.

Dica: Imprima instruções para que o usuário saiba o que deve fazer em seu programa, não há como adivinhar o que se deve inserir 🤪

Talvez dessa forma possa visualizar onde está errando.

Postado

@Lucca Rodrigues cara, o programa recebe os valores (nome, local e valor) automaticamente. A compilação é automática, no meu caso, se eu colocar os printf vai estar errado. Eu sei a necessidade dele em um programa que não gera os dados automaticamente, pois realmente, ninguém é adivinha. O erro do meu programa é que os condicionais estão sendo ignorados por alguma razão. Com isso, não recebo qual é o mais barato e mais caro.

  • Haha 1
Postado
2 horas atrás, immoraesz disse:

O programa recebe nome, local e valor do ingresso de 4 eventos e deve retornar qual é o evento mais barato e o mais caro. Contudo, o programa não está retornando nenhum dos printf e não sei o motivo.

 

#include <stdio.h>
#include <stdlib.h>
#define N 4

    typedef struct{
        char nome[50];
        char local[50];
        int valor;
    }ingresso;

int main(void){
    
    ingresso a1, a2, a3, a4;
    int valor1, valor2, valor3, valor4;
    
    fgets(a1.nome, 50, stdin);
    fgets(a1.local, 50, stdin);
    scanf("%d", &a1.valor);
    
    fgets(a2.nome, 50, stdin);
    fgets(a2.local, 50, stdin);
    scanf("%d", &a2.valor);

    fgets(a3.nome, 50, stdin);
    fgets(a3.local, 50, stdin);
    scanf("%d", &a3.valor);
    
    fgets(a4.nome, 50, stdin);
    fgets(a4.local, 50, stdin);
    scanf("%d", &a4.valor);
    
    valor1 = a1.valor;
    valor2 = a2.valor;
    valor3 = a3.valor;
    valor4 = a4.valor;
    
    if(valor1 < valor2 && valor3 && valor4){
        printf("Mais Barato: %s (R$%d.00)", a1.nome, a1.valor);
    }   
    else if(valor2 < valor1 && valor3 && valor4){
        printf("Mais Barato: %s (R$%d.00)", a2.nome, a2.valor);
    }
    else if(valor3 < valor1 && valor2 && valor4){
        printf("Mais Barato: %s (R$%d.00)", a3.nome, a3.valor);
    }
    else if(valor4 < valor1 && valor2 && valor3){
        printf("Mais Barato: %s (R$%d.00)", a4.nome, a4.valor);
    }
    
    
    if(valor1 > valor2 && valor3 && valor4){
        printf("Mais Caro: %s (R$%d.00)", a1.nome, a1.valor);
    }
    else if(valor2 > valor1 && valor3 && valor4){
        printf("Mais Caro: %s (R$%d.00)", a2.nome, a2.valor);
    }
    else if(valor3 > valor1 && valor2 && valor4){
        printf("Mais Caro: %s (R$%d.00)", a3.nome, a3.valor);
    }
    else if(valor4 > valor1 && valor2 && valor3){
        printf("Mais Caro: %s (R$%d.00)", a4.nome, a4.valor);
    }
    
  return 0;
}

 

Solucionei o problema.

 

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

    typedef struct{
        char nome[100];
        char local[100];
        int valor;
    }ingresso;

int main(void){
    
    int valor1, valor2, valor3, valor4;
    
    ingresso a1, a2, a3, a4;
    
    fgets(a1.nome, 100, stdin);
    a1.nome[strcspn(a1.nome, "\n")] = 0;
    fgets(a1.local, 100, stdin);
    scanf("%d%*c", &a1.valor);
    
    fgets(a2.nome, 100, stdin);
    a2.nome[strcspn(a2.nome, "\n")] = 0;
    fgets(a2.local, 100, stdin);
    scanf("%d%*c", &a2.valor);

    fgets(a3.nome, 100, stdin);
    a3.nome[strcspn(a3.nome, "\n")] = 0;
    fgets(a3.local, 100, stdin);
    scanf("%d%*c", &a3.valor);
    
    fgets(a4.nome, 100, stdin);
    a4.nome[strcspn(a4.nome, "\n")] = 0;
    fgets(a4.local, 100, stdin);
    scanf("%d%*c", &a4.valor);
    
    valor1 = a1.valor;
    valor2 = a2.valor;
    valor3 = a3.valor;
    valor4 = a4.valor;
    
    if(valor1 <= valor2){
        printf("Mais Barato: %s (R$ %d.00)\n", a1.nome, a1.valor);
    }
    else if(valor2 <= valor4){
        printf("Mais Barato: %s (R$ %d.00)\n", a2.nome, a2.valor);
    }
    else if(valor3 <= valor2){
        printf("Mais Barato: %s (R$ %d.00)\n", a3.nome, a3.valor);
    }
    else if(valor4 <= valor1){
        printf("Mais Barato: %s (R$ %d.00)\n", a4.nome, a4.valor);
    }
    
    
    if(valor1 >= valor3){
        printf("Mais Caro: %s (R$ %d.00)", a1.nome, a1.valor);
    }
    else if(valor2 >= valor1){
        printf("Mais Caro: %s (R$ %d.00)", a2.nome, a2.valor);
    }
    else if(valor3 >= valor1){
        printf("Mais Caro: %s (R$ %d.00)", a3.nome, a3.valor);
    }
    else if(valor1 >= valor3){
        printf("Mais Caro: %s (R$ %d.00)", a4.nome, a4.valor);
    }
    
  return 0;
}

 

Postado

@immoraesz

1 hora atrás, immoraesz disse:
    fgets(a1.nome, 100, stdin);
    a1.nome[strcspn(a1.nome, "\n")] = 0;
    fgets(a1.local, 100, stdin);
    scanf("%d%*c", &a1.valor);

Sim, como disse:

2 horas atrás, Lucca Rodrigues disse:

Que tecla você aperta quando finaliza a leitura?

Essa tecla não é um número, de nada interessa na leitura e gravação de um valor inteiro.

E você não me respondeu... A tecla é Enter.

'\n' restante no fluxo que não foi lido por scanf() pronto pra ferrar com a leitura de fgets().

Pode ler e descartar com %*c, mas isso não lida com todos os casos, nada impede o usuário de teclar o que quiser, quantas vezes quiser.

Te mostrei como lidar com isso, 2-3 vezes.

 

2 horas atrás, immoraesz disse:

o programa recebe os valores (nome, local e valor) automaticamente. A compilação é automática, no meu caso, se eu colocar os printf vai estar errado.

Imprima na saída de erro padrão (stderr).

Acho que você deve estar enviando naqueles sites que avaliam a saída padrão (stdout), nada impede você de imprimir em outro fluxo:

fprintf(stderr, "Provavelmente o site não vai detectar isso");
Postado

@immoraesz Isole o problema e 🦭foca nele..., somente nele!

 

Em 05/02/2022 às 18:00, immoraesz disse:

o programa não está retornando nenhum dos printf e não sei o motivo.

Apenas digamos que todo programa funciona, exceto os testes com as 'printf'...

 

Exemplo

— Escrevo outro código, mas dessa vez; excluo as informações/rotinas que antecedem o ninho de IFs com 'printf' onde supos ter um problema.

E para fim de teste, forneço o produto/ a informação que teríamos nessa etapa do programa já que omito (TáhOquei!!) nas etapas anteriores.

 

C language /> _

//teste do fragmento de cdh@immoraesz
#include"stdio.h"
#define N 4
typedef struct {
        char nome[50];
        char local[50];
        int valor;
} ingresso;
int
main (void) {
  ingresso
  a1 = { "a1","1", 1.0 },
  a2 = { "a2","2", 2.0 },
  a3 = { "a3","3", 3.0 },
  a4 = { "a4","4", 4.0 };

  double valor1 = a1.valor;
  double valor2 = a2.valor;
  double valor3 = a3.valor;
  double valor4 = a4.valor;
    
  if (valor1 < valor2  &&  valor3  &&  valor4) {
     printf("Mais Barato: %s (R$%d.00)", a1.nome, a1.valor);
  }   
  else if (valor2 < valor1  &&  valor3  &&  valor4) {
     printf("Mais Barato: %s (R$%d.00)", a2.nome, a2.valor);
  }
  else if(valor3 < valor1  &&  valor2  &&  valor4) {
     printf("Mais Barato: %s (R$%d.00)", a3.nome, a3.valor);
  }
  else if(valor4 < valor1  &&  valor2  &&  valor3) {
     printf("Mais Barato: %s (R$%d.00)", a4.nome, a4.valor);
  }

  if (valor1 > valor2  &&  valor3  &&  valor4) {
     printf("Mais Caro: %s (R$%d.00)", a1.nome, a1.valor);
  }
  else if(valor2 > valor1  &&  valor3  &&  valor4) {
     printf("Mais Caro: %s (R$%d.00)", a2.nome, a2.valor);
  }
  else if(valor3 > valor1  &&  valor2  &&  valor4) {
     printf("Mais Caro: %s (R$%d.00)", a3.nome, a3.valor);
  }
  else if(valor4 > valor1  &&  valor2  &&  valor3) {
     printf("Mais Caro: %s (R$%d.00)", a4.nome, a4.valor);
  }
  printf ("\n");
  (void) a1;
  (void) a2;
  (void) a3;
  (void) a4;
  return 0;
}

[SAÍDA]

667612368_Semttulo.png.e7e1e8cb3f648c73b298ee0079f6850c.png

 

Para aquela entrada de teste tem essa saída, porém, notou-se ser incorreta, ok? Isso ai! Sendo assim pouco importa as printfs quando há erro lógico nas expressões. Tudo bem, sem pânico, acredito que com a boa revisão de instrução IF e os operadores lógicos, você conseguirá na próxima tentativa.

 

Por último, essa CATARATA de IF é nada elegante🙅‍♂️, certamente algo que cavalheiros ou damas não fariam, exceto se por obrigação..., se não e o caso, advirto ser necessária uma linha para determinar o maior e outra para menor se optar no uso do operador ternário ou função.

 

[🙂] — espero que ajude!

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...