Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE DO ESTADO DE SANTA CATARINA CENTRO DE CIÊNCIAS TECNOLÓGICAS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO Apostila de VisuAlg JOINVILLE - SC 2016 ANDRESSA MAYARA UMETSU CHRISTIAN J. PEREIRA GABRIEL MAZZOLENI PINTO JANINE KNIESS LUCIANA RITA GUEDES RUI JORGE TRAMONTIN JUNIOR Apostila de VisuAlg JOINVILLE - SC 2016 Resumo O conteúdo presente nesta apostila foi criado com o propósito de ser uma base de auxílio ao aluno na disciplina de algoritmos, a qual trabalha com a ferramenta VisuAlg. Como a ferra- menta é direcionada para alunos iniciantes de programação, há uma breve explicação de lógica de programação agregado aos comandos do VisuAlg. Ao fim de cada capítulo, serão apresen- tados exemplos para cada assunto abordado, assim como, exercícios de fixação. O material foi baseado na primeira versão da apostila, a qual foi modificada com adições de definições mais extensas de estruturas de programação, novos exercícios e novos exemplos. Palavras-chaves: VisuAlg. Algoritmos. Sumário 1 Introdução 6 2 VisuAlg 7 2.1 Estrutura Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.1 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.2 Nome de Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.3 Seção de Declarações . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3 Comando de Atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4.1 Operadores Aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4.2 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.3 Operadores Lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.5 Seção de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3 Entrada e Saída 16 3.1 Comando de Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2 Comando de Saída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3 Exemplos para Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3.1 Área de uma circunferência . . . . . . . . . . . . . . . . . . . . . . . 19 3 3.3.2 Número de vértices de um objeto geométrico . . . . . . . . . . . . . . 20 3.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4 Estruturas de Seleção 22 4.1 Comando Se . . . Entao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.1.1 Estrutura de Seleção Simples . . . . . . . . . . . . . . . . . . . . . . . 22 4.1.2 Estrutura de Seleção Composta . . . . . . . . . . . . . . . . . . . . . 24 4.2 Comando Escolha . . . Caso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.3 Exemplos para Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.3.1 Tipo de Triângulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.3.2 Identificar se um número é par, positivo ou ano bissexto . . . . . . . . 28 4.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5 Estruturas de Repetição 32 5.1 Comando Repita . . . Ate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2 Comando Enquanto . . . Faca . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.3 Comando Para . . . Faca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.4 Exemplos para Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.4.1 Tabuada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.4.2 Fatorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.5 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 6 Vetores e Matrizes 41 6.1 Vetor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 6.2 Matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.3 Exemplos para Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 6.3.1 Vetor de Nomes em Ordem Alfabética . . . . . . . . . . . . . . . . . . 45 4 6.3.2 Matriz de inteiros e diferentes somas de seus elementos . . . . . . . . . 46 6.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 7 Sub-algoritmos 49 7.0.1 Variável Global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 7.0.2 Variável Local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 7.0.3 Parâmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.1 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.2 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7.2.1 Funções Pré-Definidas . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7.3 Exemplos de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 7.3.1 Ordenar dois números determinando o tipo de ordenação . . . . . . . . 58 7.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 8 Outros Comandos 63 8.1 Comando Aleatorio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 8.2 Comando Arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 8.3 Comando Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 8.4 Comando Pausa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 8.5 Comando Debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 8.6 Comando Cronômetro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 8.7 Comando Limpatela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Capítulo 1 Introdução Algoritmo é uma sequência de instruções finitas e ordenadas de forma lógica para a resolução de uma determinada tarefa ou problema. Alguns exemplos de algoritmos cotidianos são: instruções de montagem; receitas; manuais de uso. Um algoritmo não é a solução do problema, mas sim um caminho para a solução de um problema. De maneira geral, existem muitos caminhos que levam a uma solução. Diariamente são utilizados algoritmos de forma intuitiva e involuntária na execução tarefas comuns. Por serem atividades simples e dispensam ater-se nas instruções necessárias para fazê-las, o algoritmo presente nelas acaba passando despercebido. Os algoritmos são muitos utilizados em soluções computacionais. A programação das possíveis soluções consiste na codificação precisa desse algoritmo, de acordo com a linguagem de programação escolhida. Para facilitar a tarefa de programar foram criadas várias linguagens de programação. O software VisuAlg tem como objetivo permitir alunos iniciantes em programação, pra- ticar os algoritmos e os problemas de forma mais simples. O Visualg foi desenvolvido por Cláudio Morgado de Souza, seu e-mail: pcmorgado@apoioinformatica.com.br. O soft- ware é de livre uso e distribuição, atualmente está na versão 2.5. 6 Capítulo 2 VisuAlg O VisuAlg é simples, disponibiliza um ambiente de programação no idioma português utilizando o "Portugol", português estruturado, limitado a um conjunto de palavras e regras que definem o que chamamos de sintaxe da linguagem, esta sintaxe será apresentada aos poucos. As principais características do VisuAlg são: • Apenas um comando por linha; • Todas as palavras-chave são sem acentos, cedilha, etc; • Não distingue maiúsculas e minúsculas no reconhecimento de palavras-chave e nomes de variáveis (NOME é o mesmo quenome); • Há possibilidade de uso de comentários, qualquer texto após de "//"é ignorado, até se atingir o final de sua linha. 2.1 Estrutura Geral A estrutura geral é a seguinte: algoritmo ”semnome” // Função // Autor: // Data: // Seção de Declarações 7 var inicio // Seção de Comandos fimalgoritmo As palavras algoritmo, na primeira linha, e fimalgoritmo, na última linha, são palavras- chaves que delimitam o início e fim de um algoritmo. A seção de declarações situa-se após a palavra-chave var e antes de inicio. Nesta seção do algoritmo ocorrem as declarações das variáveis, que serão posteriormente utilizadas. A seção de comandos começa após a palavra inicio e termina em fimalgoritmo. As instruções ou comandos do algoritmo, ficam descritas na seção de comandos. A notação utilizada no decorrer da apostila será, palavras entre <> são elementos do algoritmo a serem substituídos por nomes ou valores definidos pelo programador. 2.2 Variáveis Variável tem como definição ser tudo aquilo que é sujeito a variações, que é instável ou inconstante. Em algoritmos, variáveis são palavras que em um dado instante guardam um determinado conteúdo, e ao decorrer das operações seguintes seu conteúdo pode ser alterado. Contudo, o conteúdo recebido deve ser sempre do mesmo tipo. Desse modo devem ser especificados os detalhes das variáveis que serão utilizadas. Esses detalhes são: tipo do dado e nome. 2.2.1 Tipos de Dados "Podemos definir um tipo de dados como um conjunto de objetos que tem em co- mum o mesmo comportamento diante de um conjunto definido de operações"[2] No VisuAlg há quatro tipos de dados: inteiro, real, cadeia de caracteres e lógico (boole- ano). • inteiro: define variáveis numéricas do tipo inteiro, considerando positivos e negativos. Exemplo: 10, 5, -5, -10; 8 • real: define variáveis numéricas do tipo real, ou seja, com casas decimais. O separador de decimais é o ponto e não a vírgula. Ex: 10.5, -5.8: • caractere: define variáveis do tipo cadeia de caracteres, contendo letras, números e sím- bolos especiais. As aspas caracterizam esse tipo de dado. Ex: "João", "casa", "1", "+"; • logico: define variáveis do tipo booleano, ou seja, só poderá ser representado por um dos dois valores VERDADEIRO ou FALSO. 2.2.2 Nome de Variáveis Os nomes das variáveis serão utilizados na manipulação de dados ao decorrer do algo- ritmo, por isso se aconselha utilizar nomes claros e precisos. [1] No VisuAlg, para serem válidos os nomes das variáveis, seguem as seguintes regras: • Possuir como primeiro caractere uma letra ou underline ’_’, os outros caracteres seguintes podem ser letras, números e underline; • Nomes de variáveis não podem conter espaços em branco; • Variáveis diferentes não podem possuir nomes iguais; • Nomes de variáveis não podem ser iguais a palavras reservadas. Exemplos: Identificadores válidos: NOME, Telefone, Idade_FILHO, IdadeFilho, NOTA1, Est_Civil. Identificadores inválidos: 3Endereco, Estado Civil, algoritmo, numero/complemento. A seguir todas as palavras reservadas no VisuAlg: 9 Palavras Reservadas aleatorio div grauprad passo abs e inicio pausa algoritmo eco int pi arccos enquanto interrompa pos arcsen entao leia procedimento arctan escolha literal quad arquivo escreva log radpgrau asc exp logico raizq ate faca logn rand caracter falso maiusc randi caso fimalgoritmo mensagem repita compr fimescolha minusc se copia fimfuncao nao sen cos fimpara numerico senao cotan fimprocedimento numpcarac timer cronometro fimrepita ou tan debug fimse outrocaso verdadeiro declare funcao para xou 2.2.3 Seção de Declarações A seção de declarações de variáveis situa-se após a palavra-chave var. As declarações possuem a seguinte sintaxe: var <variável 1>, <variável 2>,..., <variável n>: <tipo de dado> Onde, <variável i> é o nome escolhido para uma variável e <tipo de dado> determina que tipo de valor as n variáveis poderão receber. Os nomes das variáveis são separados por ","vírgulas, e seguidos de “:” dois pontos e finalmente informar o tipo daquela variável ou lista de variáveis. A seguir um exemplo de declaração: var x: inteiro y, soma: real nome: caractere sinal: logico Ao declarar as variáveis, todas possuem conteúdo inicialmente. 10 Valores Iniciais inteiro 0 real 0 caractere ” ” logico FALSO 2.3 Comando de Atribuição A atribuição é o ato de ”colocar” um dado ou informação em uma variável. A atribuição de valores a variáveis é feita com o operador <- . <variável 1> <- <valor> <variável 1> <- <variável 2> <variável 1> <- <expressão do mesmo tipo da variável 1> Do lado esquerdo fica a variável à qual está sendo atribuído o valor, e à sua direita pode- se colocar qualquer expressão como constantes númericas, variáveis, expressões numéricas, caracteres. Desde que o valor a ser atribuído tenha tipo igual ao da variável. Exemplo de atribuição: x <- 5 y <- 10.5 soma <- x + y nome <- ”João da Silva” sinal <-verdadeiro Assim, são incorretos os seguintes comandos: 2060 <- NumeroConta NumeroAgencia+digitoControle <- 2345 2.4 Operadores 2.4.1 Operadores Aritméticos Para a construção de algoritmos que realizam cálculos matemáticos, todas as expressões aritméticas devem ser linearizadas. Exemplo de linearização: 11 Equação tradicional base·altura 2{[ 2 3 − (5− 3)]+ 1} · 5 Equação computacional (base · altura)/ 2 ((2/3− (5− 3)) + 1) · 5 E como na matemática, algumas operações têm prioridade sobre as outras. A potencia- ção tem a maior prioridade entre os operadores. A multiplicação e a divisão tem segunda maior prioridade, sendo assim operadas antes da adição e da subtração. Para alterar as prioridades, devemos usar os parênteses “()“. Operadores Aritméticos Adição + Subtração − Multiplicação ∗ Divisão / Divisão Inteira \ ou div Exponenciação ˆ ou exp(<base>, <expoente>) Resto da Divisão % ou mod Vale ressaltar a representação dos operadores div e mod: • div ou \ : retorna o resultado inteiro de uma divisão, exemplos: 7 div 4 = 1 5 div 2 = 2 • mod ou % : retorna o resto da divisão inteira de dois números inteiros, exemplos: 7 mod 4 = 3 5 mod 2 = 1 2.4.2 Operadores Relacionais Os operadores relacionais realizam a comparação entre dois operandos ou duas expres- sões e resultam em valores lógicos (VERDADEIRO ou FALSO). Exemplos: 12 • 2 é igual a 3? 2 = 3 FALSO. • 2 + 5 é maior que 4 ? 2 + 5 > 4 VERDADEIRO. • "A"está antes de "B"na ordem alfabética? ”A” < ”B” VERDADEIRO. • 3 é diferente de 3? 3 <> 3 FALSO. Operadores Relacionais Maior > Menor < Maior ou Igual >= Menor ou Igual <= Igual = Diferente <> 2.4.3 Operadores Lógicos Os operadores lógicos ou booleanos atuam sobre expressões e resultam em valores lógicos VERDADEIRO ou FALSO, são eles a conjunção, disjunção, disjunção exclusiva e negação.[3] 13 Conjunção A operação de conjunção é relacionada à interseção de conjuntos, em lógica resulta VERDADEIRO quando ambas as partes forem verdadeiras. Exemplo de conjunção: (2 + 5 > 4) e (3 <> 3) VERDADEIRO e FALSO FALSO (2 + 5 > 4) e (3 = 3) VERDADEIRO e VERDADEIRO VERDADEIRO Disjunção A operação de disjunção é relacionada à união de conjuntos, em lógica resulta VERDA- DEIRO quando uma das partes for verdadeira. Exemplo de disjunção: (2 + 5 > 4) ou (3 <> 3) VERDADEIRO ou FALSO VERDADEIRO (2 + 5 > 4) ou (3 = 3) VERDADEIRO ou VERDADEIRO VERDADEIRO Disjunção Exclusiva A operação de disjunção exclusiva resulta VERDADEIRO se e somente se exatamente um das partes for verdadeira. Exemplo de disjunção exclusiva: (2 + 5 > 4) xou (3 <> 3) VERDADEIRO xou FALSO VERDADEIRO (2 + 5 > 4) xou (3 = 3) VERDADEIRO xou VERDADEIROFALSO Negação A operação de negação nega uma afirmação, invertendo seu valor: caso seja FALSO, torna-se VERDADEIRO. Exemplo de Negação: nao (3 <> 3) nao FALSO VERDADEIRO nao (2 + 5 > 4) nao VERDADEIRO FALSO 14 Operadores Lógicos Conjunção e Disjunção ou Disjunção Exclusiva xou Negação nao 2.5 Seção de Comandos A seção de Comandos contêm o conjunto de operações e instruções do algoritmo. Esta seção situa-se entre as palavras-chaves inicio e fimalgoritmo. Todo conjunto de instruções do algoritmo possui uma estrutura sequencial, ou seja, as instruções são executadas em uma ordem. inicio // Seção de Comandos <instrução 1> <instrução 2> ... <instrução n> fimalgoritmo Exemplo: algoritmo ”Exemplo Capitulo 1” // Função: Mostrar um simples exemplo // Autor: Autores da Apostila // Data: 2015 // Seção de Declarações var x: inteiro y, soma: real nome: caractere sinal: logico inicio // Seção de Comandos x <- 5 // instrução 1 y <- 10.5 // instrução 2 soma <- x + y // instrução 3 nome <- ”João da Silva” // instrução 4 sinal <-verdadeiro // instrução 5 fimalgoritmo 15 Capítulo 3 Entrada e Saída Para criar um algoritmo que seja executável dentro de um computador, este algoritmo deve ser composto de entrada, processamento e saída. A entrada é o meio pelo qual o usuário pode informar dados. O processamento é onde ocorre a manipulação e cálculos dos dados, para então chegar a resolução de uma determinada tarefa ou problema. Por fim, a saída retorna o re- sultado do processamento. A seguir serão descritos os comandos de entrada e saída no VisuAlg, e nos próximos capítulos serão apresentados comandos que auxiliarão no processamento. 3.1 Comando de Entrada A entrada é o meio pelo qual o usuário pode informar dados que serão atribuidos a variáveis e utilizados no processamento. No VisuAlg o comando de entrada é o leia. A sintaxe deste comando é: var <variável 1>, <variável 2>,...,<variável n>: <tipo de dado> ... leia (<variável 1>, <variável 2>, ..., <variável n>) Ao utilizar o comando leia, aparecerá uma tela esperando o usuário informar os da- dos. Toda variável usada no leia deve ser declarada anteriormente. A seguir um exemplo da utilização do comando leia: 16 algoritmo ”Exemplo de leia” var x: inteiro y, soma: real nome: caractere sinal: logico inicio // Seção de Comandos leia ( x ) // valor atribuído a x será de acordo com usuário leia ( y ) // valor atribuído a y será de acordo com usuário soma <- x + y // valor atribuído a soma será de acordo com duas entradas leia ( nome ) leia ( sinal ) fimalgoritmo Deve estar claro que sempre à direita do comando leia haverá uma ou mais variáveis. Assim, são incorretos os seguintes comandos: leia ( NumeroConta + 60 ) leia ( 12345 ) leia ( NomeCliente + Sobrenome ) Caso o usuário informe um dado diferente do esperado, o VisuAlg mostrará uma tela de erro, avisando que o algoritmo esperava determinado tipo de dado. Por exemplo, utilizando o exemplo de algoritmo descrito acima, em que há leitura das variáveis x, y, nome e sinal. Caso o usuário digite um valor real qualquer como 2.3 na primeira linha de entrada de dados, onde x é do tipo inteiro. Consequentemente, o programa irá parar e avisar sobre erro de inconsistência entre o tipo informado e o esperado. O único caso em que não ocorrerá erro é a entrada de dados para tipo lógico, qualquer entrada diferente da palavra VERDADEIRO, será atribuído a variável lógica o valor FALSO. 3.2 Comando de Saída A saída de dados é o meio pelo qual o usuário pode visualizar o resultado do processa- mento do algoritmo. No VisuAlg há dois comandos de saída, são o escreva e o escreval, suas finalidades são diferentes. As sintaxes destes comandos são: 17 // escreva, mostra as n expressões escreva ( <expressão 1>, <expressão 2>, ..., <expressão n> ) // escreval, mostra as n expressões e pula uma linha em seguida escreval ( <expressão 1>, <expressão 2>, ..., <expressão n> ) A <expressão i> é o valor que aparecerá na tela, a qual pode ser um texto, conteúdo de uma variável ou uma expressão matemática. A saída pode intercalar textos com variáveis. Exemplo: algoritmo ”Exemplo do comando escreva” ... x <- 5 y <- 10.5 nome <- ”João da Silva” sinal <- verdadeiro escreva ( nome ) escreva ( sinal ) escreva ( ” O valor de x: ”, x ) escreva ( ” O valor de y: ”, y ) escreva ( ” A soma de ”, x,” e ”, y,” é ”, x + y ) fimalgoritmo Saída do algoritmo João da Silva verdadeiro O valor de x: 5 O valor de y: 10.5 A soma de 5 e 10.5 é 15.5 algoritmo ”Exemplo do comando escreval” ... x <- 5 y <- 10.5 nome <- ”João da Silva” sinal <- verdadeiro escreval ( nome ) escreval ( sinal ) escreval ( ” O valor de x é: ”, x ) escreval ( y,” é o valor de y. ” ) escreval ( ” A soma de ”, x,” e ”, y,” é ”, x + y ) fimalgoritmo Saída do algoritmo João da Silva verdadeiro O valor de x: 5 10.5 é o valor de y. A soma de 5 e 10.5 é 15.5 18 Caso sejam desejados espaços em branco antes de escrever um determinado valor, é possível especificar o número de espaços que se deseja. Por exemplo, o comando escreva (x:5) escreve o valor da variável x em 5 espaços, alinhado-o à direita. Para variáveis reais, pode-se também especificar o número de casas decimais que serão exibidas. Por exemplo, considerando y como uma variável real, o comando escreva (y:6:2) escreve seu valor em 6 espaços colocando 2 casas decimais. //Espaços em branco //N, M, Z são número de espaços em branco antes de escrever escreva (<expressão 1>:<N>, <expressão 2>:<M>, ..., <expressão n>:<Z>) escreval (<expressão 1>:<N>, <expressão 2>:<M>, ..., <expressão n>:<Z>) //Casas Decimais //A, B, C são o número de casas decimais escreva (<expressão 1>:<N>:<A>, <expressão 2>:<M>:<B>, ..., <expressão n>:<Z>:<C>) escreval (<expressão 1>:<N>:<A>, <expressão 2>:<M>:<B>, ..., <expressão n>:<Z>:<C>) 3.3 Exemplos para Fixação Os problemas e suas soluções apresentados abaixo, aplicam os conceitos até aqui estu- dados. 3.3.1 Área de uma circunferência [Manzano, 2003, 3.8] Criar um algoritmo que receba o raio e efetue o cálculo da área de uma circunferência, apresentando a medida da área calculada. Algoritmo: Primeiramente é necessário conhecer a fórmula para efetuar o cálculo da área de uma circunferência, sendo esta: A = piR2. 1. Determinar as variáveis que serão utilizadas, A e R do tipo real. No VisuAlg há constante matemática com valor, chamado de pi 2. Ler um valor para o raio, no caso a variável R; 3. Efetuar o cálculo da área de acordo com a fórmula e atribuir a variável A; 4. Apresentar o valor da variável A. Algoritmo em VisuAlg: 19 algoritmo ”Area Circunferência” //Função: Calcular a área de uma circunferência // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var A, R: real inicio // Seção de Comandos escreva (”Informe valor do raio: ” ) leia ( R ) A <- pi * exp (R, 2) escreva (”Área da cicunferência é: ”, A) fimalgoritmo Saída do algoritmo Informe valor do raio: 2 Área da cicunferência é: 12.5663706143592 Observação: O valor lido em leia( R ), foi uma escolha apenas para ilustração do exem- plo. 3.3.2 Número de vértices de um objeto geométrico [Medina e Marco, 2005, 2.5] Sabendo que a relação entre vértices, arestas e faces de um objeto geométrico é dada pela fórmula: vertices + faces = arestas + 2. Dado o número de faces e arestas (número inteiro e positivo), calcule o número de vértices de um objeto geométrico genérico. Ao fim mostre o número de vértices. Algoritmo: A fórmula para efetuar o cálculo do número de vértices já foi dada no problema, resta apenas isolar e ter então: vertices = arestas - faces + 2 1. Determinar as váriaveis que serão utilizadas, vertices, faces e arestas do tipo inteiro. 2.Ler os valores de faces e arestas, no caso a variável faces e arestas; 3. Efetuar o cálculo do número de vértices de acordo com a fórmula, e atribuir à variável vertices; 4. Apresentar o valor da variável vertices. Algoritmo em VisuAlg: 20 algoritmo ”Número de Vértices” //Função: Calcular o número de vértices de um objeto geométrico genérico // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var vertices, faces, arestas: inteiro inicio // Seção de Comandos escreva (”Entre com o número de faces do objeto gométrico: ”) leia ( faces ) escreva (”Entre com o número de arestas do objeto gométrico: ”) leia ( arestas ) vertices <- arestas - faces + 2 escreva (”O número de vértices do objeto especificado é: ”, vertices) fimalgoritmo Saída do algoritmo Entre com o número de faces do objeto gométrico: 5 Entre com o número de arestas do objeto gométrico: 12 O número de vértices do objeto especificado é: 9 Observação: Os valores para faces e arestas foram escolhidos apenas para ilustração do exemplo. 3.4 Exercícios de Fixação 1. [Medina e Marco, 2005, 2.5] Faça um algoritmo que calcule a média de quatro números introduzidos pelo usuário. 2. [Medina e Marco, 2005, 2.5] Faça um algoritmo que receba a temperatura em graus Celsius e apresente-a em graus Fahrenheit, de acordo com a fórmula ◦F = (1.8 ◦C)+32. 3. Faça um algoritmo que leia o nome de um piloto, uma distância percorrida em km e o tempo que o piloto levou para percorrê-la (em horas). O programa deve calcular a velocidade média em km/h, e exibir a seguinte frase: “A velocidade média do <piloto> foi <velocidade média> km/h.” 4. Escreva um algoritmo que calcule o número de notas que deve ser dado de troco para um pagamento efetuado. O algoritmo deve ler o valor a ser pago, e o valor realmente pago. Supor que o troco seja dado em notas de 50, 20, 10, 5, 2 e 1 real, dando sempre a menor quantidade de notas. 21 Capítulo 4 Estruturas de Seleção Os algoritmos vistos até agora possuem um fluxo único de execução, independente das entradas, todas as instruções são executadas. Mas muitas vezes é preciso determinar sequências alternativas de ações, ocorrendo um desvio de fluxo. O desvio de fluxo é usado para decidir se um conjunto de instruções deve, ou não, ser realizado. Essa decisão é feita com o uso de seleção (condição), que irá fazer a verificação por qual "caminho"o algoritmo vai prosseguir, de acordo com valor lógico (booleano) da condição, VERDADEIRO ou FALSO. Os operadores relacionais são usados na construção destas condições. No Visualg há dois comandos para seleção, são eles o comando se. . . entao . . . fimse e escolha. . . caso 4.1 Comando Se . . . Entao O comando de seleção se. . . entao . . . fimse, tem por finalidade fazer comparações de tal forma que possamos simular uma decisão. Há dois tipos de comandos para estruturas de seleção, a simples e a composta. Descritas a seguir: 4.1.1 Estrutura de Seleção Simples No caso do se simples, existe apenas uma alternativa a ser escolhida, ou ela executa a parte VERDADEIRA ou segue com o fluxo do programa. Apresentando a sua sintaxe: 22 se <condição> entao <instruções para condição verdadeira> fimse A estrutura de seleção simples inicia com a palavra-chave se e termina em fimse. A <condição> a ser analisada deve ficar entre as palavras se e entao. Se o seu resultado for VERDADEIRO, todos as instruções até o fimse são executadas. Caso contrário, ou seja, o seu resultado for FALSO, estes comandos são ignorados e a execução do algoritmo continua a partir da primeira linha após o fimse. Exemplo de seleção simples: algoritmo ”Exemplo Seleção Simples” //Função: Somar x e y, se x e y forem maiores ou iguais a zero // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro y, soma: real sinal: logico inicio // Seção de Comandos leia ( x , y ) se (x >= 0) e (y >= 0)entao soma <- x + y escreva ( soma ) sinal <-verdadeiro fimse escreva (”Entradas Válidas?”, sinal) fimalgoritmo Saída do algoritmo: Caso 1 10 5 15 Entradas Válidas? VERDADEIRO Saída do algoritmo: Caso 2 -1 5 Entradas Válidas? FALSO É importante frisar que sempre à direita do comando deverá parecer uma expressão lógica. Assim, os seguintes comandos são incorretos: se x <- y entao // É uma atribuição e não uma expressão lógica se x + y entao // É uma expressão aritmética e não lógica Por outro lado, estão corretos os seguintes comandos: 23 se (x > y) e (x > z) ou (y <> z) entao se nao Achou entao // Correto, se a palavra Achou for uma variável lógica 4.1.2 Estrutura de Seleção Composta No caso do se composto, existem duas alternativas a serem escolhidas, ou ela executa a parte VERDADEIRA ou a parte FALSA, dependendo da condição. Apresentando a sua sin- taxe: se <condição> entao <instruções para condição verdadeira> senao <instruções para condição falsa> fimse A estrutura de seleção composta possui forma muito similar com a simples, sua única diferença é presença da palavra-chave senao, logo após as instruções para condição verdadeira. Nesta outra forma do comando, a condição é analisada e se o resultado for VERDADEIRO, todas as instruções até a palavra senao são executadas, e a execução continua a partir da primeira linha depois do fimse. Se o resultado for FALSO, estes comandos são ignorados e as instruções a partir do senao são executadas até a linha fimse. Exemplo de seleção composta: algoritmo ”Exemplo Seleção Composta” //Função: Somar x e y, se x e y forem maiores ou iguais a zero // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro y, soma: real inicio // Seção de Comandos leia ( x , y ) se (x >= 0) e (y >= 0)entao soma <- x + y escreva ( soma ) senao escreva (”Entradas Inválidas!”) fimse fimalgoritmo 24 Saída do algoritmo: Caso 1 10 5 15 Saída do algoritmo: Caso 2 -1 5 Entradas Inválidas! 4.2 Comando Escolha . . . Caso Em algumas situações é necessário ter várias soluções ligadas a respostas diferentes, neste caso a estrutura de seleção simples ou composta não é uma solução prática, isto porque será necessário escrever muitas linhas de algoritmo. Temos então o comando de alternativa de múltipla escolha. Uso do comando escolha . . . caso é muito utilizado na construção de menu, onde o algoritmo necessita executar várias funções e o usuário precisa determinar a operação que executará. O funcionamento deste comando obedece a seguinte regra: escolha <opção (inteiro/caractere)> caso <valor da opção 1.1>, <valor da opção 1.2>,..., <valor da opção 1.n> <instruções 1> caso <valor da opção 2.1>, <valor da opção 2.2>,..., <valor da opção 2.n> <instruções 2> outrocaso <instruções 3> fimescolha O comando escolha . . . caso inicia com a palavra-chave escolha e termina em fimes- colha. Na primeira linha fica a opção, uma variável do tipo inteiro ou caractere, tal que o seu conteúdo é determinado anteriormente. E cada caso verifica se conteúdo é igual a alguma de suas opções. Se sim, são executadas todas instruções até a linha do próximo caso, e retoma execução para linha após fimescolha. Se não, significa que o conteúdo da opção é inválida, onde é utilizado o outrocaso, para tratar esses casos inválidos. Abaixo um exemplo de escolha . . . caso: algoritmo ”Exemplo Seleção Composta” //Função: Mostrar um exemplo de seleção composta // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro y, resultado: real opcao: caractere 25 inicio // Seção de Comandos escreval (”Digite dois valores, e operação que deseja ”+” ou ”-” ” ) leia ( x , y , opcao) escolha opcao caso ”+” resultado <- x + y escreval ( resultado ) caso ”-” resultado <- x - y escreval ( resultado ) outrocaso escreva (”OpçãoInválida!”) fimescolha fimalgoritmo Saída do algoritmo: Caso 1 Digite dois valores, e operação que deseja ”+” ou ”-” 10 5 + 15 Saída do algoritmo: Caso 2 Digite dois valores, e operação que deseja ”+” ou ”-” 10 5 - 5 Saída do algoritmo: Caso 2 Digite dois valores, e operação que deseja ”+” ou ”-” 10 5 / Opção Inválida! 4.3 Exemplos para Fixação Os problemas e suas soluções apresentados abaixo, aplicam os conceitos até aqui estu- dados. 4.3.1 Tipo de Triângulo [Manzano, 2003, 4.6] Ler três valores para os lados de um triângulo, considerando lados como: A, B e C. Verificar se os lados fornecidos formam realmente um triângulo, e se for esta condição verdadeira, deverá ser indicado qual tipo de triângulo foi formado: isósceles, escaleno ou equilátero. 26 Algoritmo: Para estabelecer este algoritmo, é necessário em primeiro lugar saber o que realmente é um triângulo. Triângulo é uma forma geométrica composta por três lados, sendo que cada lado é menor que a soma dos outros dois lados. Perceba que isto é uma condição, é triângulo quando A < B + C, quando B < A + C e quando C < A + B. Depois de verificar que os valores informados forma um triângulo, deve ser analisado qual o tipo de triângulo é formado: isósceles, escaleno ou equilátero. Um triângulo é isósceles quando possui dois lados iguais e um diferente, sendo A = B ou A = C ou B = C; é escaleno quando possui todos os lados diferentes, sendo A <> B e B <> C e é equilátero quando possui todos os lados iguais, sendo A = B e B = C. 1. Ler três valores para os lados de um triângulo: A, B, C 2. Verificar dados informados formam um triângulo, se sim, verificar qual é o tipo do triân- gulo; 3. Caso os lados fornecidos não caracterizem um triângulo, avisar a ocorrência; Algoritmo em VisuAlg: algoritmo ”Tipo de Triângulo” //Função: informar se é um triângulo e seu tipo // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var A, B, C: real inicio // Seção de Comandos escreva (”Informe o valor de cada lado do triângulo: ”) leia ( A, B, C ) se (A < B + C) ou (B < A + C) ou (C < A + B)entao se (A = B) e (B = C) entao escreva (”Triângulo Equilátero”) senao se (A = B) ou (A = C) ou (C = B)entao escreva (”Triângulo Isósceles”) senao escreva (”Triângulo Escaleno”) fimse fimse senao escreva (”Os valores não formam um triângulo”) fimse fimalgoritmo 27 Saída do algoritmo: Caso 1 3 3 3 Triângulo Equilátero Saída do algoritmo: Caso 2 3 3 2 Triângulo Esósceles Saída do algoritmo: Caso 2 5 3 2 Triângulo Escaleno 4.3.2 Identificar se um número é par, positivo ou ano bissexto [Medina e Marco, 2005, 3.2] Faça um algoritmo capaz de identificar se um número é par ou ímpar; positivo, negativo ou zero; um ano bissexto - considere que para o ano ser bissexto basta que seja divisível por 400. Caso contrário, precisa ser divisível por 4 e não ser divisível por 100. Caso não seja nenhuma das opções anteriores, o algoritmo deve retornar uma mensagem informando que a operação solicitada não é válida. Algoritmo: O algoritmo possuirá três funcionalidades diferentes, e executará uma que o usuário solicitar. A primeira será identificar se o número é par ou ímpar, ou seja, verificar se o resto da divisão por dois é zero ou não. A segunda será identificar se o número é positivo, negativo ou igual a zero. E a terceira se é bissexto, de acordo com as considerações feitas na descrição do problema. 1. Ler um número inteiro; 2. Mostrar opções de funcionalidades ao usuário; 3. Caso 1. mostrar se é par ou ímpar; 4. Caso 2. mostrar se é positivo, negativo ou zero; 5. Caso 3. mostrar se é ano bissexto, ou não. Algoritmo em VisuAlg: 28 algoritmo ”Menu Identificação” //Função: Identificar: par ou ímpar; positivo, negativo ou zero; ano bissexto // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var n, opcao: inteiro inicio // Seção de Comandos escreva (”Entre com o valor a ser testado: ”) leia ( n ) escreva (”Você pretende identificar se o número é: ”) escreva (”Opção 1: Par ou ímpar: ”) escreva (”Opção 2: Positivo, negativo ou 0: ”) escreva (”Opção 3: Ano Bissexto: ) leia ( opcao ) escolha opcao caso 1 se n mod 2 = 0 entao escreva (”Número par.”) senao escreva (”Número ímpar.”) caso 2 se n > 0 entao escreva (”Número positivo.”) senao se n < 0 entao escreva (”Número negativo.”) senao escreva (”Número zero.”) caso 3 se ((n mod 4 = 0) e (n mod 100 <> 0)) ou (n mod 400 = 0)entao escreva (”Ano bissexto.”) senao escreva (”Ano não é bissexto.”) outrocaso escreva (”Opção inválida.”) fimescolha fimalgoritmo 29 Saída do algoritmo: Caso 1 Entre com o valor a ser testado 10 Você pretende identificar se o número é: Opção 1: Par ou ímpar: Opção 2: Positivo, negativo ou 0: Opção 3: Ano Bissexto: 1 Número par. Saída do algoritmo: Caso 2 Entre com o valor a ser testado -10 Você pretende identificar se o número é: Opção 1: Par ou ímpar: Opção 2: Positivo, negativo ou 0: Opção 3: Ano Bissexto: 2 Número negativo. Saída do algoritmo: Caso 2 Entre com o valor a ser testado 2015 Você pretende identificar se o número é: Opção 1: Par ou ímpar: Opção 2: Positivo, negativo ou 0: Opção 3: Ano Bissexto: 3 Ano não é bissexto. 4.4 Exercícios de Fixação 1. [Manzano, 2003, 4.7] Ler quatro valores referentes a quatro notas escolares de um aluno e imprimir uma mensagem dizendo que o aluno foi aprovado, se o valor da média escolar for maior ou igual a 7. Se o aluno não foi aprovado, indicar uma mensagem informando esta condição. Apresentar junto das mensagens o valor da média do aluno para qualquer condição. 2. [Manzano, 2003, 4.7] Efetuar leitura de quatro números inteiros e apresentar os números que são divisíveis por 2 e 3. 3. [Manzano, 2003, 4.7] Efetuar leitura de quatro números inteiros e apresentar os números que são divisíveis por 2 ou 3. 4. Faça um algoritmo que receba o valor do salário de uma pessoa e o valor de um finan- 30 ciamento pretendido. Caso o financiamento seja menor ou igual à 5 vezes o salário da pessoa, o algoritmo deverá escrever “Financiamento Concedido”, se não, ele deverá es- crever “Financiamento Negado”. Independente de conceder ou não o financiamento, o algoritmo escreverá depois a frase: “Obrigado por nos consultar.” 5. Faça um programa que recebe 4 valores, I, A, B, C, onde I é um número inteiro positivo e A, B e C são quaisquer valores reais. O programa deve escrever os valores lidos e: • Se I = 1, Escrever A, B e C em ordem crescente; • Se I = 2, Escrever A, B e C em ordem decrescente; • Se I = 3, Escrever A, B e C de forma que o maior valor fique entre os outros; • Se I não for um dos três valores acima, dar uma mensagem indicando isto. 31 Capítulo 5 Estruturas de Repetição Nos exemplos e exercícios que foram apresentados até agora sempre foi possível resol- ver os problemas com uma sequência de instruções, onde todas eram necessariamente executa- das uma única vez. Os algoritmos seguiam, portanto, apenas uma sequência linear de operações. Veja, por exemplo, um algoritmo para ler os nomes e as notas das provas de três alunos e cal- cular suas médias. Uma possível solução seria repetir o trecho de código do algoritmo três vezes. A solução acima é viável apenas para uma turma de poucos alunos; para uma turma de 40 alunos, a codificação da solução seria bem trabalhosa. Nesta seção, será apresentado um conjunto de estruturas de repetição que permitem que um trecho de um algoritmo seja repetido um determinado número de vezes, sem que o código correspondente tenha que ser escrito mais de uma vez. O VisuAlg possui três estruturas de repetição: repita . . . ate; enquanto . . . faca e para . . . faca. Todas as repetições têmuma característica em comum: o fato de haver uma verificação de condição, para determinar se a repetição prossegue ou não. 5.1 Comando Repita . . . Ate Nessa estrutura, todas as instruções da lista são executadas, e no fim uma expressão lógica é avaliada. Por consequência, este comando executa pelo menos uma vez o conjunto de instruções antes da verificação. Isto se repete até que a avaliação da condição resulte em VERDADEIRO, quando então o próximo comando a ser executado é o comando imediatamente após o ate. Cada repetição do conjunto de instruções também é chamada de iteração. Sua forma geral é: 32 repita <instruções> ate <expressão lógica> A <expressão lógica> deve ser pensada como uma condição de parada da repetição. Exemplo: algoritmo ”Exemplo Repita ...Ate” //Função: Escrever os números de 1 a 10 // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro inicio // Seção de Comandos x <- 1 repita escreva ( x ) x <- x + 1 ate x > 10 fimalgoritmo Saída do algoritmo 1 2 3 4 5 6 7 8 9 10 No exemplo acima, a variável x controla o número de repetições. Normalmente, a variável de controle recebe um valor inicial, é incrementada (ou decrementada) de um valor constante e tem seu valor testado no final da iteração. Ao chegar a um determinado valor, a repetição é interrompida. A inicialização da variável contadora deve acontecer fora do repita, antes do seu início. Toda estrutura repita . . . ate que utiliza como auxílio uma variável de controle deve conter: • Inicialização da variável de controle; • incremento ou decremento da variável de controle, operação escolhida depende da con- dição; • condição que testa o valor da variável de controle. 33 5.2 Comando Enquanto . . . Faca Na estrutura enquanto . . . faca, ao contrário da estrutura apresentada anteriormente, a avaliação da expressão lógica é realizada no início da estrutura, se ela for VERDADEIRA, a lista de instruções é executada. Isso se repete até que a condição seja FALSA. Veja a sua forma geral: enquanto <expressão lógica> faca <instruções> fimenquanto Na estrutura enquanto, a expressão é avaliada no início e se o resultado for FALSO no primeiro teste, a lista de comandos não é executada nenhuma vez. Essa diferença faz com que em determinadas situações o uso de uma estrutura seja mais vantajoso que o uso da outra. Exemplo deste comando a seguir: algoritmo ”Exemplo Enquanto ...faca” //Função: Escrever os números de 1 a 10 // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro inicio // Seção de Comandos x <- 1 enquanto x <= 10 faca escreva ( x ) x <- x + 1 fimenquanto fimalgoritmo Saída do algoritmo 1 2 3 4 5 6 7 8 9 10 5.3 Comando Para . . . Faca O comando para . . . faca também permite a descrição, dentro de um algoritmo, de uma estrutura de repetição. Sua forma geral é: para <variável> de <valor inicial> ate <valor final> passo <incremento> faca <instruções> fimpara 34 Na estrutura para . . . faca, a <variável> é uma variável de controle, que é inicializada com <valor inicial> e no início de cada iteração, seu valor é comparado com <valor final>. Se o valor da variável for menor ou igual a <valor final>, a lista de comandos é executada e após ser executado o último comando da lista, a variável de controle é incrementada. Isto repete-se até que o valor da variável de controle seja maior que <valor final>. A instrução passo pode ser omitida quando o valor de incremento for igual a 1, pois o valor padrão para <incremento> é 1. Caso o valor de incremento seja diferente deve ser utilizado a instrução passo e o seu valor de incremento. para. Lembrando que incrementar, pode ser também decrementar com passos negativos, como -1. Exemplo de algoritmo que implementa para . . . faca: algoritmo ”Exemplo Para ...faca” //Função: Escrever os números de 1 a 10 // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro inicio // Seção de Comandos para x de 1 ate 10 faca escreva ( x ) fimpara fimalgoritmo Saída do algoritmo 1 2 3 4 5 6 7 8 9 10 Um outro exemplo, utilizando especificando um passo diferente: algoritmo ”Exemplo Para ...faca com passo” //Função: Escrever os números de 10 a 1 // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x: inteiro inicio // Seção de Comandos para x de 10 ate 1 passo -1 faca escreva ( x ) fimpara fimalgoritmo Saída do algoritmo 10 9 8 7 5 4 3 2 1 35 A estrutura para..faca é uma estrutura de repetição mais completa que as anteriores, pois ela incorpora a inicialização, incremento e teste de valor final da variável de controle. É preferencialmente utilizada em situações em que sabe-se previamente o número de repetições a serem feitas. Este número de repetições pode ser uma constante ou estar em uma variável. Após apresentar as três estruturas de repetições, deve ficar claro que o uso delas pode ser de forma encadeada, por exemplo: para . . . faca dentro de um enquanto . . . faca. 5.4 Exemplos para Fixação Os problemas e suas soluções apresentados abaixo, aplicam os conceitos até aqui estu- dados. 5.4.1 Tabuada Escreva um algoritmo em Visualg que pergunte ao usuário qual tabuada ele deseja ver. Mostre a tabuada multiplicando o valor de 0 até 10. Ao final, pergunte se o usuário deseja ver outra tabuada. Caso a resposta seja “SIM”, repita todo o processo novamente. Algoritmo: Sabe-se que a tabuada de um número n é o conjunto de produtos 0 até 10 por este número x. As 11 sucessivas multiplicações deverão ser controladas por um contador. Sendo assim devem ser criadas variáveis CONTADOR e X. Tal que a variável X será determinada pelo usuário. Além dessas deverá ser criada uma variável para a confirmação da continuidade da execução do programa. Este exemplo faz uso do encadeamento de estruturas de repetição. 1. Criar uma variável para ser utilizada como resposta; 2. Ler um valor para a variável X; 3. Efetuar e apresentar a multiplicação do valor X por 0, 1 . . . 10; 4. Repetir os passos 2 e 3 até que a RESP(resposta) do usuário for não. Algoritmo em VisuAlg: 36 algoritmo ”Tabuada” //Função: Calcular Tabuada, n vezes de acordo com usuário // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x, contador: inteiro resp: caractere inicio // Seção de Comandos repita escreva ( ”Digite a tabuada que deseja ver: ” ) leia ( x ) para contador de 0 ate 10 faca escreval ( x, ” x ”, contador ,” = ”, contador*x ) fimpara escreva ( ”Deseja continuar? (digite sim ou não) ” ) leia ( resp ) ate (resp <> ”sim”) fimalgoritmo Saída do algoritmo Digite a tabuada que deseja ver: 2 2 x 0 = 0 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 2 x 8 = 16 2 x 9 = 18 2 x 10 = 20 Deseja continuar? (digite sim ou não) sim Digite a tabuada que deseja ver: 5 5 x 0 = 0 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 2 x 10 = 50 Deseja continuar? (digite sim ou não) não 37 5.4.2 Fatorial [Manzano, 2003, 5.6] Elaborar o algoritmo, que efetue o cálculo de fatoriais até que o usuário não deseje mais. Sendo assim, o programa deverá pedir ao usuário a sua continuidade ou não. E o número da fatorial a ser calculada será informado pelo usuário. Algoritmo: Sabe-se que fatorial é o produto dos números naturais desde 1 até o inteiro n. Sendo assim, o cálculo de uma fatorial é conseguido pela multiplicação sucessiva do número de termos. O número de passos deverá ser controlado por um contador. Sendo assim deve ser criadas variáveis FATORIAL e CONTADOR. Além dessas deverão ser criadas outras duas variáveis, sendo uma para a confirmação da continuidade da execução do programa e outrapara determinar o cálculo do valor da fatorial. Este exemplo faz uso do encadeamento de estruturas de repetição. 1. Inicializar as variáveis FATORIAL e CONTADOR com 1; 2. Definir as variáveis RESP(resposta) para confirmação e N para receber o limite de valor para o cálculo da fatorial; 3. Enquanto RESP do usuário for sim, executar os passos 3, 4, 5, 6 e 7; 4. Repetir a execução dos passos 4 e 5 por N vezes; 5. FATORIAL <- FATORIAL * CONTADOR; 6. Incrementar 1 à variável CONTADOR; 7. Apresentar ao final o valor obtido. Algoritmo em VisuAlg: algoritmo ”Fatorial” //Função: Calcular fatorial, n vezes de acordo com usuário // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var contador, fatorial, n: inteiro resp: caractere inicio // Seção de Comandos resp <- ”sim” 38 enquanto resp = ”sim” faca fatorial <- 1 escreva ( ”Fatorial de qual número: ” ) leia (n) para contador de 1 ate n faca fatorial <- fatorial * contador fimpara escreva ( ”Fatorial de ”, n ,”é = ”, fatorial ) escreva ( ”Deseja continuar? ” ) leia ( resp ) fimequanto fimalgoritmo Saída do algoritmo Fatorial de qual número: 4 Fatorial de 4 é = 24 Deseja continuar? sim Fatorial de qual número: 6 Fatorial de 6 é = 720 Deseja continuar? não 5.5 Exercícios de Fixação 1. [Manzano, 2003, 5.7] Elaborar um programa que apresente como resultado o valor de uma potência de uma base qualquer elevada a um expoente qualquer, ou seja, de Bn, em que B é o valor da vase e n o valor do expoente. 2. [Manzano, 2003, 5.7] Elaborar um programa que possibilite calcular a área total de uma residência (sala, cozinha, quartos, etc.). O programa deverá solicitar a entrada do nome, a largura e o comprimento de um determinado cômodo. Em seguida, deverá apresentar a área do cômodo lido e também uma mensagem solicitando do usuário a confirmação de continuar calculando novos cômodos. Caso o usuário responda "NÃO", o programa deverá apresentar o valor total acumulado da área residencial. 3. [Medina e Ferting, 2005, 4.6] Faça o algoritmo para a resolução do somatório a seguir, sendo n definido pelo usuário e maior que 5: n∑ i=5 ( 2i2 + 5i+ 1 ) 39 4. Escrever um algoritmo que lê um número não determinado de valores para m, todos inteiros e positivos, um de cada vez. Se m for par, verificar quantos divisores possui e escrever esta informação. Se m for ímpar e menor do que 12, calcular e escrever o fatorial de m. Se m for ímpar e maior ou igual à 12, calcular e escrever a soma inteiros de 1 até o número lido. 40 Capítulo 6 Vetores e Matrizes Vetores e Matrizes são estruturas de dados que tem como objetivo auxiliar quando há muitas variáveis do mesmo tipo em um algoritmo. Até agora todas as declarações de variáveis eram unitárias, pois eram suficiente para os problemas anteriores. Porém, não são adequadas para resolver um grande número de problemas computacionais. Imagine, por exemplo, cons- truir um algoritmo, que recebe nome de 500 pessoas e imprime um relatório destes mesmos nomes, mas ordenados alfabeticamente. Não seria uma tarefa simples, pois teria que definir 500 variáveis do tipo caractere. Para resolver problemas como este, e outros, existem as va- riáveis indexadas, também chamadas de variáveis compostas. Tais variáveis podem representar um agrupamento de valores do mesmo tipo (homogêneas). Vetores e Matrizes são variáveis compostas e serão apresentadas a seguir. 6.1 Vetor Vetor é uma variável que armazena várias variáveis do mesmo tipo. No problema apre- sentado anteriormente, pode ser utilizado um vetor de 500 posições para armazenar os nomes das 500 pessoas. São conhecidas também como variáveis compostas unidimensionais e estáti- cas. Vetor é definido inicialmente com um tamanho fixo e suas posições são referenciadas por um único índice, sendo assim seus elementos têm ordinalidade: 1, 2, 3, . . . , N . A sintaxe para declaração é: var <variável> : vetor [<valor inicial..valor final>] de <tipo de dado> 41 Onde, a declaração é parecida com variáveis vistas até agora, deve apenas acrescentar as informações vetor e a quantidade de elementos do vetor. Essas estruturas são limitadas, por isso deve ser definido logo na declaração da variável o tamanho do vetor. No VisuAlg a definição do tamanho é feita entre os colchetes "[]"com valor inicial do índice e valor final do índice entre dois pontos "..". Exemplo: var idades: vetor [1..5] de inteiro nomes: vetor [1..5] de caractere A declaração acima corresponde à declaração de 5 variáveis do tipo inteiro e mais 5 do tipo caractere: nomes[1], nomes[2], nomes[3], nomes[4], nomes[5], idades[1], idades[2], idades[3], idades[4] e idades[5]. Para melhor abstração, os vetores acimas podem ser ilustrados da seguinte maneira: 1 2 3 4 5 Vetor nomes João Ana Mateus Ricardo Maria 1 2 3 4 5 Vetor idades 15 10 21 54 10 O acesso aos elementos é realizado pela sua posição dentro do vetor. Para atribuir um valor a um elemento do vetor devemos utilizar o seguinte padrão: <variável>[<posição>] <- <valor> Para atribuição de valores aos vetores, a diferença será a necessidade de identificar em qual posição aquele valor será inserido. Ao especificar uma determinada posição do vetor, será como acessar uma variável simples. Exemplo: nomes[1] <- ”João da Silva” idades[1] <- 35 nomes[3] <- ”Maria Aparecida” idades[3] <- idades[1] i <- 2 idades[i] <- 45 As estruturas de repetições auxiliam no acesso dos elementos de um vetor. A seguir um exemplo de algoritmo que faz implementação de vetor utilizando para . . . faca: 42 algoritmo ”Exemplo Vetores” //Função: lê um vetor de real com 6 posições, depois imprime o vetor // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var numero: vetor [1..6] de real i: inteiro inicio // Seção de Comandos para i de 1 ate 6 faca leia (numero[i]) fimpara escreva (”Conteúdo do Vetor” ) para i de 1 ate 6 faca escreva (numero[i]) fimpara fimalgoritmo Saída do algoritmo 1 6 5 8 12 1 Conteúdo do Vetor 1 6 5 8 12 1 6.2 Matriz Matriz é uma variável que armazena várias variáveis do mesmo tipo, como o vetor, diferenciando apenas por ter até N dimensões. Assim como nos vetores as posições das matrizes são referenciadas por índices. Neste caso serão N índices, sendo N o número de dimensões da matriz. É comum trabalhar com matrizes com 2 dimensões, Linhas x Colunas. Logo, seram utilizados dois índices para referenciar as posições da matriz. A sintaxe para declaração é: <variável>: vetor [<tamanho 1>,<tamanho 2>, ..., <tamanho n>] de < tipo de dado > Onde, a declaração é semelhante a de um vetor, a única diferença está nos tamanhos. Cada <tamanho i> seguido de vírgula representa uma dimensão da matriz, que deve ser descrito com valor inicial e final. Exemplo: var idades: vetor [1..3,1..4] de inteiro nomes: vetor [1..3,1..3] de caractere A variável idades foi declarada como uma matriz de inteiros com três linhas e qua- tro colunas, 3 X 4: idades[1,1]; idades[1,2]; idades[1,3]; idades[1,4]; idades[2,1]; idades[2,2]; 43 idades[2,3], idades[2,4]; idades[3,1]; idades[3,2]; idades[3,3]; idades[3,4]; idades[4,1]; ida- des[4,2]; idades[4,3]; idades[4,4]. Já a variável nomes é uma matriz de caracteres com três linhas e três colunas, 3 x 3: nomes[1,1]; nomes[1,2]; nomes[1,3]; nomes[2,1]; nomes[2,2]; nomes[2,3]; nomes[3,1]; nomes[3,2]; nomes[3,3]. Para melhor abstração, as matrizes acimas podem ser ilustradas da seguinte maneira: 1 2 3 4 Matriz idades 1 2 3 15 10 21 54 10 36 44 54 28 12 36 49 1 2 3 Matriz nomes 1 2 3 João Ana Mateus Maria Luísa Tiago Gustavo Felipe Bruna Para atribuir um valor ou acessar um elemento da matriz devemos utilizar o seguinte padrão: <variável>[<posição1>,<posição 2>] <- <valor> Exemplo: nomes[1,3] <- ”João da Silva” idades[2,3] <- 35 idades[2,4] <- idades[2,3] i <- 1 j <- 1 nomes[i,j] <- ”Maria” Como em vetores, as estruturas de repetições auxiliam no acesso dos elementos da ma- triz. Geralmente serão utilizadas duas repetições aninhadas, uma para linhas e outra para colu- nas. No exemplo a seguir foram utilizados vários para . . . faca aninhados: algoritmo ”Exemplo Matrizes” //Função: lê um vetor de real com 6 posições, depois imprima o vetor // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var numero: vetor [1..3,1..3] de real 44 linha, coluna: inteiro inicio // Seção de Comandos para linha de 1 ate 3 faca para coluna de 1 ate 3 leia (numero[linha, coluna]) fimpara fimpara escreva ( ”Conteúdo da Matriz”) para linha de 1 ate 3 faca para coluna de 1 ate 3 escreva (numero[linha, coluna]) fimpara escreval fimpara fimalgoritmo Saída do algoritmo 1 2 3 4 5 6 7 8 9 Conteúdo da Matriz 1 2 3 4 5 6 7 8 9 6.3 Exemplos para Fixação Os problemas e suas soluções apresentados abaixo, aplicam os conceitos até aqui estu- dados. 6.3.1 Vetor de Nomes em Ordem Alfabética [Manzano, 2003, 7.1] Criar um programa que efetue a leitura dos nomes de 20 pessoas e em seguida apresentá-los em ordem alfabética. Algoritmo Existem vários métodos para obter a ordenação de elementos de um vetor. Neste problema, será apresentado um método bastante simples, que consiste na comparação de cada elemento com todos os elementos subsequentes. A ordenaçao considerada é alfabética, devendo essa ser crescente, ou seja, de A até Z. 1. Definir a variável i do tipo inteira como variável de controle na repetição; 2. Definir a matriz Nome do tipo caractere para 20 elementos; 45 3. Iniciar o programa, fazendo a leitura dos 20 nomes; 4. Comparar o elemento atual com os subsequentes; 5. Caso o elemento seja "maior", realize a operação de troca; 6. Apresentar os 20 nomes ordenados. Algoritmo em Visualg: algoritmo ”Vetor em ordem alfabética” //Função: lê 20 nomes e mostra todos em ordem alfabética // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var Nome: vetor [1..20] de caractere i, j: inteiro aux: caractere inicio // Seção de Comandos para i de 1 ate 20 faca leia (Nome[i]) fimpara para i de 19 ate 3 faca para j de i + 1 ate 19 se (Nome[i] > Nome[j] ) entao aux <- Nome[i] Nome[i] <- Nome[j] Nome[j] <- aux fimse fimpara fimpara para i de 1 ate 20 faca escreva (Nome[i]) fimpara fimalgoritmo 6.3.2 Matriz de inteiros e diferentes somas de seus elementos Faça um algoritmo que leia uma matriz 3 x 3 e que calcule: 1. a soma da linha 3 da matriz; 2. a soma da coluna 2 de matriz; 3. a soma da diagonal principal; 46 4. a soma da diagonal secundária; 5. a soma de todos os elementos da matriz. Algoritmo em Visualg: algoritmo ”Matriz Somas” //Função: Executa somas descritas no enunciado // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var Matriz: vetor [1..3,1..3] de inteiros i, j, somaLinha, somaColuna, somaDiagPrinc, somaDiagSec, somaTudo : inteiro inicio // Seção de Comandos para i de 1 ate 3 faca para i de 1 ate 3 faca escreva (”Digite um valor para a matriz:”) leia (Matriz[i,j]) somaTudo <- somaTudo + Matriz[i,j] se (i = 3) entao somaLinha <- somaLinhas + Matriz[i,j] fimse se (j = 2) entao somaColuna <- somaColuna + Matriz[i,j] fimse se (i = j) entao somaDiagPrinc <- somaDiagPrinc + Matriz[i,j] fimse se (j = 4 - i) entao somaDiagSec<- somaDiagSec + Matriz[i,j] fimse fimpara fimpara escreva (”Soma dos elementos da linha 3 é”, somaLinha ) escreva (”Soma dos elementos da coluna 2 é”, somaColuna ) escreva (”Soma dos elementos da diagonal principal é”, somaDiagPrinc ) escreva (”Soma dos elementos da diagonal secundária é”, somaDiagSec ) fimalgoritmo 6.4 Exercícios de Fixação 1. [Manzano, 2003, 6.4] Ler 10 elementos de um vetor e apresentá-los. 2. [Medina e Ferting, 2005, 7.5] Faça um algoritmo que determine qual o maior elemento dentro de um vetor. 47 3. [Manzano, 2003, 6.4] Elaborar um programa que efetue o cálculo de uma tabuada de um número qualquer e armazene os resultados em vetor A com 10 elementos. Apresentar os valores armazenados no vetor. 4. [Manzano, 2003, 6.4] Ler dois vetores A e B com 10 elementos cada. Construir um vetor C, sendo este a junção dos dois outros vetores. Desta forma, C deverá ter o dobro de elementos, ou seja, 20. Apresentar o vetor C. 5. [Manzano, 2003, 6.4] Ler 20 elementos (valores reais) para temperaturas em graus Cel- sius. O programa deverá apresentar a menor, a maior e a média das temperaturas lidas. 6. [Medina e Ferting, 2005, 7.5] Faça um algoritmo que determine quantas vogais há em um vetor de caracteres. 7. [Medina e Ferting, 2005, 7.5] Faça um algoritmo que ordene e mostre em ordem cres- cente um vetor de 10 elementos. 8. [Medina e Ferting, 2005, 7.5] Faça um algoritmo que encontre o determinante de uma matriz 2 x 2. O determinante é dado pela diferença entre o produto da diagonal principal e o da diagonal secundária. 9. [Manzano, 2003, 8.4] Ler duas matrizes A e B, com 5 linhas e 3 colunas. Construir uma matriz C de mesma dimensão, que é formada pela soma dos elementos da matriz A com os elementos da matriz B, Apresentar a matriz C. 10. [Manzano, 2003, 8.4] Ler duas vetores A e B, cada um com 7 elementos. Construir uma matriz C, em que a primeira coluna deverá ser formada pelos elementos da matriz A e a segunda coluna deverá ser formada pelos elementos da matriz B. Apresentar a matriz C. 11. [Medina e Ferting, 2005, 7.5] Faça um algoritmo que transforme uma matriz M em seu espelho. Exemplo: 1 2 3 4 5 6 7 8 9 → 1 4 7 2 5 8 3 6 9 48 Capítulo 7 Sub-algoritmos Sub-algoritmo é um algoritmo que geralmente resolve um pequeno problema, e que está subordinado a um outro algoritmo, ou seja, realiza tarefas específicas. Ao invés de escrever um algoritmo grande e complexo, escrevem-se vários algoritmos menores, os quais, não isolada- mente, mas em conjunto, resolvem o problema proposto. Esta subordinação deve-se ao fato de que o sub-algoritmo só será executado se for solicitado. Sub-algoritmo possui início e fim e executa um conjunto pré-definido de instruções com um local próprio para sua definição possuindo um identificador, ou seja, um nome pelo qual é chamado em qualquer parte do algoritmo ou de outros sub-algoritmos. Assim o fluxo de execução do algoritmo começa pelo principal e é desviado para o sub-algoritmo chamado. Cada sub-algoritmo, pode ter suas próprias variáveis chamadas de variáveis locais, que existem apenas durante sua chamada. Na estruturação de algoritmos é conveniente utilizá-los, pois trazem as seguintes vanta- gens: • Reutilização de sub-algoritmos já implementados; • Melhor compreensão e visualização do algoritmo; • Detecção de erros com maior facilidade; Sub-algoritmos são declarados no início do algoritmo e podem ser chamados em qual- quer ponto após sua declaração. Há dois tipos de sub-algoritmos: Função, que retorna um 49 determinado valor, e Procedimento, que não há retorno de valor. O retorno de valores é a saída, por meio dele o sub-algoritmo pode dar uma "resposta"ou um resultado para quem o chamou. 7.0.1 Variável Global Variável global é vista e pode ser manipulada pelo programa principal e por todos os subalgoritmos pertencentes a ele. As variáveis globais são declaradas antes de todos os subal- goritmos. var < declaração de variáveis globais > < subalgoritmo 1> < subalgoritmo 2> ... < subalgoritmo i> inicio // Seção de Comandos fimalgoritmo A vantagem das variáveis globais é a sua fácil utilização.Mas como todos os subalgo- ritmos tem acesso e podem alterar o valor destas variáveis, deve ser analisado se o uso delas não trará um possível resultado indesejado. É aconselhavél não declarar variáveis globais com o mesmo nome das variáveis da função. 7.0.2 Variável Local Variável local é visível e manipulada apenas pelo subalgoritmo em que ela foi declarada. As variáveis locais são declaradas no início do subalgoritmo que pertence. var < declaração de variáveis globais > < subalgoritmo 1 > < declaração de variáveis locais do subalgoritmo 1 > < subalgoritmo 2> < declaração de variáveis locais do subalgoritmo 2 > ... < subalgoritmo i> < declaração de variáveis locais do subalgoritmo i > inicio // Seção de Comandos fimalgoritmo 50 A vantagem de uma variável local é a independência em relação ao resto. Uma alteração em uma variável local afetará apenas no próprio subalgoritmo onde foi declarada. Garantindo assim que não terá resultado indesejado em outros subalgoritmos. 7.0.3 Parâmetros Ao se chamar um subalgoritmo, também é possível passar-lhe determinadas informa- ções que recebem o nome de parâmetros. Há duas formas de passagem de parâmentros existen- tes: por valor e por referência. Passagem de parâmetros por valor Na passagem de parâmentros por valor, uma cópia da variável é feita durante a chamada do subalgoritmo. <subalgoritmo> <nome>(<variável 1>,..., <variável i>:<tipo de dado>) Passagem de parâmetros por referência Na passagem de parâmetros por referência, o endereço da variável é passado, em vez da cópia do valor. O que acontece neste processo é que apesar de ter outro identificador, os valores manipulados no subalgoritmo estão no mesmo espaço de memória que as variáveis passadas na chamada do subalgoritmo, assim todas as alterações feitas no interior de um subalgoritmo refletirão na variável passada pelo parâmetro. <subalgoritmo> <nome>(var <variável 1>,..., <variável i>:<tipo de dado>) O que difere da passagem por valor é utilização da palavra-chave var, que simbolizará a passagem por referência. 7.1 Procedimentos Procedimentos são subalgoritmos que agrupam um conjunto de comandos, que são exe- cutados quando o procedimento é chamado. Nenhum procedimento possui tipo de dado de retorno. A sua criaçao deve ser realizada dentro da secção de variáveis 51 algoritmo ”<nome do algoritmo>” // Função: // Autor: // Data: //Seção de Declarações var <declaração de variáveis globais> <definição do procedimento > inicio // Seção de Comandos fimalgoritmo A declaração do procedimento deve estar entre o final da declaração de variáveis e a linha inicio do programa principal, e possuem a seguinte sintaxe: procedimento <nome do procedimento> ([var]<parâmetros>: <tipo de dado>) var <declaração de variáveis locais> inicio <lista de comandos> fimfuncao • Parâmetros: Entre um mesmo tipo de dados são separados por vírgula. Entre tipos de dados a separação é feita com ponto-e-vírgulas. Exemplo x, y: inteiro; a, b: real. Tal que var é opcional. retorne, os tipos retornados são: real, inteiro, lógico ou caractere. • Declaração de variáveis locais: idêntica a declaração de variáveis globais. As variáveis declaradas localmente tem validade apenas na função. Exemplo algoritmo ”Exemplo de Procedimento” //Função: somar dois valores utilizando função // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var A. B, C, D, cont, aux: inteiro procedimento Trocar(var x, y: inteiro) var aux: inteiro inicio aux <- x 52 x <- y y <- aux fimprocedimento inicio // Seção de Comandos leia ( A, B, C, D ) escreval (”A = ”, A,” e B = ”), B ) Trocar (A, B) escreval (”A = ”, A,” e B = ”), B ) escreval (”C = ”, C,” e D = ”), D ) Trocar (C, D) escreval (”C = ”, C,” e D = ”), D ) fimalgoritmo Saída do algoritmo 19 5 10 3 A = 19 e B = 5 A = 5 e B = 19 C = 10 e D = 3 C = 3 e D = 10 7.2 Funções Funções são subalgoritmos que possuem como objetivo retornar apenas um valor ou uma informação ao algoritmo que lhe chamou. A chamada de uma função é feita através da citação do seu nome, seguido opcionalmente de seus argumentos iniciais. As funções podem ser predefinidas pela linguagem, ou criadas pelo programador de acordo com o seu interesse. Por analogia, na Matemática, escreve-se (ou define-se) uma função por meio de parâ- metros, a seguir exemplos onde se define as funções f , g e h: • f(x) = x2 − 3x+ 2, função f foi definida em termos do parâmetro x; • g(x, y) = x2 + y3, função g foi definida em termos de dois parâmetros x e y; • h(x, y, z) = x2 + 2y + z2, função h foi definida em termos de três parâmetros x, y e z. Espera-se que em funções matemáticas a resposta, análogo a retorno, seja um valor do tipo númerico, o mesmo ocorre com os valores dos parâmetros das funções. Para saber o valor de retorno das funções para valores em particular dos argumentos, por exemplo, na função f , basta substituir x por um valor escolhido, como x = 3, este valor onde aparece o parâmetro x: 53 • f(3) = 32 − 3(3) + 2 = 2, valor de resposta ou retorno é 2; • g(3, 2) = 32 + 23 = 17, valor de resposta ou retorno é 17; • h(1, 3, 2) = 12 + 2(3) + 22 = 11, valor de resposta ou retorno é 11; Voltando para sub-algoritmos, em VisuAlg a criação de uma função deve ser realizada dentro da seção de variáveis: algoritmo ”<nome do algoritmo>” // Função: // Autor: // Data: //Seção de Declarações var <declaração de variáveis globais> <definição da função > inicio // Seção de Comandos fimalgoritmo A declaração da função deve estar entre o final da declaração de variáveis e a linha inicio do programa principal, e possui a seguinte sintaxe: funcao <nome da função> ([var]<parâmetros>: <tipo de dado>) : tipo de retorno> var <declaração de variáveis locais> inicio <lista de comandos> retorne <variável ou valor de retorno> fimfuncao Cada função tem associada ao seu valor de retorno um tipo de dado explícito. • Parâmetros: Entre um mesmo tipo de dados são separados por vírgula. Entre tipos de dados a separação é feita com ponto-e-vírgulas. Exemplo x, y: inteiro; a, b: real. Tal que var é opcional. • Tipo de retorno: Estará associado ao tipo do valor que a função retornará com o comando retorne, os tipos retornados são: real, inteiro, lógico ou caractere. • Declaração de variáveis locais: idêntica a declaração de variáveis globais. As variáveis declaradas localmente tem validade apenas na função. 54 • retorne: comando que executa o encerramento do subprograma, retornando imediata- mente um único valor. Esta instrução só pode retornar um único valor. O valor que comando retornará deve ser do mesmo tipo que o especificado no início da função em tipo de retorno. Exemplo: algoritmo ”Exemplo de Função” //Função: somar dois valores utilizando função // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var x, y, s: real funcao Somar(valor1, valor2: real) : real var soma : real inicio soma <- valor1 + valor2 retorne soma fimfuncao inicio // Seção de Comandos leia ( x, y ) escreval (”Soma = ”, Somar(x, y) ) x <- 3 y <- 4 s <- Somar (y, x) escreval (”Soma = ”, s ) escreval (”Soma = ”, Somar(5, s) ) fimalgoritmo Saída do algoritmo 20 15 Soma = 35 Soma = 7 Soma = 12 7.2.1 Funções Pré-Definidas VisuAlg possui funções pré-definidas, as quais estão descritas abaixo e foram retiradas do Apoio Informática. http://www.apoioinformatica.inf.br/produtos/visualg. Atalho para es- tas funções é pressionar (CTRL+J) o visualg mostra uma Lista de funções predefinidas, basta selecionar a função desejada e dar um Enter, depois é só passar os parâmetros desejados. 55 Funções numéricas, algébricas e trigonométricas Abs(expressão) - Retorna o valor absoluto de umaexpressão do tipo inteiro ou real. Equivale ao módulo na álgebra. ArcCos(expressão) - Retorna o ângulo (em radianos) cujo cosseno é representado por expres- são. ArcSen(expressão) - Retorna o ângulo (em radianos) cujo seno é representado por expressão. ArcTan(expressão) - Retorna o ângulo (em radianos) cuja tangente é representada por expres- são. Cos(expressão) - Retorna o cosseno do ângulo (em radianos) representado por expressão. CoTan(expressão) - Retorna a cotangente do ângulo (em radianos) representado por expressão. Exp(base, expoente) - Retorna o valor de base elevado a expoente, sendo ambos expressões do tipo real. GraupRad(expressão) - Retorna o valor em radianos correspondente ao valor em graus repre- sentado por expressão. Int( expressão) - Retorna a parte inteira do valor representado por expressão. Log( expressão) - Retorna o logaritmo na base 10 do valor representado por expressão. LogN( expressão) - Retorna o logaritmo neperiano (base e) do valor representado por expres- são. Pi - Retorna o valor 3.141592. Quad( expressão) - Retorna quadrado do valor representado por expressão. RadpGrau( expressão) - Retorna o valor em graus correspondente ao valor em radianos repre- sentado por expressão. RaizQ( expressão) - Retorna a raiz quadrada do valor representado por expressão. Rand - Retorna um número real gerado aleatoriamente, maior ou igual a zero e menor que um. RandI( limite) - Retorna um número inteiro gerado aleatoriamente, maior ou igual a zero e menor que limite. Sen( expressão) - Retorna o seno do ângulo (em radianos) representado por expressão. Tan( expressão) - Retorna a tangente do ângulo (em radianos) representado por expressão. Os valores que estão entre parênteses, representados pelas palavras como expressão, base e expoente, são os parâmetros, ou como dizem alguns autores, os argumentos que passamos para a função para que realize seus cálculos e retorne um outro, que usaremos no programa. Algumas funções, como Pi e Rand, não precisam de parâmetros, mas a maioria tem um ou 56 mais. A seguir temos alguns exemplos que ilustram o uso destas funções. algoritmo ”Exemplo Funções Pré Definidas” //Função: Demostrar Funções Pré-Definidas // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var a, b, c: real inicio // Seção de Comandos a <- 2 b <- 9 escreval( a - b ) escreval( abs( a - b ) ) c <- raizq( b ) escreval( ”A área do círculo com raio ”, c , ” é ”, pi * quad(c) ) escreval( ”Um ângulo de 90 graus tem ”, grauprad(90), ” radianos ” escreval( exp(a, b) ) escreval( int( b / ( a + c ) ) ) fimalgoritmo Saída do algoritmo -7 7 A área do círculo com raio 3 é 28.2743338823 Um ângulo de 90 graus tem 1.57079633 radianos 512 1 Funções para manipulação de cadeias de caracteres strings Asc (s : caracter) : Retorna um inteiro com o código ASCII do primeiro caracter da expressão. Carac (c : inteiro) : Retorna o caracter cujo código ASCII corresponde à expressão. Caracpnum (c : caracter) : Retorna o inteiro ou real representado pela expressão. Compr (c : caracter) : Retorna um inteiro contendo o comprimento (quantidade de caracteres) da expressão. Copia (c : caracter ; p, n : inteiro) : Retorna um valor do tipo caracter contendo uma cópia parcial da expressão, a partir do caracter p, contendo n caracteres. Os caracteres são numerados da esquerda para a direita, começando de 1. Maiusc (c : caracter) : Retorna um valor caracter contendo a expressão em maiúsculas. Minusc (c : caracter) : Retorna um valor caracter contendo a expressão em minúsculas. Numpcarac (n : inteiro ou real) : Retorna um valor caracter contendo a representação de n como uma cadeia de caracteres. Pos (subc, c : caracter) : Retorna um inteiro que indica a posição em que a cadeia subc se encontra em c, ou zero se subc não estiver contida em c. A seguir temos alguns exemplos que 57 ilustram o uso destas funções. algoritmo ”Exemplo 2 Funções Pré Definidas” //Função: Demostrar Funções Pré-Definidas // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var a, b, c: caractere inicio // Seção de Comandos a <- 2 b <- 9 escreval( b + a ) escreval( caracpnum(b) + caracpnum(a) ) escreval( numpcarac(3 + 3) + a ) c <- ”Brasil” escreval( maiusc(c) ) escreval( compr(c) ) b <- ”O melhor do Brasil” escreval( pos(c ,b) ) escreval( asc(c) ) b <- carac (65) + carac (66) + carac (67) fimalgoritmo Saída do algoritmo 92 11 62 BRASIL 6 13 66 ABC 7.3 Exemplos de Fixação Os problemas e suas soluções apresentados abaixo, aplicam os conceitos até aqui estu- dados. 7.3.1 Ordenar dois números determinando o tipo de ordenação [Medina e Ferting, 2005, 5.5.2.1] Faça um algoritmo que ordene dois valores. A orde- nação dos números deve estar contida em um subalgoritmo. Um terceiro parâmetro determinará a ordem (crescente ou decrescente) para a ordenação. Suponha que os dois valores a serem or- denados, passados como parâmetros para o subalgoritmo, são sempre diferentes. Além disso, 58 considere que o subalgoritmo ordena deve retornar Verdadeiro, caso consiga executar a opera- ção, e Falso, caso a opção seja inválida. Algoritmo: Como na descrição do exercício diz que deve retornar uma resposta Verda- deiro ou Falso conclui-se que será feito o uso de função. A função deverá ordenar dois valores e retorná-los na ordem pedida. Como os valores podem ser modificados e tais modificações preci- sam ser mantidas, esses parâmetros devem ser passados por referência. Já o terceiro parâmetro, identificará o tipo de ordenação, não será modificado na função ordenação. Por isso, o parâme- tro deve ser passado por valor. Considere a opção 1 como crescente e a 2 como decrescente. Pode se observar que independente do tipo de ordenação que for escolhido, o código referente à troca de valores será igual para os dois, assim um procedimento pode fazer esse trabalho de troca. 1. Inicializar as variáveis v1, v2 do tipo real no programa principal; 2. Definir o procedimento Troca com dois parâmetros de passagem por referência do tipo real, p1 e p2; 3. Declarar no procedimento Trocar uma variável aux do tipo real que auxiliará na troca; 4. Auxiliar irá guardar valor de p1; p1 receberá o valor de p2 e p2 receberá aux; 5. Definir a funçao Ordenar do tipo lógico, com 3 parâmetros dois por referência e um por valor, valor1, valor2, opcao; 6. Verificar a opção escolhida; 7. Caso seja 1 verificar se o valor1 é maior que valor2 e então realizar a troca chamando procedimento Trocar; 8. Caso seja 2 verificar se o valor1 é menor que valor2 e entao realizar a troca chamando procedimento Trocar; 9. Caso seja uma opção inválida retorne FALSO; 10. Caso tenha realizado um dos casos 1 ou 2, ou seja foi ordenado, retorne VERDADEIRO 11. Programa principal ocorre a leitura de dois valores v1, v2 e tipo de ordenação tp; 59 12. Verifica se foram ordenados os valores de acordo com o da função Ordenar e seus seguin- tes parâmetros, v1, v2 e tp; 13. Se for VERDADEIRO imprimir os números ordenados; 14. Caso contrário, FALSO, apresentar mensagem "Opção Inválida". Algoritmo em VisuAlg: algoritmo ”Ordenar 2 Números” //Função: Ordenar dois números de acordo com tipo de ordenação // Autor: Autores da Apostila // Data: 2015 //Seção de Declarações var v1, v2: real tp: inteiro procedimento Trocar(var p1, p2: real) var aux: inteiro inicio aux <- p1 p1 <- p2 p2 <- p1 fimprocedimento funcao Ordenar(var valor1, valor2: real; opcao: inteiro) : logico inicio escolha opcao caso 1 se (valor1 > valor2) entao Trocar(valor1, valor2) fimse caso 2 se (valor1 < valor2) entao Trocar(valor1, valor2) fimse outrocaso retorne FALSO fimescolha retorne VERDADEIRO fimfuncao inicio // Seção de Comandos escreva ( ”Entre
Compartilhar