Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Gian Dias Campos

C++ Variável que Grava os Dados na Memória

Recommended Posts

Boa tarde.

 

Estou fazendo um programa em C++ e eu preciso gravar os dados das variáveis. Meu professor explicou como se faz, porém, aparentemente eu não estou fazendo certo.

 

Meu programa funciona, mas não totalmente. Ao rodar, ele compila e roda normalmente, entretanto, ele só da a opção de colocar as variáveis para o primeiro boi e depois já mostra o resultado, meio que ignorando o "while( i == 5)". Sendo assim, alguém poderia me dizer qual local encontra-se o erro ou o que poderia fazer para melhorar meu programa? Os dados do problema e do meu programa estão abaixo.

 

O exercício é esse:

Numa fazenda existem 80 bois. Cada boi traz no pescoço uma placa com seu nome, idade e peso. Escreva um programa C que calcula e mostra:

- O nome e peso do boi mais gordo

- Quantos bois têm mais que 10 anos

- O peso médio do rebanho

 

Meu programa ficou assim (fiz com 5 bois para facilitar o teste):

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

   int main()
   {
      int PESO[5],IDADE[5],i,S,M,QA;
      char NOME[5];
      
      //quantidade de bois
      i = 1;
      
      //total do peso para fazer a media
      S = 0;
      
      //quantidade de bois com + de 10 anos
      QA = 0;
      
      do 
      {
          printf("Digite o nome do boi numero %d:\n",i);
          scanf(" %c",&NOME[i]);
          printf("\nDigite o peso deste boi:\n");
          scanf(" %d",&PESO[i]);
          printf("\nDigite a idade deste boi:\n");
          scanf(" %d",&IDADE[i]);
          
          S = S + PESO[i];
          
          if( IDADE[i] >= 10 )
          {
             QA = QA + 1;
          }
          
          i = i + 1;
          
          system("cls");
          
      } while(i >= 5);
      
      system("cls");
      
      //media
      M = S/(i-1);
      
      printf("A media do peso do rebanho e:\n%d",M);
      printf("\n\nNo rebanho, ha %d boi(s) com mais de 10 anos",QA);
      
      getch();
   
   }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A condição do while está errada. Deveria ser (i <= 5)

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citação

já mostra o resultado, meio que ignorando o "while( i == 5)"

Explicando o que o @iHollyZinhO disse.

Se a condição do while for i==5, significa que o while só continua se i for igual a 5.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • @TYSQUARE89 Entendi. Era isso mesmo, consegui fazer o programa rodar de boas :D. Obrigado pela ajuda e obrigado também pela ajuda @iHollyZinhO !

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Dois adendos:

     

    1)

    É apenas um pequeno detalhe:

    Em 31/10/2017 às 17:45, TYSQUARE89 disse:

    Se a condição do while for i==5, significa que o while só continua se i for igual a 5.

     

    No código está:

    Em 31/10/2017 às 13:22, Gian Dias Campos disse:
    
    } while(i >= 5);

    Nesse caso, seguindo a mesma lógica, o while só continuará se o i for maior ou igual a 5. (5, 6, 7...). Valores menores, como 4, 3, 2... ele para. Logo, como i começa com 1, e é "atualizado", ao final estaria com 2. Daí, o while iria terminar.

     

     

    2)

    @Gian Dias Campos, no C++ os vetores começam com 0 (um [5] é o mesmo que de 0 a 4 ), logo, para acessar uma posição, precisaria usar i-1. Do jeito que esta, só irá conseguir 4 posições, do 1 a 4. A posição 0 ficou de fora.

     

    Ou usa o i começando com 0, e na hora de exibir o i, usa i+1.

     

     

     

    No aguardo.

     

    adicionado 1 minuto depois

    Ah! outra coisa: se mudar i para começar com 0, terá que mudar a condição do while para x<=4 ou x<5.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Entendi @Simon Viegas ! Obrigado pela dica e pela ajuda :D

    Deu certinho aqui :)

     

    Irei postar uma outra dúvida em um outro tópico, se souber a resposta, ficaria grato pela ajuda novamente!

    Editado por Gian Dias Campos
    Nova dúvida

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá @Gian Dias Campos.

     

    Citando o código do outro tópico:

    2 horas atrás, Gian Dias Campos disse:

    Meu programa está assim:

    
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    
       int main()
       {
          int PESO[80],IDADE[80],i,S,MED,C,MA,NO;
          char NOME[80];
          
          //pra ver o maior peso
          MA = -1;
      
          //variavel pra mostrar o nome do boi mais pesado no final
          NO = 0;
      
          //variavel referente ao numero do dado (gravarei mais de 1 dado)
          i = 1;
      
          //variavel pra somar todos os pesos
          S = 0;
      
          //contador de bois com +10 anos
          C = 0;
          
          printf("Bem Vindo ao Boiadeiro 2k.\n");
          printf("\nIMPORTANTE: Para sair, digite 'F' no nome do boi (tudo maisuculo)!\n");
          printf("\nPressione enter para continuar.");
          
          getch();
          
          system("cls");
          
          do 
          {
              printf("Digite o nome do boi numero %d:\n",i);
              scanf(" %c",&NOME[i]);
              printf("\nDigite o peso deste boi:\n");
              scanf(" %d",&PESO[i]);
              printf("\nDigite a idade deste boi:\n");
              scanf(" %d",&IDADE[i]);
              
              S = S + PESO[i];
              
              if( IDADE[i] >= 10 )
              {
                 C = C + 1;
              }
              
              i = i + 1;
                  
              system("cls");
              
          } while(i != 80 && strcmp(NOME,"FIM") == false);
                             //aqui esta o outro problema
          
          for(i=1; i<=80 ; i++)
          {
             if(PESO[i] >= MA)
             {
                MA = PESO[i];
                NO = i;
             }
          }
          
          printf("O boi de nome %c pesa mais que todos e apresenta %d Kg\n",NOME[NO],MA);
          
          //media do peso do rebanho
          MED = S/(i-1);
          
          printf("\nA media do peso do rebanho e:\n%d",MED);
          printf("\n\nNo rebanho, ha %d boi(s) com mais de 10 anos",C);
          
          getch();
       
       }

     

     

    Pelo que eu vi, ainda está com o problema por mim citado no item 2).

    2 horas atrás, Simon Viegas disse:

    2)

    @Gian Dias Campos, no C++ os vetores começam com 0 (um [5] é o mesmo que de 0 a 4 ), logo, para acessar uma posição, precisaria usar i-1. Do jeito que esta, só irá conseguir 4 posições, do 1 a 4. A posição 0 ficou de fora.

     

    Ou usa o i começando com 0, e na hora de exibir o i, usa i+1.

     

     

    No aguardo.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @Simon Viegas , arrumei essa parte agora, obrigado!

     

    Código semi-funcionando:

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    
       int main()
       {
          int PESO[5],IDADE[5],i,j,S,MED,C,MA,NO;
          char NOME[5][30];
          
          MA = -1;
          NO = 0;
          i = 0;
          S = 0;
          C = 0;
          
          printf("Bem Vindo ao Boiadeiro 2k.\n");
          printf("\nIMPORTANTE: Para sair, digite 'FIM' no nome do boi (tudo maisuculo)!\n");
          printf("\nPressione enter para continuar.");
          
          getch();
          
          system("cls");
          
          do 
          {
              printf("Digite o nome do boi numero %d:\n",i);
              scanf(" %s",NOME[i]);
              printf("\nDigite o peso deste boi:\n");
              scanf(" %d",&PESO[i]);
              printf("\nDigite a idade deste boi:\n");
              scanf(" %d",&IDADE[i]);
              
              S = S + PESO[i];
              
              if( IDADE[i] >= 10 )
              {
                 C = C + 1;
              }
              
              i = i + 1;
                  
              system("cls");
              
          } while(i != 2);
          
          for(i=0; i<=2-1 ; i++)
          {
             if(PESO[i] >= MA)
             {
                MA = PESO[i];
                NO = i;
             }
          }
          
          printf("O boi de nome ");
          for(i = NO; j<=i; j++) //<-- o problema deve estar na primeira lógica 'i = NO'
          {
             printf("%s",NOME[j]);
          }
          printf(" pesa mais que todos e apresenta %d Kg\n",MA);
          
          MED = S/i;
          
          printf("\nA media aproximada do peso do rebanho e:\n%d",MED);
          printf("\n\nNo rebanho, ha %d boi(s) com mais de 10 anos",C);
          
          getch();
       
       }

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá @Gian Dias Campos.

     

    1) VALOR INICIAL DE i

    Executei o código, tem a seguinte frase:

    Digite o nome do boi numero 0:

    Como assim "boi número 0"? entende? Teria que ser "boi número 1".

     

    Vide:

    22 horas atrás, Simon Viegas disse:

    2)

    @Gian Dias Campos, no C++ os vetores começam com 0 (um [5] é o mesmo que de 0 a 4 ), logo, para acessar uma posição, precisaria usar i-1. Do jeito que esta, só irá conseguir 4 posições, do 1 a 4. A posição 0 ficou de fora.

     

    Ou usa o i começando com 0, e na hora de exibir o i, usa i+1.

     

     

     

    2) TRECHO DE CÓDIGO [1]

    O que você tentou fazer com esse trecho?

    	printf("O boi de nome ");
    	for(i = NO; j<=i; j++) { //<-- o problema deve estar na primeira lógica 'i = NO'
    		printf("%s",NOME[j]);
    	}

    Para que deveria servi essa parte do código? se poder explicar.

     

     

     

     

    3) TRECHO DE CÓDIGO [2]

    1 hora atrás, Gian Dias Campos disse:
    
    	printf("\nIMPORTANTE: Para sair, digite 'FIM' no nome do boi (tudo maisuculo)!\n");

     

    Mas no código você usa

    1 hora atrás, Gian Dias Campos disse:
    
    } while(i != 2);

    Não está batendo uma coisa com a outra.

     

     

     

    4) CÁLCULO DA MÉDIA

    O cálculo da média não está batendo.

     

    Percebi que está usando:

    1 hora atrás, Gian Dias Campos disse:
    
    MED = S/i;

     

    Veja, o tal i está sendo usando como referência para acessar uma posição no vetor, correto?. Ao mesmo tempo que ele é um "contador de bois". Acontece que a "quantidade" começa com 1, mas as posições começam com 0. Logo, é necessário existir uma compensação entre uma coisa e outra. No caso da média, você precisa da "quantidade", não da posição, logo, deveria usar "i+1". Algo como:

    MED = S/(i+1);

     

     

     

    ***

     

    No aguardo.

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • RESPOSTA 1

    13 minutos atrás, Simon Viegas disse:

    1) VALOR INICIAL DE i

    Executei o código, tem a seguinte frase:

    
    Digite o nome do boi numero 0:

    Como assim "boi número 0"? entende? Teria que ser "boi número 1".

    Agora entendi o que você quis dizer. Consertei e está tudo nos conformes agora :D

     

    RESPOSTA 2

    14 minutos atrás, Simon Viegas disse:

    2) TRECHO DE CÓDIGO [1]

    O que você tentou fazer com esse trecho?

    
    	printf("O boi de nome ");
    	for(i = NO; j<=i; j++) { //<-- o problema deve estar na primeira lógica 'i = NO'
    		printf("%s",NOME[j]);
    	}

    Para que deveria servi essa parte do código? se poder explicar.

     

    Na verdade faltou uma parte do trecho, que seria tudo isso:

      printf("O boi de nome ");
          for(i=0; j<=i; j++) //problema de lógica
          {
             printf("%s",NOME[j]);
          }
      printf(" pesa mais que todos e apresenta %d Kg\n",MA);

    No caso o programa falaria: O boi de nome *pega o nome completo do boi* pesa mais...

    Nessa parte *pega...* o programa pegaria todos os itens da primeira linha (00,01,02...) até completar o nome do boi. Esse pelo menos era meu objetivo, mas está faltando uma lógica que não consegui descobrir ainda.

     

    RESPOSTA 3

    18 minutos atrás, Simon Viegas disse:

    3) TRECHO DE CÓDIGO [2]

     

    Mas no código você usa

    Não está batendo uma coisa com a outra.

     

    Então, meu objetivo era que se a pessoa digitasse FIM o programa se encerraria, porém eu não consegui fazer funcionar e acabei removendo. Ele estava assim anteriormente:

    } while(i != 3 && strcmp(NOME[i],"FIM"));

    Porém ele não funciona, não sei porque..

     

    RESPOSTA 4

    21 minutos atrás, Simon Viegas disse:

    4) CÁLCULO DA MÉDIA

    O cálculo da média não está batendo.

     

    Percebi que está usando:

     

    Veja, o tal i está sendo usando como referência para acessar uma posição no vetor, correto?. Ao mesmo tempo que ele é um "contador de bois". Acontece que a "quantidade" começa com 1, mas as posições começam com 0. Logo, é necessário existir uma compensação entre uma coisa e outra. No caso da média, você precisa da "quantidade", não da posição, logo, deveria usar "i+1". Algo como:

    
    MED = S/(i+1);

     

     

    Consertei essa parte também. Coloquei no final do do/while a fórmula para que não ocorra erros posteriores e já corrigi o valor (i+1), obrigado.

     

    O programa está com essa cara atualmente:

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    
       int main()
       {
          int PESO[5],IDADE[5],i,j,S,MED,C,MA,NO;
          char NOME[5][30];
          
          MA = -1;
          NO = 0;
          i = 0;
          S = 0;
          C = 0;
          
          printf("Bem Vindo ao Boiadeiro 2k.\n");
          printf("\nIMPORTANTE: Para sair, digite 'FIM' no nome do boi (tudo maisuculo)!\n");
          printf("\nPressione enter para continuar.");
          
          getch();
          
          system("cls");
          
          do 
          {
              printf("Digite o nome do boi numero %d:\n",i+1);
              scanf(" %s",&NOME[i]);
              printf("\nDigite o peso deste boi:\n");
              scanf(" %d",&PESO[i]);
              printf("\nDigite a idade deste boi:\n");
              scanf(" %d",&IDADE[i]);
              
              S = S + PESO[i];
              
              if( IDADE[i] >= 10 )
              {
                 C = C + 1;
              }
              
              i = i + 1;
                  
              system("cls");
              
          } while(i != 4 && strcmp(NOME[i],"FIM"));
          
          MED = S/(i+1);
          
          for(i=0; i<=4; i++)
          {
             if(PESO[i] >= MA)
             {
                MA = PESO[i];
                NO = i;
             }
          }
          
          printf("O boi de nome ");
          for(i=0; j<=i; j++) //<-- quero que o programa pegue letra por letra do boi mais pesado
          {
             printf("%s",NOME[j]);
          }
          printf(" pesa mais que todos e apresenta %d Kg\n",MA);
          
          printf("\nA media aproximada do peso do rebanho e:\n%d",MED);
          printf("\n\nNo rebanho, ha %d boi(s) com mais de 10 anos",C);
          
          getch();
       
       }

     

    Obrigado pela ajuda @Simon Viegas .

     

    O programa está quase pronto, agora só falta descobrir a lógica que faça o programa mostrar letra por letra o nome do boi mais pesado. Poderia me ajudar nisso também?

     

    Atensiosamente,

    Gian.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá.

     

    1) CONDIÇÃO PARADA

    Em relação a não repetir, ocorre que antes de verificar, tem um um "i+1". Daí, o While está comparada com a posição da frente. Basta usar NOME[i-1].

     

    Mas ai tem que também não deixar ler o resto... ou seja, do jeito que está vai cadastrar um boi com o nome 'FIM'.

     

    Poderia usar um if para não ler o resto.

     

     

     

    2) BOI MAIS PESADO

    A posição dele está no NO, correto? logo, usaria NOME[NO].

     

    Ai falta só ver como separar as letras.

     

     

     

    ***

     

    No aguardo.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  •  

    Olá novamente!

    34 minutos atrás, Simon Viegas disse:

     

    1) CONDIÇÃO PARADA

    Em relação a não repetir, ocorre que antes de verificar, tem um um "i+1". Daí, o While está comparada com a posição da frente. Basta usar NOME[i-1].

     

    Mas ai tem que também não deixar ler o resto... ou seja, do jeito que está vai cadastrar um boi com o nome 'FIM'.

     

    Poderia usar um if para não ler o resto.

     

    Consegui fazer essa parte do while funcionar redondinho com a sua ajuda :D

    do 
          {
              printf("Digite o nome do boi numero %d:\n",i+1);
              scanf(" %s",&NOME[i]);
              
              if(strcmp(NOME[i],"FIM") != 0)
              {
                  printf("\nDigite o peso deste boi:\n");
                  scanf(" %d",&PESO[i]);
                  printf("\nDigite a idade deste boi:\n");
                  scanf(" %d",&IDADE[i]);
                  
                  S = S + PESO[i];
                  
                  if( IDADE[i] >= 10 )
                  {
                     C = C + 1;
                  }
                  
                  i = i + 1;
                  C2 = C2 + 1;
                      
                  system("cls");
              }
              
          } while(i != 80 && strcmp(NOME[i],"FIM") != 0);

     

    Agora a parte do nome do boi mais pesado aqui eu não consegui de jeito nenhum :/

     

    Editado por Gian Dias Campos
    erro de português

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×