Ybadoo - Soluções em Software Livre
Turmas
2º Semestre de 2019

Questão 01

(Diverio, 2000) Considerando que diferentes computadores podem ter diferentes arquiteturas e que os diversos tipos de linguagens de programação aparecem em abundância, a formalização dos conceitos de programa e de máquina não são baseadas em qualquer linguagem ou computador real. Assim, suas características essenciais são descritas em modelos matemáticos simples, permitindo um rápido entendimento de suas semânticas e facilitando a demonstração de resultados.

Considerando esse contexto, avalie as asserções a seguir e a relação proposta entre elas.

I. Um programa P é um programa para uma máquina M, se M possuir funções de interpretação de todas as operações e de todos os testes contidos em P.

PORQUE

II. Um programa P é um conjunto de operações e testes cuja execução é sequenciada no tempo através de alguma estrutura de controle. Esta, por sua vez, pode ser iterativa, monolítica ou recursiva. Uma máquina M é um dispositivo dotado de memória, entrada e saída, que implementa funções de interpretação de operações e testes.

A respeito dessas asserções, assinale a opção correta.

a. As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.

b. As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.

c. A asserção I é uma proposição verdadeira, e a II é uma proposição falsa.

d. A asserção I é uma proposição falsa, e a II é uma proposição verdadeira.

e. As asserções I e II são proposições falsas.

Questão 02

(Diverio, 2000) A Relação de Equivalência Forte de Programas é especialmente importante na Ciência da Computação, pois, ao agrupar diferentes programas em classes de equivalência de programas cujas funções computadas coincidem, fornece subsídios para analisar outras propriedades dos programas, como por exemplo, sua complexidade estrutural, legibilidade, tamanho, tempo de execução entre outros critérios. Analise as assertivas a seguir, sobre a Relação de Equivalência Forte de Programas.

  1. Para todo programa monolítico, existe um programa iterativo fortemente equivalente.
  2. Para todo programa monolítico, existe um programa recursivo fortemente equivalente.
  3. Para todo programa iterativo, existe um programa monolítico fortemente equivalente.
  4. Para todo programa recursivo, existe um programa monolítico fortemente equivalente.

Quais das assertivas apresentadas estão corretas?

a. Apenas as assertivas I e II.

b. Apenas as assertivas I e III.

c. Apenas as assertivas II e III.

d. Apenas as assertivas II e IV.

e. Apenas as assertivas III e IV.

Questão 03

Recursão é um método de programação no qual uma função pode chamar a si mesma. Muitos problemas em computação tem a propriedade de que cada instância sua contém uma instância menor do mesmo problema. Considere o programa recursivo apresentado a seguir:

função serie(termos)
se (termos > 1)
então retornar serie(termos - 1) + termos;
senão retornar 1;
fim se;
fim função;

função principal
ler(termos);
se (termos > 0)
então escrever(serie(termos));
senão escrever(erro);
fim se;
fim função;

Qual será o resultado da execução desse programa recursivo, caso o usuário forneça como entrada para o mesmo o valor 7?

a. 21.

b. 28.

c. 36.

d. 45.

e. 55.

Questão 04

Considere o programa monolítico, utilizando instruções rotuladas, sobre a máquina 2_REG, apresentado a seguir.

R01: Se a_zero então vá_para Rx senão vá_para R02;
R02: Faça subtrair_a vá_para R03;
R03: Faça adicionar_b vá_para R04;
R04: Se a_zero então vá_para R11 senão vá_para R05;
R05: Faça subtrair_a vá_para R06;
R06: Faça adicionar_b vá_para R07;
R07: Se a_zero então vá_para R10 senão vá_para R08;
R08: Faça subtrair_a vá_para R09;
R09: Faça adicionar_b vá_para R01;
R10: Faça adicionar_b vá_para R11;
R11: Faça adicionar_b vá_para Rx;

Analise as seguintes assertivas sobre o programa apresentado.

  1. Caso a entrada fornecida seja 4 a saída será 5.
  2. Caso a entrada fornecida seja 5 a saída será 7.
  3. Caso a entrada fornecida seja 6 a saída será 8.
  4. Caso a entrada fornecida seja 7 a saída será 9.

Quais das assertivas apresentadas estão corretas?

a. Apenas as assertivas I e II.

b. Apenas as assertivas I e III.

c. Apenas as assertivas II e III.

d. Apenas as assertivas II e IV.

e. Apenas as assertivas III e IV.

Questão 05

(Diverio, 2000) Um programa monolítico é estruturado usando desvios condicionais e incondicionais, não fazendo uso explícito de mecanismos auxiliares de programação que permitam uma melhor estruturação do controle, como iteração, subdivisão e recursão, de modo que a lógica é distribuída por todo o bloco (monólito) que constitui o programa. Um programa recursivo é estruturado usando rotinas recursivas, permitindo uma estruturação hierárquica do programa e possibilitando níveis diferenciados de abstração. Traduza o programa monolítico apresentado a seguir em um programa recursivo e simplifique, se possível.

Fluxogramas
Programa monolítico - fluxograma
função serie1()
F;
se (T1)
então serie1()
senão serie2()
fim se;
fim função;

função serie2()
G;
se (T2)
então retornar;
senão serie1()
fim se;
fim função;

Questão 06

(Diverio, 2000) Uma das formas mais comuns e tradicionais de especificar programas monolíticos é através de fluxogramas. Informalmente, um fluxograma é um diagrama geométrico construído a partir de componentes (fluxogramas) elementares denominados partida, parada, operação e teste. Desenvolver um programa monolítico, utilizando fluxograma, sobre a máquina 2_REG, que implemente a função B = 1 caso o valor de A seja divisível por 4, ou B = 2 caso o valor de A não seja divisível por 4.

Fluxogramas
Programa monolítico - fluxograma

Questão 07

Programas iterativos substituem desvios incondicionais por estruturas cíclicas, permitindo um melhor controle e manutenção de programas. A noção de programa iterativo deu origem às técnicas de programação estruturada, inspirando toda uma geração de linguagens de programação, como Pascal e C. Diante disso, escreva um programa iterativo, sobre uma máquina genérica, que calcule o valor de π com a série infinita

π = 4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...

O número de termos será fornecido pelo usuário, devendo ser um valor inteiro e positivo.

Por exemplo, caso o número de termos fornecido pelo usuário seja 5, o programa deverá apresentar como resposta o valor 3.34, ou seja, 4 - 4/3 + 4/5 - 4/7 + 4/9.

Caso o usuário forneça um valor inválido para o número de termos, o programa deverá apresentar uma mensagem de erro.

programa
ler(termos);
se (termos > 1) então
denominador = 1;
sinal = 1;
pi = 0;
enquanto (termos > 0) faça
pi = pi + 4 / denominador * sinal;
denominador = denominador + 2;
sinal = sinal * (-1);
termos = termos - 1;
fim enquanto;
escrever(pi);
senão
escrever(erro);
fim se;
fim programa;

Questão 08

Recursão é um método de programação no qual uma função pode chamar a si mesma. Muitos problemas em computação tem a propriedade de que cada instância sua contém uma instância menor do mesmo problema. Diante disso, escreva um programa recursivo, sobre uma máquina genérica, que apresente o valor aproximado da raiz quadrada de um número A, por meio de n iterações, através da sequência de aproximação xn = (xn-1 + A/xn-1) / 2, com x1 = 1 e nN.

O número de iterações e o valor de A serão fornecidos pelo usuário, devendo ser um valor inteiro e positivo.

Por exemplo, caso o valor fornecido pelo usuário para o número de iterações seja 5 e para A seja 3, o programa deverá apresentar como resposta o valor 1.732050810, obtido pela sequência de valores

x1 = 1
x2 = (x1 + 3/x1) / 2 = 2
x3 = (x2 + 3/x2) / 2 = 1.75
x4 = (x3 + 3/x3) / 2 = 1.732142857
x5 = (x4 + 3/x4) / 2 = 1.732050810

Caso o usuário forneça um valor inválido para o número de iterações ou para A, o programa deverá apresentar uma mensagem de erro.

função raiz(A, termos)
se (termos > 0) então
aux = raiz(A, termos - 1);
retornar (aux + A / aux) / 2;
senão
retornar 1;
fim se;
fim função;

função principal
ler(A);
ler(termos);
se (termos > 0)
então escrever(raiz(A, termos);
senão escrever(erro);
fim se;
fim função;