Cliente – Servidor em C utilizando threads

Estou disponibilizando os fontes de um pequeno programa de cliente servidor implementado em C. Esse código utiliza threads na parte do servidor podendo controlar mais de um cliente.

Código Cliente. Para compilar utilize: gcc -lpthread -o cliente  cliente.c

/*********************************
Autor: Fernando Krein Pinheiro
Data: 04/07/2012
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <ctype.h>
#include <string.h>

int configuracaoCliente()
{
    /*Descritor do cliente*/
    int clienteSockfd;
    /*Estrutura do Cliente*/
    struct sockaddr_in serv_addr;
    /*Tamanho da estrutura*/
    socklen_t addrlen = sizeof (serv_addr);

    /*Socket familia TCP declarado SOCK_STREAM e criado*/
    clienteSockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clienteSockfd < 0)
	{
	    printf("Erro no Socket\n");
		exit(1);
	}
    /*Zera a estrutura*/
    bzero((char *) & serv_addr, sizeof (serv_addr));
    /*Seta a familia*/
    serv_addr.sin_family = AF_INET;
    /*Define o IP nesse caso o localhost*/
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    /*Define a porta de conexao*/
    serv_addr.sin_port = htons(6881);
   /*Faz a conexao com o servidor*/
   if(connect(clienteSockfd,(struct sockaddr *)&serv_addr, addrlen) < 0)
     {
        	printf("Erro no Socket\n");
		exit(1);
	}
        return clienteSockfd;
}

void Cliente(int clienteSockfd)
{
  /*Buffer de dados a ser mandado para o servidor*/
  char buffer_para_servidor[256];
  printf("Digite uma mensagem para o servidor: ");
   do {

        scanf("%s",buffer_para_servidor);
        fflush(stdin);
        /*Escreve para o servidor*/

        write(clienteSockfd, buffer_para_servidor, sizeof (buffer_para_servidor));

      /*Mensagem para sair*/
    } while (strcmp(buffer_para_servidor, "sair") != 0);
    /**Encerra o descritor*/
    close(clienteSockfd);
}

int main()
{
    system("clear");
    /*Estrutura cliente*/
    struct sockaddr_in serv_addr;
    /*Tamanho da estrutura*/
    socklen_t addrlen = sizeof (serv_addr);
    /*Define o descritor cliente*/
    int descritorCliente;
    descritorCliente = configuracaoCliente();
    /*chama funcao do cliente passando o descritor*/
    Cliente(descritorCliente);
    exit(0);
}

Código Servidor. Para compilador utilize: gcc -lpthread -o servidor  servidor.c

/*********************************
Autor: Fernando Krein Pinheiro
Data: 04/07/2012
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <pthread.h>

void* Servidor(void* arg)
{
    /*Buffer de entrada (armazena buffer do cliente)*/
    char buffer_do_cliente[256];
    /*Cast do ponteiro*/
    int sockEntrada = *(int *) arg;
    /*Loop "infinito"*/
    printf("Aguardando as mensagens... ");
    for (;;)
    {
        /*Le o que vem do cliente*/
        read(sockEntrada, buffer_do_cliente, sizeof (buffer_do_cliente));
        if (strcmp(buffer_do_cliente, "sair") != 0)
        {
            /*Se buffer == sair cai fora*/
            printf("%s\n",buffer_do_cliente);
        }
        else
             {
                 /*Encerra o descritor*/
                 close(sockEntrada);
                 /*Encerra a thread*/
                 pthread_exit((void*) 0);
             }
    }
}

int configuracaoServidor()
{
    /*Cria o descritor*/
    int sockfd;
    /*Declaracao da estrutura*/
    struct sockaddr_in serverAddr;
    /*Cria o socket*/
    if ((sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
	{
	  printf("Erro no Socket\n");
	  exit(1);
	}
    /*Zera a estrutura*/
    memset(&serverAddr, 0, sizeof (serverAddr));
    /*Seta a familia*/
    serverAddr.sin_family = AF_INET;
    /*Seta os IPS (A constante INADDR_ANY e todos os ips ou qualquer ip) htonl -> conversao*/
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    /*Define a porta*/
    serverAddr.sin_port = htons(6881);
    /*Faz a bindagem (cola, gruda, conecta seja o que for)*/
    if (bind(sockfd, (struct sockaddr *) & serverAddr, sizeof (serverAddr)) < 0)
    {
	  printf("Erro no Socket\n");
	  exit(1);
     }
    /*Fica na escuta de ate 5 clientes*/
    if (listen(sockfd, 5) < 0)
    {
	  printf("Erro no Socket\n");
	  exit(1);
    }
    return sockfd;
}

int main()
{
    system("clear");
    /*Declaracao da estrutura*/
    struct sockaddr_in serverAddr;
    /*Retorna da funcao e o descritor*/
    int sockfd = configuracaoServidor();

    /*Loop "infinito"*/
    while (1)
    {
    	int clienteSockfd;
    	struct sockaddr_in clienteAddr;
        /*tamanho da estrutura*/
    	unsigned int clntLen;
        clntLen = sizeof (clienteAddr);
        /*declara uma thread*/
	pthread_t thread;
	/*Fica no aguardo da conexao do cliente*/
        if ((clienteSockfd = accept(sockfd, (struct sockaddr *) & clienteAddr, &clntLen)) < 0)
        {
	  printf("Erro no Socket\n");
	  exit(1);
	}
        /*Inicializa a thread*/
        if (pthread_create(&thread, NULL, Servidor, &clienteSockfd) != 0)
       {
            printf("Erro na Thread\n");
            exit(1);
       }

        pthread_detach(thread);
    }
    exit(0);
}
Anúncios
por ferpinheiro Postado em C/C++

Estrutura de dados tipo Pilha em C

Mais um algoritmo em C que apresenta uma estrutura de dados muito conhecida e usada em Ciência da Computação. Estou falando da estrutura tipo pilha, para quem nunca ouviu falar sobre essa estrutura poderá encontrar um bom material AQUI. Mas se você esta em um bom dia e cheio de paciência assista ao vídeo abaixo, que por sinal é muito bom!

Vamos ver o que o código abaixo faz:

Empilhe uma sequência de valores inteiros.
Quando for informado o valor -1 (termino da execução) o algoritmo cria duas novas pilhas separando valores pares dos valores ímpares. Veja:

/*********************************
Autor: Fernando Krein Pinheiro
Data: 19/01/2012
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/

#include <stdio.h>
#define capacidade 30

struct stack
{
       int topo, item[capacidade];
};

/*============== Inicia Pilha ======================*/
void inic_pilha (struct stack *p)
{
     p->topo = -1;
}

/*=============== Verifica pilha Cheia ==============*/
int pilha_cheia (struct stack *p)
{
    if (p->topo == (capacidade-1))
    {
          printf ("\n\n\t\tA Pilha esta Cheia!!!");
          return 1;
    }else
        return 0;
}

/*=============== Verifica pilha Vazia ==============*/
int pilha_vazia (struct stack *p)
{
    if (p->topo == -1)
    {
         printf ("\n\n\t\tA Pilha esta Vazia!!!");
         return 1;
    }
    else
     return 0;
}

/*=============== Verifica pilha Vazia 2 ============*/
int pilha_vazia2 (struct stack *p)
{
    if (p->topo == -1)
       return 1;
    else
       return 0;
}

/*================== Empilha  ========================*/
int push (struct stack *p, int valor)
{
     return (p->item[++(p->topo)] = valor);
}

/*================== Desempilha  =====================*/
int pop (struct stack *p)
{
    int aux;
    aux = p->item[(p->topo)--];
    return aux;
}

/*================== Mostra Pilha  ===================*/
int mostra (struct stack *p)
{
    int aux;
    if (pilha_vazia2 (p))
       return 1;
    else
    {
        aux = pop (p);
        printf ("%d,", aux);
        mostra (p);
        return 0;
    }
}

/*================== Reempilha  ========================*/
int reempilha (struct stack *p, struct stack *p_par, struct stack *p_impar)
{
    int aux;
    if (pilha_vazia (p))
       return 1;
    else
    {   //seleciona os valores Impares
        if (p->item[p->topo]%2)
        {
               aux = pop (p);
               push (p_impar, aux);
        }
        else //seleciona valores pares
        {
               aux = pop (p);
               push (p_par, aux);
        }
        reempilha (p, p_par, p_impar);
        return 0;
    }

}

/*================== Funcao para pegar os valores a empilhar  =============*/
int empilha (struct stack *p)
{
    int valor;
    printf ("Informe um valor para ser empilhado ou -1 para sair ");
    scanf ("%d", &valor);
    if (pilha_cheia (p))
       return 1;
    else
    {
        if (valor == -1)
                  return 0;
        else
        {
            push (p, valor);
empilha (p);
            return 0;
        }
    }
}

/*======================== MAIN ===============================*/
int main ()
{
    struct stack pilha, pilha_par, pilha_impar;
    inic_pilha (&pilha);
    inic_pilha (&pilha_impar);
    inic_pilha (&pilha_par);
    empilha (&pilha);
    reempilha (&pilha, &pilha_par, &pilha_impar);
    printf ("\nPilha Par:");
    mostra (&pilha_par);
    printf ("\n\nPilha Impar: ");
    mostra (&pilha_impar);
    printf("\n\n\n");
    return 0;
}

Para fazer download do código Clique AQUI….

Fui…

por ferpinheiro Postado em C/C++

Software para locadora

No tutorial de hoje trago para vocês um código que escrevi a algum tempo atrás quando ainda fazia a cadeira de Linguagem de programação II onde aprendiamos orientação a objetos utilizando a linguagem C++.

Um dos exercícios propostos pelo professor foi escrever um código para gerenciar uma locadora. Esse software possuía alguns requisitos básicos que deveriam ser atendidos, entre eles estavam:

Crie uma classe Filme, com campos para:

– Código do Filme (caracteres alfanuméricos)
– Título do Filme
– Categoria (que pode ser Aventura, Ficção, etc.)
– Quantidade (inteiro)
– Alugados (inteiro)
– Disponível (Sim/Não)

Além do método construtor, crie os seguintes métodos:

– locar(), que não recebe parâmetros e seta o campo Disponivel para Não;
– devolver(), que não recebe parâmetros e seta o campo Disponível para Sim.

Crie a classe Pessoa com os atributos:

 – codigo
– nome
– endereco
Criar os métodos set e gets correspondentes.  Também implemente o construtor.

Crie a classe Locadora

Onde esta simula um acervo de 20 filmes ( Filme filmes[20]) e então faça uma pessoa ser capaz de locar alguns filmes e em seguida devolve-los.

Bem seguindo esses requisitos e depois de algum tempo, aí esta o código…

/*********************************
Autor: Fernando Krein Pinheiro
Data: 19/01/2012
Linguagem: C++
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/

#include <iostream>
#include <cstdlib>

using namespace std;

class filme
{
   private:
     string codigo;
     string titulo;
     string categoria;
     int quantidade;
     int alugado;
     int disponivel;

public:
    filme()
    {
        codigo = "NULL";
        titulo = "NULL";
        categoria = "NULL";
        quantidade = 0;
        alugado = 0;
        disponivel = 0;
    }

    void set_codigo(string);
    void set_titulo(string);
    void set_categoria(string);
    void set_quantidade(int);
    void set_alugado(int);
    void set_disponivel(int);
    string get_codigo();
    string get_titulo();
    string get_categoria();
    int get_quantidade();
    int get_alugado();
    int get_disponivel();
    void set_filme(string, string, string, int, int, int);
    void get_filme(string *, string *, string *, int *, int *, int *);
    void loca();
    void devolve();
};

void filme::set_codigo(string cod)
{
    codigo = cod;
}
void filme::set_titulo(string tit)
{
    titulo = tit;
}
void filme::set_categoria(string cat)
{
    categoria = cat;
}
void filme::set_quantidade(int n)
{
    quantidade = n;
}
void filme::set_alugado(int n)
{
    alugado = n;
}
void filme::set_disponivel(int n)
{
    disponivel = n;
}
string filme::get_codigo()
{
    return codigo;
}
string filme::get_titulo()
{
    return titulo;
}
string filme::get_categoria()
{
    return categoria;
}
int filme::get_quantidade()
{
    return quantidade;
}
int filme::get_alugado()
{
    return alugado;
}
int filme::get_disponivel()
{
    return disponivel;
}

void filme::set_filme(string codigo, string titulo, string categoria, int quantidade, int alugado, int disponivel)
{
    set_codigo(codigo);
    set_titulo(titulo);
    set_categoria(categoria);
    set_quantidade(quantidade);
    set_alugado(alugado);
    set_disponivel(disponivel);
}

void filme::get_filme(string *codigo, string *titulo, string *categoria, int *quantidade, int *alugado, int *disponivel)
{
    *codigo = get_codigo();
    *titulo = get_titulo();
    *categoria = get_categoria();
    *quantidade = get_quantidade();
    *alugado = get_alugado();
    *disponivel = get_disponivel();
}

void filme::loca()
{
    set_disponivel(0);
}
void filme::devolve()
{
    set_disponivel(1);
}

class pessoa
{

    filme film;

    private:
      string codigo;
      string nome;
      string rua;

    public:
      pessoa()
      {
        codigo = "NULL";
        nome = "NULL";
        rua = "NULL";
      }

    void set_codigo(string);
    void set_nome(string);
    void set_rua(string);
    void set_dados(string, string, string);
    string get_codigo();
    string get_nome();
    string get_rua();
    void get_dados(string *, string *, string *);
};

void pessoa::set_codigo(string cod)
{
    codigo = cod;
}
void pessoa::set_nome(string nom)
{
    nome = nom;
}
void pessoa::set_rua(string ru)
{
    rua = ru;
}
void pessoa::set_dados(string codigo, string nome, string rua)
{
    set_codigo(codigo);
    set_nome(nome);
    set_rua(rua);
}
string pessoa::get_codigo()
{
    return codigo;
}
string pessoa::get_nome()
{
    return nome;
}

string pessoa::get_rua()
{
    return rua;
}
void pessoa::get_dados(string *codigo, string *nome, string *rua)
{
    *codigo = get_codigo();
    *nome = get_nome();
    *rua = get_rua();
}

class locadora
{
    filme film[20];
    pessoa pess[10];

    private:
    public:
       locadora()
       {
       }
    void set_filme(string, string, string, int, int, int);
    void set_pessoa(string, string, string);
    void get_filme(string *, string *, string *, int *, int *, int *, int x);
    void get_pessoa(string *, string *, string *, int);
    void aluga_filme(int);
    void devolve_filme(int);
    int localiza_filme(string);
    int localiza_pessoa(string);
};

void locadora::set_filme(string codigo, string titulo, string categoria, int
                         quantidade, int aluga, int disponivel)
{
  for (int x = 0; x < 20; x++)
  {
    if (film[x].get_codigo() == "NULL")
    {
      film[x].set_filme(codigo, titulo, categoria, quantidade, aluga, disponivel);
      x = 30;
    }
  }
}

void locadora::set_pessoa(string codigo, string nome, string rua)
{
  for (int x = 0; x < 10; x++)
  {
     if (pess[x].get_codigo() == "NULL")
     {
        pess[x].set_dados(codigo, nome, rua);
        x = 20;
     }
  }
}

void locadora::get_filme(string *codigo, string *titulo, string *categoria,
                         int *quantidade, int *aluga, int *disponivel, int x)
{
   film[x].get_filme(codigo, titulo, categoria, quantidade, aluga, disponivel);
}

void locadora::get_pessoa(string *codigo, string *nome, string *rua, int x)
{
    pess[x].get_dados(codigo, nome, rua);
}

int locadora::localiza_filme(string titulo)
{
  for (int x = 0; x < 20; x++)
  {
     if (film[x].get_titulo() == titulo)
     {
       return x;
     }
  }
    return 30;
}

int locadora::localiza_pessoa(string nome)
{
   for (int x = 0; x < 10; x++)
   {
     if (pess[x].get_nome() == nome)
     {
       return x;
     }
   }
    return 30;
}

void locadora::aluga_filme(int a)
{
    film[a].loca();
}
void locadora::devolve_filme(int a)
{
    film[a].devolve();
}

int main()
{
  locadora loca;
  char op;
  string codigo, nome, rua, titulo, categoria;
  int a, b, c, aux;
  do
  {
     system("clear");
     cout << "[1] Cadastrar\n[2] Buscar\n[3] Locacao\n
              [4] Devolucao\n[0] Sair\n\nOpcao [ ]\b\b";
     cin >> op;
     switch (op)
     {
        case'1':
        do
         {
             system("clear");
             cout << "Cadastrar\n[1] Cliente\n[2] Filme\n
                      [0] Voltar\n\nOpcao [ ]\b\b";
             cin >> op;
             switch (op)
             {
                case'1':
                system("clear");
                cout << "Cliente\nCodigo: ";
                cin >> codigo;
                cout << "Nome: ";
                cin >> nome;
                cout << "Rua: ";
                cin >> rua;
                loca.set_pessoa(codigo, nome, rua);
                break;

                case'2':
                system("clear");
                cout << "Filme\nCodigo: ";
                cin >> codigo;
                cout << "Titulo: ";
                cin >> titulo;
                cout << "Categoria\n[1] Acao [2] Aventura [3] Romance
                         [4] Pudor [5] Lagrimas\nOpcao [ ]\b\b";
                cin >> op;
                cout << "Quantidade: ";
                cin >> a;
                do
                {
                   cout << "Alugados: ";
                   cin >> b;
                   if (b > a)
                   {
                      cout << "NULL." << endl;
                      aux = 0;
                   }else
                      aux = 1;
                 }while (aux != 1);

                if (a != b)
                {
                   cout << "Disponivel \n[1] Sim [2] Nao\nOpcao [ ]\b\b";
                   cin >> c;
                   if (c == 1)
                       c = 1;
                   else
                      c = 0;
                } else
                c = 0;
                switch (op)
                {
                    case'1':
                    loca.set_filme(codigo, titulo, "Acao", a, b, c);
                    break;

                    case'2':
                    loca.set_filme(codigo, titulo, "Aventura", a, b, c);
                    break;

                    case'3':
                    loca.set_filme(codigo, titulo, "Romance", a, b, c);
                    break;

                    case'4':
                    loca.set_filme(codigo, titulo, "Pudor", a, b, c);
                    break;

                    case'5':
                    loca.set_filme(codigo, titulo, "Lagrimas", a, b, c);
                    break;
                 }
                 break;
              }
           } while (op != '0');
             break;

         case'2':
         do {
              system("clear");
              cout << "[1] Cliente\n[2] Filme\n[0] Voltar\nOpcao [ ]\b\b";
              cin >> op;
              switch (op)
              {
                 case'1':
                 system("clear");
                 cout << "[1] Nome\n[2] Todos\nOpcao [ ]\b\b";
                 cin >> op;
                 switch (op)
                 {
                    case'1':
                    system("clear");
                    cout << "Nome: ";
                    cin >> nome;
                    a = loca.localiza_pessoa(nome);
                    if (a < 30)
                    {
                        loca.get_pessoa(&codigo, &nome, &rua, a);
                        cout << "Cliente\nCodigo: " << codigo << "\nNome: "
                             << nome << "\nRua: " << rua << endl;
                    } else
                        cout << "Nao Localizado." << endl;
                        sleep(3);
                        break;

                        case'2':
                        system("clear");
                        for (aux = 0; aux < 10; aux++)
                        {
                             loca.get_pessoa(&codigo, &nome, &rua, aux);
                             if (codigo != "NULL")
                             {
                                  cout << "\nCodigo: " << codigo << "\nNome: "
                                       << nome << "\nRua: " << rua << endl;
                                  sleep(3);
                             }
                        }
                        break;
                 }

                 break;
                 case'2':
                 system("clear");
                 cout << "Filme\n[1] Titulo\n[2] Todos\nOpcao [ ]\b\b";
                 cin >> op;
                 switch (op)
                 {
                   case'1':
                   system("clear");
                   cout << "Titulo: ";
                   cin >> titulo;
                   a = loca.localiza_filme(titulo);
                  if (a < 30)
                  {
                   loca.get_filme(&codigo, &titulo, &categoria, &aux, &b, &c, a);
                   cout << "Cliente\nCodigo: " << codigo << "\nTitulo: " << titulo
                   << "\nCategoria: " << categoria << "\nQuantidade: " << aux << "\n
                   Alugados: " << b;
                   if (c == 1)
                         cout << "\nDisponivel: SIM" << endl;
                     else
                         cout << "\nDisponivel: NAO" << endl;
                     } else
                         cout << "Nao Localizado." << endl;
                         sleep(3);
                         break;

                     case'2':
                     system("clear");
                     for (aux = 0; aux < 20; aux++)
                     {
                    loca.get_filme(&codigo, &titulo, &categoria, &a, &b, &c, aux);
                    if (codigo != "NULL")
                    {
                      cout << "Cliente\nCodigo: " << codigo << "\nTitulo: "
                      << titulo << "\nCategoria: " << categoria << "\nQuantidade: "
                      << a << "\nAlugados: " << b;
                      if (c == 1)
                        cout << "\nDisponivel: SIM" << endl;
                      else
                           cout << "\nDisponivel: NAO" << endl;
                           sleep(3);

                      }
                    }
                        break;
                     }
                    }
                } while (op != '0');
                break;
            case'3':
                system("clear");
                cout << "Titulo do filme: ";
                cin >> titulo;
                a = loca.localiza_filme(titulo);
                if (a < 30) {
                    loca.aluga_filme(a);
                    cout << "Locado." << endl;
                } else
                    cout << "Nao encontrado." << endl;
                sleep(3);
                break;
            case'4':
                system("clear");
                cout << "Titulo do filme: ";
                cin >> titulo;
                a = loca.localiza_filme(titulo);
                if (a < 30) {
                    loca.devolve_filme(a);
                    cout << "Devolvido." << endl;
                } else
                    cout << "Nao encontrado." << endl;
                sleep(3);
                break;
            case'0':
                return 0;
                break;
        }
    } while (1 != 0);
}

Para compilar digite: g++ -o Locadora arquivo_fonte.cpp
Para executar digite ./Locadora

Esse código é valido para Windows tambem, apenas basta modificar a chamada de sistema system(“clear”) para system(“cls”)

Faça o Download do Código

Algumas telas do software:

Tela Inicial

Tela de Cadastro de Filmes

Espero que seja útil….até mais

por ferpinheiro Postado em C/C++

Como descobrir os erros que usuários dos seus softwares cometem

E aí galera, na dica de hoje vou mostrar como usar um utilitário do Linux em seus programas de computadores. Primeiro vamos imaginar o seguinte cenário:

Você é um desenvolvedor de softwares para Linux e tem muitos problemas com os usuários finais que utilizam esse software. Os problemas são de tipos variados, mas o que mais acontece é um usuário tentar informar valores errados em um campo, como por exemplo: informar uma string em um campo onde só pode ser aceito inteiros, ou ainda, o usuário tenta cadastrar algo em um campo e o software não aceita… então ele entra em desespero e liga para voce:

Cliente: – Alô é o Fernando?
Desenvolvedor: – Sim é ele mesmo!

Cliente: – Olha Fernando, eu estou tentando cadastrar um cliente e o software não esta aceitando… Não sei mais o que fazer!
Desenvolvedor: – Calma, me diz em que tela do software você esta e que erro está dando…

Cliente: – Eu não sei direito, ele da um erro estranho é uma mensagem em inglês, acho melhor você vir até aqui para ver.

Então você está trabalhando em um importante projeto  e naquele momento não pode sair para atende-lo. Poucos minutos depois o cliente liga novamente e a historia continua. Então você acaba indo até ele e pergunta:

Desenvolvedor: – Você se lembra em que ponto  estava quando o erro começou?
Cliente: – Haaaa agora nem lembro mais.

Desenvolvedor: Você lembra do erro? O que ele dizia?
Cliente: – Não sei ao certo, mas parecia ser uns códigos como 0x0023 algo parecido com isso…

Então você na condição de desenvolvedor pensa: E agora que que eu faço, começo a testar todo o software para saber onde ele errou ou onde está o erro no software?

Bem, o tutorial de hoje mostra uma dica simples que talvez possa ajudar a resolver o problema acima. Digamos que o cliente tenha um software que faça divisões de numero inteiros, como por exemplo dividir 20 /2 , para esse caso o resultado seria 10 (Isso se a matemática não mudou).

Agora imagine se o cliente tentasse dividir 20 / 0, (vinte por zero) o que aconteceria? Muito provável que seu sistema acusaria um erro, mas tudo bem você tratou esse erro e o sistema se estabilizou e pediu para que o usuário digitasse um novo numero. E novamente ele digita 20 / 0, mais uma vez o sistema se estabiliza e pede outro numero, mas a ANTA do usuário ainda não percebeu que não existe divisão por zero e insiste no erro até um ponto em que ele liga para você e aí acontece a historia que acima….

Chega de conversa e vamos ver o código fonte desse software:

/*********************************
Autor: Fernando Krein Pinheiro
Data: 19/01/2012
Linguagem: C++
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/
#include <iostream>
#include <stdlib.h>
using namespace std;

void divide (double a, double b);
int main ()
{
	double numerador, denominador;
	do {
		cout << "Informe o numerador";
		cin >> numerador;
		cout << "Informe o denominador: ";
		cin >> denominador;
		divide (numerador, denominador);

	    }while (numerador != 0);
return 0;
}

void divide (double num, double denom) {
	try {
		if (!denom) throw denom;
			cout << "Resultado: " << num/denom << "\n";
	     }
	catch (double denom)
	{

	}
}

O código acima possui tratamento de erro caso venha a ser tentado uma divisão por zero, mas nesse caso não retorna mensagem alguma quando o erro acontece, isso porque você achou que não era necessário colocar uma mensagem dizendo “Você não pode fazer divisões por zero, tente outro valor !”

O usuário insiste na divisão e nada consegue, então você vai até o sistema e pergunta o que ele estava tentando fazer, ela responde, não lembro mais!!

Mas agora se você soubesse da solução que esta prestes a conhecer, seus problemas seriam resolvidos, pois esta solução captura a tela no momento em que o erro acontece, então é só voce verificar a imagem e “voilá”! Voce enxerga o erro no ato! Vejamos o código abaixo:

/*********************************
Autor: Fernando Krein Pinheiro
Data: 19/01/2012
Linguagem: C++
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/
#include <iostream>
#include <stdlib.h>
using namespace std;

void divide (double a, double b);
int main ()
{
	double numerador, denominador;
	do {
		cout << "Informe o numerador";
		cin >> numerador;
		cout << "Informe o denominador: ";
		cin >> denominador;
		divide (numerador, denominador);

	    }while (numerador != 0);
return 0;
}

void divide (double num, double denom) {
	try {
		if (!denom) throw denom;
			cout << "Resultado: " << num/denom << "\n";
	     }
	catch (double denom)
	{
		system("import -window root Erro.png");

	}
}

Repare que o código continua sendo o mesmo acima se não fosse pela linha system(“import -window root Erro.png”);

Essa Linha é a chave de todo o processo de descoberta de erros do usuario, pois ela captura a tela no momento em que o erro é gerado e a salva no computador onde o código esta sendo executado. Dessa maneira facilmente é possível descobrir o que o usuário digitou para que o sistema
entrasse em colapso!

Vejamos a execução do algoritmo:

Repare que para os dois primeiros cálculos um resultado é mostrado, já para o terceiro (20/0) não é informado nada e o software pergunta novamente por um numerador.

Com a solução de captura de tela podemos verificar o que o usuário digitou, veja:

Faça um teste você mesmo e comprove a solução! Mas antes de testar você precisa ter instalado o utilitário para capturar as imagens para isso basta digitar no terminal:

#apt-get install imagemagick
Espere a instalação terminar e então digite:
#apt-get install graphicsmagick-imagemagick-compat

Mas lembre-se essa dica só é valida para softwares que rodam em Linux!

Veja mais sobre a instalação e uso do utilitário AQUI e AQUI

por ferpinheiro Postado em C/C++

Algoritmo de Fibonacci com um pouco de História

O tutorial de hoje apresenta um simples algoritmo em C++ que executa a sequência de Fibonacci. Como existem inúmeros algoritmos como esse na internet, resolvi criar algo diferente, porem nada de novo, e acrescentar um pouco da historia sobre essa sequência e seu criador. Ao final do tutorial adicionei dois vídeos que mostram como essa sequência está relacionada com a natureza e como tudo torna-se um padrão perfeito determinado por ela. Veja o algoritmo abaixo:

/*********************************
Autor: Fernando Krein Pinheiro
Data: 04/01/2012
Linguagem: C++
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
*/

#include <iostream>
using namespace std;

int main ()
{
	int x = 0 , x1 = 1;
	int limite = 0;

	cout << "Informe o limite da Serie: ";
        cin >> limite;
	cout << x << endl;
	cout << x1 << endl;

	for( int cont = 0; cont<limite; cont++)
        {
               int valor = (x + x1);
               cout << valor  << endl;
               x = x1;
               x1 = valor;
        }
}

Repare que o algoritmo é simples e não usa recursividade como muitos encontrados na internet, pois o  intuito do tutorial era falar sobre a sequencia e demonstrar o algoritmo sendo executado.

Para compilar no Linux digite: g++ -o executavel fibonacci.cpp
Para executar ./executavel

Abaixo a execução do algoritmo:

Um pouco de Historia…

Foi no século XIII que um matemático chamado Leonardo Pisa, porem também conhecido como Fibonacci propôs uma sequência númerica simples onde sua formação é dada pela seguinte exemplo:

Cada elemento, a partir do terceiro, é obtido somando-se os dois elementos anteriores, ou seja,
(x+x) = x2                              (1+1) = 2
(x2+x) = x3                            (1+2) = 3
(x3+x2) = x5                          (3+2) = 5

A sequência então ficaria dessa forma:  (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …). O exemplo mais pratico da aplicação dessa sequência está relacionada a figura abaixo:

A explicação para a imagem é dada através da mesma forma que a sequência é escrita, ou seja, A partir dos dois quadrados de lado 1, podemos obter um retângulo de lados 2 e 1. Logo, se adicionarmos a esse retângulo um quadrado de lado 2, obtemos um novo retângulo 3×2. Se adicionarmos agora um quadrado de lado 3, obtemos um retângulo 5×3. E assim por diante…

Até aqui nada de tão especial e de diferente, mas se utilizarmos um compasso e traçarmos o quarto de circunferência inscrito em cada quadrado, encontraremos uma espiral formada pela concordância de arcos cujos raios são os elemento da sequência de Fibonacci e então iremos obter a seguinte imagem:

Veja agora a imagem abaixo que foi retirada da natureza e compare com o espiral acima:

Outra imagem que demonstra a sequência em uso.

Conseguiu perceber a relação da sequência de Fibonacci na natureza? Conseguindo ou não, veja os vídeos que demonstram a sequência de Fibonacci.

Referencias:

http://mathworld.wolfram.com/FibonacciNumber.html
http://pessoal.sercomtel.com.br/matematica/alegria/fibonacci/seqfib1.htm
http://pion.sbfisica.org.br/pdc/index.php/por/Artigos/O-numero-fi-e-a-sequeencia-de-Fibonacci

por ferpinheiro Postado em C/C++

Analisador Lexico em C

Esse foi um trabalho proposto na disciplina de Linguagens Formais e Compiladores em que o objetivo era a criação de um Analisador Léxico para posteriormente fazer a implementação de um compilador. Para quem não sabe o que é um Analisador Léxico ou uma analise léxica, consiste basicamente na verficação de um alfabeto, ou seja, com a analise léxica podemos determinar se certo caracter digitado faz parte do alfabeto ou não.

No caso de palavras, também é possível determinar se a mesma pode ser construida ou não com os símbolos do alfabeto.

Esse tipo de analise é um dos primeiros passos para a construção de compiladores. Outra etapa importante antes da implementação do compilador propriamente dito é a analise semantica, mas isso fica para outro tutorial. Não vou me deter em uma explicação mais aprofundada do assunto pois acredito que se você estiver lendo isso agora, já sabe do que eu estou falando!! 🙂

Segue a tabela das palavras que serão analisadas e formadas a partir do alfabeto. Qualquer outra palavra que não existir nessa lista não será reconhecida pelo Analisador Léxico.


Segue o código implementado na linguagem C. A tabela para o reconhecimento dos símbolos ficou um pouco grande devido a quantidade de palavras a serem analisadas, mas o código é portável e pode ser aplicado a qualquer outro tipo de tabela.

/*
Autor: Fernando Krein Pinheiro
Data: 07/10/2011
Linguagem: C

# ========= IMPORTANTE ===========
# O codigo esta livre para usar,
# citar e compartilhar desde que
# mantida sua fonte e seu autor.
# Obrigado.
 ***********************************
        ANALISADOR LEXICO
 Curso: Ciencia da Computacao
 Disciplina: Linguagens Formais
 Professor: Alessandro
 ************************************
 */

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

#define ET -1    //ERRO de TRANSICAO
#define EP -9    //ESTADO de PARADA
#define SI -5    //SIMBOLO INVALIDO
#define TC ' '   //TERMINO da CADEIA
#define COMP_FITA 50
#define MAX_SIMBOLOS 38
#define MAX_ESTADOS 250

/*#####################################################################*/

void _completa_fita(void);
void _varrer_a_fita(void);
int _varrer_modo_padrao(void);
int _encontra_simbolo(char);

/*#####################################################################*/

int tabela_t[MAX_ESTADOS][MAX_SIMBOLOS] =
    {
    { 1, ET, 25, 45, 50, 74, ET, ET, 139, ET, ET, 156, ET, 165, 168, 177, ET, 197, 210, 215, ET, 220, 235, ET, ET, 238, 239, 240, 241, 242, 243, 244, 245, 246,   	247, 248, 249, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 2, ET, ET, ET, ET, ET, 17, ET, 23, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 3, ET, 10, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 4, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 5, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 6, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 7, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 8, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 9, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 11, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 12, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 13, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 14, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 15, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 16, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 18, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 19, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 20, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 21, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 22, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 24, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 26, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 36, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 27, 34, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 28, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 29, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 30, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 31, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 32, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 33, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 35, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 37, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 38, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 39, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 40, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 41, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 42, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 43, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 44, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 46, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, 47, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 48, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, 49, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, 51, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 53, ET, ET, ET, ET, 63, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 52, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 54, ET, ET, 60, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 55, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 56, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 57, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 58, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 59, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 61, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 62, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, 64, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 65, ET, ET, 69, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 66, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, 67, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 68, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 70, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 71, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 72, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 73, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 75, ET, ET, ET, ET, ET, ET, ET, 81, ET, ET, 78, ET, ET, ET, ET, ET, ET, ET, ET, 134, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 76, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 77, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 79, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 80, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 82, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 83, ET, ET, ET, 92, 105, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 126, 132, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 84, ET, ET, ET, 111, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, 85, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 86, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 87, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 88, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 89, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 90, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 91, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, 100, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 93, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 94, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 95, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 96, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 97, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 98, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 99, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 101, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 102, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, 103, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 104, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 106, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 107, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 108, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 109, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 110, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 112, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 115, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 113, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 114, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 116, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 117, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 118, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, 119, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 120, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 121, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 122, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 123, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 124, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 125, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 127, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 128, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 129, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 130, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 131, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 133, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 135, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 136, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 137, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 138, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 140, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 141, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 145, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 142, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 143, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 144, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 146, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 147, ET, ET, ET, ET, ET, ET, ET, ET, 150, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 148, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 149, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 151, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 152, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 153, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 154, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 155, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 157, ET, ET, ET, ET, ET, ET, ET, ET, ET, 160, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 158, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 159, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, 161, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, 162, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 163, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 164, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 166, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 167, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 169, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 170, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 171, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 172, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 173, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 174, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 175, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 176, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 178, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 186, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 179, 181, ET, 183, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 180, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 182, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 184, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 185, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 187, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, 188, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 189, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, 190, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 191, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 192, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 193, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 194, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 195, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 196, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 198, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 199, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 201, ET, ET, ET, 205, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 200, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, 202, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 203, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 204, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 206, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 207, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 208, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 209, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, 211, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 212, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 213, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 214, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, 216, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 217, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 218, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 219, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { 221, ET, ET, ET, 223, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 222, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 227, ET, 224, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 225, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 226, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, 228, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { 229, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, 230, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, 231, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, 232, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 233, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 234, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 236, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, 237, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},
    { ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, EP},

};

/*#######################################################################*/
char alfabeto[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
'r', 's', 't', 'u', 'v', 'x', 'y', 'z', '=', '>', '<', '>=', '<=', '<>', '+', '-', '*', '/', '%', '?', TC};
/*#######################################################################*/

int cabeca_leitura;
int estado_maquina;
char cadeia_1[COMP_FITA];
char C_fita[COMP_FITA];
char caracter_lido;

/*####################################################################*/

int main() {

    system("clear");
    printf("|========================================|\n");
    printf("|=========== ANALISADOR LEXICO ==========|\n");
    printf("|========================================|\n");
    printf("|=== Digite a palvra a ser analisada: ===|\n\n");

    _completa_fita();
    _varrer_a_fita();
    estado_maquina = _varrer_modo_padrao();
    fflush(stdin);
    return (0);
}

/*######################################################################*/

void _completa_fita(void) {
    int i = 0;
    C_fita[i] = getchar();
    printf("\n\n");
    while (C_fita[i] != '\n')
        C_fita[++i] = getchar();
    C_fita[i++] = TC;
    C_fita[i] = '\0';

    for (i = 0; C_fita[i] != TC; i++)
        cadeia_1[i] = C_fita[i];
    cadeia_1[i++] = TC;
    cadeia_1[i] = '\0';
}

/*########################################################################*/

void _varrer_a_fita(void) {
    int cad_valida = 0, total_cadeias = 0, cadeia = 1;
    estado_maquina = 0;
    cabeca_leitura = 0;

    while (C_fita[cabeca_leitura] != '\0') {
        caracter_lido = _encontra_simbolo(C_fita[cabeca_leitura]);
        printf("%c", C_fita[cabeca_leitura]);
        if (caracter_lido == SI && cadeia) {
            printf("A cadeia e INVALIDA");
            cadeia = 0;
        } else
            if (cadeia) {
            sleep(1);
            printf("  [%d] %d  \n", estado_maquina, tabela_t[estado_maquina][caracter_lido]);
            if (tabela_t[estado_maquina][caracter_lido] == EP) {
                printf("\nA cadeia e VALIDA!\n\n");
                cad_valida++;
            } else if (tabela_t[estado_maquina][caracter_lido] == ET) {
                printf("Houve um ERRO DE TRANSICAO!");
                cadeia = 0;
            }
            estado_maquina = tabela_t[estado_maquina][caracter_lido];
        }
        if (C_fita[cabeca_leitura] == TC) {
            printf("\n");
            cadeia = 1;
            total_cadeias++;
            estado_maquina = 0;
        }
        cabeca_leitura++;
    }
    printf("Cadeias Existentes: %d\n", total_cadeias);
    printf("Total de cadeias Validas: %d\n\n\n\n", cad_valida);
}

/*######################################################################*/

int _varrer_modo_padrao(void) {
    cabeca_leitura = 0;
    estado_maquina = 0;
    while (cadeia_1[cabeca_leitura] != '\0') {
        caracter_lido = _encontra_simbolo(cadeia_1[cabeca_leitura++]);
        if (caracter_lido == SI)
            return (2);
        if (tabela_t[estado_maquina][caracter_lido] == ET)
            return (1);
        if (tabela_t[estado_maquina][caracter_lido] == EP)
            return (0);
        estado_maquina = tabela_t[estado_maquina][caracter_lido];
    }
}

/*#######################################################################*/

int _encontra_simbolo(char simbolo) {

    int i;
    for (i = 0; i < MAX_SIMBOLOS; i++)
        if (alfabeto[i] == simbolo)
            return (i);
    return (SI);
}

Confira uma imagem da execução e do reconhecimento das palavras:

Copie o código, cole em um arquivo texto com o nome de AnalisadorLexico.c e então compile.
No gcc pode ser feito assim: gcc -o executavel AnalisadorLexico.c

Bem é isso então, qualquer duvida, pergunte! Para fazer o download do código CLIQUE AQUI.

por ferpinheiro Postado em C/C++

Ordenando elementos com qsort() – C/C++

Ja havia escrito um tutorial sobre como ordenar elementos usando C/C++ mas usando a teoria por trás da implementação e demonstrando 3 dos diferentes métodos. Dessa vez resolvi escrever esse tutorial para mostrar uma função bastante conhecida (ou não) da linguagem C/C++, estou falando da função qsort(). Essa funcao faz parte da biblioteca stdlib.h.

Exemplo de uso: qsort (vetor, numero_de_elementos, sizeof(vetor), comparador);

O parâmetro comparador passado para esta função é o nome da função que irá determinar o critério de comparação.

Essa função utiliza a teoria do método de ordenação QuickSort que atualmente é um dos métodos mais rápidos e eficientes no meio da programação para ordenação de elementos. Para quem quiser saber um pouco mais sobre o método e implementações do mesmo poderá acessar os links abaixo:

LINK1        LINK2        LINK3

Esse algoritmo foi testado em um notebook HP-G42 com 2 GB de memoria DDR3 e com processador dual core T4500 de 2.30GHZ. O numero máximo de valores utilizados foi de 100.000.000. O sistema operacional foi Ubuntu 10.10 com a versão de kernel 2.6.35-30. Foi compilado com o gcc em linha de comando. A versão do gcc era 4.4.5.

O funcionamento básico do algoritmo é:

Aloca memoria para o numero definido por TAM que é igual a 100.000.000
Gera os valores randomicamente e armazena em um vetor que foi alocado
inicialmente, armazena os valores em um arquivo texto para uma possível conferencia.
Chama uma função de tempo que pega a hora corrente do sistema.
Chama a função de ordenação qsort() passando o vetor alocado com os valores .
Chama a função tempo novamente após a ordenação dos elementos.
Calcula a diferença entre o primeiro tempo e o segundo tempo.
Escreve os valores ordenados em um arquivo texto para que possa ser conferido.
Libera a memoria alocada inicialmente.
Mostra o tempo total de execução na tela.

/*********************************
Autor: Fernando Krein Pinheiro
Data: 06/06/2010
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
Se voce estiver usando windows
mude a funcao do tempo para esta :

tempo = ((double)(fim-inicio))/CLK_TCK;
*/
//###################################################################

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TAM 100000000

//###################################################################
int comparador(valor1, valor2)
{
    if ( *(int*)valor1 > *(int*)valor2 )
    {
    	return 1;
    }
    else
    	if( *(int*)valor1 == *(int*)valor2 )
    	{
            return 0;
	}
    	else
		if ( *(int*)valor1 < *(int*)valor2 )
		{
           	      return -1;
		}
}
//##################################################################
int main()
{
	clock_t inicio,fim;
	int *vetor, indice;
	double tempo = 0;
	FILE *arquivo;

	vetor = (int *) malloc(sizeof(int)*TAM);
	srand(time(NULL));

	arquivo = fopen("Desordenados.txt","w");
	if(!arquivo)
	{
		printf("Arquivo nao pode ser criado");
	}
		for (indice = 0; indice < TAM; indice++)
		{
    			vetor[indice] = rand() % TAM;
    			fprintf(arquivo,"%d\n",vetor[indice]);
		}

		fclose(arquivo);
		inicio=clock();
		qsort(vetor, (size_t)TAM, sizeof(int), comparador );
		fim=clock();
		tempo = (double)(((double)fim-(double)inicio)/CLOCKS_PER_SEC);
		printf("\n\nTempo total para ordenar: %f (segundos.milesimos)\n\n\n",tempo);

	arquivo = fopen("Ordenados.txt","w");
	if(!arquivo)
	{
		printf("Arquivo nao pode ser criado");
	}
		for (indice = 0; indice < TAM; indice++)
		{
    			fprintf(arquivo,"%d\n",vetor[indice]);
		}
		fclose(arquivo);

free(vetor);
return 0;
}
//###############################################################

Essa é uma imagem da tela do notebook antes da execução do algoritmo.

Após alguns segundos de execução o consumo de memoria e processador tiveram um aumento significativo em relação ao estado inicial.

O tamanho dos arquivos de dados gerados pelo algoritmo ficou com tamanho de 847,5 MB. Veja a imagem abaixo.

O tempo total que o algoritmo levou para ordenar os 100.000.000 elementos foi de 45 segundos e 320000 milésimos de segundos (45.320000).

OBS: A cada nova execução do algoritmo os valores gerado serão diferentes e com a ordem diferente o que poderá influenciar no tempo de execução do mesmo!

Ate a próxima…

por ferpinheiro Postado em C/C++

Algoritmo para eleição em anel usado em Sistemas Distribuídos.

Bem, para falar sobre esse assunto eu deveria criar uma nova categoria e chama-la de sistemas distribuídos, mas como o assunto é um algoritmo em C achei melhor coloca-lo aqui e então fazer uma breve explicação do que é esse algoritmo para eleição em anel.

Essa é uma das soluções para eleição de líder em sistemas distribuídos e exige que os processos estejam organizados em um anel lógico, onde cada processo sabe quem é seu sucessor. As mensagens são enviadas no sentido horário através de um canal de comunicação que liga cada processo ao seu vizinho. O algoritmo parte do princípio que os processos não estão sujeitos a falhas durante a execução do algoritmo de eleição. Mas as falhas podem ocorrer e devem ser tratadas.

Quando um processo identificar a ausência de um líder (falha), ele inicia o processo de eleição primeiramente marcando-se como participante e em seguida enviando uma mensagem de eleição contendo seu identificador para seu vizinho no anel.

Ao receber uma mensagem de eleição, um processo deve comparar o identificador contido na mensagem com o seu próprio. Se o identificador recebido for maior, o processo deve passar adiante a mensagem para seu vizinho. Se por outro lado, o identificador contido na mensagem for menor que o identificador do processo em questão e o mesmo ainda não for um participante, então este deverá substituir o conteúdo da mensagem pelo seu próprio identificador antes de enviá-la para seu
vizinho.

Imagem simulando como funciona a eleição em anel.

Esse algoritmo foi escrito e testado usando Linux(Ubuntu), ele faz uso de algumas referencias de cores que poderão não funcionar em ambientes Windows, portanto se caso utiliza-lo, você deverá modificar conforme as suas necessidades.

/*********************************
Autor: Fernando Krein Pinheiro
Data: 06/04/2011
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************
 Esse algoritmo é apenas uma
 simulação do que um algoritmo
 de eleição em anel faz nos
 sistemas distribuidos.
********************************/
#include <stdlib.h>
#include <stdio.h>
#define TAM 5 /*aqui pode-se definir o numero de processos que se quer, precisa ser (>=2) */

struct Processos{
    int pid;
};
typedef struct Processos Processos;

int falha()
{
      int falha;
      srand(time(NULL));
      falha = rand() % TAM;
  return falha;
}

int promove_eleicao()
{
      int eleicao;
      eleicao = rand() % TAM;
 return eleicao;
}

int main()
{
    Processos proc[TAM];
    int proc_falha = 0;

    int proc_eleicao = 0;
    int proc_lider = 0;
    int vet_proc[TAM],i,cont;

 if(TAM<2)
 {
      system("clear");
      printf("\033[31mERRO 666 :\033[37mVoce precisa ter pelo menos 2 processos.\n");
      sleep(3);
      exit(0);
 }
 system("clear");

      for(; cont<TAM+TAM; cont++)
      {
            //inicializa os processo preenchendo a struct com numero do processo (PID)
             for(i=0; i<TAM; i++)
             {
                  vet_proc[i] = proc[TAM].pid = i;
             }
             do
             {
                   proc_falha = falha();
                   proc_eleicao = promove_eleicao();
             }while(proc_eleicao == proc_falha);

             //inicializa o processo com falha colocando -1
             for(i=0; i<TAM; i++)
             {
                 if(vet_proc[i] == proc_falha)
                 vet_proc[i] = -1;
             }

 proc_lider = vet_proc[0];
 for(i=0; i<TAM; i++)//faz a escolha do novo lider
 {
           if(vet_proc[i] > proc_lider)
           proc_lider = vet_proc[i];
 }
 printf("|\033[32m PROC PID\033[37m |\n");//faz a impressão na tela
 for(i=0; i<TAM; i++)
 {
         printf("| [%d] [%d] |\n",vet_proc[i],proc[TAM].pid=i);
 }
 sleep(1);
 printf("\n\nProcesso de PID\033[31m [%d]\033[37m falhou.\n",proc_falha);
 sleep(2);
 printf("Processo de PID\033[33m [%d]\033[37m iniciou eleicao.\n",proc_eleicao);
 sleep(2);
 printf("\033[36mEscolhendo novo lider...\033[37m \n");
 sleep(3);
 printf("Processo de PID\033[33m [%d]\033[37m e o novo lider.\n",proc_lider);
 sleep(3);
 system("clear");
}
return 0;
}

Lembro novamente que esse algoritmo apenas simula uma eleição em anel, e pode ser incrementado utilizando algumas funcionalidades a mais que não foram implementadas nessa versão.

por ferpinheiro Postado em C/C++

Ordenação de Elementos em C.

Desenvolvi esse algoritmo para demonstrar a diferença entre três métodos de ordenação usados na computação. Faço uso de uma função time() para coletar o tempo gasto por cada método para uma posterior comparação entre eles.

O algoritmo é simples mas mesmo assim é preciso fazer uma introdução antes: Os três métodos usados foram QuickSort, SelectioSort e InsertionSort, existe três tipo de ordenação que poderão ser feitas utilizando um vetor de elementos randomizado, ordenado crescente e ordenado decrescente, também é possível escolher o tamanho do vetor que se quer ordenar, para isso basta modificar o valor da constante TAM definida por: #define TAM 100000

O algoritmo foi testado e programado para no máximo 200000 valores, um numero acima desse poderá gerar erros ou inconsistências na saídas do programa. O programa foi escrito no Gedit e compilado com o gcc no Linux(Ubuntu).

A função para verificar o tempo no Linux é essa: (double)(((double)fim-(double)inicio)/CLOCKS_PER_SEC);
Caso queira compilar no (ru)Windows você precisa trocar a função do Linux por essa: ((double)(fim-inicio))/CLK_TCK;
Lembro que o tempo de execução de cada método poderá não ser o mesmo se executado em diferentes configurações de hardware (memoria, processador).

/*********************************
Autor: Fernando Krein Pinheiro
Data: 06/06/2010
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************/
/***************************************************************
OBS: Para Ordenar com vetores de ordem Crescente ou decrescente
precisa comentar as chamdas de fuçoes na main() deixando apenas
uma funçao de ordenação. Para vetores de diferentes tamanho mude
a Constante TAM nos arquivos cabeçalhos logo abaixo.
***************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TAM 100000

/*=======================VETOR ORDENADO DECRESCENTE===============================*/
void vet_ordenado_decrescente(int vet[],int num)
{
     int i;
     printf("Vetor em Ordem Decrescente\n");
     for(i=num;i>0;i--)
     {
           vet[i]=num-i;
     }
}

/*=======================VETOR_ORDENADO CRESCENTE==================================*/

void vet_ordenado(int vet[],int num)
{
     int i;
     printf("Vetor em Ordem Crescente\n");
     for(i=0;i<num;i++)
     {
           vet[i]=1+i;
     }
}

/*=======================VETOR_RANDOMIZADO========================================*/
void randomiza(int vet[],int num)
{
     int i;
     srand(time(NULL));
        printf("Vetor em Ordem Randomica\n");
        for (i=0; i<TAM; i++)
        {
                vet[i]=rand() % TAM;
        }
}

/*=====================QUICK_SORT==================================================*/
void ordena_quick(int vet[], int esquerda, int direita)
{
    int i, j;
    int x, y;
    i=esquerda; j=direita;
    x=vet[(esquerda+direita)/2];/*gera a media dos valores para escolher o pivo*/

  do
  {
    while(vet[i]<x && i<direita)
    i++;
         while(x<vet[j] && j>esquerda)
	 j--;
     if(i<=j)
     {
         y=vet[i];
         vet[i]=vet[j];
         vet[j]=y;
         i++;
         j--;
     }

   }while(i<=j);

    if(esquerda<j)
    ordena_quick(vet, esquerda, j);
           if(i<direita)
           ordena_quick(vet, i, direita);
}
void imprime_quick(int vet[],int num)
{
     int i=0;
     printf("\nORDENADO PELO METODO QUICKSORT:\n");
     while (i<num)
    {
           printf("%d\n", vet[i]);
           i++;
    }
}

/*=======================SELECTION_SORT============================================*/
void ordena_selection(int vet[], int num)
{
     int menor, i=0, y, aux;
     while (i<num)
	{
           	menor=vet[i];
           	y=i+1;
           	while (y<num)
		{
                 	if (vet[y] < menor)
			{
                                  aux = vet[y];
                                  vet[y] = menor;
                                  menor = aux;
                        }
                     y++;
                 }
           vet[i]=menor;
           i++;
       }
}
int  imprime_selection(int vet[],int num)
{
     int i=0;
     printf("\nORDENADO PELO METODO SELECTION:\n");
     while (i<num)
     {
           	printf("%d\n",vet[i]);
           	i++;
        }
}

/*=======================INSERTION_SORT============================================*/
void ordena_insertion(int vet[], int num)
{
        int i, j;
        int key;
        for (j=1;j<num;++j)
	{
                key = vet[j];
                i = j - 1;
                while (vet[i] > key && i >= 0)
		 {
                        vet[i+1] = vet[i];
                        --i;
                 }
              vet[i+1] = key;
        }
}
int  imprime_insertion(int vet[],int num)
{
     int i=0;
     printf("\nORDENADO PELO METODO INSERTION:\n");
     while (i<num)
	{
           	printf("%d\n", vet[i]);
           	i++;
        }
}

/*======================INICIO_DA_MAIN================================================*/
int main()
{
        clock_t inicio,fim;
    	int vet[TAM],i,num=0,opcao,op;
        double time_quick=0,time_selection=0,time_insertion=0;
    	system("clear");
    do
    {
      printf("\n===========MENU==========\n\n");
      printf("1 - QuickSort\n2 - SelectionSort\n3 - InsertionSort\n4 - Mostrar Tempos\n5 - Sair\n");
      printf("===========================[ ]\b\b");
      scanf("%d",&opcao);
      if(opcao<1||opcao>4)
      {
          exit(1);
      }
  switch(opcao)
  {
       case 1:
       {
           //vet_ordenado_decrescente(vet,TAM);
           //vet_ordenado(vet,TAM);
             randomiza(vet,TAM);

	        inicio=clock();
                ordena_quick(vet, 0, TAM-1);
                fim=clock();
                time_quick = /*((double)(fim-inicio))/CLK_TCK;*/(double)(((double)fim-(double)inicio)/CLOCKS_PER_SEC);
                printf("\n%3.3f Segundos para Ordenar %d numeros com o Metodo QuickSort\n\n",time_quick,TAM);
                //imprime_quick(vet,TAM);
                break;

         }
         case 2:
	 {
             //vet_ordenado_decrescente(vet,TAM);
             //vet_ordenado(vet,TAM);
               randomiza(vet,TAM);

                 inicio=clock();
                 ordena_selection(vet,TAM);
                 fim=clock();
                 time_selection = /*((double)(fim-inicio))/CLK_TCK;*/(double)(((double)fim-(double)inicio)/CLOCKS_PER_SEC);                	               printf("\n%3.4f Segundos para Ordenar %d numeros com o Metodo SelectionSort\n\n",time_selection,TAM);
		 //imprime_selection(vet,TAM);
                 break;

	  }
          case 3:
	  {
              //vet_ordenado_decrescente(vet,TAM);
              //vet_ordenado(vet,TAM);
                randomiza(vet,TAM);

	          inicio=clock();
    		  ordena_insertion(vet,TAM);
		  fim=clock();
		  time_insertion = /*((double)(fim-inicio))/CLK_TCK; */(double)(((double)fim-(double)inicio)/CLOCKS_PER_SEC);                      		               printf("\n%3.4f Segundos para Ordenar %d numeros com o Metodo InsertionSort\n\n",time_insertion,TAM);
                  //imprime_insertion(vet,TAM);
                  break;

          }
          case 4:
          {
                      printf("Tempo do QuickSort = %3.3f s\n",time_quick);
                      printf("Tempo do SelectionSort = %3.3f s\n",time_selection);
                      printf("Tempo do InsertionSort = %3.3f s\n",time_insertion);
                      break;
          }

     }

    }while(opcao>0||opcao<5);
return 0;
}

Confira uma versão desse post AQUI

por ferpinheiro Postado em C/C++

Um substituto para if, else em C.

A maioria dos programadores está acostumada com comandos de seleção/condição if() else, esses comandos definem um teste condicional o qual determina o curso da ação.
Embora esse comando seja muito usado devido a sua facilidade e utilidade, muitas vezes é preciso utilizar algo não tão trivial. Nessa dica vou usar o operador ” ? “, chamado de “operador ternário” pois requer três operando. Este pode ser usado para substituir os if-else na linguagem C.

Sua forma de funcionamento é:

Exp1 ? Exp2 : Exp3
Onde “Exp1” é expressão1, “Exp2” é expressão2 e assim por diante. O valor de uma expressão “?” é determinada como segue: “Exp1 é avaliada”;

a) se for verdadeira, Exp2 será avaliada e se tornará expressão “?” inteira.
b) se for falsa, então Exp3 é verdadeira e se torna valor da expressão “?” .

Sem mais delongas um breve algoritmo para comparações entre 3 valores:

/*********************************
Autor: Fernando Krein Pinheiro
Data: 22/08/2010
Linguagem: C
========= IMPORTANTE ===========
O código esta livre para usar,
citar e compartilhar desde que
mantida sua fonte e seu autor.
Obrigado.
*********************************/
#include <stdio.h>

int maior (int a, int b, int c) {
int nmaior = a;

nmaior = b>maior ? nmaior : b ;
nmaior = c>nmaior? c : nmaior ;

}

int menor(int a, int b, int c)
{
int nmenor = a;
nmenor = b < nmenor ? b : nmenor;
nmenor = c < nmenor ? c : nmenor;
return nmenor;
}

int main(){
int a,b,c;
printf("Digite 3 valores inteiros");
scanf("%d %d %d",&a,&b,&c);

printf("O maior numero e: %d\n",maior(a,b,c));
printf("O menor numero e: %d\n",menor(a,b,c));
return 0;
}

O algoritmo é simples de entender.
São três funções: uma é a main(), a outra para achar o menor valor e outra para achar o maior valor . O operador ” ? ” pode ser considerado como um IF.

Ex: nmenor = b < nmenor ? b : nmenor;
a) “nmenor” vai receber b se a comparação b < nmenor for verdade
b) caso contrário receberá “nmenor” e assim por diante…

Embora a dica seja simples e voltada aos iniciantes na linguagem C, sempre é útil conhecer uma forma diferente de representar e modificar ações em nossos programas.

por ferpinheiro Postado em C/C++