Ir ao conteúdo
  • Cadastre-se

C++ Dificuldade em fazer o codigo em C


Ir à solução Resolvido por devair1010,

Posts recomendados

#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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

  • Solução

@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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!