Ir ao conteúdo

Posts recomendados

Postado

Bom dia, meu codigo em C esta apresentando alguns erros quando tento compila-lo e não estou conseguindo corrigi-los, poderiam me ajudar? 

#include <stdio.h>

struct peso{
    int nome[30];
    float peso;
};

int main(void)
{
    struct peso     dados[5];
    float             media=0;
    int             i=1, cant=0;

    for(i=0;i<5;i++)
    {
        printf("\nNome: ");
        gets(dados[i] .nome);
        printf("\nPeso: ");
        printf("%f",&dados[i] .peso);
        media+=dados[i] .peso;
    }

    media=media/5;

    for(i=0;i<5;i++)
    {
        if(dados[i].peso>media)
        {
            printf("%s está acima do peso médio\n",dados[i].nome);
            cant++;
        }
    }    
    printf("%d pessoas estão acima do peso médio", cant);
}

 

  • Curtir 1
Postado

Qual o erro que esta dando..vi 2 coisas estranhas...

 

  Em 20/04/2023 às 13:19, afcdfilho disse:
struct peso{
    int nome[30];
    float peso;
};
Expandir  

na struct nome como int... não seria char?

 

  Em 20/04/2023 às 13:19, afcdfilho disse:
for(i=0;i<5;i++)
    {
        printf("\nNome: ");
        gets(dados[i] .nome);
        printf("\nPeso: ");
        printf("%f",&dados[i] .peso);
        media+=dados[i] .peso;
    }
Expandir  

nesse bloco tem um espaco entre o colchetes e variavel do struct... 

  • Curtir 1
Postado

@afcdfilho  deve ser isso mesmo que o @bngomes disse sobre a variavel que voce está declarando.

 

voce declarou uma variavel do tipo int (que é usado para numeros) mas está querendo receber um texto (que seria um nome).

 

Tenta alterar de int para string, por que o char talvez não de certo tambem devido ao tamanho do valor que se espera receber.

 

Então voce altera de "int nome [30]" para "string nome [30]".

  • Curtir 1
Postado

@bngomes Deu certo mudando o int para char, muito obrigado. So fiquei com um problema quando executo o código, não consigo informar o peso apenas consigo informar o nome, mas precisaria preencher tanto o "nome" quanto o "peso"

  • Curtir 1
Postado

@bngomes Troquei pelo scanf em algumas partes e deu certo, obrigado novamente. Agora o meu problema é parte final, consegue me ajudar?

Eu tinha colocado primeiramente assim:

  Em 20/04/2023 às 13:19, afcdfilho disse:
    for(i=0;i<5;i++)
    {
        if(dados[i].peso>media)
        {
            printf("%s está acima do peso médio\n",dados[i].nome);
            cant++;
        }
    }    
    printf("%d pessoas estão acima do peso médio", cant);
}
Expandir  

Mas como eu preciso que ele retorne nessa ordem:

“x pessoas estão acima”

“As pessoas estão acima sao:

Pessoa y

Pessoa z"

 Tentei inverter assim:

 for(i=0;i<5;i++)
    {
        if(dados[i].peso>media)
        {
    printf("%d pessoas estão com o peso acima da média", cant);
}
        {
            printf("%s\n",dados[i].nome);
            cant++;
        }

 

Mas não rodou, conseguiria me ajudar?

  • Curtir 1
Postado

toda vez que algume passar da media voce inclementa...

ai voce vai ter o total.. e sempre que alguém passar imprime o nome dela tela.

  Em 20/04/2023 às 13:19, afcdfilho disse:
 for(i=0;i<5;i++)
    {
        if(dados[i].peso>media)
        {
            printf("%s está acima do peso médio\n",dados[i].nome);
            cant++;
        }
    }    
    printf("%d pessoas estão acima do peso médio", cant);
Expandir  

Como feito aqui... não tem como saber a quantidade primeiro pra depois imprimir o nome... a não ser que voce crie um segundo array com os indices do que passaram do peso e depois desse o print desse array

  • Curtir 2
  • 1 ano depois...
Postado

Agora 😄 não mais ... o programminha compila!

codigo_em_C_esta_apresentando_alguns_erros_quando_tento_compila-lo.c

/*                               EXERCICIO
 ---------------------------------------------------------------------------
*/#include <stdio.h>
  #define PACIENTE 0x1
  struct Paciente
     {
      char    nome[30];
      float   peso;
     };
  int
  main (void)
  {
   float media = 0;
   unsigned cant = 0;
   struct Paciente grupo[PACIENTE];
   for (unsigned paciente = 0 ; paciente<PACIENTE ; ++paciente)
      {
       printf ("\nNome: ");
       gets ((grupo + paciente)->nome);
       printf("\nPeso: ");
       scanf ("%f",&(grupo + paciente)->peso);
       media += (grupo + paciente)->peso;
      }
   media = media / PACIENTE;
   for (unsigned paciente = 0 ; paciente<PACIENTE ; ++paciente)
      if((grupo + paciente)->peso > media)
         {
          printf("%s está acima do peso médio\n", (grupo + paciente)->nome);
          ++cant;
         }
   printf("%d pessoas estão acima do peso médio", cant);
  }

c'11 - gcc'11.4

  • Curtir 1
Postado

@afcdfilho Para o seu código o compilador mostra vários alertas que você devia tentar entender o que significa cada um. Só para citar dois,

 

Sobre gets: main.c:17:9: warning: ‘gets’ is deprecated [-Wdeprecated-declarations]

 

Essa função é obsoleta e deve ser evitada por questões de segurança já que não oferece limite para a entrada dados. Prefira fgets.

 

Nesta linha você acabou passando o endereço do peso, porém printf espera um valor. Então é só remover o operador &.

 

main.c:19:18: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
   19 |         printf("%f",&dados[i] .peso);

 

  • Obrigado 1
  • 2 semanas depois...
Postado
  Em 20/04/2023 às 17:23, bngomes disse:

não tem como saber a quantidade primeiro pra depois imprimir o nome... a não ser que voce crie um segundo array com os indices do que passaram do peso e depois desse o print desse array

Expandir  

 

                                                                                                               MATRIZES

Também pensei isso!

 

Declarar o arranjo onde o comprimento e os elementos são, respectivamente, a

quantia e os índices doutro; conforme um ou mais filtros e/ou requisitos.

 

Expresso:

Indice grupo_acima_da_media[PACIENTE], incluir = 0;
for (Indice paciente = 0 ; paciente < PACIENTE ; ++paciente)
   if (dados[paciente].peso > media)
      grupo_acima_da_media[incluir] = paciente ,
      ++incluir;

 

  • Curtir 1
  • mês depois...
Postado
  Em 20/04/2023 às 13:38, afcdfilho disse:

linha 17 [Error] cannot convert 'int*' to 'char*' for agument '1' to 'char* gets(char*)'

Expandir  

essa mensagem diz que a função gets espera um dado do tipo char[10] com mais de um caractere , 

e como @Midori  disse essa função " gets " está ultrapassada e melhor mesmo não usá-la , assim como outras como " goto " ,  porém essas funções antigas da linguagem C ainda funcionam normalmente , então para quem ainda é estudante pode usá las sem problemas , porém quando for profissional e criar um aplicativo não as use em seu código , mas sim as funções mais atuais que vieram para substituí las , 

  Em 20/04/2023 às 14:24, afcdfilho disse:

fiquei com um problema quando executo o código, não consigo informar o peso apenas consigo informar o nome

Expandir  

para inserir o peso pode usar " gets "  mesmo , e depois converter para float , usando para isso a função " atof " da biblioteca "stdlib.h" :

#include <stdio.h>
#include <float.h>
#include <stdlib.h>                      /// p/ atof funcionaR
struct peso
{
    char  nome[30];                      /// nome Eh formado por Letras q sAo char's
    float peso;
};
int main()
{
    struct peso     dados[5]   = {   0}; /// inicializa todas as posiç~ões da struct com valor zero
    float           media      =     0 ;
    int             i          =     1 ;
    int             contador   =     0 ; /// para contar as quantidades
    char            str[8]     =    "" ; /// string da linguagem C com espaCo p/ 7 caracteres e um newLine
    for(i=0; i<5; i++)                   /// pode fazer 5 cadstro no MAXimo
    {
        printf("Nome ----: "          );
        gets  (dados[i].nome          );
        printf("Peso ----: "          ); /// string da Linguagem C Eh "char str[10]"
        gets  ( str                   ); /// gets significa "get" = pegar "s" string
        dados [i].peso = atof( str    ); /// converte string para float e coloca no struct
        printf("%.2f\n", dados[i].peso); /// mostrar o que foi armazenado para testar se esta certo
        media += dados[i].peso         ; /// soma e acumula o valor dos pesos
        puts  ("Cadastrar Outro S/N " ); /// msg para o usuArio
        gets  ( str                   );
        if(str[0] != 'S' && str[0] != 's')goto L1;
    }
    L1:
    media /= 5;
    for(i=0; i<5; i++)
    {
        if( dados[i].peso > media )
        {
            printf("%s estA acima do peso mEdio\n",dados[i].nome);
            contador++;
        }
    }
    printf("%d pessoa", contador);
    if(contador > 1)
      printf("s estão");
      puts(" estA acima do peso mEdio\n\n\n");
    return 0;
}

 

  • Obrigado 1
Postado

@devair1010 Boa tarde!

 

GETS

 

        Hipoteticamente, digamos que fosse convidado a construir esta função segura, qual seria a expressão no corpo?

 

char *gets_s (char *schar, size_t length)

   {

   }

 

  • Curtir 1
Postado

@devair1010 Boa noite!

 

GETS

 

A gets é ultrapassada, portanto é fácil supor que ela não é a mais segura ou tem problemas. Daí sugeri que demostre uma versão segura da gets.

 

  Em 02/07/2024 às 23:23, devair1010 disse:

  o que seria uma  sobre função segura   ? 

Expandir  

De Programação Segura que produz conforme o esperado, sem problemas - safe

 

gets_s ()

  • Curtir 1
Postado

@Ansi C    olá ,  obrigado pela consideração ,  ainda sou estudante de Lógica de programação ,  e quando for profissional garanto que essa será a primeira tarefa ,  e atualmente tenho essa função

User* meL_Gets(char* str);

que agiliza os caracteres inseridos pelo teclado de uma forma controlada e sem usar o tal   "  Buffer ";      e nos teste funcionou bem ,  pois pode se inserir qualquer caractere  e com um limite de quantidade definido :     creio que muitos já fuzeram tal função própria , mas é improv[avel que resolva todos os casos   .

/// FunCAo  meL_Gets(char* str);
#include    <stdio.h>
#include    <locale.h>
typedef struct
{
  char str[256];
}User;

User* meL_Gets(char* str);
int main(int argc, char* argv[] )
{
  setlocale(LC_ALL,"");
  char str[256]   = "";
  
  meL_Gets(str)       ;
  
  printf("Dados inserido peLo TecLado ---: %s\n", str );
  puts("Tecle Enter");
  getchar();

  printf("\n\n\n");
  return   0;
}
User* meL_Gets(char* str)
{
  char c = ' ';
  int  f =  0 ;         ///

  for( f=0; f<255; f++) /// Max 255 caracteres e + 1 p/ o newLine's
  {
    c = getchar();      /// pegar Qualquer caractere
    if( c == '\n')break;/// finaliza ap pressionar ENTER
    str[f] = c;         /// vai armazenando os caract nas varias posições da var "str"
  }
  str[f] = 0;           /// Sinaliza o final da String
}

 

  • Obrigado 1

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...