Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagens de Programação e Estruturas de Dados (ADS12) Avaliação Final (Discursiva) - Individual FLEX 1. Um comerciante deseja calcular a média de preço dos seus produtos, mas ele não sabe quantos produtos têm na loja. Para isso, desenvolva um algoritmo que receba os valores e, para encerrar, o comerciante digita 0. Ao final, apresente uma mensagem com a quantidade de produtos e o valor médio. Resposta Esperada: Algoritmo Mediaproduto; var Cont : inteiro; Num, Soma, Media : real; Inicio Soma := 0; escreva(' Digite os elementos(-1 para encerrar):'); leia (Num); Cont := 0; Enquanto Num <> 0 faça Inicio Soma := Soma + Num; Cont := Cont + 1; leia(Num); fim; Media := Soma/Cont; escreva (Quantidade = ', Cont); escreva ('Media = ', Media); fim. 2. As estruturas de dados, na maioria dos casos, baseiam-se nos tipos de armazenamento vistos dia a dia, ou seja, são a transformação de uma forma de armazenamento já conhecida e utilizada no mundo real adaptada para o mundo computacional. Disserte sobre a diferença no uso das variáveis e as constantes. Resposta Esperada: Dentro de um programa existem valores que precisam ser manipulados, ou seja, eles recebem valores de outros campos; eles podem ser manipulados e por esse motivo são variáveis. Já as constantes, como o nome sugere, tem seu valor inalterado durante a execução do programa, por isso são categorizados como constantes. 3. As estruturas de dados, na maioria dos casos, baseiam-se nos tipos de armazenamento vistos dia a dia, ou seja,são a transformação de uma forma de armazenamento já conhecida e utilizada no mundo real adaptada para omundo computacional. Disserte sobre os tipos primitivos de dados. Resposta Esperada: Os tipos de dados primitivos são formados por números inteiros, números, pontos flutuantes, caracteres e tipos nulos.Esses tipos de dados servem para armazenar informações que usamos ou que trabalhamos no nosso dia a dia. Por Exemplo: o booleano, que armazena dois estados que são verdade ou falso, verdade ou mentira, ligado ou desligado.Temos os tipos numéricos que armazenam valores, que podem ser reais ou inteiros, e o tipo de caractere, que armazena as palavras. 4. Ao iniciar a construção de um algoritmo, o desenvolvedor deverá analisar inicialmente quais os dados deverão ser inseridos pelo usuário, a fim de que sejam definidas as variáveis e, se for o caso, as constantes que serão utilizadas pelo algoritmo na execução das instruções, sendo que estas informações deverão ser declaradas no início do algoritmo. Descreva os principais tipos primitivos de dados numéricos que podem ser utilizados na construção de algoritmos e seus principais operadores aritméticos Resposta Esperada: O tipo Inteiro receberá valores numéricos sem a presença de casas decimais, é o conjunto de números inteiros conhecidos pela regra matemática. Exemplo: - 2, 3, 1520. *O tipo Real receberá valores numéricos com a presença de casas decimais, podendo também receber valores inteiros.Exemplo: 1.5, 3, 1520.22 *Os operadores aritméticos binários são: * ( multiplicação ), / ( divisão ), %( modulo ), + ( soma), - (subtração). *Os operadores aritméticos unários são: + (positivo) e - (negativo), ++ (incremento) - (decremento). 5. Na construção de um algoritmo, o desenvolvedor poderá chegar a uma encruzilhada na qual terá que verificar qual caminho tomar. Essa decisão será baseada na análise de uma estrutura de seleção, que definirá o caminho após a análise de uma condição que retornará um valor verdadeiro ou falso. Com base nisso, desenvolva um algoritmo fazendo uso da estrutura de seleção SE - ENTÃO. O usuário deverá informar a sua idade, e o algoritmo deverá verificar se a idade é igual ou superior a dezoito anos. Se o resultado for verdadeiro, deverá ser exibida a mensagem "PODE OBTER A CARTEIRA DE HABILITAÇÃO", senão deverá ser exibida a mensagem "NÃO PODE OBTER A CARTEIRA DE HABILITAÇÃO". Defina o nome do algoritmo como Verifica_CNH. Conforme imagem a seguir: algoritmo "Verifica_CNH" var Idade: INTEIRO inicio ESCREVAL ("Digite sua idade: ") LEIA (Idade) SE Idade >= 18 ENTAO ESCREVAL ("PODE OBTER A CARTEIRA DE HABILITAÇÃO") SENAO ESCREVAL ("NÃO PODE OBTER A CARTEIRA DE HABILITAÇÃO") FIMSE fimalgoritmo 6. Para construir adequadamente um algoritmo, algumas análises são necessárias, por exemplo, quais dados serão inseridos pelos usuários e seus respectivos tipos. Isso é importante para o processo de definição das variáveis que armazenarão as informações. Também é importante pensar se o programa vai precisar usar as constantes, que são um tipo específico de variável que já tem o valor predefinido na área de declaração das variáveis que serão usadas durante a execução do programa. Desenvolva o início de um algoritmo de nome AVALIACAO. Declare duas variáveis: NOME_ALUNO e NOTA_ALUNO. Use como constante a variável PESO, atribuindo a ela o valor 7. Resposta Esperada: Algoritmo AVALIACAO; Constantes peso = 7; Variáveis NOME_ALUNO : caractere; NOTA_ALUNO : real 7. Com a popularização de linguagens como Java e C#, e sua forte adoção no mercado de TI, é comum nos depararmos com debates sobre as diferenças entre linguagens interpretadas e linguagens compiladas. Disserte sobre as linguagens de programação compilada. Resposta Esperada: Uma das disciplinas de maior dificuldade, segundo os alunos durante o curso de sistema, é a disciplina de estrutura de dados. Compreender como um conjunto de instruções traduz outro conjunto de instruções em um programa pode não ser uma tarefa simples. Por isso, na primeira fase da disciplina, somos convidados a conhecer os dois processos da estrutura de dados, a compilação e a interpretação. Elas são as duas maneiras que um programa tem para traduzir um código. Neste processo, um computador precisa identificar e interpretar códigos e linguagens. Após esta sequência de processos de interpretação, o computador realizará a execução das tarefas solicitadas. Para entender o processo de compilação, podemos fazer uma analogia com 1 tradutor, que pega um texto em uma determinada língua e traduz para outro. Nos programas, a tradução é feita para um código-fonte da máquina. 8. Com a popularização de linguagens como Java e C#, e sua forte adoção no mercado de TI, é comum nos depararmos com debates sobre as diferenças entre linguagens interpretadas e linguagens compiladas. Disserte sobre as linguagens de programação interpretada. Resposta Esperada: Compreender como um conjunto de instruções traduz outro conjunto de instruções em um programa pode não ser uma tarefa simples. Por isso, na primeira fase da disciplina, somos convidados a conhecer os dois processos da estrutura de dados, a compilação e a interpretação. Elas são as duas maneiras que um programa tem para traduzir um código. Diferente dos programas compilados, na técnica de interpretação, um programa é convertido em outro, dinamicamente, ou seja, toda vez que uma execução for necessária, o código-fonte será traduzido para uma linguagem que possa ser executada, direta ou indiretamente, pelo sistema operacional. Esses tipos de programas possuem uma execução mais rápida e possuem maior dinamicidade e podem ser utilizados em vários sistemas operacionais, possuem maior portabilidade. Em contrapartida, eles perdem no desempenho, pois seu desempenho na execução dos códigos para a linguagem da máquina é inferior aos programas compilados. 9. A linguagem de programação Java oferece vários mecanismos para a criação de novos tipos de dados a partir de tipos que já existem. Um desses mecanismos é o que permite a construção de vetores e matrizes, utilizados normalmente para definir estruturas em que existe a necessidade de armazenamento de mais de um objeto do mesmo tipo. Entretanto, a utilização destas estruturas traz algumas limitações, como a necessidade de se conhecer quantos objetos devem ser armazenados. As listas encadeadas atuam de forma a eliminar esta limitação, permitindo a adição de novos objetos enquanto houver espaço n a memória da JVM (Java Virtual Machine). Crie uma classechamada Aluno, contendo os atributos: matrícula do tipo inteiro e nome do tipo String, além de um atributo que fornecerá a estrutura para o funcionamento de uma lista encadeada. Obs.: os getters e os setters do nome e da matrícula podem ser ignorados para fins de simplicidade. Resposta Esperada: publi c class Aluno { pr ivate int matricula; private String nome; privat e Aluno proximoAluno; public Aluno g etProximoAluno() { return proximoAluno ; } public void setProx imoAluno (Aluno proximoAluno) { this.proximoAluno = proximoAluno; } } 10. A utilização de subprogramas é uma prática para desenvolvimento de software que, com o passar d o tempo, foi adotada em larga escala pelas linguagens de programação. Linguagens modernas, como Java, C #, Phyton, Ruby, Scala, PHP, entre outras, utilizam a estratégia de divisão e m subprogramas para determinar o funcionamento dos softwares escritos nas mesmas. Considerando o que foi exposto, disserte sobre as principais vantagens da utilização de funções/métodos na escrita de software. Resposta Esperada: Os subprogramas auxiliam a dividir o problema a ser resolvido em partes menores, reduzindo proporcionalmente a sua complexidade. Através de sua utilização, é possível determinar funcionalidades específicas para cada subprograma, o que auxilia a correção de bugs no código fonte. Da mesma forma, se cada subprograma possui uma função específica, o trabalho de manutenção do código também se torna mais fácil, visto que, caso uma nova funcionalidade seja desejada, em geral bastaria adicionar um novo método ou função. 11. Um professor deseja saber qual a melhor de três notas de seus alunos. Para isso , escreva um algoritmo que solicite e armazene três notas. O algoritmo deverá calcular e apresentar uma mensagem com a maior nota. O código a seguir possui incongruências, analise-o e reescreva-o corretamente. 12. Na linguagem de programação Java, os vetores e as matrizes são normalmente utilizados para definir estruturas onde existe a necessidade de armazenamento de mais de um objeto do mesmo tipo. Entretanto, a utilização destas estruturas traz algumas limitações, como, por exemplo, a necessidade de se conhecer quantos objetos devem ser armazenados. As listas encadeadas atuam de forma a eliminar esta limitação, permitindo a adição de novos objetos enquanto houver espaço na memória da JVM (Java Virtual Machine). Tendo em vista o que foi exposto, crie uma classe chamada Aluno, contendo os atributos matrícula do tipo inteiro e nome do tipo String, além de um atributo que fornecerá a estrutura para o funcionamento de uma lista encadeada. Obs.: os getters e setters do nome e da matrícula podem ser ignorados para fins de simplicidade. Resposta Esperada: 13. Na resolução de um problema por meio de um programa, a primeira providência é conceber um algoritmo adequado. A eficiência de um algoritmo qualquer está intimamente relacionada à disposição, na memória, dos dados que são tratados pelo programa. Por exemplo, se frequentemente enfrentamos o problema de descobrir os números de telefones de nossos conhecidos, é conveniente dispor de uma relação de números, organizada em uma agenda. Se a organização for feita por ordem alfabética, a agenda de fato ajuda. Se, porém, organizássemos nossa agenda pela ordem de altura das pessoas, com raras exceções, a agenda se tornaria difícil de manusear. As estruturas de dados são formas de distribuir e relacionar os dados disponíveis, de modo a tornar mais eficientes os algoritmos que manipulam esses dados. Disserte sobre a importância da estrutura de dados na organização e composição dos aplicativos computacionais. Resposta Esperada: Uma vez que procedimentos são, efetivamente, processadores de dados, a eficiência de um procedimento está muito associada à forma como seus dados são organizados. A estrutura de dados utiliza diversos mecanismos de organização de dados para atender aos diferentes requisitos de processamento. As estruturas de dados definem a organização, métodos de acesso e opções de processamento para a informação manipulada pelo programa. 14. O collections framework do Java possui alguns tipos que podem ser comparados com arrays, porém estes possuem mais recursos, eficiência e vantagens em relação ao array ou vetor normal. Além disso, o collections framework permite ordenar os objetos através de algum critério desejado, bastando implementá-lo. Um exemplo deste tipo de ordenação seria por nome, utilizando-se o atributo nome de uma classe Pessoa. Para desenvolver a comparação, deve ser feita a implementação da interface Comparable na classe desejada, além do método "compareTo". Neste contexto, desenvolva uma classe qualquer, na linguagem de programação Java, que realize a ordenação de uma lista de objetos através da interface Comparable. Apresente as duas classes criadas, uma com a implementação da interface Comparable, e a outra com um exemplo de execução da ordenação de uma lista do objeto do tipo da classe com implementação Comparable. Resposta Esperada: O acadêmico deve desenvolver uma classe com a interface Comparable, como a classe Carro implements Comparable <Carro> a seguir exemplificada, na qual deve ter obrigatoriamente o método "compareTo". Além disso, deve ser desenvolvida uma segunda classe, conforme exemplo "ExemploComparable", para instanciar a classe anterior (Comparable), como nas linhas 9 a 12, adicionando-a à lista (lista.add), linhas 16 a 20, e então invocar o método sort ("Collections.sort(lista)"). 15. Triângulo é uma figura geométrica formada por três retas que se encontram duas a duas e não passam pelo mesmo ponto, formando três lados e três ângulos. Para construir um triângulo, não podemos utilizar qualquer medida, tem que seguir a condição de existência, ou seja, é necessário que a medida de qualquer um dos lados seja menor que a soma das medidas dos outros dois e maior que o valor absoluto da diferença entre essas medidas. Quanto aos lados, o triângulo pode ser: Equilátero, Isósceles ou Escaleno. Baseado no conceito desses triângulos, faça um algoritmo que leia três valores que representam os três lados de um triângulo e verifique: ? Se o triângulo é válido. ? Se é um triângulo equilátero, isósceles ou escaleno. Propriedades de um triângulo. ? A soma de dois lados não pode ser menor que a do terceiro lado (ou o comprimento de cada lado deve ser menor que a soma dos outros dois lados). ? Equilátero: três lados iguais. ? Isósceles: dois lados iguais. ? Escaleno: três lados diferentes. Resposta Esperada: Algoritmo Triangulo; Var lado1, lado2 , lado3 : real Inicio Escreva('Digite o lado 1: '); Leia(lado1); Escreva('Digite o lado 2: '); Leia(lado2); Escreva('Digite o lado 3: '); Leia(lado3); se (lado1+lado2<lado3) OU (lado2+lado3<lado1) OU (lado1+lado3<lado2) entao begin Escreva('O triângulo não é válido.') senao se (lado1=lado2) E (lado2=lado3) entao begin Escreval('O triângulo é equilátero') Senao Se (lado1<>lado2) E (lado2<>lado3) E (lado1<>lado3) entao begin Escreval('O triangulo é escaleno') screval('O triangulo é escaleno') Senão Escreva('O triângulo é isósceles'); Fim; Fim; Fim; fim; 16. As linguagens de programação possuem como característica um conjunto de palavras reservadas, que não podem ser usadas e m outros contextos. Essas palavras - chave são aquelas palavras ou identificadores ue têm um significado implícito e relevante para a linguagem de programação, pois são reservadas para usos específicos da gramática da linguagem de programação. Disserte sobre as diferenças entre palavras reservadas usadas na linguagem C e o conceito das variáveis. Resposta Esperada: A linguagem C possu i 32 palavras reservadas, que não podem ser utilizadas como variáveis. As variáveis podem ser qualquer outra pa lavra diferente das reservadas. S ão as palavras que o d esenvolvedor da linguagem utiliza para executar comandos/instrução e, por isso, não podem ser usadas para outros fins, que não os que previamente definido. Por exemp lo a palavra IF, que e mmuitas linguagens é reservado por fazer parte da sintaxe do comando. 17. Na programação orientada a objetos, é bastante comum o uso de estruturas que permitam oarmazenamento de um conjunto de objetos para uso posterior. Uma das maneiras de resolver este problema é através de matrizes e vetores que, embora sejam bastante eficientes no armazenamento de objetos,apresentam dificuldades na recuperação dos mesmos. A api de collections da plataforma Java procura disponibilizar uma alternativa para utilização neste tipo de situação. Disserte sobre as estruturas disponíveis ArrayList e HashMap e suas principais diferenças. Resposta Esperada: ArrayList - tipo de estrutura semelhante a uma matriz. Permite a colocação de qualquer tipo de objetos, aceitando duplicatas e ordenação. Objetos podem ser referenciados através do índice e a ordem dos elementos é exatamente a mesma da inserção. HashMap - tipo de estrutura que relaciona um objeto- chave a um objeto valor, o que é benéfico para a busca de elementos. Tanto a chave quanto o valor são object, o que permite que se coloque qualquer tipo de dados para a chave e o valor. A ordem não necessariamente é a mesma da inserção, pois os objetos são inseridos em uma espécie de pool e recuperados de acordo com a sua chave. A estrutura aceita duplicatas, desde que referenciadas por índices diferentes. Em contrapartida, não podem existir índices repetidos. 18. Uma das dificuldades de se implementar uma lista encadeada, ao invés de utilizar implementações prontas, é a necessidade de se controlar as estruturas que dão sustentação à própria lista de maneira programática.Considerando uma lista encadeada, que contenha 6 objetos do tipo String, avalie o efeito da execução do método a seguir sobre esta lista, dissertando sobre suas possíveis consequências para a mesma. Resposta Esperada: Ao executarmos este método, inicialmente criamos um novo No contendo a String vinda como parâmetro. O segundo passo, demonstrado na linha 14, é criar um nó que referencie o nó que atualmente é o segundo nó da lista. Na linha 14, referenciamos o nó recém criado no próximo do primeiro elemento da lista. Ao encerrar a execução do método,acabamos com duas listas encadeadas, uma delas contendo o primeiro elemento da lista anterior, que agora referencia como próximo o nó recém criado. Os demais elementos da lista anterior continuam interligados, sem,entretanto, existir referência para o primeiro deles, pois a mesma não foi salva. 19. A recursividade é um recurso interessante e, às vezes, necessário para a resolução de problemascomputacionais através de linguagens de programação. A busca em árvores, por exemplo,depende da recursividade para trazer resultados de forma otimizada. Entretanto, existemcenários em que a recursividade não é interessante, pois o volume de operações internas de controle por parte do sistema operacional ou máquina virtual pode tornar o desempenho da operação pior do que se a mesma fosse realizada sem lógica recursiva. Com vistas ao que foi exposto, disserte sobre o funcionamento de funções recursivas e escreva um método recursivo na linguagem de programação Java. Resposta Esperada: A recursividade consiste na chamada de um método por ele mesmo para resolver determinado problema computacional, tornando o código mais enxuto do que se o problema fosse resolvido sem essa estratégia. Com uma chamada recursiva, uma pilha de execução é normalmente montada na memória do computador, pois a execução do método é interrompida no momento em que ele chama a si mesmo. Uma vez que essa execução interna chegue novamente na chamada, oprocesso se repete até que alguma condição de encerramento seja atingida. Deve-se tomar cuidado com métodos recursivos que não possuem condição de parada, pois os mesmos podem causar um estouro de memória. int calcular(int valor){ int retorno =1; if (valor!=0) retorno = valor * calcular(valor-1); return retorno; } 20. A linguagem de programação Java, sendo programação orientada a objetos, possui recursos que facilitam e melhoram a legibilidade do código-fonte, como as coleções. As coleções são compostas de alguns tipos de listas,como Hashmap e Hashset. Disserte sobre as coleções e os tipos de listas Hashmap e Hashset. Resposta esperada Coleções podem ser entendidas como um array melhorado, isto é, este framework possui algumas vantagens com relação ao array, dentre as quais: não exige o número total de elementos antes de criá-los e, além disso,pode-se buscar um elemento na lista sem saber o seu índice. Neste sentido, coleção pode ser definida comoum vetor dinâmico, o qual possui diversos métodos utilitários. Um Hashmap é uma coleção do tipo mapa,que permite pesquisar um elemento na lista sem ter que percorrer todos os elementos como no ArrayList, oque acarreta desempenho. O Hashmap utiliza um objeto-chave e um objeto-valor, aceitando qualquer tipo dedado. O Hashset é parecido com os conjuntos da matemática, porém não aceita valores duplicados e, alémdisso, a ordem de leitura dos elementos pode não ser a mesma da inserção. A vantagem de utilizar-se umhashset é a velocidade para encontrar um elemento. 21. Para executar uma tarefa qualquer, um computador precisa receber instruções precisas sobre o que fazer.Uma sequência adequada de instruções de computador, para a realização de uma determinada tarefa, se constitui num programa de computador. Uma linguagem de programação é um conjunto de ferramentas, regras de sintaxe e símbolos ou códigos que nos permitem escrever programas de computador, destinados a instruir o computador para a realização de suas tarefas. Dois métodos destacam-se no sentido de compreender o programa: compilação e interpretação. Disserte acerca das diferenças dos métodos citados. Resposta esperada Compilação é o processo de tradução de um programa escrito em linguagem de alto nível para código em linguagem de máquina. Durante a compilação, o código-fonte é analisado (análise léxica, sintática e semântica), é gerado um código intermediário e são construídas tabelas de símbolos, alocam-se as áreas de memória para variáveis e atribui-se os registradores a serem utilizados, e é finalmente gerado o código-objeto em linguagem binária de máquina. Na interpretação, o programa fonte é traduzido e executado instrução a instrução, de modo interativo. O interpretador traduz cada instrução para uma representação interna e interpreta-a simulando o funcionamento do processador. A interpretação é um processo mais lento que a compilação. A classe CountOccurrence escrita na linguagem Java tem por objetivo localizar e contar quantas ocorrências de um determinado valor existem em um conjunto predeterminado de valores, retornando a quantidade de vezes que um determinado valor se repete no conjunto. public class CountOccurrence { public boolean hasValue(int searchValue, int[] array, int i) { if (i >= array.length) return false; if (array[i] == searchValue) return true; else return hasValue(searchValue, array, i + 1); } public int count(int countValue, int[] array, int i) { if (!hasValue(countValue, array, i) '' i >= array.length) return 0; int c = 0; if (array[i] == countValue) c++; c += count(countValue, array, i+1); return c; } public static void main(String[] args) { int[] array = {2, 3, 5, 6, 9, 7, 8, 8, 9}; CountOccurrence co = new CountOccurrence(); System.out.println(co.count(5, array, 0)); } } Considerando o requisito proposto e o código apresentado, avalie as asserções a seguir e a relação proposta entre elas: I- Para que o algoritmo funcione corretamente, deve-se alterar a linha 21, de c += count( countValue, array, i ); para c += count(countValue, array, i + 1); PORQUEII- Da forma como o código está escrito, o código não compilará por estar chamando o mesmo método dentro dele indefinidamente. Assinale a alternativa CORRETA: A A primeira asserção é uma proposição falsa, e a segunda,uma proposição verdadeira. B A primeira asserção é uma proposição verdadeira, e a segunda, uma proposição falsa. C As duas asserções são proposições falsas. D As duas asserções são proposições verdadeiras, mas a segunda não é uma justificativa correta da primeira. Os proprietários de um teatro necessitam de uma ferramenta de software para reserva de lugares. O desenvolvedor contratado verificou que as poltronas disponíveis para reserva são referenciadas pelo número da fila (a partir do número 1) e pelo número da cadeira (a partir do número 1) em cada fila, em uma representação matricial em que as linhas e colunas da matriz correspondem, respectivamente, às filas e às colunas de cadeiras. Embora o contexto seja o da organização matricial - N filas de cadeiras (linhas), cada uma contendo M cadeiras (colunas) -, a solução a ser implementada utilizará uma estrutura linear unidimensional (vetor), sendo, portanto, necessária uma conversão entre o lugar referenciado (número f da fila, número c da cadeira) e a posição real na estrutura de armazenamento (posição p no vetor). Na situação apresentada, considere que a referida matriz seja armazenada no vetor segundo sua sequência de linhas, da primeira para a última, e, em cada linha, da primeira coluna para a última, e que a primeira posição no vetor tenha índice 0. Nessa situação, a posição p da poltrona do teatro localizada à fila de número f e à coluna de número c, é igual a: c + f × M
Compartilhar