Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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();
   
   }

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

  • Membro VIP

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

@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();
   
   }

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

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

  • Membro VIP

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

 

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 :/

 

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...