-
Algoritmia e Estruturas de Dados
Apresentação
Esta UC surge no 2º semestre do 1º ano, na continuação do trabalho iniciado em Fundamentos de Programação (FP). Em FP, os alunos deram os primeiros passos na programação e preocuparam-se principalmente em produzir programas correctos. Agora, em Algoritmia e Estruturas de Dados, irão continuar a produzir programas correctos mas com preocupações de desempenho, a nível de tempo de execução e consumo de memória.
Esta é uma UC fundamental no currículo de um Engenheiro Informático, que na sua vida profissional encontrará inúmeras situações em que terá que resolver problemas causados por fraco desempenho das aplicações e que exigem um conhecimento sólido dos princípios subjacentes aos principais algoritmos e estruturas de dados.
Não obstante a aprendizagem de conceitos e técnicas de algoritmia e estruturas de dados, os alunos trabalham outras competências fundamentais. Nomeadamente, o espírito crítico e a capacidade de avaliar várias alternativas para resolver os problemas.
Docentes: Pedro Alves, Bruno Cipriano, Duarte Neves, Rodrigo Correia, Wellington Oliveira.
Projetos
-
Rock in DEISI
Desenvolver uma aplicação de linhas de comando em Java que permite realizar queries relativamente sofisticadas sobre uma base de dados real contendo informações sobre músicas e artistas dos últimos 100 anos, obtidas de repositórios públicos.
A base de dados é representada em ficheiros CSV e os alunos devem implementar estruturas de dados em memória para responder às queries eficientemente.
Programa
- funções recursivas, algoritmos recursivos
- tipos de dados complexos
- eficiência e optimização (algorítmica e não-algorítmica)
- complexidade de algoritmos
- algoritmos de pesquisa
- algoritmos de ordenação – bubble sort, selection sort, merge sort, quick sort
- tipos de dados abstractos – pilhas e filas
- listas ligadas
- árvores binárias, árvores ordenadas, árvores AVL
- hashtables
Objetivos
O objectivo desta unidade curricular é introduzir os conceitos fundamentais de algoritmos e das estruturas de dados básicas, numa perspetiva de resolver problemas complexos de uma forma eficiente. O aluno deverá ser capaz de analisar e avaliar a eficiência de um algoritmo sem necessidade de o implementar ou testar. Deverá ser igualmente capaz de aplicar a estrutura de dados mais eficaz e eficiente para resolver um determinado problema.
Concretamente, o aluno deverá conseguir criar programas em Java cuja eficiência seja um critério significativo de sucesso (ex: pesquisa, ordenação).
|
-
Computação Móvel
Apresentação
Esta UC é cada vez mais fundamental numa sociedade onde o número de smartphones já ultrapassa largamente o número de computadores e onde se prevê que, num futuro próximo, cada indivíduo se faça acompanhar de um conjunto de dispositivos móveis (smartwatches, smart glasses, sensores, etc.) programáveis, criando a oportunidade para que os engenheiros informáticos possam resolver um vasto conjunto de problemas cuja resolução era até agora impossível ou excessivamente dispendiosa.
A dificuldade está em passar conhecimento que não se esgote no dia em que terminam a UC, dada a velocidade vertiginosa a que evoluem as tecnologias associadas à computação móvel. Nesse sentido, esta UC não pretende apenas ensinar uma linguagem/tecnologia específica mas sim abordar temas intemporais desta área como os vários Modelos de Desenvolvmento, Autonomia, Geo-localização, Conectividade ou Usabilidade.
Docentes: Pedro Alves, Miguel Tavares.
Projetos
-
Cine Cartaz
Desenvolver uma aplicação móvel para Android, usando Kotlin, que permite aos utilizadores registar e avaliar filmes vistos no cinema, obter informações em tempo real através da API OMDb
Inclui funcionalidades como validação geográfica, fotografia de cenas, e consulta de histórico de filmes assistidos em diferentes formatos
A aplicação suporta funcionalidades offline e pesquisa de filmes por voz
Programa
Faceta "conceptual"
- Computação Móvel / Sistemas Ubíquos / IoT
- Arquitetura e desenvolvimento de aplicações móveis (Web, Híbridas, Nativas) – Usabilidade e Interação
- Conectividade
- Geo-localização
- Autonomia
- Sensores
- Integração com serviços externos
- Modelos de negócio
Faceta "prática"
- Arquitetura de aplicações móveis
- Separação UI/Lógica de Negócio
- Programação de widgets
- Gestão de estado
- Testes unitários / integração
- Injeção de dependências
- Programação assíncrona
- Padrão repositório
Objetivos
O objectivo desta unidade curricular é introduzir os conceitos fundamentais da computação móvel. O aluno deverá ser capaz de perceber como tirar o máximo partido das vantagens da computação móvel (localização, sensores, contextual), quando aplicados à resolução de problema concretos. O aluno deverá estar sensibilizado para os constrangimentos típicos de uma aplicação móvel (autonomia, conectividade, usabilidade) e conhecer os mecanismos que permitem ultrapassar esses constrangimentos.
Concretamente, o aluno deverá conhecer os 4 modelos de desenvolvimento de aplicações móveis (Web, Híbrido-Web, Híbrido-Nativo e Nativo) e saber aplicar os conceitos utilizando pelo menos 2 destes modelos – nomeadamente Híbrido-Nativo (Flutter) e Nativo (Android Kotlin).
|
-
Engenharia de Software
Apresentação
A Engenharia de Software ensina o desenho, escrita de código e testes, e manutenção de programas que têm um propósito de resolver problemas complexos com soluções eficientes e seguras. Todas as unidades curriculares anteriores tem um maior foco na sintaxe e técnicas de programação enquanto nesta unidade curricular os alunos aprendem as técnicas de de desenhar e desenvolver software de uma forma eficiente, legível, modular e escalável.
Esta unidade curricular é essencial para desenvolver as capacidades de desenho e programação que os alunos vão enfrentar no mercado de trabalho.
Docentes: José Cascais Brás, Pedro Perdigão, Rui Santos.
Programa
- CP1. Introdução à Engenharia de Software;
- CP2. Modelos e processos desenvolvimento de software;
- Modelos Clássicos: Cascata (contexto histórico)
- Modelos Ágeis: Agile (framework de Scrum)
- CP3. Modelação de sistemas;
- Análise de requisitos
- Diagrama de domínio
- Diagrama de conceitos
- Casos de uso
- CP4. Desenho da arquitectura;
- Análise
- Desenho
- Avaliação
- Evolução
- CP5. Desenho e implementação;
- Padrões UML
- Princípios de desenvolvimento orientado a objectos: S.O.L.I.D, KISS, entre outros.
- CP6. Verificação e validação;
- Conhecer os diferentes tipos de testes
- Aplicação de testes unitários
- CP7. Segurança e Confiabilidade
- CP8. Integração Contínua
- Vantagens
- Ferramentas e tecnologias
Objetivos
OA1. Compreender os métodos, técnicas e ferramentas para o completo desenvolvimento de um sistema de software, desde a sua conceção até à sua entrega e manutenção.
OA2. Saber planear, gerir, avaliar e garantir a qualidade do desenvolvimento de projetos de software utilizando os princípios da Engenharia de Software.
|
-
Fundamentos de Programação
Apresentação
Esta é uma disciplina fundamental na formação de qualquer profissional da área de Informática pois introduz os conceitos básicos da programação, sobre os quais assentarão muitas disciplinas subsequentes como Linguagens de Programação I e II, Algoritmia e Estruturas de Dados, Programação Web, Computação Móvel, etc. Mais do que aprender uma linguagem de programação, o aluno aprende a pensar como um programador, analisando problemas e desenhando algoritmos que os resolvam recorrendo a fluxogramas e a programas escritos em Kotlin, uma linguagem promissora que combina as melhores características das linguagens modernas mais populares (Java, Python, etc.)
Dado ser o primeiro contacto de muitos alunos com o tópico da Programação, reveste-se de uma importância especial na aquisição de conhecimentos primordiais mas também na sua motivação. Mais do que aprender a programar, os alunos aprendem a gostar de programar.
Docentes: Pedro Alves, Brena Lima, Bruno Saraiva, Lucio Studer, Rodrigo Correia, Wellington Oliveira.
Projetos
-
Jogo das Tendas
Desenvolver uma grelha 2D que simule o terreno do jogo, com árvores distribuídas aleatoriamente. Permitir que o jogador coloque tendas junto às árvores, assegurando que cada tenda esteja ligada apenas a uma árvore.
Implementar regras para assegurar que as tendas não se toquem, nem mesmo na diagonal, e criar uma interface de linha de comando para a interação do jogador com o jogo.
-
Batalha Naval
Desenvolver uma grelha 2D que simule a arena do jogo, com navios e marcadores de jogadas anteriores.
Criar uma interface de linha de comando para a interação do jogador com o jogo.
Programa
- Introdução à programação
- Algoritmos, fluxogramas, pseudo-código
- Sintaxe e semântica das linguagens
- Elementos da sintaxe, estrutura de um programa
- Declarações e atribuições
- Tipos primitivos
- Expressões aritméticas, expressões lógicas
- Entradas e saídas de dados
- Selecção
- Repetição
- Funções
- Arrays uni-dimensionais e bi-dimensionais
- Tratamento de erros
- Leitura e escrita de ficheiros
- Boas práticas de programação imperativa
Objetivos
O objectivo desta unidade curricular é fornecer aos futuros profissionais na área da informática as bases para que possam iniciar (de um modo disciplinado) a actividade de programação.
O aluno começa por desenvolver a capacidade de raciocínio algorítmico recorrendo a fluxogramas.
O aluno deverá ser capaz de traduzir esses fluxogramas numa linguagem de programação imperativa. Concretamente, o aluno deverá conhecer a sintaxe básica de Kotlin que lhe permitam criar programas simples de linha de comando.
Finalmente, o aluno deve conseguir analisar e avaliar programas feitos por outras pessoas (colegas, professores, etc.).
|
-
Linguagens de Programação I
Apresentação
Esta unidade curricular oferece uma extensa exploração da programação procedural usando a linguagem de programação C, abrangendo tópicos fundamentais e avançados. Os alunos obterão uma compreensão abrangente da história da programação C e dos seus benefícios, bem como aprenderão a criar e executar programas simples em C. O currículo concentra-se em conceitos essenciais, incluindo tipos de dados, variáveis, estruturas de controlo, funções e ponteiros, com oportunidades de experiência prática para reforçar o conhecimento. A unidade curricular também aborda tópicos avançados, como manipulação de ficheiros, alocação dinâmica de memória e estruturas de dados como listas e filas. Através de projetos de programação, os alunos desenvolverão experiência prática, com ênfase particular em obter uma compreensão completa da organização e operação da memória do computador como um recurso. No final do curso, os alunos serão capazes de criar programas eficientes que fazem uso eficaz da memória.
Docentes: Pedro Alves, Bruno Cipriano, Duarte Neves.
Projetos
-
DEISI Chess
Criação um jogo de Xadrez!
Na primeira parte deste projeto os alunos são desafiados a criar a lógica por trás deste jogo, sendo que vão começar apenas a jogar com Reis.
Na segunda parte vão ser incorporadas as outras peças de maneira a completar este jogo.
-
DEISI Jungle
Desenvolver em Java uma aplicação gráfica (desktop) para um jogo de tabuleiro com animais, que envolve estratégia e movimentação baseada em características animais e alimentares
O jogo suporta até 4 jogadores, cada um iniciando com um animal diferente, e inclui elementos como alimentação e energia, influenciando a dinâmica do jogo.
Programa
M0: Introdução: Visão geral, programação C, história, benefícios, configuração do ambiente, programa simples
M1: Sintaxe Básica: Definições, tipos de dados, operadores, entrada/saída, estruturas de controlo
M2: Estruturas de controle avançadas: Switch, break/continue, goto
M3: Funções: definição/invocação, argumentos/valores de retorno, recursão
M4: Matrizes e Strings: Definições, vectores de caracteres, strings, funções, matrizes 2D
M5: Ponteiros: Definições, aritmética, pilha/heap, alocação dinâmica de memória
M6: Ponteiros Avançados: Ponteiros para ponteiros/funções
M7: Estruturas e Uniões: Definições, estruturas aninhadas, uniões
M8: Entrada/saída de arquivo: visão geral, abertura/leitura/gravação de ficheiros, entrada/saída binária
M9: Diretivas e Macros do Pré-processador: Definições, #define, #ifdef, #undef, macros com parâmetros
M10: Operadores bit a bit: Definições, operadores bit a bit AND/OR/XOR/NOT/shift
M11: Listas Ligadas: Definições, criação/manipulação, exemplos, pilhas/filas
Objetivos
No final desta Unidade Curricular, os alunos deverão ser capazes de criar programas C eficientes e rápidos, tendo em consideração o uso correto da memória. Deverão adquirir uma compreensão sólida da abstração procedural e ser capazes de analisar e criar algoritmos simples usando essa abordagem. Além disso, os alunos devem entender os princípios por trás dos sistemas "coletores de lixo" em linguagens de alto nível, e da operação de bibliotecas de estruturas de dados. O curso visa fornecer aos alunos conhecimentos necessários para criar programas em C bem projetados, eficientes e robustos e para entender os princípios fundamentais que sustentam a operação das linguagens de programação modernas.
|
-
Linguagens de Programação II
Apresentação
Esta UC é o culminar de um caminho iniciado em Fundamentos de Programação e aprofundado em Algoritmia e Estruturas de Dados, solidificando os conhecimentos de programação. Com um foco no desenvolvimento e manutenção de programas de elevada complexidade, o paradigma imperativo deixa de ser suficiente e são abordados os paradigmas orientado a objectos e funcional. São igualmente abordados conceitos adjacentes à fase de implementação, como o controlo de versões, os testes unitários e funcionais, a cobertura de código e outras métricas de qualidade. Esta é uma UC fundamental na formação de qualquer profissional da área de Informática, pois fornece um conjunto de conhecimentos e ferramentas que serão essenciais nos projectos empresariais em que estes alunos virão a estar inseridos.
Docentes: Pedro Alves, Bruno Cipriano, Duarte Neves.
Projetos
-
DEISI Chess
Criação um jogo de Xadrez!
Na primeira parte deste projeto os alunos são desafiados a criar a lógica por trás deste jogo, sendo que vão começar apenas a jogar com Reis.
Na segunda parte vão ser incorporadas as outras peças de maneira a completar este jogo.
-
DEISI Jungle
Desenvolver em Java uma aplicação gráfica (desktop) para um jogo de tabuleiro com animais, que envolve estratégia e movimentação baseada em características animais e alimentares
O jogo suporta até 4 jogadores, cada um iniciando com um animal diferente, e inclui elementos como alimentação e energia, influenciando a dinâmica do jogo.
Programa
- Paradigmas de programação
- Imperativo, funcional, orientado a objetos
- Conceitos de programação por objectos
- Entidades, Atributos, Acções
- Classe vs Objecto, Principio do encapsulamento
- Herança, polimorfismo, parametrização por herança, composição
- UML
- Java orientado a objectos
- Classes, objectos, variáveis
- Construtores, métodos
- Visibilidade, Exceptions
- Estruturas de dados: Arrays, Lists, Maps
- Herança, classes abstractas
- Input/Output
- Testes unitários
- Controlo de versões
- Padrões de desenho
- Factory, Singleton, Observer/Observable, Composite
- Conceitos de programação funcional em Kotlin
- Funções puras, lambdas, funções de primeira ordem, iteração interna, operações com listas
- Boas práticas de programação multi-paradigma
Objetivos
Esta UC tem como objetivo apresentar uma visão multi-paradigma da programação. São analisados e comparados os 3 paradigmas mais populares: imperativo, orientado a objectos e funcional. Os alunos revêm conceitos da programação imperativa e adquirem conceitos fundamentais da programação orientada a objetos (herança, encapsulamento, polimorfismo, etc.) e da programação funcional (lambdas, funções de 1a ordem, etc.) de forma a que consigam aplicá-los em projetos de desenvolvimento de software complexo usando linguagens de programação modernas multi-paradigma (Java, C#, Python, Kotlin, JavaScript).
Ao longo do semestre, os alunos são consciencializados para a necessidade de redução de custos de manutenção através de melhorias na qualidade do software produzido e aplicação de boas práticas tirando partido das vantagens específicas de cada paradigma. São igualmente expostos a ferramentas essenciais no desenvolvimento moderno de software, como controlo de versões e testes unitários.
Todos estes conceitos são aplicados num projeto de elevada complexidade, multi-paradigma e multi-linguagem que atinge em média as 2500 LOC. O projeto tem que ser desenvolvido em Git e ter uma cobertura elevada de testes unitários. Mais do que as capacidades técnicas, os alunos trabalham a gestão de tempo, o rigor e a resiliência, a capacidade analítica e espírito crítico, a criatividade e o trabalho em equipa.
|
-
Programação Web
Apresentação
Esta Unidade Curricular pretende dar formação na área da programação Web em geral, e em particular no desenvolvimento de aplicações Web back-end e front-end, providenciando uma visão global do desenvolvimento moderno para a Web. No front-end, são introduzidos conceitos de estruturação, estilização e interação de conteúdos através das linguagens HTML, CSS e JavaScript, in. No back-end, é ensinado o desenvolvimento de aplicações empresariais seguindo o padrão de desenho model-view-control, recorrendo à linguagem Python e a Web framework django. Pretende-se estimular a criatividade e imaginação no desenvolvimento de aplicações inovadoras que sejam eficientes, escaláveis e fáceis de modificar por um lado, e que ofereçam uma boa experiência para o utilizador. Esta é uma UC fundamental para qualquer profissional da área da informática, pois fornece um conjunto de conhecimentos e ferramentas que serão essenciais em projetos empresariais em que virão a estar inseridos.
Docentes: Lucio Studer, Pedro Perdigão, Rui Santos.
Projetos
-
Portfolio
Criação de aplicação Web com um portfolio. Segue o modelo Model-View-Control. Integra modelação e implementação de uma base de dados, desenvolvimento de toda a lógica de negócio, e criação de interfaces Web.
Criação de uma aplicações sobre o curso (com informação das disciplinas e seus conteudos), projetos realizados
Criação de um blog, que permite comentários e ratings
Interligação com APIs
Programa
A Web e seus paradigmas
– Funcionamento da Internet e da Web: arquitetura e protocolos IP e HTTP
– Tecnologias, paradigmas e padrões de desenho da Web
Python para desenvolvimento Web
– Sintaxe, operadores, controlo de fluxos e tipos de dados
– Funções e módulos
– Gestão de ficheiros e pastas
– Classes
Django web framework para Back-end
– Web frameworks
– Arquitetura MVT
– Urls, views e templates
– Linguagem template
– Modelação de base de dados, ORM
– Formulários
– Autenticação
– Implantação na cloud
HTML e CSS para desenho de páginas Web
– HTML e seus elementos
– Formulários para envio de dados
– HTML5 e elementos semânticos
– CSS e seus seletores, para estilização de conteúdos
– Propriedades CSS
– Design responsivo e layouts dinâmicos
– Efeitos e animações CSS
– Bootstrap
JavaScript para programação Front-end
– Programação Orientada a Eventos
– Manipulação do DOM
– JSON e APIs
– Single Page Applications
Objetivos
- Entender o funcionamento da Internet e da Web.
- Compreender os princípios da programação Web e seus principais padrões de desenho.
- Aplicar estes conceitos, usando várias tecnologias (HTML, CSS, JavaScript, Python and Django¿).
- Arquitetar aplicações eficientes, de fácil manutenção, que corram na Web.
- Avaliar as diferentes estratégias de desenho, sabendo escolher a abordagem que mais se adequa ao contexto.
- Ser capaz de construir e implantar na cloud aplicações Web complexas e criativas, totalmente funcionais (full stack).
|
|
-
Sistemas de Informação na Nuvem
Apresentação
Esta Unidade Curricular tem como objetivo uma introdução à computação em nuvem, numa perspectiva de um iniciante que não possui nenhuma experiência anterior com o tópico.
A ideia é ajudar a criar Junior Cloud Architects, o que significa crias as competências para implementar ou adotar a tecnologia Cloud, entender o que é exatamente e quais opções existem quando se pensa em implantações em nuvem.
Esta UC abrange uma ampla variedade de áreas de tópicos de computação em nuvem, fornecendo uma base sólida de entendimento. Esta unidade curricular cria também um ambiente de entendimento da teoria e das formas práticas dos diferentes modelos de serviços de Cloud Computing: Infraestrutura como Serviço (IaaS), Plataforma como Serviço (PaaS) e Software como Serviço (SaaS), fornecendo exemplos e diferenças entre cada .
Docentes: Rui Ribeiro, Luis A. Gomes, Rui Santos.
Programa
Aulas teóricas:
- Visão geral: história, mercado, tendências
- Revisão de arquiteturas distribuídas: SOA, orientado a eventos Componentes e Serviços
- O que é uma nuvem? Privado, público, híbrido
- Tecnologias, modelos de negócios, principais fornecedores de serviços nacionais e internacionais
- IaaS
- BaaS
- PaaS
- SaaS
- outras
Agenda Prática:
- 1º Trabalho – IaaS e PaaS
- AWS EC2 – Implante e execute o servidor ubuntu
- Docker PaaS – AWS Beanstalk
- Heroku – implantação de 2 aplicativos, cada um por serviço
- 2º Trabalho – SaaS e BaaS
- Trello Board
- AWS BaaS
- Firebase (armazenar dados e média)
Cada trabalho tem um planeamento prático de 6 aulas
Objetivos
- Entenda por que as empresas estão migrando para serviços em nuvem para apoiar seus negócios
- Quais são os modelos de negócios
- Quais são os principais provedores de serviços
- Principais conceitos da arquitetura em nuvem
- Recursos práticos para criar e implantar um serviço em nuvem
|