1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Programa para votar

Discussão em 'Programação' iniciada por Ir0nMaid3n**, 25 de Outubro de 2008. (Respostas: 28; Visualizações: 1531)

  1. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Boas
    Estava interessado na elaboração de um programa que pudesse servir como uma cabina de voto em que as pessoas pudessem votar
    so que nao sei como se usa a intrucção if
    o programka seria assim
    Código:
    #include <Windows.h>
    #include <stdio.h>
     
     
    int main ()
    {
    float BUSH,OBAMA,MCAIN;
     
    printf("Vote num dos três caditactos , bush , Mcain ou Obama ");
    
    (depois seria se o utilizador votar em bush por o valor na variavel que corresponde a BUSH
    e somar 1 a variável bush o mesmo aplicava-se as outras variaveis e aos outros candidactos)
    Código:
    printf("Obrigado por votar , tenha um bom dia);
    Sleep(2000);
    
    (e o programa voltava ao inicio mostrando o nome dos candidactos e deixava o proximo utilizador
    que viesse votar)
    (e depois pa ver os votos tinha-se de inserir um comando especial e mostarava os resultados das variaveis)
    Cump Ir0n
     
    Última edição pelo moderador: 25 de Outubro de 2008
  2. h4des

    h4des Power Member

    E então? Qual é a duvida?
     
  3. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    tipo nao sei usar a funcao if de forma a que posso por o programa a funcionar
    Se me pudessem explicar mais ou menos como proceder agradecia
    Cumps ir0n
     
  4. solidforms

    solidforms Power Member

    hum, primeiro terás que ler da consola, usando o scanf ou o fgets(line, MAX_LINE, stdin) indicando que estas a passar para a variavel line o stdin (standard input, se nao erro). Depois terás que testar com ifs.
    Ficaria do genero:

    Código:
    #include <string.h>
    int BUSH, OBAMA, McCain;
     
    int main()
    {
    char line[1024];
    for(;;)
    {
    printf("Vote num dos três caditactos , bush , Mcain ou Obama \n");
    scanf("%s",&line);
    if(strcmp(....))
    obama++;
    if(....)
    (....)
    }
    }
     
  5. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Esqueci-me de mencionar que o programa que estou a tentar fazer e em C
    Cumps Ir0n
     
  6. solidforms

    solidforms Power Member

    hum, o que pus esta em C.

    O strcmp(string1, string2) devolve 0 se forem iguais, logo será mais ou menos assim:
    Código:
    if(strcmp(line, "OBAMA") == 0) obama++;
    if(strcmp(line, "BUSH") == 0) bush++;
    
    Estranho, mas verdade. A maioria das vezes o retorno de uma funçao de "verificação" é 1 se sucesso e 0 de falha/erro/insucesso. Neste caso funciona como o compareTo() do Java, devolve 0 se iguais, um valor negativo ou positivo caso contrario. Todavia, o positivo e negativo poderá ter algumas implicaçoes uteis, mas raramente sao usados. se tiveres strcmp(s1, s2) pode dar negativo, ou strcmp(s2,s1) com as mesmas strings mas numa ordem diferente ja pode dar positivo. Mas o que interessa é que sao diferentes ;D.

    Cumprimentos ;)
     
    Última edição pelo moderador: 25 de Outubro de 2008
  7. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Eu nao percebo muito do codigo sou um noob em programação mas isso da para fazer uma coisa deste genero
    Código:
    if(utilizador escrever obama)
    Obama=Obama+1;
    Else
    printf("escreva um nome de um candidacto")
    
    Tipo e eu nao percebo muito bem o codigo e as funcões de por exemploa char line e isso
    Se nao fosse muito trabalhoso poderias-me explicar passo a passo ?
    Cumps ir0n
     
    Última edição pelo moderador: 25 de Outubro de 2008
  8. solidforms

    solidforms Power Member

    hum, entao eu vou tentar ;).
    O char line[1024] é uma declaração de uma variavel. Que é um vector de char com um comprimento de 1024 caracteres. Porque em C nao existem Strings, portanto a unica maneira é declarares sequencias de caracteres, vector de char. Podes sempre fazer assim:
    char nome[30] = "solidforms"; reservas um vector com capacidade para 30caracteres em que as primeiras posiçoes sao preenchidas com "solidforms", em que nome[0] = 's', nome[1] = 'o', etc.

    Código:
    #include <string.h> // possibilita o uso de funçoes da biblioteca string.h, como strcmp()
    int BUSH, OBAMA, McCain;
     
    int main()
    {
    char line[1024];
    for(;;) // vai estar em ciclo infinito a contar votos so termina quando se inserir um comando "quit" ou algo do genero
    {
    printf("Vote num dos três caditactos , bush , Mcain ou Obama \n");
    scanf("%s",&line); // vai esperar que algo seja escrito na consola e guarda o input em line
    if(strcmp(line, "Obama") == 0) // o strcmp compara o que se inseriu com o nome "obama" se a função retornar 0 entao sao iguais e incrementa o contador de votos para o obama
    obama++;
    if(strcmp(line, "Bush") == 0)
    bush++;
    if(strcmp(line, "Mccain") == 0)
    mccain++;
    if(strcmp(line, "Quit") == 0)
    return 0; // aqui o return 0 termina o ciclo e consequentemente o programa
    else printf("Comando invalido, tente novamente.\n");
    }
    }
     
    
     
    Última edição: 25 de Outubro de 2008
  9. JomarC

    JomarC Power Member

  10. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Obrigadissimo pela explicação
    Ja corri o programa em compiler mas quando insiro o nome do candidacto elee diz que o comando é invalido
    ja escrevi BUSH,bush,OBAMA,obama,MCcain,McCain etc.. e nao dá..
     
  11. solidforms

    solidforms Power Member

    hum, tens que ter atenção que o teste de comparação é case sensitive (acho eu, :x). Portanto, ve como tens o nome escrito dentro de um dos ifs.

    Em relação ao switch, penso que nao seria util visto que so aceita caracteres e nao strings.

    ;)
     
  12. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    tipo ja mudei o nome entre aspas e ele nao reconhece
    pus 2 em vez de obama e ele disse que estva errado o comando
     
  13. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Código:
    #include <stdio.h>
    #include <string.h> // possibilita o uso de funçoes da biblioteca string.h, como strcmp()
    int BUSH, OBAMA, McCain;
     
    int main()
    {
    char line[1024];
    for(;;) // vai estar em ciclo infinito a contar votos so termina quando se inserir um comando "quit" ou algo do genero
    {
    printf("Vote num dos três caditactos , bush , Mcain ou Obama ");
    scanf("%s",&line); // vai esperar que algo seja escrito na consola e guarda o input em line
    if(strcmp(line, "OBAMA") == 0) // o strcmp compara o que se inseriu com o nome "obama" se a função retornar 0 entao sao iguais e incrementa o contador de votos para o obama
    OBAMA++;
    if(strcmp(line , "BUSH") == 0)
    BUSH++;
    if(strcmp(line, "McCain") == 0)
    McCain++;
    if(strcmp(line, "Quit") == 0)
    return 0; // aqui o return 0 termina o ciclo e consequentemente o programa
    else printf("Comando invalido, tente novamente.\n");
    }
    }
    Mudei o codigo desta maneira para podeser ser compilado pois a funcao printf precisa de include stdio.h
    Corri o programa e deu este erro depois de ter posto no if BUSH
    apareceu isto:
    [​IMG]
    http://img65.imageshack.us/my.php?image=232332fg8.jpg
     
  14. solidforms

    solidforms Power Member

    hum, estranho :x. nao sei que erro poderá ser :x.
    A imagem nao esta visivel :x, ou é igual à do link que esta abaixo?

    Experimenta criar tres variaveis:
    char bush[1024] = "bush" etc, e em vez de teres "BUSH" no if metes o nome da variavel.

    Hum, e experimentei tirar caracteres portugueses (acentos, etc) dos textos de input/output.

    Cumprimentos ;)
     
  15. h4des

    h4des Power Member

    a maneira como escreveste os if's não está bem. exprimenta assim:

    Código:
            printf("Vote num dos três caditactos , bush , Mcain ou Obama ");
            scanf("%s",&line); // vai esperar que algo seja escrito na consola e guarda o input em line
            if(strcmp(line, "OBAMA") == 0) {
               OBAMA++;
            } else {
               if(strcmp(line , "BUSH") == 0) {
                   BUSH++;
               } else {
                   if(strcmp(line, "McCain") == 0) {
                       McCain++;
                   } else {
                       if(strcmp(line, "Quit") == 0) {
                           return 0;
                       } else {
                           printf("Comando invalido, tente novamente.\n"); 
                       }
                   }
               }
            }
    
     
  16. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Nepia deume 4 erros no compilador
    C:\Users\UTILIZADOR\Pictures\Untitled5.cpp In function `int main()':
    7 C:\Users\UTILIZADOR\Pictures\Untitled5.cpp `line' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    24 C:\Users\UTILIZADOR\Pictures\Untitled5.cpp expected `}' at end of input
     
  17. Mike42

    Mike42 Power Member

    Código:
    #include <stdio.h>
    #include <string.h>
    int BUSH, OBAMA, McCain;
     
    int main(){
    	char line[1024];
    	while(1){
    		printf("\nVote num dos três caditactos , BUSH , MCCAIN ou OBAMA\n");
    
    		gets(line);
    
    		int votou = 0;
    
    		if(strcmp(line, "OBAMA") == 0){
    			OBAMA++;
    			votou++;
    		}
    		else if(strcmp(line , "BUSH") == 0){
    			BUSH++;
    			votou++;
    		}
    		else if(strcmp(line, "MCCAIN") == 0){
    			McCain++;
    			votou++;
    		}
    		else if(strcmp(line, "Quit") == 0)
    			return 0;
    
    		if(votou!=0)
    			printf("Voto registado. Obrigado!");
    		else
    			 printf("Comando invalido, tente novamente.\n");
    	}
    }
     
  18. Ir0nMaid3n**

    Ir0nMaid3n** Power Member

    Ja deu!
    Obrigado Mike
    Se me pudesses explicar por favor para que servem estas linhas
    : gets(line); , while(1) e if(votou!=0) printf("Voto registado. Obrigado!"); (aqui porque e que quando votou está a 0 e que ele diz que o voto foi registado) else if(strcmp(line, "Quit") == 0)(else if nao sei o ke e..)
    Desculpa la o trabalho mas eu sou mesmo noob em c
    Cump Ir0n
     
  19. Mike42

    Mike42 Power Member

    A função gets lê uma linha da consola (até ao \n) para a variavel dada como argumento, neste caso a variavel line.

    while(1) é o mesmo que for( ; ; ), mas a verdade é não se usa o for assim, para isso temos o while, que continua no ciclo se o argumento é diferente de 0 (true) e sai do ciclo se o argumento é igual a 0 (false).

    A questão do "porque e que quando votou está a 0 e que ele diz que o voto foi registado" não é assim. Estás a confundir == com !=. O primeiro quer dizer "igual", o segundo quer dizer "diferente".

    Os "else if" é simplesmente por uma questão de eficiência. Imagina que o utilizador tinha posto "OBAMA", não valia a pena verificar as outras opçoes (MCCAIN e BUSH). Imagina assim:

    Código:
    if(numero == 1)
    printf("1");
    else
    printf("não 1");
    
    não é o mesmo que fazer

    Código:
    if(numero == 1)
    printf("1");
    if(numero != 1)
    printf("não 1");
    
    Na segunda versão, ambos os "ifs" são avaliados. No primeiro, caso o "numero" seja 1, salta logo à frente do "else". O mesmo se passa no "else if". Se tiveres vários "else if" encadeados, quando um deles dá verdadeiro, os seguintes já nao sao avaliados.

    Espero que tenhas percebido, se ficou alguma coisa enublada diz que eu tento explicar melhor :P
     
    Última edição pelo moderador: 25 de Outubro de 2008
  20. Tyran

    Tyran Power Member

    Esses scanf's não precisam do endereço '&' para tratar das strings.
    Estás a compilar em cpp por alguma razão em especial?

    Isso ficava bem melhor com uma função, mas é melhor não complicar para já se calhar?
    Já agora, C não suporta strings nos switch case pois não? ficava bem melhor.

    Código:
    #include <stdio.h>
    #include <string.h>
     
    int main( void){
        int BUSH=0, OBAMA=0, McCain=0;
        char line[1024]=" ";
        int votou = 0;
    
        while( strcmp(line, "Quit") != 0){
            printf("\nVote num dos três candidatos , BUSH , MCCAIN ou OBAMA\n");
    
            fgets( line, 1024, stdin);        
    
            if(strcmp(line, "OBAMA") == 0){
                OBAMA++;
            }
            else if(strcmp(line , "BUSH") == 0){
                BUSH++;
            }
            else if(strcmp(line, "MCCAIN") == 0){
                McCain++;
            }
            else if(strcmp(line, "Quit") != 0) {
               printf("Comando invalido, tente novamente.\n");
               continue;
            }
    
           else  continue; //volta à cabeça, isto é, teste o while de novo
            
            printf("Voto registado. Obrigado!"); 
        }
    
        return 0;
    }
    
    Pronto, assim à pressa, tens aqui nova versão adaptada de uma que vi por aí, podes tornar mais eficiente, mas para começar penso que dá para perceber a ideia.

    @Mike a ideia é boa, mas variáveis globais e essas locais dentro do while (não me lembro bem é do nome dessas) como ele está a começar pode não ser uma boa prática se calhar, só uma opinão ;)

    cumpzz
     

Partilhar esta Página