Ir ao conteúdo

Posts recomendados

Postado

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

 

  • Membro VIP
Postado

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
  • Membro VIP
Postado

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
Postado

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

 

  • Membro VIP
Postado

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
Postado

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
  • Membro VIP
Postado

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
Postado

 

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

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!