Você está na página 1de 90

LGICA E INICIALIZAO PROGRAMAO ADVPL

Data (ms/ano) Palestrante / Departamento


1

Processamento de dados
Os problemas que sero resolvidos atravs da programao so baseados no conceito bsico de processamento de dados. As informaes so recebidas pelo programa e so processadas, gerando uma resposta no final. A primeira anlise que devemos fazer para buscar a soluo identificar quais informaes so realmente necessrias (dados de entrada) e quais so as respostas que a soluo pede (dados de sada).

Identificamos ento o processamento de dados por trs etapas:

Entrada, processamento (algoritmo) e sada. Obs.: Todo o programa, independente da sua finalidade, trabalha dessa forma. Ou seja: entrada, processamento e sada.

O primeiro trabalho do programador , a partir do problema proposto, dividir as informaes que sero manipuladas pelo programa em informaes de entrada e sada e determinar, em linhas gerais, quais sero os procedimentos para chegar a soluo do problema. A definio destes procedimentos o que chamamos de Algoritmo, e o processamento a execuo destes procedimentos, que transformam e manipulam os dados de entrada, resultando os dados de sada. Dentre as formas de representao de algoritmos, podemos citar o fluxograma convencional.

Linguagem de programao
Para um programa ser desenvolvido, necessrio que o programador use um programa, que programa? Uma linguagem de programao. Linguagem de programao nada mais do que um programa que permite ao programador criar programas.

Existem duas categorias de linguagem de programao:


Linguagem de baixo nvel. Nesta categoria, o programador trabalha com cdigos complexos, ditos linguagem de mquina. Linguagem de alto nvel. Nesta categoria, o programador trabalha com cdigos mais simples, pois os cdigos so em ingls, ou seja, fica muito mais fcil a compreenso. Exemplos de linguagem de programao: C, C++, Visual basic, Advpl e etc.

Programa fonte e programa executvel.

Quando o programador digita seus programas, ns podemos chamar o mesmo de programa fonte. Obs.: Apenas o programador, analista tem acesso ao programa fonte. Salvo excees. O usurio final ter acesso ao programa executvel. Ou seja, as funcionalidades do sistema em si.

Variveis
Variveis so espaos reservados na memria do computador para armazenar dados durante o processamento do programa. Quando se declara, cria-se a varivel, necessrio definir, quais sero os tipos de dados que a mesma manipular. Por exemplo: numrico, caractere (string, alfanumrico), lgico ou data. Tambm e necessrio informar, se a varivel ser: local, privada, pblica, statica ou global.

O Contexto de Variveis dentro de um Programa


As variveis declaradas em um programa ou funo, so visveis de acordo com o escopo onde so definidas. Como tambm do escopo depende o tempo de existncia das variveis. A definio do escopo de uma varivel efetuada no momento de sua declarao. Local nNumero := 10 Esta linha de cdigo declara uma varivel chamada nNumero indicando que seu escopo local.

Os identifadores de escopo so:

LOCAL STATIC PRIVATE PUBLIC

10

Variveis Locais

Variveis locais so pertencentes apenas ao escopo da funo onde foram declaradas. Devem ser explicitamente declaradas com o identificador LOCAL, como no exemplo: Function Pai() Local nVar := 10, aMatriz := {0,1,2,3} .<comandos> .Filha() .<mais comandos> .Return(.T.)

11

Variveis Locais(Continuao)

Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Quando a execuo da funo Pai terminar, a varivel nVar destruda. Qualquer varivel com o mesmo nome no programa que chamou a funo Pai no afetada.

12

Variveis Locais(Continuao)

Variveis locais so criadas automaticamente cada vez que a funo onde forem declaradas for ativada. Elas continuam a existir e mantm seu valor at o fim da ativao da funo (ou seja, at que a funo retorne o controle para o cdigo que a executou). Se uma funo chamada recursivamente (por exemplo, chama a si mesma), cada chamada em recurso cria um novo conjunto de variveis locais.

13

Variveis Locais(Continuao)

A visibilidade de variveis locais idntica ao escopo de sua declarao. Ou seja, a varivel visvel em qualquer lugar do cdigo fonte em que foi declarada. Se uma funo chamada recursivamente, apenas as variveis locais criadas na mais recente ativao so visveis.

14

Variveis Estticas

Variveis estticas funcionam basicamente como as variveis locais, mas mantm seu valor atravs da execuo. Variveis estticas devem ser declaradas explicitamente no cdigo com o identificador STATIC.

15

Variveis Estticas(Continuao)

O escopo das variveis estticas depende de onde so declaradas. Se forem declaradas dentro do corpo de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem declaradas fora do corpo de qualquer rotina, seu escopo todo o arquivo de programa.

16

Variveis Estticas(Continuao)

Neste exemplo, a varivel nVar declarada como esttica e inicializada com o valor 10: Function Pai() Static nVar := 10 . <comandos> . Filha() . <mais comandos> .Return(.T.)
17

Variveis Estticas(Continuao)

Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente de variveis declaras como LOCAL ou PRIVATE, nVar continua a existir e mantem seu valor atual quando a execuo da funo Pai termina. Entretanto, somente pode ser acessada por execues subseqntes da funo Pai.

18

Variveis Privadas

A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com o identificador PRIVATE.

19

Variveis Privadas(Continuao)

Uma vez criada, uma varivel privada continua a existir e mantem seu valor at que o programa ou funo onde foi criada termine (ou seja, at que a funo onde foi criada retorne para o cdigo que a executou). Neste momento, automaticamente destruda.

20

Variveis Privadas(Continuao)

Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as funes chamadas por esta, a menos que uma funo chamada crie sua prpria varivel privada com o mesmo nome.

21

Variveis Privadas(Continuao)

Por exemplo: Function Pai() Private nVar := 10 . <comandos> . Filha() . <mais comandos> . Return(.T.)
22

Variveis Privadas(Continuao)

Neste exemplo, a varivel nVar criada como privada e inicializada com o valor 10. Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel local, pode ser acessada pela funo Filha. Quando a funo Pai terminar, nVar ser destruda e qualquer declarao de nVar anterior se tornar acessvel novamente.

23

Variveis Pblicas

Pode-se criar variveis pblicas dinamicamente no cdigo com o identificador PUBLIC. As variveis pblicas continuam a existir e mantm seu valor at o fim da execuo.

24

Variveis Pblicas(Continuao)
possvel criar uma varivel privada com o mesmo nome de uma varivel pblica existente. Entretanto, no permitido criar uma varivel pblica com o mesmo nome de uma varivel privada existente.

25

Variveis Pblicas(Continuao)
Uma vez criada, uma varivel pblica visvel em todo o programa onde foi declarada at que seja escondida por uma varivel privada criada com o mesmo nome. A nova varivel privada criada esconde a varivel pblica existente, e esta se tornar inacessvel at que a nova varivel privada seja destruda. Por exemplo:

26

Variveis Pblicas(Continuao)
Function Pai() Public nVar := 10 . <comandos> . Filha() . <mais comandos> . Return(.T.)
27

Variveis Pblicas(Continuao)
Neste exemplo, nVar criada como pblica e inicializada com o valor 10. Quando a funo Filha executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou privadas, nVar ainda existe aps o trmino da a execuo da funo Pai.

28

Variveis Pblicas(Continuao)

Diferentemente dos outros identificadores de escopo, quando uma varivel declarada como pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (nil).

29

Diferenciao entre variveis e nomes de campos

Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo ou tabela aberto no momento. Neste caso, o AdvPl privilegiar o campo. Assim uma referncia a um nome que identifique tanto uma varivel como um campo, resultar no contedo do campo.

30

Diferenciao entre variveis e nomes de campos (Continuao)

Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador de identificao de apelido (->) e um dos dois identificadores de referncia, MEMVAR ou FIELD. cRes := MEMVAR->NOME

31

Diferenciao entre variveis e nomes de campos (Continuao)

Esta linha de comando identifica que o valor atribudo varivel cRes deve ser o valor da varivel de memria chamada NOME. cRes := FIELD->NOME

32

Diferenciao entre variveis e nomes de campos (Continuao)

Neste caso, o valor atribudo varivel cRes ser o valor do campo NOME existente no arquivo ou tabela aberto na rea atual.

33

Diferenciao entre variveis e nomes de campos (Continuao)

O identificador FIELD pode ser substitudo pelo apelido de um arquivo ou tabela aberto, para evitar a necessidade de selecionar a rea antes de acessar o contedo de terminado campo. cRes := CLIENTES->NOME

34

Operadores Comuns

Na documentao sobre variveis h uma breve demonstrao de como atribuir valores a uma varivel da forma mais simples. O AdvPl amplia significativamente a utilizao de variveis atravs do uso de expresses e funes. Uma expresso um conjunto de operadores e operandos cujo resultado pode ser atribudo a uma varivel ou ento analisado para a tomada de decises. Por exemplo:

35

Operadores Comuns(Continuao)

Local nSalario := 1000, nDesconto := 0.10 Local nAumento, nSalLiquido nAumento := nSalario * 1.20 nSalLiquido := nAumento * (1-nDesconto) Neste exemplo so utilizadas algumas expresses para calcular o salrio lquido aps um aumento. Os operandos de uma expresso podem ser uma varivel, uma constante, um campo de arquivo ou uma funo.

36

Operadores Matemticos

Os operadores utilizados em AdvPl para clculos matemticos so: +Adio -Subtrao *Multiplicao /Diviso ** ou ^Exponenciao %Mdulo (Resto da Diviso)

37

Operadores de String

Os operadores utilizados em AdvPl para tratamento de caracteres so: +Concatenao de strings (unio) -Concatenao de strings com eliminao dos brancos finais das strings intermedirias $Comparao de Substrings (contido em)

38

Operadores Relacionais

Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so: < Comparao Menor >Comparao Maior =Comparao Igual ==Comparao Exatamente Igual (para caracteres) <=Comparao Menor ou Igual >=Comparao Maior ou Igual<> ou # ou !=Comparao Diferente

39

Operadores Lgicos

Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so: .And.E lgico .Or.OU lgico .Not. ou !NO lgico

40

Operadores de Atribuio

Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so: =Atribuio Simples :=Atribuio em Linha +=Adio e Atribuio em Linha -=Subtrao e Atribuio em Linha *=Multiplicao e Atribuio em Linha /=Diviso e Atribuio em Linha **= ou ^=Exponenciao e Atribuio em Linha %=Mdulo (resto da diviso) e Atribuio em Linha

41

Atribuio Simples

O sinal de igualdade utilizado para atribuir valor a uma varivel de memria. nVariavel = 10

42

Atribuio em Linha

O operador de atribuio em linha caracterizado por dois pontos e o sinal de igualdade. Tem a mesma funo do sinal de igualdade sozinho, porm aplica a atribuio s variveis. Com ele pode-se atribuir mais de uma varivel ao mesmo tempo. nVar1 := nVar2 := nVar3 := 0.

43

Atribuio em Linha(Continuao)
Quando diversas variveis so inicializadas em uma mesma linha, a atribuio comea da direita para a esquerda, ou seja, nVar3 recebe o valor zero inicialmente, nVar2 recebe o contedo de nVar3 e nVar1 recebe o contedo de nVar2 por final.

44

Atribuio em Linha(Continuao)
Com o operador de atribuio em linha, pode-se substituir as inicializaes individuais de cada varivel por uma inicializao apenas: Local nVar1 := 0, nVar2 := 0, nVar3 := 0 por Local nVar1 := nVar2 := nVar3 := 0

45

Atribuio em Linha(Continuao)
O operador de atribuio em linha tambm pode ser utilizado para substituir valores de campos em um banco de dados.

46

Atribuio Composta

Os operadores de atribuio composta so uma facilidade da linguagem AdvPl para expresses de clculo e atribuio. Com eles pode-se economizar digitao:

47

Atribuio Composta(Continuao)
Operador += -= *= Exemplo X+=Y X-=Y X*=Y Equivalente a X=X+Y X=X-Y X=X*Y

/=
**=OU ^= %=

X/=Y
X**=Y X%=Y

X=X/Y
X=X**Y X=X%Y
48

Operadores de Incremento/Decremento

A linguagem AdvPl possui operadores para realizar incremento ou decremento de variveis. Entende-se por incremento aumentar o valor de uma varivel numrica em 1 e entende-se por decremento diminuir o valor da varivel em 1. Os operadores so: ++Incremento Ps ou Pr-fixado --Decremento Ps ou Pr-fixado

49

Operadores de Incremento/Decremento (Continuao)


Os operadores de decremento/incremento podem ser colocados tanto antes (pr-fixado) como depois (psfixado) do nome da varivel. Dentro de uma expresso, a ordem do operador muito importante, podendo alterar o resultado da expresso. Os operadores incrementais so executados da esquerda para a direita dentro de uma expresso. Local nA := 10 Local nB := nA++ + nA

50

Operadores de Incremento/Decremento (Continuao)


O valor da varivel nB resulta em 21, pois a primeira referncia a nA (antes do ++) continha o valor 10 que foi considerado e imediatamente aumentado em 1. Na segunda referncia a nA, este j possua o valor 11. O que foi efetuado foi a soma de 10 mais 11, igual a 21. O resultado final aps a execuo destas duas linhas a varivel nB contendo 21 e a varivel nA contendo 11. No entanto: Local nA := 10 Local nB := ++nA + nA Resulta em 22, pois o operador incremental aumentou o valor da primeira nA antes que seu valor fosse considerado.
51

Operadores Especiais

Alm dos operadores comuns, o AdvPl possui alguns outros operadores ou identificadores. Estas so suas finalidades:

52

Operadores Especiais (Continuao) () [] {} -> & @ || Agrupamento ou funo. Elemento de matriz. Definio de matriz, constante ou bloco de cdigo. Identificador de apelido. Macrosubstituio. Passagem de parmetros por referncia. Passagem de parmetro por valor.
53

Operadores Especiais (Continuao)


Os parnteses so utilizados para agrupar elementos em uma expresso mudando a ordem de precedncia da avaliao da expresso (segundo as regras matemticas por exemplo). Tambm servem para envolver os argumentos de uma funo. Os colchetes so utilizados para especificar um elemento especfico de uma matriz. Por exemplo, A[3,2], refere-se ao elemento da matriz A na linha 3, coluna 2.

54

Operadores Especiais (Continuao)


As chaves so utilizadas para a especificao de matrizes literais ou blocos de cdigo. Por exemplo, A:={10,20,30} cria uma matriz chamada A com trs elementos. O smbolo -> identifica um campo de um arquivo diferenciando-o de uma varivel. Por exemplo, FUNC->nome refere-se ao campo nome do arquivo FUNC. Mesmo que exista uma varivel chamada nome, o campo nome que ser acessado.

55

Operadores Especiais (Continuao)


O smbolo & identifica uma avaliao de expresso atravs de macro e visto em detalhes na documentao sobre macrossubstituio. O smbolo @ utilizado para indicar que durante a passagem de uma varivel para uma funo ou procedimento ela seja tomada como uma referncia e no como valor. O smbolo || utilizado para indicar que durante a passagem de uma varivel para uma funo ou procedimento ela seja tomada como um e valor no como referncia.

56

Ordem de Precedncia dos Operadores

Dependendo do tipo de operador, existe uma ordem de precedncia para a avaliao dos operandos. Em princpio, todas as operaes com os operadores, so realizadas da esquerda para a direita se eles tiverem o mesmo nvel de prioridade. A ordem de precedncia, ou nvel de prioridade de execuo, dos operadores em AdvPl : Operadores de Incremento/Decremento pr-fixado Operadores de String Operadores Matemticos Operadores Relacionais Operadores Lgicos Operadores de Atribuio Operadores de Incremento/Decremento ps-fixado
57

Ordem de Precedncia dos Operadores (Continuao)

Em expresses complexas com diferentes tipos de operadores, a avaliao seguir essa seqncia. Caso exista mais de um operador do mesmo tipo (ou seja, de mesmo nvel), a avaliao se d da esquerda para direita. Para os operadores matemticos entretanto, h uma precedncia a seguir: Exponenciao Multiplicao e Diviso Adio e Subtrao

58

Ordem de Precedncia dos Operadores (Continuao)

Considere o exemplo: Local nResultado := 2+10/2+5*3+2^3 O resultado desta expresso 30, pois primeiramente calculada a exponenciao 2^3(=8), ento so calculadas as multiplicaes e divises 10/2(=5) e 5*3(=15), e finalmente as adies resultando em 2+5+15+8(=30).

59

Alterao da Precedncia

A utilizao de parnteses dentro de uma expresso altera a ordem de precedncia dos operadores. Operandos entre parnteses so analisados antes dos que se encontram fora dos parnteses. Se existirem mais de um conjunto de parnteses no-aninhados, o grupo mais a esquerda ser avaliado primeiro e assim sucessivamente.

60

Alterao da Precedncia (Continuao)


Local nResultado := (2+10)/(2+5)*3+2^3 No exemplo acima primeiro ser calculada a exponenciao 2^3(=8). Em seguida 2+10(=12) ser calculado, 2+5(=7) calculado, e finalmente a diviso e a multiplicao sero efetuadas, o que resulta em 12/7*3+8(=13.14). Se existirem vrios parnteses aninhados, ou seja, colocados um dentro do outro, a avaliao ocorrer do parnteses mais intero em direo ao mais externo.

61

Expresses
O termo expresso significa um dado ou uma combinao de dois ou mais dados de qualquer tipo. Vamos abordar quatro tipos de dados: Tipo caractere: Formado por qualquer conjunto de caracteres que constam na tabela Ascii, sempre representado entre aspas. Tipo numrico: Formado por valores negativos, positivos ou iguais a zero, especificamente usado para operaes matemticas. Tipo lgico: Existem apenas dois dados possveis: verdadeiro (.T.) ou falso (.F.), sempre intercalados por ponto. Tipo data: Aceitam apenas datas coerentes, ou seja, a data checada quanto a durao do ms (28, 29, 30 ou 31) e a existncia do ms (1 a 12). Tipo memo: Aceita textos de at 64 kb.
62

Instrues

Instruo tudo aquilo que ordenado ao sistema, esperando-se que o mesmo realize imediatamente uma operao.

63

Diferenas entre Comando e Funo

As instrues dividem-se em duas modalidades: comando e funo. Os conceitos abaixo so muito importantes para que se possa compreender as diferenas entre os dois. Comando: uma instruo que executa uma tarefa; Funo: uma instruo que pode receber um ou mais argumentos. Executa um processamento e devolve uma expresso.

64

Banco de dados

Ns podemos dizer que banco de dados um conjunto de informaes armazenadas de maneira organizada. Por exemplo. Imagine que uma empresa de materiais de construes deseja ter, a carteira de fornecedores e produtos que os mesmos fornecem, de uma maneira organizada e de fcil acesso para: incluses, consultas, alteraes; e excluses. Para resolver este problema, ns poderamos criar um banco de dados com duas tabelas. Uma para armazenar apenas as informaes dos fornecedores, tais como: Nome, endereo, contato, cdigo do fornecedor e etc...

65

Banco de dados (Continuao)


A outra tabela, seria para armazenar as informaes dos produtos, tais como: Data da validade do produto, nome do produto (descrio), unidade, preo unitrio e etc. A seguir, seria criado um relacionamento entre as tabelas e desta maneira, seu eu precisar saber quais produtos um fornecedor me fornece, com o banco de dados seria muito mais simples e rpido. Obs.: Quando o programador, cria um programa, o mesmo precisa vincular o mesmo, a um banco de dados, de modo que os dados gerados ou informados pelo programa, fiquem armazenados.

66

Estruturas de controle

As estruturas de controle so fundamentais em qualquer linguagem de programao. atravs das mesmas que se controlam: quantas vezes uma determinada rotina dever ser executada, que caminho o programa dever seguir, seguindo condies estabelecidas pelo programa e etc....

67

Estruturas de controle (Continuao)


As principais so: If, While, For, Case e etc... If (se) Else ( Se no) Endif (Fim se) Toda vez que for usada o If, dever ser usado o EndIf. possvel ter vrios If dentro do outro. Porm, no se esquea, se voc abrir trs If, dever usar o EndIf trs vezes.

68

Estruturas de controle (Continuao)


Exemplos: 1 e 2.

69

While / EndDo

While(Enquanto) O cdigo que estiver abaixo do While, ser executado enquanto a condio dentro o mesmo for verdadeira.
Exemplo User Function TesteWhile() Local nCnt:=1 Local aX While nCnt<=10 nCnt:=nCnt * nCnt MsgAlert(nCnt) nCnt++ Enddo Return()

70

For

For (Para) Next O Cdigo que estiver dentro do For ser executado por um nmero determinado de vezes.

71

For (Continuao)
Exemplo 1 User Function TFor() nI:=0 For nI:=1 to 5 MsgAlert(nI) Next Return()

72

For (Continuao) Obs.: Na estrutura For, quando o fluxo executado pela segunda vez, a varivel inicial, que no nosso exemplo nI, fica valendo dois, na terceira, trs e assim por diante, no precisa usar nI++. Porm, se for necessrio que o incremento no seja de um em um pode ser usado o Step. O Step pode ser usado tanto para incrementar o contador como o contrrio.

73

For (Continuao)
Exemplo 2 User Function TFor2() nI:=0 For nI:=1 to 5 Step 2

MsgAlert(nI) Next Return()

74

For (Continuao)
Exemplo 3 User Function TFor2() nI:=0 For nI:=1 to 5 Step 2 MsgAlert(nI) Next Return()

75

For (Continuao)
Exemplo 4 User Function TFor3() nI:=0 For nI:=5 to 1 Step -2 MsgAlert(nI) Next Return()

76

Indentao

Todo programa, deve estar muito bem documentado. Desta forma, facilita o entendimento para quem for analisar o cdigo e at mesmo para fazer ajustes no mesmo. Tambm muito importante que o programa seja indentado. Desta forma, fica muito mais fcil de analisar o mesmo.

77

Indentao (Continuao)
Veja este exemplo sem indentao e a seguir, com. If nN1>nN2 MsgAlert("O numero " + AllTrim(Str(nN1) + " e maior que " + AllTrim(Str(nN2)))) Else MsgAlert("O numero " + AllTrim(Str(nN2) + " e maior que " + AllTrim(Str(nN1)))) EndIf

78

Indentao (Continuao) If nN1>nN2


MsgAlert("O numero " + AllTrim(Str(nN1) + " e maior que " + AllTrim(Str(nN2))))

Else
MsgAlert("O numero " + AllTrim(Str(nN2) + " e maior que " + AllTrim(Str(nN1))))

EndIf

79

Funes Algumas funes


SRT Converte nmero em caractere. SQRT Calcula a raiz quadrada do nmero ou varivel informada como parmetro. ALLTRIM Tira todos os espaos em branco.

80

Desenhando telas

Exemplo Define MSDialog oDlg Title "Consulta de Produtos" From 0,0 To 200,500 Pixel Activate MSDialog oDlg Centered

81

Iniciao de Programas em ADVPL (Algoritmo)


Exerccio 01 Crie uma funo para solucionar o seguinte problema. Desenvolva uma funo que calcule a mdia de trs notas.

82

Iniciao de Programas em ADVPL (Algoritmo) (Continuao) Exerccio 02 Desenvolva uma funo que calcule a raiz quadrada do nmero 49.

83

Iniciao de Programas em ADVPL (Algoritmo) (Continuao) Exerccio 03 Agora, use a funo anterior como base, e calcule a raiz quadrada do nmero digitado pelo usurio.

84

Iniciao de Programas em ADVPL (Algoritmo) (Continuao) Exerccio 04 Desenvolva uma funo que calcule a tabuada do nmero 2.

85

Iniciao de Programas em ADVPL (Algoritmo) (Continuao) Exerccio 05 Desenvolva uma funo que calcule a tabuada do nmero desejado (informado).

86

Iniciao de Programas em ADVPL (Algoritmo) (Continuao) Agora, desenvolva quatro programas: Incluso, Consulta, Alterao e Excluso. O objetivo principal destes exerccios : colocar em prtica o que foi apresentado na teoria, e alimentar o SZ6.

87

Questes.

88

Prximo passo.

89

Advpl.

90

Você também pode gostar