Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda em urna eletrônica em C


LucasrVeras

Pergunta

Estou com uma dúvida no meu trabalho da escola o professor pediu para os alunos fazer uma urna que repita a operação dez vezes. O problema e que eu não sei fazer isso, se Alguém poder me ajudar fico muito grato.

Outra dúvida e logo no começo quando to declarando char, quando jogo o comando scanf para eu digita o nome, seu eu da um espaço entre as letras o código executa todo de uma vez n sei também resolver isso.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main() {
int idade,tit,cand=0,cand1=0,cand2=0,branco=0,nulo=0,op;
char nome[30];
printf ("\n\n\n ************** Eleicaoes 20015 *************** \n\n\n");
printf ("Informe seu nome: ");
scanf ("%s",&nome);
printf ("informe sua idade: ");
scanf ("%f", &idade);
printf ("Informe seu titulo: ");
scanf ("%f",&tit);
printf ("\n\n");
printf ("Escolha um dos candidadtos\n\n");
printf ("\n(1) Doritos\n");
printf ("(2) ruffles\n");
printf ("(9) Branco\n");
printf ("(3) nulos\n\n");
printf ("\nInforme o numero do seu candidado: ");
scanf ("%i",&op);
switch (op){
case 1:
cand++;
printf ("\n\nVoce votou em Doritos");
break;
case 2:
cand2++;
printf ("\n***** voce votou em Ruffles *****\n\n");
break;
case 9:
branco++;
printf ("\n***** voce votou em Branco *****\n\n");
break;
case 3:
nulo++;
printf ("\n***** você votou nulo *****");
break;
default:
printf ("\n**** Opcao invalida *****\n\n");
break;
}
printf ("\nDoritos tem %i votos", cand);
printf ("\nRufles tem %i vottos", cand2);
printf ("\nForam %i votos em branco", branco);
printf ("\nforam %i votos nulos\n\n", nulo);
getch ();
}
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Olá!

- com relação ao espaço em branco isso ocorre, porque scanf() para de ler a string assim que encontra o primeiro espaço em branco, e ignora tudo o que estiver apos o espaço, para evitar isso é necessario a introdução de um codigo de formatação especifico no proprio scanf(), existem n formas de se fazer isto, a que eu mais uso é scanf ( "%[^\n]s"); mas existem outras formas de faze-lo!

- alem, disso existe tambem a possibilidade de ocorrer de seu programa usar lixo de memoria, no scanf(), tambem existem n formas de faze-lo, uma delas é por uma função que limpe o buffer a cada scanf() ou usar algum codigo de formatação no scanf() para evitar o lixo de memoria, tente encontrar o melhora para você!

- com relação a repetir 10 vezes você pode usar uma estrutura de repetição ( Laço ) para faze-lo, tente ler sobre isto e tente postar o que você conseguir entender e tentar usar no seu codigo sobre laços ! ! !

Laços:

- while

- do while

- for

a forma de implementar cada um é muito similar, com apenas algumas poucas diferenças, mas fazem basicamente a mesma coisa ! ! !

Espero ter ajudado!

Link para o comentário
Compartilhar em outros sites

  • 0

scanf lê até encontrar espaço' ', ou um tabulador'\t' e por ultimo um enter'\n'.

Si escrevemos "alo mundo" e pulsar enter, no buffer a coisa fica assim: "'a','l','o',' ','m','u','n','d','o','\n'". Então nesse caso temos 2 coisas que "quebram" a frase, um espaço e um enter( ' ' e '\n' ).

O \n ele é um char valido igual que outro qualquer, ele esta na tabela asc2, e tem um valor 10 em decimal e ele ainda tem mais uma qualidade diante de scanf, ele é o encargado de vaziar o buffer.

Scanf vai acumulando letras até encontrar o scanf que é como si fosse um aviso de ir liberando tudo o que ta acumulado nas seguintes variáveis que ele vai encontrando, más seguindo as regras que antes falei sobre que ele vai liberando elas dependendo si encontra espaço, tabulador ou o mesmo enter.

Então vamos ver exemplos

si tenho char frase[100]; e char outraFrase[100]; e faço uma leitura com scanf ("%s", frase); e que nesse momento nós escrevemos "alo mundo" e pulsamos enter, o scanf vai por tudo isso no buffer, ficando "alo mundo\n", logo depois ele vai ver o \n e não vai descansar até que o buffer esteja vazia, tudo da seguinte forma:

1º ele vai pegar as letras até que encontra um espaço, tabulador ou enter, isso é começando pelo inicio de la primeira letra 'a' de "alo", ele vai checando letra a tetra ate encontrar os caracteres' ', '\t' e '\n', obviamente logo depois de 'o' de "alo" tem um espaço, então ai o buffer mete a tesoura e "corta" "alo" e o envia a primeira variavel compativel que encontrar que nesse caso é frase, agora o buffer tem "mundo\n", más scanf já não tem + variáveis compativeis com strings para meter o resto, isso não significa que a coisa vai parar ai, pois o buffer tem que ser vaziado completamente e de forma correta si ainda resta um string, tem que esperar outro scanf com outro string.

Então mais abaixo queremos ler outra frase com scanf, ai temos scanf ("%s", outraFrase); que pedimos bunitinha outra frase, e para nossa surpresa descobrimos que o programa passou direto pelo scanf e nem leu nada, mas isso foi por que como o buffer ainda tinha lá "mundo\n" e esta ainda com o \n que esta dizendo que tudo saia do buffer, ele nem vai esperar, ele vai meter o mundo+\n tudo ai essa segunda variável por você.

Então vamos ver uns exemplos:

#include <stdio.h>

int main(){
    
    char f[100];  //frase
    char of[100]; //otra frase
    
    printf("Escreva uma frase: ");
    scanf("%s", f);
    
    printf("Escreva outra frase: ");
    scanf("%s", of);   //<- vai pasar direto por aqui nem vai parar, más of vai ganhar "mundo" igualmente 
    

    printf("\n\nfrase: %s\n", f);
    printf("Outra frase preenchida automaticamente: %s\n", of);    
    
    printf("\nAdeus..\n");
    return 0;
}

Depois de escrever alo mundo olhe como f ganha "alo" e of ganha "mundo".

Outro exemplo com chars:

Nesse exemplo escolha uma letra e pulse enter para ver como enter se mete em c2. Al imprimir c2 como inteiro podemos ver um valor de 10 em decimal que você pode buscar ele aqui: http://pt.wikipedia.org/wiki/ASCIIna parte de sinais não imprimíveis.

#include <stdio.h>

int main(){

    char c1; 
    char c2;
    
    printf("Escreva uma letra: ");
    scanf("%c", &c1);
    
    printf("Escreva outra letra: ");
    scanf("%c", &c2);   //<- vai pasar direto por aqui nem vai parar, más c2 vai ganhar o caracter enter igualmente, pois ele tambem é uma letra. 
    

    printf("\n\nLetra c1: %c\n", c1);
    printf("Letra c2: %d <- isso aqui é o enter imprimido como inteiro %%d, assim vc pode comparar ele na tabela asc2 e var que ele vale 10\n", c2);    
    
    
    printf ("\n\nBusque em: http://pt.wikipedia.org/wiki/ASCII a tabela asc2, na parte de Sinais de controle(não- imprimiveis)\n");
    return 0;
}

Existem letras que não são visíveis como letra, más todas são visíveis como inteiros.

Que fique constância que isso não é um erro de scanf nem muito menos. O scanf trabalha de forma correta somos nós que falhamos sempre como programadores, e agora vou explicar com um exemplo:

#include <stdio.h>

int main(){

    char nome[100];
    char sobrenome[100];
    
    printf("Escreva nome e sobrenome separados por espaço. Exemplo: \"Jose freitas\"\n");
    scanf("%s %s", nome, sobrenome);
    
    printf("\n%s %s\n\n", nome, sobrenome);

    return 0;
}

Outro exemplo:

#include <stdio.h>

int main(){

    int dia;
    int mes;
    int ano;
    printf("Escreva uma data composta de dia, mes e ano separadas por '/': exemplo\"24/07/2015\"\n");
    scanf("%d/%d/%d", &dia, &mes, &ano);
    
    printf("dia: %d mes: %d ano: %d", dia, mes, ano);

    return 0;
}

Como podemos ver scanf é uma função muito útil uma vez aprendemos a trabalhar com ela.

Como solucionar o problema?

existem muitas formas de resolver esse problema. Podemos limpar buffer ou evitar que entre a ultima tecla pulsada ao buffer com %*c. vamos ver um exemplo:

#include <stdio.h>

int main(){
    char c1;
    char c2;
    
    printf("Escreva uma letra: ");
    scanf("%c%*c", &c1);
    
    printf("Escreva outra letra: ");
    scanf("%c%*c", &c2);   //<- agora aqui vai ler corretamente a causa de %*c evita que a ultima tecla pulsada entre al buffer 
    
    printf("\n\nLetra c1: %c\n", c1);
    printf("Letra c2: %c \n", c2);    
    
    return 0;
}

Como pode ver existe formas de evitar esse erro. Busque sobre como limpar o buffer entrada pero no use fflush com strings, existe más de una forma de faze-lo, investiga um poco. http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

Acho que já esta explicado, depende de você investigar sobre o tema de buffer, scanf, especificadores de formato tanto em printf como scanf, tabela asc2... etc etc.

Sorte!

PD: nesse mesmo forum encontrei um exemplo de por que você não deve usar fflush ainda que te digam que sim:

https://www.scriptbrasil.com.br/forum/topic/164704-resolvendo-problemas-de-buffer/

Preste atenção ao comentário de axell13 que explica por que não usar fflush e sugere uma alternativa para limpar o buffer sem problemas.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...