Prévia do material em texto
<p>Revisão: Programação de</p><p>Computadores</p><p>Algoritmos e Estruturas de Dados</p><p>Prof. Virgílio Borges de Oliveira</p><p>virgilio@cotemig.com.br</p><p>Compiladores</p><p> Um compilador é basicamente um programa que traduz</p><p>um texto de programa escrito em alguma linguagem</p><p>denominada linguagem fonte para outra linguagem</p><p>denominada linguagem alvo</p><p> Geralmente é gerada uma linguagem intermediária antes de gerar</p><p>o programa alvo</p><p>Compiladores</p><p>Compilador</p><p>Programa</p><p>fonte</p><p>Programa</p><p>alvo</p><p>Mensagens</p><p>de erro</p><p>Outros Tradutores</p><p> Interpretadores: a tradução de programa-fonte para</p><p>programa-objeto é feita intercaladamente com sua</p><p>execução (com os dados de entrada deste programa)</p><p> Montador: traduz os mnemônicos da linguagem assembly</p><p>para linguagem de máquina</p><p> Pré-compiladores/processadores: efetuam traduções</p><p>entre uma mesma linguagem de alto nível</p><p> Buscadores, formatadores de texto, processadores de</p><p>scripts, processadores de queries (SQL), etc.</p><p>Compiladores X Interpretadores</p><p> Compilador</p><p> Tempo de compilação e tempo de execução distintos</p><p>Programa fonte Programa objeto</p><p>Programa</p><p>objeto</p><p>Dados de entrada Resultados</p><p>Compilador</p><p>Compiladores X Interpretadores</p><p> Interpretador</p><p> Compilação e execução ocorrem simultaneamente</p><p>Interpretador</p><p>Programa fonte</p><p>Saída</p><p>Dados de entrada</p><p>Compiladores X Interpretadores</p><p> Vantagens do Compilador</p><p> O tempo de execução de um programa compilado é muito menor*</p><p>que o do programa interpretado</p><p> Após a tradução, o programa objeto pode ser armazenado para</p><p>uso futuro</p><p> Desvantagens do compilador</p><p> O programa objeto não permite modificação</p><p> Para tal é necessário retomar o programa fonte, fazer as</p><p>alterações e compilar novamente</p><p>Compiladores X Interpretadores</p><p> Vantagens do Interpretador</p><p> Facilidade no desenvolvimento de programas: a cada alteração do</p><p>programa fonte, não é necessário recompilar todo o código</p><p> Maior controle: detecta mais erros</p><p> Desvantagens do Interpretador</p><p> Tempo de execução maior: interpreta cada comando ao executá-lo</p><p>Linguagem Java</p><p>Fonte: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/</p><p>https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/</p><p>Compilador JIT (Just-In-Time)</p><p>Fonte: https://matfoop.github.io/OOP/vezbe/prezentacije/01.uvod.pdf</p><p>https://matfoop.github.io/OOP/vezbe/prezentacije/01.uvod.pdf</p><p>Plataforma .NET</p><p>Fonte: http://sumit-kumar-sinha.blogspot.com/2012/10/clr-architecture.html</p><p>http://sumit-kumar-sinha.blogspot.com/2012/10/clr-architecture.html</p><p>Tipos primitivos de dados</p><p>Tipos Primitivos</p><p>Tipo Tamanho Faixa de Valores</p><p>lógico bool 8-bit true ou false</p><p>inteiro</p><p>char 16-bit 0 a 65.535 (Unicode)</p><p>byte 8-bit -128 a 127</p><p>short 16-bit -32.768 a 32.767</p><p>int 32-bit -2.147.483.648 a 2.147.483.647</p><p>long 64-bit -263 a 263 - 1</p><p>real</p><p>float 32-bit -1.40239846e-46 a 3.40282347e38</p><p>double 64-bit</p><p>-4.94065645841246544e-324 a</p><p>1.7976931348623157e308</p><p>Operadores Aritméticos</p><p>Símbolo Operação</p><p>* Multiplicação</p><p>/ Divisão</p><p>% Resto da divisão (MOD)</p><p>+ Adição</p><p>- Subtração</p><p>a b c</p><p>int a, b, c; - - -</p><p>a = 15; 15</p><p>b = a - 7 * 2; 1</p><p>c = -b + 5; 4</p><p>a = c * (-2 + 2); 0</p><p>b = b * 7 / 3; 2</p><p>c = 17 % 5; 2</p><p>a = c % 6; 2 2 2</p><p>Operadores Relacionais</p><p>Símbolo Operação</p><p>< Menor</p><p>> Maior</p><p><= Menor ou igual</p><p>>= Maior ou igual</p><p>== Igual</p><p>!= Diferente</p><p>a b c d</p><p>int a, b;</p><p>bool c, d;</p><p>- - - -</p><p>a = 15 / 10 + 4; 5</p><p>b = -a – 3; -8</p><p>c = a >= b; T</p><p>d = c != false; T</p><p>c = (a + 4) == -b; F</p><p>d = (b * -2) <= (a / 2) 5 -8 F F</p><p>Operadores Lógicos</p><p>Símbolo Operação</p><p>&& E (and)</p><p>|| Ou (or)</p><p>! Não (not)</p><p>a b c d</p><p>int a, b;</p><p>bool c, d;</p><p>- - - -</p><p>a = 7 + 17 % 2; 8</p><p>b = a / 30 + 4; 4</p><p>c = a != b; T</p><p>d = !c; F</p><p>c = (b >= 4) && !(a != 8); T</p><p>d = !!!!!!c; T</p><p>c = d || (a / 2 == b); T</p><p>Operadores de Incremento e</p><p>Decremento</p><p>Símbolo Operação</p><p>++ Adiciona 1</p><p>-- Subtrai 1</p><p>a b c</p><p>int a, b, c; - - -</p><p>a = 17 % 3 * 2 – 1; 3</p><p>a++; 4</p><p>b = ++a / 2; 5 2</p><p>c = 2 – b--; 1 0</p><p>c = b++ * 3 + ++a;</p><p>(1) * 3 + (6)</p><p>6 2 9</p><p>c = c++ + b;</p><p>(9) + 2</p><p>11</p><p>b = ++c + 5 – a-- * 2;</p><p>(12)+ 5 – (6) * 2</p><p>(12)+ 5 – 12</p><p>5 5 12</p><p>Observações:</p><p>• Aplicam-se apenas à variáveis</p><p>• Podem aparecer pré-fixados ou</p><p>pós-fixados</p><p>Operadores de Atribuição</p><p>Símbolo Operação</p><p>= Atribuição simples</p><p>+= Some e atribui</p><p>-= Subtrai e atribui</p><p>*= Multiplica e atribui</p><p>/= Divide e atribui</p><p>%= Calcula o resto da</p><p>divisão e atribui</p><p>a b c</p><p>int a, b, c; - - -</p><p>a = b = c = 10; 10 10 10</p><p>b += 3; // b = b + 3; 13</p><p>c %= 6; 4</p><p>a += b *= -1; -3 -13</p><p>a -= c /= 4; -4 1</p><p>Operadores: exemplo</p><p>a b c d</p><p>int a, b;</p><p>bool d, c;</p><p>- - - -</p><p>a = b = 7; 7 7</p><p>b -= 3; 4</p><p>c = !(b <= a); F</p><p>d = (a % 2 != 0) && (b == 4); T</p><p>a = b-- * 2;</p><p>(4) * 2</p><p>8 3</p><p>c = !(!d != false) || (a % 3 == b % 3); T</p><p>a += b *= 2; 14 6</p><p>b = (3 + ++a) + ++a;</p><p>(3 + (15))+ (16)</p><p>16 34 T T</p><p>Operadores de Bit a Bit</p><p>Símbolo Operação</p><p>& E (and)</p><p>| Ou (or)</p><p><< Deslocamento para esquerda</p><p>>> Deslocamento para direita</p><p>a b</p><p>int a, b; - -</p><p>a = 13 | 4; 13</p><p>b = 10 & 5; 0</p><p>a = 3 << 2; 12</p><p>b = 11 >> 1; 5</p><p>Operadores de Bit a Bit</p><p>16 8 4 2 1</p><p>13 1 1 0 1</p><p>ou 4 0 1 0 0</p><p>----- ----------</p><p>13 1 1 0 1</p><p>10 1 0 1 0</p><p>e 5 0 1 0 1</p><p>----- ----------</p><p>0 0 0 0 0</p><p>16 8 4 2 1</p><p>3 1 1</p><p>3<<2=12 1 1 0 0</p><p>11 1 0 1 1</p><p>11>>1=5 1 0 1</p><p>Operador Ternário</p><p>Sintaxe: exp_lógica ? exp_true : exp_false</p><p>O resultado da expressão será exp_true caso exp_lógica</p><p>resulte verdadeiro, caso contrário será exp_false.</p><p>Exemplos:</p><p>a = (b != 20) ? -13 : b * 2 + 1;</p><p>x = (y < 0) ? -1 : (y > 0) ? 1 : 0;</p><p>Operador Ternário: exemplo</p><p> Escreva uma expressão que atribua à variável dias o</p><p>valor:</p><p> 366, se o valor armazenado na variável ano corresponder a um</p><p>ano bissexto;</p><p> 365, caso contrário.</p><p> Observação: um ano é bissexto se:</p><p> for divisível por 400; (ou)</p><p> for divisível por 4 e não por 100.</p><p>Operador Ternário: exemplo</p><p> Solução:</p><p>dias = (ano % 400 == 0) ? 366 :</p><p>((ano % 4 == 0) && (ano % 100 != 0)) ? 366 : 365;</p><p> Outra solução:</p><p>dias = ((ano % 400 == 0) ||</p><p>((ano % 4 == 0) && (ano % 100 != 0)))? 366 : 365;</p><p>Operadores: Resumo</p><p>Principais Operadores</p><p>Aritméticos</p><p>*, /, % (mod)</p><p>+, -</p><p>Relacionais <, <=, >, >=, ==, !=</p><p>Lógicos (curto-circuito) &&, ||, ! (negação)</p><p>Bit a bit</p><p>&, |, ^ (xor)</p><p><< (deslocamento a esquerda)</p><p>>> (deslocamento a direita)</p><p>Incremento/Decremento ++, --</p><p>Atribuição =, +=, -=, *=, /=, %=</p><p>Ternário exp_lógica ? exp_true : exp_false</p><p>Operadores: Exemplo</p><p>int a, b, c;</p><p>bool d, e; a b c d e</p><p>a = b = c = 10; 10 10 10</p><p>b++; 11</p><p>c += 5; 15</p><p>a -= b %= 2; 9 1</p><p>c /= 4; 3</p><p>d = (c % 8 > 2); T</p><p>e = !!!d; F</p><p>d = (e != true) && (2 + a % 5 > 6); F</p><p>e = !(d || !(c++ < --b + 3));</p><p>!(F || !((3) < (0) + 3))</p><p>!(F || !(F))</p><p>!(F || T) = !(T) = F</p><p>9 0 4 F F</p><p>Estruturas Condicionais</p><p>IF / ELSE</p><p> Sintaxe:</p><p>if(exp_lógica)</p><p><comando; | BLOCO></p><p>else</p><p><comando; | BLOCO></p><p>Exemplo:</p><p>if(x != y)</p><p>Console.WriteLine(x);</p><p>if(a > b) {</p><p>a = b;</p><p>b = 0;</p><p>}</p><p>else {</p><p>b = a;</p><p>}</p><p>opcional</p><p>Estruturas Condicionais</p><p>SWITCH / CASE</p><p> Sintaxe:</p><p>switch(expressão) {</p><p>case val1:</p><p>comando; ...</p><p>break;</p><p>case val2:</p><p>comando; ...</p><p>break;</p><p>...</p><p>default:</p><p>comando; ...</p><p>break;</p><p>}</p><p>Exemplo:</p><p>switch(mes) {</p><p>case 1:</p><p>case 3:</p><p>case 5:</p><p>dias = 31;</p><p>break;</p><p>case 2:</p><p>dias = 28;</p><p>break;</p><p>default:</p><p>dias = 30;</p><p>break;</p><p>}</p><p>opcional</p><p>Laços de Repetição</p><p> WHILE (Enquanto)</p><p> Repete enquanto exp. lógica resultar em verdadeiro</p><p> Nº indeterminado de repetições</p><p> Bloco interno pode não ser executado</p><p> Sintaxe:</p><p>while(exp_lógica)</p><p><comando; | BLOCO></p><p>Exemplo:</p><p>Random r = new Random();</p><p>int a = r.Next(1, 100);</p><p>while(a != 10) {</p><p>Console.WriteLine(a);</p><p>a = r.Next(1, 100);</p><p>}</p><p>28</p><p>Laços de Repetição</p><p> DO-WHILE (Faça–Enquanto)</p><p> Repete enquanto exp. lógica resultar em verdadeiro</p><p> Nº indeterminado de repetições</p><p> Bloco interno executado pelo menos uma vez</p><p> Sintaxe:</p><p>do</p><p><comando; | BLOCO></p><p>while(exp_lógica);</p><p>Exemplo:</p><p>Random r = new Random();</p><p>int a;</p><p>do {</p><p>a = r.Next(1, 100);</p><p>Console.WriteLine(a);</p><p>} while(a != 10);</p><p>29</p><p>Laços de Repetição</p><p> FOR (Para)</p><p> Geralmente usado para um número pré-determinado de</p><p>repetições</p><p> Repete enquanto exp. lógica (condição) for verdadeira</p><p> Bloco interno pode não ser executado</p><p> Seus três parâmetros são opcionais</p><p> Sintaxe:</p><p>for(inicialização; condição; incremento)</p><p><comando; | BLOCO></p><p>Exemplo:</p><p>for(int i = 0; i < 4; i++) {</p><p>Console.WriteLine(i);</p><p>}</p><p>30</p><p>Exemplos</p><p> Para cada uma das repetições a seguir, determine o</p><p>número de vezes que seu bloco de comandos irá se repetir</p><p>e qual o valor de seus contadores após a execução:</p><p>a) for(i = 0; i < 4; i++) {</p><p>...</p><p>}</p><p>4 repetições</p><p>i 0 1 2 3 4</p><p>Exemplos</p><p>b) for(i = 1; i <= 4; i++) {</p><p>...</p><p>}</p><p>4 repetições</p><p>c) for(i = 7; i > 2; i--) {</p><p>...</p><p>}</p><p>5 repetições</p><p>i 1 2 3 4 5</p><p>i 7 6 5 4 3 2</p><p>Exemplos</p><p>d) for(i = 3; i != 15; i += 3) {</p><p>...</p><p>}</p><p>4 repetições</p><p>i 3 6 9 12 15</p><p>e) for(i = 1; i < 200; i *= 2) {</p><p>...</p><p>}</p><p>8 repetições</p><p>i 1 2 4 8 16 32 64 128 256</p><p>Exemplos</p><p>f) for(i = 4, j = 1; i >= j; j += 2, i++) {</p><p>...</p><p>}</p><p>4 repetições</p><p>i 4 5 6 7 8</p><p>g) for(;;) {</p><p>...</p><p>}</p><p>Loop infinito</p><p>j 1 3 5 7 9</p><p>Exercício prático: pirâmide de</p><p>asteriscos</p><p> Escreva uma aplicação console que desenhe uma pirâmide</p><p>de asteriscos. O usuário deverá informar o número de</p><p>linhas que deseja para a pirâmide, no início da execução.</p><p>Informe o nº de linhas: 4</p><p>0 ---*</p><p>1 --***</p><p>2 -*****</p><p>3 *******</p><p>Arranjos</p><p> Vetor: arranjo unidimensional</p><p> Sintaxe: tipo[] id = new tipo[n];</p><p> Exemplos:</p><p>int[] vet = new int[10];</p><p>char[] valores = {'Z', 'K', 'M'};</p><p> Propriedade Length (em Java: length): Retorna o número de</p><p>elementos do arranjo</p><p>Console.Write(vet.Length); // ?</p><p>Console.Write(valores.Length); // ?</p><p>Console.Write(valores[1]); // ?</p><p>36</p><p>Arranjos</p><p> Vetor: arranjo unidimensional</p><p> Sintaxe: tipo[] id = new tipo[n];</p><p> Exemplos:</p><p>int[] vet = new int[10];</p><p>char[] valores = {'Z', 'K', 'M'};</p><p> Propriedade Length (em Java: length): Retorna o número de</p><p>elementos do arranjo</p><p>Console.Write(vet.Length); // 10</p><p>Console.Write(valores.Length); // 3</p><p>Console.Write(valores[1]); // K</p><p>37</p><p>0 1 2</p><p>Z K M</p><p>Arranjos</p><p> Matriz: arranjo multidimensional</p><p> Sintaxe:</p><p>tipo[,,...] id = new tipo[n1, n2, ..., nn];</p><p>tipo[][]...[] id = new tipo[n1][n2]...[nn];</p><p> Exemplos:</p><p>int[,] mat = new int[3,2]; // C#</p><p>double[][] mat2 = new double[3][4]; // Java e C#</p><p>int[,] mat3 = {{2,4,6},{1,3,5},{10,11,12}};</p><p>int[,,] mat4={{{2,3},{7,1},{5,8}},{{12,13},{17,11},</p><p>{15,18}},{{0,6},{4,10},{16,-44}}};</p><p>0 1</p><p>0</p><p>1</p><p>2</p><p>mat</p><p>Arranjos: Exemplos</p><p> int[,,] nota = new int[2, 50, 3]; // 2x50x3</p><p> Aluno da turma B,</p><p>nº 50, na P1, tirou 12:</p><p>nota[1, 49, 0] = 12;</p><p> Aluno da turma A,</p><p>nº 2, na P2, tirou 5:</p><p>nota[0, 1, 1] = 5;</p><p>0 1 2</p><p>0</p><p>1 5</p><p>...</p><p>49</p><p>0 1</p><p>0 1 2</p><p>0</p><p>1</p><p>...</p><p>49 12</p><p>Arranjos: Exemplos</p><p>int[,] mat = new int[3,2];</p><p>int[,] mat3 = {{2,4,6},{1,3,5},{10,11,12}};</p><p>int[,,] mat4 = {{{2,3},{7,1},{5,8}},{{12,13},{17,11},{15,18}},</p><p>{{0,6},{4,10},{16,-44}}};</p><p>mat[2,1] = 5;</p><p>Console.Write(mat3[1,2]); // ?</p><p>Console.Write(mat3[2]); // ?</p><p>Console.Write(mat4[1,2,1]); // ?</p><p>Console.Write(mat3.Length); // ?</p><p>Console.Write(mat4.GetLength(0)); // ?</p><p>Console.Write(mat4.GetLength(1)); // ?</p><p>Console.Write(mat4.GetLength(2)); // ?</p><p>40</p><p>Arranjos: Exemplos</p><p>int[,] mat = new int[3,2];</p><p>int[,] mat3 = {{2,4,6},{1,3,5},{10,11,12}};</p><p>int[,,] mat4 = {{{2,3},{7,1},{5,8}},{{12,13},{17,11},{15,18}},</p><p>{{0,6},{4,10},{16,-44}}};</p><p>mat[2,1] = 5;</p><p>Console.Write(mat3[1,2]); // 5</p><p>Console.Write(mat3[2]); // erro</p><p>Console.Write(mat4[1,2,1]); // 18</p><p>Console.Write(mat3.Length); // 9</p><p>Console.Write(mat4.GetLength(0)); // 3</p><p>Console.Write(mat4.GetLength(1)); // 3</p><p>Console.Write(mat4.GetLength(2)); // 2</p><p>41</p><p>0 1</p><p>0</p><p>1</p><p>2 5</p><p>mat</p><p>Arranjos: Exercício</p><p> Faça um programa que leia 100 valores inteiros. Calcule e</p><p>imprima:</p><p>a) Soma dos valores</p><p>b) Média aritmética</p><p>c) Maior valor</p><p>d) Quantidade de valores abaixo da média</p><p>Referências Bibliográficas</p><p> Harvey M. Deitel and Paul J. Deitel. Java: Como Programar.</p><p>Pearson, 8 edition, 2010.</p><p> Cay S. Horstmann and Gary Cornell. Core Java: Volume 1 -</p><p>Fundamentos.</p><p>Pearson, 8 edition, 2010.</p><p> ZIVIANI, Nivio. Projeto de Algoritmos com Implementações em Java e</p><p>C++.</p><p>Disponível em: <http://www2.dcc.ufmg.br/livros/algoritmos-</p><p>java/transparencias.php>.</p><p>43</p><p>http://www2.dcc.ufmg.br/livros/algoritmos-java/transparencias.php</p>