Ir ao conteúdo

Posts recomendados

Postado

Eu estou estudando C e fiz o seguinte código:

#include <string.h>
#include <stdio.h>
void main()
{
  float q,c,s,v,t;
  int bq,bc,bs,bv;
  printf("\nEstá tendo uma festa em uma casa. Quantas pessoas tem em cada comodo?");
  printf("\nQuarto: ");
  scanf("%f", &q);
  printf("\nCozinha: ");
  scanf("%f", &c);
  printf("\nSala ");
  scanf("%f", &s);
  printf("\nVaranda: ");
  scanf("%f", &v);


  t=(q+c+s+v);
  bq=q/t*50;              //*50 para as barras terem no máximo 50 caracteres
  bc=c/t*50;
  bs=s/t*50;
  bv=v/t*50;

  char sq[102];			// strings que depois serão imprimidas para formarem as barras
  char sc[102];
  char ss[102];
  char sv[102];


  for(int lq=0; lq<bq; lq++)            //colocando um caracter até a porcentagem da barra
  {
    sq[lq]='|';
  }
    for(int lc=0; lc<bc; lc++)
  {
    sc[le]='!';
  }
  for(int ls=0; ls<bs; ls++)
  {
    ss[ls]='I';
  }
  for(int lv=0; lv<bv; lv++)
  {
    sv[lv]='+';
  }


  printf("|=Quarto (%d%%)\n!=Cozinha (%d%%)\nI=Sala (%d%%)\n+=Varanda(%d%%)\n\n",(bn*2),(be*2),(bi*2),(bp*2)); //o *2 é para mostrar a porcentagem certa
  printf("%s\n%s\n%s\n%s\n", sq, sc, ss, sv);
  strcat(sq,sc);
  strcat(sq, ss);
  strcat(sq, sv);
  printf("%s\n", sq);
}

  

O funcionamento esperado seria perguntar a quantidade de pessoas e imprimir um "gráfico de barras" com as porcentagens, assim:

Está tendo uma festa em uma casa. Quantas pessoas tem em cada cômodo?

Quarto: 2

Cozinha: 4

Sala: 3

Varanda: 1

|=Quarto (20%)

!=Cozinha (40%)

I=Sala (30%)

+=Varanda (10%)

||||||||||

!!!!!!!!!!!!!!!!!!!!

IIIIIIIIIIIIIII

+++++

||||||||||!!!!!!!!!!!!!!!!!!!!IIIIIIIIIIIIIII+++++

 

(sei que em alguns casos a soma das porcentagens podem dar até 96% mas não estou me importando muito com isso)

 

Mas a segunda e a terceira barra ficam com alguns símbolos como �� na hora de imprimir (fica IIIIIIIIIIIIIIIIIIIIIIIIII��) . Qual o meu erro?

  • Obrigado 1
Postado

@Aquiles Augusto    você não colocou o '\0' que marca o final de uma string , ali :

char sq[103];			// strings que depois serão imprimidas para formarem as barras
char sc[103];
char ss[103];
char sv[103];

for(int lq=0; lq<bq; lq++)            //colocando um caracter até a porcentagem da barra
{
  sq[lq]='|';
}
sq[lq] = '\0';
for(int lc=0; lc<bc; lc++)
{
  sc[le]='!';
}
sc[lc] = '\0';
// ai pode escrevr 
printf("string lq = %s\n",sq);
printf("string sc = %s\n",sc);

 

Postado

@Aquiles Augusto Acho que poderia deixar o código mais simples com um vetor para para armazenar a quantidade de pessoas em cada cômodo. Cada posição seria referente ao cômodo e depois é só fazer o cálculo nessas posições, p.ex,

 

#include <stdio.h>

#define TBARRA 50

int main(){
    const char *comodo[4] = {
        "Quarto", "Cozinha", "Sala", "Varanda"
    };
    int quantidade[4];
    int pessoas = 0;
    printf(
        "Esta tendo uma festa em uma casa."
        "Quantas pessoas tem em cada comodo?\n"
    );
    
    for(int i = 0; i < 4; i += 1){
        printf("%s: ", comodo[i]);
        scanf("%d", &quantidade[i]);
        pessoas += quantidade[i];
    }
    
    for(int i = 0; i < 4; i += 1){
        float porcentagem = quantidade[i]/(float)pessoas;
        float n = porcentagem * TBARRA;
        printf("\n%7s (%.2f%%)", comodo[i], porcentagem * 100);
        while(n > 0){
            printf("#");
            n -= 1;
        }
    }
    return 0;
}

 

  • Curtir 1
Postado
8 minutos atrás, Midori disse:
int main(){
    const char *comodo[4] = {
        "Quarto", "Cozinha", "Sala", "Varanda"
    };
    int quantidade[4];

 

Prefira sempre
 

#include <stdio.h>
int main(void)
{
    const char* comodo[] = { "Quarto", "Cozinha", "Sala", "Varanda" };
    int quantidade = sizeof(comodo) / sizeof(comodo[0]);
    printf("%d comodos\n", quantidade);
    return 0;
}

 

porque assim você pode por ou tirar elementos do vetor sem ter que declarar o tamanho e a quantidade estará sempre correta.

 

Se usar (como usou e é o costume) números fixos e acrescentar um cômodo vai ter que alterar em toda parte o tal número mágico 4 e pode acabar esquecendo algum.

 

@Aquiles Augusto Seu programa tem vários problemas ainda, está um pouco complicado sem razão mas está perto de funcionar.

 

Sobre o código:

 

  • main() retorna int. Declare assim.
  • teste SEMPRE o retorno de scanf(). É ingênuo seguir se não ler algo
  • declare uma variável por linha
  • use nomes mais expressivos
  • provavelmente não precisa de todas essas strings e repetir tanto o código
1 hora atrás, Aquiles Augusto disse:

||||||||||

!!!!!!!!!!!!!!!!!!!!

IIIIIIIIIIIIIII

+++++

||||||||||!!!!!!!!!!!!!!!!!!!!IIIIIIIIIIIIIII+++++

 

 

A diferença entre as primeiras 4 barras e barra final é a separação por '\n'. E de onde veio isso?
 

    printf("%s\n%s\n%s\n%s\n", sq, sc, ss, sv);

 

Pois é: foi você que colocou. E se escrever 

 

    printf("%s%s%s%s\n", sq, sc, ss, sv);

 

Vai ter a segunda barra sem fazer nada.

 

Mais ainda, como usa uma barra por vez não precisa de 4 strings e tudo mais

  • Curtir 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

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!