Conceitos em C - Programa de cadastro

Started by Dark_Side, 11 de October , 2007, 12:12:24 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,
Estive bastante tempo inativo em razão de algumas prioridades que vendo adotando. Além da ausência no fórum, eu também me afastei um pouco da área de programação. Para relembrar alguns conceitos, escrevi um simples programa que mostra um sistema básico de cadastro de usuários. Uma vez em que o código do programa possa ser útil àqueles que estão iniciando na linguagem C, resolvi postá-lo.

Há 3 funcionalidades básicas:

1) Criação de um usuário
2) Login
3) Encerrar o programa

Após logar-se, há outras 3 opções:

1) Alterar a senha
2) Remover a conta
3) Encerrar login

Apesar da simplicidade, o programa aborda muitos conceitos da linguagem C, alguns deles:

Declaração de variáveis e funções
Controle de fluxo
Estruturas condicionais
Manipulação de valores retornados por funções
Estrutura de dados
Alocação dinâmica
Manipulação de strings
Interação com o usuário.

Segue abaixo o código:


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

#define MAX_USERS 5

struct info
 {
   char user[9];
   char pass[9];
   char ativo;
 }*cad;
   
int num_users = 0;

void mostra_msg(const char * msg);
void obter_usuario(char * user);
void obter_senha(char * pass);

int checa_usuario(const char * user);
int compara_senhas(const char * pass1, const char * pass2);

void cria_usuario();
void login();

void mostra_menu_logado(int id);
void altera_senha(int id);
void remove_conta(int id);

///////////////////////////////////////////////////////////////////////////////

void mostra_msg(const char * msg)
{
printf("%s\n",msg);
getch();
}

///////////////////////////////////////////////////////////////////////////////

int checa_usuario(const char * user)
{
int i;

 for(i = 0; i < MAX_USERS; i++)
    if(!strcmp(cad[i].user,user) && cad[i].ativo)
      return i;

return -1;
}

///////////////////////////////////////////////////////////////////////////////

int compara_senhas(const char * pass1, const char * pass2)
{
 return (int)!strcmp(pass1,pass2);
}

///////////////////////////////////////////////////////////////////////////////

void obter_usuario(char * user)
{
int i = 0;
char c ;

while(1)
{
  c = getch();

  if(i > 0 && c == '\r')
    break;

  if(i == 8 && c != '\b') continue;
 
  if(isalpha(c) || isdigit(c) || c == '\b')
  {
    if(c == '\b' && i > 0)
     {
       putchar(c);
       putchar('\0');
       putchar(c);
       
       i--;
       
     }
   
    else if(c != '\b')
     {
      putchar(c);
      user[i++] = c;
     }
  }

 user[i] = '\0';
}

}

///////////////////////////////////////////////////////////////////////////////

void obter_senha(char * pass)
{
int i = 0;
char c ;

while(1)
{
  c = getch();

  if(i > 0 && c == '\r')
    break;

  if(i == 8 && c != '\b') continue;
 
  if(isalpha(c) || isdigit(c) || c == '\b')
  {
    if(c == '\b' && i > 0)
     {
       putchar(c);
       putchar('\0');
       putchar(c);
       
       i--;
       
     }
   
    else if(c != '\b')
     {
      putchar('*');
      pass[i++] = c;
     }
  }

 pass[i] = '\0';
}

}

///////////////////////////////////////////////////////////////////////////////

void cria_usuario()
{
             
int i;
int ret;
char user[9], pass[9], pass2[9];

if(num_users == MAX_USERS)
  {
   mostra_msg("\n\n-> O numero maximo de usarios que podem ser cadastrados foi atingido.");
   return;
  }

for(i = 0; i < MAX_USERS && cad[i].ativo; i++);
go:
    system("cls");

    printf("Nome de usuario: ");
    obter_usuario(user);
   
    printf("\nSenha: ");
    obter_senha(pass);

    printf("\nRedigite a senha: ");
    obter_senha(pass2);
   
    ret = checa_usuario(user);

    if(ret != -1)
      {
        mostra_msg("\n\n-> Usuario ja em uso.");
        goto go;
      }
       
   ret = compara_senhas(pass,pass2);
     
   if(!ret)
      {
        mostra_msg("\n\n-> As senhas digitadas nao conferem.");
        goto go;
      }
 
  strncpy(cad[i].user,user,sizeof(cad[i].user));
  strncpy(cad[i].pass,pass,sizeof(cad[i].user));
  cad[i].ativo = 1;
 
  mostra_msg("\n\nUsuario criado com sucesso.");
  num_users++;
}

///////////////////////////////////////////////////////////////////////////////

void login()
{
 int i,id;
 char user[9],pass[9];

go:
  system("cls");       
  printf("Nome de usuario: ");
  obter_usuario(user);
 
  printf("\nSenha: ");
  obter_senha(pass);
 
  id = checa_usuario(user);
  if(id == -1)
      {
        mostra_msg("\n\n-> Usuario invalido.");
        goto go;
      }   
 
 if(!compara_senhas(cad[id].pass,pass))
      {
        mostra_msg("\n\n-> Senha incorreta.");
        goto go;
      }   

 mostra_menu_logado(id);
   
}

///////////////////////////////////////////////////////////////////////////////

void mostra_menu_logado(int id)
{

char op;

while(op != '3' && cad[id].ativo)
 {
  system("cls");
  puts("Logado.\n\n");
 
  puts("Selecione uma opcao:\n");
  puts("[1] Alterar senha");
  puts("[2] Remover conta");
  puts("[3] Sair");
 
  op = getche();

   switch(op)
    {
      case '1':
       altera_senha(id);
      break;
 
      case '2':
       remove_conta(id);
      break;
 
    }     
}

}

///////////////////////////////////////////////////////////////////////////////

void altera_senha(int id)
{
   char senha_atual[9], nova_senha[9],nova_senha2[9]; 
   int ret;
   
go:

 system("cls");                     
 printf("Senha atual: ");
 obter_senha(senha_atual);
 
 printf("\nNova senha: ");
 obter_senha(nova_senha);

 printf("\nConfirme a nova senha: ");
 obter_senha(nova_senha2);
 
 ret = compara_senhas(cad[id].pass,senha_atual);
 if(!ret)
      {
        mostra_msg("\n\n-> Senha incorreta.");
        goto go;
      }           
 
 ret = compara_senhas(nova_senha,nova_senha2);
 if(!ret)
      {
        mostra_msg("\n\n-> As senhas digitadas nao conferem.");
        goto go;
      }           
 strncpy(cad[id].pass,nova_senha,sizeof(cad[id].pass));
 mostra_msg("\n\n-> Senha alterada com sucesso.");
 
}

///////////////////////////////////////////////////////////////////////////////

void remove_conta(int id)
{
char op = 0;

while(op != 'S' && op != 'N')
{
 system("cls");
 printf("Tem certeza que deseja remover sua conta? [S/N]");
 op = toupper(getch());
 
}

 if(op == 'S')
  {
   cad[id].ativo = 0;
   mostra_msg("\n\n-> Conta desativada.");
   num_users--;
  }
 
}

///////////////////////////////////////////////////////////////////////////////

int main()
{

char op;

cad = (struct info*)calloc(MAX_USERS,sizeof(struct info));
if(!cad)
  return 1;
 
op  = 0;

while(op != '3')
 {
  system("cls");
  puts("Selecione uma opcao:\n");
  puts("[1] Criar um usuario");
  puts("[2] Fazer login");
  puts("[3] Sair");
 
  op = getche();

   switch(op)
    {
      case '1':
       cria_usuario();
      break;
 
      case '2':
       login();
      break;
 
    }     
}

free(cad);
return 0;
}



É isso,
Bye.