Ir ao conteúdo
  • Cadastre-se

C por que a porcentagem só entende 100% ??


James_Mulder

Posts recomendados

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

int main()
{
    int cand1=0, cand2=0, brancos=0, nulos=0, total=0;
    float porccand1=0, porccand2=0, porbrancos=0, pornulos=0;

    char op, c;

    do{
        printf("Digite\n1 para o candidato X,\n2 para o candidato Y,\nB para votar em branco\nN para votar nulo");
        printf("\nou 0 para sair: ");
        fflush(stdin);
        scanf("%c%c", &op, &c); //lê dois caracteres para limitar os votos a apenas 1 caracter
        op=toupper(op);


        switch(op){
            case '1':
                if(c != '\n') //caso seja digitado dois caracters iguais (11) ele desconsiera e soma para nulos
                    nulos++;
                else
                    cand1++;
                break;
            case '2':
                if(c != '\n')
                    nulos++;
                else
                    cand2++;
                break;
            case 'B':
                brancos++;
                break;
            case 'N':
                nulos++;
                break;
            case '0':
                break;
            default:
                nulos++;
                break;

        }total=cand1+cand2+nulos+brancos;
    system("cls");
    }while(op != '0');
    printf("votos para o candidato X = %d\n\nvotos para o candidato Y = %d\n\nvotos brancos = %d\n\nvotos nulos = %d\n", cand1, cand2, brancos, nulos);
    printf("\ntotal de votos = %d\n\n", total);
    porccand1=((cand1/total)*100);
    porccand2=((cand2/total)*100);
    porbrancos=((brancos/total)*100);
    pornulos=((nulos/total)*100);

    printf("%.2f", porccand1);
    printf("\n%.2f", porccand2);
    printf("\n%.2f", porbrancos);
    printf("\n%.2f", pornulos);


	}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Acontece que isso é um erro de conversão de tipos e assim o valor fica arredondado. 

Ali onde você divide o quantidade pelo total, deveria ter um cast no total, assim: porccand1 = (cand1/(float)total) * 100

e assim o valor do resultado da divisão será um float e não int. Você pode ainda mudar o tipo do total e das outras variáveis declaradas como int lá no início do main e mudar para float ou double, e com isso ela teriam precisão com ponto flutuante (valores depois da vírgula). 

 

Lembre que int é um número que não tem vírgula, int é de integer (ou inteiro em português). Se dividir por exemplo, 25 / 10 e guardar esse valor numa variável do tipo int, você não terá 2.5, mas sim o valor 2 (inteiro). 

Link para o comentário
Compartilhar em outros sites

@James_Mulder      ele só aceita 100% por que a fórmula está com erro , você pode usar a regra de três ,  e seu código com algumas modificações poderia ser assim   :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define delay for(f=0;f<50000000;f++);
int main(){
    system("color ec");
    int   cand1=0,cand2=0,brancos=0,
          nulos=0,total=0,f;
    float porccand1=0,porccand2=0,
          porbrancos=0,pornulos=0;
    char  op,c;
    do{
        printf("Digite\n"                );
        printf("1 para o candidato X\n"  );
        printf("2 para o candidato Y\n"  );
        printf("B para votar em branco\n");
        printf("N para votar nulo\n"     );
        printf("0 para sair : "          );
        fflush(stdin);
        scanf("%c%c",&op,&c); //lê dois caracteres para limitar os votos a apenas 1 caracter
        op = toupper(op);
        switch(op){
        case '1':
            if(c != '\n') //caso seja digitado dois caracters iguais (11) ele desconsiera e soma para nulos
                nulos++;
            else
                cand1++;
            break;
        case '2':
            if(c != '\n')
                nulos++;
            else
                cand2++;
            break;
        case 'B':
            brancos++;
            break;
        case 'N':
            nulos++;
            break;
        case '0':
            break;
        default:
            nulos++;
        }
        total = cand1+cand2+nulos+brancos;
        system("cls");
    }while(op != '0');
    printf("votos para o candidato X -= %d\n\n",cand1  );
    printf("votos para o candidato Y -= %d\n\n", cand2 );
    printf("votos brancos ------------= %d\n\n",brancos);
    printf("votos nulos --------------= %d\n\n",nulos  );
    printf("total de votos -----------= %d\n\n",total  );
    porccand1  = cand1  *100/total;
    porccand2  = cand2  *100/total;
    porbrancos = brancos*100/total;
    pornulos   = nulos  *100/total;
    printf("porccand1 --: %.2f\n", porccand1);
    printf("porccand2 --: %.2f\n", porccand2);
    printf("porbrancos -: %.2f\n", porbrancos);
    printf("pornulos ---: %.2f\n", pornulos);
    printf("\n      Tecle   !\n\n");
    while( ! kbhit() ){
        printf("       | \r"   );delay;
        printf("       / \r"   );delay;
        printf("       - \r"   );delay;
        printf("       %c\r",92);delay;
    }
    printf("\n\n\n");
    return 0;
}

mas essa limitação de caracteres não está funcionando não ,  para isso você pode usar uma string  e verificar os caracteres digitados .

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!