(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.
(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.
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.
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.
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.
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.
(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.
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;
(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.
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;
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 n ∈ N.
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;