Viva o Movimento GNU

Depois de ter feito aquele pequeno tutorial sobre a equação logística e teoria do caos, recebi uma surpresa via e-mail. Alguém entrou no site (que bom!) viu o tutorialzinho (olha só que maneiro!) pegou o código que estava escrito em C e melhorou de forma drástica, e enviou pra mim, totalmente melhorado. Fiquei realmente surpreso e pela primeira vez senti a força e sensação de liberdade que o movimento GNU nos proprociona, é claro que se trata de um exemplo que envolve um código bobo, mas a essência é a mesma imagino eu. Quem é o individuo ? Haa! Nick dele eh muzgo, um garoto de 19 que manja muuuito de programacão em C, parabéns e muito obrigado muzgo.

Bem, seguindo em frente temos abaixo o código melhorado pelo o muzgo, ele crio dois arquivos. Um arquivo de nome def.h cujo o conteúdo é:

def.h
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define SIZE 256

/*
 * gera nome de arquivo: dados-DIAMESANO-HORAMINUTOSEGUNDO.txt
 */
void
mkname(char *fname)
{
        char            buffer[SIZE], d[7] = "dados-";
        time_t          curtime;
        struct tm      *loctime;

        curtime = time(NULL);
        loctime = localtime(&curtime);
        strftime(buffer, SIZE, "%F-%H%M%S", loctime);
        strncpy(fname, d, sizeof(d));
        strncat(fname, buffer, sizeof(buffer) + sizeof(fname));
}


/* gera script gnuplot para transformar gráfico em arquivo .eps */

void
scrplot(char *fname)
{
        FILE           *dados;
        if (!(dados = fopen("temp.gpt", "w"))) {
                fprintf(stdout, "%s\n", errno);
                exit(1);
        }
        fprintf(dados, "reset\n");
        fprintf(dados, "set title \"Equacao Logistica\"\n");
        fprintf(dados, "set nokey\n");
        fprintf(dados, "set size 2,2\n");
        fprintf(dados, "set term post eps enhanced color\n");
        fprintf(dados, "set out \'%s.eps\'\n", fname);
        fprintf(dados, "plot \'%s\' u 2:1", strncat(fname, ".txt", sizeof(fname)));
        fclose(dados);
}



Bem pra não ficar falando besteira, vou deixar o próprio muzgo se explicar, segundo a sua declaração:


O que eu fiz nele até agora:


- dados gravados num arquivo de nome:
- dados-DIAMESANO-HORAMINUTOSEGUNDO.txt
- o programa gera a partir dos dados (pelo gnuplot) um arquivo .eps
- contendo o gráfico, arquivo esse podendo ser visualizado no gv.
- aceita os argumentos através da linha de comando, se nenhum parâmetro é passado, ele pergunta.

O que estou querendo fazer:


- ajustamento dinâmico do xrange(gnuplot) de acordo com a semente eo incremento; já que o comando plot "dados.txt" u 2:1 não serve para todos os casos.
- suporte a splot, para gerar com o gnuplot gráficos em 3d (só por frescura mesmo).

caos.c
#include "def.h"

int
main(int argc, char *argv[])
{

        FILE           *dados;
        float           x, k = 2, i = 1, inc;
        char            *fname;

        /* passagem de argumentos pela linha de comando ou interativamente */
        if (argc < 2) {
                fprintf(stdout, "Semente> ");
                fscanf(stdin, "%f", &x);
                fprintf(stdout, "Incremento> ");
                fscanf(stdin, "%f", &inc);
        } else {
                x = atof(argv[1]);
                inc = atof(argv[2]);
        }
        mkname(fname);
        scrplot(fname);
                
        if (!(dados = fopen(fname, "w"))) {
                fprintf(stdout, "%s\n", errno);
                exit(1);
        }
        while (!feof(dados)) {
                while (k <= 4) {
                        i = 0;
                        while (i <= 10) {
                                x = k * x * (1 - x);
                                fprintf(dados, "%f %f\n", x, k);
                                fprintf(stdout, "x = %f\tk = %f\n", x, k);
                                i++;
                        }
                        k += inc;
                }
                break;
        }
        system("gnuplot < temp.gpt");
        remove("temp.gpt");
        exit(0);
}



Compilando...

Bem, pra compilar é muito simples, basta salvar o primeiro código "def.h" num arquivo de mesmo nome e salvar o código "caos.c" num arquivo também de mesmo nome e rodar o seguinte comando.

$ gcc -o caos caos.c

Com isso será gerado o binário e pra executa-lo basta um:

$ ./caos

Simples não ?! Bem por enquanto é só, aguardem mais novidades.






Franklin Anderson de Oliveira Souza <[email protected]> - Merovigiam

É garantida a permissão para copiar, distribuir e/ou modificar este documento sobre os termos da GNU Free Documentation Licence. 2004


Hosted by www.Geocities.ws

1