Páginas

domingo, 30 de outubro de 2011

/* PGC - Programa de Gerenciamento de Clientes */

Como já sabemos, sistemas que gerenciam informações sempre "quebram um galho"(quando bem feitos). É só você pensar que em uma lista com 1000 materiais escritos em papéis precise das informações de um em específico. Mesmo estando organizados em ordem alfabética, por exemplo, essa é uma tarefa bem cansativa. Com um sistema fazendo esse trabalho de armazenar as informações e gerenciá-las, uma função para pesquisar um material se sairia muito melhor.

Há alguns meses, quando eu estava mais ativo na Namelez, surgiu uma proposta de sistema para um salão de beleza. O sistema deveria guardar as informações de clientes, como nome, endereço, telefones de contato, observações, etc. Fazer esse sistema foi uma experiência única, pois além de ter um contato mais direto com o cliente, pude aprender e entender várias das funções de um analista de sistemas.

Vendo que o sistema feito para o salão (que demos o nome de NameleZ SoftHair) havia sido bem sucedido, minha mãe, que trabalha com vendas, pediu que eu fizesse algo similar para ela. Foi aí que surgiu a ideia do PGC. Um sistema simples feito em C e que roda em console do Windows. Algumas características foram decididas de forma a parear com meu conteúdo atual na faculdade, como a linguagem de programação C e o uso de arquivos para guardar as informações.

O projeto ainda está na metade de desenvolvimento. É open-source e você pode fazer *o que quiser* com o código que está no meu perfil do GitHub, bem aqui.
Aceito críticas, boas ou ruins ...



You can do it!

quinta-feira, 20 de outubro de 2011

/* Jogo da Forca */

O jogo da forca consiste em acertar uma palavra secreta com o limite de x erros.
Para os mais iniciantes algumas funções podem parecer complexa, mas não são. A chToUpper() recebe um caractere e retorna seu equivalente em maiúsculo. A função fflush() limpa o buffer do teclado, ou seja, isso impede que o programa recolha lixo ao invés da entrada do usuário.
Nesta primeira versão, a palavra secreta já está no código-fonte. Melhorias em breve. :3

O jogo é simples e pequeno. Segue o código:

21/10/11: você pode ver a última versão com o código completo no meu repositório do GitHub: Jogo da Forca

#include <stdio.h>

char palavraSecreta[] = "OVERFLOW";
int letrasUsadas[256] = { 0 };
char palavraDescoberta[] = "--------";
int vida = 5;

void showTelaInicial(){
     printf("\t\t\t\t ------- \n");
     printf("\t\t\t\t| Forca |\n");
     printf("\t\t\t\t ------- \n");
     printf("\n\n\n\nPressione <ENTER> para continuar...");
     getchar();
}

int chToUpper(char ch){
     return ch & ~32;
}

void printLetrasUsadas(){
     int i;
     printf("\t\t\tLetras usadas: [ ");
     for(i = 65; i < 91; i++)
           if(letrasUsadas[i]) printf("%c ", i);
     printf("]\n");
}

void printPalavraDescoberta(){
     int i;
     printf("\n\t\t\t=> ");
     for(i = 0; palavraSecreta[i]; i++)
           printf("%c ", palavraDescoberta[i]);
     printf("<=\n");
}

char chutaLetra(){
     char ch;
     printf("\t\t\tNova letra: ");
     fflush(stdin);
     scanf("%c", &ch);
     return chToUpper(ch);
}

int verificaLetraUsada(int letra){
    if(letrasUsadas[letra]) return 1;
    return 0;
}

int chuteCerto(char ch){
    int i;
    int acertou = 0;
    for(i = 0; palavraSecreta[i]; i++)
          if(palavraSecreta[i] == ch){
             palavraDescoberta[i] = ch;
             acertou = 1;
          }
    return acertou;
}

int terminou(){
     int i;
     for(i = 0; palavraSecreta[i]; i++)
           if(palavraDescoberta[i] == '-') return 0;
     
     return 1;
}

void play(){
     char chute;
     while(vida){
          system("cls");
          printf("\n\n");
          
          printLetrasUsadas();
          printf("\t\t\tVidas: %d\n", vida);
          printPalavraDescoberta();
          chute = chutaLetra();
          
          if(!verificaLetraUsada(chute)){
             letrasUsadas[chute] = 1;
             if(!chuteCerto(chute)) vida--;
             else if(terminou()) break;
          }
          else{
             printf("\t\t\tLetra ja utilizada... <ENTER>");
             fflush(stdin);
             getchar();
          }
          
          
     }
     system("cls");
     if(!vida) printf("\n\n\t\t\t\tVoce perdeu...");
     else printf("\n\n\t\t\tParabens, voce ganhou");
     fflush(stdin);
     getchar();
}

int main(){
    showTelaInicial();
    play();

    return 0;
}


sexta-feira, 7 de outubro de 2011

/* Jogo da velha */

Trago-lhes um simples jogo da velha feito em C.
O jogo consiste em você jogar contra o computador. Na função main há um loop que, analogamente, é o "coração" do jogo.
A função init_matriz inicializa a matriz 3x3 com espaços, para que assim fique melhor sua exibição. A função disp_matriz mostra o "tabuleiro" formatado na tela do console. A função move_jogador e move_cpu são, respectivamente, para a sua jogada e a jogada do computador. A função check_vencedor verifica se alguém ganhou o jogo, pela linha, coluna ou diagonal.
Como o programa foi desenvolvido apenas de forma didática, o computador não possui nenhuma "inteligência", sendo assim, na sua vez ele simplesmente procura um espaço em branco e joga nele. Para implementar algum tipo de IA, é necessário apenas modificar a função move_cpu.

12/10/11:
Você pode ver o código do jogo completo no meu repositório no GitHub: Jogo da Velha
22/10/11:
Código no repositório adaptado para rodar tanto em Windows quanto em Linux.
-----

#include <stdio.h>

char matriz[3][3];

void init_matriz(){
     int i, j;
     
     for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++) matriz[i][j] = ' ';
}

void disp_matriz(){
     int i, j;
     printf(" --- --- --- \n");
     for(i = 0; i < 3; i++){
        printf("|");
        for(j = 0; j < 3; j++) printf(" %c |", matriz[i][j]);
        printf("\n|---|---|---|\n");
     }
}

void move_jogador(){
     int x, y;
     printf("\n\nDigite em qual pos(x, y) deseja jogar: ");
     scanf("%d%d", &x, &y);
     x--;
     y--;
     
     if(matriz[x][y] != ' '){
        printf("Posicao invalida ou ja jogada, tente novamente...\n\n");
        move_jogador();
     }
     else matriz[x][y] = 'X';
}

void move_cpu(){
     int i, j;
     
     for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++)
              if(matriz[i][j] == ' ') break;
        if(matriz[i][j] == ' ') break;
     }
     
     if(i*j == 9){
            printf("\nEMPATE");
            getchar();
            exit(0);
     }
     else matriz[i][j] = 'O';
}

char check_vencedor(){
     int i;
     
     for(i = 0; i < 3; i++)
        if( (matriz[i][0] == matriz[i][1]) && (matriz[i][0] == matriz[i][2]) )
           return matriz[i][0];
           
     for(i = 0; i < 3; i++)
        if( (matriz[0][i] == matriz[1][i]) && (matriz[0][i] == matriz[2][i]) )
           return matriz[0][i];
           
     if( (matriz[0][0] == matriz[2][2]) && (matriz[1][1] == matriz[2][2]) )
        return matriz[1][1];
     if( (matriz[1][1] == matriz[0][2]) && (matriz[1][1] == matriz[2][0]) )
        return matriz[1][1];
     
     return ' ';
}

int main(){
    char terminado = ' ';
    
    printf("\t\tJogo da Velha :)\n");
    printf("Modo: vs cpu\n\n");
    init_matriz();
    do{
       disp_matriz();
       move_jogador();
       terminado = check_vencedor();
       
       if(terminado != ' ') break;
       
       move_cpu();
       terminado = check_vencedor();
    }while( terminado == ' ');
    
    if(terminado == 'X') printf("\n\nParabens, voce venceu!\n");
    else printf("\n\nQue pena, voce perdeu!\n");
    
    disp_matriz();
    fflush(stdin);
    getchar();
    return 0;
}


-----
Divirtam-se, façam modificações e code it! :)

quinta-feira, 6 de outubro de 2011

Bubble Sort (Método da bolha)

Bubble sort é um algoritmo de ordenação de vetores. Ele é um dos mais simples de se entender e implementar. O algoritmo consiste em comparar um numero na posição n e n+1 e, caso n for maior, eles trocam de posição. Por isso é chamado de método da bolha, pois ele vai jogando o maior para o final do vetor, formando bolhas.

-----
#include "stdio.h"
void troca( int *a, int *b ){
      int aux = *a;
      *a = *b;
      *b = aux;
}
void bubbleSort( int array[], int tamanho ){
      int i, j;
            for( i = 0; i < tamanho-1; i++ )
for( j = i+1; j < tamanho; j++ )

if( array[i] > array[j] ) troca( &array[i], &array[j] );

}

int main(){
     int array[] = { 2, 7, 1, 0, 20 };
     bubbleSort( array, 5 );
     return 0;
}
-----
Este algoritmo é bem útil, tendo em vista que constantemente precisamos fazer ordenações em nossos programas :)

Para quem não entendeu o que se está passando, este vídeo inusitado pode te ajudar:

quarta-feira, 5 de outubro de 2011

Converge()

Este é um daqueles programas aparentemente inúteis, porém divertidos.
A grande sacada deste programa é a função converge. Esta função escreve no console uma string convergindo para o meio, isto é:
- letra 0;
- letra n;
- letra 1;
- letra n-1;
...
De forma que o texto passado por parâmetro seja por fim escrito.
Let's to the code:

-----
#include "stdio.h"
#include "windows.h"

int tamanhoString(char *str){
     int tamanho = 0;
     while(*str){
        tamanho++;
        *str++;
     }
     return tamanho;
}

void gotoxy(int x, int y){
      COORD c;
      c.X = x;
      c.Y = y;
      SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void converge( int line, char *msg ){
      int i, j;
            for( i = 1, j = tamanhoString(msg); i < j; i++, j-- ){
            gotoxy(i, line);
            printf("%c", msg[i-1]);
            gotoxy(j, line);
            printf("%c", msg[j-1]);
      }
}
int main(){
     converge(10, "Testando a funcao converge()");
     getchar();
     return 0;
}
-----

Como você pôde perceber, utilizamos uma função já implementada: SetConsoleCursorPosition.
Por este motivo, incluímos a biblioteca windows.h e, obviamente, este programa só funciona em ambiente Windows. Para quem utiliza Linux, se não me engano, utilizamos a biblioteca graph.h para usar a função já implementada gotoxy();

Codificar com complemento

E o dia que você quiser codificar algum texto?
Pois bem, temos métodos simples como descolamento de x bits para direita ou esquerda, e também métodos mais bem elaborados que são utilizados no mercado, como a criptografia RSA.

Pois bem, este método que irei apresentar é super simples(e bobo), por isso não aconselho a usar-lo para situações sérias, onde necessite de um certo nível de segurança.
O operador '~' em C complementa os bits de uma variável. Por exemplo:
- Temos o caractere 'A', que vale 65 na tabela ASCII. Fazemos então o complemento a 1, ou seja, trocaremos 0 por 1 e 1 por 0 no valor de 65 em binário ( 65 = 1000001 ).
Teremos então como saída 0111110, que é um caractere desconhecido.
Para voltar ao valor original, basta complementar novamente.
Chega de explicação e vamos ao programa com a função 'encoder':

-----
#include "stdio.h"
void encoder(char *string){
      while(*string){
         *string = ~*string;
         *string++;
      }
}

int main(){
     char str[] = { "Testando o encoder" };
     printf("Texto original: %s\n", str);
     encoder(str);
     printf("Texto codificado: %s\n", str);
     encoder(str);
     printf("Texto decodificado: %s\n", str);
     getchar();
     return 0;
}
-----

O programa imprime a string original e então a codifica.
Imprime a string codifica e decodifica. E imprime novamente mostrando que a string original está de volta.

printf( "Hello World" );

O primeiro post de código foi feito em C e é bem simples. A função imprimeTrocando imprime a string recebida por parâmetro, porém, troca um certo caracter por outro. Perceba que o conteúdo da string não é alterado.

-----
void imprimeTrocando( const char *string, char real, char mascara ){
     while(*string){
       if(*string == real) printf("%c", mascara);
       else printf("%c", *string);
       string++;
    }
}
-----

- string é o texto recebido por parâmetro.
- real é o caractere real que está na string.
- mascara é o caractere que você quer que seja exibido ao invés do caractere real


Obviamente podemos alterar o código desta função para que o conteúdo da string seja alterado, substituindo assim um caractere por outro. E é exatamente o que a função abaixo faz.

-----
void modificaChar( char *string, char atual, char novo){
     while(*string){
       if(*string == atual) *string = novo;
       string++;
    }
}
-----

Com poucas modificações fazemos esta função. Agora o while varrerá a string e sempre que encontrar um caractere igual a variável atual, troca para o caractere novo.