Buscar

Paradigmas e Linguagem de Programação

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 40 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 40 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 40 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Programação estruturada
1. 
A programação estruturada propõe uma disciplina para construção de códigos de programas com o objetivo de permitir, entre outros fatores, uma fácil manutenção dos programas. Esse paradigma surgiu no início da década de 70.
Acerca dos eventos que motivaram o surgimento da programação estruturada, assinale a alternativa correta:
C. 
A crise do software e o uso excessivo de comandos GOTO nos códigos.
Por que esta resposta é a correta?
Conhecida pela crise do software, a dificuldade de manutenção dos sistemas atuais, em grande parte criticada pelo uso excessivo do comando GOTO, foi o principal motivador do surgimento da programação estruturada. A introdução de novas linguagens não foi a causa do seu surgimento e, ao contrário, o mercado de software estava em constante queda.
2. 
O princípio básico de programação estruturada é que um programa é composto por blocos elementares de código que se interligam por intermédio de três mecanismos básicos.
Assinale a alternativa correta quanto a estes três mecanismos:
Resposta correta
A. 
Sequência, Seleção e Iteração.
Por que esta resposta é a correta?
Os três mecanismos básicos de um programa em programação estruturada são Sequência, Seleção e Iteração. As variáveis, apesar de, assim como procedimentos, estarem presentes em linguagens estruturadas, não são mecanismos básicos.
3. 
Na programação estruturada é fundamental a elaboração de algoritmos e, para expressá-los, algumas formas de representação são usadas.
Assinale a alternativa correta sobre as formas de representação utilizadas para algoritmos em programação estruturada:
D. 
Linguagem Natural, Fluxogramas e Pseudocódigo.
Por que esta resposta é a correta?
As formas de representação de algoritmos em programação estruturada são: Linguagem Natural, Fluxogramas e Pseudocódigo. Linguagem de máquina é outra terminologia e não se enquadra neste propósito, bem como técnica de prototipação.
4. 
Uma das características da linguagem de programação estruturada são as estruturas em sequência. Conforme tal característica, as instruções dos programas são executadas sequencialmente de cima para baixo, linha a linha.
Com base nessa característica, assinale a alternativa correta quanto ao seu benefício na estruturação de código:
E. 
Facilidade em compreender o fluxo de execução de um Programa.
Por que esta resposta é a correta?
O benefício da estrutura sequencial está diretamente relacionado ao fato de compreensão do fluxo de execução de um programa, uma vez que as instruções são executadas na medida em que aparecem no código. Por si só, isso não traz facilidade de processamento e nem desalocação de memória. O controle de desvio no código é executado pelas instruções condicionais.
5. 
Uma das características da programação estruturada é a utilização de estruturas de repetição, representada na maioria das linguagens estruturadas por comandos FOR e While.
Assinale a alternativa correta quanto a uma das principais vantagens que essa estrutura proporciona:
C. 
Execução de blocos de instruções várias vezes.
Por que esta resposta é a correta?
A principal vantagem do uso das estruturas repetitivas é a execução de um bloco de instruções seguidas vezes enquanto uma condição for necessária. Não necessariamente, essas estruturas possibilitam melhor performance e não foram criadas para a utilização de comandos GOTO e, sim, para a sua substituição. Não são novas formas de escrever comandos condicionais, os quais são descritos pelas estruturas condicionais e comandos If Else, funções são outro recurso e podem até conter no seu bloco de execução uma estrutura condicional, mas a estrutura condicional não substitui função.
Programação imperativa
1. 
O paradigma de programação imperativa é largamente caracterizado pelo fato de seus programas expressarem instruções e comandos que o computador deve executar para alcançar os objetivos. Outra característica importante do paradigma de programção imperativa é:​​​​​​​
Você acertou!
A. 
Mutação de estado (alterar os valores das variáveis).
Por que esta resposta é a correta?
Outra característica marcante de linguagens de programação imperativa é a alteração dos valores de variáveis. Linguagens que implementam essa característica são imperativas, mesmo que também atendam a outros paradigmas. Expressar o código por meio de funções, implementação de subprogramas e herança e polimorfismo, apesar de ser possível em linguagens imperativas, é característica que define outros paradigmas. Expressar símbolos e letras é de linguagens lógicas.
2. 
As linguagens de programação imperativa podem ser classificadas como completas quanto a Turing. Analise as questões e assinale a que representa uma síntese do que significa ser completa quanto a Turing.
C. 
Apresentar recursos que permitem expressar qualquer algoritmo computacional.
Por que esta resposta é a correta?
Uma linguagem é considerada completa quanto a Turing quando permite que qualquer algoritmo seja expresso, implementando condicionais e controle de fluxo, por exemplo. Reutilizar código não é uma necessidade para esse enquadramento, bem como escrita em linguagem de baixo nível. Em linguagens imperativas, os dados ocupam a memória junto ao programa, o que quebraria a regra, caso fosse uma necessidade.
3. 
As linguagens de programação imperativa são também chamadas de linguagens procedurais devido ao fato de permitirem uma certa estruturação do código construído. Acerca desse conceito, assinale a alternativa que apresenta uma desvantagem dessa característica:
D. 
Falta de flexibilidade dado o caráter sequencial das instruções.
Por que esta resposta é a correta?
A falta de flexibilidade do código em linguagens imperativas procedurais, dado o caráter sequencial das intsruções, é uma das desvantagens desse conceito. Existem muitas linguagens de programação que implementam o paradigma no mercado e permitem implementar recursividade, dispõem de comandos interativos e têm boa legibilidade do código.
4. 
A programação em linguagem imperativa se caracteriza por expressar a chegada a um resultado e não como. Analise o código abaixo, acerca de um o trecho do código de um programa em linguagem C, e assinale a alternativa correta sobre a característica do paradigma imperativo que é possível perceber.
function join(array) { var text = ""; for (var i = 0; i < array.length; i++) {
 text += array[i];
 }
return text;
}
B. 
Instruções explícitas.
Por que esta resposta é a correta?
O código representa uma implementação em paradigma imperativo. Podemos observar que é explícito como o comando interativo for vai fazer para percorrer o array e também incrementar o valor da variável text. Apesar do uso de funções e comandos incrementais em linguagens imperativas, isso por si só não é característica que justifique uma linguagem imperativa. Já quanto a reuso e código enxuto, isso não é perceptível no trecho e também não é justificativa para classificar uma linguagem como imperativa.
5. 
Uma linguagem de programação pode dar suporte a mais do que um só paradigma de programação. Nesse contexto, analise as alternativas a seguir e assinale a que apresenta as características que justifiquem que uma linguagem forneça suporte à implementação do paradigma imperativo.
C. 
Variáveis, atribuição e execução sequencial de procedimentos.
Por que esta resposta é a correta?
Para que uma linguagem implemente características de programação imperativa, faz-se necessário que, ao menos, implemente o conceito de atribuição a variáveis para manipulação de seu estado e uma execução sequencial dos procedimentos. Implementação lógica e alto nível de abstração são características de linguagens declarativas.
Métodos de programação
1. 
É natural que estudantes da área de computação questionem o porque de se estudar os conceitos e a história das linguagens de programação, no entanto, adquirir esse conhecimento proporciona ao aluno e futuro profissional diversas vantagens. Assinale a alternativa que expresse algumas dessasvantagens:
A. 
Embasamento para escolha de linguagens adequadas e melhor entendimento da importância da implementação.
Por que esta resposta é a correta?
Algumas das vantagens de estudar o conceito de linguagens de programação são o embasamento para escolha da linguagem adequada e o melhor entendimento da importância da implementação. O reúso de componentes está mais ligado ao conhecimento específico de algumas linguagens, já o reaproveitamento de código também está relacionado a um padrão de desenvolvimento de algumas linguagens e, por fim, a facilidade de comunicação não se relaciona a esses conceitos.
2. 
Computadores têm sido utilizados para uma infinidade de áreas que, por sua vez, resultam no desenvolvimento de novos conceitos e linguagens que demandam novos paradigmas e métodos de programação. Assinale a alternativa correta sobre algumas das áreas que impulsionaram esse desenvolvimento:
C. 
Inteligência Artificial e World Wide Web.
Por que esta resposta é a correta?
Entre as áreas que impulsionaram o desenvolvimento de novos conceitos e paradigmas de programação estão a Inteligência Artificial e a World Wide Web. Áreas como o Governo, a Medicina e a Indústria Automobilística, apesar de grandes consumidores de tecnologia, não são consideradas impulsionadoras no desenvolvimento desses conceitos.
3. 
As linguagens de programação podem apresentar características e comportamentos definidos de acordo com o paradigma que a construiu. No entanto, uma linguagem pode apresentar características provenientes de diferentes paradigmas. Dessa forma, assinale a alternativa verdadeira:
Resposta correta
A. 
Os paradigmas não estão vinculados à linguagem de programação.
Por que esta resposta é a correta?
Os paradigmas não estão vinculados e não são definidos pela linguagem de programação. O paradigma de orientação a objetos, apesar de muito embasado em reusabilidade, não foi o precursor do conceito, já o paradigma declarativo está relacionado à preocupação com o resultado e não com a forma de execução de uma instrução. Por fim, um paradigma deve ser definido pelo tipo de situação a ser resolvida e não pela tecnologia.
4. 
O paradigma de programação imperativo tem como principal característica a declaração comandos, que descreve uma sequência de instruções para alcançar um objetivo. Sobre os conceitos do paradigma imperativo, assinale a alternativa correta:
D. 
A programação imperativa apresenta linguagens amplamente utilizadas, como a linguagem C, por exemplo.
Por que esta resposta é a correta?
O paradigma de programação imperativa é implementado por um grande número de linguagens de programação, entre elas a linguagem C. Esse paradigma, apesar de ter o foco em entender os comandos, segue uma lógica entre eles, focando nas instruções recebidas. É um paradigma amplamente utilizado e apresenta linguagens que possibilitam, entre outros recursos, o reúso de código.
5. 
O paradigma de programação estruturada surgiu com a ideia da criação de estruturas e blocos de execução de rotinas e foi amplamente utilizado, dando ênfase para o surgimento do paradigma orientado a objeto. Assinale a alternativa correta sobre o paradigma de programação estruturada:
E. 
O paradigma estruturado permite a organização do código em estruturas funcionais.
Por que esta resposta é a correta?
O paradigma estruturado possibilita a organização do código em estruturas funcionais e reutilizáveis. Ele não foi substituído pelo orientado a objetos, apesar de ser o alicerce para o seu surgimento. Recursos como polimorfismo, herança e classes pertencem ao paradigma orientado a objetos.
Programação orientada a objetos: modelagem de problemas
1. 
O conceito principal da programação orientada a objetos, que justifica o nome do próprio paradigma, é que tudo pode ser abstraído para um objeto e, assim, um programa seria uma coleção de objetos que se relacionam e apresentam comportamento único. Assinale a alternativa que apresenta os principais componentes de um objeto:
D. 
Atributos e métodos.
Por que esta resposta é a correta?
Os principais componentes de um objeto são seus atributos e seus métodos. Apesar de um objeto apresentar diferentes estados ao longo do ciclo de execução do programa, ele não se caracteriza como um componente do objeto. Colunas e tabelas não fazem parte de um objeto e as variáveis são declaradas no escopo do objeto, mas são utilizadas para a definição de atributos.
2. 
A orientação a objetos trouxe alguns conceitos interessantes para a programação, e um deles está relacionado ao conhecimento sobre a implementação interna da classe, o qual é desnecessário do ponto de vista do objeto. Assinale a alternativa correta quanto ao seu nome:
B. 
Encapsulamento.
Por que esta resposta é a correta?
O encapsulamento é a técnica que permite que o conhecimento sobre a implementação interna de uma classe seja desnecessário quanto ao objeto que a instancia. Já o relacionamento não é um conceito-base da orientação a objetos. Ainda, as classes são estruturas e a abstração, embora seja um dos conceitos novos, diz respeito a entender o conceito de objetos, enquanto que a herança refere-se a herdar estruturas de uma classe para outra.
3. 
Um dos novos conceitos surgidos sobre a programação orientada a objeto é o de que ela é um mecanismo por meio do qual é possível selecionar as funcionalidades utilizadas de forma dinâmica por um programa no decorrer de sua execução. Assinale a alternativa correta que apresenta o nome desse mecanismo:
E. 
Polimorfismo.
Por que esta resposta é a correta?
O polimorfismo é o mecanismo que possibilita às funcionalidades serem utilizadas de forma dinâmica por um programa no decorrer de sua execução. Os atributos resultam das características dos objetos; já a herança é a possibilidade de uma classe herdar a estrutura de outra e abstração é o entendimento de entidades do mundo real para a concepção de objetos.
4. 
Uma das grandes vantagens da adoção da programação orientada a objetos é a reutilização de código e sua organização. Com relação às vantagens da reutilização de código na programação orientada a objetos, assinale a alternativa correta:
C. 
A reutilização de código é consequência da análise e do projeto de código.
Por que esta resposta é a correta?
A reutilização de código é consequência das etapas de análise e projeto da orientação a objetos, que fazem com que os projetos de código sejam bem projetados e, por influência das classes que agrupam códigos, reutilizados. Em orientação a objetos, as funções são substituídas por métodos, os quais não são, no entanto, os responsáveis pela boa reutilização e pelos procedimentos que não são de linguagens OO, assim como pelos eventos que são da programação estruturada. A simplificação de código é essencial em qualquer paradigma, mas ela, por si só, não é suficiente para a reutilização de código, e sim para a sua otimização.
5. 
Um objeto é uma instância de uma classe em programação orientada a objetos. As classes definem, então, a estrutura dos objetos que serão instanciados a partir dela. Com base nessa afirmativa, analise a classe a seguir em Java e assinale a alternativa correta:
public class Bola 
{
 String cor;
 int tamanho;
 boolean cheia;
 void encher()
 {
 cheia = true;
 }
 void esvaziar()
 {
 cheia = false;
 }
 }
C. 
Cor, tamanho e cheia são atributos da classe bola.
Por que esta resposta é a correta?
Os atributos da classe que você analisou são: cor, tamanho e bola. Cada atributo de um tipo, ou seja, cor é um tipo string, tamanho do tipo int e cheia do tipo booleano. Encher e esvaziar são métodos que alteram o valor do atributo cheia.
Programação orientada a objetos: classes, relacionamentos e encapsulamento
1. 
Há um tipo específico de relacionamento entre classes, em que o objetivo é mostrar que as informações de um objeto (chamado objeto todo) necessitam serem complementadas por um ou mais objetos de outra classe (objeto parte).
Assinale a alternativa abaixo que contenha o nome dessetipo de relacionamento.
E. 
Agregação.
Por que esta resposta é a correta?
O tipo de relacionamento em que as informações de um objeto precisam ser complementadas por outro são representadas pelo relacionamento do tipo agregação. Composição é um tipo de relacionamento utilizado para representar outro tipo de dependência, enquanto generalização é utilizado para representar relacionamento do tipo herança entre classes. Associação forte é, também, uma denominação do relacionamento de composição e não se enquadra para esse tipo de situação; especialização é um tipo de relacionamento de herança entre classes.
2. 
Todo o atributo de uma classe só poderá ser manipulado pelos métodos da própria classe. O objeto, assim, esconde seus dados de outros objetos e permite que os dados sejam acessados por intermédio de seus próprios métodos.
Quanto a esse conceito, assinale a alternativa correta.
Você acertou!
A. 
Esse conceito é conhecido como encapsulamento.
Por que esta resposta é a correta?
O conceito que possibilita que apenas os métodos da própria classe manipulem os seus atributos, é denominado de encapsulamento. O conceito de herança está relacionado a uma classe herdeira dos atributos de outra classe; polimorfismo é o conceito de que uma classe possa modificar o comportamento padrão da classe que herda. Relacionamentos são tipos de associações ou heranças entre classes; e abstração é o conceito de entendimento do universo a ser implementado pelos objetos.
3. 
Um tipo de objeto especifica uma família, sem se preocupar em definir como o tipo e o objeto serão implementados. Na programação orientada a objetos, os tipos são determinados na etapa de análise.
Assinale a alternativa correta quanto à estrutura utilizada para definir como serão implementados os tipos de objetos.
B. 
Classes.
Por que esta resposta é a correta?
As classes são estruturas que determinam como os tipos de objetos que a utilizam serão implementados. Nelas, são definidos os atributos e métodos, assim como os tipos de relacionamentos. Atributos são características de objetos; os métodos, seus comportamentos. Herança e associação são alguns dos tipos de relacionamento entre as classes e objetos.
4. 
Os relacionamentos do tipo herança entre classes apresentam diferenças. Um dos tipos de relacionamento de herança é indicado quando existe algum atributo que seja aplicável a mais de uma classe, que contenha os atributos comuns a outras classes especializadas.
Assinale a alternativa correta quanto ao nome desse tipo de relacionamento.
C. 
Generalização.
Por que esta resposta é a correta?
A generalização é um tipo de relacionamento de herança, que é utilizado quando uma classe herda os atributos de outra classe. Quando existe a necessidade de criação de atributos específicos pela classe herdeira, é utilizado o relacionamento de especialização. Encapsulamento não é um tipo de relacionamento; e associação é a representação de qualquer relação entre classes, não determinando esse conceito específico, bem como herança.
5. 
Existe um tipo de relacionamento que impõe o sentido de que um objeto todo não existe sem suas partes. Não se pode ter uma cesta de produtos, sem os seus produtos, correto?
Assinale a alternativa correta quanto ao nome desse tipo de relacionamento.
D. 
Composição.
Por que esta resposta é a correta?
O tipo de relacionamento que possibilita especificar que, só faz sentido os objetos parte existirem, se existir o objeto todo é a composição. A agregação é um tipo de relacionamento semelhante à composição, mas nela, um objeto parte pode existir sem esse grau de dependência e, muitas vezes, é chamada de Agregação fraca, enquanto a composição é chamada de Agregação forte. Especialização é um tipo de relacionamento de herança e de não associação; o mesmo vale para o tipo especialização; e abstração não é um tipo de relacionamento.
Programação orientada a objetos: herança e polimorfismo
1. 
Ao analisar um modelo de classes de um sistema, você identificou que existe um relacionamento de herança entre as classes MeioPagamento e CartaoCredito, sendo a classe mãe a MeioPagamento e a classe herdeira a CartaoCredito. Sobre essa situação, assinale a alternativa correta:
B. 
Todos os atributos da classe MeioPagamento serão herdados pela classe CartaoCredito.
Por que esta resposta é a correta?
Como existe um relacionamento de herança entre as classes, sendo a classe MeioPagamento a mãe e a CartaoCredito a herdeira, é possível determinar que todos os atributos e métodos da classe MeioPagamento serão herdados pela classe CartaoCredito, independente da sua visibilidade. Também qualquer novo atributo criado na classe MeioPagamento passará a ser herdado pela classe CartaoCredito e não existe a necessidade de criar antes um objeto da classe MeioPagamento para criar um da classe CartaoCredito.
2. 
Utilizando ainda o exemplo do exercício anterior, caso existisse a necessidade de inserir um atributo para armazenar o valor do limite de gastos diários, que seria único por CartaoCredito, lembrando que a classe MeioPagamento também tem como herdeira a classe CartaoDebito, assinale a alternativa correta sobre essa implementação:
C. 
O atributo limiteGastosDiario seria criado somente na classe MeioPagamento
Por que esta resposta é a correta?
O atributo seria criado somente na classe MeioPagamento. Apesar do limiteGastosDiario ser único por CartaoCredito, isso se refere ao valor do atributo limiteGastosDiario, então não existe relação com o atributo não ser possível de ser herdado. Além do mais, CartaoCredito é um tipo de MeioPagamento e atributos comuns a MeioPagamento devem ficar na classe mãe. Os métodos get e set seriam criados na classe MeioPagamento, mas o atributo limiteGastosDiario também e não um em cada classe. Não existiria necessidade de criar um atributo em cada classe, mesmo que CartaoDebito e CartaoCredito possuam limiteGastosDiario diferentes.
3. 
Em algumas linguagens de programação orientada a objetos, como C++ e Python, é possível que uma classe possua relacionamento de herança com mais de uma classe. Assinale a alternativa correta quanto ao nome desse tipo de herança:
D. 
Herança Múltipla.
Por que esta resposta é a correta?
Quando uma classe tem relacionamento de herança com mais de uma classe, esse tipo de relacionamento é chamado de Herança Múltipla. As demais denominações - Herança Composta, Herança Binária, Herança Dupla, Herança Associativa - não existem. Dizem-se Herança Simples, quando herda de apenas uma classe, e Herança Múltipla como nesses casos.
4. 
Em herança entre classes, existe a possibilidade de uma classe herdeira reescrever um método implementado pela classe mãe. Dessa forma, a classe herdeira atribui um comportamento diferenciado ao da classe mãe, sendo o nome desse conceito polimorfismo. Assinale a alternativa correta sobre o polimorfismo:
O polimorfismo é uma característica em orientação a objetos que usa a hierarquia de objetos.
Por que esta resposta é a correta?
O polimorfismo é um conceito que se utiliza de herança e consequentemente hierarquia de objetos. O polimorfismo estático, no qual a assinatura dos métodos é alterada, trata de um conceito que surgiu com os demais, assim como herança na orientação a objetos, e pode ser aplicado tanto em casos de herança simples como múltiplas. Não existe limitação quanto à quantidade de métodos da superclasse por uma subclasse, desde que esta herde os métodos da superclasse.
5. 
Existem duas formas de implementação de polimorfismo. Uma se dá quando se tem a mesma operação implementada várias vezes na mesma classe e a outra acontece na herança, quando a classe herdeira altera o método original. Assinale a alternativa correta quanto ao nome desses tipos de implementação de polimorfismo:
Você acertou!
A. 
Sobrecarga e Sobreposição.
Por que esta resposta é a correta?
O tipo de polimorfismo onde um método é implementado várias vezes é chamado de polimorfismo estático ou Sobrecarga e o que altera o método original é chamado de polimorfismodinâmico ou Sobreposição. Portanto Estático e Sobrecarga são a mesma coisa, assim como Dinâmico e Sobreposição. Já Alternativo não é um tipo de implementação de Polimorfismo.
Programação orientada a objetos: interfaces e classes abstratas
1. 
As classes abstratas são classes que determinam um tipo, são como uma espécie de rascunho de como as classes que a implementam devem se comportar.
Sobre os conceitos de uma classe abstrata, assinale a alternativa correta:
C. 
Classes abstratas não podem ser instanciadas.
Por que esta resposta é a correta?
Em uma classe abstrata, não é necessário que todos os métodos sejam definidos como abstratos.
Não existe restrição ao conceito de polimorfismo pelas classes herdeiras, ao contrário, a obrigação de implementação de métodos abstratos pelas classes herdeiras é o conceito de polimorfismo dinâmico.
​​​​​​​As classes abstratas não podem ser instanciadas, apenas definem o modelo que deve ser seguido por suas classes herdeiras.
Não é necessário que as classes herdeiras implementem todos os métodos das classes abstratas.
Classes abstratas não são um tipo de encapsulamento, seu conceito é justamente ao contrário, deixando a implementação por conta das classes herdeiras.
2. 
Outras questões são também importantes ao considerar o conceito de classes abstratas. Analise as afirmativas a seguir e assinale aquela que está correta acerca dos conceitos de classes abstratas.
Você acertou!
A. 
Uma classe abstrata pode herdar de outra classe abstrata.
Por que esta resposta é a correta?
Uma classe abstrata pode herdar de outra classe abstrata, não existe restrição.
Os métodos abstratos não têm implementação na classe abstrata; são implementados pelas classes herdeiras.
Apesar de as classes abstratas não conterem instâncias, elas são consideradas superclasses.
Nas classes abstratas podem ser definidos métodos construtores e eventos como em outras classes e a sua funcionalidade é complementada pelas classes derivadas, pois estas implementam os métodos abstratos da classe.
3. 
Classes abstratas têm um significado diretamente ligado ao conceito de herança. São classes que não fazem sentido sem que exista uma relação de herança de outras classes com a classe abstrata.
Em relação a essa afirmativa, marque a alternativa correta sobre a relação entre classes abstratas e herança na orientação a objetos:
D. 
As classes abstratas impedem que a instância de objetos seja a partir da classe genérica.
Por que esta resposta é a correta?
Com a utilização de classes abstratas, diferentemente do caso de herança, não é possível um objeto ser instanciado a partir da classe genérica ou superclasse. Os métodos genéricos, tanto em herança como em classes abstratas, podem tanto ser implementados na classe genérica como nas derivadas, apesar de o ideal ser somente na primeira.
​​​​​​​As classes abstratas são declaradas de forma diferente da superclasse na herança, caso contrário não fariam sentido, e, tanto em classes abstratas como em herança, novos métodos podem ser acrescentados na classe abstrata após herança com uma classe derivada.
4. 
As interfaces em programação orientada a objetos são outro recurso importante e que, dependendo do contexto, possibilita algumas vantagens se comparado ao uso de classes abstratas.
Uma das principais vantagens da utilização de interfaces está relacionada ao fato de que:
E. 
A vantagem principal das interfaces é que não há limites de quantas interfaces uma classe pode implementar.
Por que esta resposta é a correta?
A principal vantagem das interfaces é que não existe um limite de quantas interfaces uma classe pode implementar, diferentemente de classes abstratas.
As interfaces, todavia, exigem que as classes que as referenciam implementem todos os seus métodos. Não existe vantagem em otimização de memória entre uma ou outra, isso depende da implementação do programa. Assim como nas classes abstratas, não é possível instanciar objetos a partir das interfaces. 
​​​​​​​As interfaces não definem um tipo de classe padrão, isso está mais relacionado às classes abstratas.
5. 
O seguinte trecho de código em linguagem de programação Java especifica uma interface para classes que implementem um tipo de FiguraGeometrica:
public interface FiguraGeometrica
{
 public String getNomeFigura(); 
 public int getArea();
 public int getPerimetro();
}
Assinale a alternativa que contém uma afirmativa correta sobre o trecho apresentado:
Resposta correta
A. 
As classes podem conter diferentes implementações dos métodos de FiguraGeometrica.
Por que esta resposta é a correta?
Como se trata de uma interface, é possível afirmar que todas as classes que implementam a interface podem ter diferentes execuções dos seus métodos.
Todas as classes que herdam, necessariamente, devem implementar, mesmo que igualmente, os seus métodos, mas todos devem obedecer à assinatura dos métodos definidos na interface.
Pode-se ter outra interface FiguraGeometrica com um nome diferente; e as classes podem implementar uma ou outra, ou mesmo as duas.
 Não é possível afirmar que todas as classes implementam todos os métodos com o mesmo escopo, apesar de ser possível, pois as interfaces não restringem isso.
Programação orientada a objetos: Java, C++ e C#w
1. 
A orientação a objetos representa uma nova forma de pensar e desenvolver programas, acrescentando economia e eficiência ao software.
Analise as informações:
Descrição da imagem não disponível
​​​​​​​​​​​​​​​​​​​​​No que diz respeito às classes e aos objetos, as informações tratam, respectivamente, de:
Resposta correta
A. 
Atributos e métodos da classe Conta.
Por que esta resposta é a correta?
Os dados demonstrados correspondem aos atributos instanciados na classe, bem como os métodos ou os comportamentos que tais atributos poderão realizar na classe Conta. Variáveis são estruturas que alocam espaço na memória do computador. Abstração significa extrair apenas o relevante de determinados blocos de código. É um dos pilares da orientação a objetos.
2. 
O paradigma da orientação a objetos absorveu grande parte do mercado de desenvolvimento e essa realidade cresce diariamente. Esse escopo tornou a forma de programar mais produtiva, inserindo estrutura de dados, cada qual com a sua utilidade, bem como fundamentos básicos que são os pilares da orientação a objetos. Sabendo disso, analise a situação a seguir:
Dados os seguintes códigos Java:
Código 1:
public class Pessoa{
public String nome; 
public int idade;
 }
Código 2:
public class Aluno extends Pessoa{
public String matricula;
}
Qual dos mecanismos da orientação a objetos está presente no código 2 em relação ao código 1?
B. 
Herança.
Por que esta resposta é a correta?
O código 2 demonstra que a classe Aluno herdou os atributos da classe Pessoa. Sintaticamente, isso ocorre por meio do termo extends, que representa "herdar" nessa linguagem. Independente da linguagem de programação e herança, é a capacidade de reaproveitar o código de outras classes, otimizando o projeto do software. Abstração, polimorfismo e encapsulamento representam os outros três pilares da orientação a objetos com mecanismos diferentes e particulares em relação à herança.
3. 
​​​​​​​A linguagem Java é a mais utilizada mundialmente. Ela pertence à Oracle e tem diversas bibliotecas e ambientes de desenvolvimento próprios para auxiliar o desenvolvedor. Sua plataforma permite que se desenvolva aplicações em Java para serem utilizadas em qualquer tipo de dispositivo. Como se chama o resultado da compilação de um código Java resultante da execução de um programa nessa linguagem?
C. 
Bytecode.
Por que esta resposta é a correta?
O compilador gcc compila e interpreta o código, produzindo o bytecode, que é o código resultante da compilação de um código Java. A JVM é uma máquina virtual desenvolvida e fornecida pela Oracle que tem a função de interpretar o bytecode e permitir que os programas escritos em Java possam funcionar em qualquer plataforma. IDE's são ambientesintegrados de desenvolvimento, também conhecidos como frameworks, que têm comportamentos e particularidades que permitem desenvolver nas mais diversas linguagens.
4. 
Juliano trabalha na empresa WTec e, recentemente, foi incumbido da tarefa de desenvolver um sistema financeiro para um dos clientes da empresa. Passada a fase da implementação, o próximo passo para Juliano foi demonstrar o sistema para o cliente. Nessa ocasião, ele verificou que iria precisar realizar a integração com outros sistemas. Qual solução Juliano poderá realizar para permitir que o seu sistema se comunique com os demais?
B. 
Web Service.
Por que esta resposta é a correta?
A melhor opção para Juliano, além de desenvolver o seu programa utilizando a orientação a objetos, seria o desenvolvimento de um Web Service que permitiria integrar o seu sistema aos demais. Implementar API's, por exemplo, faz com que os sistemas existentes façam requisições ao sistema de Juliano sem requerer modificações a nível de código de fonte e de base de dados. Os Web Services funcionam de modo que permitem a sua comunicação, as verificações de integridade e a capacidade de entrega das informações solicitadas devido a padrões como SOAP, XML e XSD.
5. 
Imagine o seguinte cenário:
Pablo é desenvolvedor em uma empresa e precisa desenvolver um aplicativo para uma pizzaria que permita que os pedidos sejam feitos por meio dele. Para cada sabor de pizza, o sistema deve informar o respectivo valor.
Pablo realiza o projeto da seguinte forma:
Ele faz um teste inicial com apenas um sabor, para testar e definir o comportamento da classe pizza:
public class PizzaCalabresa{
 public void preparar () {
 System.out.printIn("molho, queijo, calabresa");
 }
 public void assar () {
 System.out.printIn("15 minutos");
 }
 public void cobrar (){
 System.out.printIn("RS 12,00");
 }
}
Em seguida, ele define no sistema como será a fabricação de uma pizza:
public class Forno{
 public void fabricar (PizzaCalabresa calabresa) {
 calabresa.preparar ( );
 calabresa.assar( );
 calabresa.cobrar( );
 }
Nesses dois blocos de código, Pablo define quais ingredientes compõem uma pizza de calabresa e as três funções que poderão ser realizadas a partir da criação da classe PizzaCalabresa.
Analise o segundo bloco de código e informe qual pilar da orientação a objetos (OOP) representa o comportamento da classe Forno. Considere que Pablo deverá implementar também as classes dos outros sabores de pizza.
B. 
Polimorfismo.
Por que esta resposta é a correta?
A classe Forno implementa os comportamentos necessários para preparar, assar e cobrar uma pizza de calabresa. Ela utiliza o comportamento declarado na classe PizzaCalabresa conforme a sua necessidade. Trata-se de um exemplo prático de Polimorfismo, pois ele habilita o objeto a se comportar de várias maneiras (de acordo com o sabor da pizza) durante toda a execução do programa.
Para que não seja necessário reescrever várias vezes uma mesma instrução, é comum usar a herança para buscar o que se precisa de outras partes do código. No entanto, o encapsulamento isola partes do projeto, e abstração consiste em abstrair as informações menos relevantes e focar nas mais relevantes dentro do código. Esses três últimos conceitos, embora contemplem pilares da orientação a objetos, não são o que Pablo deverá utilizar para otimizar o seu sistema nesse bloco de instruções.
Programação declarativa
1. 
As linguagens de programação declarativas têm como principal característica lógica do programa estarem orientadas para o resultado a ser obtido e não para o modo como será alcançado. Ou seja, têm foco no quê e não no como. Assinale a alternativa que descreva outra característica também associada a esse paradigma:
B. 
Facilidade de aprendizagem.
Por que esta resposta é a correta?
Outra característica das linguagens declarativas é sua facilidade de aprendizagem em relação às linguagens imperativas, pois o fato de serem delimitadas pela elaboração do código, com apenas o resultado a ser alcançado e não com o como, facilita o aprendizado. Características de modelagem de entidades do mundo real são de orientação a objetos. Comandos e instruções passo a passo são de linguagens imperativas. Criação de código enxuto e integração com outras linguagens são condições particulares, o que dependerá da situação.
2. 
As linguagens de programação declarativa, assim como linguagens em outros paradigmas, são indicadas para programas em algumas áreas do conhecimento. Assinale a alternativa que identifica as áreas do conhecimento em que mais se aplicam as linguagens de programação declarativa:
D. 
Inteligência Artificial e Banco de Dados.
Por que esta resposta é a correta?
Entre as áreas que utilizam o paradigma de linguagem de programação declarativa, destacam-se a Inteligência Artificial e o Banco de Dados, principalmente, por conta das linguagens SQL e Prolog, pois, como o paradigma de linguagem declarativa facilita o uso nesse tipo de problema, sua implicação com lógica e cálculos matemáticos é amplamente facilitada. Outras áreas, como jogos e processamento de imagem, apesar de usarem, não são unânimes. Além disso, em sistemas estruturados, as linguagens imperativas predominam. Sistemas estruturados, como o próprio nome sugere, não fazem parte desse paradigma e móbile e sistemas web trabalham mais com o conceito de programação imperativa.
3. 
As linguagens de programação lógica, como o Prolog, têm grande embasamento na lógica matemática, fazendo uso de símbolos na declaração pela lógica de predicados. Assinale a alternativa correta acerca de algumas características da programação lógica:
Resposta correta
A. 
Processamento simbólico e fácil modificação.
Por que esta resposta é a correta?
O processamento simbólico e a facilidade de modificação são características desse tipo de linguagem. Outras características, como processamento numérico, soluções algorítmicas e difícil modificação, são características de linguagens imperativas.
4. 
O paradigma de programação funcional é uma forma de programação declarativa, criado explicitamente para dar suporte a uma abordagem funcional pura, para a solução de problemas. Para atingir esse objetivo, são características desse paradigma:
E. 
Foco em funções com objetos de primeira classe e coleção de dados.
Por que esta resposta é a correta?
A principal característica da programação funcional é o foco em funções, como objetos que se relacionam para implementar o programa. Já o foco em controle de tarefas, como controlar a execução dos passos no algoritmo, e em controle de loops e condicionais são características de linguagens não funcionais.
5. 
As linguagens de programação por restrições são uma complementação ao padrão lógico e se referem à implementação de restrições na relação entre variáveis, especificando soluções e critérios a serem cumpridos, atuando sobre domínios. As linguagens de programação por restrições atuam sobre alguns domínios. Assinale a alternativa abaixo que apresenta alguns domínios onde esse tipo de linguagem atua:
C. 
Booleano e finito.
Por que esta resposta é a correta?
As linguagens de programação restritivas atuam sobre os domínios: booleano, de números inteiros e racionais, linear, misto e finito. Não atuam sobre os domínios estrutural e condicional. O domínio de funções é das linguagens funcionais, e linguagens declarativas não atuam em domínios imperativos e orientados a objetos.
Programação funcional: funções puras
1. 
As funções puras nos dizem que uma função terá sempre a mesma saída a partir de uma mesma entrada. Sabendo disso, pense em uma solução para a seguinte questão:
Você é assessor de TI do gabinete de um vereador de sua cidade. Minutos antes de uma cerimônia, ele solicita que você insira a string "Sr." na frente do nome de todos os 200 convidados para o evento. Essa lista é extraída do sistema que você administrae precisa ser deixada na portaria para aguardar a chegada dos convidados.
Qual das alternativas abaixo indica uma função que você utilizaria para resolver essa situação em nível de código?
B. 
Função map.
Por que esta resposta é a correta?
Dentre as alternativas, a função map seria a ideal para auxiliar em uma solução de código que varreria a lista de convidados e, a partir daí, inseriria uma expressão lambda para inserir a string "Sr.". A função filter iria filtrar dados, sendo que seria necessário aplicá-la em todos os nomes. A função zip retorna uma lista de tuplas e é ideal para a criação de conjuntos de dados. A função reduce, por sua vez, faz o somatório dos elementos do arry, e a função currying recebe parâmetros parcialmente e retorna uma nova função.
2. 
A compreensão de listas em programação funcional permite criar soluções de problemas complexos a partir da manipulação destas. Embora a linguagem Haskell não seja uma linguagem muito utilizada, é bem fácil de ser interpretada e sua notação é simples.
Dada a seguinte expressão na linguagem funcional Haskell, identifique a alternativa que representa o que está sendo pedido por ela:
ghci > [x*2+1 | x <- [1...1000] ] . x
Resposta correta
A. 
Pede que números de 1 a 1000 sejam multiplicados por 2 e somados por 1.
Por que esta resposta é a correta?
A expressão Haskell denota que os elementos no intervalo de 1 até 1000 sejam executados de tal forma que cada elemento executado seja multiplicado por 2 e ao produto seja somado 1. Isso é possível de ser verificado a partir de algumas particularidades da linguagem:
– Os pontos de reticência (...) denotam a continuidade de um intervalo, ou seja, todo o intervalo entre o primeiro e o último elemento, e não apenas o 1 e o 1000.
– Na linguagem Haskell, a saída da função fica à esquerda, diferente de muitas outras linguagens, em que as instruções da função geralmente ficam no final da linha. Nesse caso, é solicitado que o "x" (todos os elementos entre 1 e 1000) seja multiplicado por 2 e somado a 1. Isso inclui o 1 e o 1000 e exclui os valores que vêm antes e depois deles.
3. 
Davi começou a trabalhar no NTI da Embrapa de sua cidade e está tendo seus primeiros contatos com linguagens funcionais. Seu chefe disse que ele irá trabalhar nos projetos de pesquisa genética de gado. Davi, atualmente, programa em Python, então seu superior lhe deu uma apostila de programação funcional e o seguinte problema para resolver:
Faça uma função que retorne todos os dados negativos dessa lista, que se refere ao aumento de peso do gado no último semestre.
Qual das expressões abaixo conseguiria retornar o que foi pedido para Davi?
Resposta correta
A. 
def NumNeg (numeros) : return (list(filter(lambda numero: numero < 0, numeros)))
Por que esta resposta é a correta?
Utilizando um filtro e a expressão lambda, cada número será verificado para ver se é menor que zero. A expressão def NumNeg (numeros) : return (list(filter(lambda numero: numero < 0, numeros))) retorna um array com a lista contendo apenas os números negativos. Sinais de > (maior) e = (igual) anulam as demais questões, tornando-as impossíveis de retornar o que se pede. A função reduce acarreta a aglomeração de valores, ou seja, seu somatório e a redução a apenas um número; portanto, não está de acordo com o enunciado.
4. 
Um sistema eficiente tem em suas linhas conceitos que permitem herdar, abstrair e modificar atributos e métodos. Os conceitos de programação funcional, por meio da pureza de funções, elevam o nível de abstração de uma aplicação, entregando muita qualidade.
Nesse sentido, analise qual das alternativas a seguir está correta em relação à função abaixo:
def analisa_func(elemento, indice):
 elementos [indice] +=1
 return elementos
C. 
Trata-se de uma função impura, pois a lista chamada elemento sofre mudança a cada execução da função, conforme o incrementador logo abaixo.
Por que esta resposta é a correta?
Trata-se de uma função impura, pois a lista chamada elemento é incrementada a cada execução da função. Um detalhe importante da programação Python é que ela não é uma linguagem funcional, mas permite implementar diversos conceitos de programação funcional. Função pura é imutável e não tem alteração de estado, essa é a definição.
5. 
Leonardo está desenvolvendo uma aplicação mobile utilizando React. Em um dado momento do código, ele está implementando um bloco que receberá o somatório de dois parâmetros e a multiplicação de outro. Qual solução funcional (função) ele pode implementar para que esse código tenha uma correta implementação e maior facilidade de verificação de erros?
D. 
Função currying.
Por que esta resposta é a correta?
Ele poderá implementar a função currying, para receber todos os parâmetros de multiplicação e soma e executá-los um a um, retornando uma nova função até chegar a um único argumento. A função filter trata de listas filtrando dados a partir de uma dada instrução. Compreensão de listas é utilizada para realizar cálculos complexos em listas com verificação de intervalos e condições matemáticas mais complexas. A função map varre uma dada estrutura (lista, tuplas e outras) para executar individualmente as instruções nos elementos. A função zip reúne elementos e retorna listas de tuplas.
Programação funcional: functors, aplicative functors e monads
1. 
A teoria das categorias é uma teoria matemática, cujos preceitos auxiliam a nortear a computação funcional. Em suma, ela trata de forma abstrata os valores matemáticos e a relação entre eles.
Avalie as expressões a seguir e marque a alternativa que os define conceitualmente.
0+10 == 10 + 0 == 10
[ ] ++ 1,2,3 == 1,2,3 ++ [ ] == [1,2,3]
Resposta correta
A. 
Monoide.
Por que esta resposta é a correta?
Monoides seguem a teoria das categorias e o princípio da identidade, que diz que duas expressões podem ser unidades, contanto que não produzam efeitos. Bind é o principal operador monádico. Funtor e funtor aplicativo são funções capazes de mapear estruturas monádicas. Mônadas são estruturas que contêm valores e comportamentos que podem ser utilizados em outras funções com o auxílio de funtores.
2. 
Estruturas monádicas também têm a sua origem na teoria das categorias e utilizam expressões algébricas para realizar computações que causam efeitos colaterais. Uma mônada utilizada em determinada função irá gerar outra estrutura de mesmo tipo.
Sabendo disso, dada a função main, que recebe uma string IO, marque a alternativa que implementa corretamente uma linha de código que recebe uma string e retorna uma mônada IO:
main :: IO ( )
B. 
main = getLine >> = putStrLn
Por que esta resposta é a correta?
Usando a função ou o operador bind (>>=), é possível aplicar uma mônada de modo que a função main receba uma string IO e retorne uma mônada IO. Isso é possível por meio do operador >>= entre a função getLine, responsável pela entrada de strings, passa pelo bind e retorna uma mônada IO por meio da função putSrLn.
A notação -> significa que uma função está recebendo algum parâmetro; a função print apenas imprime na tela e não recebe nenhuma entrada.
3. 
Funtores são propriedades capazes de mapear um valor encapsulado, acessando o contêiner para que a função possa executar a sua instrução utilizando um determinado valor. 
Baseado nisso, marque a alternativa que corresponde à função responsável pelo encapsulamento desses diferentes tipos de dados:
C. 
Pure​​​​​​​.
Por que esta resposta é a correta?
Dentro do conceito de funtores e funtores aplicativos, diz-se que funções (ou valores) encapsuladas são acessadas e geram novas funções ou novos valores também encapsulados. A função pure realiza o encapsulamento desse novo valor gerado. A função print mostra um resultado na tela. A fmap é um funtor capaz de acessar dados encapsulados. A função getLine é um comportamento da função IO ( ), responsável pela entrada de um dado no sistema.
4. 
A função ou o operador bind (>>=) retorna a uma função, elemento ou valor monádico. No entanto,a notação do permite facilitar o trabalho com mônadas de forma mais intuitiva em relação às outras linguagens mais utilizadas.
Sabendo disso, assinale a alternativa que representa o correto uso da notação do ​​​​​​​na linguagem Haskell:
Você acertou!
A. 
main :: IO ( )
main = do
 line <- getLine
 putStrLn line
Por que esta resposta é a correta?
A função main recebe uma string IO vazia, em seguida, precisa-se declarar a notação do dizendo que esta deve extrair resultado da função main. Em seguida, precisa-se declarar uma função de entrada e, finalmente, uma função de saída. 
Ponto e vírgula não são utilizados em Haskell e a notação do tipo -> significa que uma função está recebendo algum parâmetro. Neste caso, precisa-se que a função main retorne algo e não receba. Portanto, a expressão que representa a correta sintaxe da utilização da notação do é:
main :: IO ( )
main = do
 line <- getLine
 putStrLn line
5. 
A utilização de expressões algébricas, funtores e mônadas permite manipular os mais diversos tipos de estruturas. Uma dessas estruturas são as listas em que os valores extraídos a partir da execução de uma dada instrução geram uma nova estrutura de mesmo tipo.
Sabendo disso, analise a função monádica e marque a alternativa que traz o correto resultado dessa execução:
Prelude Control.Monad > [10,50,60,100] >>= \x -> [x*x +x]
Resposta correta
A. 
[110, 2550, 3660, 10100]
Por que esta resposta é a correta?
A mônada utilizando listas trabalha uma operação de multiplicação e soma, na qual o resultado retornado será o produto da multiplicação de cada elemento por ele mesmo somado ao seu próprio valor primitivo. Exemplo: 10*10 = 100; 100 + 10 = 110
Isso acontecerá com todos os elementos da lista.
Programação funcional: funções de primeira classe e primeira ordem
1. 
A programação funcional contém alguns conceitos básicos que caracterizam a sua forma de resolver problemas computacionais. Pureza, funções anônimas, imutabilidade, funções como objeto de primeira classe e de ordem superior são só algumas particularidades desse paradigma.
Baseado nas premissas e dada a função em Java Script, assinale a alternativa correta quanto à característica/classificação dessa função: 
var minhaVar = function minhaFunc () {
};
console.log(minhaVar);
Resposta correta
A. 
Função de primeira classe.
Por que esta resposta é a correta?
A função acima denota uma função de primeira classe, pois caracteriza uma função sendo atribuída a uma variável. Funções de ordem superior e funções de alta ordem são funções que recebem ou retornam outras funções. A função Map é um exemplo de função de ordem superior e tem como principal função executar a instrução escrita em todos os elementos do array. Uma função lambda também é conhecida como função anônima e possibilita tornar um código funcional a partir de sua utilização.
2. 
Sabe-se que as funções podem ser repassadas como argumento de outras funções, e a esse tipo damos o nome deHigh Order Functions (Funções de Ordem Superior).
Sabendo disso, imagine o seguinte cenário:
Você trabalha em um escritório e cuida a gestão de TI de toda a empresa. Você precisa gerar um relatório e verifica que os valores estão invertidos e que você precisa revertê-los.
Marque a alternativa que corresponde à função de ordem superior capaz de resolver essa questão, dada a seguinte lista com os dados a serem revertidos:
[[135 , 335], [228 , 336], [345 , 478], [459 , 115], [552 , 636]]
B. 
lista = [[135 , 335], [228 , 336], [345 , 478], [459 , 115], [552 , 636]]
def func_rev(x):
return list(reversed(x))
list(map(func_rev, lista))
Por que esta resposta é a correta?
Dada a lista, o primeiro passo é declarar uma função que recebe um parâmetro e irá retornar o parâmetro revertido. Feito isso, utilizando a função Map, irá varrer a lista e executar a reversão dos valores dessa lista. 
3. 
Você é desenvolvedor júnior de uma empresa e está trabalhando em um sistema para uma livraria. Terminado o CRUD (Create, Read, Update, Delete) que irá permitir aos usuários cadastrar todos os livros do estabelecimento, você percebeu que precisa fazer com que os dados sejam ordenados alfabeticamente para a emissão de relatórios.
Qual função de ordem superior você utilizaria para fazer isso?
C. 
Função Sorted.
Por que esta resposta é a correta?
A função Sorted seria a ideal para realizar a ordenação dos livros cadastrados no sistema. Essa função possibilita que os objetos iteráveis possam ser ordenados pelo índice. Por exemplo: o índice 0 do nome Pedro é o P, então esse parâmetro pode ser passado como instrução para que todos os autores ou títulos cadastrados sejam ordenados.
A função Map ajuda a realizar essa verificação em cada um dos elementos; Filter filtra os dados de acordo com a instrução passada; Reduce reduz os valores até que exista apenas um; e Zip retorna uma sequência de tuplas, mas não ordena.
4. 
Funções representam uma importante parte da Programação Funcional. Elas podem ser definidas dentro de um bloco de código de outras funções e também podem ser retornadas a partir das chamadas de outras funções.
Dada a função a seguir em Python, a partir dos conceitos estudados nesta Unidade de Aprendizagem, marque a alternativa que assinala o resultado de sua execução:
lista_1 = [6, 7, 8, 9]
lista_2 = [1, 2, 3, 4]
for x in zip (lista_1, lista_2):
 print(x)
Você acertou!
A. 
(6, 1)
(7, 2)
(8, 3)
(9, 4)
Por que esta resposta é a correta?
A função Zip retorna uma lista de tuplas em que são agrupados os valores que se referem ao mesmo índice. Listas que têm tamanhos diferentes são comparadas e os valores diferentes são desconsiderados. 
5. 
Operadores são importantes módulos que permitem que blocos de instruções fiquem fáceis e legíveis. Tratando-se de linguagens multiparadigmas, em que podemos utilizar funções anônimas lambda, esses operadores substituem de forma prática os parâmetros compostos por letras e operadores.
Dada a expressão lambda de soma, utilize um operador correspondente na linguagem Python, que irá substituir sem que a função perca a sua característica e saída:
>>> adicao= lambda x, y : x + y
>>> print (soma (5,6))
>>> 11
E. 
print (reduce(add, [5,6]))
Por que esta resposta é a correta?
A expressão lambda do enunciado pode ser substituída pelo operador add juntamente com a lista de parâmetros a serem somados. A função Map não seria capaz de reduzir a lista a um só valor. No entanto, a função Reducecomplementa a instrução, fazendo com que o array seja reduzido a um único valor, o que torna a última alternativa verdadeira. O operador mulrealiza a multiplicação dos valores de um array.
Programação funcional: cálculo lambda
1. 
Funções lambda, além de anônimas, reduzem expressões de forma significativa, fazendo com que o maior número de instruções possa ser expresso na mesma linha. Apesar de não ser considerada uma linguagem funcional, o Python vem implementando diversas funcionalidades, entre elas as funções lambda, de modo a permitir a otimização de seu código.
Dada a seguinte função lambda na linguagem Python:
lista = [2,3,5,7]
nova_lista = map(lambda x:x*2, lista)
for i in nova_lista:
 print i
O que deve ser mostrado na tela?
B. 
4
6
10
14
Por que esta resposta é a correta?
A função Map tem como objetivo mapear os elementos e retornar os resultados de acordo com o que o função instruir. Neste caso, o solicitado era a varredura do array e a multiplicação de cada elemento por 2.
2. 
As funções internas ou embutidas, como filter, permitem que os dados sejam filtrados de uma lista a partir de uma instrução computacional. Essa função evita a necessidade de mudança de estado das variáveis, que tende a tornar expressões impuras.
Observe a função e diga qual mecanismo lambda está expresso na sentença:
lista1 = range(1, 20)
lista2 = filter (lambda x: x % 4 == 0, lista1)
for i in lista2:
 print i 
A saída é a seguinte:
4
8
12
16
Você acertou!
A. 
Filter.
Por que esta resposta é a correta?
Afunção filter, como o próprio nome sugere, filtra os elementos e retorna valores que, quando comparados à uma instrução computacional, são verdadeiros. Neste caso, foi dado um intervalo de 1 a 20 em que a função solicitava que cada item fosse verificado e que, se o resto da divisão por 4 fosse zero, o valor deveria ser mostrado na tela. Map, zip e reduce são outras funções que também podem ser utilizadas em programação funcional, com funcionalidades diferentes. A recursividade é justamente o que se evita ao utilizar funções como a filter, pois esta geralmente realiza a mudança de valores de uma variável, o que a torna impura e não correspondente ao objetivo da programação funcional.
3. 
As funções Map, Filter e outras nos permitem manipular listas de forma limpa e prática, sem que isso cause efeitos colaterais no restante do código. Sabendo disso, analise a seguinte situação:
Laura está modificando o sistema financeiro da universidade em que trabalha. O gerente financeiro solicitou que fossem calculados diariamente os valores recebidos nas negociações com os alunos. Laura sabe que todos os valores inseridos no sistema são armazenados em um array. Qual função lambda Laura poderá utilizar para somar todos os valores inseridos no sistema e, ao final do dia, entregar para seu gerente o montante total?
D. 
Reduce.
Por que esta resposta é a correta?
Laura deverá utilizar a função Reduce, que retorna argumentos de forma cumulativa e coloca-os em uma nova lista. A função Map varre listas e realiza a ação dentro da função com cada item. A função Filter também mapeia listas e realiza um filtro que satisfaça a condição atribuindo True a ela. A função Soma está dentro do escopo da orientação a objetos e precisaria de ajustes como a incrementação, que não fazem parte da programação funcional. Booleana é a operação que retorna um valor verdadeiro ou falso. Esta verificação é feita na execução das funções Map, Filter e Reduce como parâmetro para mostrar os elementos na tela.
4. 
De modo geral, o uso de funções lambda entrega ao desenvolvedor a possibilidade de um código mais limpo, conciso e imutável. São as chamadas funções puras. Para tanto, é preciso compreender a notação nativa da linguagem e a notação lambda, para só então entender a transformação realizada nas linhas do código. Sabendo disso, analise a situação:
Dada a função soma em Python, escolha a alternativa que representa a conversão utilizando lambda para reescrever o código:
def soma (a,b,c):
return a+b+c
>>> x = soma
>>> x(10,20,30)
>>>60
C. 
f = (lambda a,b,c : a+b+c)
f (10,20,30)
Por que esta resposta é a correta?
A sintaxe do cálculo lambda diz que uma função deve ser igual ao operador, seguido aos argumentos da função e da instrução que se deseja realizar. Sendo assim, a função f deverá ser igual ao operador lambda (no caso da sintaxe Python), seguido dos argumentos que estão sendo passados (a, b, c) e, por fim, o que se deseja realizar na função soma de a+b+c. Ao final, são definidos os valores dos argumentos para que seja realizada a função Soma.
5. 
De forma muito clara e amigável, a função Filter realiza a verificação de uma lista e a extração dos elementos solicitados pela expressão ou função diretamente ligada a ela. Como resultado, ela traz uma nova lista contendo os elementos extraídos após a execução da função.
Analise a função lambda que recebe um array com as alturas de todos os candidatos de uma agência de propaganda. Verifique a sintaxe e marque a alternativa que informa o que a função irá retornar na tela:
alturaMetros=[1.65,1.80,1.72,1.74,1.68,1.91]
def main( ):
 print filter(lambda x: x > 1.70 > 1.90 ,alturaMetros) 
 return 0
if name == ' main ':
 main( )
E. 
[1.80, 1.72, 1.74]
Por que esta resposta é a correta?
A função lambda traz uma variável contendo alturas entre 1.65 e 1.91 e pede que, por meio da função Filter, sejam retornados os valores do array maiores que 1.70 e menores que 1.90. Com isso, os valores mostrados na tela serão: [1.80, 1.72, 1.74].
Programação funcional: currying
1. 
Currying permite quebrar uma função de aridade superior a 1 em uma cadeia de funções de aridade 1. Nesse caso, se há uma função com três parâmetros, para realizar um cálculo e não utilizar a técnica de currying, ao enviar somente dois parâmetros na chamada da função, há como retorno:
B. 
erro de retorno, pois a função necessita que sejam informados os três parâmetros.
Por que esta resposta é a correta?
Neste exemplo, por não estar utilizando a técnica de currying, haverá um erro no retorno da função, pois ela está preparada para trabalhar com três parâmetros e a falta de um vai ocasionar erro de processamento. Não será enviado retorno parcial, porque isso só seria possível utilizando currying e, muitas vezes, será possível, dependendo do tipo de dado, invocar a função sem problemas. É preciso enviar sempre os três parâmetros, mesmo que um não seja utilizado, e o erro de retorno não está associado somente por ser uma função de cálculo.
2. 
Currying é uma técnica baseada no princípio de função matemática, criada por Moses Schönfinkel e Gottlob Frege, difundida principalmente por linguagens de programação funcional, permitindo aplicar parcialmente uma função a algum dos argumentos da função, por se tratar de uma técnica de encadeamento de funções. Sobre essa afirmativa, assinale a alternativa correta.
C. 
Aplicar parcialmente uma função está relacionado a aplicação parcial e não a currying.
Por que esta resposta é a correta?
Aplicar parcialmente uma função está mais relacionado a aplicação parcial do que ao conceito de currying. Moses Schönfinkel e Gottlob Frege foram os criadores da técnica, e sua maior utilização é por linguagens de programação funcionais. É baseada principalmente no encadeamento de funções, em que uma função retorna outra, e no princípio matemático de que uma função é de aridade 1 e implica outras.
3. 
Closure é um conceito que tem relação com a técnica de currying e três cadeias de escopo: seu próprio escopo; escopo externo, com acesso às variáveis da função exterior; e escopo com acesso às variáveis globais. Assinale a alternativa correta acerca do que são closures.
Você acertou!
A. 
São uma função que tem acesso às variáveis do escopo-pai.
Por que esta resposta é a correta?
Closures são uma função que tem acesso às variáveis do escopo-pai ou corpo léxico. Esse conceito não necessita que a linguagem dê suporte a currying, embora permita implementar técnica de currying. Não é um recurso exclusivo de linguagens funcionais e também não é considerado função parcial.
4. 
Currying e aplicação parcial lidam com parâmetros de funções e podem aplicar parcialmente seus argumentos. Por isso, é comum uma certa confusão sobre esses conceitos. Assinale a alternativa correta acerca da diferença entre currying e aplicação parcial.
E. 
As aplicações parciais não se importam com o número de argumentos.
Por que esta resposta é a correta?
Em aplicação parcial, não é relevante o número de argumentos. A aplicação parcial não é considerada uma forma de assincronismo em programação funcional, mas na aplicação parcial é possível realizar a chamada de um método sem informar todos os parâmetros. Não é possível aplicar currying sobre uma função que não tenha um valor fixo de argumentos. Em currying, diferentemente de aplicação parcial, sempre vai ser retornada uma função unária.
5. 
A aplicação da técnica de currying tem algumas vantagens, além de sua aplicação básica, que é permitir que uma função receba um único argumento e retorne outra função que recebe o próximo até ter todos os argumentos necessários. Assinale a alternativa correta acerca de outro exemplo de vantagem da utilização de currying.
Resposta correta
A. 
Permitir aos desenvolvedores um maior nível de controle sobre as funções.
Por que esta resposta é a correta?
Outra importante vantagem da adoção de currying é permitir aos desenvolvedores um maior nível de controle sobre suas funções. Currying necessariamente não criafunções com maior desempenho e usa encadeamento de funções para atender à necessidade de funções tradicionalmente n-árias. Não é a única forma de criar reusabilidade em programação funcional e não está relacionada com a criação de redes distribuídas.
Linguagens multiparadigma 1: F#, JavaScript, Python
1. 
As linguagens de programação multiparadgimas se caracterizam por terem suporte ao desenvolvimento utilizando vários paradigmas de programação, como a orientação a objetos, a programação imperativa e a programação funcional. O F#, ao suportar tais paradigmas, dentre outros, caracteriza-se por ser uma linguagem de programação multiparadigma.
Indique quais das opções a seguir representa uma característica da linguagem F#:
E. 
Programação assíncrona.
Por que esta resposta é a correta?
Programação assíncrona é um dos recursos providos pela linguagem F#, sendo esta uma linguagem dotada de tipos de dados complexos com alta integração entre outras linguagens da plataforma .NET, bem como tem uma sintaxe leve e tipos de dados imutáveis por padrão. Sendo assim, F# não contém uma sintaxe carregada, sendo que os seus dados não são mutáveis por padrão, bem como, tem alta capacidade de integração a outras linguagens da plataforma .NET. Além disso, os seus tipos de dados não são simples, mas complexos.
2. 
JavaScript é caracterizada por ser uma linguagem de programação multiparadigma, ou seja, é capaz de proporcionar a programação utilizando diversos paradigmas de forma simultânea em um mesmo conjunto de código. A cerca da linguagem JavaScript, indique qual afirmação é correta:
. 
D. 
Proporciona recursos como dialog.
Por que esta resposta é a correta?
JavaScript proporciona recursos como dialog, além de validação de valores e diversos outros recursos que minimizam o fluxo de server side, sendo uma linguagem predominantemente interpretada, bem como contém sintaxe leve e, por conter similaridades junto a outras linguagens, tem uma grande facilidade de obtenção de mão de obra qualificada. Sendo assim, não existe dificuldade em obter mão de obra para JavaScript, bem como não contém uma sintaxe carregada. Não proporciona maior fluxo server-side, mas sim um menor fluxo, além de não ser predominantemente compilada, mas sim interpretada.
3. 
Linguagem de programação multiparadigma que integra o Visual Studio desde a sua versão 2010, sendo que com a sua utilização é possível desenvolver rotinas de alta complexidade em códigos simples de fácil entendimento e possível de ser integrada a outras linguagens de programação presentes na plataforma .NET.
Indique qual opção a seguir representa a linguagem de programação indicada:
E. 
F#.
Por que esta resposta é a correta?
F# foi desenvolvida em 2005, por Don Syme, sendo que dadas as suas excelentes características, passou a ser suportada pelo Visual Studio em 2010. JavaScript, C++, Python e C# contêm características diferentes das mencionadas, por exemplo, C++ está presente desde as primeiras versões do Visual Studio.
4. 
Linguagem de programação multiparadigma utilizada de forma predominante em códigos que operam integrados em arquivos de código HTML, operando em client side, de maneira a fornecer características como uma gama maior de funcionalidades, propiciando interatividade à página.
Indique qual opção a seguir representa a linguagem de programação indicada.
Resposta correta
A. 
JavaScript.
Por que esta resposta é a correta?
JavaScript é a linguagem de programação muito utilizada em conjunto com a linguagem HTML para desenvolver páginas web interativas. F#, C#, C++ e Phyton, apesar de serem linguagens multiparadigmas, não são utilizadas de forma predominante em conjunto com códigos HTML.
5. 
Python é uma linguagem multiparadigma utilizada em grande escala por muitos desenvolvedores no mundo inteiro, destacando-se por ser uma linguagem open source, ou seja, o seu código é aberto e disponível a qualquer pessoa para estudos, ou qualquer outra atividade, desde que alinhada às suas licenças. A cerca dessa linguagem, indique qual alternativa contém uma afirmativa correta:
E. 
Tem tipagem dinâmica e forte.
Por que esta resposta é a correta?
Python tem uma tipagem dinâmica e forte na qual dificilmente é necessário informar o tipo de dados de uma variável. Tem suporte a dados mutáveis e não mutáveis. Sendo uma linguagem multiparadigma, suporta a orientação a objetos, bem como o conceito de herança é suportado. Além disso, é utilizado em vários campos, como programação para dispositivos móveis, web, desktop e várias outras.
Linguagens multiparadigma 2: F#, JavaScript, Python
1. 
Em linguagens de programação, um objeto imutável é aquele cujo status não pode ser modificado no decorrer do programa após sua definição, sendo que F# é uma linguagem com suporte a dados imutáveis e mutáveis.
Indique a opção que apresente uma declaração, respectivamente, de um dado mutável e um dado não mutável em F#.​​​​​​​
A. 
“let mutable x = 10” e “let x = x + 2”
Por que esta resposta é a correta?
A expressão "mutable"é utilizada para indicar que a declaração em questão é mutável, uma vez, que por padrão, F# é uma linguagem de programação imutável. A declaração "immutable" não existe na linguagem de programação F#, bem como “int x = 10” e “const int x = 12” seria a resposta caso a linguagem de programação fosse C#, por exemplo. "let" é de uso obrigatório em qualquer declaração da linguagem F#.
2. 
A orientação a objetos é um paradigma de programação muito importante, uma vez que é possível transferir as características de algo real para um objeto e, assim, trabalhar com ele. Indique qual das opções representa a declaração utilizada para declarar uma classe em F#.​​​​​​​
B. 
type.
Por que esta resposta é a correta?
F# tem suporte a tipos complexos, e por meio destes são desenvolvidos objetos previstos no paradigma orientado a objeto. Dessa maneira, um objeto é declarado por meio da declaração "type". "let" é utilizado na declaração de expressões, funções, etc., já "abstract" é utilizado na declaração de métodos abstratos de um tipo complexo, por exemplo, bem como "inherit" é empregado na criação de herança entre tipos. "class" não realiza nenhuma função especial em um código F#.
3. 
A linguagem de programação JavaScript tem suporte a diversos paradigmas de programação. Dessa forma, temos recursos importantes disponíveis que facilitam a vida do desenvolver de aplicativos, como a possibilidade de utilizar funções de alta ordem. Indique a opção que representa a descrição de funções de alta ordem​​​​​:
E. 
Capacidade das funções de receber e retornar valores ou funções.
Por que esta resposta é a correta?
Funções de alta ordem têm a capacidade de criar funções que recebem como parâmetros funções e valores e podem retornar funções ou valores. A possibilidade de uso opcional do ponto e vírgula é uma questão de boas práticas de programação. Suporte a herança, polimorfismo, encapsulamento e abstração pertencem ao paradigma de orientação a objetos. As funções “while”, “if” e “for” pertencem ao paradigma imperativo, e a diferenciação de maiúsculo e minúsculo nas declarações significa que o JavaScript é case sensitive.
4. 
O JavaScript, na condição de linguagem de programação multiparadigma, é uma linguagem que tem suporte ao paradigma de orientação a objetos, sendo capaz de criar objetos com atributos e métodos. Indique a opção que representa a criação de um método para uma classe qualquer em JavaScript:
C. 
Banco.prototype.boasVindas = function() { alert(‘Olá Cliente!’); }
Por que esta resposta é a correta?
Banco.prototype.boasVindas = function() { alert(‘Olá Cliente!’); } é a opção correta, uma vez que está criando um método chamado de “boasVindas“ por meio da funcionalidade “prototype” para o objeto “Banco”. function boasVindas() { alert(‘Olá Cliente!’); } e function boasVindas() { console.log(‘Olá Cliente!’); } são funções simples declaradas em JavaScript, porém não pertencem a um objeto. def boasVindas: (quebra de linha) print(“Olá Cliente”) é uma funções escritaem Python, e let boasVindas = printfn "Olá Cliente!" é uma função desenvolvida com F#.
5. 
Python é uma linguagem de programação amplamente utilizada no meio científico por ser capaz de criar soluções robustas e ter suporte a paradigmas importantes, como paradigma imperativo, funcional e orientado a objetos. Indique qual opção representa a funcionalidade da expressão “self” presente na linguagem Python:​​​​​​​
Você acertou!
A. 
Disponibiliza acesso aos atributos e aos métodos de um objeto.
Por que esta resposta é a correta?
Por meio da declaração "self", temos acesso aos atributos e aos métodos de um objeto Python. Por meio da declaração "class", as classes Python são definidas, e um construtor é criado por meio da declaração "__init__". Funções de alta ordem, bem como recursividade, são recursos da programação funcional presentes na linguagem Python.

Outros materiais