Jump to content
  • Sign Up

C++ Dificuldade em fazer o codigo em C


Go to solution Solved by devair1010,

Recommended Posts

#include<stdio.h>

struct automovel{
	char modelo [50];
	char ano [5];
	char proprietario [50];
	int potencia [6];
	char IPVA [12];
}

 main(){
 	struct automovel cadastro;
 	
	int i, cont=0;
	
	for(i=0; i<10; i++){
		printf("Digite o modelo do carro: \n");
		scanf("%s",cadastro.modelo);
		printf("Digite o ano do carro: \n");
		scanf("%s",cadastro.ano);
		printf("Digite o nome do dono do carro: \n");
		scanf("%s",cadastro.proprietario);
		printf("Digite a potencia do carro (em cv): \n");
		scanf("%d",cadastro.potencia);
		printf("O IPVA  do carro esta pago? \n");
		scanf("%s",cadastro.IPVA);
	
		if(cadastro.potencia>100){
			cont++;
		}
	}

	printf("A quantidade de automoveis que tem motores com potencia superior a 100cv eh de:%d",cont);
}

Leia um cadastro com 10 automóveis que contenha:

modelo,
ano,
nome do dono,
potência e 
IPVA (se está pago ou não).

Por fim, gere um relatório informando quantos automóveis tem motores com potência superior a 100cv. fiz o codigo referente a essa questao mas esta dando erro no contador  segue o codigo abaixo

 

 

  • Curtir 1
Link to comment
Share on other sites

@devair1010

#include<stdio.h>

struct automovel
	char modelo [50];
	char ano [5];
	char proprietario [50];
	int potencia [6];
	char IPVA [12];


 main(){
 	struct automovel cadastro;
 	
	int i, cont=0;
	
	for(i=0; i<10; i++){
		printf("Digite o modelo do carro: \n");
		scanf("%s",cadastro.modelo);
		printf("Digite o ano do carro: \n");
		scanf("%s",cadastro.ano);
		printf("Digite o nome do dono do carro: \n");
		scanf("%s",cadastro.proprietario);
		printf("Digite a potencia do carro (em cv): \n");
		scanf("%d",cadastro.potencia);
		printf("O IPVA  do carro esta pago? \n");
		scanf("%s",cadastro.IPVA);
	
		if(cadastro.potencia>100){
			cont++;
		}
	}

	printf("A quantidade de automoveis que tem motores com potencia superior a 100cv eh de:%d",cont);
}

 nao sei se tirei do lugar errado a quantidade de erros aumentou

  • Curtir 1
Link to comment
Share on other sites

@Lavínia dos Santos Souza   não retirou , seria esse int potencia que está dentro da struct :

struct automovel
{
    char modelo [50];       // aqui é uma variáveL string simples que pode ter até 49 caracteres
    char ano [5];           // aqui é outra string simples que pode armazenar até 4 caracteres 
                            // e hum , o último , será usado para o finalizador de string '\0'
    char proprietario [50]; // outra string simples com até 49 caract
    // int potencia [6];    // esse vetor aqui , não precisa , e poderia ser assim
    int potencia;           // variaveL int simples , com apenas uma posição na memória
    char IPVA [12];         // outra string simples com até 11 caracteres
};

 

Link to comment
Share on other sites

@devair1010

#include<stdio.h>

struct automovel
{
    char modelo [50];       
    char ano [5];          
                            
    char proprietario [50]; 
       
    int potencia;           
    char IPVA [12];         
};
 main(){
 	struct automovel cadastro;
 	
	int i, cont=0;
	
	for(i=0; i<10; i++){
		printf("Digite o modelo do carro: \n");
		scanf("%s",cadastro.modelo);
		printf("Digite o ano do carro: \n");
		scanf("%s",cadastro.ano);
		printf("Digite o nome do dono do carro: \n");
		scanf("%s",cadastro.proprietario);
		printf("Digite a potencia do carro (em cv): \n");
		scanf("%d",cadastro.potencia);
		printf("O IPVA  do carro esta pago? \n");
		scanf("%s",cadastro.IPVA);
	
		if(cadastro.potencia>100){
			cont++;
		}
	}

	printf("A quantidade de automoveis que tem motores com potencia superior a 100cv eh de:%d",cont);
}

 Agora rodou mas nao imprime a quantidade de automoveis 

  • Curtir 1
Link to comment
Share on other sites

struct automovel{
	char modelo [50];
	char ano [5];
	char proprietario [50];
	int potencia [6];
	char IPVA [12];
}

 main(){
 	struct automovel cadastro;
 	
	int i, cont=0;
	
	for(i=0; i<10; i++){
		printf("Digite o modelo do carro: \n");
		scanf("%s",cadastro.modelo);

 

:( Entenda que essa estrutura que usou não é um cadastro só porque você chamou de cadastro. Podia chamar de espaçonave e não faria diferença: continuaria representando uma struct. No singular. Um carro. Não 2 nem DEZ como precisa.

 

Escreva em torno dos dados: 

 

Você tem um Cadastro, que é uma estrutura porque dentro do cadastro tem algo. No caso tem Automovel, um certo número deles, como 10 no seu enunciado...

 

Seria muito mais fácil programar de acordo com a realidade dos dados.

 

Ainda sobre o programa:

  • main retorna int. Sempre. Declare como tal. Se não vai usar os parâmetros declare void. É o recomendado.
  • nunca declare variáveis com nomes ingênuos como i globais. E nunca declare variáveis de controle do loop fora do loop. Levou anos para corrigirem isso. Toda a década. Mas de 80
  • TESTE sempre o retorno de scanf(). É ingênuo seguir se não leu nada.
  • Em especial quando está começando mostre na tela os valores lidos, para não ter surpresas.

Veja uma maneira de escrever:
 

#include    <stdio.h>

typedef struct
{
	char    modelo [50];
	char    ano [5];
	char    proprietario [50];
	int     potencia [6];
	char    IPVA [12];

}   Automovel;

typedef struct
{
    int         N; // numero atual de carros no cadastro
    Automovel   carro[10]; // OS DEZ CARROS

}   Cadastro;


int main(void)
{
    Cadastro     cad;
    cad.N = 0; // vazio
    printf("%d carros no cadastro\n", cad.N);
    for( int i=0; i< cad.N; i+=1 ) printf("%d\t%s\n", 1+i, cad.carro[i].modelo );
    return 0;
};

// fim

 

 

 

 

 

  • Curtir 2
Link to comment
Share on other sites

  • Solution

@Lavínia dos Santos Souza  testei esse código e está funcionando  , mas precisa digitar um potencia maior que 100 para ele fazer a contagem 

:

#include <stdio.h>
#include <windows.h>
struct automovel
{
	char modelo [50];
	char ano [5];
	char proprietario [50];
	int potencia;
	char IPVA [12];
};
void textcolor(int,int);
int main()
{
    int c_letra_ant, c_fundo_ant;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO c;
    GetConsoleScreenBufferInfo(h, &c);
    c_letra_ant = c.wAttributes & 0x0F;
    c_fundo_ant = c.wAttributes >> 4 & 0x0F;
    struct automovel cadastro;
    int i, cont=0;
    char ch;
    for(i=0; i<1; i++)
    {
        textcolor(14,0);
        printf("Digite o modelo do carro -----------: ");
        textcolor(11,0);
        scanf("%s",cadastro.modelo);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado
        textcolor(14,0);
        printf("Digite o ano do carro --------------: ");
        textcolor(11,0);
        scanf("%s",cadastro.ano);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado
        textcolor(14,0);
        printf("Digite o nome do dono do carro -----: ");
        textcolor(11,0);
        scanf("%s",cadastro.proprietario);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado
        textcolor(14,0);
        printf("Digite a potencia do carro (em cv) -: ");
        textcolor(11,0);
        scanf("%d",&cadastro.potencia);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado
        textcolor(14,0);
        printf("O IPVA  do carro esta pago ? -------: ");
        textcolor(11,0);
        scanf("%s",cadastro.IPVA);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado
        if(cadastro.potencia > 100)
        {
            cont++;
        }
    }
    printf("\n\n");
    textcolor(15,0);
    printf("A quantidade de automoveis que tem motores\n\n");
    textcolor(10,12);
    printf(" com potencia superior a 100cv eh de : ");
    textcolor(15,9);
    printf("  %d  \n\n\n",cont);
    textcolor(c_letra_ant, c_fundo_ant);
    return 0;
}
void textcolor(int letra,int fundo)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            letra +(fundo << 4));
}

 

Link to comment
Share on other sites

    for(i=0; i<1; i++)
    {
        textcolor(14,0);
        printf("Digite o modelo do carro -----------: ");
        textcolor(11,0);
        scanf("%s",cadastro.modelo);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado
        textcolor(14,0);
        printf("Digite o ano do carro --------------: ");
        textcolor(11,0);
        scanf("%s",cadastro.ano);
        while(ch = fgetc(stdin) != '\n');  // limppar o buffer do teclado

      // ...

 

Talvez seja complicado demais tudo isso para um programa para iniciantes. 

 

Cores por número, 11, 14, 0,  endereçamento do cursor na tela, handles, constantes hexadecimais e operadores binários. E ainda o lance de "limpar buffer" do teclado, estruturas internas do WIndows e tal.

 

E mesmo assim sequer testa o retorno de scanf(), algo mais primário e importante para um iniciante ou profissional entender. E não declara a variável de controle do loop DENTRO do for, e isso é sim um problema também.

 

E o enunciado diz

 

5 horas atrás, Lavínia dos Santos Souza disse:

Leia um cadastro com 10 automóveis que contenha:

 

 

Não fosse isso não precisaria de nenhuma struct e campos, bastaria contar quantos carros tem a potência requerida.

 

Só que precisa do cadastro então cadastro deve ser
 

	struct automovel cadastro[10];

 

E um programa certinho para uma nota certinha deveria mostrar o vetor todinho ao final para mostrar que o programa armazenou corretamente, e mostrar ao final a contagem dos carros que tem a potência requerida.

 

"limpar o buffer"

 

Considere:

 

O único campo da estrutura que não é char[] é a potência, que pode ser lida por ultimo.

 

campos como modelo e proprietario com boa probabilidade vão acabar digitados com mais de uma palavra, coisas como "Cadillac Eldorado" e "Elvis Presley" :) e vão sumir nesse processo colorido de ler usando scanf() e depois usar um loop while que chama fgetc() e tal.

 

Sugiro fazer o simples e ler com fgets(), sem mais. E assim só precisa se preocupar com algo que possa ter sobrado para ser lido na última leitura de cada série. E isso se insistir em usar scanf() para fazer a conversão para int. Mais simples provavelmente seria usar fgets() para ler a linha e atoi() ou sscanf() para converter depois, mas não quero escrever muito mais e criar novas dúvidas.

 

Veja esse loop

 

    char    resto[50]; // para descartar o resto da linha
    struct automovel cadastro[10];
    int contador = 0;
    for (int i = 0; i < 10; i += 1)
    {
        printf("\nModelo do carro: ");
        fgets(cadastro[i].modelo, 50, stdin);
        printf("Ano de fabricação: ");
        fgets(cadastro[i].ano, 5, stdin);
        printf("Nome do proprietario: ");
        fgets(cadastro[i].proprietario, 50, stdin);
        printf("Registro RENAVAN: ");
        fgets(cadastro[i].IPVA, 12, stdin);
        printf("Potencia do Motor em cv: ");
        int res = scanf("%d", &cadastro[i].potencia);
        if (res != 1)
        {   // nao leu nada
            printf("Erro lendo o carro %d. Encerrando\n", 1 + i);
            return -1;
        }
        if (cadastro[i].potencia > 100) contador += 1;
        fgets(resto, 50, stdin);
        // leu o resto da linha pra nao interferir com 
        // a proxima leitura
    };  // for()

 

que faz a mesma coisa e é mais simples de ler. Sem constantes hexadecimais como 0x0F, sem AND binário, sem CONSOLE_SCREEN_BUFFER_INFO, sem shift left, sem HANDLE e tal.

 

Sobre a struct

 

IPVA é um imposto. Eu não saberia o que digitar nesse caso. Sugiro trocar pelo RENAVAN ;) 

  • Obrigado 1
Link to comment
Share on other sites

Bom dia, creio que você faça faculdade na mesma universidade que eu, pois eu também tive que fazer o mesmo exercício, eu consegui resolver desta maneira.(o código esta bem feio mas funciona sanfbmsaf)

 

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
main(){

    int i, cont=0;
    struct ficha_carro{
        char modelo[50];
        int ano;
        int potencia[10];
        char ipva[10];
        
    };
    
    for(i=0;i<10;i++){
    struct ficha_carro carro;
    printf("\nCadastro do carro\n");
    
    setbuf(stdin, NULL);
    printf("\nModelo do carro: ");
    scanf("%[^\n]", carro.modelo);
    
    setbuf(stdin, NULL);
    printf("Ano do carro: ");
    scanf("%d", &carro.ano);
    
    setbuf(stdin, NULL);
    printf("Potencia do carro em cv: ");
    scanf("%d", &carro.potencia[i]);
    
    setbuf(stdin, NULL);
    printf("IPVA do carro pago?(Sim/Nao): ");
    scanf("%s", carro.ipva);
    
    setbuf(stdin, NULL);
    if(carro.potencia[i]>100){
        cont++;
    }
    }
    printf("Carros com potencia maior que 100cv: %d", cont);
    }
    

  • Curtir 1
Link to comment
Share on other sites

38 minutos atrás, devair1010 disse:

@Yan Chaves    olá , muito bom seu código ,  

 

🤔 Não, @devair1010 . Não está muito bom e sequer está correto.

 

Veja por exemplo essa estrutura

 

    struct ficha_carro{
        char modelo[50];
        int ano;
        int potencia[10];
        char ipva[10];
        
    };

 

Mas o enunciado...

 

Leia um cadastro com 10 automóveis que contenha:

modelo,
ano,
nome do dono,
potência e 
IPVA (se está pago ou não).

Por fim, gere um relatório informando quantos automóveis tem motores com potência superior a 100cv

 

Não sou eu que vou corrigir isso, mas entenda que tudo que eu disse que estava errado continua errado.

 

E essa ficha_carro é algo estranho: ela tem lugar para 10 modelos, dez donos, dez potencias e 10 IPVA, seja o que for isso. Mas só tem UM ANO pata todos os carros... 

 

Não é melhor entender o simples e aceitar que o cadastro é um cadastro de Carro e tem por exemplo DEZ carros como diz o enunciado?

 

Eis o esperado:

 

typedef struct
{
        char modelo[50];
        int ano;
        int potencia[10];
        char ipva[10];
        
}	Carro;

int main(void)
{
	Carro	carro[10];
	return 0;
}

 

Cada Carro agrupa as informações de um ... carro.

 

E permanecem todos os outros problemas...

 

main() retorna int, scanf() retorna um int que não foi testado, setbuf() está errado, não há controle de tamanho e qualquer leitura pode estourar o tamanho do campo...

 

E o simples seria mostrar ao final os dados lidos e quantos carros tem a potência acima da requerida. No mínimo pra provar que o programa está certo.

 

  • Curtir 2
  • Obrigado 1
Link to comment
Share on other sites

@arfneto     testei esse código do seu exemplo  e creio que o fgets realmente seja uma boa opção para limpar o buffer ,   e  resolve bem o enunciado  ,   e ali no código acima coloquei esses comandos de cores , apenas para incrementar um pouco , pois gosto de cores e pinto tudo mesmo e também gosto de sons e movimentos  ,   

 

#include <stdio.h>
struct automovel
{
    char modelo[20];
    char ano[5];
    char proprietario [50];
    float potencia; // nao precisa ser vetor
    char IPVA [12];
};
int main()
{
    char    resto[50]; // para descartar o resto da linha
    struct automovel cadastro[10];
    int contador = 0,i;
    for ( i = 0; i < 2; i += 1)
    {
        printf("\nModelo do carro: ");
        fgets(cadastro[i].modelo, 50, stdin);
        printf("Ano de fabricação: ");
        fgets(cadastro[i].ano, 5, stdin);
        printf("Nome do proprietario: ");
        fgets(cadastro[i].proprietario, 50, stdin);
        printf("Registro RENAVAN: ");
        fgets(cadastro[i].IPVA, 12, stdin);
        printf("Potencia do Motor em cv: ");
        int res = scanf("%f", &cadastro[i].potencia);
        if (res != 1)
        {   // nao leu nada
            printf("Erro lendo o carro %d. Encerrando\n", 1 + i);
            return -1;
        }
        if (cadastro[i].potencia > 100) contador += 1;
        fgets(resto, 50, stdin);
        // leu o resto da linha pra nao interferir com
        // a proxima leitura
    };  // for()
    printf("total de carros com potencia maior que 100 eh %d\n",contador);

    return 0;
}

 

  • Curtir 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

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

×
×
  • Create New...

Redes-Wi-Fi-capa-3d-newsletter.png

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!