Jump to content
Fórum Script Brasil
  • 0

Ajuda em urna eletrônica em C


LucasrVeras

Question

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 to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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.

Edited by vangodp
Link to comment
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
      152.2k
    • Total Posts
      652k
×
×
  • Create New...