Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Disciplina: ZAB0264 – Introdução à Computação Curso: Engenharia de Alimentos (2014) Prof. Dr. Adriano Rogério Bruno Tech Créditos Aula: 4 Créditos Trabalho: 0 Carga Horária Total: 60 h Tipo: Semestral Início: Término: 03/08/2014 01/12/2014 Objetivos Introduzir noções de algoritmos, de computadores e de computação. Estudar uma linguagem de alto nível. Treinamento prático de utilização de computadores pessoais. Disciplina de formação básica. Algoritmos. Computadores. Conceitos de linguagens algorítmicas: expressões; comandos seqüenciais, seletivos e repetitivos; entrada/saída; variáveis estruturadas; Procedimentos. Ensino de uma linguagem de programação algorítmica. Programa Resumido Bibliografia FARRER, H., BECKER, C. G.; FARIA, E. C.; MATOS, H. F. M. L. Maia Algoritmos Estruturados 3a. edição LTC (2001). SAVITCH, W. C++ absoluto. Editora Addison Wesley 2003. ADAMS, J. C++ An introduction to computing. Ed. Prentice Hall, 1998. IRVINE, K.R., C++ And object programming. Ed. Prentice Hall, MANZANO, J.A.N. & OLIVEIRA, J.F. Algoritmos - lógica para desenvolvimento de programação. Ed. Érica, 1996. GOMES. Fundamentos de programação da linguagem. Ed. Érica, 1991. STROUSTRUP, B. Linguagem de programação C++, A. Ed. Brookman, 2000. FORBELLONE, André. Lógica de programação. Ed. Makron Books, 2000. FORBELLONE, André; EBERSPÄCHER, Henri F. Algoritmos e Programação. 3ª ed. Pearson Education, 2008. KOTANI, A.M., SOUZA, R.L. & UCCI, W. Lógica de programação. Ed. Érica, 1991. PACITTI, T. Programação - princípios. Ed. Livro Técnico e Científico, 1986 Algoritmos e Programação de Computadores Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Prof. Dr. Adriano Rogério Bruno Tech Tópicos Preliminares Objetivo: • Apresentar os tipos básicos de dados a serem adotados na construção dos Algoritmos; • Definir constantes e variáveis, explicando sua utilização; • Explicar as expressões aritméticas e as lógicas; • Conceituar o processo de atribuição (inicialização); • Apresentar a importância e a aplicação dos comandos de entrada e saída de dados; • Conceituar blocos lógicos. Antes de iniciarmos alguns conceitos devem ser relembrados, dentre eles: 1- O que é Lógica? 2- O que é Lógica de Programação? 3- O que é um Algoritmo? 4- Por que é importante construir um ALGORITMO? Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Respondendo: 1- A LÓGICA é a arte de bem pensar, que é a ciência das formas do pensamento. Visto que a forma mais complexa do pensamento é o raciocínio, a LÓGICA estuda a “correção do raciocínio”. Podemos ainda dizer que a lógica tem em vista a “ordem da razão”. Isso dá a entender que a nossa razão pode funcionar desordenadamente. Por isso, a LÓGICA estuda e ensina a colocar “ordem no pensamento”. Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Respondendo: 2- A LÓGICA DE PROGRAMAÇÃO significa o uso correto das leis do pensamento, da “ordem da razão” e de processos de raciocínio e simbolização formais na programação de computadores, objetivando a racionalidade e o desenvolvimento de técnicas que cooperem para a produção de soluções logicamente válidas e coerentes, que resolvam com qualidade os problemas que se deseja programar. Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Respondendo: 3- ALGORITMO é uma seqüência de instruções organizadas de forma lógica e estruturada (sem desvios), expressas em linguagem natural (Português estruturado), que tem por finalidade resolver um problema ou descrever uma tarefa. Ou Um ALGORITMO pode ser definido como uma seqüência de passos que visam a atingir um objetivo bem definido. Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Respondendo: 4- Um ALGORITMO tem por objetivo representar mais fielmente o raciocínio envolvido na Lógica de Programação e, dessa forma, permite-nos abstrair de uma série de detalhes computacionais, que podem ser acrescentados mais tarde. Assim, podemos focalizar nossa atenção naquilo que é importante: a lógica da construção de algoritmos. Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Respondendo: Outra importância da construção de algoritmos é que uma vez concebida uma solução algorítmica para um problema, esta pode ser traduzida para qualquer linguagem de programação e ser agregada das funcionalidades disponíveis nos diversos ambientes, costumamos denominar esse processo de CODIFICAÇÃO. Universidade de São Paulo Faculdade de Zootecnia e Engenharia de Alimentos Representando um Algoritmo Os algoritmos podem ser representados de várias formas, como por exemplo: a) Através de uma língua (português, inglês, etc.): forma utilizada nos manuais de instruções, nas receitas culinárias, bulas de medicamentos, etc. b) Através de uma linguagem de programação (Pascal, C, Delphi, etc.): esta forma é utilizada por alguns programadores experientes, que "pulam" a etapa do projeto do programa (algoritmo) e passam direto para a programação em si. c) Através de representações gráficas: são bastante recomendáveis, já que um "desenho" (diagrama, fluxograma, etc.) muitas vezes substitui, com vantagem, várias palavras. Representando um Algoritmo Cada uma dessas formas de representar um algoritmo, tem suas vantagens e desvantagens, cabe a pessoa escolher a forma que melhor lhe convir. Nesta disciplina serão apresentadas três formas de representação de algoritmos (que são algumas das mais utilizadas), são elas: 1- Diagrama de Nassi-Shneiderman (Diagrama de Chapin) 2- Fluxograma (Diagrama de Fluxo) 3- Português Estruturado (Pseudocódigo, Portugol ou Pseudolinguagem) Português Estruturado início <instruções> se <condição> então <instruções> senão <instruções> fim_se fim Exemplo de Fluxograma Exemplo de Diagrama de Chapin Tipos Primitivos Tipos básicos que usaremos na construção de algoritmos: • Inteiro: todo e qualquer dado (informação) numérica que pertença ao conjunto dos números inteiros relativos (negativa, nula ou positiva); • Real: todo e qualquer dado (informação) numérica que pertença ao conjunto dos números reais (negativa, nula ou positiva); • Caracter: todo e qualquer dado (informação) composta de um conjunto de caracteres alfanuméricos: numéricos (0..9), alfabéticos (A..Z, a..z) e especiais (por exemplo, #, $, ?, !, @); • Lógico: todo e qualquer dado (informação) que pode assumir apenas duas situações (biestável) – Verdadeiro ou Falso, 0 ou 1, V ou F. Constantes Um dado é constante quando não sofre alterações ou variações no decorrer do tempo, ou seja, seu valor é constante do início da execução do algoritmo até o final. Para diferenciar os dados constantes de tipo caracter dos outros tipos, usaremos aspas duplas (“ ”) para delimitá-los. Convencionaremos que as informações do tipo lógica poderão assumir um dos dois estados ou valores constantes: Verdade (V) ou Falsidade (F). Exemplos: “PARE”, 2345, -0.58, V. Variável Como o próprio nome diz, ela é variável no tempo, ou seja, um dado é classificado como variável quando tem a possibilidade de ser alteradoou modificado em algum instante no decorrer do tempo. Durante a execução do algoritmo em que é utilizado, o valor do dado sofre alteração ou o dado é dependente da execução em um certo momento ou circunstância. Exemplos: A cotação do EURO, o peso de um animal ou a inflação mensal. Ilustração da diferença entre CONSTANTE E VARIÁVEL Um exemplo típico que ilustra bem essa diferença é o cálculo da área de uma circunferência, onde temos a seguinte fórmula: πr2. Nesta fórmula temos a caracterização de uma constante e de uma variável, observe: π = constante (pois seu valor é 3,141596...); r2 = variável (pois o valor de r (raio), varia de acordo com o tamanho da circunferência). Formação de Identificadores Os nomes das variáveis ou constantes também são chamados de identificadores, ou seja, um elemento que identifica uma variável ou constante durante a construção de um algoritmo. Exemplo: xnome = significa que está variável ou constante representa o nome de um elemento do mundo real (xnome = “Adriano”, xidade = 20). Assim, xnome e xidade identificam “alguém ou alguma coisa” do mundo real, ou seja, os elementos ou procedimentos que estão sendo manipulados pelo algoritmo. Formação de Identificadores Regras de criação: 1 – Devem começar por um caracter alfabético. 2 – Podem ser seguidos por mais caracteres alfabéticos ou numéricos. 3 – Não devem ser usados caracteres especiais e espaços entre as letras. O diagrama de sintaxe a seguir resume graficamente essas regras: identificador letra letra dígito Formação de Identificadores Exemplos: 1 – Identificadores válidos: a) Alpha, Beta, CX234, J8, Média, ISS, FGTS, XNOME. 2 – Identificadores inválidos: a) 8C, A(15), A:B, X-Y, AB, Nota / 2, AB C, C&T Declaração de Variáveis No ambiente computacional, os dados são armazenados em variáveis e estas são guardadas em dispositivos eletrônicos, analogamente chamados de memória. Podemos imaginar essa “memória” como sendo um armário repleto de gaveta, no qual as gavetas seriam os locais físicos responsáveis por armazenar objetos. Os objetos (que podem ser substituídos) seriam os dados e as gavetas as variáveis. Declaração de Variáveis Visto que na memória (armário) existem inúmeras variáveis (gavetas), precisamos diferenciá-las, o que é feito através dos identificadores (etiquetas ou rótulos). Cada variável (gaveta), no entanto, pode guardar apenas um dado (objeto) de cada vez, sendo sempre de mesmo tipo primitivo (material). Portanto, precisamos definir nomes (identificadores) que serão responsáveis por armazenar dados em seu interior. Regra Sintática para criação de variáveis Declaração de variáveis tipo : identificador ; , tipo inteiro real caracter lógico Declaração de Variáveis Exemplos: inteiro: X, Xidade; caracter: Xnome, Endereço, Data; real: ABC, XPTO, Valor, Medida; lógico: Resposta, F01; Expressões Aritméticas Denominamos expressão aritmética aquela cujos operadores são aritméticos e cujos operandos são constantes ou variáveis do tipo numérico (inteiro ou real). expressão aritmética operando operador aritmético operando operando constante numérica constante numérica Operadores Aritméticos Recebem o nome de operadores aritméticos o conjunto de símbolos que representam as operações básicas da matemática, conforme tabela 1, que são: Operador Função Exemplos * Multiplicação 3 * 4, A * B / Divisão 10 / 2, X1 / X2 + Adição 2 + 3, X + Y - Subtração 4 – 2, n - M Operadores Aritméticos Para representar as operações de radiciação e potenciação, usaremos as palavras-chave rad e pot, conforme tabela 2: Operador Função Significado Exemplos pot(x,y) Potenciação x elevado a y pot(2,3) rad(x) Radiciação Raiz quadrada de x rad(9) Operadores Aritméticos Usaremos outras operações matemáticas não- convencionais, porém muito úteis na construção de algoritmos, que são o resto da divisão e o quociente da divisão inteira, conforme a tabela 3: Operador Função Exemplos mod Resto da Divisão 9 mod 4 resulta 1 div Quociente da Divisão 9 div 4 resulta 2 Prioridades nas expressões matemáticas Na resolução das expressões aritméticas, as operações guardam uma hierarquia entre si, conforme a tabela 4: Prioridade Operadores 1ª Parênteses mais internos 2ª pot e rad 3ª * / div mod 4ª + - Observação: Em caso de empate (operadores de mesma prioridade), devemos resolver da esquerda para a direita, conforme a seqüência existente na expressão aritmética. Para alterar a prioridade da tabela, utiliza-se parênteses mais internos. Expressões Lógicas Denominamos expressão lógica é aquela cujos operadores são lógicos ou relacionais e cujos operandos são relações ou variáveis ou constantes do tipo lógico: expressão lógica operando lógico operando lógico operando lógico não constante lógica variável lógica expressão relacional Operadores Relacionais Utilizamos os operadores relacionais para realizar comparações entre dois valores de mesmo tipo primitivo. Tais valores são representados por constantes, variáveis ou expressões aritméticas, conforme tabela 5: Operador Função Exemplos = Igual a 3 = 3, X = Y > Maior que 5 > 3, X > Y < Menor que 3 < 5, X < Y >= Maior ou igual a 5 >= 3, X >= Y <= Menor ou igual a 3 <= 5, X <= Y <> Diferente de 9 <> 10, X <> Y Operadores Relacionais O resultado obtido de uma relação é sempre um valor lógico. Por exemplo, analisando a relação numérica A + B = C, o resultado será verdade ou falsidade à medida que o valor da expressão A + B seja igual ou diferente do conteúdo da variável C, respectivamente. Operadores Relacionais Exemplos: a) 2 * 4 = 24 / 3 b) 15 mod 4 < 19 mod 6 8 = 8 3 < 1 V F c) 3 * 5 div 4 <= pot(3,2)/0,5 d) 2 + 8 mod 7 >= 3 * 6 - 15 15 div 4 <= 9/0,5 2 + 1 >= 18 - 15 3 <= 18 3 >= 3 V V Operadores Lógicos Utilizaremos três operadores básicos para a formação de novas proposições lógicas compostas a partir de outras proposições lógicas simples. Os operadores lógicos estão descritos na tabela 6. Operador Função não Negação e Conjunção ou Disjunção Tabelas-Verdade Tabela Verdade é o conjunto de todas as possibilidades combinatórias entre os valores de diversas variáveis lógicas, as quais se encontram em apenas duas situações (V ou F), e um conjunto de operadores lógicos. Operação de Negação A não A F V V F Tabelas-Verdade Operação de Conjunção A B A e B F F F F V F V F F V V V Observação: A operação de conjunção é representado por “e” ou “^” ou “*”, assim a conjunção significa multiplicar um elemento pelo outro. O valor correspondente ao V (Verdadeiro) é “1” e para o F (Falso) é “0”. Tabelas-Verdade Operação de Disjunção não-exclusiva A B A ou B F F F F V V V F V V V V Observação: A operação de conjunção é representado por “ou” ou “v” ou “+”, assim a disjunção significa somar um elemento com outro. O valor correspondente ao V (Verdadeiro) é “1” e para o F (Falso) é “0”. Prioridades Precedência entre os operadores lógicos Prioridade Operadores 1ª não 2ª e 3ª ou Entre os operadores lógicos: Precedência entre os operadores lógicos Prioridade Operadores1ª não 2ª e 3ª ou Entre todos os operadores: Exemplos a. não ((5 <> 10 / 2) ou V e 2 – 5 > 5 - 2 ou V) não (5 <> 5 ou V e -3 > 3 ou V) não (F ou V e F ou V) não (F ou F ou V) não (F ou V) não (V) F b. pot(2,4) <> 4 + 2 ou 2 + 3 * 5 / 3 mod 5 < 0 16 <> 6 ou 2 + 15 / 3 mod 5 < 0 16 <> 6 ou 2 + 5 mod 5 < 0 16 <> 6 ou 2 + 0 < 0 16 <> 6 ou 2 < 0 V ou F V Comando de Atribuição Um comando de atribuição permite-nos fornecer um valor a uma variável, em que o tipo do dado deve ser compatível com o tipo da variável, isto é, somente podemos atribuir um valor lógico a uma variável capaz de comportá- lo, ou seja, uma variável declarada como sendo do tipo lógico. O comando de atribuição possui a seguinte sintaxe: atribuição identificador expressão expressão expressão aritmética expressão lógica expressão literal ; ← Exemplos Esses comandos atribuem às variáveis A, X e B os valores fornecidos à direita do símbolo de atribuição. Vale ressaltar que à esquerda do comando de atribuição deve existir apenas um identificador. lógico: A, B; inteiro: X; A B; X 8 + 13 div 5; B 5 = 3; X 2; Comandos de Entrada e Saída Os algoritmos precisam ser “alimentados” com dados provenientes do meio externo, ou seja, do mundo real, para efetuarem as operações e cálculos que são necessários a fim de alcançar o resultado desejado. Com essa finalidade, utilizaremos os comandos de entrada e saída. Entrada de dados Processamento dos dados Saída dos dados Entrada de Dados Para que o algoritmo possa receber os dados de que necessita, adotaremos um comando de entrada de dados denominado “leia”, cuja finalidade é atribuir o dado a ser fornecido à variável identificada. entrada de dados leia ( identificador ) ; Exemplos: leia (X); leia (A, XVAR, VALOR); Saída de Dados Para que o algoritmo possa mostrar os dados que calculou, como resposta ao problema que resolveu, adotaremos um comando de saída de dados denominado “escreva”, cuja finalidade é exibir o conteúdo da variável identificada. saída de dados escreva ( identificador ) ; Exemplos: escreva (Y); escreva (A, XVAR, VALOR / 4); escreva (“Boa Tarde”, XNOME); escreva (“Você tem de altura”, H, “cm”); , expressão Blocos Um bloco pode ser definido como um conjunto de ações com uma função definida; nesse caso, um algoritmo pode ser visto como um bloco. Ele serve também para definir os limites nos quais as variáveis declaradas em seu interior são conhecidas. Para delimitar um bloco, utilizamos os delimitadores início e fim. blocos início ação fim ; Exemplos: início // início do bloco (algoritmo) // declaração de variáveis // seqüência de ações fim. // fim do bloco (algoritmo) ; Observação: o uso de // serve para descrever um evento. O que vier após o // não será executado, é usado apenas como um comentário. Exercícios 1- Assinale os identificadores válidos: a) (X) b) U2 c) AH! d) “Aluno” e) #55 f) KM/L g) YUT h) ASDRUBAL i) AB*C j) 0&0 2- Encontre os erros das seguintes declarações de variáveis: inteiro: Endereço, NFilhos; caracter: Idade, X; real: XPTO, C, Peso, R$; lógico: Lâmpada, C; Exercícios 3- Supondo que A, B e C são variáveis de tipo inteiro, com valores iguais a 5, 10 e -8, respectivamente, e uma variável real D, com valor de 1,5, quais os resultados das expressões aritméticas a seguir? a) 2 * A mod 3 – C b) rad(-2 * C) div 4 c) ((20 div 3) div 3) + pot(8,2) / 2 4- Determine os resultados obtidos na avaliação das expressões lógicas seguintes, sabendo que A, B, C contêm, respectivamente, 2, 7, 3.5, e que existe uma variável lógica L cujo valor é falsidade (F): a) B = A * C e (L ou V) b) não L ou V e rad(A + B) >= C c) L ou pot(B,A) <= C * 10 + A * B Exercícios 5- Encontre os erros dos seguintes comandos de atribuição: lógico: A; real: B, C; inteiro: D; A B = C; D B; C + 1 B + C C e B 3.5; B pot(6,2) / 3 <= rad(9) * 4 Estruturas de Controle Objetivos 1. Apresentar o conceito de estrutura seqüencial de fluxo de execução e ilustrar a construção de algoritmos através de etapas lógicas; 2. Explicar a aplicabilidade das estruturas de seleção, suas variantes, combinações e equivalências; 3. Apresentar as estruturas de repetição, suas particularidades, aplicações e equivalências. Estruturas de Controle Roteiro de atividades 1. Estruturas de controle do fluxo de execução; 2. Estrutura seqüencial; 3. Estrutura de seleção; 4. Estrutura de repetição; 5. Aplicações específicas de cada estrutura. Estruturas de Controle Na criação de algoritmos, utilizamos os conceitos de bloco lógico, entrada e saída de dados, variáveis, constantes, atribuições, expressões lógicas, relacionais e aritméticas, bem como comandos que traduzam esses conceitos de forma a representar o conjunto de ações a serem executadas. Para que esse conjunto de ações se torne viável, deve existir uma perfeita relação lógica intrínseca ao modo pelo qual essas ações são executadas, ao modo pelo qual é regido o FLUXO DE EXECUÇÃO do algoritmo. Por meio das estruturas básicas de controle de fluxo de execução – seqüenciação, seleção, repetição – e da combinação delas, poderemos criar algoritmos para solucionar nossos problemas. Estrutura Seqüencial A estrutura seqüencial de um algoritmo corresponde ao fato de que o conjunto de ações primitivas será executado em uma seqüência linear de cima para baixo e da esquerda para a direita, isto é, na mesma ordem em que forma escritas. Convencionaremos que as ações serão seguidas por um ponto-e-vírgula (;), que objetiva separar uma ação da outra e auxiliar a organização seqüencial das ações, pois após encontrar um (;) deveremos executar o próximo comando da seqüência ou linha de comando. Estrutura Seqüencial O algoritmo a seguir ilustra o modelo básico que usaremos para escrever os algoritmos. Identificamos o bloco, colocando início e fim, e dentro dele iniciamos com a declaração das variáveis e depois o corpo do algoritmo. 1. início // identificação do início do bloco correspondente ao algoritmo 2. 3. // declaração das variáveis ou constantes 4. 5. // corpo do algoritmo 6. Ação 1; 7. Ação 2; 8. Ação 3; 9. . 10. . 11. . 12. Ação n; 13. 14. fim. // fim do algoritmo Exemplo 1 Construa um algoritmo que calcule a média aritmética entre quatro notas bimestrais quaisquer fornecidos por um aluno. Dados de entrada: quatro notas bimestrais (N1, N2, N3, N4). Dados de saída: média aritmética anual (MA). Resolução 1. início // começo do algoritmo 2. // declaração de variávies 3. real: N1, N2, N3, N4, MA; // notas bimestrais 4. leia(N1, N2, N3, N4); // entrada de dados 5. MA (N1 + N2 + N3 + N4) / 4; // processamento 6. escreva (MA); // saída de dados 7. fim. // término do algoritmo Exemplo 2 Construa um algoritmo que calcule a quantidade de latas de tinta necessárias e o custo para pintar tanques cilíndricos de combustível, emque são fornecidos a altura e o raio desse cilindro. Sabendo que: A lata de tinta custa R$ 50,00; Cada lata contém 5 litros; Cada litro de tinta pinta 3 metros quadrados. Dados de entrada: altura (H) e raio (R). Dados de saída: custo (C) e quantidade (QTDE). Lógica reversa (Construção do Pensamento) Utilizando o planejamento reverso, sabemos que: 1. O custo é dado pela quantidade de latas * R$ 50,00; 2. A quantidade de latas é dada pela quantidade total de litros / 5; 3. A quantidade total de litros é dada pela área do cilindro / 3; 4. A área do cilindro é dada pela área da base + área lateral; 5. A área da base é (PI * pot(R,2)); 6. A área lateral é altura * comprimento: (2 * PI * R * H); 7. Sendo que R (raio) e H (altura) são dados de entrada e PI é uma constante de valor conhecido: 3,141596, para nós PI = 3,14. Resolução 1. início // começo do algoritmo 2. // declaração de variávies e constantes 3. const PI 3,14, Valor 50,00; 3. real: H, R; // declaração das variáveis 4. real: C, Qtde, Area, Litro; // declaração das variáveis 5. leia(H, R); // entrada de dados 6. AREA (PI * pot(R, 2)) + (2 * PI * R * H); // processamento 7. Litro AREA / 3; // processamento 8. Qtde Litro / 5; 9. C Qtde * Valor; 10. escreva (C, Qtde); // saída de dados 7. fim. // término do algoritmo Exercícios 1. Construa um algoritmo para calcular as raízes de uma equação do 2º grau (ax2 + bx + c), sendo que os valores de a, b e c são fornecidos pelo usuário (considere que a equação possui duas raízes reais). 2. Construa um algoritmo que, tendo como dados de entrada dois pontos quaisquer do plano, P(x1, y1) e Q(x2, y2), imprima a distância entre eles. A fórmula que efetua tal cálculo é: d= SQRT((x2 – x1) 2 + (y2 – y1) 2), que reescrita utilizando os operadores matemáticos adotados fica: d = rad(pot(x2 – x1, 2) + pot(y2 – y1,2)) 3. Faça um algoritmo para calcular o volume de uma esfera de raio R, em que R é um dado fornecido pelo usuário. O volume de uma esfera é dado por V = 4/3*PI*R3. Estruturas de Seleção Quando precisamos testar uma certa condição antes de executar uma ação, usamos uma SELEÇÃO SIMPLES, que segue o seguinte modelo: se <condição> então C1; fimse; <condição> é uma expressão lógica que, quando inspecionada, pode gerar um resultado (F) ou (V); Se <condição> for V, a ação será executada, caso contrário encerra-se a seleção (fimse), neste caso não será executado nenhum comando. Estruturas de Seleção Pelo diagrama de sintaxe observamos que, quando existir apenas um comando a ser executado após a condição, basta escrevê-la em uma linha. Agora, quando precisamos colocar diversas ações (comandos) é necessário usar um bloco de comando delimitado por início e fim, conforme a sintaxe abaixo: se <condição> então início C1; C2; : Cn; fim; fimse; Estruturas de Seleção Se <condição> for V (verdadeira), então o “bloco verdade”, seqüência de comandos será executada, caso contrário, nada será executado, encerrando- se a seleção fimse. A existência do bloco (início e fim) é necessária devido à existência de um conjunto de ações primitivas sob a mesma cláusula então. Exemplo Vamos ampliar o escopo do Algoritmo que calcula a Média Aritmética das notas. Supondo serem N1, N2, N3 e N4 as quatro notas bimestrais de um aluno, podemos avaliar sua situação quanto à aprovação, nesse sentido, obtida atingindo-se média superior ou igual a 7. Teríamos, então, como informações de saída a média anual e uma informação adicional, se o aluno for aprovado. Solução 1. início 2. real: N1, N2, N3, N4, MA; 3. leia (N1, N2, N3, N4); 4. MA (N1+N2+N3+N4) / 4; 5. escreva (MA); 6. se (MA >= 7) então 7. escreva (“Aluno Aprovado!”); 8. fimse; 9. fim. Seleção Composta Quando tivermos situações em que duas alternativas dependem de uma mesma condição, uma em caso de verdadeira e outra em caso de falsa, usamos a estrutura de seleção composta. Supondo que um conjunto de ações dependa da avaliação verdadeiro e uma única ação primitiva dependa da avaliação falso, usaremos uma estrutura de seleção semelhante ao seguinte modelo: Seleção Composta se <condição> então início C1; C2; : Cn; fim; senão C; {ação primitiva} fimse; Seleção Composta Observamos que a existência do bloco verdade continua, sendo que ele será executado caso <condição> (expressão lógica) seja verdadeira. Porém, a seleção agora é composta, pois, caso o resultado seja falso, teremos a execução do comando C (ação primitiva) que segue a cláusula senão. No caso de existir um conjunto de ações que deveria ser executado quando o resultado da condição fosse falso, criaríamos um “bloco falsidade”, como apresentado no seguinte modelo: Seleção Composta se <condição> então início // início do bloco verdade C1; C2; : Cn; fim; senão início // início do bloco falsidade C1; C2; : Cn; fim; fimse; Exemplo Seleção Composta Vamos inserir no exemplo anterior a informação que provém do resultado falso da condição (MA >= 7), ou seja, a reprovação do aluno. Exemplo Seleção Composta 1. início 2. real: N1, N2, N3, N4, MA; 3. leia (N1, N2, N3, N4); 4. MA (N1+N2+N3+N4) / 4; 5. escreva (MA); 6. se (MA >= 7) 7. então 8. início 9. escreva (“Aluno Aprovado!”); 10. escreva (“Parabéns”); 11. fim; 12. senão 13. início 14. escreva (“Aluno Reprovado!”); 15. escreva (“Estude mais!”); 16. fim; 17. fimse; 18. fim. Seleção Encadeada Quando, devido à necessidade de processamento, agruparmos várias seleções, formaremos uma seleção encadeada. Normalmente, tal formação ocorre quando uma determinada ação ou bloco deve ser executado se um grande conjunto de possibilidades ou combinações de situações for satisfeito. Quando não conseguimos identificar um padrão lógico de construção em uma estrutura de seleção encadeada, dizemos que ela é uma estrutura de seleção encadeada heterogênea. O modelo a seguir expressa um exemplo de uma seleção deste tipo: se <condição 1> então se <condição 2> então início // bloco verdade 1 C1; : C2; fim fimse; senão se <condição 3> então início // bloco verdade 2 C1; : C2; fim senão se <condição 4> então se <condição 5> então CV; // comando verdade fimse; senão CF; // comando falsidade fimse; fimse; fimse Seleção Encadeada Podemos resumir todas as variações possíveis da seleção encadeada do modelo anterior em uma tabela de decisão, conforma tabela abaixo: Condição 1 Condição 2 Condição 3 Condição 4 Condição 5 Ação executada V V - - - BV 1 F - V - - BV 2 F - F V V CV F - F F - CF Observação:BV – Bloco Verdade; CV – Comando Verdade; CF – Comando Falsidade. Seleção Encadeada Heterogênea Uma tabela de decisão é uma construção tabular que apresenta todas as variações possíveis para uma certa estrutura de seleção. Usualmente, colocamos as condições em colunas, enquanto as linhas representam as situações possíveis. A última coluna indica qual ação será executada quando aquela combinações de resultados for satisfeita. Exemplos 1) Dados três valores A, B e C, verificar se eles podem ser os comprimentos dos lados de um triângulo, se forem, verificar se compõem um triângulo eqüilátero, isósceles ou escaleno. Informar se não compuserem nenhum tipo de triângulo. Dados de entrada: três lados de um suposto triângulo (A, B e C); Dados de saída: mensagens: não compõem triângulo, triângulo eqüilátero, triângulo isósceles ou triângulo escaleno. Exemplos Traduzindo as condições para expressões lógicas, temos: 1) É triângulo: (A < B + C) e (B < A + C) e (C < A + B); 2) É eqüilátero: (A = B) e (B = C); 3) É isósceles: (A = B) ou (A = C) ou (B = C); 4) É escaleno: (A <> B) e (B <> C) e (A <> C). Seleção Encadeada Montando a tabela de decisão, temos: É triângulo? É Eqüilátero? É Isósceles? É Escaleno? Ação Executada V V F F “Eqüilátero” V F V - “Isósceles” V F F V “Escaleno” F - - - “Não é triângulo” Tipo de Triângulo 1. início 2. inteiro: A, B, C; 3. leia (A, B, C); 4. se ((A < B + C) e (B < A + C) e (C < A + B)) 5. então 6. se ((A = B) e (B = C)) 7. então 8. escreva (“Triângulo Eqüilátero”); 9. senão 10. se ((A = B) ou (A = C) ou (B = C)) 11. então 12. escreva (“Triângulo Isósceles”); 13. senão 14. escreva (“Triângulo Escaleno”); 15. fimse; 16. fimse; 17. senão 18. escreva (“Estes valores não formam um triângulo!”); 19. fimse; 20. fim. Seleção encadeada Homogênea Chamamos de seleção encadeada homogênea a construção de diversas estruturas de seleção encadeadas que seguem um determinado padrão lógico. se então se Vamos supor que, em um dado algoritmo, um comando genérico X deva ser executado apenas quando forem satisfeitas as condições 1, 2, 3 e 4. Teríamos: Seleção encadeada Homogênea se <condição 1> então se <condição 2> então se <condição 3> então se <condição 4> então X; fimse; fimse; fimse; fimse; Seleção encadeada Homogênea Esta construção segue um padrão. Após cada então existe outro se, não existem senões; temos uma estrutura encadeada homogênea. Outro fator importante é que o comando X só será executado quando todas as condições forem ao mesmo tempo verdadeiras; portanto, seria equivalente a escrever, simplesmente: se (<condição 1> e <condição 2> e <condição 3> e <condição 4>) então X; fimse; Montando a tabela de decisão, temos: Condição 1 Condição 2 Condição 3 Condição 4 Ação Executada V V V V X Seleção encadeada Homogênea Se senão se Vamos supor que em determinadas situações uma variável X possa assumir apenas 4 valores, N1, N2, N3, N4, e que exista um comando diferente que será executado para cada valor de X. Teremos, por exemplo, a seguinte situação: se (X = N1) então C1; fimse; : se (X = N4) então C4; fimse; Seleção encadeada Homogênea Montando a tabela de decisão, temos: X = N1 X = N2 X = N3 X = N4 Ação Executada V F F F C1 F V F F C2 F F V F C3 F F F V C4 Portanto, somente uma condição ou comando poderá ser executado. Situações deste tipo não são consideradas estrutura encadeada, pois elas não estão interligadas, ou seja, ambas serão testadas e somente uma será executada. Desta forma, temos perda de eficiência no algoritmo, pois cada condição será testada independentemente de ser executada. Seleção encadeada Homogênea Para diminuir a quantidade de teste e colocá-la em uma estrutura encadeada, devemos realizar as seguintes alterações: se (X = N1) então C1; senão se (X = N2) então C2; senão se (X = N3) então C3; senão se (X = V4) então C4; fimse; fimse; fimse; fimse; Seleção encadeada Homogênea Seleção de múltipla escolha Quando um conjunto de valores discretos precisa ser testado e ações diferentes são associadas a esses valores, estamos diante de uma seleção encadeada homogênea do tipo se-então-se. Como essa situação é bastante freqüente na construção de algoritmos que dependem de alternativas, utilizaremos uma estrutura específica para estes casos, a seleção de múltipla escolha. escolha X caso N1: C1; caso N2: C2; caso N3: C3; caso N4: C4; caso contrário: C5; fimescolha; Exemplo Construa um algoritmo que, tendo como dados de entrada o preço de um produto e seu código de origem, mostre o preço junto de sua procedência. Caso o código não seja nenhum dos especificados, o produto deve ser encarado como importado. Siga a tabela de códigos a seguir: Código de origem Procedência 1 Sul 2 Norte 3 Leste 4 Oeste 5 ou 6 Nordeste 7, 8 ou 9 Sudeste 10 até 20 Centro-Oeste 25 até 30 Nordeste Algoritmo – Múltipla Escola 1. início 2. real: Preco; 3. inteiro: Origem; 4. leia (Preco, Origem); 5. escolha Origem; 6. caso 1: escreva (Preco, “ – produto do Sul”); 7. caso 2: escreva (Preco, “ – produto do Norte”); 8. caso 3: escreva (Preco, “ – produto do Leste”); 9. caso 4: escreva (Preco, “ – produto do Oeste”); 10. caso 7, 8, 9: escreva (Preco, “ – produto do Sudeste”); 11. caso 10..20: escreva (Preco, “ – produto do Centro-Oeste”); 12. caso 5, 6, 25..30: escreva (Preco, “ – produto do Nordeste”); 13. caso contrário: escreva (Preco, “ – produto importado”); 14. fimescolha; 15. fim; Estrutura de Repetição 1)- Repetição com teste no início - ENQUANTO Consiste de uma estrutura de controle do fluxo de execução que permite repetir diversas vezes um mesmo trecho do algoritmo, sempre verificando antes de cada execução se é “permitido” executar o mesmo trecho novamente. Para realizar a repetição com teste no início utilizamos a estrutura enquanto, que permite que um bloco ou uma ação primitiva seja repetida enquanto uma determinada <condição> for verdadeira. O modelo genérico desse tipo de repetição é o seguinte: Estrutura de Repetição com teste no início - ENQUANTO enquanto <condição> faça C1; C2; C3; : Cn; fimenquanto; Estrutura de Repetição com teste no início – Exemplo 1 1. início 2. real: N1, N2, N3, N4, MA; 3. inteiro: CON; 4. CON 0; 5. enquanto (CON < 50) faça 6. leia(N1,N2, N3, N4); 7. MA (N1 + N2 + N3 + N4) / 4; 8. escreva(“Média Anual = “, MA); 9. se (MA >= 7) 10. então 11. início 12. escreva(“Aluno Aprovado”); 13. escreva(“Parabéns”); 14. fim; 15. senão 16. início 17. escreva(“Aluno Reprovado”); 18. escreva(“Estude mais!!!”); 19. fim; 20. fimse; 21. CON CON + 1; 22. fimenquanto; 23. fim. Estrutura de Repetição com teste no início – Exemplo 2 1. início 2. real: MA, ACM, MAT; 3. inteiro: CON; 4. CON 0; 5. ACM 0; 6. enquanto (CON < 50) faça 7. leia(MA); 8. ACM ACM + MA; 9. CON CON + 1; 10. fimenquanto; 11. MAT ACM/50; 12. escreva(“Média Anual da turma = “, MAT); 13. fim. Estrutura de Repetição com teste no final - REPITA Para realizar a repetição com teste no final, utilizamos a estrutura repita, que permite que um bloco ou ação primitiva seja repetido até que uma determinada condição seja verdadeira. O modelo genérico desse tipo de repetição é: repita C1; C2; C3; : Cn; até <condição>; Pela sintaxe da estrutura, observamos que o bloco é executado pelo menos uma vez, independentemente da validade da condição. Isto ocorre porque o teste ou validação é realizada no final do comando de repetição Estrutura de Repetição com teste no final - REPITA 1. início 2. real: MA, ACM, MAT; 3. inteiro: CON; 4. CON 0; 5. ACM 0; 6. repita 7. leia(MA); 8. ACM ACM + MA; 9. CON CON + 1; 10. até (CON >= 50); 11. MAT ACM/50; 12. escreva(“Média Anual da turma = “, MAT); 13. fim. Estrutura de Repetição com variável de controle - PARA Nas estruturas de repetição vistas até agora, ocorrem casos em que se torna difícil determinar o número de vezes em que o bloco será executado. Sabemos que ele será executado enquanto um condição for satisfeita – enquanto – ou até que uma condição seja satisfeita – repita. A estrutura para é diferente, já que repete a execução do bloco um número predeterminado de vezes, pois ela não prevê uma condição e possui limites fixos. O modelo genérico para a estrutura de repetição para é: para V de vi até vf passo p faça C1; C2; C3; : Cn; fimpara; V é a variável de controle; vi é o valor inicial da variável V; vf é o valor final da variável V, ou seja, o valor até o qual ela vai chegar; p é o valor do incremento dado à variável V. Estrutura de Repetição PARA 1. início 2. real: MA, ACM, MAT; 3. inteiro: V; 4. ACM 0; 5. para V de 1 até 50 passo 1 faça 6. leia(MA); 7. ACM ACM + MA; 8. fimpara; 9. MAT ACM/50; 10.escreva(“Média Anual da turma = “, MAT); 11. fim. Estrutura de Dados (Vetor, Matrizes e Registros) Assim como na Teoria dos Conjuntos, uma variável pode ser interpretada como um elemento e uma Estrutura de Dados, como um conjunto. Quando uma determinada Estrutura de Dados é composta de variáveis com o mesmo tipo primitivo, temos um conjunto homogêneo de dados. Exemplo: Temos um edifício com 10 andares, assim, temos uma Estrutura Composta Unidimensional vetor [lin..col]. Declaração: tipo classe = vetor [1..40] de reais; tipo classe1 = vetor [1..20] de inteiros; tipo classe2 = vetor [1.10] de caracteres; Neste caso, temos uma estrutura composta homogênea unidimensional, portanto, a representação de vetores nos remete a uma Estrutura de Dados Unidimensional. Estrutura de Dados (Vetor, Matrizes e Registros) Definindo um soma de vetores em português estruturado (soma de dois vetores): inicio tipo V = vetor[1..50] de inteiros; V: VETA, VETB, VETR; inteiro: X; para X de q até 50 passo 1 faça leia(VETA[X], VETB[X]); VETR[X] VETA[X] + VETB[X]; escreva(VETR[X]); fimpara; fim. Estrutura de Dados (Vetor, Matrizes e Registros) Variáveis compostas multidimensionais – Neste caso, utilizaremos a estrutura de matrizes que permitem o armazenamento de um maior número de dados. Exemplo: Temos um edifício com 10 andares e com 4 salas cada andar, Estrutura Composta Multidimensional - classe [lin..col, lin..col]. Declaração: tipo classe = matriz [1..40, 1..20] de reais; tipo classe1 = matriz [1..20, 1..14] de inteiros; tipo classe2 = matriz [1..10, 1..5] de caracteres; Neste caso, temos uma estrutura composta homogênea multidimensional, portanto, a representação de vetores nos remete a uma Estrutura de Dados Multidimensional. Estrutura de Dados (Vetor, Matrizes e Registros) Definindo um soma de matrizes em português estruturado (soma de duas matrizes): inicio tipo M = matriz[1..5, 1..5] de inteiros; M: MA, MB, MR; inteiro: I, J; enquanto (I <= 5) faça leia(MA[I,J], MB[I,J]); MR[I,J] MA[I,J] + MB[I,J]; J J + 1; fimenquanto; J 1; enquanto (J <= 5) faça I 1; enquanto (I <= 5) faça escreva(MR[I,J]); I I + 1; fimenquanto; J J + 1; fimenquanto; fim. Estrutura de Dados (Vetor, Matrizes e Registros) Um registro permite a interação entre vários tipos de dados. Diferente dos vetores e matrizes que permitem uma estrutura de dados homogênea os registros permitem uma estrutura de dados heterogênea. Exemplo: tipo regEmbarque = registro inteiro: NumPas, NumPoltrona, Idade; caracter: Nome, Data, Origem, Destino, Hora; fimregistro; // declaração da variável composta do tipo registro definido regEmbarque: Embarque; Estrutura de Dados (Vetor, Matrizes e Registros) Quando acessamos o registro genericamente, estamos referenciando obrigatoriamente todos os campos por ele envolvidos. Exemplo: leia(Embarque); escreva(Embarque); Para utilizar um campo específico do registro devemos diferenciar esse campo. Para tal, utilizaremos o caracter “.” (ponto), a fim de estabelecer a separação do nome do registro do nome do campo. Exemplo: leia(Embarque.Poltrona); escreva(Embarque.Data); Estrutura de Dados (Vetor, Matrizes e Registros) Podemos também, interagir registro com vetores, ou seja, podemos utilizar um tipo primitivo vetor dentre de um registro. Exemplo: tipo vDias = vetor[1..6] de inteiros; // definição do tipo vetor tipo regProduto = registro inteiro: Cod; caracter: Nome; real: Preço; vDias: Baixa; // do tipo vetor definido fimregistro; regProduto: Produto; Exemplo: Produto.Baixa[1] 10; Estrutura de Dados (Vetor, Matrizes e Registros) Podemos também, interagir registro com matrizes, ou seja, podemos utilizar um tipo primitivo vetor dentre de um registro. Exemplo: tipo matDias = vetor[1..4, 1..6] de inteiros; // definição do tipo vetor tipo regProduto = registro inteiro: Cod; caracter: Nome; real: Preço; matDias: Baixa; // do tipo matriz definido fimregistro; regProduto: Produto; Exemplo: Produto.Baixa[4,3] 10; Estrutura de Dados (Vetor, Matrizes e Registros) Podemos também, tipo primitivo vetor com registro, ou seja, imagine que queremos controlar os dados de 45 passageiros de um ônibus. Neste caso teríamos vetores de registros.Exemplo: //definição do tipo registro tipo regEmbarque = registro inteiro: NumPas, NumPoltrona, Idade; caracter: Nome, Data, Origem, Destino, Hora; fimregistro; // definição do tipo vetor tipo vetEmbarque = vetor [1..45] de regEmbarque; vetEmbarque: Onibus; Exemplo: Onibus[0].Nome “José da Silva”;
Compartilhar