·
Ciência da Computação ·
Estrutura de Dados
Envie sua pergunta para a IA e receba a resposta na hora

Prefere sua atividade resolvida por um tutor especialista?
- Receba resolvida até o seu prazo
- Converse com o tutor pelo chat
- Garantia de 7 dias contra erros
Recomendado para você
41
Eficiência e Complexidade Computacional: Conceitos e Exemplos
Estrutura de Dados
UFS
4
Atividade Lab1b: Implementação do TAD Fila Estática
Estrutura de Dados
MACKENZIE
4
Apresentação sobre Bancos de Dados NoSQL
Estrutura de Dados
UVA
35
Remoção de Nós em Árvores AVL
Estrutura de Dados
UNIT
11
Apostila-algoritmos-unicamp
Estrutura de Dados
UFBA
1
Pacote Comandos de Aula Poo
Estrutura de Dados
UEPB
1
Labirinto: Jogo de Texto em Python
Estrutura de Dados
UEPB
3
Lista de Exercícios 2 - Algoritmo e Estrutura de Dados 1
Estrutura de Dados
UFG
2
Prova 2-2022 1
Estrutura de Dados
UFSC
8
Database Security Threats and Prevention
Estrutura de Dados
UVA
Texto de pré-visualização
APS DESENVOLVIMENTO DE SISTEMA PARA MANIPULAÇÃO DE DADOS EM ARQUIVOS STRINGS E ESTRUTURAS DINÂMICAS E NÃOHOMOGÊNEAS Ciências da Computação Daniel Silva Reis F27JHC8 Marcu s Paulo Custodia N6489F0 Leonardo Alves Francisco N6200H0 Luiz Fernando Lopes dos Santos N668FC1 Fellipe Almeida Barbosa F32C I H9 São Paulo 5 Semestre de 202 2 Organização do Relatório da APS 1 Introdução Resumo geral do trabalho 2 Contexto Contextualiza o meio ambiente e seus problemas atuais de modo geral 3 Problemas Apresenta os problemas específicos sobre as queimadas tanto no Brasil quanto no mundo 4 Objetivo Explicar o escopo do nosso trabalho 5 Motivação Ilustrar a razão pela qual criamos o sistema e sua funcionalidade 6 Algoritmo de Estrutura de Dados Apresentação dos dois tipos de algoritmos os métodos de ordenação de dados e suas funcionalidades 7 Trabalhos relacionados Apresentação de sistemas conhecidos que funcionam com base nos algoritmos mostrados no tópico anterior 8 Desenvolvimento do aplicativo Explicação de como foi a criação do aplicativo apresentação de suas funcionalidades e sua codificação 9 Experimento e Análise dos resultados Apresentação dos testes e análise dos resultados gerados desses testes podendo assim criar uma comparação entre os métodos de ordenação 10 Considerações finais Analisando o trabalho de uma forma geral avaliando os aspectos predefinidos pela APS e por fim concluir o trabalho avaliando todos os tópicos descritos acima 11 Bibliografia Site que foram utilizados para buscar referências mais aprofundadas sobre os temas abordados 12 Ficha de Atividades Fichas de atividades de todos do grupo 1 Introdução O objetivo de nosso trabalho é falar sobre a educação ambiental principalmente sobre as queimadas no Brasil e desenvolver um a aplica ção onde os dados relacionados a falta ou a contribuição ao ambiente aparece de forma simples e organizada nosso aplicativo tem como principal objetivo desenvolver nas pessoas a consciência dos problemas ambientais em forma de dados e estimulálas a tentar buscar soluções para estes problemas que estão relacionados à interação homemambiente Esse tipo de educação busca constantemente a mudança de atitudes do homem onde esse deve ter plena consciência que é parte integrante do meio agindo de forma racional contribuindo para a preservação do Meio Ambiente Atualmente onde a tecnologia tomou conta nada melhor do que a criação de um aplicativo para conscientizar as pessoas foi com esse pensamento que desenvolvemos esse sistema onde os dados do nosso meio ambiente estejam em apenas um lugar 2 Contexto A educação ambiental é um componente essencial e permanente da educação nacional devendo estar presente de forma articulada em todos os níveis e modalidades do processo educativo em caráter formal e nãoformal O desafio que se coloca é de formular uma educação ambiental que seja crítica dessa forma Assim ela deve ser acima de tudo um ato político voltado para a transformação social desenvolver nas pessoas a consciência dos problemas ambientais e estimulálas a tentar buscar soluções para estes problemas que estão relacionados à interação homemambiente tendo como referência que os recursos naturais se esgotam e que o principal responsável pela sua degradação é o ser humano Hoje no Brasil como forma de uma melhor educação ambiental nosso sistema acabou sendo dividido em programas leis onde cada uma visa o melhor caminho de uma educação ambiental regrada como mostrado anteriormente temos que realizar uma mudança radical dentro de nosso sistema e com esses programas devemos assim pesquisar mais sobre ir em busca de dados e observar o mundo ao nosso redor mesmo que os programas já estão nos mostrando a forma mais adequada de se viver temos que colocar em pratica dentre nossos programas a Política Nacional do Meio Ambiente que tem por objetivo a preservação melhoria e recuperação da qualidade ambiental propícia à vida visando sempre aos interesses da segurança nacional e à proteção da dignidade da vida humana Temos vários programas e leis relacionadas a educação ambiental porém todos tem um objetivo em comum desenvolver o cuidado com a natureza nas pessoas e conscientizálas de atitudes que as mesmas fazem que causa diversos problemas ambientais tendo sempre em vista achar uma solução para esses problemas visando uma interação homemambiente adequada Mas aí que fica nossa dúvida estamos cuidando do nosso meio ambiente da forma correta Já chegaram a checar os dados científicos sobre a qualidade de nosso ambiente Pensaram em como será nosso meio ambiente daqui alguns anos Será que saberemos cuidar melhor daquilo que está em nossa volta Temos como nos beneficiar sem estragar nosso meio ambiente Iremos tirar todas essas d ú vidas com a criação de nosso aplicativo separaremos os dados que filtramos a fim de mostrar o que nossas ações causam ao meio ambiente 3 Problemas Uma das principais práticas do ser humano contra o meio ambiente são as queimadas em alguns casos ela ocorre de forma natural em outros causadas pelo ser humano por se tratar de um método de baixo custo e que pode ser executado em pouco tempo o que faz com que seja amplamente utilizado a fumaça liberada ocasiona uma série de malefícios à saúde humana e principalmente ao meio ambiente afetando diretamente o seu equilíbrio natural Essa prática das queimadas é comum na Amazônia para a abertura de áreas de pastagem e instalação de cultivos agrícolas por se tratar de um ato contra a natureza é necessárias certas autorizações visando que aquilo ser para fins de produção agropastoris ou de pesquisa cientifica e tecnológica A autorização é fornecida pelo Sistema Nacional do Meio Ambiente SISNAMA De acordo com a Empresa Brasileira de Pesquisa Agropecuária Embrapa quando descontroladas as queimadas passam a ser caracterizadas como incêndios Fatores que ocasionam essas queimadas aumentarem como o avanço do desmatamento e a ampliação das áreas de pastagem e atividades econômicas ligadas à agropecuária Outro fator que acaba influenciando na propagação de incêndios pelo território brasileiro é o tempo seco e quente vivenciado em grande parte do país As queimadas são divididas em dois tipos as queimadas humanas que são causadas de maneira direta ou indireta pelos seres humanos Elas podem ser criminosas quando há intensão de destruirse uma área ou acidentais E as queimadas naturais que são promovidas por ações da própria natureza como as descargas elétricas ou o vulcanismo por meio das lavas do vulcão em erupção que iniciam um incêndio moderado ou extenso Causas das queimadas Temos diversas causas das queimadas nas áreas rurais as principais causadas pelo homem são Queimadas para retirada da cobertura vegetal de uma determinada área ou também para fertilização do solo de renovação e de limpeza Fumantes incêndios originados por pessoas que fumam e descartam as bitucas de cigarro de forma incorreta Fogos campestres provocados por pessoas que acampam ou estão no campo desenvolvendo alguma atividade e fazem uma fogueira que pode alastrarse Nas áreas urbanas são Queda de balões Acidentes vandalismo entre outras As queimadas têm muitas consequências ruins como o aquecimento global problemas de saúde e perda de biodiversidade essas são algumas das diversas consequências que elas nos trazem As instituições governamentais responsáveis pelo monitoramento e controle de queimadas no país são o Instituto Nacional de Pesquisas Espaciais Inpe e o Ministério do Meio Ambiente Diversos planos devem ser desenvolvidos pelo ministério na tentativa de combate aos focos de incêndios e grandes queimadas no território brasileiro Podem ser desenvolvidas diversas ações para o combate a essa prática entre as mais comuns e eficazes temos a informação pode parecer algo simples porém investimentos nessa área da comunicação em massa são realizados para educar as pessoas a não realizarem essas práticas essas campanhas podem ser realizadas em escolas mídias sociais entre outros 4Objetivo O objetivo do nosso trabalho é através da nossa aplicação conseguir demonstrar os métodos de ordenação escolhidos suas aplicações suas vantagens e desvantagens em relação as demais também explicaremos sobre a técnica escolhida que no caso foi a FIFO e mostraremos suas vantagens e como implementála em uma aplicação Além de explorar as técnicas também iremos implementelas dentro do contexto do meio ambiente fazendo com que nossa aplicação possa ser utilizada dentro de projetos com o intuito de ajudar na preservação do meio ambiente 5Motivação A nossa motivação veio após a realização da nossa pesquisa sobre as queimadas e pensamos em criar um sistema que possa nos mostrar os períodos com mais casos de queimadas seja de uma cidade estado ou país basta o usuário inserir os dados juntamente com a data que ocorreu esses casos podendo ordenar entre as datas com mais casos e com menos casos facilitando a análise e focando nos períodos de maiores casos para poder focar nesse período e evitar o aumento de casos no mesmo período 6Algoritmos de Estrutura de Dados FIFO e LIFO O que é o FIFO e LIFO Os temos FIFO e LIFO em ciência da computação representam algoritmos de estrutura de dados e sua base principal é focada em pilhas e filas dados são processados de maneira escalonável Fila A Fila ou Queue como também é conhecida é uma estrutura de dados que implementa o conceito de FIFO Primeiro a entrar Primeiro a sair isso significa que ao realizar a implantação dos dados o primeiro elemento a entrar é o primeiro a sair Por exemplo uma fila de supermercado onde o primeiro a entrar na fila é o primeiro a ser atendido Nesta estrutura temos dois métodos principais um para inserir um item na fila e outro para ler e remover o primeiro elemento 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Queue thislista new Array thisInserir functionobj thislista thislistalength obj thisRemoverPrimeiro function if thislistalength 0 var obj thislista 0 thislista splice 01 return obj else alert Não há objetos na fila thisLerPrimeiro function if thislistalength 0 return thislista 0 else alert Não há objetos na fila Inserir obj adiciona um item na lista RemoverPrimeiro retorna o valor do primeiro elemento da fila o de índice zero e o excluí LerPrimeiro apenas retorna o valor do primeiro elemento da lista Pilha A Pilha implementa o conceito de FILO onde o Último a entrar Primeiro a sair imaginamos que você esteja organizando vários livros Inicialmente você organiza todos uns sobre os outros formando uma pilha Logo após você irá retirar um a um para organizar no seu devido local Observe que o primeiro livro removido foi o último a ser inserido na pilha aquele que ficou na parte superior Enquanto isso o primeiro livro inserido na pilha aq uele que está abaixo de todos será o último removido Esse método é bastante utilizado na informática como por exemplo durante a execução de um programa para o armazenamento de valores de variável local a um bloco e para conter o endereço de retorno do trecho de programa que chamou a função ou procedimento atualmente em execução 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Stack thislista new Array thisInserir functionobj thislista thislistalength obj thisRemoverUltimo function if thislistalength 0 var obj thislista thislistalength 1 thislista splice thislistalength 11 return obj else alert Não há objetos na pilha thisLerUltimo function if thislistalength 0 return thislista thislistalength 1 else alert Não há objetos na pilha Inserir obj adiciona o elemento recebido como parâmetro no final da lista RemoverUltimo retorna o valor do último elemento inserido e o remove da lista LerUltimo retorna o valor do último elemento inserido o do topo da pilha auxiliar Stack vs Queue Em estrutura de dados pilha e fila são dois tipos de dados abstratos simples que usam ponteiros para representar conjuntos dinâmicos No entanto uma diferença pode ser notada entre eles com base em suas implementações Operações básicas de inserção e exclusão de elementos são suportadas pela pilha e pela fila A principal diferença entre Stack e Queue é que uma pilha implementa política LIFO enquanto um fila implementa a política FIFO Filas e Pilhas compartilham duas características comuns ambas têm regras muito rigorosas para acessar os dados armazenados nelas e as operações de recuperação são por natureza destrutivas Queue A classe Queue se localiza em naespace SystemCollections e implementa o conceito FIFO Uma funcionalidade importante dessa classe é o Count que retorna à quantidade de elementos atualmente existente na lista Temos também os metodos Enqueue e o Dequeue como veremos abaixo Enqueue recebe como parâmetro um objeto a ser inserido na lista nesse caso no final da fila Dequeue retorna o primeiro objeto da fila aquele que pela ordem é o próximo a ser removido Após a chamada desse método o objeto retornado é também removido da fila Peek retorna o primeiro objeto da lista mas não o remove Pode ser usado quando se deseja apenas conhecer o valor do primeiro elemento TrimToSize altera a capacidade da lista para a quantidade atual de elementos Com isso memória é poupada pois a classe Queue reserva memória para armazenar uma quantidade de elementos se nem todos forem usados parte da memória reservada fica sem uso Construtor a classe Queue possui três sobrecargas do construtor original A primeira delas recebe um valor inteiro que define capacidade inicial da lista A segunda recebe uma coleção Collection da qual os itens são copiados para a lista A terceira recebe um valor inteiro para a capacidade inicial e um fator de expansão do tipo float Esse fator de expansão é utilizado para aumentar a capacidade da fila quando for necessário Originalmente esse valor é pequeno para que não seja utilizada memória desnecessariamente O ideal é conhecer previamente o número de elementos a ser inserido da lista é interessante definir a capacidade inicial no constructor evitando que memória extra seja reservada Caso a quantidade de itens ultrapasse a capacidade inicialmente definida esta é automaticamente expandida Stack Também contida no namespace SytemCollections a classe Stack implementa o conceito de LIFO onde o último elemento inserido é o primeiro a ser removido Os métodos que merecem destaque são Count retorna à quantidade de elementos contidos na lista Push insere um objeto recebido como parâmetro no fim da lista Pop retorna e remove o elemento do topo da pilha ou seja o último que foi inserido Peek apenas retorna o elemento do topo da pilha Construtor além do construtor original existem duas sobrecargas A primeira recebe uma coleção do tipo Collection da qual os itens são copiados para a pilha A segunda recebe um valor inteiro que define a capacidade inicial da lista Métodos em comum As duas classes possuem métodos em comum que vale a pena citar aqui Clear remove todos os itens da lista não sendo possível recuperálos Contains recebe como parâmetro um objeto a ser localizado na lista Caso esse objeto esteja contido na fila o retorno desse método é true caso contrário o retorno é false Conclusão A pilha e a fila são usadas com a finalidade de manter listas ordenadas de elementos Enquanto uma pilha é uma estrutura de dados LIFO uma fila implementa uma abordagem FIFO Apenas uma extremidade de uma pilha é acessível para operações principais mas ambas as extremidades de uma fila podem ser usadas São muitas as aplicações dos modelos FIFO e LIFO existe várias ferramentas que podem facilitar bastante o trabalho com estruturas desse tipo oferecendo duas classes eficientes e de fácil manipulação e classes que em geral são comuns às classes que representam coleções nesse namespace As vantagens dos algoritmos de ordenação Ordenar um conjunto de itens em uma lista é uma tarefa frequente na programação Muitas vezes um ser humano pode realizar essa tarefa intuitivamente No entanto um programa de computador precisa seguir uma sequência exata de instruções para completála e essa sequência é chamada algoritmo Um algoritmo de ordenação é um método utilizado para colocar uma lista de itens desorganizados em uma determinada ordem A sequência da ordenação é determinada por uma chave Existem vários algoritmos de ordenação que diferem em termos de eficiência e desempenho Alguns conhecidos e importantes desse tipo incluem Bubble sort QuickSort BinaryInsertionSort SelectionSort Collections HeapSort Para o desenvolvimento dos programas foram utilizados os métodos API de Collections e o Bubble sort Collections O que é exatamente as Collections Pense nelas como classes que ajudam você a manipular variedades de objetos A API de Collections traz a interface javautil List que específica o que uma classe deve ser capaz de fazer para ser uma lista Há diversas implementações disponíveis cada uma com uma forma diferente de representar uma lista A implementação mais utilizada da interface List é a ArrayList que trabalha com um array interno para gerar uma lista ArrayList é mais rápida na pesquisa do que sua concorrente O que ocorre é que internamente ela usa um array como estrutura para armazenar os dados Porém este atributo está propriamente encapsulado e você não tem como acessálo Repare também que você não pode usar com uma ArrayList nem acessar atributo length A classe Collections traz um método estático sort que recebe um List como argumento e o ordena por ordem crescente Por exemplo List lista new ArrayList listaadd Sérgio listaadd Paulo listaadd Guilherme Systemoutprintln lista Collectionssort lista Systemoutprintln lista O método collectionsort classifica os itens na coleção de origem e também retorna uma referência a esta coleção classificada Este método retorna uma cópia superficial o que significa que os objetos ou coleções em ambas as coleções compartilham a mesma referência este método modifica a coleção original Se collectionsort for chamado sem parâmetros apenas valores escalares número texto data booleanos são classificados Os itens são classificados por padrão em ordem crescente de acordo com seu tipo Se você deseja classificar os elementos da coleção em outra ordem ou classificar qualquer tipo de elemento você deve oferecer no nomMet um método de comparação que compare dois valores e retorne verdadeiro em 1 resultado se o primeiro valor for menor que o segundo valor Você pode oferecer parâmetros adicionais ao nomMet se necessário Bubble sort A principal vantagem desse algoritmo é que sua implementação é fácil e conhecida Além disso no bubble sort os elementos são trocados de lugar sem utilizar armazenamento temporário o que faz o requerimento de espaço ser mínimo A principal desvantagem é o fato de que não apresenta bons resultados quando a lista contém muitos itens Isso porque esse tipo de ordenação exige n² passos de processamento para cada número n de elementos que serão ordenados Bubble Sort é um algoritmo de ordenação que pode ser aplicado em Arrays e Listas dinâmicas Realizando trocas repetidamente de elementos adjacentes que não estão em ordem até que toda lista de itens esteja em sequência Dessa maneira os itens flutuam na lista conforme os seus valores se o objetivo ordenar os valores em forma decrescente então a posição atual é comparada com a próxima posição e se a posição atual for maior que a posição posterior é realizada a troca dos valores nessa posição Caso contrário não é realizada a troca apenas passase para o próximo par de comparações Se o objetivo é ordenar os valores em forma crescente então a posição atual é comparada com a próxima posição e se a posição atual for menor que a posição posterior é realizada a troca Caso contrário a troca não é feita e passase para o próximo par de comparação Um array ou lista pode estar já ordenado quando se solicita a ordenação dessa forma esta situação tem de ser considerada na implementação do algoritmo Assim demonstrarei a representação gráfica e o teste de mesa das duas situações usando array Selection sort O selection sort vasculha repetidamente a lista de itens selecionando um elemento de cada vez e colocandoo na posição correta da sequência A principal vantagem do selection sort é que ela funciona bem em uma lista de diversos tamanhos Além disso por ser um algoritmo de ordenação de local não precisa de armazenamento temporário além do necessário para guardar a lista original A principal desvantagem é sua baixa eficiência em listas grandes Assim como o bubble sort ele exige n² números de passos para cada n elementos Adicionalmente o seu desempenho é facilmente influenciado pela ordem inicial dos itens antes do processo de triagem Devido a isso esse tipo seleção é adequado apenas para uma lista em que poucos elementos estejam em ordem aleatória Insertion sort O insertion sort varre a lista repetidamente e a cada vez insere um item da sequência desordenada na posição correta A principal vantagem da ordenação por inserção é a sua simplicidade além de mostrar um bom desempenho em listas variáveis É um algoritmo de ordenação de local logo o requerimento de espaço é mínimo A desvantagem é que não possui um desempenho tão bom quanto outros algoritmos de ordenação Com n² passos necessários para funcionar o insertion sort também não funciona bem com listas grandes No entanto é particularmente útil com listas de poucos itens Quick sort O quick sort trabalha com o princípio da divisãoeconquista Primeiramente ela divide a lista de itens em duas sublistas com base em um elemento pivô Todos os elementos na primeira sublista são dispostos de maneira que sejam menores do que o pivô enquanto todos os elementos na segunda sublista são dispostos para serem maiores que o pivô O mesmo processo de particionamento e organização é executado repetidamente nas sublistas resultantes até que toda a lista seja organizada O quick sort é considerado por alguns o melhor algoritmo de ordenação por causa da sua vantagem significante em termos de eficiência uma vez que funciona bem com uma lista grande de itens Por ordenar no próprio local também não há necessidade de espaço adicional de armazenamento A leve desvantagem que ela apresenta é que seu pior desempenho é similar à média de desempenho dos outros algoritmos descritos acima Entretanto é importante notar que esse pior caso é muito raro De um modo mais geral o quick sort produz o método de organização mais eficiente e amplamente utilizado para organizar uma lista de qualquer tamanho 7 Trabalhos relacionados São notáveis alguns dos sistemas que tem o uso da pol í tica LIFO como ideal composições que trabalham com um grande volume de entrada de dados eou a necessidade de constante resgate de informações na sua base de dados no geral são bem propensos a serem melhor otimizados utilizandoa Faz total sentido aplicar a política de LIFO em aplicações que tem como objetivo de ser informativos por exemplo onde é crucial o resgate e a projeção de dados mais recentes de uma forma rápida Alguns exemplos de aplicações que fazem uso de forma eficiente Páginas de jornais em que as notícias mais recentes serão apresentadas primeiro e as mais antigas por último Notificações de redes sociais em que as notificações mais recentes estarão no topo deixando as mais antigas para baixo O feed das redes sociais em que as publicações mais recentes serão mostradas primeiro e de acordo que desce a tela aparecerá as mais antigas A prática da política do FIFO é muito utilizada em áreas de markenting de vendas de logísticas para possuir o controle de seus clientes e de seus pedidos através das filas que quem comprou ou chegou primeiro terá preferência e por isso sairá primeiro dessa lógica que vem a expressão da prática Firstin Firstout Essa foi a prática escolhida em nosso sistema pois os dados que estão em primeiro na lista serão retirados e os novos irão por último na lista Esse é um aplicativo do banco Caixa que para seu acesso necessita que algum funcionário esteja livre para ser atendido fazendo com que crie uma fila dentro do aplicativo para conseguir administrar quem foi o primeiro a chegar para ser o quanto antes atendido 4 Desenvolvimento do aplicativo A técnica escolhida como já foi mencionada foi o First in First out ou seja o FIFO Esse método possibilita que nossa aplicação possa inserir os dados mais recentes por último e no processo de exclusão os dados mais antigos possam ser excluídos Essa técnica se encaixa bem no nosso projeto pois o nosso objetivo era fazer uma aplicação que o usuário possa visualizar casos ocorridos em datas diferentes períodos diferentes para que possa avaliar quais épocas tiveram mais casos e menos casos de desmatamento que era nosso foco ou seja se ao fazer a ordenação dos dados decrescentemente ele perceber que os 10 primeiros dados possuem uma correlação entre as datas ele pode avaliar com sua equipe métodos de como evitar as queimad as naquele período do ano para que assim futuramente esses casos diminuam geração eou obtenção de dados para ordenação A função utilizada para obter os dados foi a seguinte public String salvar try FileWriter fw new FileWriter CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt true PrintWriter pw new PrintWriter fw pw println this numeros this data pw flush pw close fw close catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage return Adicionado com sucesso Nessa função foi utilizado o FileWriter para que o sistema consiga procurar o arquivo com nome entradatxt com a finalidade de escrever dentro dele porém ainda sem conseguir escrever nele e com o true para que os dados antigos sejam ma n tidos e os novos adicionados por último no arquivo como uma fila com o PrintWriter é possível imprimir os dados dentro do arquivo como se estivesse colando algo em um papel para buscar as informações utilizamos o String números e o String data que possuirão valor quando o usuário preencher o JTextField que está em outra classe e tem a seguinte codificação textoData new JFormattedTextField new MaskFormatter textoData setActionCommand textoData setBounds 198 40 66 19 contentPane add textoData textoDados new JTextField textoDados setBounds 198 77 66 19 contentPane add textoDados textoDados setColumns 2 Essa foi a configuração feita para o design do JTextField que é o container que possibilita que o usuário digite os valores que ele deseja JButton btnAdicionar new JButton Adicionar btnAdicionar addActionListener new ActionListener public void actionPerformed ActionEvent e Dados info new Dados info setNumeros textoDados getText info setData textoData getText JOptionPane showMessageDialog null info salvar textoDados setText btnAdicionar setBounds 10 127 118 21 contentPane add btnAdicionar Nessa parte do código adicionamos um botão para que quando o usuário termine de colocar os dados ele aperte o botão e assim acione as funções ActionListener ActionPerformed ActionEvent ou seja as funções de acionar o botão e ao acionar botão qual função ele deve fazer que foi configurada da seguinte maneira Adicionamos um objeto para a outra classe para que assim consigamos pegar os objetos dentro da função salvar Com isso agora o envio dos dados preenchidos pelo usuário será feita através do setNumeros setData com o texto DadosgetText textoDatagetText para pegar os dados dos JtextField e enviar para os atributos da outra classe denominados como números e data e logo na próxima linha temos o JOptionPane para acionar a função salvar dentro da outra classe E por fim temos o setBounds para definir o tamanho do botão e o contentPane para adicionar o botão no JPane processo de ordenação de dados No sistema utilizamos dois tipos de Ordenação Collectio n O primeiro é para ordenar os dados em ordem crescente para isso o Collectionsort nos serviu muito bem pois ele pega os dados e ele mesmo já realiza a ordenação na ordem crescente o que devese fazer é a leitura dos dados para entregar todos os dados dentro dessa implementação para que ele ordene e depois escrevelo de novo no arquivo de forma ordenada btnNewButton new JButton Crescente btnNewButton setFont new Font Tahoma Font PLAIN 9 btnNewButton addActionListener new ActionListener public void actionPerformed ActionEvent e try String str ArrayList String nomes new ArrayList String BufferedReader in new BufferedReader new FileReader CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt while str in readLine null nomes add str in close Collections sort nomes BufferedWriter out new BufferedWriter new FileWriter CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt for int i 0 i nomes size i out write nomes get i out newLine out close catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage btnNewButton setBounds 165 211 85 21 contentPane add btnNewButton Para fazer que o Collection funcione criamos um ArrayList um a String vazia e o leitor BufferedReader para fazer a leitura do arquivo Para que essa leitura se transforme em algo sólido para o sistema reconhecer pegamos a String vazia que criamos e adicionamos cada linha do arquivo dentro dela Com a String com todos os dados do arquivo adicionamos essa String dentro do ArrayList pois essa é a forma que o Collection ordena seus dados com uma lista como base e então adicionamos essa lista dentro do Collectionsort Com os dados já ordenados criamos o método de escrever no arquivo com o BufferedWriter e para que cada dado esteja em uma linha escrevemos o for para que a escrita seja uma em cada linha Bubblesort O segundo métod o utilizado queríamos um que ordenasse em ordem decrescente para isso utilizamos o Bubblesort E sse método é muito simples e ele faz uma flutuação pelos dados deixando os maiores em cima da lista ou seja na ordem decrescente Para esse método funcionar devemos criar a função Bubbleso rt private static void bubbleSort String arr int length arr length for int i 0 i length 1 i for int j 0 j length i 1 j if arr j compareTo arr j 1 0 String temp arr j arr j arr j 1 arr j 1 temp Nessa função passamos a String arr como método e colocamos como que a função vai tratar os dadosainda não possui nenhum dado pois ainda vai ser passado em que o for servirá para fazer a checagem de cada linha do futuro arraylist e o if servirá para fazer a comparação de cada linha e definir se passará na ordem crescente ou decrescente nesse cas o como colocamos que será 0 o método entende que o dado maior terá preferência e ficará primeiro As linhas seguintes foram para anexar os dados ordenados dentro da String temp para que eles não ficassem perdidos JButton btnDecrescente new JButton Decrescente btnDecrescente addActionListener new ActionListener public void actionPerformed ActionEvent e try String str ArrayList String nomes new ArrayList String BufferedReader in new BufferedReader new FileReader CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt while str in readLine null nomes add str in close String arrayNames nomes toArray String new bubbleSort arrayNames Files write Paths get CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt Arrays asList arrayNames catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage btnDecrescente setFont new Font Tahoma Font PLAIN 9 btnDecrescente setBounds 165 247 85 21 contentPane add btnDecrescente Agora seguimos a mesma lógica da parte crescente do sistema Criando um botão um ArrayList o leitor do arquivo porém com um adicional criamos um array para adicionar esse ArrayList que servirá como base de Array para a função mostrada antes Bubblesort em que os dados daquela função agora terão os dados d o arquivo Processo de Exclusão de dados Quando se trabalha com arquivotxt não é possível excluir uma linha ou um dado de sua lista Nesses casos de remoção é necessário a utilização de leitura do arquivo porém pulando a primeira linha do arquivo ou seja quando você abrir seu arquivo de novo a escrita começará a partir da segunda linha do seu arquivo e terá que criar um outro arquivo par a escrever nele os dados Para isso fizemos o seguinte processo JButton btnRemover new JButton Remover btnRemover addActionListener new ActionListener public void actionPerformed ActionEvent e try Path path Paths get CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt ListString lines Files readAllLines path stream skip1collectCollectors toList Files write path lines catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage Como todos os outros processos criamos um botão porém no processo de leitura utilizamos o path pois ele possui um recurso muito importante chamado skip que podemos escrever quantas linhas desejamos pular na hora da leitura com isso a leitura feita a partir da segunda linha será armazenada dentro da lista lines e logo depois será implementada no caminho do arquivo definido dentro do path Processo de visualização de arquivo No sistema é possível visualizar os dados que o arquivo possui para isso foi feito o seguinte processo JButton abrirArquivo new JButton abrir abrirArquivo addActionListener new ActionListener public void actionPerformed ActionEvent e try FileReader in new FileReader CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt String s int i in read do s s char i i in read while i 1 textArea setText s in close catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage Como todo processo temos o botão para realizar a ação e dentro dele o método de leitura do arquivo que no caso é o FileReader Após a leitura do arquivo criei uma String s que está vazia pois ela ficará responsável por escrever dentro do J textArea que o arquivo tem reservado para a visualização do arquivo porém como o FileReader consegue apenas transformar os dados em números criei uma variável int i para conseguir armazenar esses dados e fazer a leitura de cada linha de dado que esta dentro do FileReader para fazer essa segunda leitura utilizei o método do while que enquanto o int i for diferente de 1 ou seja até o final do arquivo o String s que estava vazia irá receber o i porém transformei ele em char para que ele seja reconhecido como String dentro da String s e essa transformação conseguirá escrever dentro d o textArea todos os dados lidos no arquivo podendo assim visualizar dentro do sistema cada linha do arquivo Pseudocódigo 9 Experimentos e Análise dos Resultado s Está é a Interface Gráfica do nosso sistema como podese ver temos dois métodos de entrada de dados o campo de data e de dados Para a manipulação de dados nós temos 3 tipos Adição de dados para adicionar os dados Visualização de dados para observar os dados Remoção de dados para remover sempre o primeiro arquivo Para a ordenação de dados nós temos 2 tipos Crescente em que o método é o Collectionsort Decrescente em que o método é o BubbleSort E por fim temos o tempo de resposta que serve para analisarmos o tempo de processamento dos algoritmos de ordenação para podermos fazer comparação e analisar o melhor método Banco de dados ordenados decrescentemente Banco de dados ordenados crescentemente Realizamos os testes dentro do nosso sistema fizemos 10 comparações com 10 quantidades diferentes começando por 15 dados e terminando com 100 dados Observação O tempo de diferença foi calculado em nanosegundo Após realizar os testes e analisar os resultados podemos ver que em ambos os algoritmos temos uma rápida resposta e em nenhum dos testes passamos de 10 nanosegundos isso mostra a eficiência e a rapidez dos algoritmos selecionados Para a comparação entre os algoritmos percebese uma leve vantagem do Collectionsort não passando de 6 nanosegundos e mantendo uma base boa de 1 nanosegundo em vários testes O BubbleSort também demonstrou ter uma rapidez e eficiência muito boa as vezes demorando um pouco mais como no primeiro teste que demorou 9 nanosegundos mas sempre mantendo seu tempo baixo A média do Collectionsort foi de 26 nanosegundos enquanto a do BubbleSort foi de 29 nanosegundos A primeira vantagem de um algoritmo para o outro é sua forma de criação no Collectionsort o próprio Java já tem sua implementação ou seja a única preocupação do programador é inserir os dados para que o algoritmo faça a junção dos dados por isso o nome Collection faz a coleção dos dados e logo após através de uma simples função de comparação de dados definimos se os dados serão colocados em ordem decrescente ou crescente Isso se difere do BubbleSort que não possui essa implementação dentro do Java e o programador precisará fazer esse agrupamento através de um método nessa aplicação colocamos os dados dentro de um a Array para que ele possa ser lido e ordenado tanto crescente quanto decrescente Feita as comparações analisado os resultados temse que os métodos de ordenação são bem simples porém dentro do nosso sistema não nos trouxe problemas ou erros de ordenação entregando os resultados que queríamos dentro da proposta que definimos que os dados seriam ordenados tanto do maior para o menor quanto do menor para o maior 10 Considerações Finais As considerações finais devem respondem às seguintes questões O problema apresentado na Introdução foi resolvido Resposta Sim A aplicação conseguiu abordar a proposta de forma que os dados coletados sejam apresentados de forma simples e prática auxiliando a conscientização e combate do problema apresentado com ênfase nas queimadas Os objetivos do trabalho foi ram alcançados Resposta Sim A aplicação foi projetada dentro do modelo de linguagem Orientado a Objetos e contém interface gráfica que apresenta todas as funcionalidades solicitadas Create Read Update e Delete incluindo novos dados no fim do arquivo e respeitando a política de FIFO oferecendo 2 tipos de opções de classificação de dados e a possibilidade de pesquisa deles Os resultados obtidos indicam que a solução é viável Resposta Sim A forma prática e abrangente de visualização de dados do aplicativo quando pronto reafirma o quão a informação pode ser transmitida de uma forma eficiente e transparente e da mesma forma como definimos como um objetivo essa contextualização se faz bem impactante no processo dessa conscientização e reeducação ambiental Comente a experiência de aprendizagem nos conteúdo específicos das políticas de acesso aos dados bem como a conclusão sobre o melhor algoritmo de classificação de dados baseado nos resultados o btidos ou nas pesquisa bibliográfica Resposta Adicionalmente uma reflexão sobre a relevância da Gestão de Dados no cenário pesquisado e como estes dados podem ajudar na gestão monitoramento e controle dos recursos do meioambiente Resposta Na verdade essa gestão de dados já é bem frequente no que vem sendo o combate a degradação do meio ambiente e muitas causas ativistas se manifestaram nos dias atuais percebemos que além da importância desses dados para a gestão dos problemas em si que atingem nossos recursos essa visibilidade é crucial na tomada de várias decisões para resolvelos além da disseminação dessa informação o que acaba gerando mais colaboração e força nessa importante causa podemos usar como exemplo essas instituições que fazem uso desse recurso de gestão de dados 11 Bibliografia httpswwww3schoolscomjqueryeffqueueasp httpwwwfaccampbrosvaldoEstruturasDadospdf httpsptwikipediaorgwikiLIFOtextEm20ciência20da20computação2C20LIFOde20dados20do20tipo20pilhatextEla20possui20apenas20uma20entradadados20entram20e20saem20dela httpsptscribdcomdoc92882061LIFOefifo httpswwwtreinawebcombrblogoqueeecomofuncionaaestruturadedadoslista httpsdigitalinnovationoneartigosestruturadedadospilhasfilaselistas 12 Ficha de Atividades
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
41
Eficiência e Complexidade Computacional: Conceitos e Exemplos
Estrutura de Dados
UFS
4
Atividade Lab1b: Implementação do TAD Fila Estática
Estrutura de Dados
MACKENZIE
4
Apresentação sobre Bancos de Dados NoSQL
Estrutura de Dados
UVA
35
Remoção de Nós em Árvores AVL
Estrutura de Dados
UNIT
11
Apostila-algoritmos-unicamp
Estrutura de Dados
UFBA
1
Pacote Comandos de Aula Poo
Estrutura de Dados
UEPB
1
Labirinto: Jogo de Texto em Python
Estrutura de Dados
UEPB
3
Lista de Exercícios 2 - Algoritmo e Estrutura de Dados 1
Estrutura de Dados
UFG
2
Prova 2-2022 1
Estrutura de Dados
UFSC
8
Database Security Threats and Prevention
Estrutura de Dados
UVA
Texto de pré-visualização
APS DESENVOLVIMENTO DE SISTEMA PARA MANIPULAÇÃO DE DADOS EM ARQUIVOS STRINGS E ESTRUTURAS DINÂMICAS E NÃOHOMOGÊNEAS Ciências da Computação Daniel Silva Reis F27JHC8 Marcu s Paulo Custodia N6489F0 Leonardo Alves Francisco N6200H0 Luiz Fernando Lopes dos Santos N668FC1 Fellipe Almeida Barbosa F32C I H9 São Paulo 5 Semestre de 202 2 Organização do Relatório da APS 1 Introdução Resumo geral do trabalho 2 Contexto Contextualiza o meio ambiente e seus problemas atuais de modo geral 3 Problemas Apresenta os problemas específicos sobre as queimadas tanto no Brasil quanto no mundo 4 Objetivo Explicar o escopo do nosso trabalho 5 Motivação Ilustrar a razão pela qual criamos o sistema e sua funcionalidade 6 Algoritmo de Estrutura de Dados Apresentação dos dois tipos de algoritmos os métodos de ordenação de dados e suas funcionalidades 7 Trabalhos relacionados Apresentação de sistemas conhecidos que funcionam com base nos algoritmos mostrados no tópico anterior 8 Desenvolvimento do aplicativo Explicação de como foi a criação do aplicativo apresentação de suas funcionalidades e sua codificação 9 Experimento e Análise dos resultados Apresentação dos testes e análise dos resultados gerados desses testes podendo assim criar uma comparação entre os métodos de ordenação 10 Considerações finais Analisando o trabalho de uma forma geral avaliando os aspectos predefinidos pela APS e por fim concluir o trabalho avaliando todos os tópicos descritos acima 11 Bibliografia Site que foram utilizados para buscar referências mais aprofundadas sobre os temas abordados 12 Ficha de Atividades Fichas de atividades de todos do grupo 1 Introdução O objetivo de nosso trabalho é falar sobre a educação ambiental principalmente sobre as queimadas no Brasil e desenvolver um a aplica ção onde os dados relacionados a falta ou a contribuição ao ambiente aparece de forma simples e organizada nosso aplicativo tem como principal objetivo desenvolver nas pessoas a consciência dos problemas ambientais em forma de dados e estimulálas a tentar buscar soluções para estes problemas que estão relacionados à interação homemambiente Esse tipo de educação busca constantemente a mudança de atitudes do homem onde esse deve ter plena consciência que é parte integrante do meio agindo de forma racional contribuindo para a preservação do Meio Ambiente Atualmente onde a tecnologia tomou conta nada melhor do que a criação de um aplicativo para conscientizar as pessoas foi com esse pensamento que desenvolvemos esse sistema onde os dados do nosso meio ambiente estejam em apenas um lugar 2 Contexto A educação ambiental é um componente essencial e permanente da educação nacional devendo estar presente de forma articulada em todos os níveis e modalidades do processo educativo em caráter formal e nãoformal O desafio que se coloca é de formular uma educação ambiental que seja crítica dessa forma Assim ela deve ser acima de tudo um ato político voltado para a transformação social desenvolver nas pessoas a consciência dos problemas ambientais e estimulálas a tentar buscar soluções para estes problemas que estão relacionados à interação homemambiente tendo como referência que os recursos naturais se esgotam e que o principal responsável pela sua degradação é o ser humano Hoje no Brasil como forma de uma melhor educação ambiental nosso sistema acabou sendo dividido em programas leis onde cada uma visa o melhor caminho de uma educação ambiental regrada como mostrado anteriormente temos que realizar uma mudança radical dentro de nosso sistema e com esses programas devemos assim pesquisar mais sobre ir em busca de dados e observar o mundo ao nosso redor mesmo que os programas já estão nos mostrando a forma mais adequada de se viver temos que colocar em pratica dentre nossos programas a Política Nacional do Meio Ambiente que tem por objetivo a preservação melhoria e recuperação da qualidade ambiental propícia à vida visando sempre aos interesses da segurança nacional e à proteção da dignidade da vida humana Temos vários programas e leis relacionadas a educação ambiental porém todos tem um objetivo em comum desenvolver o cuidado com a natureza nas pessoas e conscientizálas de atitudes que as mesmas fazem que causa diversos problemas ambientais tendo sempre em vista achar uma solução para esses problemas visando uma interação homemambiente adequada Mas aí que fica nossa dúvida estamos cuidando do nosso meio ambiente da forma correta Já chegaram a checar os dados científicos sobre a qualidade de nosso ambiente Pensaram em como será nosso meio ambiente daqui alguns anos Será que saberemos cuidar melhor daquilo que está em nossa volta Temos como nos beneficiar sem estragar nosso meio ambiente Iremos tirar todas essas d ú vidas com a criação de nosso aplicativo separaremos os dados que filtramos a fim de mostrar o que nossas ações causam ao meio ambiente 3 Problemas Uma das principais práticas do ser humano contra o meio ambiente são as queimadas em alguns casos ela ocorre de forma natural em outros causadas pelo ser humano por se tratar de um método de baixo custo e que pode ser executado em pouco tempo o que faz com que seja amplamente utilizado a fumaça liberada ocasiona uma série de malefícios à saúde humana e principalmente ao meio ambiente afetando diretamente o seu equilíbrio natural Essa prática das queimadas é comum na Amazônia para a abertura de áreas de pastagem e instalação de cultivos agrícolas por se tratar de um ato contra a natureza é necessárias certas autorizações visando que aquilo ser para fins de produção agropastoris ou de pesquisa cientifica e tecnológica A autorização é fornecida pelo Sistema Nacional do Meio Ambiente SISNAMA De acordo com a Empresa Brasileira de Pesquisa Agropecuária Embrapa quando descontroladas as queimadas passam a ser caracterizadas como incêndios Fatores que ocasionam essas queimadas aumentarem como o avanço do desmatamento e a ampliação das áreas de pastagem e atividades econômicas ligadas à agropecuária Outro fator que acaba influenciando na propagação de incêndios pelo território brasileiro é o tempo seco e quente vivenciado em grande parte do país As queimadas são divididas em dois tipos as queimadas humanas que são causadas de maneira direta ou indireta pelos seres humanos Elas podem ser criminosas quando há intensão de destruirse uma área ou acidentais E as queimadas naturais que são promovidas por ações da própria natureza como as descargas elétricas ou o vulcanismo por meio das lavas do vulcão em erupção que iniciam um incêndio moderado ou extenso Causas das queimadas Temos diversas causas das queimadas nas áreas rurais as principais causadas pelo homem são Queimadas para retirada da cobertura vegetal de uma determinada área ou também para fertilização do solo de renovação e de limpeza Fumantes incêndios originados por pessoas que fumam e descartam as bitucas de cigarro de forma incorreta Fogos campestres provocados por pessoas que acampam ou estão no campo desenvolvendo alguma atividade e fazem uma fogueira que pode alastrarse Nas áreas urbanas são Queda de balões Acidentes vandalismo entre outras As queimadas têm muitas consequências ruins como o aquecimento global problemas de saúde e perda de biodiversidade essas são algumas das diversas consequências que elas nos trazem As instituições governamentais responsáveis pelo monitoramento e controle de queimadas no país são o Instituto Nacional de Pesquisas Espaciais Inpe e o Ministério do Meio Ambiente Diversos planos devem ser desenvolvidos pelo ministério na tentativa de combate aos focos de incêndios e grandes queimadas no território brasileiro Podem ser desenvolvidas diversas ações para o combate a essa prática entre as mais comuns e eficazes temos a informação pode parecer algo simples porém investimentos nessa área da comunicação em massa são realizados para educar as pessoas a não realizarem essas práticas essas campanhas podem ser realizadas em escolas mídias sociais entre outros 4Objetivo O objetivo do nosso trabalho é através da nossa aplicação conseguir demonstrar os métodos de ordenação escolhidos suas aplicações suas vantagens e desvantagens em relação as demais também explicaremos sobre a técnica escolhida que no caso foi a FIFO e mostraremos suas vantagens e como implementála em uma aplicação Além de explorar as técnicas também iremos implementelas dentro do contexto do meio ambiente fazendo com que nossa aplicação possa ser utilizada dentro de projetos com o intuito de ajudar na preservação do meio ambiente 5Motivação A nossa motivação veio após a realização da nossa pesquisa sobre as queimadas e pensamos em criar um sistema que possa nos mostrar os períodos com mais casos de queimadas seja de uma cidade estado ou país basta o usuário inserir os dados juntamente com a data que ocorreu esses casos podendo ordenar entre as datas com mais casos e com menos casos facilitando a análise e focando nos períodos de maiores casos para poder focar nesse período e evitar o aumento de casos no mesmo período 6Algoritmos de Estrutura de Dados FIFO e LIFO O que é o FIFO e LIFO Os temos FIFO e LIFO em ciência da computação representam algoritmos de estrutura de dados e sua base principal é focada em pilhas e filas dados são processados de maneira escalonável Fila A Fila ou Queue como também é conhecida é uma estrutura de dados que implementa o conceito de FIFO Primeiro a entrar Primeiro a sair isso significa que ao realizar a implantação dos dados o primeiro elemento a entrar é o primeiro a sair Por exemplo uma fila de supermercado onde o primeiro a entrar na fila é o primeiro a ser atendido Nesta estrutura temos dois métodos principais um para inserir um item na fila e outro para ler e remover o primeiro elemento 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Queue thislista new Array thisInserir functionobj thislista thislistalength obj thisRemoverPrimeiro function if thislistalength 0 var obj thislista 0 thislista splice 01 return obj else alert Não há objetos na fila thisLerPrimeiro function if thislistalength 0 return thislista 0 else alert Não há objetos na fila Inserir obj adiciona um item na lista RemoverPrimeiro retorna o valor do primeiro elemento da fila o de índice zero e o excluí LerPrimeiro apenas retorna o valor do primeiro elemento da lista Pilha A Pilha implementa o conceito de FILO onde o Último a entrar Primeiro a sair imaginamos que você esteja organizando vários livros Inicialmente você organiza todos uns sobre os outros formando uma pilha Logo após você irá retirar um a um para organizar no seu devido local Observe que o primeiro livro removido foi o último a ser inserido na pilha aquele que ficou na parte superior Enquanto isso o primeiro livro inserido na pilha aq uele que está abaixo de todos será o último removido Esse método é bastante utilizado na informática como por exemplo durante a execução de um programa para o armazenamento de valores de variável local a um bloco e para conter o endereço de retorno do trecho de programa que chamou a função ou procedimento atualmente em execução 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Stack thislista new Array thisInserir functionobj thislista thislistalength obj thisRemoverUltimo function if thislistalength 0 var obj thislista thislistalength 1 thislista splice thislistalength 11 return obj else alert Não há objetos na pilha thisLerUltimo function if thislistalength 0 return thislista thislistalength 1 else alert Não há objetos na pilha Inserir obj adiciona o elemento recebido como parâmetro no final da lista RemoverUltimo retorna o valor do último elemento inserido e o remove da lista LerUltimo retorna o valor do último elemento inserido o do topo da pilha auxiliar Stack vs Queue Em estrutura de dados pilha e fila são dois tipos de dados abstratos simples que usam ponteiros para representar conjuntos dinâmicos No entanto uma diferença pode ser notada entre eles com base em suas implementações Operações básicas de inserção e exclusão de elementos são suportadas pela pilha e pela fila A principal diferença entre Stack e Queue é que uma pilha implementa política LIFO enquanto um fila implementa a política FIFO Filas e Pilhas compartilham duas características comuns ambas têm regras muito rigorosas para acessar os dados armazenados nelas e as operações de recuperação são por natureza destrutivas Queue A classe Queue se localiza em naespace SystemCollections e implementa o conceito FIFO Uma funcionalidade importante dessa classe é o Count que retorna à quantidade de elementos atualmente existente na lista Temos também os metodos Enqueue e o Dequeue como veremos abaixo Enqueue recebe como parâmetro um objeto a ser inserido na lista nesse caso no final da fila Dequeue retorna o primeiro objeto da fila aquele que pela ordem é o próximo a ser removido Após a chamada desse método o objeto retornado é também removido da fila Peek retorna o primeiro objeto da lista mas não o remove Pode ser usado quando se deseja apenas conhecer o valor do primeiro elemento TrimToSize altera a capacidade da lista para a quantidade atual de elementos Com isso memória é poupada pois a classe Queue reserva memória para armazenar uma quantidade de elementos se nem todos forem usados parte da memória reservada fica sem uso Construtor a classe Queue possui três sobrecargas do construtor original A primeira delas recebe um valor inteiro que define capacidade inicial da lista A segunda recebe uma coleção Collection da qual os itens são copiados para a lista A terceira recebe um valor inteiro para a capacidade inicial e um fator de expansão do tipo float Esse fator de expansão é utilizado para aumentar a capacidade da fila quando for necessário Originalmente esse valor é pequeno para que não seja utilizada memória desnecessariamente O ideal é conhecer previamente o número de elementos a ser inserido da lista é interessante definir a capacidade inicial no constructor evitando que memória extra seja reservada Caso a quantidade de itens ultrapasse a capacidade inicialmente definida esta é automaticamente expandida Stack Também contida no namespace SytemCollections a classe Stack implementa o conceito de LIFO onde o último elemento inserido é o primeiro a ser removido Os métodos que merecem destaque são Count retorna à quantidade de elementos contidos na lista Push insere um objeto recebido como parâmetro no fim da lista Pop retorna e remove o elemento do topo da pilha ou seja o último que foi inserido Peek apenas retorna o elemento do topo da pilha Construtor além do construtor original existem duas sobrecargas A primeira recebe uma coleção do tipo Collection da qual os itens são copiados para a pilha A segunda recebe um valor inteiro que define a capacidade inicial da lista Métodos em comum As duas classes possuem métodos em comum que vale a pena citar aqui Clear remove todos os itens da lista não sendo possível recuperálos Contains recebe como parâmetro um objeto a ser localizado na lista Caso esse objeto esteja contido na fila o retorno desse método é true caso contrário o retorno é false Conclusão A pilha e a fila são usadas com a finalidade de manter listas ordenadas de elementos Enquanto uma pilha é uma estrutura de dados LIFO uma fila implementa uma abordagem FIFO Apenas uma extremidade de uma pilha é acessível para operações principais mas ambas as extremidades de uma fila podem ser usadas São muitas as aplicações dos modelos FIFO e LIFO existe várias ferramentas que podem facilitar bastante o trabalho com estruturas desse tipo oferecendo duas classes eficientes e de fácil manipulação e classes que em geral são comuns às classes que representam coleções nesse namespace As vantagens dos algoritmos de ordenação Ordenar um conjunto de itens em uma lista é uma tarefa frequente na programação Muitas vezes um ser humano pode realizar essa tarefa intuitivamente No entanto um programa de computador precisa seguir uma sequência exata de instruções para completála e essa sequência é chamada algoritmo Um algoritmo de ordenação é um método utilizado para colocar uma lista de itens desorganizados em uma determinada ordem A sequência da ordenação é determinada por uma chave Existem vários algoritmos de ordenação que diferem em termos de eficiência e desempenho Alguns conhecidos e importantes desse tipo incluem Bubble sort QuickSort BinaryInsertionSort SelectionSort Collections HeapSort Para o desenvolvimento dos programas foram utilizados os métodos API de Collections e o Bubble sort Collections O que é exatamente as Collections Pense nelas como classes que ajudam você a manipular variedades de objetos A API de Collections traz a interface javautil List que específica o que uma classe deve ser capaz de fazer para ser uma lista Há diversas implementações disponíveis cada uma com uma forma diferente de representar uma lista A implementação mais utilizada da interface List é a ArrayList que trabalha com um array interno para gerar uma lista ArrayList é mais rápida na pesquisa do que sua concorrente O que ocorre é que internamente ela usa um array como estrutura para armazenar os dados Porém este atributo está propriamente encapsulado e você não tem como acessálo Repare também que você não pode usar com uma ArrayList nem acessar atributo length A classe Collections traz um método estático sort que recebe um List como argumento e o ordena por ordem crescente Por exemplo List lista new ArrayList listaadd Sérgio listaadd Paulo listaadd Guilherme Systemoutprintln lista Collectionssort lista Systemoutprintln lista O método collectionsort classifica os itens na coleção de origem e também retorna uma referência a esta coleção classificada Este método retorna uma cópia superficial o que significa que os objetos ou coleções em ambas as coleções compartilham a mesma referência este método modifica a coleção original Se collectionsort for chamado sem parâmetros apenas valores escalares número texto data booleanos são classificados Os itens são classificados por padrão em ordem crescente de acordo com seu tipo Se você deseja classificar os elementos da coleção em outra ordem ou classificar qualquer tipo de elemento você deve oferecer no nomMet um método de comparação que compare dois valores e retorne verdadeiro em 1 resultado se o primeiro valor for menor que o segundo valor Você pode oferecer parâmetros adicionais ao nomMet se necessário Bubble sort A principal vantagem desse algoritmo é que sua implementação é fácil e conhecida Além disso no bubble sort os elementos são trocados de lugar sem utilizar armazenamento temporário o que faz o requerimento de espaço ser mínimo A principal desvantagem é o fato de que não apresenta bons resultados quando a lista contém muitos itens Isso porque esse tipo de ordenação exige n² passos de processamento para cada número n de elementos que serão ordenados Bubble Sort é um algoritmo de ordenação que pode ser aplicado em Arrays e Listas dinâmicas Realizando trocas repetidamente de elementos adjacentes que não estão em ordem até que toda lista de itens esteja em sequência Dessa maneira os itens flutuam na lista conforme os seus valores se o objetivo ordenar os valores em forma decrescente então a posição atual é comparada com a próxima posição e se a posição atual for maior que a posição posterior é realizada a troca dos valores nessa posição Caso contrário não é realizada a troca apenas passase para o próximo par de comparações Se o objetivo é ordenar os valores em forma crescente então a posição atual é comparada com a próxima posição e se a posição atual for menor que a posição posterior é realizada a troca Caso contrário a troca não é feita e passase para o próximo par de comparação Um array ou lista pode estar já ordenado quando se solicita a ordenação dessa forma esta situação tem de ser considerada na implementação do algoritmo Assim demonstrarei a representação gráfica e o teste de mesa das duas situações usando array Selection sort O selection sort vasculha repetidamente a lista de itens selecionando um elemento de cada vez e colocandoo na posição correta da sequência A principal vantagem do selection sort é que ela funciona bem em uma lista de diversos tamanhos Além disso por ser um algoritmo de ordenação de local não precisa de armazenamento temporário além do necessário para guardar a lista original A principal desvantagem é sua baixa eficiência em listas grandes Assim como o bubble sort ele exige n² números de passos para cada n elementos Adicionalmente o seu desempenho é facilmente influenciado pela ordem inicial dos itens antes do processo de triagem Devido a isso esse tipo seleção é adequado apenas para uma lista em que poucos elementos estejam em ordem aleatória Insertion sort O insertion sort varre a lista repetidamente e a cada vez insere um item da sequência desordenada na posição correta A principal vantagem da ordenação por inserção é a sua simplicidade além de mostrar um bom desempenho em listas variáveis É um algoritmo de ordenação de local logo o requerimento de espaço é mínimo A desvantagem é que não possui um desempenho tão bom quanto outros algoritmos de ordenação Com n² passos necessários para funcionar o insertion sort também não funciona bem com listas grandes No entanto é particularmente útil com listas de poucos itens Quick sort O quick sort trabalha com o princípio da divisãoeconquista Primeiramente ela divide a lista de itens em duas sublistas com base em um elemento pivô Todos os elementos na primeira sublista são dispostos de maneira que sejam menores do que o pivô enquanto todos os elementos na segunda sublista são dispostos para serem maiores que o pivô O mesmo processo de particionamento e organização é executado repetidamente nas sublistas resultantes até que toda a lista seja organizada O quick sort é considerado por alguns o melhor algoritmo de ordenação por causa da sua vantagem significante em termos de eficiência uma vez que funciona bem com uma lista grande de itens Por ordenar no próprio local também não há necessidade de espaço adicional de armazenamento A leve desvantagem que ela apresenta é que seu pior desempenho é similar à média de desempenho dos outros algoritmos descritos acima Entretanto é importante notar que esse pior caso é muito raro De um modo mais geral o quick sort produz o método de organização mais eficiente e amplamente utilizado para organizar uma lista de qualquer tamanho 7 Trabalhos relacionados São notáveis alguns dos sistemas que tem o uso da pol í tica LIFO como ideal composições que trabalham com um grande volume de entrada de dados eou a necessidade de constante resgate de informações na sua base de dados no geral são bem propensos a serem melhor otimizados utilizandoa Faz total sentido aplicar a política de LIFO em aplicações que tem como objetivo de ser informativos por exemplo onde é crucial o resgate e a projeção de dados mais recentes de uma forma rápida Alguns exemplos de aplicações que fazem uso de forma eficiente Páginas de jornais em que as notícias mais recentes serão apresentadas primeiro e as mais antigas por último Notificações de redes sociais em que as notificações mais recentes estarão no topo deixando as mais antigas para baixo O feed das redes sociais em que as publicações mais recentes serão mostradas primeiro e de acordo que desce a tela aparecerá as mais antigas A prática da política do FIFO é muito utilizada em áreas de markenting de vendas de logísticas para possuir o controle de seus clientes e de seus pedidos através das filas que quem comprou ou chegou primeiro terá preferência e por isso sairá primeiro dessa lógica que vem a expressão da prática Firstin Firstout Essa foi a prática escolhida em nosso sistema pois os dados que estão em primeiro na lista serão retirados e os novos irão por último na lista Esse é um aplicativo do banco Caixa que para seu acesso necessita que algum funcionário esteja livre para ser atendido fazendo com que crie uma fila dentro do aplicativo para conseguir administrar quem foi o primeiro a chegar para ser o quanto antes atendido 4 Desenvolvimento do aplicativo A técnica escolhida como já foi mencionada foi o First in First out ou seja o FIFO Esse método possibilita que nossa aplicação possa inserir os dados mais recentes por último e no processo de exclusão os dados mais antigos possam ser excluídos Essa técnica se encaixa bem no nosso projeto pois o nosso objetivo era fazer uma aplicação que o usuário possa visualizar casos ocorridos em datas diferentes períodos diferentes para que possa avaliar quais épocas tiveram mais casos e menos casos de desmatamento que era nosso foco ou seja se ao fazer a ordenação dos dados decrescentemente ele perceber que os 10 primeiros dados possuem uma correlação entre as datas ele pode avaliar com sua equipe métodos de como evitar as queimad as naquele período do ano para que assim futuramente esses casos diminuam geração eou obtenção de dados para ordenação A função utilizada para obter os dados foi a seguinte public String salvar try FileWriter fw new FileWriter CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt true PrintWriter pw new PrintWriter fw pw println this numeros this data pw flush pw close fw close catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage return Adicionado com sucesso Nessa função foi utilizado o FileWriter para que o sistema consiga procurar o arquivo com nome entradatxt com a finalidade de escrever dentro dele porém ainda sem conseguir escrever nele e com o true para que os dados antigos sejam ma n tidos e os novos adicionados por último no arquivo como uma fila com o PrintWriter é possível imprimir os dados dentro do arquivo como se estivesse colando algo em um papel para buscar as informações utilizamos o String números e o String data que possuirão valor quando o usuário preencher o JTextField que está em outra classe e tem a seguinte codificação textoData new JFormattedTextField new MaskFormatter textoData setActionCommand textoData setBounds 198 40 66 19 contentPane add textoData textoDados new JTextField textoDados setBounds 198 77 66 19 contentPane add textoDados textoDados setColumns 2 Essa foi a configuração feita para o design do JTextField que é o container que possibilita que o usuário digite os valores que ele deseja JButton btnAdicionar new JButton Adicionar btnAdicionar addActionListener new ActionListener public void actionPerformed ActionEvent e Dados info new Dados info setNumeros textoDados getText info setData textoData getText JOptionPane showMessageDialog null info salvar textoDados setText btnAdicionar setBounds 10 127 118 21 contentPane add btnAdicionar Nessa parte do código adicionamos um botão para que quando o usuário termine de colocar os dados ele aperte o botão e assim acione as funções ActionListener ActionPerformed ActionEvent ou seja as funções de acionar o botão e ao acionar botão qual função ele deve fazer que foi configurada da seguinte maneira Adicionamos um objeto para a outra classe para que assim consigamos pegar os objetos dentro da função salvar Com isso agora o envio dos dados preenchidos pelo usuário será feita através do setNumeros setData com o texto DadosgetText textoDatagetText para pegar os dados dos JtextField e enviar para os atributos da outra classe denominados como números e data e logo na próxima linha temos o JOptionPane para acionar a função salvar dentro da outra classe E por fim temos o setBounds para definir o tamanho do botão e o contentPane para adicionar o botão no JPane processo de ordenação de dados No sistema utilizamos dois tipos de Ordenação Collectio n O primeiro é para ordenar os dados em ordem crescente para isso o Collectionsort nos serviu muito bem pois ele pega os dados e ele mesmo já realiza a ordenação na ordem crescente o que devese fazer é a leitura dos dados para entregar todos os dados dentro dessa implementação para que ele ordene e depois escrevelo de novo no arquivo de forma ordenada btnNewButton new JButton Crescente btnNewButton setFont new Font Tahoma Font PLAIN 9 btnNewButton addActionListener new ActionListener public void actionPerformed ActionEvent e try String str ArrayList String nomes new ArrayList String BufferedReader in new BufferedReader new FileReader CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt while str in readLine null nomes add str in close Collections sort nomes BufferedWriter out new BufferedWriter new FileWriter CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt for int i 0 i nomes size i out write nomes get i out newLine out close catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage btnNewButton setBounds 165 211 85 21 contentPane add btnNewButton Para fazer que o Collection funcione criamos um ArrayList um a String vazia e o leitor BufferedReader para fazer a leitura do arquivo Para que essa leitura se transforme em algo sólido para o sistema reconhecer pegamos a String vazia que criamos e adicionamos cada linha do arquivo dentro dela Com a String com todos os dados do arquivo adicionamos essa String dentro do ArrayList pois essa é a forma que o Collection ordena seus dados com uma lista como base e então adicionamos essa lista dentro do Collectionsort Com os dados já ordenados criamos o método de escrever no arquivo com o BufferedWriter e para que cada dado esteja em uma linha escrevemos o for para que a escrita seja uma em cada linha Bubblesort O segundo métod o utilizado queríamos um que ordenasse em ordem decrescente para isso utilizamos o Bubblesort E sse método é muito simples e ele faz uma flutuação pelos dados deixando os maiores em cima da lista ou seja na ordem decrescente Para esse método funcionar devemos criar a função Bubbleso rt private static void bubbleSort String arr int length arr length for int i 0 i length 1 i for int j 0 j length i 1 j if arr j compareTo arr j 1 0 String temp arr j arr j arr j 1 arr j 1 temp Nessa função passamos a String arr como método e colocamos como que a função vai tratar os dadosainda não possui nenhum dado pois ainda vai ser passado em que o for servirá para fazer a checagem de cada linha do futuro arraylist e o if servirá para fazer a comparação de cada linha e definir se passará na ordem crescente ou decrescente nesse cas o como colocamos que será 0 o método entende que o dado maior terá preferência e ficará primeiro As linhas seguintes foram para anexar os dados ordenados dentro da String temp para que eles não ficassem perdidos JButton btnDecrescente new JButton Decrescente btnDecrescente addActionListener new ActionListener public void actionPerformed ActionEvent e try String str ArrayList String nomes new ArrayList String BufferedReader in new BufferedReader new FileReader CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt while str in readLine null nomes add str in close String arrayNames nomes toArray String new bubbleSort arrayNames Files write Paths get CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt Arrays asList arrayNames catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage btnDecrescente setFont new Font Tahoma Font PLAIN 9 btnDecrescente setBounds 165 247 85 21 contentPane add btnDecrescente Agora seguimos a mesma lógica da parte crescente do sistema Criando um botão um ArrayList o leitor do arquivo porém com um adicional criamos um array para adicionar esse ArrayList que servirá como base de Array para a função mostrada antes Bubblesort em que os dados daquela função agora terão os dados d o arquivo Processo de Exclusão de dados Quando se trabalha com arquivotxt não é possível excluir uma linha ou um dado de sua lista Nesses casos de remoção é necessário a utilização de leitura do arquivo porém pulando a primeira linha do arquivo ou seja quando você abrir seu arquivo de novo a escrita começará a partir da segunda linha do seu arquivo e terá que criar um outro arquivo par a escrever nele os dados Para isso fizemos o seguinte processo JButton btnRemover new JButton Remover btnRemover addActionListener new ActionListener public void actionPerformed ActionEvent e try Path path Paths get CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt ListString lines Files readAllLines path stream skip1collectCollectors toList Files write path lines catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage Como todos os outros processos criamos um botão porém no processo de leitura utilizamos o path pois ele possui um recurso muito importante chamado skip que podemos escrever quantas linhas desejamos pular na hora da leitura com isso a leitura feita a partir da segunda linha será armazenada dentro da lista lines e logo depois será implementada no caminho do arquivo definido dentro do path Processo de visualização de arquivo No sistema é possível visualizar os dados que o arquivo possui para isso foi feito o seguinte processo JButton abrirArquivo new JButton abrir abrirArquivo addActionListener new ActionListener public void actionPerformed ActionEvent e try FileReader in new FileReader CUserssiqueOneDriveDocumentosfacul 4oapsentradatxt String s int i in read do s s char i i in read while i 1 textArea setText s in close catch IOException ex JOptionPane showMessageDialog null erro em salvar ex getMessage Como todo processo temos o botão para realizar a ação e dentro dele o método de leitura do arquivo que no caso é o FileReader Após a leitura do arquivo criei uma String s que está vazia pois ela ficará responsável por escrever dentro do J textArea que o arquivo tem reservado para a visualização do arquivo porém como o FileReader consegue apenas transformar os dados em números criei uma variável int i para conseguir armazenar esses dados e fazer a leitura de cada linha de dado que esta dentro do FileReader para fazer essa segunda leitura utilizei o método do while que enquanto o int i for diferente de 1 ou seja até o final do arquivo o String s que estava vazia irá receber o i porém transformei ele em char para que ele seja reconhecido como String dentro da String s e essa transformação conseguirá escrever dentro d o textArea todos os dados lidos no arquivo podendo assim visualizar dentro do sistema cada linha do arquivo Pseudocódigo 9 Experimentos e Análise dos Resultado s Está é a Interface Gráfica do nosso sistema como podese ver temos dois métodos de entrada de dados o campo de data e de dados Para a manipulação de dados nós temos 3 tipos Adição de dados para adicionar os dados Visualização de dados para observar os dados Remoção de dados para remover sempre o primeiro arquivo Para a ordenação de dados nós temos 2 tipos Crescente em que o método é o Collectionsort Decrescente em que o método é o BubbleSort E por fim temos o tempo de resposta que serve para analisarmos o tempo de processamento dos algoritmos de ordenação para podermos fazer comparação e analisar o melhor método Banco de dados ordenados decrescentemente Banco de dados ordenados crescentemente Realizamos os testes dentro do nosso sistema fizemos 10 comparações com 10 quantidades diferentes começando por 15 dados e terminando com 100 dados Observação O tempo de diferença foi calculado em nanosegundo Após realizar os testes e analisar os resultados podemos ver que em ambos os algoritmos temos uma rápida resposta e em nenhum dos testes passamos de 10 nanosegundos isso mostra a eficiência e a rapidez dos algoritmos selecionados Para a comparação entre os algoritmos percebese uma leve vantagem do Collectionsort não passando de 6 nanosegundos e mantendo uma base boa de 1 nanosegundo em vários testes O BubbleSort também demonstrou ter uma rapidez e eficiência muito boa as vezes demorando um pouco mais como no primeiro teste que demorou 9 nanosegundos mas sempre mantendo seu tempo baixo A média do Collectionsort foi de 26 nanosegundos enquanto a do BubbleSort foi de 29 nanosegundos A primeira vantagem de um algoritmo para o outro é sua forma de criação no Collectionsort o próprio Java já tem sua implementação ou seja a única preocupação do programador é inserir os dados para que o algoritmo faça a junção dos dados por isso o nome Collection faz a coleção dos dados e logo após através de uma simples função de comparação de dados definimos se os dados serão colocados em ordem decrescente ou crescente Isso se difere do BubbleSort que não possui essa implementação dentro do Java e o programador precisará fazer esse agrupamento através de um método nessa aplicação colocamos os dados dentro de um a Array para que ele possa ser lido e ordenado tanto crescente quanto decrescente Feita as comparações analisado os resultados temse que os métodos de ordenação são bem simples porém dentro do nosso sistema não nos trouxe problemas ou erros de ordenação entregando os resultados que queríamos dentro da proposta que definimos que os dados seriam ordenados tanto do maior para o menor quanto do menor para o maior 10 Considerações Finais As considerações finais devem respondem às seguintes questões O problema apresentado na Introdução foi resolvido Resposta Sim A aplicação conseguiu abordar a proposta de forma que os dados coletados sejam apresentados de forma simples e prática auxiliando a conscientização e combate do problema apresentado com ênfase nas queimadas Os objetivos do trabalho foi ram alcançados Resposta Sim A aplicação foi projetada dentro do modelo de linguagem Orientado a Objetos e contém interface gráfica que apresenta todas as funcionalidades solicitadas Create Read Update e Delete incluindo novos dados no fim do arquivo e respeitando a política de FIFO oferecendo 2 tipos de opções de classificação de dados e a possibilidade de pesquisa deles Os resultados obtidos indicam que a solução é viável Resposta Sim A forma prática e abrangente de visualização de dados do aplicativo quando pronto reafirma o quão a informação pode ser transmitida de uma forma eficiente e transparente e da mesma forma como definimos como um objetivo essa contextualização se faz bem impactante no processo dessa conscientização e reeducação ambiental Comente a experiência de aprendizagem nos conteúdo específicos das políticas de acesso aos dados bem como a conclusão sobre o melhor algoritmo de classificação de dados baseado nos resultados o btidos ou nas pesquisa bibliográfica Resposta Adicionalmente uma reflexão sobre a relevância da Gestão de Dados no cenário pesquisado e como estes dados podem ajudar na gestão monitoramento e controle dos recursos do meioambiente Resposta Na verdade essa gestão de dados já é bem frequente no que vem sendo o combate a degradação do meio ambiente e muitas causas ativistas se manifestaram nos dias atuais percebemos que além da importância desses dados para a gestão dos problemas em si que atingem nossos recursos essa visibilidade é crucial na tomada de várias decisões para resolvelos além da disseminação dessa informação o que acaba gerando mais colaboração e força nessa importante causa podemos usar como exemplo essas instituições que fazem uso desse recurso de gestão de dados 11 Bibliografia httpswwww3schoolscomjqueryeffqueueasp httpwwwfaccampbrosvaldoEstruturasDadospdf httpsptwikipediaorgwikiLIFOtextEm20ciência20da20computação2C20LIFOde20dados20do20tipo20pilhatextEla20possui20apenas20uma20entradadados20entram20e20saem20dela httpsptscribdcomdoc92882061LIFOefifo httpswwwtreinawebcombrblogoqueeecomofuncionaaestruturadedadoslista httpsdigitalinnovationoneartigosestruturadedadospilhasfilaselistas 12 Ficha de Atividades