Create resulting strcut in C

Asked

Viewed 71 times

-1

I’m doing an exercise where the user inserts the data of a vehicle (brand, year, price) in a struct. After that, the user enters a value. To struct resulting shall show only the data of the vehicles that are below the value entered by the user.

The IDE shows that there are the following errors: 1. in the first block bold: -variable result (that would be the resulting struct) created, but not used 2. in the second bold block: (car*)&result is a pointer (I did not understand where is pointer, since I did not insert and saw no need, since I created a resulting structure) 3. in the third block bold: comment equal to the previous

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

typedef struct{
char marca[15];
int ano;
float preco;
}carro;
void cabecalho();
int main(){
carro filtrar[5], **resultado[5];**
float preco_escolhido;
int cont = 0;

cabecalho();

for (int i = 0 ; i <5 ; i++){
printf("Insira o marca do veículo: ");
fflush(stdout);
fgets(filtrar[i].marca, 15, stdin);
fflush(stdout);

printf("Insira o ano do veículo: ");
fflush(stdout);
scanf("%d", &filtrar[i].ano);

while (isdigit(filtrar[i].ano)){
printf("Insira o ano do veículo: ");
fflush(stdout);
scanf("%d", &filtrar[i].ano);
}

printf("Insira o preço do veículo: ");
fflush(stdout);
scanf("%f", &filtrar[i].preco);

while (!isdigit(filtrar[i].preco)){
printf("Insira o preço do veículo: ");
fflush(stdout);
scanf("%f", &filtrar[i].preco);
}

getchar();

}

printf("Insira o valor máximo que deseja pagar: ");
fflush(stdout);
scanf("%f", &preco_escolhido);

//o código abaixo deveria inserir o valor da estrutura geral, na estrutura com a especificação,
//no caso o valor menor que o escolhido pelo usuário.

for (int i = 0 ; i<5 ; i++){
if (filtrar[i].preco <= preco_escolhido){
**resultado.marca[cont] = filtrar[i].marca;
resultado.ano[cont] = filtrar[i].ano;
resultado.preco[cont] = filtrar[i].preco;**
cont++;
}
}


printf("\nForam encontrado(s) %d veículo(s) abaixo de R$ %.2f.\n",cont, preco_escolhido);

for (int i = 0 ; i <cont ; i++){
printf("==== Veículos encontrados abaixo de R$ %.2f======\n",preco_escolhido);
**printf("Modelo: %s\n",resultado.marca[i]);
printf("Ano: %d\n",resultado.ano[i]);
printf("Preço: %.2ff\n",resultado.preco[i]);**
}


return 0;
}
  • This passage: while (isdigit(filtrar[i].ano)){ printf("Insira o ano do veículo: "); fflush(stdout); scanf("%d", &filtrar[i].ano); }, has no sense, idem for price. The function isdigitchecks whether the character as parameter is a digit.

1 answer

1

Pacoca,

There are several problems in your code, let’s go in parts:

The use of the function isdigit, this function takes an integer and you are sending even float to it:

while (!isdigit(filtrar[i].preco)){

There is a code duplicity regarding asking for the price and year of the car:

printf("Insira o ano do veículo: ");
fflush(stdout);
scanf("%d", &filtrar[i].ano);

while (isdigit(filtrar[i].ano)){
  printf("Insira o ano do veículo: ");
  fflush(stdout);
  scanf("%d", &filtrar[i].ano);
}

printf("Insira o preço do veículo: ");
fflush(stdout);
scanf("%f", &filtrar[i].preco);

while (!isdigit(filtrar[i].preco)){
  printf("Insira o preço do veículo: ");
  fflush(stdout);
  scanf("%f", &filtrar[i].preco);
}

You tried to access the structure properties in the array incorrectly, here:

resultado.marca[cont] = filtrar[i].marca;
resultado.ano[cont] = filtrar[i].ano;
resultado.preco[cont] = filtrar[i].preco;

And here too:

printf("Modelo: %s\n",resultado.marca[i]);
printf("Ano: %d\n",resultado.ano[i]);
printf("Preço: %.2ff\n",resultado.preco[i]);

Note that in both cases, you reversed, placing the point to access the property before accessing the index in the array, the correct one would be:

resultado[cont].preco = filtrar[i].preco;

There is a small detail in printing the float value, where you repeated the F:

printf("Preço: %.2ff\n",resultado.preco[i]);

In this case it is just a visual matter, just remove an f.


Finally we have the char array assignment (Already fixing the access part to the array):

resultado[cont].marca = filtrar[i].marca;

This is not possible, the tag is an array of char, to make this copy of values, you can use the function strcpy:

strcpy(resultado[cont].marca, filtrar[i].marca);

Correcting all these details, the code was as follows:

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

typedef struct{
  char marca[15];
  int ano;
  float preco;
} carro;

void cabecalho();

int main(){
  carro filtrar[5], resultado[5];
  float preco_escolhido;
  int cont = 0;

  cabecalho();

  for (int i = 0 ; i <5 ; i++){
    printf("Insira o marca do veículo: ");
    fflush(stdout);
    fgets(filtrar[i].marca, 15, stdin);
    fflush(stdout);

    printf("Insira o ano do veículo: ");
    fflush(stdout);
    scanf("%d", &filtrar[i].ano);

    printf("Insira o preço do veículo: ");
    fflush(stdout);
    scanf("%f", &filtrar[i].preco);

    getchar();
  }

  printf("Insira o valor máximo que deseja pagar: ");
  fflush(stdout);
  scanf("%f", &preco_escolhido);

  //o código abaixo deveria inserir o valor da estrutura geral, na estrutura com a especificação,
  //no caso o valor menor que o escolhido pelo usuário.

  for (int i = 0 ; i<5 ; i++){
    if (filtrar[i].preco <= preco_escolhido){
      // resultado[cont].marca = filtrar[i].marca;
      strcpy(resultado[cont].marca, filtrar[i].marca);
      resultado[cont].ano = filtrar[i].ano;
      resultado[cont].preco = filtrar[i].preco;
      cont++;
    }
  }

  printf("\nForam encontrado(s) %d veículo(s) abaixo de R$ %.2f.\n",cont, preco_escolhido);

  for (int i = 0 ; i <cont ; i++){
    printf("==== Veículos encontrados abaixo de R$ %.2f======\n",preco_escolhido);
    printf("Modelo: %s\n",resultado[i].marca);
    printf("Ano: %d\n",resultado[i].ano);
    printf("Preço: %.2f\n",resultado[i].preco);
  }

  return 0;
}

See an online example of this code, where I commented on the header function, because you did not put the body of the same in the example:

https://repl.it/repls/MotherlyHuskySystemadministrator

Browser other questions tagged

You are not signed in. Login or sign up in order to post.