Ir ao conteúdo
  • Cadastre-se

Bug extremamente estranho nesse código em C


adrianofarias

Posts recomendados

Olá pessoal!

Escrevi um programa que simula uma eleição à um cargo numa empresa.

São três candidatos: A, B e C;

Há a possibilidade de voto branco e voto nulo.

O problema é que eu criei um contador chamado n_n que deve contar o

número de votos nulos e ele simplesmente não é incrementado quando

o usuário digita 'n'.

Em algumas versões do CodeBlocks acontece outro problema: o programa

sai do laço for sem que a condição de saída seja satisfeita.

segue o código abaixo:


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


//Tem um bug extremamente estranho no programa
//Ele simplesmente não conta o número de votos nulos
//Tem um printf como comentário para testar que o
//código executa o trecho de código onde tem um comando
//de incremento do contador de votos nulos
int main()
{
int i;
int k;
int n_A = 0;//contador de votos para A
int n_B = 0;//contador de votos para B
int n_C = 0;//contador de votos para C
int n_b = 0;//contador de votos brancos
int n_n = 0;//contador de votos nulos
char ch;//armazenará o caractere digitado pelo usuário
int n_votantes;//número de votantes
int n_validos;//número de votos válidos
char vencedor = '0';//indica qual candidato venceu as eleições
//considerando que não há vencedor se há
//empate entre os mais votados

printf("Informe os votos da seguinte forma:\n");
printf("Digite 'A' se o voto é para o candidato A;\n");
printf("Digite 'B' se o voto é para o candidato B;\n");
printf("Digite 'C' se o voto é para o candidato C;\n");
printf("Digite 'b' se o voto é branco;\n");
printf("Digite 'n' se o voto é nulo;\n");
printf("Informe o numero de seccoes: ");
scanf("%d", &k);

for( i = 1 ; i <= k ; i++ ){

printf("dados da seccao %d\n", i);
do{
scanf("%s", &ch);
if( ch == 'A' ){
n_A++;
}
else if( ch == 'B' ){
n_B++;
}
else if( ch == 'C' ){
n_C++;
}
else if( ch == 'b' ){
n_b++;
}
else if( ch == 'n' ){
n_n++;
//printf("Entrou aqui!\n");
}
else if( ch != '0' ){
printf("Dado invalido! Informe os dados");
printf(" da forma especificada acima.\n");
}
} while( ch != '0' );

}
//cálculo do número de votantes e de votos válidos
n_votantes = n_A + n_B + n_C + n_b + n_n;
n_validos = n_A + n_B +n_C;
printf("Numero de votantes: %d\n", n_votantes);
printf("Numero de votos do candidato A: %d\n", n_A);
printf("Numero de votos do candidato B: %d\n", n_;
printf("Numero de votos do candidato C: %d\n", n_C);
printf("Numero de votos brancos: %d\n", n_;
printf("Numero de votos nulos: %d\n", n_n);
printf("Numero de votos validos: %d\n", n_validos);

//esses ifs fazem todas as combinações possíveis das
//comparações e imprime o resultado das comparações
if( n_A > n_B ){
if( n_A > n_C ){
printf("O Candidato A foi o mais votado.\n");
vencedor = 'A';
}
else if( n_A == n_C )
printf("Os Candidatos A e C foram os mais votados.\n");
else{
printf("O Candidato C foi o mais votado.\n");
vencedor = 'C';
}
}
else if( n_A == n_B ){
if( n_A > n_C )
printf("Os candidatos A e B foram os mais votados.\n");
else if( n_A == n_C)
printf("Os candidatos A, B e C receberam a mesma votacao.\n");
else{
printf("O candidato C foi o mais votado.\n");
vencedor = 'C';
}
}
else{
if( n_B > n_C ){
printf("O candidato B foi o mais votado.\n");
vencedor = 'B';
}
else if ( n_B == n_C )
printf("Os candidatos B e C foram os mais votados.\n");
else{
printf("O candidato C foi o mais votado.\n");
vencedor = 'C';
}
}

//decidindo se a eleição foi válida
if( (n_b + n_n) < n_validos )
printf("As eleicoes foram validas.\n");
else
printf("As eleicoes nao foram validas.\n");

//decidindo se haverá segundo turno
if((vencedor = 'A') && ( n_A > 0.5*n_validos )){
printf("Nao havera segundo turno.\n");
printf("O candidato A venceu as eleicoes!\n");
}
else if((vencedor = 'B') && ( n_B > 0.5*n_validos )){
printf("Nao havera segundo turno.\n");
printf("O candidato B venceu as eleicoes!\n");
}
else if((vencedor = 'C') && ( n_C > 0.5*n_validos )){
printf("Nao havera segundo turno.\n");
printf("O candidato C venceu as eleicoes!\n");
}
else
printf("Havera segundo turno.\n");

return 0;
}

Aguardo alguma ajuda.

Valeu!!!

Link para o comentário
Compartilhar em outros sites

Não sei porque exatamente o código aconteceu, mas vou tentar ajudar a descobrir.

-scanf("%s", &ch); Isso serve para ler strings. O que você quer é

scanf("%c", &ch);

Talvez isso gere erro de leitura. Possibilidade 1

-Pode existir uma variável reservada com o nome "n_n". Tente renomear para nn e ver se pára o problema. Possibilidade 2.

-Naquela sua mensagem de erro acrescente o valor atual de n_n, assim você acompanha como está o valor ciclo a ciclo.

//printf("Entrou aqui! n_n=%d\n", n_n);

-Reze para alguma divindade em que confia e peça para ela ajudar.

-Posta aí qual o resultado de cada sugestão.

Link para o comentário
Compartilhar em outros sites

Valeu pelas dicas barutaji mas foi de outra maneira que resolvi.

Eu usei %s e não %c porque tava dando erro na execução;

n_n não é palavra reservada e, mesmo que fosse, eu mudei várias

vezes o nome da variável;

Rezar não adiantou pois não sou religioso;

A solução é bem simples. É só colocar um fflush(stdin) após cada

scanf pois o que tava acontecendo era que o buffer do teclado

estava sendo lido pelo scanf toda vez que era chamado e não lia

o que o usuário digitava.

Agora pude trocar %s por %c e tudo funcionou às mil maravilhas!:lol:

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!