Programa para votar

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:
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(....)
(....)
}
}
 
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:
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:
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:
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á..
 
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.

;)
 
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:
my.php

http://img65.imageshack.us/my.php?image=232332fg8.jpg
 
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 ;)
 
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"); 
                   }
               }
           }
        }
 
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
 
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");
	}
}
 
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
 
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

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:
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
 
Back
Topo