Páginas

sábado, 10 de março de 2012

Pequeno gerador de códigos em php

Olá, iniciei um pequeno gerador de códigos que pode ser encontrado aqui e usado para qualquer tipo de código em php. é baseado em mysql mas pode ser adaptado para qualquer banco ou linguagem. pode ser adaptado para gerar um formulário automáticamente. É necessário criar uma subpasta classes que implementa a conexão com o banco de dados manualmente. o projeto é muito simples, por enquanto serve apenas como referência.

https://sourceforge.net/projects/uphpgenerator/

quarta-feira, 12 de outubro de 2011

Compilador Cmm

Olá pessoal, estou publicando mais um trabalho da universidade.. um compilador para uma linguagem cmm que tem como alvo uma maquina de pilha. Esse trabalho pode interessar pelo código fonte para aqueles que pretendem fazer um compilador:

quarta-feira, 25 de maio de 2011

visual studio -> erro: mfc90d.dll não encontrado

Recentemente eu precisei executar um exemplo em MFC/C++ no Visual Studio 2008. O problema é que o projeto havia sido criado no Visual Studio 2005 para uma plataforma diferente.

Quem quiser baixar o projeto aqui o link: http://msdn.microsoft.com/en-us/library/zz9355ha%28v=vs.80%29.aspx   (Achei muito interessante porque tem um botão personalizado uando o MFC. Procurei por isso por um bom tempo) 

Durante a compilação do projeto encontrei os seguintes erros:
error LNK1104: cannot open file 'mfc90d.lib'
error LNK1112: module machine type 'X86' conflicts with target machine type 'IA64'

Para quem estiver com problemas para rodar programas em C++ feitos em versões anteriores do visual studio aqui vai uma dica:

Clique no menu:
Project > Properties

Clicar no botão "Configuration Mananger" e escolher "Active Solution Plataform" como "Win32"


na guia "Linker > General"

em "Add Library Directories" adicione o valor:
"C:\Arquivos de programas\Microsoft Visual Studio 9.0\VC\atlmfc\lib\"
 
na quia "Linker > Advanced" na opção "Target Machine" selecione "MachineX86(MACHINE/X86)"

Com isso eu consegui compilar e executar o projeto com sucesso!

quarta-feira, 11 de maio de 2011

Estrela com cantos arredondados no silverlight

Aqui um user control que eu fiz ha um tempo (há mais de um ano) no silverlight versão 2;
Exemplos:O código fonte pode ser baixado aqui:

Redes Neurais Artificiais - Algoritmo do Back Propagation

Mais um vídeo legal sobre redes neurais artificiais que encontrei navegando pelo youtube:

quinta-feira, 5 de maio de 2011

Algoritmos de ordenação de dados

Vejam que video legal que eu encontrei no youtube faz um tempo:




vejam um artigo sobre a declaração de obama: http://overstated.net/2008/02/11/obama-not-bubble-sort

Algoritmos de Teoria dos Grafos

Aqui alguns algoritmos de teoria dos grafos, como percorrer um grafo em profundidade, percorrer um grafo em largura e encontrar o caminho com menor custo.

Seguem a baixo os links para download no meu skydriver:
  1. profundidade e largura e menor custo (funções auxiliares compartilhadas)
  2. menor custo (algoritmo de Dijkstra)
Para executar você vai precisar de uma vesão estável do scilab que pode ser encontrada em: http://www.scilab.org/products/scilab/download . Eu uso a versão 5.3.0.

Triângulo de Sierpinski no scilab (fractal)

Segue o código no scilab para criar esse fractal de forma bem simples usando apenas as matrizes do scilab como estruturas de dados.

para mais informações do algoritmo acessem a wikipedia: http://pt.wikipedia.org/wiki/Tri%C3%A2ngulo_de_Sierpinski

No código, ao se digitar, por exemplo: triangulos(1:2,:)
estamos pedindo a primeira e a segunda linhas do vetor de triangulos completa. No caso cada linha contêm três valores: a primeira linha contem os valores de X e a segunda linha contem os valores de Y para cada triangulo. Ou seja, triangulos(1:2,:) é um triângulo, portanto, passivel de divisão (no caso em três triângulos)http://www.blogger.com/img/blank.gif. o código é bem simples mhttp://www.blogger.com/img/blank.gifesmo. só faz dividir um triângulo em três, e vai fazendo o mesmo para cada triângulo [ triangulos(1:2,:), triangulos(3:4,:), etc. ] no vetor de triângulos.

O código pode ser baixado aqui! Para executar você vai precisar de uma vesão estável do scilab que pode ser encontrada em: http://www.scilab.org/products/scilab/download . Eu uso a versão 5.3.0.

quinta-feira, 24 de março de 2011

B+ Tree -> Indexação de arquivo DBF com implementação em C

Olá, esta é a implementação de uma Arvore B+ (baseada em arquivo) que eu fiz em C. É totalmente funcional. O código atual não está compilado. Funciona em diversos sistemas operacionais com suporte a C standard. (a extensão é cpp, mas o código foi escrito em C) mas para isso talvez seja necessário mudar a quantidade de chaves por pagina (struct no) para que fique exatamente do tamanho de um setor ou cluster de disco.


http://sourceforge.net/projects/btreeindextodbf/


aqui o código fonte para a visualização:

http://btreeindextodbf.svn.sourceforge.net/viewvc/btreeindextodbf/


Aproveito para comentar um pequeno problema que ocorreu. Quando eu fui testar o código rodando em um pendriver (durante uma apresentação) para indexar um milhão de registros o código demorou muito para ser executado (muito mesmo eu não esperei terminar) enquanto que no disco rigido ela demora em média 2 minutos para indexar um milhão de registros. Já usei a página do tamanho do cluster é (4096 bytes) e do tamanho do setor (512 bytes), nenhum dos dois casos deu certo no pendriver, no entanto, quando testei com uma quantidade irrisória de apenas quatro chaves por pagina consegui executar com "sucesso" no pendriver para 1 milhão de registros. Pude observar também que a unidade de armazenamento no pendriver (bem como no hd) é do tamanho do cluster. Criando um arquivo com um caractere e clicando em propriedades do arquivo aparece la "Tamanho: 1 byte, Tamanho em disco: 4096 bytes". Para saber o tamanho do cluster e do setor no windows xp eu fui no ms dos e digitei: "fsutil fsinfo ntfsinfo c:" (esse comando não serve para o pendriver).

A arvore funciona perfeitamente no meu hd, todas as funções auxiliares foram testadas separadamente antes da finalização do algoritmo. Quase todas as alocações tem um free associado, com excessão da raiz que é mantida em memória durante a criação do índice gerando um lixo de memória correspondente à altura da arvore. A raiz é re-utilizada constantemente em um loop para criar o indice para um arquivo dbf já existente. Por isso é mantida em memória ram e gravada no disco em caso de modificação.

Para o problema da indexação de multiplos campos no banco de dados eu optei por concatenar as n chaves ex: "CidadeBairroNome" e usar como uma chave única. No entanto a chave pode ficar muito grande. Para resolver isso eu criei funções para truncar essas palavras em algo com: "CidBaiNom", no entanto isso também é um problema pois podem ocorrer por exemplo "Cida" e "Cide", ou seja, o caractere diferenciador ser o próximo caractere e eu ter escolhido uma quantidade muito reduzida de caracteres.

Eu não sei se seria viável ter um arquivo separado contendo somente as chaves do nó porque, embora eu tivesse uma altura menor na arvore, eu teria o custo adicional de acessar o disco para buscar a chave (busca binária). Em um nó com 4 chaves eu teria a mais pelo menos mais 2 acessos a disco, totalizando 3 acessos (carregar o nó + carregar as chaves), seria como se tivesse uma arvore avl em disco (muito estranho).. eh pensando bem não é uma boa idéia não.

Espero que gostem do meu código, está totalmente em português legivel, programado no Dev-C++ e testado no Visual Studio.

OBS: No segundo link desse post tem uma versão compilada do código. Para executar com um milhão de registros é necessário executar antes "InsereRegistros.exe" que esta na pasta "Um milhao de registros" que gera "banco.dbf" a partir do arquivo "modelo.dbf" que contem apenas 4 registros.

segunda-feira, 26 de abril de 2010

Código em c para concatenar n filas

Esse código exemplifica o uso do operador "..." que é usado para quando uma função tem um número variável de argumentos.


terça-feira, 16 de março de 2010

pilha genérica em c (aceita qualquer tipo de dados)

 
/*
    Uisleandro Costa dos Santos
    Pilha generica em C
  
    Não sei se é o melhor jeito de fazer isso,
    mas com certeza é interessante!

    Aceita qualquer tipo de dados, no entanto é preciso
    fazer o cast corretamente.
*/

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

/* É muito bom poder passar parametros para o define... ;) que tal uma pilha de pilhas? */
#define PILHA_INICIA(_pilha)\
{\
    _pilha = malloc(sizeof(pilha));\
    _pilha->topo = (nodo *)NULL;\
    _pilha->count = 0;\
}

// insere ..
#define PILHA_PUSH(pilha, tipo, valor)\
{\
    nodo * NODO_AUX;\
 if(!pilha) exit (1);\
    NODO_AUX = (nodo *)malloc(sizeof(nodo));\
    if(!NODO_AUX) exit(1);\
    NODO_AUX->value = (void *)malloc(sizeof(tipo));\
    if(!(NODO_AUX->value))exit(1);\
    *((tipo *)NODO_AUX->value) = valor;\
    NODO_AUX->next = pilha->topo;\
    pilha->topo = NODO_AUX;\
    pilha->count++;\
    NODO_AUX = NULL;\
}

// retira um valor da pilha, sem retornar..
#define PILHA_POP(pilha)\
if(pilha->count > 0)\
{\
    nodo * NODO_AUX = pilha->topo;\
    pilha->topo = pilha->topo->next;\
    free(NODO_AUX->value);\
    free(NODO_AUX);\
    pilha->count--;\
    NODO_AUX = NULL;\
}

// vê o ultimo valor inserido
#define PILHA_PEEK(pilha, tipo) (*((tipo *)pilha->topo->value))

// vê se a pilha está vazia
#define PILHA_ISEMPTY(pilha) (pilha->count <= 0)

// remove todos os valores da pilha..
#define PILHA_DESTOI(pilha)\
{\
    nodo * NODO_AUX;\
    while(pilha->topo)\
    {\
        NODO_AUX = pilha->topo;\
        pilha->topo = pilha->topo->next;\
        free(NODO_AUX->value);\
        free(NODO_AUX);\
        pilha->count--;\
        NODO_AUX = NULL;\
    }\
}

typedef struct nodo
{
    void * value;
    struct nodo * next;
} nodo;

typedef struct
{
    struct nodo * topo;
    int count;
} pilha;

// um tipo criado só para testar a pilha.
typedef struct
{
    char nome[30];
    int idade;
} pessoa;


int main()
{
    pilha * p;
    pessoa pe;
 
    strcpy(pe.nome,"Fulano de tal ");
    pe.idade = strlen(pe.nome);
  
    PILHA_INICIA(p);

    PILHA_PUSH(p, int, pe.idade);
    PILHA_PUSH(p, pessoa, pe);  
    PILHA_PUSH(p, float, 12);

     //pilha_destroi(&p);
     //PILHA_DESTOI(p);
     //printf("%d", PILHA_ISEMPTY(p));
     //system("pause");

    printf("R$ %.2f ", PILHA_PEEK(p, float));
    PILHA_POP(p);
    
    printf("%s", PILHA_PEEK(p, pessoa).nome);
    PILHA_POP(p);
  
    printf("%d", PILHA_PEEK(p, int));
    PILHA_POP(p);
  
    printf("\n");
 
    system("pause");
 
    return 0;
}

quinta-feira, 3 de dezembro de 2009

nodo_generico.c

 
/*
    Uisleandro CS
    Descobra também uma nova utilidade para o #define !
    Observe que é necessário fazer algumas modificações para
    usá-lo em listas, pilhas e filas, etc.
*/

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

// #define POINTER_ALLOC(tp) (tp *)malloc(sizeof(tp))

/*
    Inicializa o 'nodo' com o tipo desejado (aloca o tamanho desejado).
    Aloca memória para o nodo..
    Aloca memória para nodo->value com o tamanho do tipo passado como parâmetro.
    Cita o próximo de nodo como NULL
*/
#define NODO_INICIA(no,tp)\
    no = (nodo *)malloc(sizeof(nodo));\
    if(!no) exit(1);\
    no->value = malloc(sizeof(tp));\
    if(!no->value) exit(1);\
    no->next = (struct nodo *)NULL

/*
    Retorna o valor apontado pelo ponteiro, faz o cast para o tipo desejado
*/
#define NODO_GET_VALUE(no,tp) (*((tp *)no->value))

/*
    Usa um ponteiro para mudar o valor apontado pelo 'nodo';
    Faz a conversão de tipos (cast);
    Passa uma cópia do valor passado como parametro para o espaço alocado anteriremente.
*/
#define NODO_SET_VALUE(no,tp,val) *((tp *)no->value) = val

/*
    Libera espaço na memória ocupado pelo nodo
*/
#define NODO_EXCLUI(no) free(no->value); free(no)

typedef struct nodo
{
    void * value;
    struct nodo * next;
} nodo;

typedef struct
{
    char nome[30];
    int idade;
} pessoa;

int main()
{

    nodo * n;

    pessoa ps;
 
    strcpy(ps.nome,"nome1");
    ps.idade = 10;
 
    printf("pessoa = {\"%s\" %d}; \n\n", ps.nome, ps.idade);

    NODO_INICIA(n, pessoa);
        NODO_SET_VALUE(n, pessoa, ps);
        printf("n->value = {\"%s\", %d};\n\n", NODO_GET_VALUE(n, pessoa).nome, NODO_GET_VALUE(n, pessoa).idade);
        //pessoa q = NODO_GET_VALUE(n, pessoa);
        //printf("q = {\"%s\", %d};\n\n", q.nome, q.idade);
    NODO_EXCLUI(n);
 
    NODO_INICIA(n, int);
        NODO_SET_VALUE(n, int, 100);
        printf("n->value = %d;\n\n", NODO_GET_VALUE(n, int));
    NODO_EXCLUI(n);

    NODO_INICIA(n, double);
        NODO_SET_VALUE(n, double, 100);
        printf("n->value = R$%.2f;\n\n", NODO_GET_VALUE(n, double));
    NODO_EXCLUI(n);
 
    system("pause");
 
    return 0;
}

terça-feira, 1 de dezembro de 2009

c - convertendo numero em string


  1. Fazer isso é muito penoso, ha uma forma mais fácil, vejam: 
    1. http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
  2. Aqui uma maneira de fazer isso no c++ convertendo int para std::string
    1. http://www.cplusplus.com/forum/general/3319/

 
/*
  Criado por Uisleandro CS; uisleandro@gmail.com
  Util para imprimir valores numéricos em arquivos.
*/

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

// faz (float % float), recebe double ou float como parametro.
#define FLOAT_MOD(num, div) (num - ( (int)( num / div ) * div ))

// converte um número entre 0 e 9 para char.
#define INT_TOCHAR(num) ('0'+num)

#define FLOAT_GET_DECIMAL(num) (num - ( (int)( num / (int)num ) *

(int)num ) )

void raiserror(int i, char * c, char * d)
{
  printf("erro em %s: %s\n\n", c, d);
  system("pause");
  exit(i);
}

// pega a parte decimal do float
// takes the decimal part of float;
float decimal(float f)
{
  return FLOAT_MOD(f, (int)f);
}


// recebe a parte decimal de um número
// converte a parte decimal para um string
// NAO USAR
char * decimal_toString(float f, int count)
{
  char * c;
  int i = 0;

  if(f > 1) raiserror(1, "decimal_toString","parametro f >

1");

  if(!( c = malloc(count * sizeof(char)) )) raiserror(1,

"decimal_toString", "memoria insuficiente");

  while(count > 0)
  {
      f *= 10;
      c[i++] = INT_TOCHAR((int)f);

      if(f > 1) f = decimal(f);

      count--;
  }
  return c;
}


// retorna a ordem de um número.
// USAR?
int get_ordem(int i)
{
  int o = 1;

  while(i > 9)
  {
      o *= 10;
      i /= 10;
  }

  return o;
}

/*
converte n numeros da parte decimal do float para string
também serve para converter int
*/
char * float_toString(float uf, int decimais)
{
  char * c;
  int i = 0;
  int ui = (int)uf;
  int ordem = 1;
  int acrescimo = 1;

  //ordem = get_ordem(uf);
  while(ui > 9)
  {
      ordem *= 10;
      ui /= 10;
  }

  // take decimal part
  float dec = FLOAT_GET_DECIMAL(uf);

  // se decimais, inclui ponto
  if(decimais > 0) acrescimo += decimais + 1;

  // aloca o espaco para uma quantidade de caracteres
  if(!( c = malloc( (ordem + acrescimo)* sizeof(char)) ))
  raiserror(1, "float_toString", "memoria insuficiente");

  // adiciona cada numero do que tem maior ordem para o de menor ordem
  while(ordem > 0)
  {
      c[i++] = INT_TOCHAR((int)(uf - (int)uf % ordem ) / ordem);
      uf -= (uf - (int)uf % ordem );
      ordem /= 10;
  }

  if(decimais <= 0)
  {
      c[i] = '\0';
      return c;
  }

  c[i++] = '.';

  // adiciona todos os numeros da parte decimal..
  while(decimais > 0)
  {
      dec *= 10;
      c[i++] = INT_TOCHAR((int)dec);
      if(dec > 1) dec = FLOAT_GET_DECIMAL(dec);
      decimais--;
  }

  c[i] = '\0';

  return c;
}

// vou  precisar criar uma função para converter de double para

string.
int main()
{
  // srand(time(NULL));

  float f = 123.03998;

  //float g = FLOAT_MOD(f, 123.03);

  //printf(";%.5f mod 123;", f);
  //printf(";%.5f;", g);
  //printf(";%c;", INT_TOCHAR(2));

  /*
      TODO: Vou usar para salvar os erros da rede em um arquivo
      para que eu possa gerar o gráfico no scilab!
  */
  printf("%s = float_toString(%f)\n\n",float_toString(f, 6), f);

  // printf("%f\n\n..", decimal(f));

  // decimal_toString(decimal(f), 10);


  // printf("%s = decimal_toString(%f)",

decimal_toString(decimal(f), 10), f);


  //printf("%d", get_ordem(f));

  //printf(";%d;", float_toString(f,1));

  system("pause");
}

Programação Multithread em C (windows)

 
/*
Exemplo de programação multithread em C:
dá para saber o que é um thread sincronico e assincronico.. teste
*/

// crt_begthrdex.cpp
// compile with: /MT
#include <windows.h>
#include <stdio.h>
#include <process.h>

unsigned Counter; 
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
    printf( "In second thread...\n" );

    while ( Counter < 1000000 )
        Counter++;
  
 //printf("Counter=%d\n",Counter);
    _endthreadex( 0 );
    return 0;
} 

int main()
{ 
    HANDLE hThread;
    unsigned threadID;

    printf( "Creating second thread...\n" );

    // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );

    // Wait until second thread terminates. If you comment out the line
    // below, Counter will not be correct because the thread has not
    // terminated, and Counter most likely has not been incremented to
    // 1000000 yet.
    // Serve para a sincronização do thread ao programa principal.
    WaitForSingleObject( hThread, INFINITE );
    
    
    printf( "Counter should be 1000000; it is-> %d\n", Counter );
    
    // Destroy the thread object.
    CloseHandle( hThread );
    
    system("pause");
}

fonte: Documentação offline do Visual Studio.

quinta-feira, 5 de novembro de 2009

criando gráficos no scilab

Olá, essa é o meu primeiro atrigo sobre o scilab, se você quer criar gráficos para as suas equações matemáticas o scilab é uma boa opção. Ele é uma alternativa gratuita ao mathlab e pode ser usado, inclusíve para simular o aprendizado de redes neurais artificiais (eu ainda n cheguei lá).

A versão atual do scilab tem um arquivo de ajuda em inglês que dificulta um pouco o aprendizado (mas dá para entender).

Inicialmente eu vou falar da função plot(), ela é usada para gerar gráficos (inclusíve 3d) e pode ser usada de várias formas.

ex:

matrizY = [1,2,3,4,5,6];
plot(matrizY);

a função deff() é usada para criar funções matemáticas;

ex:

deff("[y] = quadrado(x)"," y = x^2");
deff("[y] = raiz(x)"," y = x^.5");

agora vamos usara as duas funções anteriores em conjunto:

plot(matrizY, quadrado);
plot(matrizY, raiz);

por enquanto é só isso. até aqui já dá para fazer diversas funções matemáticas: equação do segundo grau, função módulo, etc.. é só saber a fórmula.


> implementação da função módulo no scilab:

não use o a palavra reservada "modulo" para uma função, porque já é uma função do scilab

// o modulo de x é a raiz quadrada de x ao quadrado, qualquer número elevado ao quadrado fica positivo:
// y = f(x) = |x| = (x^2)^.5

deff("[y] = mod(x)","y = (x^2)^.5");

Observe, no entanto, que o scilab tem a função abs() que, provavelmente faz a mesma coisa, só que bem mais eficiente.

Para mais exemplos de funções e gráficos, inclusive com a função plot2d(), acessem o artigo sobre algoritmos de teoria dos grafos.

terça-feira, 27 de outubro de 2009

Mais uma coisa

Estou estudando sobre redes neurais artificiais, então não vai ser surpresa se eu colocar algum conteúdo nessa área por aqui.
Vou compartilhar nesse blog algumas dicas de programação (c/c++, c#, vb, sql, Mysql, Sql Server 2005/2008, html, xml, xsl, Javascript, e tecnologias relacionadas) com o tempo o blog pode até ter uma boa audiência. É só uma idéia para ganhar dinheiro, por enquanto ainda muito verde, nem sei se dá certo, mas não custa tentar. Preciso de emprego!

sexta-feira, 24 de abril de 2009

Passei no vestibular da uneb. Pretendo começar a escrever em um blog. Aqui é a minha primeira postagem, nada de mais.