Jump to content
Fórum Script Brasil
  • 0

Qual o problema disso? Aspas simples e dupla


Question

Vou colocar uma parte do programa, a parte que estou em duvida mas tem mais código pra cima e pra baixo do que vou mostrar.

image.png.eca76fb74fcbef47f7aaf44b23abf3f2.png

O que acontece é que eu não consigo fazer esse do-while funcionar, já tentei usar tanto o %c quanto o %s no scanf. já tentei usar aspas simples tanto na declaração do char, quanto la dentro da condição do while, tentei varias combinações envolvendo, %c %s ' '  e " ". Eu sei que o certo é usar a aspas simples e o %c porem tentei isso tudo porque não tava dando certo. Quando chega la no scanf do while, ele le a variavel cont mas depois finaliza o programa, nem chega a executar os comandos abaixo dele.

obs: já tentei com a biblioteca string.h inserida e não deu, tirei ela a toa mesmo.

 

Código completo:

#include <stdio.h>

#include <stdlib.h>


struct tiposDeVoto{
    int nulos;
    int brancos;
    int c[4];
}tDV={0,0,{0,0,0,0}};

struct porcVotos{
    float nulos;
    float brancos;
    float c[4];
}pV={0.0,0.0,{0.0,0.0,0.0,0.0}};

int main(){
    /*Em uma eleição para governador concorrem 4 candidatos (1, 2, 3 e 4). No dia da eleição cada
     um dos N eleitores votaram:
• 1, 2, 3 ou 4 para cada candidato.
• 0 (zero) para voto em branco.
• -1 para voto nulo.
Considere que:
• O candidato ganha a eleição se fizer 51% ou mais do total de votos.
• Se não houver ganhador, os dois melhores irão para o segundo turno.
Faça um programa em C que calcule e imprima:
• O candidato vencedor (se houver), seguido da porcentagem de votos obtida. Se não houver vencedor,
 imprima os candidatos que irão ao segundo turno com a respectiva porcentagem de votos obtida.
• A porcentagem obtida pelos demais candidatos.
• A porcentagem de votos em branco e nulos.*/
    tentenovamente:
    printf("----------------------------\n");
    printf("         Urna eleitoral       ");
    printf("\n 1- Tiago\n 2- Pedro\n 3- Alvaro\n 4- Chaves\n 0- Voto em branco\n -1- Voto nulo\n");
    printf("------------------------------\n");

    
    int voto=0,i=0;
    char cont="a";

    do{

    printf("Digite o voto: ");
    scanf("%i",&voto);
    switch (voto){
        case 1:
            tDV.c[0]+=1;
            break;
        case 2:
            tDV.c[1]+=1;
            break;
        case 3:
            tDV.c[2]+=1;
            break;
        case 4:
            tDV.c[3]+=1;
            break;
        case -1:
            tDV.nulos+=1;
            break;
        case 0:
            tDV.brancos+=1;
            break;
        default:
            printf("Escolha invalida!\nTente novamente!\n");
            goto tentenovamente;
    }
    
        i++;
        printf("Quer continuar? [S/N]");
        scanf("%s",&cont);   
    } while (cont=="S");
    


    int totalDeVotos=i+1;
    pV.brancos=tDV.brancos/totalDeVotos;
    pV.nulos=tDV.nulos/totalDeVotos;
    for (int k=0;k<4;k++)
        pV.c[k]=(float)tDV.c[k]/totalDeVotos;
        int vencedor=0;
    printf("pv.c[0]: %.2f\n",pV.c[0]);

    if(pV.c[0]>0.51 && pV.c[0]>pV.c[1] && pV.c[0]>pV.c[2] && pV.c[0]>pV.c[3]){
        vencedor=1;
        printf("Tiago e o vencedor da eleicao com %0.2f %% dos votos",(pV.c[0]*100));
    }
    if(pV.c[1]>0.51 && pV.c[1]>pV.c[0] && pV.c[1]>pV.c[2] && pV.c[1]>pV.c[3]){
        vencedor=1;
        printf("Pedro e o vencedor da eleicao com %0.2f %% dos votos",(pV.c[1]*100));
    }
    if(pV.c[2]>0.51 && pV.c[2]>pV.c[0] && pV.c[2]>pV.c[1] && pV.c[2]>pV.c[3]){
        vencedor=1;
        printf("Alvaro e o vencedor da eleicao com %0.2f %% dos votos",(pV.c[2]*100));
    }
    if(pV.c[3]>0.51 && pV.c[3]>pV.c[0] && pV.c[3]>pV.c[2] && pV.c[3]>pV.c[1]){
        vencedor=1;
        printf("Chaves e o vencedor da eleicao com %0.2f %% dos votos",(pV.c[3]*100));
    }
    /*if (vencedor==0){
        printf("vencedor=0");
    }*/


    return 0;
}

 

Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0

O seu problema está relacionado com lixo deixado no buffer do teclado após

Em 24/04/2020 em 20:27, JaoOLeigo disse:

scanf("%i",&voto);

A quebra de linha não é lida e permanece no buffer, sendo capturada em

Em 24/04/2020 em 20:27, JaoOLeigo disse:

scanf("%s",&cont);

O que faz o programa prosseguir sem solicitar entrada de dados do usuários. Diante disto, se faz necessária a limpeza do buffer.
Leia mais sobre buffer e como limpá-lo nessa publicação.
Organizei seu código e agora está funcionando. Qualquer dúvida, pergunte.
 

//Importações de bibliotecas
#include <stdio.h>
#include <stdlib.h>

/*Problema:
Em uma eleição para governador concorrem 4 candidatos (1, 2, 3 e 4). No dia da eleição cada
um dos N eleitores votaram:
• 1, 2, 3 ou 4 para cada candidato.
• 0 (zero) para voto em branco.
• -1 para voto nulo.
Considere que:
• O candidato ganha a eleição se fizer 51% ou mais do total de votos.
• Se não houver ganhador, os dois melhores irão para o segundo turno.
Faça um programa em C que calcule e imprima:
• O candidato vencedor (se houver), seguido da porcentagem de votos obtida. Se não houver vencedor,
 imprima os candidatos que irão ao segundo turno com a respectiva porcentagem de votos obtida.
• A porcentagem obtida pelos demais candidatos.
• A porcentagem de votos em branco e nulos.*/

#define TAM 6		//Defina constantes para facilitar posterior adaptação

//Estruturas
typedef struct{
	int id;
    char nome[20];
    int votos;
    float percentual;
} Cand;


//Função principal
int main(){
	//Declaração de variáveis
	int voto=0, total=0, i, j, invalido;
    char continuar;
	Cand candidatos[TAM] = {{1, "Tiago", 0, 0}, {2, "Pedro", 0, 0}, {3, "Alvaro", 0, 0}, {4, "Chaves", 0, 0}, {0, "Branco", 0, 0}, {-1, "Nulo", 0, 0}};
	Cand aux;
	
	//Apresentação
    printf("------------------------------\n");
    printf("         Urna eleitoral       \n");
	for (i=0; i<TAM; i++) printf("%d - %s\n", candidatos[i].id, candidatos[i].nome);
    printf("------------------------------\n");

	//Votação
    do{
		do{
			invalido = 1;		//True
			printf("Digite o voto:\n");
			scanf("%i", &voto);
			for (i=0; i<TAM; i++){
				if (candidatos[i].id == voto){
					invalido = 0;		//False;
					candidatos[i].votos++;
					break;
				}
			}
			if (invalido) printf("~Opcao invalida! Tente novamente.\n");
			else printf("Voto contabilizado com sucesso!\n");
		} while (invalido);
		printf("Deseja realizar outro voto?[S/N]\n");
		fflush(stdin);		//Linpando Buffer
		continuar = getchar();  
    } while (continuar=='S' || continuar=='s');
    
	//Apuração
	for (i=1; i<TAM; i++){	//Ordenação decrescente pelo método da inserção
		aux = candidatos[i];
		for (j = i-1; j>=0 && candidatos[j].votos < aux.votos; j--) candidatos[j+1] = candidatos[j];
		candidatos[j+1] = aux;
	}
	for (i=0; i<TAM; i++) total += candidatos[i].votos;	//Soma dos votos
	for (i=0; i<TAM; i++) candidatos[i].percentual = (float) candidatos[i].votos/total;		//Calculando percentuais
	
	//Exibição de resultados
    printf("------------------------------\n");
    printf("          Resultado        \n");
	for (i=0; i<TAM; i++) printf("%s: %d votos (%.2f%%)\n", candidatos[i].nome, candidatos[i].votos, candidatos[i].percentual*100);
	if (candidatos[0].percentual >= 0.51) printf("---->>>  %s venceu a eleicao <<<----\n", candidatos[0].nome);
	else printf("> Segundo turno entre %s e %s.", candidatos[0].nome, candidatos[1].nome);
    return 0;
}

 

Edited by Hazzu
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      148911
    • Total Posts
      645018
×
×
  • Create New...