Pular para conteúdo

Projetos

Bibliotecas em C

GitHub DaviAMSilva/Estruturas_de_Dados GitHub DaviAMSilva/Searches GitHub DaviAMSilva/Sorts


Essas bibliotecas se referem a três conjuntos de funções e tipos de dados que eu desenvolvi enquanto estava cursando o curso de Ciência da Computação na Doctum para acelerar o desenvolvimentos das atividades. Esses projetos são:

  • Estruturas de Dados:

    Contém as estruturas de dados do tipo pilha, fila e lista e métodos para criar, acessar e modificar tais estruturas. O tipo de dado armazenado nessas estruturas é dinâmico e definido pelo usuário.

  • Searches:

    Contém diversos algoritmos de pesquisa em tipos de dados quaisquer, definidos pelo usuário.

  • Sorts:

    Contém diversos algoritmos de ordenação em tipos de dados quaisquer, definidos pelo usuário.

Eu criei essas bibliotecas durante os semestres em que cada um desses tópicos foi apresentado na faculdade. Minha principal motivação é que bem no início eu percebi o quanto eu reutilizava código pois atividades diferentes requeriam as mesmas estruturas, apenas a situação da atividade eram alteradas. Por causa disso, apesar de essas bibliotecas não terem muito utilidade prática no mundo externo, para mim elas foram de uma ajuda enorme.

A maneira como elas funcionam em geral é que elas permitem o uso de qualquer tipo de dados por meio de alocação dinâmica e conversão de ponteiros. O usuário apenas precisa definir o tamanho do tipo de dados no início e definir as funções necessárias para interagir com as bibliotecas utilizando os mesmos tipos de dados definidos.

Além disso outra vantagem é que as bibliotecas foram feitas de tal forma que o código fonte podia ser copiado para cada atividade necessária e continha um makefile para compilar cada arquivo para um arquivo de biblioteca estática (extensão .a) que poderia ser importada para os arquivos próprios da atividade por meio de outro makefile.

DIRS    := build/ lib/
SOURCES := $(wildcard source/*.c)
OBJECTS := $(patsubst source/%.c,build/%.o,$(SOURCES))
LIBS    := $(patsubst source/%.c,lib/lib%.a,$(SOURCES))

all: $(LIBS)
dirs: $(DIRS)

.PHONY: all dirs clean
.SECONDARY: $(OBJECTS)

build/%.o: source/%.c include/%.h | $(DIRS)
    gcc -c $< -Wall -O3 -o $@ -I include/

lib/lib%.a: build/%.o | $(DIRS)
    ar cr $@ $<

$(DIRS):
    mkdir -p $@

clean:
    rm -fr build/ lib/
.PHONY: all clean eds
all: $(patsubst %.c,bin/%,$(wildcard *.c))


libs := lista pilha
args := -Ieds/include -Leds/lib $(addprefix -l,$(libs))


bin/%: %.c | bin eds
    gcc $^ $(args) -O3 -Wall -Wno-unused-result -Wno-discarded-qualifiers -o $@


bin:
    mkdir -p bin/


eds:
    $(MAKE) -C eds


clean:
    rm -fr bin/

Simulador de Copa

GitHub DaviAMSilva/PI-Copa


Foi o meu primeiro grande projeto em grupo no primeiro semestre da minha graduação na Doctum. O objetivo geral do projeto foi:

Desenvolver um programa capaz de simular a realização de um torneio (copa). Pode-se utilizar o modelo atual utilizado pela FIFA para organizar a copa do mundo de futebol.

O contexto era de um organizador de eventos que desejasse inserir os resultados de um tornamento, conforme ele ia acontecendo, de tal maneira que o sistema calculasse e gerasse automaticamente o resultado de cada jogo, fase e do campeonato inteiro.

A minha versão suportava a quantidade de gols e cartões amarelos e vermelhos recebidos por cada time e para cada jogo. Também conseguia calcular todas as fases do torneio, desde a fase de grupos até a final, conforme as regras básicas da Copa do Mundo da FIFA. O usuário tinha também a opção de aleatorizar os resultados dos jogos, principalmente útil para testar o programa.

O projeto foi desenvolvido em C e compilado usando a ferramenta make para facilitar a compilação e execução do programa. Essa experiência foi uma das razões que motivaram a minha ideia para o projeto integrador 2, que foi o Arcade Mania.

Esse programa foi, principalmente na segunda fase, construído utilizando-se o sistema operacional Microsoft Windows 10 e a biblioteca windows.h para manipular o console do Windows. Por causa disso eu nem consigo mais testar o programa no meu sistema Linux atual. Mesmo ferramentas como o wine não conseguem exibir corretamente o console do Windows, apesar de conseguirem rodar o programa e gerar o resultado correto.

Um resultado típico do programa, ao selecionar todas as opções aleatórias, é o seguinte:

Saída do Terminal
            ___________
       .---'::'        `---.
      (::::::'              )
    __|`-----._______.-----'|__
   /  |              :::::::|  \
  |   |               ::::::|   |
  |   |                :::::|   |
   \  |               ::::::|  /
    \ |    Copa do Mundo   :| /
     \|       da FIFA   ::::|/
      |               ::::::|
      |              .::::::|
      \             :::::::|
       \            ::::::/
        `.        .:::::::'
          `-._  .::::::-'
              |  """|"
              |  :::|
              |   ::|
             /     ::\
        __.-'      :::`-.__
       (_           ::::::_)
         `"""---------"""'

      GANHADOR:
      Brasil
Arquivo de Resultado
O campeão da Copa do Mundo da FIFA foi o time:
> Brasil <

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓
┃            COPA DO MUNDO DA FIFA             ┃             Gols            ┃        Cartões       ┃
┣━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━╋━━━━━━━━━━┯━━━━━━━━━━┯━━━━━━━╋━━━━━━━━━━┯━━━━━━━━━━━┫
┃ Nº ┃          Nome do Time          │ Pontos ┃ Marcados │ Sofridos │ Saldo ┃ Amarelos │ Vermelhos ┃
┣━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━╋━━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━╋━━━━━━━━━━┿━━━━━━━━━━━┫
┃ 01 ┃ Brasil                         │ 18     ┃ 34       │ 21       │ +13   ┃ 37       │ 2         ┃
┃ 02 ┃ Croácia                        │ 15     ┃ 23       │ 25       │ -2    ┃ 35       │ 4         ┃
┃ 03 ┃ Japão                          │ 15     ┃ 35       │ 29       │ +6    ┃ 41       │ 2         ┃
┃ 04 ┃ Egito                          │ 13     ┃ 29       │ 17       │ +12   ┃ 37       │ 4         ┃
┃ 05 ┃ Marrocos                       │ 9      ┃ 20       │ 12       │ +8    ┃ 16       │ 2         ┃
┃ 06 ┃ Senegal                        │ 9      ┃ 23       │ 18       │ +5    ┃ 28       │ 2         ┃
┃ 07 ┃ Alemanha                       │ 9      ┃ 20       │ 19       │ +1    ┃ 26       │ 4         ┃
┃ 08 ┃ Islândia                       │ 7      ┃ 17       │ 15       │ +2    ┃ 25       │ 3         ┃
┃ 09 ┃ Rússia                         │ 7      ┃ 11       │ 6        │ +5    ┃ 20       │ 3         ┃
┃ 10 ┃ Austrália                      │ 6      ┃ 18       │ 14       │ +4    ┃ 18       │ 1         ┃
┃ 11 ┃ Costa Rica                     │ 6      ┃ 10       │ 8        │ +2    ┃ 16       │ 2         ┃
┃ 12 ┃ Portugal                       │ 6      ┃ 14       │ 14       │ +0    ┃ 19       │ 2         ┃
┃ 13 ┃ Sérvia                         │ 6      ┃ 7        │ 8        │ -1    ┃ 16       │ 3         ┃
┃ 14 ┃ Bélgica                        │ 6      ┃ 14       │ 20       │ -6    ┃ 21       │ 1         ┃
┃ 15 ┃ Panamá                         │ 6      ┃ 21       │ 28       │ -7    ┃ 23       │ 4         ┃
┃ 16 ┃ Dinamarca                      │ 6      ┃ 8        │ 16       │ -8    ┃ 31       │ 3         ┃
┃ 17 ┃ México                         │ 6      ┃ 14       │ 14       │ +0    ┃ 21       │ 3         ┃
┃ 18 ┃ Nigéria                        │ 4      ┃ 11       │ 10       │ +1    ┃ 15       │ 1         ┃
┃ 19 ┃ Irã                            │ 4      ┃ 10       │ 14       │ -4    ┃ 12       │ 0         ┃
┃ 20 ┃ Colômbia                       │ 3      ┃ 7        │ 2        │ +5    ┃ 5        │ 0         ┃
┃ 21 ┃ Inglaterra                     │ 3      ┃ 6        │ 3        │ +3    ┃ 3        │ 0         ┃
┃ 22 ┃ Peru                           │ 3      ┃ 12       │ 10       │ +2    ┃ 12       │ 1         ┃
┃ 23 ┃ Tunísia                        │ 3      ┃ 19       │ 19       │ +0    ┃ 20       │ 3         ┃
┃ 24 ┃ França                         │ 3      ┃ 11       │ 11       │ +0    ┃ 8        │ 2         ┃
┃ 25 ┃ Suécia                         │ 3      ┃ 8        │ 9        │ -1    ┃ 9        │ 1         ┃
┃ 26 ┃ Polônia                        │ 3      ┃ 14       │ 17       │ -3    ┃ 21       │ 2         ┃
┃ 27 ┃ Coreia do Sul                  │ 3      ┃ 13       │ 17       │ -4    ┃ 25       │ 3         ┃
┃ 28 ┃ Arábia Saudita                 │ 3      ┃ 2        │ 6        │ -4    ┃ 19       │ 2         ┃
┃ 29 ┃ Argentina                      │ 2      ┃ 9        │ 10       │ -1    ┃ 14       │ 3         ┃
┃ 30 ┃ Espanha                        │ 1      ┃ 6        │ 12       │ -6    ┃ 14       │ 3         ┃
┃ 31 ┃ Suíça                          │ 0      ┃ 6        │ 15       │ -9    ┃ 18       │ 2         ┃
┃ 32 ┃ Uruguai                        │ 0      ┃ 0        │ 13       │ -13   ┃ 14       │ 0         ┃
┗━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┻━━━━━━━━━━┷━━━━━━━━━━┷━━━━━━━┻━━━━━━━━━━┷━━━━━━━━━━━┛

TileableNoise.js

GitHub DaviAMSilva/TileableNoise.js


TileableNoise.js é uma simples biblioteca na forma de uma classe que ajuda a criar imagens de ruídos que se conectam perfeitamente.

Essa biblioteca usa a ideia de pegar o resultado de uma função de ruído, andando em volta de um círculo, para que o valor inicial seja igual ao valor final, permitindo ruído conectável em 1D e 2D.

Usando dois círculos em um espaço de ruído 4D é possível criar ruído repetível em um ambiente 2D.

Eu tirei minha inspiração de um vídeo do Daniel Shiffman's: Coding Challenge #136.1: Polar Perlin Noise Loops, do canal The Coding Train.

Imagem feita com a biblioteca. As linhas vermelhas marcam o local da repetição. Imagem feita com a biblioteca. As linhas vermelhas marcam o local da repetição.

Pontos Mais Próximos

GitHub DaviAMSilva/Pontos-mais-proximos Website Pontos Mais Próximos


Esse foi um algoritmo bem simples que eu desenvolvi cujo o objetivo é encontrar os dois pontos mais próximos dentro de uma coleção qualquer utilizando o algoritmo de divisão e conquista.

Tradicionalmente o algoritmo de par de pontos mais próximos tem tempo de execução representado por \(O\left(n^2\right)\), mas utilizando a estratégia acima é possível reduzir o tempo necessário para \(O\left(n \log n\right)\), sendo muito mais eficiente.

Eu desenvolvi esse algoritmo enquanto estava cursando o curso PENSAMENTO COMPUTACIONAL, PROGRAMAÇÃO E APLICAÇÕES EM MATEMÁTICA ofertada pelo ProMO 2019 por ter sido premiado por uma medalha de prata na OBMEP 2018.

Mosaico de Fotos

GitHub DaviAMSilva/Mosaico_de_Fotos


Mosaico de Fotos é um programa escrito em Python para criar mosaicos de fotos a partir de uma imagem principal e várias imagens fontes.

O caso de uso original foi pegar várias imagens de família e juntá-las para formar uma única imagem composta especial. Apesar disso, o fato de o programa trabalhar exclusivamente com peças quadradas o torna particularmente interessante para redesenhar imagens utilizando blocos do jogo Minecraft.

Exemplo de uso utilizando blocos de Minecraft na pintura Abaporu da pintora Tarsila do Amaral:

Pintura Abaporu original comparada com a versão criada usando blocos de Minecraft