Você está na página 1de 10

Instituto de Informática – INF

Cursos de Bacharelado do INF/UFG (NBC)

Avaliação
Disciplina: Algoritmos & Estruturas de Dados – 1
Professor: Wanderley de Souza Alencar Nota:
Aluno(a): Matrícula:
1ª Avaliação Formal – 2023/2 Data: 28-30/11/2023

INSTRUÇÕES

1. Esta avaliação vale 10,0 (dez pontos) e a nota obtida nela é nomeada de nota da Av-
1, correspondendo a 70% (setenta por cento) da primeira média da disciplina (chamada
de M1). Os 30% (trinta por cento) remanescentes são provenientes da média das notas
obtidas nas Atividades Supervisionadas de números 01, 02 e 03, já aplicadas e entregues;

2. Você pode resolver qualquer quantidade de questões para obter os dez pontos desta ava-
liação;

3. Você somente deve realizar esta avaliação se o seu número de matrícula na UFG, em
2023/2, termina por um numeral ímpar;

4. As resoluções das questões devem ser submetidas ao Sharif Judge System (SJS) utilizado
na disciplina <https://sharif.inf.ufg.br/wanderley> no assignment nomeado de Av1 –
28/11/2023 [ímpar], das 18h50min às 20h20min do dia 28 de novembro de 2023;

5. Os “casos de teste” deste ambiente o(a) auxiliarão no processo de resolução da avaliação,


mas os códigos-fontes poderão ser analisados pelo docente responsável e a nota aferida
pelo SJS ser alterada, tanto para mais quanto para menos.

Questão 01 (5,0 pontos) Um importante conceito em programação de computadores é o de


recursividade e, igualmente importante, é o de polinômio para a Matemática.
A professora Eliza Maria, que leciona Matemática no ensino médio, sabendo que você
está num curso superior da área de Informática, solicitou-lhe ajuda para que ela possa
aplicar uma extensa lista de exercícios para seus(suas) estudantes envolvendo o conceito
de polinômio:

Ela quer que você desenvolva um programa de computador que seja capaz de calcular
o valor assumido por um certo polinômio P (x) no ponto x = α, com α ∈ ℜ, sabendo que
o polinômio é de grau n, ou seja, ele é expresso por:

P (x) = a0 · x0 + a1 · x1 + a2 · x2 + · · · + an · xn
n ∈ N, e n < 20
ai ∈ ℜ, i = {0, 1, 2, . . . n}, e ai ∈ [−100.0, +100.0]

Assim, ela poderá, usando o seu programa, corrigir a lista de exercícios de maneira faci-
litada em relação à correção manual.
Você, que tinha sido aluno(a) da professora Eliza Maria, imediatamente aceitou fornecer-
lhe ajuda e foi falar com seu(sua) professor(a) da área de programação na Universidade.
Ele(a), para estimulá-lo(a) a aprofundar seus conhecimentos acerca de recursividade, adi-
cionou à solicitação que o programa a ser elaborado por você seja recursivo. Por
outro lado, auxiliou-lhe dizendo o seguinte:
1. Considere que o programa deverá receber primeiramente os valores de t e n, sendo
que t é o número de “casos de teste” que será utilizado na corrente execução do
programa e n é o grau do polinômio. Ambos valores são números naturais maiores
que zero e devem ser fornecidos numa única linha, nesta ordem, e separados por um
único espaço em branco entre eles;
2. Em seguida, o programa deverá ler os coeficientes do polinômio – a0 , a1 , a2 , . . . , an –
também numa única linha, nesta ordem, e separados por um único espaço em branco
entre eles;
3. Por fim, o programa deverá ler os t valores α, ou seja, α1 para o primeiro caso de
teste, α2 para o segundo caso de teste e, assim, sucessivamente, até ler o αt para
o t-ésimo caso de teste. Novamente a leitura deve ser realizada numa única linha,
nesta ordem, e separados por um único espaço em branco entre eles.

As saídas devem ser impressas, uma por linha, e com uma única casa decimal de precisão.

Para auxiliá-lo(a) ainda mais, o(a) professor(a) de programação apresentou-lhe alguns


exemplos de entrada e saída para execuções do programa.

Exemplo 01:

ENTRADA SAÍDA
32 1.0
1 -2 1 0.0
012 1.0

Exemplo 02:

ENTRADA SAÍDA
53 -22.0
-4 1 -2 1 -8.0
-2 -1 0 1 2 -4.0
-4.0
-2.0

Exemplo 03:

ENTRADA SAÍDA
56 130.0
-12 1 -4 -2 3 -1 1 -10.0
-2 -1 0 1 2 -12.0
-14.0
38.0

Observações:
1. Para ser considerada completamente válida, a solução tem que utilizar o conceito
de recursividade. Se a resolução estiver correta, mas sem o uso de recursividade,
implicará na atribuição de metade de nota, ou seja, 2,5 (dois pontos e meio) à
questão;
2. Se n = 0, então P (x) = a0 .
Questão 02 (4,0 pontos). O número de Neper, frequentemente representado pela letra e
estilizada (em itálico ou outra grafia especial), tem seu nome originado em homenagem ao
matemático escocês John Neper (1550–1617) e designado pelo matemático suíço Leonhard
Euler (1707–1783). Uma das possibilidades é que Euler tenha escolhido a letra por ela
ser a primeira da palavra exponencial (ou exponential, em Inglês).
É incrível descobrir que o número de Neper é uma constante que surge em várias aplicações
científicas, dentre elas ao calcular o limite da sucessão númerica mostrada a seguir:
 1 n
e = lim 1 + ≈ 2, 7182818285
n→∞ n
O valor deste limite é um número irracional e transcendente (ou seja: não é solução de
qualquer equação algébrica de coeficientes racionais).
Na Natureza, por exemplo, o número de Neper aparece associado à desintegração radi-
oativa: uma substância radioativa x desintegra-se espontaneamente segundo uma lei de
decrescimento exponencial dada pela expressão a seguir:

mx = m0 · e−k·t

onde m0 é a massa inicial (expressa em g) do material x, k é uma constante positiva que


depende substância x e t é o tempo (expresso em anos) e mx é a massa remanescente ou
massa final. Por exemplo, para o elemento radioativo Césio-137, tem-se que k ≈ 0.0228,
o que faz com que a massa de material seja reduzida à metade em aproximadamente 30
anos. O número e tem, também, importância prática noutras áreas como a Economia, a
Engenharia, a Biologia e Sociologia, dentre outras.

Deseja-se que você elabore um programa de computador, em C, para calcular qual é


a massa radioativa remanescente do material x a partir dos valores m0 , k e t fornecidos
pelo(a) usuário(a). Sabe-se que m0 e k são números reais positivos e que t é um número
inteiro positivo.
Para facilitar o funcionamento do programa, um certo número c de “casos de teste” deve
ser calculado de uma única vez por execução, com c ∈ N∗ e c ≤ 10.

Assim tem-se que:

1. Na primeira linha da entrada deve ser fornecido o número c;


2. Em cada uma das c linhas seguintes da entrada será fornecido um “caso de teste”,
com os valores na seguinte ordem: m0 , k e t. Os três valores devem ser separados
por um único espaço em branco entre eles.

As saídas – valores de m – devem impressas, uma por linha, como números inteiros
desprezando-se a porção decimal. A seguir são fornecidos exemplos para facilitar a com-
preensão da especificação e possíveis resultados da execução do supramencionado pro-
grama.

Exemplo 01:

ENTRADA SAÍDA
3 50
100 0.0228 30 25
100 0.0228 60 6
100 0.0228 120

Exemplo 02:
ENTRADA SAÍDA
5 99
100 0.0001 30 99
100 0.0001 60 98
100 0.0001 120 97
100 0.0001 240 95
100 0.0001 480

Exemplo 03:

ENTRADA SAÍDA
5 118
120 0.0003 30 133
180 0.0050 60 0
250 0.0500 120 0
500 0.0500 240 0
1000 0.0700 480
Questão 03 (10,0 pontos) Um(a) estudante universitário(a) da área de Computação está
estudando o conceito de TAD (Tipos Abstratos de Dados) e, por isso, resolveu desafiar-se
ao encontrar, num website de programação, a seguinte proposta para elaboração de um
programa, na linguagem C, conforme se descreve a seguir:

“Utilizando o conceito de TAD (Tipos Abstratos de Dados) deve-se declarar um tipo


de dado para representar uma matriz de números reais M , quadrada de ordem n, com
n ∈ N∗ e n ≤ 20.
Em seguida deve-se construir uma função que seja capaz de calcular e retornar o deter-
minante desta matriz a partir do recebimento, como parâmetros, da própria matriz e de n.”

Como sabe utilizar o programa avaliador denominado Sharif Judge System, o(a) estu-
dante resolveu primeiramente elaborar alguns “casos de teste” antes de implementar o
programa, pois eles o(a) ajudarão a relembrar como é realizado o cálculo de determinan-
tes de matrizes. Eles são os seguintes:

Teste 01:

ENTRADA SAÍDA
2 2.0
12
14

onde tem-se que:

1. Na primeira linha da entrada está o valor n, ou seja, a ordem da matriz quadrada;


2. Em cada uma das n linhas seguintes da entrada está a linha correspondente da
matriz (1ª, 2ª, ..., n-ésima), sempre com os valores seperados por um único espaço
em branco entre si;
3. A única linha de saída exibe o valor do determinante, com uma única casa decimal
de precisão (no caso, o valor 2.0).

Teste 02:

ENTRADA SAÍDA
3 68.0
2 3 -4
-2 1 2
056

Teste 03:

ENTRADA SAÍDA
4 70.0
2 3 4 -1
0020
3 -1 1 1
-1 0 2 3
Observações:

1. Sabe-se que uma numa matriz quadrada M , de ordem 1 (um), o determinante é


igual ao elemento m1,1 , ou seja:
|M | = m1,1 ;
2. Numa matriz quadrada M , de ordem 2, o determinante é:
|M | = m1,1 · m2,2 − m1,2 · m2,1 ;
3. Numa matriz quadrada M , de ordem 3, o determinante é dado pela chamada Regra
de Sarrus:

|M | = m1,1 · m2,2 · m3,3 +


m1,2 · m2,3 · m3,1 +

m1,3 · m2,1 · m3,2 −
m3,1 · m2,2 · m1,3 +
m3,2 · m2,3 · m1,1 +

m3,3 · m2,1 · m1,2

4. Por fim, para uma matriz quadrada M qualquer, de ordem n, o determinante pode
ser calculado utilizando-se o chamado Teorema de Laplace, que estabelece que:

(a) Deve-se escolher uma fila qualquer da matriz (linha ou coluna) M , digamos que
a linha i seja a escolhida;
(b) O determinante de M é expresso pela seguinte fórmula:

n 
X 
|M | = ai,j · Ai,j
j=1

sabendo-se que Ai,j = (−1)(i+j) · Di,j e que Di,j é o determinante da matriz que
se obtém eliminando-se a linha i e a coluna j da matriz M .
Note que este determinante – Di,j – é o determinante de uma matriz quadrada
cuja ordem é um a menos que a ordem da matriz M , ou seja, no processo
ocorre uma redução da ordem do determinante a ser calculado, permitindo-se
que o cálculo do determinante de uma matriz de grande ordem, n >>> 1,
seja sucessivamente calculado pelo somatório de determinantes de matrizes com
ordens cada vez menores, podendo-se atingir até mesmo a ordem 1 (um) cujo
cálculo do determinante é imediato.

Observações:

1. Para ser considerada completamente válida, a solução tem que utilizar o conceito
de TAD (Tipo Abstrato de Dados). Entretanto, com o Sharif Judge System não
permite a submissão de dois ou mais arquivos-fontes, você deverá fazer com que o
programa-fonte tenha as seguintes declarações, nesta ordem:
• include de bibliotecas padrões da linguagem C;
• tipos de dados globais que utilizar;
• protótipos das funções concebidas;
• corpo das funções, com seu código;
• função main.
2. A figura a seguir mostra a estrutura geral do programa-fonte:
Questão 04 (3,0 pontos). Seu(Sua) irmão(irmã), que cursa a primeira série do ensino médio,
está com uma grande lista de exercícios de Matemática para resolver e mostrou-lhe a lista.

Você percebeu que há um grande número de exercícios que exigem o cálculo do MDC
(máximo divisor comum) entre três números naturais, sempre menores que 10.000. Ao
invés de calcular manualmente os MDCs de cada uma das questões, você resolveu escrever
um programa C que recebe os três números como entrada e imprime o MDC correspon-
dente. Além disso, para não ter que executar o programa para cada um dos MDCs a
ser calculado, introduziu a ideia de “casos de teste” que já utiliza frequentemente na dis-
ciplina de Algoritmos e Estruturas de Dados - 1 que está cursando no INF/UFG e que
emprega o Sharif Judge System. Portanto, a primeira linha da entrada conterá o número
t, t ∈ N∗ e t < 100, que corresponde ao número de casos de teste para a execução corrente
do programa. A segunda linha da entrada conterá os três números naturais – a, b e c
– cujo MDC deve ser calculado. Por fim, cada uma das linhas da saída deverá exibir o
MDC obtido para o caso de teste correspondente. Veja alguns exemplos a seguir.

Exemplo 01:

ENTRADA SAÍDA
3 1
3 7 11 2
2 8 16 4
16 40 60

Exemplo 02:

ENTRADA SAÍDA
3 3
126 39 42 1
371 426 187 4
88 172 512

Exemplo 03:

ENTRADA SAÍDA
4 1
1727 142 655 2
462 726 338 2
5638 7726 9826 3
729 243 600

Assim, faça o supramencionado programa e auxilie seu(sua) irmão(irmã) a resolver esses


exercícios, aproveitando para explicar-lhe detalhadamente o que é o MDC e como é que
você o calcula.
Questão 05 (3,0 pontos). Escreva, utilizando a linguagem de programação C, um programa
que possua funções que sejam capazes de realizar as operações a seguir requisitadas sobre
uma Lista Linear Simplesmente Encadeada (LLSE), obrigatoriamente considerando que
as declarações a seguir:

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4
5 #define SUCESSO 1
6 #define FALHA −1
7
8 struct nodo {
9 unsigned int chave;
10 float dado;
11 Apontador prox;
12 } Nodo;
13
14 typedef
15 struct Nodo ∗ Apontador;
16
17 Apontador primLista;

As funções desejadas devem realizar as seguintes operações:

(a) criar uma LLSE inicialmente vazia, sendo que a lista deve ser passada como parâmetro
para a função que, por sua vez, deve retornar SUCESSO ou FALHA;
(b) criar uma LLSE que contenha inicialmente um único nó, sendo que a função deverá
receber como parâmetros a lista a ser criada e o nó já preenchidos com os valores
corretos para os seus campos de chave e dado.

Observação: Deve-se submeter um programa completo, ou seja, com a função main e as


funções solicitadas, com o programa principal permitindo o fornecimento de uma chave
e de dado para o item (b).
Lembre-se: Não há “casos de teste” para esta questão e, por isso, você deverá realizar
testes de funcionamento antes de realizar a submissão de sua resolução no Sharif Judge
System.

Figura 1: Anísio Spínola Teixeira, o inventor da escola pública no Brasil.

Você também pode gostar