Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Veiga de Almeida Ciência da Computação ALGORITMOS E PROGRAMAÇÃO I PROF. M. Sc. EDGAR GURGEL RIO DE JANEIRO Algoritmos e Programação I Prof. Edgar Gurgel Página 2 de 106 SUMÁRIO I - Algoritmos e Fluxogramas ........................................................................................ 4 1 - Introdução ................................................................................................................ 4 2 - Conceito de Algoritmo ............................................................................................ 5 3 - Exemplos Informais de Algoritmos ........................................................................ 6 3.1 - Exemplo 1: Troca de uma lâmpada queimada ................................................. 7 4 - Exemplo de um Algoritmo ...................................................................................... 7 5 - Fluxogramas (Diagrama de Blocos) ........................................................................ 8 Exercícios: .................................................................................................................. 10 II - Conceitos Básicos ................................................................................................... 11 1 - Tipos Primitivos de Dados .................................................................................... 11 2 - Constantes ............................................................................................................. 11 3 - Variáveis ................................................................................................................ 12 4 - Identificadores ....................................................................................................... 12 5 - Expressões Aritméticas ......................................................................................... 13 6 - Expressões Lógicas ............................................................................................... 14 7 - Cadeias de Caracteres ............................................................................................ 15 8 - Comando de Atribuição ........................................................................................ 16 9 - Entrada e Saída de Dados ...................................................................................... 17 10 Blocos .................................................................................................................... 18 Exercícios: .................................................................................................................. 18 III - Estrutura de Sequência ........................................................................................ 21 1 - Introdução .............................................................................................................. 21 2 - Conceito de Sequência .......................................................................................... 21 3 – Exemplos .............................................................................................................. 21 Exercícios ................................................................................................................... 25 IV – Função ................................................................................................................... 27 4.3.1 Funções Numéricas ........................................................................................ 28 4.3.2 Funções Strings .............................................................................................. 29 V - Estrutura de Seleção .............................................................................................. 39 1 - Conceito de Seleção .............................................................................................. 39 2 - Seleção Simples ..................................................................................................... 39 3 - Seleção Composta ................................................................................................. 40 4 - Seleção Encadeada (Se´s encaixados) ................................................................... 42 5 - Seleção de Múltipla Escolha (Estrutura Caso) ...................................................... 43 VI - Estrutura de Repetição ......................................................................................... 48 1 - Conceito de Repetição ........................................................................................... 48 2 - Enquanto (Repetição com Teste no Início) ........................................................... 48 3 - Repita (Repetição com Teste no Final) ................................................................. 50 4 - Para (Repetição com Variável de Controle) .......................................................... 52 Exercícios: .................................................................................................................. 53 VII - Arranjos Unidimensionais (Vetores) ............................................................ 57 1 - Tipos Construídos ................................................................................................. 57 2 - Arranjos em uma dimensão ................................................................................... 57 Exercícios: .................................................................................................................. 60 Algoritmos e Programação I Prof. Edgar Gurgel Página 3 de 106 Anexos ........................................................................................................................ 61 A – Programação em C ............................................................................................ 61 B – Tutorial Dev C++ ............................................................................................... 96 C – Tutorial Visual C ............................................................................................. 103 Algoritmos e Programação I Prof. Edgar Gurgel Página 4 de 106 I - Algoritmos e Fluxogramas 1 - Introdução Os computadores, infelizmente, só fazem aquilo que se manda, e não necessariamente aquilo que se deseja que eles façam. Não deve haver ambiguidade nas instruções dos programas que se fornece ao computador, nem a possibilidade de interpretações alternativas. O computador sempre tomará algum caminho em suas ações, muito cuidado é necessário para se assegurar que o computador siga pelo único caminho correto possível que leve aos resultados desejados. Por exemplo, uma afirmação como: “calcule a média qualquer de notas” é muito imprecisa, apesar de parecer especificar aquilo que se deseja. Muitos detalhes foram omitidos, entre eles cita- se: onde estão as notas, quantas são, os ausentes devem ou não ser incluídos, aqui está a essência da programação de computadores. Muitos problemas interessantes parecem ser complexos do ponto de vista da programação. Em alguns casos (tais como problemas matemáticos difíceis), esta complexidade pode ser inerente ao problema em si, entretanto, em muitos casos isto pode ser devido a outros fatores que estão dentro do nosso controle, por exemplo, uma especificação incompleta ou obscura do problema. No desenvolvimento de programas, como será visto, a complexidade não precisa ser sempre um problema, pois a mesma pode ser controlada adequadamente. A programação de computadores pode ser difícil. Tal dificuldade se deve a sua complexidadeinerente, combinando muitos processos mentais. Entretanto, pode-se tornar mais fácil. Por exemplo, um trabalho de programação pode tornar-se muito mais fácil se o mesmo for dividido sistematicamente em partes menos complexas (a abordagem do dividir para conquistar). Primeiramente, é importante separar a fase de resolução do problema da fase de implementação do problema. Na fase de resolução do problema, será concentrada a elaboração de um algoritmo para resolver um problema proposto. Somente depois da satisfação com a formulação de um algoritmo adequado é que se passará à implementação deste algoritmo em alguma linguagem de programação. Dado um algoritmo suficientemente preciso, sua codificação em alguma linguagem de programação é direta. Algoritmos e Programação I Prof. Edgar Gurgel Página 5 de 106 Figura 1.1: Resolução do Problema e Programação. 2 - Conceito de Algoritmo Um algoritmo pode ser definido como: uma sequência finita de instruções bem definidas, logicamente encadeadas e não ambíguas, onde cada uma das quais pode ser executada mecanicamente num período de tempo finito com uma quantidade de esforço finito para resolver um problema do mundo real. A definição sugere que os algoritmos tenham diversas propriedades importantes. Primeiramente, os passos de um algoritmo devem ser simples e sem ambiguidade e devem estar numa ordem cuidadosamente definida, Além disso, se insiste em que os algoritmos sejam efetivos, isto é, devem sempre resolver um problema utilizando um número finito de passos. Construir algoritmos é o objetivo principal de toda a programação, portanto desenvolver bons algoritmos é a principal tarefa do programador. Deve-se, pois, seguir algumas regras básicas na resolução de um problema: ! Compreender o problema • Deixar claro o problema; • Identificar as entradas e as saídas. ! Delinear um plano • Desenvolver um procedimento para a solução do problema. Solução em forma de Algoritmo Solução como um programa de computador Problema Passo difícil Fase da resolução do problema Fase da implementaçã o do problema Algoritmos e Programação I Prof. Edgar Gurgel Página 6 de 106 ! Executar o plano • Verificar manualmente e corrigi-lo, se necessário; • Codificar o algoritmo; • Executar o algoritmo com dados de teste, depurando quando necessário. ! Refinar e documentar o algoritmo • Voltar, revisando passos; • Dar um tratamento estético ao algoritmo. Todo algoritmo é composto por um grupo de ações primitivas (ações passíveis de execução por um ser humano ou por uma máquina). As ações primitivas que se utilizará na construção de algoritmos serão construções linguísticas em português (Portugol ou Português estruturado ou pseudocódigo). Esta técnica é baseada em uma PDL - Program Design Language (linguagem de projeto de programação), usada como referência genérica para uma linguagem de programação, tendo como finalidade mostrar uma notação para elaborações de algoritmos, os quais serão utilizados para a definição, criação e desenvolvimento de uma linguagem computacional. A diferença entre uma PDL e uma linguagem de programação de alto nível, é que a primeira (escrita em português, francês, alemão, ...) não pode ser compilada em um computador. Isto é, quando se cria um algoritmo em Pseudocódigo, está se assumindo que exista um computador hipotético capaz de executá-lo. 3 - Exemplos Informais de Algoritmos Apesar de o termo ser novo em si, o conceito é certamente bastante familiar. As indicações dadas para se chegar a uma determinada rua constituem um algoritmo para se encontrar essa rua. Como exemplo pode-se citar: receita de cozinha, planta de projeto, etc. Por exemplo, as instruções para trocar uma lâmpada queimada são constituídas por uma descrição dos objetos manipulados e por uma sequência de passos. Estas instruções podem ser descritas como um algoritmo informal. Algoritmos e Programação I Prof. Edgar Gurgel Página 7 de 106 3.1 - Exemplo 1: Troca de uma lâmpada queimada ! Desligar o interruptor; ! Selecionar uma nova lâmpada para a substituição; ! Posicionar a escada embaixo da lâmpada queimada; ! Subir na escada; ! Retirar a lâmpada queimada do soquete; ! Descer da escada; ! Deixar a lâmpada queimada; ! Pegar a lâmpada boa; ! Subir na escada; ! Colocar a nova lâmpada no soquete; ! Descer da escada; ! Ligar o interruptor; ! Guardar a lâmpada queimada e a escada. 4 - Exemplo de um Algoritmo Para se ter noção de um algoritmo se tomará como exemplo a soma dos 100 primeiros números inteiros positivos. O objetivo da apresentação deste exemplo é fornecer uma ideia intuitiva dos passos e do raciocínio envolvidos na geração de um algoritmo. No caso de se resolver este problema em uma calculadora, seria fornecido a ela a seguinte sequência de passos: Limpar o visor da calculadora Pressionar a tecla 1; Pressionar a tecla +; Pressionar a tecla 2; Pressionar a tecla +; Pressionar a tecla 3; Pressionar a tecla +; ... Pressionar a tecla 100; Pressionar a tecla = O símbolo “...” na descrição de ações acima é muito importante, pois indica que existe um padrão de comportamento que se repete ao longo da descrição e, portanto, Algoritmos e Programação I Prof. Edgar Gurgel Página 8 de 106 não é necessário enumerar todos os passos, porque se pode facilmente gerar e executar os que estão implícitos. No entanto, a existência destes símbolos não permite qualificar o conjunto de instruções anteriores como um algoritmo, pois a característica da rigorosidade deixa de se verificar. Para transformar as instruções anteriores num algoritmo que possa ser executado por um computador, é necessário tornar explícito o que está implícito. Só que para explicitar todos os passos do algoritmo anterior, teria-se mais trabalho do que executar o algoritmo propriamente dito, portanto será conveniente encontrar uma solução alternativa. A solução para este tipo de algoritmo será vista a seguir nas estruturas de controle. 5 - Fluxogramas (Diagrama de Blocos) É frequentemente mais fácil transmitir ideias através de ilustrações. Mapas fornecem uma representação conveniente da topologia da cidade, e pode ter mais valor quando se está perdido do que as explicações verbais. Uma primeira tentativa no sentido de utilizar um formato gráfico na descrição de algoritmos, que data dos dias de Von Neumann, envolveu o uso de fluxogramas. Um fluxograma mostra a lógica de um algoritmo, enfatizando os passos individuais e suas interconexões. Durante os anos um simbolismo relativamente padrão apareceu. Um cálculo é representado por um retângulo, uma decisão por um losango e as operações de entrada e saída por formas simbolizando os meios utilizados. Estes símbolos são ligados por linhas que indicam a ordem e o sentido em que as operações devem ser executadas. Nos últimos anos, a atitude dos profissionais de programação em relação ao popular fluxograma esfriou consideravelmente. A opinião sobre os fluxogramas varia. Para alguns, são considerados simplesmente um apêndice desnecessário de um programa; para outros, são vistos como um instigador de maus hábitos de programação. Uma nova geração de programadores está sendo educada com novos métodos de desenvolvimento de programas, métodos aos quais o fluxograma, adiciona muito pouco. Muitas vezes, quando mostra a lógica de um algoritmo, o fluxograma obscurece sua estrutura. Assim sendo percebeu-se que a estruturaé tão importante (e possivelmente mais) quanto a lógica. Algoritmos e Programação I Prof. Edgar Gurgel Página 9 de 106 Símbolos comuns de fluxogramas Cálculo Decisão Entrada Saída Início / Fim Conectores Exemplo de um fluxograma Início nota1, nota2 nota3, nota4 media ← (nota1 + nota2 + nota3 + nota4) / 4 sim se não media >= 5.0 ‘você passou com uma ‘você foi reprovado com nota de’, media uma nota de’, media Fim Algoritmos e Programação I Prof. Edgar Gurgel Página 10 de 106 Exercícios: 1) O que é um algoritmo? E qual a sua finalidade na programação? 2) Explique sucintamente o que seriam as fases de resolução e implementação de um programa. 3) O que é um fluxograma? 4) Usando o conceito de algoritmo informal, elabore um para mudar um pneu furado. Admita que estão disponíveis um macaco e um estepe em boas condições. 5) Três senhoras, dona Branca, dona Rosa e dona Violeta passeavam pelo parque quando dona Rosa disse: Não é curioso que estejamos usando vestidos de cores branca, rosa e violeta, embora nenhuma de nós esteja usando um vestido de cor igual ao seu próprio nome. “Uma simples coincidência”, respondeu a senhora com o vestido violeta. Diga qual a cor do vestido de cada senhora? 6) Três jesuítas e três canibais precisam atravessar um rio; para tal, dispõem de um barco com capacidade para duas pessoas. Por medida de segurança, não se deve permitir que em alguma margem a quantidade a quantidade de jesuítas seja inferior à de canibais. Qual a solução para efetuar a travessia com segurança? Elabora um algoritmo mostrando a resposta, indicando as ações que concretizam a solução deste problema. 7) Elabore um algoritmo que mova três discos de uma Torre de Hanói, que consiste em três hastes (a,b,c), uma das quais serve de suporte para três para três discos de tamanhos diferentes (1,2,3), os menores sobre os maiores. Pode-se mover um disco de cada vez para qualquer haste, contanto que nunca seja colocado um disco maior sobre um menor. O objetivo é transferir os três discos para outra haste. Algoritmos e Programação I Prof. Edgar Gurgel Página 11 de 106 II - Conceitos Básicos 1 - Tipos Primitivos de Dados Um tipo de dado primitivo corresponde ao conjunto de valores que uma variável, constante, expressão ou função pode assumir e o conjunto de operações que podem ser efetuadas sobre ele. Estes conjuntos de valores são definidos pelas linguagens de programação, sobre modelos matemáticos, que aproveitam as operações sobre estes modelos. No caso do estudo de algoritmos, usaremos os tipos: • Numéricos: #Inteiro: toda e qualquer informação numérica que pertença ao conjunto dos números inteiros, isto é, dados numéricos positivos, negativos e o zero, excluindo-se os números fracionários. #Real: toda e qualquer informação numérica que pertença aos números reais, isto é, o conjunto dos inteiros mais os números fracionários. • Não-numéricos: #Caractere: toda e qualquer informação composta por apenas um dos caracteres alfanuméricos {0...9 }, {A...Z }ou especiais, por exemplo {%, &, <, +, #, ®, @, ...}. Os tipos caracteres devem ser indicados entre aspas simples (‘ ’). #Cadeia: toda e qualquer informação composta por um conjunto de caracteres alfanuméricos e/ou especiais. Também deve ser indicado entre aspas duplas e seu tamanho deve ser especificado. #Lógico: informação que pode assumir apenas duas situações: verdadeiro ou falso. Sendo que este tipo de dado poderá representar apenas um dos dois valores. 2 - Constantes Entende-se que uma informação é constante quando não sofre variações no decorrer do programa. Para diferenciar as informações constantes de tipo caractere dos outros tipos de informação, utilizaremos as aspas simples e duplas. A declaração de constantes nos algoritmos será feita, por exemplo, da seguinte forma: const preco = 45; {inteiro} Algoritmos e Programação I Prof. Edgar Gurgel Página 12 de 106 resposta = ‘s’; {caracter} carro = “caminhão”; {cadeia} pi = 3.1415; {real} situacao = verdadeiro; {lógico} 3 - Variáveis Uma informação é classificada como variável quando tem a possibilidade de ser alterada em algum instante no decorrer do programa. Todo dado a ser armazenado na memória de um computador deve ser previamente identificado, ou seja, primeiro é necessário saber qual o seu tipo, para depois fazer a alocação de um espaço de memória para o seu armazenamento adequado. Em um ambiente computacional, as informações variáveis são guardadas em dispositivos eletrônicos chamados de memória. Esta memória pode ser vista como um “armário” composto de várias “gavetas”, no qual as gavetas seriam os locais físicos responsáveis por armazenar objetos; os objetos (que podem ser substituídos) seriam as informações e as gavetas seriam as variáveis. Visto que na memória existem inúmeras variáveis, precisa-se diferenciá-las, o que é feito através do nome da variável. Cada variável, no entanto, pode guardar apenas uma informação de cada vez, sendo sempre do mesmo tipo. Os exemplos abaixo mostram como se deve declarar uma variável: var nome, endereco: cadeia[40]; apart: inteiro; resposta: lógico; 4 - Identificadores São as constantes, as variáveis e o nome do programa e servem para a sua identificação no programa. Os identificadores devem acompanhar as seguintes regras de formação: a) Devem começar por um caractere alfabético; b) Podem ser seguidos por mais caracteres alfabéticos e/ou numéricos e/ou (_); c) Não é permitido o uso de caracteres especiais, com exceção para o sublinhado (_); d) Os nomes escolhidos devem explicitar seus conteúdos; Algoritmos e Programação I Prof. Edgar Gurgel Página 13 de 106 e) Os nomes escolhidos não podem ser uma palavra reservada do programa; Não poderá haver no mesmo programa dois identificadores com o mesmo nome, mesmo que representem a mesma grandeza. 5 - Expressões Aritméticas Denomina-se expressão aritmética aquela cujos operadores são aritméticos e cujos operandos são constantes e/ou variáveis do tipo numérico (inteiro e/ou real). Operadores Aritméticos FUNÇÃO SÍMBOLO Adição + Subtração - Multiplicação * Divisão / Potenciação ^ Quociente da divisão inteira DIV ou # Resto da divisão inteira MOD ou % Além das operações básicas anteriormente citadas, pode-se usar nas expressões aritméticas algumas funções da matemática: Funções Aritméticas (Primitivas) FUNÇÃO SÍMBOLO Retorna o seno de X SIN(X) Retorna o cosseno de X COS(X) Retorna a tangente de X TG(X) Retorna o arco cujo seno é X ARCSIN(X) Retorna o arco cujo cosseno é X ARCCOS(X) Retorna o arco cujo tangente é X ARCTG(X) Retorna o valor absoluto de X ABS(X) Retorna o logaritmo na base e de X LOG(X) Retorna o logaritmo na base 10 de X LOG10(X) Retorna a raiz quadrada de X SQRT(X) ou RAIZ(X) Retorna o quadrado de X SQR(X) ou QUAD(X) Arredonda o fracionário X para o inteiro superior ROUND(X) Arredonda o fracionário X para o inteiro inferior TRUNC(X) Retorna a exponencial e elevado a X EXP(X) Algoritmos e Programação I Prof. Edgar Gurgel Página 14 de 106 6 - Expressões LógicasDenomina-se expressão lógica aquela cujos operadores são lógicos e/ou relacionais e cujos operandos são relações e/ou variáveis e/ou constantes do tipo lógico. Operadores Relacionais FUNÇÃO SÍMBOLO Igual a = Diferente de <> Maior que > Menor que < Maior ou igual que >= Menor ou igual que <= Utilizar-se-á quatro conectivos básicos para a formação de novas preposições a partir de outras já conhecidas. Os operadores lógicos são: Operadores Lógicos FUNÇÃO SÍMBOLO Conjunção E Disjunção não-exclusiva Ou Negação Nã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, e um conjunto de operadores lógicos. • Negação (~) ⇔ Conectivo não: A Não A Verdadeiro Falso Falso Verdadeiro • Conjunção (^) ⇔ Conectivo e : A B A e B Verdadeiro Verdadeiro Verdadeiro Verdadeiro Falso Falso Falso Verdadeiro Falso Falso Falso Falso Algoritmos e Programação I Prof. Edgar Gurgel Página 15 de 106 • Disjunção (v) ⇔ Conectivo ou: A B A ou B Verdadeiro Verdadeiro Verdadeiro Verdadeiro Falso Verdadeiro Falso Verdadeiro Verdadeiro Falso Falso Falso Durante a execução de uma expressão que envolve vários operadores, é necessária a existência de prioridades, caso contrário poderemos obter valores que não representam o resultado esperado. É a seguinte a hierarquia que deve ser seguida: 1. Efetuar as operações embutidas em parênteses mais internos 2. Efetuar funções matemáticas 3. Efetuar potenciações 4. Efetuar as multiplicações e/ou divisões 5. DIV e/ou MOD 6. Efetuar adição e/ou subtração 7. Operadores relacionais 8. Operadores lógicos 8.1. não 8.2.e / ou 7 - Cadeias de Caracteres Tradicionalmente, os computadores têm sido associados à solução de problemas numéricos, tais como os executados por operadores aritméticos. Entretanto, nos últimos anos, um grande número de aplicações interessantes, utilizando computadores, tem sido feito em problemas essencialmente não numéricos, tais como classificação, tradução de línguas, edição de textos e assim por diante. As maiores características de utilização do computador nestas aplicações são as tomadas de decisão e capacidade de armazenamento e não sua habilidade em realizar operações aritméticas. Através dos anos, muito conjuntos de caracteres (ou alfabetos) para utilização no computador foram desenvolvidos. Dois conjuntos dos mais importantes e maiores são aqueles conhecidos como EBCDIC (Extended Binary Coded Decimal Interchange Code) e principalmente o ASCII (American Standard Code for Information Algoritmos e Programação I Prof. Edgar Gurgel Página 16 de 106 Interchange), porque foi desenvolvido como um esquema padrão de codificação para a indústria de computadores e é utilizado em muitas máquinas de outros fabricantes. O conceito de cadeia de caracteres é, como o próprio nome já diz, um conjunto de caracteres tratados como uma única informação. 8 - Comando de Atribuição Um comando de atribuição permite fornecer um valor a uma certa variável (guardar um objeto em uma gaveta), onde o tipo dessa informação deve ser compatível com o tipo de variável, isto é, somente podemos atribuir um valor inteiro a uma variável capaz de comportá-lo, ou seja, uma variável declarada do tipo inteiro. Exemplos: total ← 34; resposta ← verdadeiro; time_bom ← “Flamengo”; A característica principal das variáveis é a de que podem guardar valores diferentes em tempos diferentes. A habilidade de modificar os valores das variáveis é muito importante, por isso, às vezes, pode-se verificar a presença de mesma variável em ambos os lados da linha de atribuição. Considere que esta aparição em ambos os membros têm significados diferentes no processamento do comando. No exemplo abaixo, o primeiro valor que a variável X alocará será 1, no segundo momento este valor passará a ser 2. O primeiro valor será perdido e o segundo valor continuará alocado na memória, até que haja uma nova atribuição a esta variável. Por isso que se diz que o comando de atribuição é uma operação destrutiva, pois qualquer valor que a variável possuía antes do processamento da operação de atribuição se perde, sendo substituído pelo novo valor. O exemplo mostra a função da variável em cada um dos lados. x ← 1; x ← x + 1; Indica que um segundo valor será atribuído à variável x Indica que o primeiro valor da variável x será utilizado Algoritmos e Programação I Prof. Edgar Gurgel Página 17 de 106 9 - Entrada e Saída de Dados Os cálculos do computador não são de grande valor a não ser que, primeiro, se possa fornecer os dados sobre os quais estes cálculos serão efetuados e, segundo, ver os resultados desses cálculos. Uma vez que as operações de entrada e saída são muito relacionadas à interação dos programadores, sua forma é altamente dependente da linguagem de programação específica utilizada e, às vezes, do próprio sistema de computador. Todo algoritmo para computador possui comandos que levam a informação da memória principal do computador a seus periféricos e vice-versa. Os comandos que se fará uso para manusear entrada e saída de informações são mostrados a seguir: leia(lista de entrada) A lista de entrada nos dá os nomes das variáveis às quais os valores devem ser atribuídos. O comando ler permite ler valores dados atribuindo-os a variáveis indicadas. Há de se ressaltar que o processo de associar valores às variáveis indicadas é semelhante à operação de atribuição em dois importantes aspectos: • Qualquer valor que a variável possua anteriormente será destruído; • Como na atribuição, é verificada a compatibilidade de tipo. O exemplo abaixo demonstra tais aspectos: var a, x: inteiro; x ← 1; leia(a, x);{valores de a e x lidos são 3 e 4} leia(a); {valor de a lido seja 10} Nota-se, ao executar o exemplo acima, que o valor final de A será 10, pois o outro valor (3) foi destruído, devido a ordem de execução dos comandos e que o valor de X será 4 pelo mesmo motivo. escreva(lista de saída) O comando de saída é semelhante ao comando de entrada em formato, porém um pouco mais geral em termos do que se pode especificar na lista de saída. É possível mostrar: • O conteúdo de qualquer variável; Algoritmos e Programação I Prof. Edgar Gurgel Página 18 de 106 • O resultado de qualquer expressão; • O valor de qualquer constante. Seguem alguns exemplos: escreva(y); escreva(a, b, media); escreva(“Bom Dia!”, nome); escreva(“Você pesa”, x*2, “quilos”); 10 Blocos Um bloco pode ser definido como um conjunto de ações com uma função definida; neste caso, um algoritmo pode ser visto como um bloco. Delimita-se o bloco por um início e um fim. início . . {sequência de ações} . fim. Exercícios: 8) Determine o valor atribuído a variável A e diga qual o tipo de dado resultante das expressões (inteiro ou real): • A ← 3 ^ 3 + 4 * 8 / 5 + 2 * 4 • B ← 16 - 12 / 3 C ← 3 A ← B div C + (B - 2 * C) mod C 9) Determine o valor de X nas expressões: • A ← 2 X ← 6 - SQRT (2 ^ A) * 5 - 4 * (18 - 4 ^ 2) • A ← 2 B ← 4 X ← ((28 + 3 * B) / A - (A ^ B)) * 3 * 2 Algoritmos e Programação I Prof. Edgar Gurgel Página 19 de 106 10) Dar o valor final da variável RESULT após a execução da seguinte seqüência de operações (supor que todas as variáveis sejam reais): BONUS ← 2 RESULT ← BONUS * 4 TAXA ← RESULT mod BONUS RESULT ← RESULT - 2 * BONUS11) Determine o resultado (se falso ou verdadeiro) das seguintes expressões lógicas: • não (X mod Y > 13) e não (Y > 22), para X=14 e Y=3 • não DIAUTIL ou ((HORASDIA > 8) e não (HORASTOT div HORASDIA > 21)), para DIAUTIL = falso, HORASDIA = 4 e HORASTOT = 22 • não (DIAUTIL e (HORASTOT < 20)), para os mesmos valores de DIAUTL e HORASTOT • não (OK) e (NUM > TOT), para OK = falso, NUM = 4 e TOT = 22 12) Dar o valor de variável RESULT após a execução da seguinte sequência de operações. • RESULT ← 3.0 * 6 • X ← 2.0; Y ← 3.0; RESULT ← X ^ Y - X; • RESULT ← 4; X ←2; RESULT ← RESULT * X; • A ← 14; C ← 3; RESULT ← A div 3 + (3 - 2 * C) mod C; 13) Determine o valor atribuído a variável A e diga qual o tipo de dado resultante da expressão poderá ser. • A ← (7 + 3 * 5) div 4 • B ←3 Algoritmos e Programação I Prof. Edgar Gurgel Página 20 de 106 A ← (6 + 3 * B) mod B • A ← (7 + 4 * 8) / (5 + 2 * 4) • B ← 14 C ←3 A ← B div C + (B - 2 * C) mod C 14) Resolva as seguintes expressões lógicas • 2*4 = 24/3 • 15 mod 4 < 19 mod 6 Algoritmos e Programação I Prof. Edgar Gurgel Página 21 de 106 III - Estrutura de Sequência 1 - Introdução Na criação de algoritmos, serão utilizados 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 estes conceitos de forma a representar o conjunto de ações. 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. Através das estruturas básicas de controle do fluxo de execução – sequência, seleção, repetição – e da combinação delas, pode-se criar um algoritmo para solucionar qualquer problema. 2 - Conceito de Sequência Sequência é um conjunto de ações primitivas que serão executadas numa sequência linear de cima para baixo, isto é, serão executadas na mesma ordem em que foram escritas. As ações devem sempre ser seguidas por ponto-e-vírgula(;), que objetiva separar uma instrução da outra e auxiliar organização sequencial das ações, pois após encontrar um (;) deve-se executar o próximo comando da sequência. 3 – Exemplos Exemplo 1: Uma loja de móveis está promovendo uma liquidação anual. Deve-se desenvolver um programa para calcular o preço total, para o cliente de um item que terá certa redução percentual (desconto) sobre seu preço de lista. Para se resolver este problema, o primeiro passo é procurar entendê-lo. Do modo como foi feito, o enunciado do problema é muito geral. Por exemplo, poder-se fazer as seguintes perguntas: • Todos os itens terão o mesmo desconto? • O que é incluído no preço total para o cliente? • Devem ser incluídos impostos? Neste caso a que taxa? Algoritmos e Programação I Prof. Edgar Gurgel Página 22 de 106 Um programador deve tomar decisões a respeito da fonte e natureza dos dados de entrada, da saída desejada, do grau de precisão e assim por diante. Programadores profissionais geralmente tomam essas decisões discutindo com os futuros usuários do programa. Neste problema, descobriu-se que a redução percentual (o desconto) sobre o preço de lista é diferente de item para item. O preço total para o cliente incluirá o preço com desconto, mais uma taxa de imposto fixo de 5% sobre esse preço. No entanto, os usuários do programa querem que seja também calculada a quantia economizada como o resultado do desconto. Temos, pois, que fornecer ao programa informações relativas ao preço do item e à percentagem de desconto. O programa, então, dará informações relativas à quantia economizada e preço total para o cliente. Mais a título de metodologia serão utilizadas algumas regras para desenvolver este primeiro programa. # REGRA 1 # A primeira declaração em um programa serve para lhe dar um nome, este é facultativo, mas sempre obedecendo às regras dos identificadores. Esta primeira declaração marca o seu ponto inicial. Exemplo: Algoritmo PRECO_VENDA; # REGRA 2 # Logo após o nome do programa vem a declaração das constantes, se nele houver. Todas as constantes a serem usadas no programa recebem os seus valores pré-definidos. Exemplo: const taxa_imp = 0.05; # REGRA 3 # Depois disto vem a declaração das variáveis a serem usadas no programa. O nome e também o tipo das variáveis devem ser declarados. A regra 3 requer o desenvolvimento de um procedimento para resolver o problema. Isto é, as incógnitas (variáveis de saída) devem ser determinadas por algum tipo de manipulação de dados (variáveis de entrada). Para encontrar essas variáveis, pode-se dividir o trabalho em três tarefas principais: Algoritmos e Programação I Prof. Edgar Gurgel Página 23 de 106 • Obter informações relativas ao preço de lista e desconto (fornecer os dados de entrada); • Calcular a economia e o preço total; • Gerar a saída do programa (os resultados esperados: preço total e economia). var preco_lista, taxa_desc, economia, preco_red, preco_total: real; # REGRA 4 # O início da seção de procedimentos de todo programa é marcado por início. A entrada e saída de variáveis são expressas genericamente, sem referência a dispositivos específicos de E/S (como terminal de vídeo, impressora, teclado, disco,...). O procedimento para a entrada de dados será o seguinte: primeiramente será mandada uma mensagem para o usuário através do comando escrever, por exemplo: escreva(“Entre com o preço da lista:”); Em seguida será utilizado o comando ler para colocar o valor que o usuário digitou na memória do computador. Significa que o programa deve receber um valor para a variável. leia(preco_total); Para exibir o valor de preco_total será utilizado novamente o comando escrever, que significa que este valor será mostrado em algum dispositivo de saída, neste caso o vídeo. escreva(“O preço total calculado foi:”, preco_total); O comando escrever também pode exibir constantes em formas de mensagem, como por exemplo: escreva(“Este programa calcula o preço reduzido”); # REGRA 5 # As variáveis receberão novos valores dentro do programa, por meio de operação de atribuição ←. Para processar a informação de entrada, a fim de obter a saída, deve-se dispor de algum método para calcular e armazenar o valor de uma expressão. Por exemplo, para Algoritmos e Programação I Prof. Edgar Gurgel Página 24 de 106 calcular a variável economia, é precisa multiplicar a variável preço de lista pela percentagem de desconto (expressa como um valor decimal). Isto pode ser escrito: economia ← preco_lista * (taxa_desc / 100); O comando acima pode ser lido como: “economia recebe o valor de preco_lista multiplicado por taxa_desc dividido por cem”. # REGRA 6 # O fim de todo o programa é marcado por um fim. Combinando todos esses comandos, o programa pode ser expresso, em linguagem algorítmica, como se segue: Algoritmo preco_venda; const taxa_imp = 0.05; var preco_lista, taxa_desc, economia, preco_red, preco_total: real; inicio escreva(“Entre com o preço da lista:”); leia(preco_lista); escreva(“Entre com o desconto percentual:”); leia(taxa_desc); economia ← preco_lista * (taxa_desc / 100); preco_red ← preco_lista - economia; preco_total ← preco_red + preco_red * taxa_imp; escreva(“A economia é:”, economia); escreva(“Opreço total é:”, preco_total); fim. Algoritmos e Programação I Prof. Edgar Gurgel Página 25 de 106 Exercícios 15) Construir um algoritmo para calcular a média aritmética entre duas notas quaisquer fornecidas pelo usuário. 16) Dados os lados de um triângulo retângulo (nas variáveis LADO1 e LADO2), determine e exiba o terceiro lado (HIPOTENUSA). Supõe-se que todas as variáveis sejam inteiras e os lados são fornecidos pelo usuário. 17) Preparar um algoritmo para ler uma temperatura dada pelo usuário na escala Celsius e exibir o equivalente na escala Fahrenheit (fórmula de conversão: F= 9 / 5 * C + 32). 18) Faça um algoritmo para calcular o volume de uma esfera em que R é um valor dado pelo usuário. (V = 4/3*PI*R^3). 19) Faça um algoritmo para ler dois valores informados pelo usuário para as variáveis A e B, efetuar a troca dos valores de forma que a variável A passe a possuir o valor da variável B e que a variável B passe a possuir o valor da variável A. Apresentar os valores trocados. 20) Preparar um algoritmo para efetuar o cálculo de quantidade de litros de combustível gasta em uma viagem, utilizando-se um automóvel que faz 12 KM por litro. Para obter o cálculo, o usuário deverá fornecer o tempo gasto na viagem e a velocidade média durante a mesma. Desta forma, será possível obter a distância percorrida com a fórmula: DISTANCIA = TEMPO * VELOCIDADE. Tendo o valor da distância, basta calcular a quantidade de litros de combustível utilizada na viagem com a fórmula: LITROS_USADOS = DISTANCIA / 12. O programa deverá exibir os valores da velocidade média, do tempo gasto na viagem, a distância percorrida e a quantidade de litros de combustível utilizada na viagem. 21) Elaborar um algoritmo para ler dois valores inteiros fornecidos pelo usuário e efetuar as operações de adição, subtração, multiplicação e divisão do primeiro pelo segundo, apresentando no final os quatro resultados obtidos. Algoritmos e Programação I Prof. Edgar Gurgel Página 26 de 106 22) O cardápio de uma casa de hambúrguer é dado abaixo. Preparar um algoritmo para ler a quantidade de cada item comprado e calcular a conta final. Casa de hambúrguer Hambúrguer R$ 4,20 Cheeseburger R$ 5,50 Batata frita R$ 3,80 Milkshake R$ 5,80 Algoritmos e Programação I Prof. Edgar Gurgel Página 27 de 106 IV – Função 4.1 Conceito Função é um trecho de programa com atribuições específicas, simplificando o entendimento do programa, proporcionando ao programa menores chances de erro e de complexidade. A linguagem C é formada de várias funções. 4.2 Vantagens As funções através da passagem de parâmetros e através do seu nome permitem que sejam retornados valores à rotina chamadora e desta forma, esses valores poderão ser impressos, atribuídos a uma variável ou podem servir em operações aritméticas entre outras. Os principais objetivos de uma função são: • Dividir e estruturar um algoritmo em partes logicamente coerentes; • Facilidade em testar os trechos em separados; • O programador poderá criar sua própria biblioteca de funções, tornando sua programação mais eficiente uma vez que poderá fazer uso de funções por ele escritas em vários outros programas com a vantagem de já terem sido testadas; • Maior aumentar a legibilidade de um programa; • Evitar que uma certa sequência de comandos necessária em vários locais de um programa tenha que ser escrita repetidamente nestes locais, diminuindo também, o código fonte,; Tudo isto justifica o uso de funções em nossos programas 4.3. Funções Pré-definidas O conjunto de funções pré-definidas é muito extenso e aqui vamos estudar algumas funções das bibliotecas: math.h, ctype.h, string.h e stdlib.h. Quando estudamos uma função, temos vários parâmetros a observar. Veja, por exemplo a seguinte função pré-definida da biblioteca math.h: double sqrt(double x) Este é o protótipo da função, isto é, informações sobre o tipo de retorno da função e tipos dos parâmetros. Esta função retorna um valor double, seu nome é sqrt e o tipo da variável que recebe o valor passado é double. Algoritmos e Programação I Prof. Edgar Gurgel Página 28 de 106 Quando você criar suas funções, elas precisarão ter uma declaração semelhante a esta. As funções poderão ser localizadas antes da função principal(main) ou depois. Se uma função for declarada antes, o protótipo da função não precisará ser declarado na função main, mas se declarada depois, o protótipo precisará ser declarado na função main. Declaração de uma função: tipo identificador (lista de parâmetros) int, float, char, void Nome da função ( tipo1 nome1, tipo2 nome2 ) Exemplos: int quadrado(int l) char maiuscula(char n[] ) 4.3.1 Funções Numéricas Biblioteca: math.h #include <stdio.h> #include <math.h> #define PI (3.14159265) int main() { float f; printf("\nFUNCOES NUMERICAS\n"); printf("\nDigite numero real: "); scanf("%f",&f); printf("\nNumero: %f",f); printf("\nABSOLUTO: %f",fabs(f)); printf("\nCEIL: %f",ceil(f)); printf("\nFLOOR: %f",floor(f)); printf("\nTRUNC: %f",trunc(f)); printf("\nROUND: %ld",lround(f)); printf("\nFMOD: %.f",fmod(f,3)); printf("\nSQRT: %.f",sqrt(f+0.5)); printf("\nSeno de 30: %.2f",sin(30*PI/180)); printf("\nCo-seno de 30: %.2f",cos(30*PI/180)); printf("\nTangente de 30: %.2f",tan(30*PI/180)); printf("\nPotencia de 2 elevado a 3: %f",pow(2,3)); printf("\nLogaritmo de 8 na base neperiana: %.3f",log(8)); printf("\nLogaritmo de 8 na base 10: %.3f",log10(8)); printf("\nLogaritmo 8 na base 2: %.3f",log(8)/log(2)); printf("\nRaiz cubica de 8: %.3f",exp(1./3*log(8))); printf("\n\n"); system(“pause”); return 0; } Algoritmos e Programação I Prof. Edgar Gurgel Página 29 de 106 4.3.2 Funções Strings Biblioteca: string.h/ctype.h #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main() { char c,s1[40],s2[30]; printf("\nBIBLIOTECA ctype.h\n"); printf("\nLetra: "); scanf("%c",&c);fgetc(stdin); if(islower(c)) printf("\nConvertida para maiuscula: %c",toupper(c)); else printf("\nConvertida para minuscula: %c",tolower(c)); printf("\n\nBIBLIOTECA string.h\n"); printf("\nPalavra 1: "); fgets(s1,30,stdin);s1[strlen(s1)-1]='\0'; printf("\nPalavra 2: "); fgets(s2,30,stdin);s2[strlen(s2)-1]='\0'; strcat(s1,"FIM"); printf("\n\nConcatenacao: %s",s1); strcpy(s1,s2); printf("\n\nApos copia de toda palavra2: %s",s1); printf("\n\nTamanho de s2: %d",strlen(s2)); printf("\n\nComparando strings\n"); printf("\nDigite PAZ: "); fgets(s1,30,stdin); printf("\nDigite PAZ: "); fgets(s2,30,stdin); if(strcmp(s1,s2)==0) Algoritmos e Programação I Prof. Edgar Gurgel Página 30 de 106 printf("\nIGUAIS"); else printf("\nDiferentes"); printf("\nDigite PAZ: "); fgets(s1,30,stdin); printf("\nDigite AMOR: "); fgets(s2,30,stdin); if(strcmp(s1,s2))/*equivale a strcmp(s1,s2)!=0 */ printf("\nDIFERENTES"); else printf("\nIguais"); printf("\n"); system("pause"); return 0; } 4.4. Diretiva #define Define um identificador e um conteúdo que irá ser substituído toda vez que o identificador aparecer em um programa. Esta diretiva pode ser associada a uma string ou a uma macro semelhante a uma função. Se o tamanho da macro for pequena, substitui com vantagens o uso de funções. Exemplo 1: #include <stdio.h> #include <math.h> #define quadrado(x) ((x)*(x)) #define pi (3.14159265) Algoritmos e ProgramaçãoI Prof. Edgar Gurgel Página 31 de 106 #define NP (2.71828182846) #define conv(x) ((x)*(pi)/(180)) int main() { printf("\nnumero: 12" ); printf("\n\nquadrado= %d", quadrado(12)); printf("\n\nangulo: 30" ); printf("\n\nseno de %.2f eh %4.2f",30.,sin(conv(30))); printf("\n\nneperiano %.11f",NP); system(“pause”); return 0; } Exemplo 2: #include <stdio.h> #define AREA(b,h) (b*h) int main() { float base, alt; printf("\nBase: "); scanf("%f",&base); printf("\nAltura: "); scanf("%f",&alt); printf("\nArea: %.2f",AREA(base,alt)); printf("\n"); system(“pause”); return 0; } Exemplo 3: #include <stdio.h> #include <math.h> #define HIPO(c1,c2) (sqrt(c1*c1+c2*c2)) int main() { float cat1,cat2; printf("\nCateto 1: "); scanf("%f",&cat1); printf("\nCateto 2: "); scanf("%f",&cat2); printf("\nHipotenusa: %.2f",HIPO(cat1,cat2)); printf("\n"); system(“pause”); return 0; } Algoritmos e Programação I Prof. Edgar Gurgel Página 32 de 106 4.5 Chamada da função Não devemos ficar preocupados como isso irá acontecer, pois já fizemos uso de vários funções internas(funções do tradutor) e, da mesma forma, chamaremos as funções feitas por nós. Quando uma função é chamada, o fluxo de controle é desviado para a função, no momento em que ela é ativada no algoritmo principal. Ao terminar a execução dos comandos da função, o fluxo de controle retorna ao comando seguinte àquele onde ela foi ativada, exatamente como na figura abaixo: 4.6 Estrutura de uma função Uma função é um bloco contendo início e fim, sendo identificada por um nome , pelo qual será referenciada em qualquer parte e em qualquer momento do programa. A função serve para executar tarefas menores como ler, calcular, determinar o maior/menor valor entre uma lista de valores, ordenar, converter para maiúsculas, entre outras. Após executar estas tarefas menores, a função retorna, ou não, um determinado valor para a função chamadora. Quando a função não retornar nada(nulo) usaremos o tipo void, pois é sugerido pelo comitê de padronização ANSI. Dentro da função, podem ser declaradas variáveis que chamamos de variáveis locais, pois só são visíveis dentro da função. Sintaxe da função: <tipo de função> nome_da_função(declarações dos parâmetros) { < declaração das variáveis locais> comandos que formam o corpo da função return(< valor >) ; /* ou return; ou nada */ } main() funcao1( ...) { ... retorna(...); } {... ... < chamada da função 1 > ... ... } Algoritmos e Programação I Prof. Edgar Gurgel Página 33 de 106 tipo de função : tipo de dado que a função dará retorno. Pode ser int, float, char ou void nome da função : segue as mesmas regras de declaração de variáveis parâmetros : nomes das variáveis, seguem as mesmas regras de declaração de variáveis declarações dos parâmetros : declarações de variáveis da função(tipo e nome) { : início da função variáveis locais : declarações de variáveis que serão utilizadas dentro da função( tipo e nome) corpo da função : sequência de comandos return( .. ) : o que vai ser retornado para o algoritmo ou não existe } : fim da função 4.7. Localização das funções Podem ser colocadas antes ou após a função principal (main). protótipo da funcao1; protótipo da funcao2; protótipo da funcao3; int main() { ... } // definição de função funcao1(...) { ... } funcao2(...) { ... } funcao3(...) { ... } Algoritmos e Programação I Prof. Edgar Gurgel Página 34 de 106 4.8. Dividindo o programa em funções Nós podemos modularizar nossos programas para que possamos deixá- lo mais claro. Se as funções manipulam as mesmas variáveis, deveremos declará-las com variáveis globais, isto é, fora de todas as funções. 4.9 Tipos de Funções 4.9.1 Funções void ( não retornam nada) Este tipo de função não tem nenhum dado de retorno para a função principal. Ela executa o trecho e retorna para a função seguinte da sua chamada. A função pode não ter parâmetros e ser do tipo void, também. Exemplo: #include <stdio.h> void aster();/*prototipo da função(tipo de retorno, nome e (argumentos) */ int main() { printf("\nAlGORITMO\n"); aster(); printf("\nINFORMATICA\n"); aster(); printf("\nPROGRAMACAO II\n"); aster(); printf("\n"); } void aster() { printf("***************************************************************************"); } 4.9.2 Funções com passagem de valor A linguagem C passa os valores para funções através de argumentos das chamadas das funções para os parâmetros das funções, na verdade variáveis que receberão cópias dos dados. Desta maneira, os dados de origem não são alterados. Uma boa dica: Suponha que você comprou um livro e descobriu alguns erros. Você corrige no seu livro, mas não altera o original que, enquanto o autor não corrigir, os erros permanecerão. A única exceção é para as matrizes que são ponteiros para o primeiro elemento da matriz. Algoritmos e Programação I Prof. Edgar Gurgel Página 35 de 106 Exemplo 1: Função aster com asteriscos #include <stdio.h> #include <stdlib.h> void aster(int x); /*protótipo da função(tipo de retorno, nome e (argumentos) */ int main() { printf("\nALGORITMO\n"); aster(5); printf("\nINFORMATICA\n"); aster(23); printf("\nPROGRAMACAO\n"); aster(14); printf("\n"); system("pause"); } void aster(int x) { int a; for(a=1;a<=x;a++) printf("*"); } Exemplo 2: Função aster com número variado de qualquer caracter #include <stdio.h> #include <stdlib.h> void aster(int x,char c); /*prototipo da função(tipo de retorno, nome e (argumentos) */ int main() { printf("\nALGORITMO\n"); aster(5,'#'); printf("\nINFORMATICA\n"); aster(23,'*'); printf("\nPROGRAMACAO\n"); aster(14,'@'); printf("\n"); system("pause"); } void aster(int x,char c) { int a; for(a=1;a<=x;a++) printf("%c",c); } Algoritmos e Programação I Prof. Edgar Gurgel Página 36 de 106 Exemplo 3: função PA. #include <stdio.h> #include <stdlib.h> void PA(int x,int y,int z); /* prototipo da funcao */ int main() { int a1,n,r; char c; printf("\nDigite primeiro termo, razao, numero de termos: "); scanf("%d%d%d",&a1,&r,&n); PA(a1,r,n);fgetc(stdin); scanf("%c",&c); printf("\n"); system("pause"); } void PA(int x,int y,int z) { int c; for(c=1;c<=z;c++) { printf("%d",x); x=x+y; } } Exemplo 4: Função maiuscula #include <stdio.h> #include <ctype.h> #include <string.h> maiuscula(char n[ ]); /* prototipo da funcao */ int main() { char s[30], c; printf("\nNOME: "); fgets(s,30,stdin); maiuscula(s); printf("\nConvertida para MAIUSCULA: %s",s); scanf("%c",&c); } char maiuscula(char n[ ]) { int c; for(c=0;c<strlen(n);c++) n[c]=toupper(n[c]); } Algoritmos e Programação I Prof. Edgar Gurgel Página 37 de 106 Exemplo 5: Função ordena vetor #include <stdio.h> ordena(int v[],int t); int main() { int vet[5],c,; char c1; for(c=0;c<5;c++) { printf("\nDigite numero %d: ",c+1); scanf("%d",&vet[c]); } ordena(vet,5); printf("\n\nORDENADO\n"); for(c=0;c<5;c++) printf("\n%d",vet[c]); fgetc(stdin);scanf("%c",&c1); } int ordena(int v[ ], int t) { int c,l,aux; for(c=0;c<t-1;c++) for(l=c+1;l<t;l++)if(v[c]<v[l]) {aux=v[c];v[c]=v[l];v[l]=aux;} } Algoritmos e Programação I Prof. Edgar Gurgel Página 38 de 106 Exercícios 23) Desenvolva um programa que tenha uma função para calcular e apresentar a soma de dois números quaisquer fornecidos pelo usuário. Os números devem ser fornecidos no programa principal e depois informados à função que realiza a operação de soma. 24) Desenvolva um programa que tenha uma função para calcular e apresentar o valor de uma potência de um número qualquer informado pelo usuário. Ou seja, ao informar para a função o número e a sua potencia, deve ser apresentado o seu resultado. Por exemplo, se for mencionado no programa principal à função potência(2,3), deve ser apresentado o valor 8. 25) Elaborar um programa que leia três valores informados pelo usuário e depois chame uma função para calcular e apresentar o resultado final da soma dos quadrados dos três valores lidos. 26) Elaborar um programa que por meio de uma função apresente o valor da conversão em Real (R$) de um valor lido em dólar (US$). Deve ser solicitado por meio do programa principal o valor da cotação do dólar e a quantidade de dólar disponível. Algoritmos e Programação I Prof. Edgar Gurgel Página 39 de 106 V - Estrutura de Seleção 1 - Conceito de Seleção Apesar de se conseguir solucionar problemas e transformá-los em programas, os recursos da estrutura sequencial são muito limitados, pois haverá momentos em que um determinado valor dentro de um programa necessitará ser tratado para se efetuar um processamento mais adequado. Uma estrutura de seleção permite a escolha de um grupo de ações e estruturas a ser executado quando determinadas condições, representadas por expressões lógicas, são ou não satisfeitas. Deve-se imaginar a seguinte situação: um programa que apresente a média escolar de um aluno. Até aqui, muito simples, mas além de calcular a média, o programa deve apresentar se o mesmo está aprovado ou reprovado segundo a análise de sua média. Deve-se observar que aqui será necessário verificar a média do aluno para então se tomar uma decisão no sentido de apresentar a sua real situação: aprovado ou reprovado. 2 - Seleção Simples Sintaxe da estrutura: Se <condição> Então inicio instrução 1; instrução 2; . . . instrução n; fim; {fim do então} fim-se; <condição> é uma expressão lógica, que quando verificada, pode gerar um resultado falso ou verdadeiro. Algoritmos e Programação I Prof. Edgar Gurgel Página 40 de 106 Se <condição> for verdadeira, então o “bloco verdade” (Então) será executado; caso contrário (<condição> for falsa) o comando será encerrado. Verificar-se-á, agora, o seguinte exemplo, para se analisar a estrutura alternativa simples: Algoritmo notas1; {Calcula a média aritmética entre duas notas e verifica se o aluno foi aprovado por média} var n1, n2, media: real; inicio leia(n1); leia(n2); media ←(n1 + n2)/2; escreva(‘A média foi =’, MEDIA); Se media >= 8 Então escreva(‘Aprovado por média’); fim-se; fim. {término do algoritmo} 3 - Seleção Composta Sintaxe de estrutura: Se <condição> Então Início instrução 1; instrução 2; . . instrução n; fim Senão inicio instrução 1; Algoritmos e Programação I Prof. Edgar Gurgel Página 41 de 106 instrução 2; . . instrução n; fim; fim-se; Se a condição for satisfeita, então apenas o “bloco verdade” será executado, caso contrário, o “bloco falso” é o que será executado. Exemplo 1: Construir um algoritmo para calcular as raízes de uma equação do 2º grau. Algoritmo equacao;{calcula as raízes da equação} var x1,x2,delta,a,b,c: real; Início escrever(“Entre com os valores dos coef. a, b e c:”); leia(a); leia(b); leia(c); delta ← b^2 - 4*a*c; Se delta > 0 Então inicio x1 ← (-b + SQRT(delta)) / 2 * a; x2 ← (-b - SQRT(delta)) / 2 * a; escreva(“raiz 1=”,x1, “raiz 2=”,x2); fim Senão escreva(“Não existem raízes reais!”); fim-se; fim. Algoritmos e Programação I Prof. Edgar Gurgel Página 42 de 106 Exemplo 2: Melhorar o exemplo do cálculo da média das notas: Algoritmo notas2;{Calcula a média aritmética entre duas notas e verifica se o aluno foi aprovado por média} var n1, n2, media: real; inicio leia(n1); leia(n2); media ←(n1 + n2)/2; escrever(‘A média foi =’, MEDIA); Se media >= 8 Então escreva(‘Aprovado por média’); Senão escreva(“Prova Final”); fim-se; fim. {término do algoritmo} 4 - Seleção Encadeada (Se´s encaixados) Pode-se agrupar várias alternativas a fim de inspecionar uma ou mais condições. Geralmente tal estrutura é formada quando uma determinada instrução ou bloco de ações deve ser executado se um conjunto de possibilidades ou combinações de situações for satisfeito. Sintaxe da estrutura: Se <condição 1> então instrução 1 senão Se <condição 2> então inicio instrução 2; instrução 3; Algoritmos e Programação I Prof. Edgar Gurgel Página 43 de 106 instrução 4; fim senão Se <condição 3> então instrução 5; fim-se; fim-se; fim-se; Se <condição 1> for satisfeita, então a instrução 1 será executada, caso contrário, a <condição 2> será inspecionada e se for satisfeita, então o bloco de ações (instrução 2, instrução 3, instrução 4) será executado, caso contrário a <condição 3> será verificada e se for satisfeita, a instrução 5 será executada. 5 - Seleção de Múltipla Escolha (Estrutura Caso) Quando uma única variável pode assumir diversos valores e que as instruções a serem executadas dependam do valor armazenado nesta variável, pode-se usar a estrutura Caso. Seria uma forma mais compacta da Seleção encadeada. Sintaxe da estrutura: Caso <variável> faça v1: instrução 1; v2: inicio instrução 2; instrução 3; instrução 4; fim; Senão inicio instrução 7; instrução 8; fim; {fim do bloco senão} fim; {fim da estrutura Caso} Algoritmos e Programação I Prof. Edgar Gurgel Página 44 de 106 Exemplo: Construa um algoritmo que, tendo como dados de entrada o preço de um produto e um código de origem, emita o preço junto de sua procedência. Caso o código seja nenhum dos especificados, o produto deve ser encarado como importado. Código de Origem: 1- Sul 2- Norte 3- Leste 4- Oeste Algoritmo produto; var preco: real; origem: inteiro; inicio leia(origem, preco); Caso origem faça 1: escreva(preco, “Produto do Sul”); 2: escreva(preco, “Produto do Norte”); 3: escreva(preco, “Produto do Leste”); 4: escreva(preco, “Produto do Oeste”); senão escreva(preco, “Produto Importado”); fim; fim. Exercícios 27) Ler um número informado pelo usuário e se ele for maior do que 20 então exibir a metade do número. 28) Ler um número informado pelo usuário e exibir se ele é positivo, negativo ou nulo. Algoritmos e Programação I Prof. Edgar Gurgel Página 45 de 106 29) Fazer um algoritmo para realizar as quatro operações básicas e exibir o resultado desta operação. Considere que serão lidos dois números como entrada e os seguintes caracteres representando as operações básicas: + (adição), - (subtração), * (multiplicação) e / (divisão). Você deve considerar ainda a possibilidade do usuário digitar um valor das operações básicas descritasacima, e neste caso o algoritmo deve escrever uma mensagem dizendo “Caractere inválido”. 30) Construir um algoritmo que leia dois números e efetue a adição, caso o valor somado seja maior que 20 este deverá ser apresentado somando-se a ele mais 8; caso o valor seja menor ou igual a 20 este deverá ser apresentado subtraindo-se 5. 31) A Prefeitura do Rio abriu uma linha de crédito para os funcionários estatutários. O valor máximo da prestação não poderá ultrapassar 30% do salário bruto. Fazer um algoritmo que permita entrar com o salário bruto e o valor da prestação e informar se o empréstimo pode ou não ser concedido. 32) Entrar com um número e imprimir se ele é maior do que 20, menor ou igual a 20. 33) Entrar com nome, sexo e idade de uma pessoa. Se a pessoa for do sexo ‘f’ e tiver menos que 18 anos, imprimir nome e a mensagem “mulher, menor de idade”, caso contrário, imprimir nome e a mensagem “mulher, maior de idade”. 34) Entrar com dois números e imprimir o maior número, supondo que são diferentes. 35) Entrar com três números e imprimir o maior número, supondo que são diferentes. 36) Entrar com três números e armazenar o maior número na variável de nome maior, supondo que são diferentes. 37) Ler três números, os possíveis lados de um triângulo, e imprimir a classificação segundo os lados: equilátero, escaleno e isósceles. Verifique Algoritmos e Programação I Prof. Edgar Gurgel Página 46 de 106 antes se os lados formam um triangulo, em caso negativo, informe isto ao usuário. 38) Entrar com o salário de uma pessoa e imprimir o desconto do INSS segundo a tabela a seguir: Menor ou igual a R$ 600,00 Isento Maior que R$ 600,00 e menor ou igual a R$ 1200,00 20% Maior que R$ 1200,00 e menor ou igual a R$ 2000,00 25% Maior que R$ 2000,00 30% 39) Um comerciante comprou um produto e quer vendê-lo com um lucro de 45% se o valor da compra for menor que R$ 20,00; caso contrário, o lucro será de 30%. Entrar com o valor do produto e imprimir o valor da venda. 40) Fazer um algoritmo que possa converter uma determinada quantia dada em reais para uma das seguintes moedas: • P – peso argentino; • L – libra esterlina; • D – dólar americano; A conversão será dada pela divisão do valor em real para uma determinada moeda. E caso o usuário digite um valor diferente das moedas dadas, imprimir a seguinte mensagem: “Moeda desconhecida”. 41) Escreva um algoritmo que leia a nota de um aluno e converta esta nota quantitativa em uma nota qualitativa, de acordo com a tabela abaixo: Nota quantitativa Nota qualitativa 0 a 2 Sem rendimento >2 a 4 Mau >4 a 6 Regular >6 a 8 Bom >8 a 10 Excelente Algoritmos e Programação I Prof. Edgar Gurgel Página 47 de 106 Algoritmos e Programação I Prof. Edgar Gurgel Página 48 de 106 VI - Estrutura de Repetição 1 - Conceito de Repetição Na estrutura de sequência sabe-se que os comandos são executados uma única vez e um após o outro (de cima para baixo). Com o estudo da seleção, acrescenta-se a possibilidade de escolher instruções a serem executadas, mas cada instrução continua sendo executada apenas uma vez. A execução do programa começa com a primeira instrução e termina na última, sendo cada instrução executada no máximo uma vez. Em programação é frequentemente preciso repetir a execução de um grupo de instruções, ou mesmo repetir a execução de todo o programa, para diferentes valores de dados. Em programação, uma sequência de instruções executada repetidas vezes é chamada de laço (loop). Um laço é constituído por uma sequência de instruções, o corpo do laço, e por uma estrutura que controla a repetição deste corpo, especificando quantas vezes ele terá de ser repetido. As instruções que constituem o corpo de um laço podem ser executadas qualquer número de vezes (até mesmo nenhuma), mas este número é finito. Há erros semânticos que podem provocar a execução interminável do corpo do laço, caso que se diz que o laço é infinito. Existem três estruturas que permitem a especificação de laços em nossa linguagem algorítmica: Enquanto, Repita e Para. 2 - Enquanto (Repetição com Teste no Início) Consiste numa estrutura de controle de fluxo que permite executar de forma repetitiva uma instrução (ou bloco de instruções) enquanto uma determinada expressão lógica tiver o valor verdadeiro, porém, sempre verificando antes de cada execução se é permitido repetir o mesmo trecho. Sintaxe da estrutura: Enquanto <condição> faça Início instrução 1; instrução 2; instrução 3; Algoritmos e Programação I Prof. Edgar Gurgel Página 49 de 106 . . . instrução n; fim; {fim do enquanto} Enquanto a condição for satisfeita, as instruções de 1 a n serão repetidas, caso contrário, o comando é abandonado (sai do laço). Se já da primeira vez o resultado for falso, os comandos não serão executados uma única vez. A estrutura Enquanto pode ser usada para construir laços determinados ou indeterminados. Seguem alguns exemplos de como estes tipos de laços funcionam: Exemplo1: Número de repetições determinadas: Construir um algoritmo para calcular a soma dos 100 primeiros números inteiros e positivos. Algoritmo soma100; var numero,soma: inteiro; inicio soma ← 0; numero ←1; Enquanto (numero <= 100) faça início soma ← soma + numero; numero ← numero + 1; fim; escreva(“Soma:”, soma); fim. Exemplo2: Número de repetições indeterminadas (uso do finalizador ou flag): Construir um algoritmo que, dado um conjunto de valores reais, determinar o maior valor do conjunto. O valor 0 (zero) é usado como finalizador. Algoritmo maior_elemento; var Algoritmos e Programação I Prof. Edgar Gurgel Página 50 de 106 valor, maior: real; inicio escreva(“Entre com o valor =”); leia(valor); maior ← valor; Enquanto (valor <> 0) faça início Se valor > maior Então maior ← valor; escrever(“Entre com o valor =”); leia(valor); fim; escreva(“Maior valor =”,maior); fim. 3 - Repita (Repetição com Teste no Final) Consiste numa estrutura que permite que um bloco ou uma ação primitiva seja repetida até que uma determinada condição seja satisfeita. Sintaxe da estrutura: Repita instrução 1; instrução 2; instrução 3; . . . instrução n; Até <condição>; A diferença básica entre as estruturas enquanto e repita é que nesta última, o bloco é executado pelo menos uma vez independentemente da validade da condição, pois a inspeção da condição só é feita após a execução do bloco ou ação primitiva. Algoritmos e Programação I Prof. Edgar Gurgel Página 51 de 106 É importante também ressaltar que não há necessidade dos delimitadores de bloco (Início - Fim), ao contrário do enquanto, pois o corpo do laço já está delimitado pelas palavras “Repita” e “Até”, evitando assim qualquer ambiguidade quanto à determinação das instruções a serem repetidas. Da mesma forma que a estrutura enquanto, a estrutura repita também serve para construir laços determinados e indeterminados. Serão utilizados os mesmos exemplos para comparar as duas estruturas. Exemplo1: Algoritmo soma100_2; var numero, soma: inteiro; inicio soma←0; numero ← 1; Repita soma ← soma + numero; numero ← numero + 1; Até (numero > 100); escrever(“Soma =”, soma); Fim. Exemplo2: Algoritmo maior_elemento_2; var valor, maior: real; Início escreva(“Entre com o valor =”); leia(valor); maior ← valor; Repita Se valor > maior Então Algoritmos e Programação I Prof.Edgar Gurgel Página 52 de 106 maior ← valor; escreva(“Entre com o valor =”); leia(valor); Até (valor = 0); escreva(“Maior valor =’, maior); fim. Comparando este algoritmo com o do primeiro exemplo da estrutura enquanto, nota-se que a utilização de uma estrutura repita no lugar de uma estrutura enquanto corresponde a utilizar como <condição> para o repita a negação da <condição> do enquanto. 4 - Para (Repetição com Variável de Controle) Nas estruturas de repetição vistas até agora, ocorrem casos em que se torna difícil determinar quantas vezes o bloco será executado. Sabe-se que ele será executado enquanto uma condição for satisfeita (Enquanto) ou até que uma condição seja satisfeita (Repita). A estrutura Para repete a execução do bloco um número fixo de vezes, pois ela possui limites fixos. O número de repetições do bloco será dado por: Onde: Vi: valor inicial Vf: valor final Na estrutura Para, usar-se-á o conceito de variável de controle, que será uma variável (V) que será incrementada após a repetição de um bloco, de acordo com o valor deste incremento (p). Sintaxe da estrutura: Para v ← vi até vf faça inicio instrução 1; instrução 2; instrução 3; . . N = Vf - Vi + 1 Algoritmos e Programação I Prof. Edgar Gurgel Página 53 de 106 . instrução n; fim; {fim do para} A estrutura Para só aceita repetições determinadas e nestes casos será a mais conveniente. Será utilizado o exemplo da soma dos 100 primeiros números inteiros e positivos e percebe-se que esta estrutura é mais conveniente porque não é necessário: • Inicializar o primeiro inteiro a ser adicionado; • Incrementar o valor do inteiro a ser adicionado ao valor da soma; • Testar se o valor do inteiro já atingiu o limite. Exemplo: Algoritmo soma100_3; var numero,soma: inteiro; inicio soma ← 0; Para numero ← 1 até 100 faça soma ← soma + numero; escreva(“Soma =”, soma); fim. Exercícios: • Diga o que será escrito nos trechos dos algoritmos abaixo, considere que todas as variáveis utilizadas são do tipo inteiro. 42) VALOR ← 5; Para I ← 1 até 5 faça VALOR ← VALOR + I; escreva(VALOR); Algoritmos e Programação I Prof. Edgar Gurgel Página 54 de 106 43) VALOR ←3; X ←0; Enquanto X < 5 faça início VALOR ← VALOR + 1; X ← X + 1; fim; escreva(VALOR); 44) VALOR ← 0; Para X ← 5 até 0 faça inicio VALOR ← VALOR + 1; CONTADOR ← 0; Enquanto CONTADOR < 3 faça início VALOR ← VALOR + 1; CONTADOR ← CONTADOR + 1; fim; fim; escreva(VALOR); 45) VALOR ← 0; Para I ← 1 até 3 faça Para J ← 1 até 2 faça VALOR ← VALOR + 1; escreva(VALOR); Algoritmos e Programação I Prof. Edgar Gurgel Página 55 de 106 • Em cada um dos seguintes trechos de algoritmos, indicar se o laço termina ou não. Em caso negativo, justifique. Em caso positivo, diga qual o resultado das variáveis CONT e TOTAL no comando escreva final. Assuma que todas as variáveis são inteiras. 46) CONT ← 10; TOTAL ← 30; Enquanto (CONT <= 12) faça inicio TOTAL ← TOTAL - 1; CONT ← CONT + 2; fim; escreva(CONT, TOTAL); 47) CONT ←10; TOTAL ← 10; Enquanto (TOTAL <=5) faça inicio TOTAL ← TOTAL - 1; CONT ← CONT + 2; fim; escreva(CONT, TOTAL); 48) Criar um algoritmo para imprimir todos os números de 1 a 100. 49) Criar um algoritmo para imprimir todos os números de 100 a 1. 50) Criar um algoritmo para imprimir os 100 primeiros números pares. 51) Criar um algoritmo que entre com 10 números e imprimir o quadrado de cada número. 52) Criar um algoritmo que leia um número, maior que zero, que será o limite superior de um intervalo e imprimir todos os números impares menores do que esse número. Algoritmos e Programação I Prof. Edgar Gurgel Página 56 de 106 53) Criar um algoritmo que leia um número, maior que zero, e imprimir todos os números de 1 até o número lido. 54) Criar um algoritmo que imprima a soma dos números pares entre 25 e 199. 55) Criar um algoritmo para imprimir os 10 primeiros termos da série de Fibonacci. Obs: os dois primeiros termos desta série são 0 e 1 e os demais são gerados a partir da soma dos anteriores. 56) Ler o número de termos da série (n) e imprimir o valor de H, sendo: H = 1 + 1/2 + 1/3 + 1/4 + ... + 1/N 57) Criar um algoritmo que imprima a tabuada de multiplicar do número 3. 58) Criar um algoritmo que receba a idade e o peso de 5 pessoas. Calcular e imprimir as médias dos pesos das pessoas da mesma faixa etária. As faixas são: de 1 a 10 anos, de 11 a 20 anos, de 21 a 30 anos e maiores de 30 anos. 59) Entrar com vários números positivos e imprimir a média dos números digitados. Quando um numero negativo for digitado, o programa deve encerrar e apresentar a média. 60) Ler vários números e informar quantos números entre 100 e 200 foram digitados. Quando o valor 0 (zero) for lido, o algoritmo deverá cessar sua execução. 61) Criar um algoritmo que leia vários números inteiros e apresente o fatorial de cada número. O algoritmo se encerra quando se digita um número menor do que 1. 62) Criar um algoritmo para entrar com a idade de várias pessoas e imprimir: • O total de pessoas com menos de 21 anos; • O total de pessoas com mais de 50 anos. Quando uma idade negativa for digitada, o programa deve encerrar e apresentar as informações solicitadas. Algoritmos e Programação I Prof. Edgar Gurgel Página 57 de 106 VII - Arranjos Unidimensionais (Vetores) 1 - Tipos Construídos A partir de agora, será apresentada uma técnica de programação que permitirá trabalhar com o agrupamento de várias informações dentro de uma mesma variável. Vale salientar que este agrupamento ocorrerá obedecendo sempre ao mesmo tipo de dado, a menos que se trabalhe com uma estrutura de dados do tipo registro. O tipo de dado homogêneo recebe diversos outros nomes, tais como: variáveis indexadas, variáveis compostas, variáveis subscritas, arranjos, vetores, matrizes, tabelas em memória ou arrays. Os vetores são tipos de dados que são construídos à medida que forem necessários, pois não é sempre que os tipos básicos (real, inteiro, caractere ou lógico) e/ou variáveis simples são suficientes para representar a estrutura de dados utilizada em um programa. 2 - Arranjos em uma dimensão Um vetor é uma variável homogênea que repete um tipo de dado um número especificado de vezes. Ou seja, é um arranjo de elementos armazenados na memória principal, um após o outro, todos com o mesmo nome. A idéia é a mesma de uma matriz linha da matemática, isto é, várias colunas e uma linha. Este tipo de estrutura, em particular, é também denominado como arranjos unidimensionais. Ex.: 2 4 6 8 10 12 14 16 18 20 0 1 2 3 4 5 6 7 8 9 A = [2 4 6 8 10 12 14 16 18 20] Esse é um vetor de 10 elementos, isto é, tem 10 variáveis, todas com o mesmo nome e diferentes por sua posição dentro do arranjo que é indicada por um índice. Quando se tem somente uma linha podemos omiti-la e colocar somente a coluna. Em algoritmos expressamos da seguinte forma: A[0]=2 A[1]=4 A[2]=6 A[3]=8 A[4]=10 A[5]=12 A[6]=14 A[7]=16 A[8]=18 A[9]=20 Sua utilização mais comum está vinculada à criação de tabelas. Algoritmos e Programação I Prof. Edgar Gurgel Página 58 de 106 Caracteriza-se por ser definida uma única variável dimensionada com um determinado tamanho. A dimensão
Compartilhar