DSC/CCT/UFCG
[email protected]
Profs.: José Eustáquio Rangel de Queiroz
Roberto Medeiros de Faria
Carga Horária: 60 h
DSC/CCT/UFCG
Introdução à Programação
[email protected] [email protected]
Tópicos
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
Introdução
Algoritmos
Pseudocódigo
Estruturas de Controle
Estrutura de Seleção If
Estrutura de Seleção If/Else
Estrutura de Repetição While
Formulação de Algoritmos: Estudo de Caso 1
(Repetição Controlada por Contador)
Formulação de Algoritmos com Refinamento Topdown por Passos: Estudo de Caso 2 (Repetição
Controlada por Sentinela)
2
DSC/CCT/UFCG
Introdução à Programação
[email protected] [email protected]
Tópicos
3.10 Formulação de Algoritmos com Refinamento Topdown: Estudo de Caso 3 (Estruturas de Controle
Aninhadas)
3.11 Operadores de Atribuição
3.12 Operadores de Incremento e Decremento
3
3.1 Introdução
DSC/CCT/UFCG
[email protected] [email protected]
 Precauções antes da escrita de um programa

Visão sinóptica do problema

Planejamento cuidadoso de uma estratégia para
solução do problema
 Precauções durante a escrita de um programa
dos
“blocos
de
construção”

Conhecimento
disponíveis

Uso de princípios adequados de programação
4
3.2
Algoritmos
DSC/CCT/UFCG
 Computação de Problemas
 Todos os problemas podem ser solucionados a
partir da execução de uma série de ações em uma
ordem específica
[email protected] [email protected]
 Algoritmo
 Procedimento em termos de

Ações a serem executadas

Ordem na qual as ações devem ser executadas
 Controle do Programa
 Specificação da ordem na qual as declarações
devem ser executadas
5
DSC/CCT/UFCG
[email protected] [email protected]
 Pseudocódigo
3.3
Pseudocódigo

Linguagem artificial e informal que auxilia o
programador a desenvolver algoritmos

Similar ao Português cotidiano

Não executada em computadores

Suporte para a análise de um programa antes de
sua escrita

Facilidade de codificação em uma linguagem de
programação (e.g. C/C++, Java)

Composição a partir de declarações executáveis
6
DSC/CCT/UFCG
3.4
Estruturas
Controle
de
 Execução Seqüencial

Declarações executadas uma após a outra, na
ordem pré-definida (na escrita)
[email protected] [email protected]
 Transferência de Controle

Quando a próxima declaração executada não é a
seguinte na seqüência

Uso excessivo de declarações goto conduz a
muitos problemas (código spaghetti)
7
DSC/CCT/UFCG
3.4
Estruturas
Controle
de
 Bohm & Jacopini

Todos os programas escritos em termos de 3
estruturas de controle

Estruturas Seqüenciais
[email protected] [email protected]

Por default, programas executados seqüencialmente
(como ocorre em C)

Estruturas de Seleção
 Há três tipos em C: if, if/else e switch

Estruturas de Repetição
 Há três tipos em C: while, do/while e for
8
DSC/CCT/UFCG
3.4
Estruturas
Controle
de
[email protected] [email protected]
 Diagrama de Fluxo (Flowchart)

Representação gráfica de um algoritmo

Uso de símbolos especiais conectados por setas
denominadas linhas de fluxo (flowlines)

Retângulo (ação)


Indicação de algum tipo de ação
Incrementar j
Oval

Indicação do início ou término de um programa ou
uma seção de código
Início
9
DSC/CCT/UFCG
3.4
Estruturas
Controle
de
 Estruturas de controle única entrada/ única
[email protected] [email protected]
saída

Conexão da saída de uma estrutura de controle à
entrada da estrutura seguinte (empilhamento de
estruturas de controle)

Facilidade de construção de programas
10
DSC/CCT/UFCG
3.5 Estrutura de Seleção
if
 Estrutura de Seleção
Uso
na escolha entre cursos de ação alternativos
[email protected] [email protected]
Exemplos
em pseudocódigo
1. Se a média final do aluno for maior ou igual a 7
Imprima “Você passou por média”
2. Se o raio for menor do que 3 ou maior ou igual a 6
Faça raio igual a 5
3. Se o nome for diferente de RAQUEL
Encerre o programa
11
3.5 Estrutura de Seleção
if
DSC/CCT/UFCG
 Estrutura de Seleção
Análise

Condição Verdadeira
[email protected] [email protected]


Execução da declaração imprima “Você passou por
média” e prosseguimento do programa a partir da
próxima declaração
Condição Falsa


do Exemplo 1
Declaração imprima “Você passou por média”
ignorada e prosseguimento do programa a partir da
próxima declaração
Adentação facilita a leitura de programas

C ignora espaços em branco
12
DSC/CCT/UFCG
3.5 Estrutura de Seleção
if
 Estrutura de Seleção

Declaração do Exemplo 1 em C
if(media_final >= 7)
printf(“Você passou por média\n");
[email protected] [email protected]


Código em C apresenta
próxima ao pseudocódigo
uma
representação
Losango (decisão)

Indicação de que uma decisão deve ser tomada

Continência de uma expressão que pode ser
Verdadeira ou Falsa

Teste da condição

Seleção do caminho apropriado
Média final ≥ 7
F
?
V
13
DSC/CCT/UFCG
3.5 Estrutura de Seleção
if
 A estrutura de seleção
if é uma estrutura do
[email protected] [email protected]
tipo única entrada / única saída
Média final ≥ 7
?
V
F
Uma decisão pode ser tomada
em qualquer expressão
zero - Falsa
diferente de zero - Verdadeira
Imprimir
“V. passou por média”
14
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
 If

Só executa uma ação se a condição testada for
Verdadeira
[email protected] [email protected]
 If/Else

Especifica um par de ações a serem executadas,
uma caso a condição testada seja Verdadeira,
outra caso esta seja Falsa
15
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
 If/Else
Exemplo
em pseudocódigo
[email protected] [email protected]
Se a média final do aluno for maior ou igual a 7,0
Imprima “Você passou por média”
Caso contrário
Imprima “Você vai para a final ou foi reprovado
por
média”
Observe que a adentação/
espaçamento facilita a leitura
do pseudocódigo, o mesmo
ocorrendo mais efetivamente
com o código em qualquer
linguagem de programação
escolhida
16
3.6 Estrutura de Seleção ifelse
DSC/CCT/UFCG
 If/Else
[email protected] [email protected]
Código
em C
if(media_final >= 7)
printf(“Você passou por média\n");
else
printf("Você vai para a final ou foi reprovado por
média\n");
Operador

condicional ternário ? :
Uso de três argumentos

condição ? valor1 se verdadeira : valor2 se falsa
17
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
 If/Else
Código
em C com ? :
[email protected] [email protected]
media_final >= 7 ? printf(“Você passou por média\n”) :
printf(“Você vai para a final ou foi reprovado por média \n”);
ou
printf("%s\n", media_final >= 7 ? "Você passou por média" :
"Você vai para a final ou foi reprovado por média" );
18
3.6 Estrutura de Seleção ifelse
DSC/CCT/UFCG
 Diagrama de fluxo da estrutura If/Else
[email protected] [email protected]
Média final ≥ 7
?
F
V
Imprimir
“V. passou por média”
Estruturas

Imprimir
“V. vai para a final ou
foi reprovado por média”
If/Else aninhadas
Teste para casos múltiplos  Inserção de estruturas
de seleção If/Else em uma estrutura de seleção If/Else
19
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
Pseudocódigo para uma estrutura If/Else
[email protected] [email protected]
aninhada
Se nota for maior ou igual a 9,0
Imprima “Conceito A”
Caso contrário
Se nota for maior ou igual a 8,0 e menor do que 9,0
Imprima “Conceito B”
Caso contrário
Se nota for maior ou igual a 7,0 e menor do que 8,0
Imprima “Conceito C”
Caso contrário
Se nota for maior ou igual a 6,0 e menor do que 7,0
Imprima “Conceito D”
Caso contrário
Imprima “Conceito I”
20
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
[email protected] [email protected]
 Atribuição Composta

Série de atribuições encerradas por um par de
chaves ({ })

Exemplo
if ( media_final >= 7 )
printf( “Você passou por média\n" );
else
{
printf( “Se sua soma de notas for maior do que 12,5, você
vai para a final\n" );
printf(“Caso contrário, você foi reprovado\n");
}
21
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
 Atribuição Composta

Análise do exemplo
 Sem
as chaves, a declaração
[email protected] [email protected]
printf(“Caso contrário, você foi reprovado\n");
seria executada automaticamente
 Com
as chaves, a referida declaração só será executada
se o if for falso
22
DSC/CCT/UFCG
3.6 Estrutura de Seleção ifelse
 Blocos

Atribuições compostas por declarações
 Erros de Sintaxe
[email protected] [email protected]

Percebidos e acusados pelo compilador
 Erros Lógicos

Exercem influência no tempo de execução do
programa
 Não

fatais
Execução do programa  Saída incorreta
 Fatais
 Encerramento
prematuro do programa
23
DSC/CCT/UFCG
3.7 Estrutura de Repetição
while
 Estrutura de Repetição
 Especificação de uma ação a ser repetida
enquanto uma dada condição permanecer
[email protected] [email protected]
Verdadeira
 Exemplo de pseudocódigo
Enquanto houver itens no carrinho de compras
Retire um item e adicione seu preço ao somatório de
itens já computados
 O laço while será repetido até que a condição
imposta se torne falsa
24
DSC/CCT/UFCG
3.7 Estrutura de Repetição
while
Exemplo
while(item > 0) {
item = item -1;
total_a_pagar = total_a_pagar + custo_item;
[email protected] [email protected]
}
Retire um item e
adicione seu preço ao
total a pagar
Item > 0
?
V
F
25
DSC/CCT/UFCG
3.8
Formulação
Algoritmos I
de
[email protected] [email protected]
 Repetição controlada por contador

Laço repetido até que o contador atinja um
determinado
limiar
(pré-definido
pelo
programador)

Repetição Delimitada  Número de repetições é
conhecido

Exemplo

Uma turma com 40 alunos fez uma prova. As
notas da prova (números reais com uma casa
decimal, na faixa de 0,0 a 10,0) estão disponíveis.
Determinar a média da turma na referida prova.
26
DSC/CCT/UFCG
3.8
Formulação
Algoritmos I
de
 Repetição controlada por contador
[email protected] [email protected]

Exemplo de Pseudocódigo
Faça total igual a zero
Faça o contador de notas igual a um
Enquanto o contador de notas for menor ou igual a 40
Pegue uma nota
Adicione a nota ao total
Adicione um ao contador de notas
Determine a média da turma dividindo total por 40
Imprima a média da turma
27
DSC/CCT/UFCG
3.8
Formulação
Algoritmos I
de
[email protected] [email protected]
 Repetição controlada por contador
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Programa 01 - Média de uma turma
de 40 alunos usando repetição
controlada por contador */
#include <stdio.h>
int main()
{
int contador, nota, total, media;
/* fase de inicialização */
total = 0;
contador = 1;
/* fase de processamento */
while (contador <= 40) {
printf(“Digite nota: ");
scanf("%d", &nota);
total = total + nota;
contador = contador + 1;
}
22 /* fase de conclusão */
23 media = total / 40;
24 printf(“A média da turma é %d\n", media);
25
26 return 0; /* indica que o programa
terminou satisfatoriamente */
27 }
Exemplo de Saída
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
9,8
6,4
7,7
9,2
5,8
3,9
5,1
9,3
8,3
2,8
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
Digite nota:
9,7
8,8
8,5
5,9
6,8
7,8
8,8
9,1
9,4
4,8
Digite nota: 1,8 Digite nota: 9,7
Digite nota: 2,8 Digite nota: 7,8
Digite nota: 3,5 Digite nota: 5,1
Digite nota: 7,0 Digite nota: 6,3
Digite nota: 6,1 Digite nota: 7,0
Digite nota: 5,8 Digite nota: 7,2
Digite nota: 9,0 Digite nota: 2,9
Digite nota: 7,3 Digite nota: 3,8
Digite nota: 7,5 Digite nota: 8,9
Digite nota: 8,2 Digite nota: 6,6
A média da turma foi 6,8
28
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Algoritmos com Refinamento Top-Down por
Passos
[email protected] [email protected]

Delineamento do Problema sobre o Exemplo
Anterior

Desenvolvimento de um programa para a
determinação da média de uma turma,
considerando que o programa processará um
número arbitrário de notas cada vez que for
executado

Número desconhecido de alunos

Como o programa será finalizado?
29
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Algoritmos com Refinamento Top-Down por
Passos (Stepwise)

Solução do Problema
[email protected] [email protected]

Uso de um valor “sentinela”

Também denominado valor de sinalização, testade-ferro, dummy value ou flag

Indicação do final da entrada de dados

Laço finalizado quando o usuário passa para o
programa o valor “sentinela”

Valor sentinela não deve ser confundido com uma
entrada regular (e.g. -1 no caso do programa da
média das notas)
30
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Refinamento Top-Down por Passos

Representação
pseudocódigo
do
topo
(top)
em
[email protected] [email protected]
Determine a média da turma

Divisão do topo em tarefas menores e
listagem ordenada das tarefas
Inicialize as variáveis
Receba as notas digitadas, some-as e conte-as
Calcule e imprima a média da turma
31
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Fases de diversos programas

Initialização
[email protected] [email protected]


Processamento


Fase na qual são atribuídos valores iniciais
às variáveis do programa
Fase de aquisição dos valores dos dados de
entrada e de manipulação apropriada das
variáveis do programa
Finalização

Fase de cálculo e impressão dos resultados
finais
32
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Refinamento da Fase de Inicialização
Inicialize as variáveis
Inicialize total com zero
[email protected] [email protected]
Inicialize contador com zero
 Refinamento da 2ª linha do pseudocódigo
Receba as notas digitadas, some-as e conte-as
Receba a primeira nota (que poderá ser a “sentinela”)
Enquanto o usuário não digitar o valor “sentinela”
Adicione esta nota a total
Adicione um a contador
Receba a próxima nota (que poderá ser a “sentinela”)
33
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Refinamento da 3ª linha do pseudocódigo
Calcule e imprima a média da turma
[email protected] [email protected]
Se contador for diferente de zero
Calcule média dividindo total por contador
Imprima média
Caso contrário
Imprima “Nenhuma nota foi digitada”
34
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
[email protected] [email protected]
 Repetição controlada por sentinela
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Programa 02 – Média de uma turma
com
repetição
controlada
por
sentinela */
#include <stdio.h>
int main()
{
float media;
/* novo tipo de dados */
int contador, nota, total;
/* fase de inicialização */
total = 0;
contador = 0;
/* fase de processamento */
printf( “Digite nota, -1 ao final: " );
scanf( "%d", &nota );
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
while ( nota != -1 ) {
total = total + nota;
contador = contador + 1;
printf( “Digite nota, -1 ao final: " )
scanf( "%d", &nota );
}
/* fase de finalização */
if ( contador != 0 ) {
media = ( float ) total / contador;
printf( “A média da turma é %.2f", media );
}
else
printf( "Nenhuma nota foi digitada\n" );
return 0; /* indica que o
terminou satisfatoriamente */
programa
35 }
35
DSC/CCT/UFCG
3.9
Formulação
Algoritmos II
de
 Repetição controlada por sentinela
[email protected] [email protected]
Exemplo de Saída
Digite nota: 5,8 Digite nota: 9,3
Digite nota: 6,1 Digite nota: 7,8
Digite nota: 7,2 Digite nota: 7,1
Digite nota: 8,2 Digite nota: 6,8
Digite nota: 5,5 Digite nota: 6,1
Digite nota: 8,9 Digite nota: 6,9
Digite nota: 5,8 Digite nota: 6,0
Digite nota: 7,3 Digite nota: 9,5
Digite nota: 8,8 Digite nota: 5,4
Digite nota: 9,8 Digite nota: 7,8
Digite nota: 9,0 Digite nota: 7,0
Digite nota: 8,8 Digite nota: 7,8
Digite nota: 8,2 Digite nota: 1,2
Digite nota: 6,9 Digite nota: 9,0
Digite nota: 4,0 Digite nota: 8,9
Digite nota: 6,5 Digite nota: 5,3
Digite nota: 4,5 Digite nota: 4,8
Digite nota: 5,8 Digite nota: 7,5
Digite nota: 7,1 Digite nota: 9,5
Digite nota: 7,7 Digite nota: -1
A média da turma é 7,0
Situação totalizando 39
notas (observe a última
entrada do usuário, -1)
36
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
[email protected] [email protected]
 Problema

Em uma universidade privada, seja uma lista com
os resultados de uma prova aplicada em uma
turma de 30 alunos, na qual atribui-se 1 a cada
aluno aprovado e 2 a cada aluno reprovado

Escrever um programa que analise os resultados

Se mais de 25 alunos forem aprovados, deverá ser
comunicado à turma o aumento da mensalidade
em 10% (face ao êxito do ensino)
37
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Comentários

Processamento de 30 resultados de teste pelo
programa escrito
[email protected] [email protected]


Uso de dois contadores


Uso de um laço controlado por contador
Um para o número de aprovados, outro para o
número de reprovados
Cada resultado testado é um número - 1 ou 2

Se o número for diferente de 1, dever-se-á
considerar que este é igual a 2
38
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Delineamento do nível de topo
Analise os resultados da prova e decida se a mensalidade
deve ser aumentada em 10%
 1º Refinamento do pseudocódigo
[email protected] [email protected]
Inicialize variáveis
Receba os 30 valores e conte as aprovações e reprovações
Imprima um sumário dos resultados da prova e decida se a
mensalidade deve ser aumentada em 10%
 Refinamento da 1ª linha
Inicialize aprovados com zero
Inicialize reprovados com zero
Inicialize contalunos com um
39
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Refinamento da 2ª linha
Enquanto contalunos for menor ou igual a 30
Receba o próximo resultado da prova
Se o aluno foi aprovado
[email protected] [email protected]
Adicione um a aprovados
caso contrário
Adicione um a reprovados
Adicione um a contalunos
40
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Refinamento da 3ª linha
Imprima o número de aprovados
Imprima o número de reprovados
[email protected] [email protected]
Se mais de 25 alunos tiverem sido aprovados
Imprima “A mensalidade será aumentada em 10%”
41
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Estruturas de Controle Aninhadas
1 /* Programa 03 - Análise dos resultados
[email protected] [email protected]
*/
3 #include <stdio.h>
4
5 int main()
6 {
7 /*initialização de variáveis em declarações*/
8 int aprovados = 0, reprovados = 0,
contalunos = 1, resultado;
9
10
11
12
13
14
15
16
17
18
/*loop controlado por contador para
processamento de 30 alunos*/
while (contalunos <= 30) {
printf(“Digite resultado ( 1 = aprovado,
2 = reprovado ): ");
scanf("%d", &resultado);
if ( resultado == 1 ) /*if/else aninhado no
while*/
aprovados = aprovados + 1;
else
reprovados = reprovados + 1;
19
20
21
22
23
24
25
26
27
contalunos = contalunos + 1;
}
printf( “Aprovados %d\n", aprovados );
printf( “Reprovados %d\n", reprovados );
if ( aprovados > 25 )
printf( “A mensalidade será”
“aumentada em 10%\n" );
28
29 return 0; /* finalização satisfatória */
30 }
42
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Estruturas de Controle Aninhadas
[email protected] [email protected]
Exemplo de Saída
Digite resultado:
Digite resultado:
Digite resultado:
Digite resultado:
Digite resultado:
Digite resultado:
Digite resultado:
Digite resultado:
Digite resultado:
1
1
2
1
1
1
1
1
2
Digite resultado : 1
Digite resultado : 1
Digite resultado : 1
Digite resultado : 1
Digite resultado : 2
Digite resultado : 1
Digite resultado : 1
Digite resultado : 2
Digite resultado : 1
Digite resultado: 2
Digite resultado: 1
Digite resultado: 1
Digite resultado: 2
Digite resultado: 1
Digite resultado: 1
Digite resultado: 1
Digite resultado: 2
Digite resultado: 1
Aprovados: 23
Reprovados: 7
43
DSC/CCT/UFCG
3.10
Estruturas
Aninhadas
de
Controle
 Comentários

Processamento de 30 resultados de teste pelo
programa escrito
[email protected] [email protected]


Uso de dois contadores


Uso de um laço controlado por contador
Um para o número de aprovados, outro para o
número de reprovados
Cada resultado testado é um número - 1 ou 2

Se o número for diferente de 1, dever-se-á
considerar que este é igual a 2
44
DSC/CCT/UFCG
3.11
Operadores
Atribuição
de
 Operadores de Atribuição  Abreviação de
expressões de atribuição

Exemplo em C
c = c + 3;
[email protected] [email protected]

Abreviação a partir do operador de atribuição de
adição
c += 3;
 Forma de atribuição
variável = expressão do operador de variável;
 Re-escrita
operador de variável = expressão;
45
DSC/CCT/UFCG
3.11
Operadores
Atribuição
de
[email protected] [email protected]
 Exemplos de outros operadores de atribuição
d -= 4
(d = d - 4)
e *= 5
(e = e * 5)
f /= 3
(f = f / 3)
g %= 9
(g = g % 9)
46
DSC/CCT/UFCG
3.12 Operadores
Incremento/Decremento
de
 Operador de Incremento (++)

Uso em substituição de +=1
[email protected] [email protected]
 Operador de Decremento (--)

Uso em substituição de -=1
 Pré-incremento/ Pré-decremento

Operador usado antes da variável ( ++c ou --c)

Variável alterada (incrementada/decrementada)
antes da avaliação da expressão
47
DSC/CCT/UFCG
3.12 Operadores
Incremento/Decremento
de
[email protected] [email protected]
 Pós-incremento/Pós-decremento

Operador usado após da variável (c++ ou c--)

Expressão executada antes da
(incremento/decremento) da variável
alteração
 Se c igual a 5
printf( "%d", ++c );

Imprimirá 6
printf( "%d", c++ );

Imprimirá 5

Em todo caso, c assume agora o valor 6
48
DSC/CCT/UFCG
3.12 Operadores
Incremento/Decremento
de
 Quando a variável não está numa expressão
[email protected] [email protected]
 Pré-incremento e pós-incremento apresentam
mesmo efeito
++c;
printf( “%d”, c );

Apresenta o mesmo efeito de
c++;
printf( “%d”, c );
49
DSC/CCT/UFCG
José Eustáquio Rangel de Queiroz
Roberto Medeiros de Faria
UNIVERSIDADE FEDERAL DE CAMPINA GRANDE
CENTRO DE CIÊNCIAS E TECNOLOGIA
[email protected]
DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO
Download

Kein Folientitel - Computação UFCG