Considere o vetor vect abaixo e as operações realizadas com seus elementos.
int vect[SIZE], k;
for ( \mathrm{k}=0; \mathrm{k}< SIZE; \mathrm{k}++ )
vect [ k ] = k;
for ( \mathrm{k}=1; k <SIZE; \mathrm{k}++ )
vect [ k ] += vect[ k - 1 ];
(a) Quantos elementos possui o vetor vect?
(b) Apresente sequencialmente os elementos do vetor vect, após as operações realizadas, com SIZE =10.

Passo 1

O enunciado apresenta um vetor declarado como \text{int vect[SIZE], k;} e dois laços que operam sobre seus elementos:
\text{for }(k=0;\; k<\text{SIZE};\; k++)\; \text{vect}[k] = k;
\text{for }(k=1;\; k<\text{SIZE};\; k++)\; \text{vect}[k] += \text{vect}[k-1];
As perguntas são:
(a) Quantos elementos possui o vetor \text{vect}?
(b) Para \text{SIZE}=10, quais são, em sequência, os elementos de \text{vect} após as duas operações?

Passo 2

Entendendo a declaração do vetor: quando escrevemos \text{int vect[SIZE];} em C, o vetor contém exatamente \text{SIZE} posições. Essas posições são indexadas de 0 até \text{SIZE}-1. Ou seja, os índices válidos são
0,\; 1,\; 2,\; \dots,\; \text{SIZE}-1.
Portanto, a resposta direta para (a) é que o vetor tem \text{SIZE} elementos. Vou detalhar o porquê nos próximos passos para ficar claro na prova.

Passo 3

O primeiro laço inicializa o vetor com
\text{vect}[k] = k\qquad\text{para }k=0,1,\dots,\text{SIZE}-1.
Isso significa que, imediatamente após o primeiro laço, os elementos são
\text{vect}[0]=0,\; \text{vect}[1]=1,\; \text{vect}[2]=2,\; \dots,\; \text{vect}[\text{SIZE}-1]=\text{SIZE}-1.
Para \text{SIZE}=10 isso produz inicialmente a sequência
0,\,1,\,2,\,3,\,4,\,5,\,6,\,7,\,8,\,9.

Passo 4

O segundo laço executa
\text{for }(k=1;\; k<\text{SIZE};\; k++)\; \text{vect}[k] += \text{vect}[k-1],
ou seja, para cada k\ge 1 atualiza-se \text{vect}[k] somando o valor já existente em \text{vect}[k-1]. Como \text{vect}[k-1] já pode ter sido atualizado no passo anterior do laço, o efeito deste laço é transformar cada \text{vect}[k] no somatório dos índices de 0 a k:
\text{vect}[k] = \sum_{i=0}^{k} i.
Uma demonstração rápida por raciocínio (tipo indução): para k=0 temos \text{vect}[0]=0. Suponha que para algum k-1\ge 0 vale \text{vect}[k-1]=\sum_{i=0}^{k-1} i. Então ao executar o passo k do laço:
\text{vect}[k] \leftarrow \text{vect}[k] + \text{vect}[k-1] = k + \sum_{i=0}^{k-1} i = \sum_{i=0}^{k} i.
Portanto a fórmula vale para todo k.

Passo 5

Usando a fórmula fechada para a soma dos primeiros inteiros
\sum_{i=0}^{k} i = \frac{k(k+1)}{2},
podemos calcular cada elemento depois do segundo laço. Vou listar k e \text{vect}[k] (uso \text{SIZE}=10, então k=0,\dots,9):
Para k=0:
\text{vect}[0]=\frac{0\cdot(0+1)}{2}=0.
Para k=1:
\text{vect}[1]=\frac{1\cdot(1+1)}{2}=\frac{2}{2}=1.
Para k=2:
\text{vect}[2]=\frac{2\cdot(2+1)}{2}=\frac{6}{2}=3.
Para k=3:
\text{vect}[3]=\frac{3\cdot4}{2}=\frac{12}{2}=6.
Para k=4:
\text{vect}[4]=\frac{4\cdot5}{2}=\frac{20}{2}=10.
Para k=5:
\text{vect}[5]=\frac{5\cdot6}{2}=\frac{30}{2}=15.
Para k=6:
\text{vect}[6]=\frac{6\cdot7}{2}=\frac{42}{2}=21.
Para k=7:
\text{vect}[7]=\frac{7\cdot8}{2}=\frac{56}{2}=28.
Para k=8:
\text{vect}[8]=\frac{8\cdot9}{2}=\frac{72}{2}=36.
Para k=9:
\text{vect}[9]=\frac{9\cdot10}{2}=\frac{90}{2}=45.
Assim, para \text{SIZE}=10 a sequência final de elementos é
0,\;1,\;3,\;6,\;10,\;15,\;21,\;28,\;36,\;45.

Resposta

(a) \text{SIZE} elementos.
(b) \{0,\,1,\,3,\,6,\,10,\,15,\,21,\,28,\,36,\,45\}

Exercícios relacionados