Prévia do material em texto
E-BOOK ALGORITMOS E PROGRAMAÇÃO Introdução a Lógica de Programação APRESENTAÇÃO A base fundamental de um programa de computador são os algoritmos e a lógica de programação. Esses conceitos, além de serem bases da programação de computadores, desenvolvem habilidades, como raciocínio lógico, que podem ser utilizadas na resolução dos mais diversos problemas das mais diversas áreas. Nesta Unidade de Aprendizagem, você estudará a construção de um algoritmo, os conceitos básicos envolvidos e como funciona a execução de um programa de computador. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Conhecer o conceito de algoritmo: apresentação, exemplos e definição.• Entender os conceitos de comandos, variáveis, expressões e instruções.• Compreender as formas de execução de um programa: compilação e interpretação.• DESAFIO Acompanhe o seguinte caso de uso de um algoritmo: Sua atividade é desenvolver um algoritmo que ajude na seguinte tarefa de pesquisa: qual sistema o celular usa? iOS ou Android? Todo dia a pesquisa deverá recomeçar, mas os valores do dia anterior deverão ser guardados. Este desafio consiste em você escrever quais os passos necessários para realizar essa pesquisa. Você deverá escrever um algoritmo que ajude na coleta de dados e na análise deles: quantas pessoas foram entrevistadas, qual a quantidade de usuários de um sistema e de outro? Qual a idade média dos seus entrevistados? Uma dica é escrever o algoritmo da forma mais detalhada possível. Lembre-se de que não existe certo e errado; o importante é atingir o objetivo. O foco desta atividade é um algoritmo, não um programa. INFOGRÁFICO Sabendo que um algoritmo nada mais é do que um conjunto de passos para se realizar uma tarefa, é importante compreender que não existe uma forma única de algoritmo, pois há várias formas de se cumprir um mesmo objetivo. Acompanhe no infográfico como desenvolver um algoritmo. CONTEÚDO DO LIVRO Aprender a programar é uma das habilidades mais interessantes da computação. Para que esse aprendizado seja consistente, é importante compreender toda a lógica que envolve o desenvolvimento de um programa: lógica de programação, conceitos básicos e execução de um programa são tópicos que introduzirão você ao universo da programação. Leia o capítulo Algoritmos e lógica de programação, da obra Algoritmos de programação, base teórica para esta Unidade de Aprendizagem. Boa leitura. ALGORITMOS DE PROGRAMAÇÃO Marcela Santos Introdução à lógica de programação Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Conhecer o conceito de algoritmo: apresentação, exemplos e definição. � Entender os conceitos de comandos, variáveis, expressões e instruções. � Compreender as formas de execução de um programa: compilação e interpretação. Introdução Já parou para pensar como é feito um jogo, um site da Internet ou um aplicativo do seu dispositivo móvel? Cada vez mais, usamos tecnologia desde o nosso trabalho até a nossa diversão. E que tal você aprender como os programas são desenvolvidos para poder criar seus próprios jogos, sites, etc.? A base fundamental de um programa de computador são os algoritmos e a lógica de programação. Esses conceitos, além de serem bases da programação de computadores, desenvolvem habilidades, como raciocínio lógico, que podem ser utilizadas na resolução dos mais diversos problemas nas mais diversas áreas. Neste capítulo, você vai acompanhar a construção de um algoritmo, os conceitos básicos envolvidos e como funciona a execução de um programa de computador. Algoritmo: apresentação, exemplos e definição Um algoritmo nada mais é do que um conjunto de passos para a realização de uma determinada tarefa. O que é importante entendermos é que um algo- ritmo não precisa ser necessariamente algo ligado à tecnologia. Na realidade, o tempo todo estamos criando algoritmos para realizarem diversas tarefas. Quer ver um exemplo? Quando você vai sair de casa a caminho da faculdade, existe uma sequência de passos que você realiza, que tem uma ordem. As ordens das coisas que você precisa fazer para chegar à faculdade são escolhidas para te ajudar a realizar a tarefa: “ir para a faculdade”. Outros exemplos: � Preparar um hambúrguer. � Fazer um avião de papel. � Trocar o pneu de um carro. Exemplo — Preparar um hambúrguer 1. Cortar o pão e deixá-lo aberto com as partes de dentro voltadas para cima; 2. lavar a alface e o tomate; 3. fritar o hambúrguer; 4. colocar o hambúrguer sobre uma das partes do pão que está aberta; 5. colocar uma fatia de queijo, uma rodela de tomate e uma folha de alface sobre o hambúrguer; 6. fechar o pão com a outra parte que ficou sem nada sobre ela. Pronto — sanduíche prontinho! Mas podemos fazer algumas perguntas sobre essa nossa aventura na cozinha: � Existe somente um jeito de fazer esse hambúrguer? � A ordem das atividades é importante? Não existe uma única forma; o importante é que essas atividades sejam organizadas de tal forma que a tarefa “preparar um hambúrguer” seja realizada. Nesse momento, o importante é fazer, não importando se mais rápido, mais gostoso ou com mais recheio. Assim, a ordem é de extrema importância para que consigamos chegar ao objetivo final. Afinal, o que isso tem a ver com computador? Bom, primeiro é preciso entender por que o uso de computador para resolução dos mais diversos pro- blemas e das mais diversas tarefas tornou-se tão imprescindível. Para isso, vamos comparar o ser humano a um computador. Introdução à lógica de programação2 O humano é um ser inteligente, capaz de realizar diversas tarefas, como, por exemplo, calcular o valor do desconto de um jogo que está prestes a comprar. Já um computador é uma máquina “burrinha”, que só executa o que mandamos. Em contrapartida, ele não se cansa. Imagina se você tivesse que calcular, durante o dia inteiro, o desconto da venda de uma loja? Poderia cansar-se e até cometer um erro, não é mesmo? Então, é por isso que, desde quando foi criado até hoje, o papel fundamental do computador é ajudar o ser humano nas suas tarefas. Mas quem ensina o computador o que ele tem que fazer? Esse papel é do ser humano, que o faz por meio dos programas. Os programas de computador são conjuntos de instruções que o computa- dor precisa realizar para poder concluir uma determinada tarefa. Então, um algoritmo, em computação, também é um conjunto de passos, só que o foco é desenvolver um programa de computador. Um algoritmo bastante famoso é o utilizado pelo Google, para realizar suas buscas. Ele foi desenvolvido a partir de 1995, pelos então estudantes Larry Page e Sergey Brin. Imagine que você tenha que realizar uma busca por nome em uma agenda telefônica — fica mais fácil se a agenda estiver organizada por nome, concorda? Então, os primeiros sistemas de busca ordenavam os sites dessa forma, sendo que o grande diferencial do Google foi utilizar um algoritmo que ordenasse os sites do mais acessado para os menos acessados. Dessa forma, a probabilidade do que o usuário estava procurando estar entre os primeiros é maior. Os algoritmos estão em várias áreas — medicina, bolsa de valores, mo- bilidade urbana. Seu uso está cada vez mais difundido, e aprender como escrever um algoritmo bem como torná-lo mais eficiente é uma habilidade muito importante para os profissionais das mais diversas áreas. Algoritmo pode ser definido como uma sequência de passos que visam a atingir um objetivo definido (FORBELLONE; EBERSPÄCHER, 2005). 3Introdução à lógica de programação Comandos, variáveis, expressões e instruções No nosso exemplo do hambúrguer, falta pensarmos em uma coisa: saber como escrever e definir quais são os passos necessários. Bom, cada pessoa pode definir de um jeito, e isso poderia acontecer também ao escrevermos um algoritmo paraum programa de computador, o que tornaria o trabalho dos computadores muito mais complicado, pois cada pessoa poderia definir esses passos de uma forma. Em computação, costuma-se padronizar grande parte dos conceitos envolvidos, e a definição dos passos de um algoritmo também foi padronizada. Por meio de comandos, podemos formar as instruções e as expressões. Assim, os comandos são os tijolos da nossa construção; com eles, o computador entende o que deve fazer. Escrever um texto na tela, por exemplo, pode ser a ação que será executada pelo comando “escrever <texto” que será escrito na tela. Existem vários tipos de comandos: comandos para atribuição de valor, comandos para entrada e saída de dados, comandos para estruturas de seleção ou de repetição — vamos conhecer todos eles. Agora, você precisa saber que comando denota uma ação (ou um conjunto delas) que o computador irá executar, tem forma e segue algumas regrinhas. Outra definição que usaremos ao longo de todo o nosso curso é a de variáveis. Durante a execução de um programa, dados são entregues ao computador, que, executando esse programa, modifica os dados e “responde” conforme o esperado. Exemplo — Operação de saque em um autoatendimento 1. Entrar com os dados de conta e senha; 2. solicitar qual opção o cliente deseja realizar; 3. se for saque, solicitar o valor a ser sacado; 4. se existir saldo, entregar o dinheiro; 5. se não, mostrar a mensagem de “saldo indisponível” na tela; 6. encerrar a operação. Introdução à lógica de programação4 Esse valor que você solicitou é um dado que precisa ser armazenado na memória do computador. Essa região da memória do computador, onde guar- damos, mesmo que temporariamente, o dado, chamamos de “variável”, e, como o próprio nome diz, pode sofrer mudança (variação) de valor. Memória de um computador é o meio físico para armazenar dados temporariamente ou permanentemente. Para saber mais, consulte TANENBAUM, 2000. Para podermos usar as variáveis, precisamos inicialmente criá-las. Em programação, a criação de uma variável é chamada de “declaração de uma variável”, que pode ser comparada ao ato de etiquetar pequenas gavetas para organizar diversos itens. A grande ideia por detrás da variável é que cada uma delas tem um nome e um tipo. Assim, somente os dados daquele tipo podem ser colocados na sua respectiva variável. Não daria para colocar um grampeador em uma gaveta etiquetada com canetas. Veremos mais detalhes sobre variável adiante. Com as variáveis e os comandos, podemos formar as instruções e/ou expressões. Uma expressão é uma combinação de variáveis, comandos e operadores. Já uma instrução é uma operação única, que é executada pelo processador do computador. Assim, o programa de computador é formado por várias instruções. Em resumo, as instruções são formadas por comandos e/ou variáveis. Todas essas ferramentas são usadas para escrever um programa, utilizando o conceito de algoritmo. Representação de um algoritmo Como foi visto, um algoritmo é um conjunto de passos para que uma tarefa seja realizada. Esses passos são organizados de forma lógica, a fim de se chegar ao objetivo final. Existem várias formas de se representar um algoritmo — até agora usamos o português para isso, mas existem representações gráficas: fluxograma e diagrama de Chapin. Vamos representar o algoritmo do saque, usando o fluxograma da Figura 1: 5Introdução à lógica de programação Figura 1. Algoritmo do saque. Fonte: Do autor. INÍCIO Solicitar dados do usuário Solicitar a opção de operação Se for saque Solicitar valor a ser sacado Saldo suficiente? Mostrar mensagem de saldo indisponível Entregar o valor solicitado FIM V F V As representações gráficas são mais fáceis de entender devido à sua própria natureza. A lógica envolvida fica mais clara, porém é preciso que se aprenda a padronização dos itens que podem ser usados. Por esse motivo, ao logo deste livro, usaremos o português para a representação dos algoritmos. Para saber mais sobre a representação de algoritmos, consulte FORBELLONE; EBERS- PÄCHER, 2005. Introdução à lógica de programação6 Execução de um programa: compilação e interpretação Bom, já sabemos que um programa é um conjunto de instruções que são entregues ao computador para que ele realize determinada tarefa. Essa ação de realizar uma tarefa em computação chamamos de “execução de um pro- grama”, e existem duas maneiras de um programa ser executado. Antes de passarmos para essa etapa, é importante dizer que os algoritmos, mesmo que padronizados, ainda não estão escritos em uma linguagem que o computador entenda. Existem várias linguagens que o computador entende: C, Java, Python são exemplos de linguagens de programação. Então, o processo de desenvolver um programa passa por estas etapas: 1. Entender o problema ou a tarefa que queremos que o programa execute. 2. Desenvolver um algoritmo. 3. Escrever o algoritmo em uma linguagem de programação — esse ar- quivo com o algoritmo escrito em uma linguagem de programação é chamado de “código-fonte”. 4. Enviar o programa para que o processador o execute, compilando ou interpretando o código-fonte. ■ Compilar um arquivo é traduzir de uma linguagem para outra. As- sim, quando compilamos um código-fonte, estamos transformando um arquivo escrito em uma linguagem de programação em uma linguagem que o processador pode executar, também chamada de linguagem de máquina. Exemplos de linguagens compiladas: C, C++, Erlang, Haskell. ■ Outras linguagens de programação são interpretadas, funcionando da seguinte forma: o código fonte é passado para o interpretador, que pega cada instrução escrita no código-fonte e a executa de forma direta, não realizando uma tradução de todo o código-fonte. Exemplos de linguagens interpretadas: Java, Python, Ruby, PHP. ■ A maior vantagem de uma linguagem compilada é a velocidade de execução. Como, nesse tipo de linguagem, o código-fonte é convertido diretamente em uma linguagem de máquina, a execução é mais rápida e eficiente quando comparada com uma linguagem interpretada especialmente em sistemas onde a complexidade é alta. ■ Já as linguagens interpretadas não precisam ser totalmente tradu- zidas para um código de máquina, pois cada uma das instruções é executada diretamente pelo seu interpretador. Logo quando foram 7Introdução à lógica de programação inventadas essas linguagens, a velocidade do tempo de execução, quando comparadas com as linguagens compiladas, era, sem som- bra de dúvidas, muito alta e a principal desvantagem quando feita essa comparação. Porém, com a invenção da tecnologia just-in-time (JIT), essa desvantagem continua existindo, mas bem menor. Essa técnica consiste em realizar uma tradução dinâmica, em tempo de execução e não antes da execução. Assim, a diferença de execução entre linguagens compiladas e interpretadas diminuiu. ■ Em contrapartida, um programa compilado precisa ser gerado para cada plataforma que for rodar: Windows, Linux, Mac OS. Já um programa interpretado pode rodar em qualquer máquina, já que sua “interpretação” é feita em tempo de execução, sendo que a única necessidade é ter o interpretador na máquina onde esse programa será executado. Para saber mais sobre JIT, consulte: https://goo.gl/GjiWhs FORBELLONE, A. L. V.; EBERSPÄCHER, H. F. Lógica de programação: a construção de algoritmos e estrutura de dados. São Paulo: Makron Books, 2005. TANENBAUM, A. S. Sistemas operacionais. Porto Alegre: Bookman, 2000. Introdução à lógica de programação8 DICA DO PROFESSOR Existem várias linguagens de programação no mercado, mas há uma característica muito importante que precisa ser levada em consideração na hora da escolha. No vídeo da Dica do Professor, você terá orientações sobre compiladores e interpretadores, ferramentas que nos auxiliam na tradução de um código-fonte. Conteúdo interativo disponívelna plataforma de ensino! EXERCÍCIOS 1) Um algoritmo pode ser considerado como um conjunto de passos para realizar determinada tarefa. Imagine que você precisa fazer um avião de papel e propõe para um amigo que cada um escreva um algoritmo para realizar essa tarefa. Cada um escreve o seu; vocês constatam que eles são diferentes tanto na quantidade de passos como na própria descrição dos passos. Depois dessa fase, vocês trocam os algoritmos: você faz o avião com o algoritmo escrito pelo seu amigo e vice-versa. Seguindo cada passo, os dois conseguem fazer um avião de papel. O que é possível afirmar sobre seus algoritmos? A) Algo está errado, pois não é possível ter mais de um algoritmo para resolver a mesma tarefa. B) Não existe algoritmo para fazer algo que não envolva tecnologia. Portanto, estes não são algoritmos. C) Somente quem escreve um algoritmo pode interpretá-lo. Assim, cada um deveria ter feito o avião de papel com o seu próprio algoritmo. D) Não é possível um ser humano escrever um algoritmo para fazer um avião de papel. E) Os algoritmos escritos estão funcionando bem, visto que atingiram o objetivo: fazer um avião de papel. 2) Imagine um jogo de adivinhação de número. O número deve ser sorteado aleatoriamente, e o usuário adivinha um valor; se ele acertar, ganha o jogo. Caso contrário, o jogo avisa se você adivinhou um número muito grande ou muito pequeno. Um possível algoritmo para esse jogo pode ser visto a seguir: Passo 1 – sortear um número; Passo 2 – perguntar ao usuário qual número ele adivinhou; Passo 3 – se for igual ao número sorteado, informar ao usuário que ele ganhou; Passo 4 – ? Passo 5 – ? Escolha a opção que completa o algoritmo com os passos 4 e 5. A) Passo 4 – se o número adivinhado for menor que o número sorteado, dar a dica para o usuário adivinhar um número menor; Passo 5 – se o número adivinhado for maior que o número sorteado, dar a dica para o usuário adivinhar um número maior. B) Não é possível, pois é preciso saber o número sorteado para completar o algoritmo. C) Passo 4 – se o número adivinhado for maior que o número sorteado, dar a dica para o usuário adivinhar um número menor; Passo 5 – se o número adivinhado for menor que o número sorteado, dar a dica para o usuário adivinhar um número maior. D) É impossível escrever um algoritmo para esse tipo de jogo de adivinhação. E) Passo 4 – se o número adivinhado for menor que o número sorteado, dar a dica para o usuário adivinhar um número maior; Passo 5 – se o número adivinhado for maior que o número sorteado, dar a dica para o usuário adivinhar um número maior. 3) Uma variável é uma região de memória que serve para armazenar ________ que estão envolvidos(as) num programa. As variáveis são definidas com um ________ e um ________. Qual opção completa de forma correta essa afirmação? A) Dados, nome e tipo. B) Dados, nome e valor inicial. C) Textos, tamanho e tipo. D) Dados, valor inicial e tipo. E) Letras, nome e tipo. 4) Um programa pode ser executado de duas formas: na primeira, o código-fonte é traduzido para a linguagem máquina e logo em seguida executado; na segunda, cada uma das instruções é executada de forma direta, sem a necessidade de tradução completa do código-fonte. Em qual das alternativas estão essas duas formas de execução, respectivamente? A) Interpretação e compilação. B) Simplificação e execução dinâmica. C) Compilação e tradução. D) Compilação e interpretação. E) Compilação e processamento. 5) Ao comparar o tempo de execução de uma tarefa por um programa de computador escrito em linguagem compilada com outro em linguagem interpretada, é possível afirmar que: A) os programas interpretados são mais rápidos que os programas compilados. B) não existe diferença entre o tempo de execução de programas compilados e interpretados. C) os programas compilados são mais rápidos que os programas interpretados. D) não é possível avaliar o tempo de execução de um programa somente sabendo como ele foi executado. E) o tempo de execução de dois programas não pode ser mensurado para fins de análise. NA PRÁTICA Rafael é um estudante de medicina que estudou algoritmo e lógica de programação durante o ensino médio. Ele está em um dos vários estágios do seu curso e precisa analisar os sintomas de um paciente para chegar a um diagnóstico. Usando seus conhecimentos de lógica de programação, Rafael desenvolve um algoritmo capaz de ajudá-lo. Como Rafael está em estágio, ele tem o auxílio do seu professor, que gostou da ideia e o parabenizou pela ótima ferramenta de apoio para os estudantes, salientando que pode ser melhorada com o tempo e a experiência. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Comece a Programar: 3 Passos Iniciais Para complementar seus estudos, assista ao vídeo, que mostra os três principais passos para começar a programar. Conteúdo interativo disponível na plataforma de ensino! CS Discoveries: Variables (tem legenda) O vídeo que mostra o que é uma variável e como sua definição é importante no desenvolvimento de algoritmos. Conteúdo interativo disponível na plataforma de ensino! A Hora do Código Esta página é uma iniciativa mundial que visa a levar o ensino de programação a crianças de 10 a 16 anos de forma divertida. Acesse e confira os cursos disponíveis. Conteúdo interativo disponível na plataforma de ensino! Introdução à Algorítmos e Lógica de Programação APRESENTAÇÃO É sem dúvida muito importante a programação em qualquer área, como na Engenharia, por isso, é de supra necessidade compreender um pouco o mundo da programação. Nesta Unidade de Aprendizagem, além de aprender o universo da programação, vocês terão os conceitos e a oportunidade de compreender um pouco dessa área. Para isso, utilizaremos um software chamado MATLAB, uma ferramenta que auxiliará no desenvolvimento de algoritmos. Nesta Unidade de Aprendizagem, você vai estudar o conceito de lógica, o que é um algoritmo e como está relacionado com a lógica. Também irá aprender a identificar e definir o que são tipos de dados, operadores aritméticos, operadores relacionais, operadores lógicos, expressões aritméticas, expressões relacionais e as regras de precedências entre os operadores. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Identificar os algoritmos e sua lógica de programação na solução de problemas, a representação e os tipos de dados na construção de algoritmos. • Aplicar os algoritmos e sua lógica de programação na solução de problemas.• Operar de forma correta os tipos de dados e suas relações.• DESAFIO O Desafio – A Torre de Hanói! A Lenda: o problema das torres de Hanói foi proposto pelo matemático francês Edouard Lucas, em 1883. Lucas elaborou para seu “invento” uma lenda curiosa sobre uma torre muito grande. A “torre de Brama”, que foi criada no “início dos tempos”, com três hastes contendo 64 discos concêntricos (mesmo centro). O “criador” do universo também criou uma comunidade de monges cuja única atividade seria mover os discos da haste original (“A”) para uma de destino (“C”). O “criador” estabeleceu que o mundo acabaria quando os monges terminassem sua tarefa. Porém, os monges deveriam respeitar as três regras para a sua execução. É interessante observar que o número mínimo de "movimentos" para conseguir transferir todos os discos da primeira estaca à terceira é 2n-1, sendo n o número de discos. Logo: Para solucionar um Hanói de 3 discos, são necessários 23 -1 movimentos = 7 movimentos. Para solucionar um Hanói de 7 discos, são necessários 127 movimentos. Para solucionar um Hanói de 15 discos, são necessários 32.767 movimentos. Para solucionar um Hanói de 64 discos, como diz a lenda, são necessários 18.446.744.073.709.551.615 movimentos. Usando um pouco de lógica e a ferramenta Matlab, você precisa escreverum algoritmo que solucione esse desfio! Acompanhe, na imagem a seguir, as orientações. INFOGRÁFICO Em programação, os tipos de estruturas de controle disponíveis mudam de linguagem para linguagem. Nessa visão, temos os fluxos de execução de algoritmos, o primeiro é a continuação da execução em uma instrução após a outra instrução, como na estrutura sequencial. O segundo é a execução de um bloco de código somente se uma condição é verdadeira, esta chamada de estrutura de seleção. O terceiro é a execução de um bloco de código enquanto uma condição é verdadeira, ou de forma a iterar uma coleção de dados, sendo esta chamada de estrutura de repetição. Acompanhe, no Infográfico a seguir, como esse conceito pode se inter-relacionar com essas estruturas. CONTEÚDO DO LIVRO Neste capítulo, você verá sobre a introdução a algoritmos e à lógica de programação e alguns conceitos, como fluxo e execução, com a estrutura sequencial, estrutura de seleção e de repetição, além do conceito de lógica, o que são algoritmos, tipos de dados, operadores aritméticos, relacionais, lógicos, precedência entre os operadores e expressões. Leia o capítulo Introdução a Algoritmos e Lógica de Programação do livro Algoritmos e programação que é base teórica desta Unidade de Aprendizagem. Boa leitura. ALGORITMO E PROGRAMAÇÃO Jeferson Faleiro Leon Introdução a algoritmos e lógica de programação Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Criar, reconhecer, interpretar e aplicar os algoritmos e sua lógica de programação na solução de problemas. Identificar, diferenciar e aplicar a representação e os tipos de dados na construção de algoritmos e na solução de problemas. Operar de forma correta os tipos de dados e suas relações. Introdução Neste capítulo, você estudará o conceito de lógica, verá o que é um algoritmo e como ele está relacionado com a lógica. Além disso, aprenderá a identificar e definir o que são tipos de dados, operadores aritméticos, operadores relacionais, operadores lógicos, expressões aritméticas e expressões relacionais. Conceitos de lógica de programação A lógica não tem uma defi nição específi ca: inicialmente, era ligada à ma- temática (lógica formal) e, atualmente, está relacionada a todas as áreas do conhecimento humano. Podemos relacionar a lógica com a “correção do pensamento”, pois uma de suas preocupações é determinar quais operações são válidas e quais não são, fazendo análises das formas e leis do pensamento. Como filosofia, ela procura saber por que pensamos assim e não de outro jeito; como arte ou técnica, ela nos ensina a usar corretamente as leis do pensamento (FORBELLONE; EBERSPACHER, 2005). Algoritmos Para Forbellone e Ebersoacher (2005), algoritmo é um conjunto fi nito de regras, bem defi nidas, que nos levam à solução de um problema em um tempo fi nito. Segundo Berg e Figueiró (2002), algoritmo é a descrição de um conjunto de ações que, obedecidas, resultam numa sucessão fi nita de passos, atingindo o objetivo. Para que se tenha um algoritmo, é preciso: a) que se tenha um número finito de passos; b) que cada passo esteja precisamente definido, sem possíveis ambiguidades; c) que existam zero ou mais entradas; d) que existam uma ou mais saídas; e) que exista uma condição de fim, sempre atingida em tempo finito, para quaisquer entradas. Os algoritmos são criados e reconhecidos por sua lógica de programação. Segundo Forbellone e Eberspacher (2005), a lógica está relacionada à coerência e à racionalidade; lógica de programação é a racionalização dos processos formais da programação de computadores e algoritmo é a sequência de passos que visam atingir um objetivo bem definido. Os algoritmos podem ser visualizados por meio de um fluxograma convencional ou por meio de um fluxograma do tipo Chapin. Forbellone e Eberspacher (2005) fornecem um exemplo básico da diferença entre ambos e destacam que há uma série de vantagens e desvantagens para cada um desses fluxogramas. Por exemplo, o fluxograma convencional é mais fácil de desenhar e é previsto em etapas, enquanto o fluxograma Chapin pode compactar as perguntas de F e V ou S e N em somente um bloco, sendo considerado mais técnico e formal. Na Figura 1, você pode observar essas diferenças. Introdução a algoritmos e lógica de programação2 Figura 1. Fluxograma convencional e fluxograma Chapin. Fonte: Forbellone e Eberspacher (2005). Tipos de dados (primitivos) Para entender os tipos primitivos, voltemos nossa atenção para um conceito muito importante: a informação. Antes disso, vamos entender o que é um 3Introdução a algoritmos e lógica de programação dado? Dados são códigos que constituem a matéria-prima da informação, ou seja, é a informação não tratada que ainda não apresenta relevância. A informação é constituída pelos dados tratados – o resultado do processa- mento de dados são as informações. As informações têm significado e podem contribuir no processo de tomada de decisões. Os dados podem ser classificados conforme seu tipo e os principais serão descritos a seguir. Tipos numéricos Inteiros: é um número que não possui casas decimais; por exemplo, a idade de uma pessoa ou uma quantidade de itens num estoque. Real: é um número que possui casas decimais, ou seja, é um número fracionário; por exemplo, a altura de uma pessoa ou o peso de um determinado produto. Tipos alfanuméricos Literal ou String: são os textos, que podem conter letras, números e caracteres especiais. Não são utilizados para cálculos. Tipos lógicos Booleano: é um dado que só pode conter 2 informações (verdadeiro ou falso). Expressões Expressões, no sentido matemático, são representações simbólicas de sequ- ências de operações a serem feitas sobre determinados operandos visando a obtenção de um resultado. Necessitam-se de dois tipos de expressões para a elaboração de algoritmos: expressões aritméticas e expressões lógicas. Introdução a algoritmos e lógica de programação4 Expressões aritméticas Expressões aritméticas são aquelas cujos operadores são aritméticos e cujos operandos são constantes e/ou variáveis do tipo numérico (inteiro ou real). Operadores aritméticos Soma + Divisão / Quociente da divisão inteira Div Radiciação // Subtração - Multiplicação · Resto da divisão inteira Mod 10 div 3 = 3 10 mod 3 = 1 3 div 5 = 0 25 div 5 = 5 25 mod 5 = 0 3 mod 5 = 3 5Introdução a algoritmos e lógica de programação Funções matemáticas Função Descrição Exemplo sqr (x) Quadrado de x (x2) sqr (4) = 16 sqrt (x) Raiz quadrada de x ( ) sqrt (25) = 5 sen (x) Seno de x sen (90) = 1 cos (x) Cosseno de x cos (90) = 0 tg (x) Tangente de x tg (45) = 1 int (x) Parte inteira de x int (23,49) = 23 frac (x) Parte fracionária de x frac (23,49) = 49 pot (x,y) X na potência y (xy) pot (3, 2) = 9 abs (x) Valor absoluto de x abs ( -39) = 39 Sinal (x) Fornece o valor –1, +1 ou zero conforme o valor de x seja negativo, positivo pu nulo. Sinal (-44) = -1 Precedência entre os operadores Os operadores de mesma precedência na tabela são resolvidos da esquerda para a direita, na ordem que aparecerem na expressão. Introdução a algoritmos e lógica de programação6 5 + 9 + 7 + 8 / 4 5 + 9 + 7 + 2 = 23 1 - 4 · 3 / 6 - 2 · 3 1 - 4 · 3 / 6 - 8 1 - 12 / 6 - 8 1 - 2 - 8 = -9 3 · 2 - 4 / 2 + abs (5 - 3 · 5) / 2 3 · 2 - 4 / 2 + abs (5 - 15) / 2 3 · 2 - 4 / 2 + abs (-10) / 2 3 · 2 - 4 / 2 + 10 / 2 9 - 4 / 2 + 10 / 2 9 - 2 + 5 = 12 Expressões lógicas Expressões lógicas são aquelas cujos operadores são lógicos e/ou relacionais e cujos operandos são relações e/ou constantes e/ou variáveis de tipo lógico. O resultado de uma expressão lógica sempre é uma constante lógica (F - falso ou V - verdadeiro). Operadores relacionais = Igual < > Diferente > Maior >= Maior ou igual < Menor <= Menor ou igual 7Introdução a algoritmos e lógica de programação 2 · 4 = 24 / 3 = 8 V 2 + (8– 7) > = 3 · 6 - 15 2 + 1 > = 18 - 15 3 > = 3 V Operadores lógicos Símbolo Função E Conjunção Ou Disjunção (não-exclusiva) Não Negação O operador lógico E é utilizado quando dois ou mais relacionamentos lógicos de uma determinada condição necessitam ser verdadeiros. O operador lógico E faz com que somente seja executada uma determinada operação se todos as condições mencionadas forem simultaneamente verdadeiras, gerando, assim, um resultado lógico verdadeiro. SE (NÚMERO > = 20) E (NÚMERO < = 90) Então, escrever “Número válido no intervalo” Se NÃO, escrever “Número inválido, não está no intervalo” Fim-SE Introdução a algoritmos e lógica de programação8 O operador lógico OU é utilizado quando pelo menos um dos relaciona- mentos lógicos (quando houver mais de um relacionamento) de uma condição necessita ser verdadeiro. O operador lógico OU faz com que seja executada uma determinada operação se pelo menos uma das condições mencionadas gerar um resultado lógico verdadeiro. SE (SEXO = ‘Masculino’) OU (SEXO = ‘Feminino’) Então, escrever “O seu sexo é válido” Se não, escrever “O seu sexo é inválido” Fim-SE O operador lógico NÃO é utilizado quando se necessita estabelecer que uma determinada condição dever ser não verdadeira ou deve ser não falsa. O operador lógico NÃO se caracteriza por inverter o estado lógico de uma condição, isto é, inverte o resultado lógico da condição. Algoritmo prog1 Var A, B, C, X: Inteiro Início Ler (X, A, B) SE NÃO (X > 5) Então C: = (A + B) · X Se não C: = (A – B) · X Fim-SE Escrever (C) Fim 9Introdução a algoritmos e lógica de programaçã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. Operador E A B A e B V V V V F F F V F F F F Operador OU A B A ou B V V V V F V F V V F F F Operador NÃO A A não B V F F V Introdução a algoritmos e lógica de programação10 Prioridades Entre operadores lógicos: Entre todos os operadores: BERG, A.; FIGUEIRÓ, J. Lógica de programação. 3. ed. Canoas: Ed. ULBRA, 2002. FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação: a construção de algoritmos e estruturas de dados. 3. ed. São Paulo: Pearson, 2005. Leituras recomendadas CHAPRA, S. C. Métodos numéricos aplicados com MATLAB® para engenheiros e cientistas. 3. ed. Porto Alegre: AMGH, 2013. OLIVEIRA, A. B.; BORATTI, I. C. Introdução à programação de algoritmos. Florianópolis: Visual Books, 2004. SOUZA, M. A. F. et al. Algoritmos e lógica de programação. 2. ed. São Paulo: Cengage, 2012. 11Introdução a algoritmos e lógica de programação DICA DO PROFESSOR A importância de aprender programação passa pela compreensão de um problema, entender o que é um dado, uma informação, os tipos de dados (alfanuméricos, numéricos e boolenos), operadores (aritméticos, relacionais e lógicos) e expressões (aritméticas, relacionais e lógica). Nesta Dica do professor, faço o convite para que você mergulhe nos estudos de algoritmos e compreenda ainda mais o conteúdo que está estudando. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O que são algoritmos? A) Algoritmo é um conjunto finito de regras, bem definidas, que nos leva à solução de um problema em um tempo finito. B) Algoritmo é um conjunto infinito de regras, bem definidas, que nos leva à solução de um problema em um tempo longo. C) Algoritmo é um conjunto finito de regras, nada definida, que leva à solução de um problema em um tempo finito. D) Algoritmo é a forma ambígua de escrever um programa de computador e que nos dá a ideia de um problema que o programador pensou em resolver. E) Algoritmo é um elemento finito de regras, pouco definidas, que nos leva à solução de um problema em um tempo finito. 2) O fluxo de execução de um algoritmo consiste em estruturas. Quais são essas estruturas? A) Sequencial, Aritmética e de Junção. B) Sequencial, Seleção e Repetição. C) Junção, de Seleção e de Repetição. D) Repetição, de Artimética e de Seleção. E) Aritmética, Seleção e Junção. 3) Existem alguns tipos de dados primitivos que podem ser números negativos, positivos ou nulos com e sem decimais, que apresentam letras e que apresentam valores de V ou F ou valores binários 0 ou 1. Quais são esses tipos primitivos de dados? A) Lógicos ou booleanos, inteiros, estatísticos, probabilisticos. B) Dados numéricos, dados científicos, lógicos, probabilísticos. C) Dados de números Inteiros, reais, com caractere, lógicos ou booleanos. D) Com caractere, simples, compostos, booleanos. E) Dados de números inteiros, reais, compostos, booleanos. As expressões são fórmulas matemáticas que auxiliam a obter um resultado numérico. Normalmente, são utilizadas para obter um resultado numérico para números inteiros e reais, ou para condições, ou para conjunções, disjunções e 4) negações. Quais são essas expressões? A) Exponenciais, Aritméticas, de Conjunção. B) Aritméticas, Relacionais, Lógicas ou Booleanas. C) Geométricas, de Razão, Exponenciais. D) Geométricas, Relacionais, Lógicas ou Booleanas. E) Lógicas ou Booleanas, de Razão, Geométricas. 5) Analise o seguinte trecho: algoritmo "Modelo" var n: inteiro inicio escreval("Insira um número inteiro: ") leia(n) n = n * n; escreval("O ................... é : ",n) fimalgoritmo O que o irá acontecer com o valor lido, o que será mostrado como resultado? A) O resultado é o QUADRADO do valor lido. B) O resultado é o DOBRO do valor lido. C) O resultado é a METADE do valor lido. D) O resultado não é calculado, pois o tipo de dado não pode ser utilizado para fazer cálculos. E) O resultado é o triplo do valor lido. NA PRÁTICA Vamos resolver um problema prático de um saltador de bungee jumping. Se um saltador de bungee jumping vai pular de um penhasco, qual é a velocidade final no período de queda livre, a fim de que se possa determinar o comprimento e a resistência da corda. Acompanhe, na imagem a seguir, como resolver esse problema. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Por que todos deveriam aprender a programar? No link a seguir, você verá pessoas famosas falando sobre como programação é algo muito legal, e que mais escolas deveriam ensinar programação para seus alunos. Conteúdo interativo disponível na plataforma de ensino! Lógica e programação No link a seguir, você terá acesso a um vídeo que apresenta uma introdução sobre o que é e por que a lógica é indispensável para quem deseja entrar no mundo da programação. Conteúdo interativo disponível na plataforma de ensino! Primeiro Algoritmo - Curso de Algoritmos No link a seguir, você terá acesso a uma videoaula que aborda sobre algoritmos de uma forma simples e intuitiva. Conteúdo interativo disponível na plataforma de ensino! A linguagem C - Conceitos Básicos APRESENTAÇÃO Da mesma forma que existem vários idiomas no mundo, na computação existem várias linguagens de programação, as LPs. LP é uma linguagem na qual os programas são escritos e que faz uma tradução do algoritmo para uma linguagem que o computador entenda. Nesta Unidade de Aprendizagem, você vai conhecer a linguagem C, também conhecida como a linguagem das linguagens, pois é bastante difundida no meio acadêmico e usada para que você dê os primeiros passos no mundo da programação. Você vai entender como surgiu a linguagem por meio do histórico da linguagem C, compreender a estrutura básica da linguagem, conhecer vários ambientes de desenvolvimento e configurar o que melhor se adaptar às suas necessidades. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Reconhecer o histórico da linguagem C.• Identificar a estrutura básica de um programa em C.• Instalar ambientes de desenvolvimento da linguagem C.•DESAFIO Assim, você precisa escolher um ambiente de desenvolvimento para a linguagem C e realizar a sua instalação. Você deve fazer uma pequena introdução do ambiente de desenvolvimento que foi escolhido, indicar qual sistema operacional utilizou e o passo a passo para a instalação, finalizando com um print da IDE. INFOGRÁFICO A linguagem de programação C é uma linguagem compilada: é preciso que o código-fonte passe por um programa chamado compilador. A saída desse processo é uma espécie de codificação que o computador entende. Acompanhe no infográfico como esse processo acontece. CONTEÚDO DO LIVRO Para desenvolver programas, é preciso conhecimento de alguma linguagem de programação. Neste capítulo, você aprenderá um pouco mais sobre o que são essas linguagens e como elas funcionam, e entrará em contato com a linguagem C, uma das mais populares. Leia o capítulo A linguagem C - Conceitos básicos, da obra Algorítmos de Programação, que serve de base teórica para esta Unidade de Aprendizagem. Boa leitura. ALGORÍTMOS DE PROGRAMAÇÃO Marcela Santos A linguagem C – conceitos básicos Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Conhecer o histórico da linguagem C. � Identificar a estrutura básica de um programa em C. � Instalar e conhecer ambientes de desenvolvimento da linguagem C. Introdução Da mesma forma que existem vários idiomas no mundo, na computa- ção, existem várias linguagens de programação, as LPs. Uma LP é uma linguagem na qual os programas são escritos e que faz uma tradução do algoritmo para uma linguagem que o computador entenda. Neste texto, você vai estudar sobre a linguagem C, também conhecida como a “linguagem das linguagens”, por ser bastante difundida no meio acadêmico e usada para que você dê os primeiros passos no mundo da programação. Você vai entender como surgiu a linguagem por meio do histórico da linguagem C, compreender a estrutura básica da linguagem, além de conhecer vários ambientes de desenvolvimento e configurar o que melhor adaptar-se às suas necessidades. Histórico da linguagem C Antes de começarmos a falar sobre C, que é a linguagem que usaremos, vamos entender o que é uma linguagem de programação. No capítulo Introdução à Lógica de Programação, falamos sobre Algoritmos e como o seu papel é importante no desenvolvimento de um programa. A Figura 1, a seguir, faz a representação de como um algoritmo ajuda na resolução de problemas. Figura 1. Diagrama de como um algoritmo ajuda na resolução de problemas. Problema Algoritmo ProgramaSolução Porém, se o algoritmo não está escrito em uma linguagem que o compu- tador entenda, é preciso, então, fazer uma tradução da linguagem que nós, humanos, usamos para a que a máquina entenda. Essa tradução é feita por meio da utilização de uma linguagem de programação (LP). Existem várias linguagens de programação, com paradigmas e níveis de abstração diferentes. Quando uma LP assemelha-se à linguagem falada ou escrita por um ser humano, ela é dita de alto nível, e, quando ela aproxima-se da linguagem de máquina, é dita de baixo nível. Da mesma forma que o Português, por exemplo, tem regras (sintaxe) para que seja compreendido por qualquer pessoa que fale esta língua, as LPs também têm um conjunto de regras com as quais é possível traduzir um algoritmo e gerar um programa. Dito isso, podemos começar a falar da linguagem que vamos utilizar neste livro: a linguagem de programação C. A linguagem C é uma LP bastante popular, criada por volta de 1970, por Dennis Ritchie. A linguagem C foi desenvolvida nos laboratórios Bell, onde muitas de suas ideias iniciais surgiram de outra linguagem, a B, que tem como antecessoras as linguagens BCPL e CPL. CPL foi uma linguagem desenvolvida com o propósito de ser uma linguagem de alto e baixo níveis. A maior desvantagem da CPL foi que era muito pesada para o desenvolvimento de algumas aplicações. Em 1967, foi desenvolvida a Basic CPL – BCPL, que mantinha as características básicas da CPL. Ken Thompson, que trabalhava na Bell Labs, utilizou esse projeto para A linguagem C – conceitos básicos2 o desenvolvimento da linguagem B. Assim, B foi uma versão de BCPL escrita para o desenvolvimento de sistemas. Em 1972, Dennis Ritchie, trabalhando com Ken Thompson, desenvolveu uma linguagem também baseada na linguagem BCPL, mas que mantinha parte da especificação para acesso a hardware, ou seja, a parte das características de baixo nível da linguagem, conhecida como C. A linguagem C é usada por programadores há muito tempo e poderosa no desenvolvimento dos mais diversos tipos de sistema, desde sistemas operacio- nais, passando por compiladores, editores de texto, etc. Além da diversidade de sistemas, é importante ressaltar que C é uma linguagem que pode ser utilizada em máquinas com um alto poder de processamento, bem como em máquinas mais simples e com baixo poder de processamento. Dentre as características de C, podemos destacar: � Portabilidade: os programas em C são compilados, gerando um único executável. Assim, é possível compilar um programa escrito em C para qualquer máquina, desde que exista compilador C para ela. Na prática, existem compiladores C para quase todos os computadores. � Poder e variedade dos operadores: é possível trabalhar com funções matemáticas, criação e manipulação de arquivos de Dos, dentre outras possibilidades. Isso tudo pode ser feito de forma simplificada, com adição de bibliotecas padronizadas, presentes na própria linguagem. � Sintaxe elegante, estruturada e flexível: indicada para quem está co- meçando a programar. � Acesso facilitado à memória e a todo o hardware, quando preciso: assim, é possível ir de um programa simples até o desenvolvimento de um sistema operacional. � Uso de procedimentos e funções para desenvolver sistemas desacopla- dos: sistemas desacoplados são sistemas onde é possível isolar pequenas partes para, por exemplo, encontrar erros sem causar nenhum dano ao restante do sistema. Pela natureza de como foi desenvolvida, C também é chamada de lingua- gem de Médio Nível, pois possui um conjunto de instruções necessárias para acesso ao hardware, como as linguagens de baixo nível (Assembly). Além disso, C pode ser simples e amigável, como uma linguagem de alto-nível deve ser. Uma linguagem de médio nível pode, em alguns casos, não prover as estruturas necessárias a uma linguagem de alto nível, mas certamente ela tem ferramentas que podem ser usadas como blocos para construção dessas estruturas necessárias. 3A linguagem C – conceitos básicos A primeira versão de C foi criada por Dennis Ritchie, em 1972, nos laboratórios Bell, para ser incluída como um dos softwares a serem distribuídos juntamente com o sistema operacional Unix do computador PDP-11. Estrutura básica da linguagem C Neste ponto, você deve estar querendo saber como é escrito um programa que utiliza a linguagem C. A primeira coisa que temos que entender é o processo da criação desse programa. � Com o algoritmo em mente, você deve traduzi-lo para C em um arquivo e salvá-lo com a extensão C. Por exemplo, imagine que eu escrevi meu primeiro programa em um arquivo que irei nomear de programa1; ao salvá-lo, esse arquivo precisa de um nome e de uma extensão; assim, esse arquivo ficaria como: programa1.c � A segunda parte é usar um compilador para gerar o programa. O com- pilador nada mais é do que um programa que vai fazer toda a conversa e tradução do seu código-fonte para a linguagem mais baixa do sistema, a linguagem da máquina. � Pronto, agora seu programa foi criado. Basta somente executá-lo. � A Figura 2, a seguir, demonstra, por meio de um esquema, a criação de um programa compilado. Figura 2. Como um programa compilado é criado? A linguagem C – conceitos básicos4 Agora vamos entender a estrutura básica do nosso código-fonte, escrito em linguagem C. Mais à frente, veremos com o usodas ferramentas precisamos, mas, por hora, imagine que você abriu qualquer editor de texto da sua preferên- cia e criou um arquivo novo, salvou-o com extensão C e, agora, chegou a hora de preenchê-lo com seu código em C, conforme exemplificado na Figura 3. Figura 3. Primeiro programa em C. Durante todo este livro, vamos explicar os códigos, usando os números das linhas na margem à esquerda dos códigos. Vamos a elas: � Falamos sobre uma das características do C, o uso de bibliotecas pa- dronizadas. A linha 1 é o comando para adicionar a biblioteca padrão stdio.h no seu código-fonte. Uma das possibilidades que ela traz são comandos de entrada e saída de dados. � Na linha 2, temos a declaração da função principal, que, em C, é cha- mada de main, e a palavra int antes dela indica que deverá “devolver” algo do tipo inteiro. Depois de main, temos um par de parênteses vazio, indicando que ela não tem nenhum argumento. � Nas linhas 3 e 6, temos um par de chaves, entre as quais a magia acontece, onde todo o seu algoritmo, agora traduzido para C, ficará. � Na linha 4, temos um exemplo de instrução que escreve um texto na tela. � Por fim, na linha 5, temos o valor que a função main retorna, 0. Sabemos que, a essa altura do livro, poucas dessas palavras parecem fami- liares, mas calma: foi assim com todos os programadores profissionais — todo mundo, no início de aprendizado, passou por essa etapa. É preciso que neste início (principalmente) você estude e pratique como se estivesse aprendendo um novo idioma, como o inglês. Só assim tudo ficará mais familiar e, como os programadores dizem, “no sangue”. 5A linguagem C – conceitos básicos No exemplo da Figura 4, o programa escreve algo na tela. Se você quiser escrever um programa, por exemplo, que soma 2 números, deverá substituir a linha 4 por toda a tradução do seu algoritmo. Então, a estrutura básica de um código C é a seguinte: Figura 4. Estrutura básica de um programa em C. Agora temos o código-fonte. Na próxima seção, vamos conhecer os am- bientes para desenvolvimento e, assim, gerar o programa em C. Ambientes de desenvolvimento com linguagem C Existem dois caminhos a seguir em se tratando de desenvolvimento de pro- gramas. Você pode usar um editor de texto e um compilador/interpretador da linguagem que escolher, ou um ambiente integrado de desenvolvido, também conhecido como IDE. Muitas pessoas dizem que, no início dos estudos de programação, é me- lhor usar um editor de texto, já que, em muitas vezes, uma IDE traz muita informação que ainda não é familiar ao estudante. Neste livro, vamos dar a você sugestões de editores de texto e IDE, para que, assim, você possa fazer suas escolhas. Começando com os editores de texto: � Sublime Text, que pode ser usado em ambientes OS X, Windows ou Linux. � Atom, que também pode ser usado em OS X, Windows ou Linux. � Editores-padrão do seu sistema operacional. A linguagem C – conceitos básicos6 Agora, as IDEs: � Dev-C++: ferramenta para desenvolvimento C e C++, para o ambiente Windows — essa ferramenta é bastante difundida no meio acadêmico. � Code::Blocks: ferramenta open-source, na qual se pode programar em C,C++ e Fortran. (existe versão para Windows, Linux e OS X) — uma das ferramentas mais flexíveis e com uma quantidade grande de plugins, o que pode ajudar durante o desenvolvimento de algum programa específico. � Visual Studio: ambiente de programação para o Windows e OS X — nessa IDE, é possível programar em várias linguagens, dentre elas a C. � Eclipse: uma das IDEs mais completas, na qual se pode programar (realizando a configuração adequada) em diversas linguagens — dis- ponível para OS X, Windows ou Linux. Alguns detalhes: � Se você escolher usar o editor de texto, é preciso instalar também o compilador C. � Se você escolher usar uma IDE, deve configurá-la para a linguagem C, no caso das IDEs que possuem uma vasta gama de possibilidade de linguagens de programação. Escolhido o ambiente de programação, vamos criar nosso primeiro pro- grama? Vamos usar aqui o editor de texto+compilador no ambiente Linux. No caso das IDEs, é preciso somente abrir um novo documento, “codar ”(termo da moda e moderninho pra programar!!!), e clicar no ícone responsável por compilar e/ou executar o programa. Como o editor simples foi o escolhido, é preciso, agora, ir para a linha de comando do Linux e digitar alguns comandos. É necessário acessar a pasta onde o arquivo.c esteja e, em seguida, basta digitar o seguinte: gcc nomedoarquivo.c -o nomedoprograma. 7A linguagem C – conceitos básicos Linha de comando para compilação de um programa em C: � gcc — comando para executar o compilador C; � nomedoarquivo — o arquivo deve ter sido salvo com extensão C e é preciso estar na mesma pasta que ele; � -o — opção necessária para gerar o executável em C; � nomedoprograma — nome do programa que vai ser gerado; se não for digitado, o compilador gera um programa cujo nome será a.out. Depois disso, e se tudo ocorreu bem, o compilador gera um programa com o nome nomedoprograma. Basta, agora, executá-lo — e você escreveu seu primeiro programa em C! Parabéns! Além de IDEs, existem outras ferramentas para otimizar o desenvolvimento de software. Para maiores detalhes, acesse o link a seguir ou o código QR. https://goo.gl/79C11q PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. Leitura Recomendada A linguagem C – conceitos básicos8 DICA DO PROFESSOR O que é uma linguagem de programação? De que é formada uma linguagem de programação e quais os conceitos básicos da linguagem C? Acompanhe o vídeo da Dica do Professor para receber orientações sobre esses conceitos e se familiarizar com a linguagem C. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Sobre a linguagem C, é correto afirmar que: A) sua portabilidade se dá pelo fato de que pode-se rodar um programa executável em qualquer sistema operacional, sem precisar recompilar. B) os programas escritos em C têm alto grau de segurança. C) essa linguagem tem características que permitem o uso do paradigma de orientação a objetos. D) não tem recursos de baixo nível, ou seja, de acesso direto ao hardware. E) é uma das linguagens indicadas para se começar a estudar programação, pois é considerada simples e bem-estruturada. O seguinte programa está escrito em linguagem C. Qual a função da linha 1? 2) A) Acrescentar a biblioteca padrão da linguagem C para que se possa fazer entrada e saída de dados. B) Incluir um tipo de arquivo de dados no programa. C) Essa instrução pode ser retirada de acordo com o que está se desejando escrever no programa. D) Não pode ser usada se serão feitas entrada e saída de dados. E) Permite que mais de um usuário utilize o código. 3) O que é uma linguagem de programação? A) É a linguagem utilizada pelos programadores para realizar documentação sobre os programas que eles escrevem. B) É a linguagem falada pelos humanos, mas, em vez de uma conversa entre humanos, trata- se de uma conversa entre humanos e um computador. C) É a linguagem utilizada para escrever programas de computadores. D) É a linguagem na qual os algoritmos são escritos. E) É a linguagem composta por 0 e 1 e impossível de ser utilizada por um ser humano. 4) Utilizando o editor e o compilador, quais os passos para que se tenha um programa em C pronto para execução? A) Escrever o programa em um arquivo, salvar o arquivo com extensão C e executá-lo na linha de comando. B) Escrever o programa em um arquivo com extensão txt, com a seguinte linha de comando: gcc -o nomedoprograma.txt nomedoexecutavel. C) Escrever o programa em um arquivo, salvar o arquivo com extensão c e compilar com a seguinte linha de comando: gcc nomedoprograma.c -o nomedoexecutavel. D) Não é possível desenvolver um programa em C somente com editor de texto e compilador. E) Escrever o programa em um arquivo com qualquer extensãoe compilar com a seguinte linha de comando: gcc -o nomedoprograma nomedoexecutavel. 5) A linguagem C é uma linguagem: A) de médio nível e compilada. B) de alto nível e interpretada. C) de baixo nível e compilada. D) de baixo nível e interpretada. E) Nenhuma das alternativas anteriores. NA PRÁTICA Taís está em seu primeiro dia de trabalho no setor de desenvolvimento de sistemas em uma empresa de alta tecnologia. Seu primeiro dia se dá junto com o primeiro dia de estágio de Felipe, o estagiário da equipe de apoio. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Linguagens mais Populares de 2017 Com tantas linguagens de programação no mercado, é interessante estar atento às linguagens de programação mais populares do ano para organizar os estudos. Neste video, você verá as linguagens de programação mais populares do ano de 2017. Conteúdo interativo disponível na plataforma de ensino! O que significa "COMPILAR" e quando você precisa fazer isso no Linux O vídeo mostra como se dá o processo de compilação de um programa no sistema operacional Linux. Conteúdo interativo disponível na plataforma de ensino! Dia do Programador: alguns GRANDES Programadores da História Quem foi a primeira pessoa a programar um computador? Quais foram as pessoas que começaram nesse universo incrível de programação? Neste vídeo, você vai conhecer alguns grandes programadores da história. Conteúdo interativo disponível na plataforma de ensino! O que eu preciso saber para virar engenheiro de software na Google? A Google é uma das principais empresas de tecnologia e um dos grandes sonhos de emprego de muitos dos estudantes de computação. Quer saber o que você precisa fazer para se tornar um engenheiro de software da Google? Acesse o artigo e fique por dentro. Conteúdo interativo disponível na plataforma de ensino! Tipos de dados e Variáveis APRESENTAÇÃO Os dados que utilizamos nos programas de computadores precisam ser armazenados na memória do computador. A memória é como um grande arquivo cheio de gavetas e, para uma melhor organização, essas gavetas podem estar etiquetadas. Outro detalhe desse grande arquivo é que as gavetas podem ter tamanhos diferentes e, de acordo com o tamanho, guardam determinado tipo de objeto. Usando essa analogia, cada gaveta é uma variável que tem um nome (etiqueta) e um tamanho que representa o tipo de variável. Nesta Unidade de Aprendizagem, você vai compreender o que são variáveis e como definimos os tipos de dados que podemos armazenar nessas variáveis. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Identificar a diferença entre os tipos de dados.• Realizar a inicialização e nomeação de variáveis.• Aplicar a declaração de variáveis.• DESAFIO O seu desafio é escrever os tipos de dados numéricos e o seu range. Você deverá escrever isso de forma que os meteorologistas possam ajudá-lo a escolher o melhor tipo. Uma dica é, em vez de escrever a quantidade de bytes de cada tipo, mostrar qual o menor e o maior número que pode ser armazenado naquele tipo. Para entender melhor os tipos de dados em C e as faixas de valores, acesse: Conteúdo interativo disponível na plataforma de ensino! INFOGRÁFICO Acompanhe no infográfico a relação entre os tipos de dados e o espaço reservado na memória do computador. CONTEÚDO DO LIVRO Em programação, os dados são tão importantes quanto o próprio código. Sem dados, o programa não pode realizar nenhuma operação. Por isso, conhecer como armazenar esses dados, bem como que tipo de dados utilizamos, é uma das tarefas iniciais e de muita importância. Leia o capítulo Tipos de Dados e Variáveis, da obra Algoritmos de Programação , que serve de base teórica para esta Unidade de Aprendizagem. Boa leitura. ALGORÍTMOS DE PROGRAMAÇÃO Marcela Santos Tipos de dados e variáveis Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Identificar a diferença entre os tipos de dados. Realizar a inicialização e nomeação de variáveis. Aplicar a declaração de variáveis. Introdução Os dados que utilizamos nos programas de computadores precisam ser armazenados na memória do computador. A memória é como um grande arquivo cheio de gavetas, e, para uma melhor organização, essas gavetas podem estar etiquetadas. Outro detalhe desse grande arquivo é que as gavetas podem ter tamanhos diferentes e, de acordo com eles, guardam determinado tipo de objeto. Usando essa analogia, cada gaveta é uma variável que tem um nome (etiqueta) e um tamanho que representa o seu tipo. Neste capítulo, você vai compreender o que são variáveis e como definimos os tipos de dados que podemos armazenar nelas. Diferença entre os tipos de dados Um computador é uma máquina que processa dados. Ao escrevermos um programa, estamos, na verdade, realizando essa tarefa com os dados que o usuário entrega para a máquina. Por exemplo, quando queremos que um pro- grama realize o cálculo da média entre duas notas, é preciso que, de alguma forma, o programa “receba” essas duas notas. Os dados são os insumos que entregamos aos computadores para que eles realizarem a tarefa, utilizando, para isso, um programa computacional. Esses dados são armazenados em regiões de memória que chamamos de variáveis. Podemos pensar na memória do computador como um grande armário cheio de gavetas, as variáveis são as gavetas e, para uma melhor organização, cada uma possui uma etiqueta indicando o tipo de material que pode ser guardado nela: papel, envelopes, canetas. As variáveis também possuem etiquetas que são os nomes das variáveis, e a classificação do que pode ser guardado em cada variável é dada pelos tipos de variáveis de uma determinada linguagem de programação. Existem cinco tipos de dados em C, e cada um representa um tipo de informação. Os tipos são representados por uma palavra reservada da lin- guagem, que são: int: números inteiros char: letras, caracteres, dados alfanuméricos float: números reais com precisão simples, ocupa 4 bytes na memória do computador double: números reais com precisão dupla, ocupa 8 bytes na memória do computador void:vazio Além dos tipos, existem em C os modificadores de tipo: short: diminui o espaço em memória reservado para uma variável long: aumenta o espaço em memória reservado para uma variável unsigned: indica que a variável será guardada sem sinal signed: indica que a variável será armazenada com sinal Como a ideia desse material é focar em algoritmos de programação, mas com nível básico, os modificadores não serão utilizados. Tipos de dados e variáveis2 Inicializando e nomeando variáveis Se retomarmos ao exemplo da gaveta, os nomes que estão escritos nas etiquetas identifi cam os elementos que estão na gaveta. Não é conveniente identifi car a etiqueta como caneta, sendo que o que está sendo guardado nela seja adesivos. Uma palavra reservada de uma linguagem é uma palavra que faz parte da sintaxe e tem uma funcionalidade especificada na linguagem, não podendo ser usada para outro fim. Com as variáveis, funciona da mesma forma. É conveniente colocar o nome das variáveis para ajudar na leitura de um código. Lembre-se de que você pode ter que reler o código para encontrar erros ou, até mesmo, outras pessoas precisem realizar a tarefa árdua de leitura de código alheio. Escolha nomes que identifiquem as variáveis. Existem algumas regras que podem ajudar na hora de nomear uma variável: Evite começar com letra maiúscula e nunca use um número para co- meçar uma variável. Não utilize caracteres especiais, como:, “, (,). Você não pode usar nenhuma palavra reservada como variável. Evite variáveis como a, b, n1,n2 , pois isso só tende a dificultar a leitura de código. Se a variável tem mais de uma palavra, a partir dasegunda, coloque a primeira letra da palavra em maiúscula, ou utilize underline. Não coloque sinais de pontuação na sua variável. Quando criamos um programa e utilizamos o conceito de variáveis, o compilador associa a uma região de memória o nome desta variável. A memória do computador é um recurso utilizado por todos os programas que estão sendo executados ou que pararam de ser executados em algum momento, ou seja, aquela região que agora é a variável do seu programa pode ter sido utilizada por outro programa, o que deixou alguma informação nessa parte da memória, como se fosse um lixo de dados. 3Tipos de dados e variáveis O que podemos fazer, então, para evitar erros no nosso código devido a valores deixados na memória? Podemos limpar essa região de memória, e isso pode ser feito inicializando o valor de uma variável logo em seguida à declaração. A Figura 1 mostra a declaração e a inicialização de uma variável. Figura 1. Declaração e inicialização de variáveis. Declaração de variáveis Quando um programa está sendo executado, signifi ca que ele está na memó- ria do computador, onde armazenamos os dados nas variáveis. Precisamos solicitar que o computador reserve essa região de memória que possuirá um nome e um tipo. O ato de solicitar essa região deve ser feito no programa e chama-se decla- ração de variáveis. Em C, podemos declarar uma variável da seguinte forma: Na linha 4, realizamos a declaração de uma variável; primeiramente, é preciso colocar o tipo da variável, seguida do nome dela, e, por fim, o ponto- -e-vírgula que finaliza toda e qualquer linha em C. Na linha 5, inicializamos a variável idade com o valor 0, para que, assim, não corramos o risco de ter um valor indesejado armazenado nessa variável, sendo utilizado no nosso programa. Vamos a outro exemplo. Imagine que você precise calcular a média de um aluno. O seu usuário precisa digitar duas notas e você precisa calcular a média. Vamos, nessa etapa, somente declarar e inicializar as variáveis necessárias. Tipos de dados e variáveis4 Figura 2. Declaração simultânea de variáveis. Observe que, na linha 4, declaramos na mesma linha 3 variáveis do tipo double, pois a média pode ser um número com vírgula. Essa é outra forma de declarar variáveis de mesmo tipo de forma simultânea. Nas linhas 5,6 e 7, inicializamos essas variáveis para evitarmos quaisquer erros causados por “lixo” de dados presente na memória. A Figura 2 apresenta uma declaração simultânea de variáveis. A definição do tipo das variáveis, do nome e de como você faz essas escolhas constitui uma etapa importante do desenvolvimento de programas. Faça essas escolhas com calma e analisando bem o que você utilizará e como. PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 296p. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p. Leituras recomendadas 5Tipos de dados e variáveis Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. Conteúdo: DICA DO PROFESSOR O que são variáveis e para que elas servem? Como definir os tipos de dados que serão utilizados em um programa? Acompanhe o vídeo da Dica do Professor e tenha orientações sobre esses conceitos e como a linguagem C trata essas questões. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Você precisa declarar uma variável "idade" do tipo inteiro. Qual a maneira correta de fazer isso em C? A) int idade; B) idade int; C) inteiro idade; D) Não é preciso declarar em C; o simples uso da variável faz ela passar a existir. E) float idade; 2) Ao declarar uma variável que armazena um caractere, você escreveu a seguinte linha de código: char -nome; Ao compilar o programa, verificou que essa declaração gerou um erro de sintaxe. Qual a alternativa que indica esse erro? A) -nome é uma palavra reservada; por esse motivo, ocorreu o erro. B) char não é um tipo existente em C. C) Variáveis não devem começar com caracteres especiais como o hífen utilizado na declaração. D) Durante a declaração, não é preciso o ponto e vírgula no final da linha de código. E) Faltou inicializar a variável, pois, em C, não podemos usar uma variável sem antes inicializá-la. 3) Qual a maneira correta de declarar uma variável em C? A) A declaração é feita primeiro colocando-se o tipo da variável, seguido do nome da variável e finalizando a instrução com ponto e vírgula. O tipo é dado por palavras reservadas da linguagem em que se está programando. B) Não se declara variável em C. C) A declaração é feita colocando-se o nome da variável, seguido do tipo de variável e finalizando a instrução com ponto e vírgula. O tipo é dado por palavras reservadas da linguagem em que se está programando. D) A declaração é feita colocando-se o nome da variável, seguido do caractere especial : (dois pontos). Em seguida, coloca-se o tipo de variável e finaliza-se a instrução com ponto e vírgula. O tipo é dado por palavras reservadas da linguagem em que se está programando. E) A declaração é feita colocando-se o tipo da variável, seguido do caracter especial : (dois pontos). Em seguida, coloca-se o nome da variável e finaliza-se a instrução com ponto e vírgula. O tipo é dado por palavras reservadas da linguagem em que se está programando. Você precisa armazenar os seguintes dados: - Salário bruto; 4) - Sexo, que será representado por F (Feminino), M (Masculino) ou N (prefiro não declarar); - Idade, em anos. Quais são os tipos dessas variáveis? A) int, char e double. B) double, char e double. C) double, char e int. D) int, char e int. E) char, double e int. 5) Por que, em alguns casos, é interessante inicializar uma variável em C? A) Porque o nome da variável pode já ter sido usado por algum programa. B) Porque essa técnica é obrigatória em todo programa e todas as variáveis em C. C) Porque é uma boa prática para um melhor entendimento do código-fonte. D) Para não corrermos o risco de utilizar um valor armazenado anteriormente por outro programa naquele espaço de memória. E) A inicialização de uma variável é desnecessária em C. NA PRÁTICA Fernando é estagiário do setor de recursos humanos de uma empresa e está desenvolvendo um programa em C para calcular salário bruto, salário líquido e descontos de funcionários da empresa onde ele trabalha. Além disso, ele gostaria de saber a quantidade de funcionários que se declaram do sexo masculino ou do sexo feminino e a quantidade de funcionários que não gostaria de declarar o seu sexo. Como dados, ele tem a quantidade de horas trabalhadas, o nome do funcionário e o valor da hora. Além disso, ele obteve as porcentagens de desconto. Porém, Fernando ficou confuso sobre quais aspectos precisa levar em consideração na escolha das variáveis para desenvolver esse programa e pediu ajuda a um colega da área de programação. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Lógica de Programação Os algoritmos são formados por instruções e dados. Acompanhe no vídeo um resumo sobre tipos de dados, variáveis, constantes e instruções. Conteúdo interativo disponível na plataforma de ensino! Projeto torne-se um programador - Uso de variáveis Se você quer se tornar um programador, um passo muito importante é entender o que é uma variável e como usá-la. Assista ao vídeo para entender como uma variável é armazenada e como se dá o uso dela. Conteúdo interativo disponível na plataforma de ensino! Declaração de Variáveis, Leitura e Escrita de Dados Os algoritmos são formados por instruções e dados. Acompanhe no vídeo um resumo sobre tipos de dados, variáveis, constantes e instruções. Conteúdo interativo disponível na plataforma de ensino! Entrada e saída de dados APRESENTAÇÃO A tarefa de um programa de computador é receberdados por meio de instruções de entrada, processar essas informações de acordo com a lógica criada e traduzida para uma determinada linguagem de programação e entregar esses dados processados utilizando as instruções de saída de dados. Nesta Unidade de Aprendizagem, você irá estudar uma parte importante do desenvolvimento de sistemas: as instruções necessárias para realizar a entrada e a saída de dados em um programa de computador. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Definir função.• Aplicar as funções printf() e scanf().• Desenvolver códigos de formatação.• DESAFIO A linguagem C é uma linguagem amplamente utilizada pela comunidade de desenvolvedores e uma linguagem de referência para cursos de ciência da computação em todo o mundo, juntamente com Python e Java. Procedural e estruturada, C provavelmente é uma das linguagens de programação mais conhecida no mundo. Considere que você é funcionário do cinema de um shopping. Seu gerente pediu que desenvolvesse um programa em C para calcular o valor de ingressos do cinema e fornecer aos usuários. O programa deve apresentar ao usuário as opções de filme e o valor total dos ingressos, com custo de 12,50 reais cada. Além disso, o valor do ingresso deve ser facilmente modificado no código. As opções de filme são: Se o usuário escolher a opção 1: Vingadores 4 – da Marvel Se o usuário escolher a opção 2: Como Treinar o Seu Dragão 3 Se o usuário escolher a opção 3: Dumbo Se o usuário escolher a opção 4: Shazam! Neste desafio demonstre como organizar o código para fazer a entrada de dados usando as funções printf e scanf. Ao final o usuário tem que ser informado sobre as opções escolhidas. INFOGRÁFICO Uma função é um subprograma que só é executado quando chamado, evitando repetições, ou seja, podemos pegar esse trecho de código que irá se repetir e colocar dentro de um bloco - uma função. Outra característica é que as funções ajudam a dividir um programa, deixando o código mais organizado. Cada função executa uma operação predetermina. Existem funções predefinidas como: printf () e scanf(), e as funções definidas pelo usuário. Uma função pode ser pensada como uma caixa-preta, quando se utiliza uma função não é necessário "estar a par" de todo o código existente dentro dela, apenas saber o que precisa entregar para a função (se precisa) e o que ela vai entregar (se entregar). Acompanhe no Infográfico como a caixa-preta funciona, arrastando a seta. Conteúdo interativo disponível na plataforma de ensino! CONTEÚDO DO LIVRO Os computadores precisam de dados, que são processados pelos programas, para executar as suas tarefas. É preciso que nos programas existam instruções para que esses dados sejam inseridos e, além disso, instruções para que a resposta desse processamento seja mostrada. Essas instruções são as instruções de entrada e de saída. Leia mais no capítulo Entrada e saída de dados, da obra Algoritmos de programação, que serve como base teórica para esta Unidade de Aprendizagem. Boa leitura. ALGORITMOS DE PROGRAMAÇÃO Marcela Santos Entrada e saída de dados Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Descrever o conceito de função. � Aplicar as funções printf() e scanf(). � Usar códigos de formatação. Introdução Os programas de computador são sistemas que processam dados. A tarefa de um programa de computador é receber dados por meio de instruções de entrada, processar essas informações de acordo com a lógica criada e traduzida para uma determinada linguagem de programação e entregar esses dados processados, utilizando as instruções de saída de dados. Neste capítulo, você estudará uma parte importante no desenvol- vimento de sistemas: as instruções necessárias para realizar a entrada e saída de dados em um programa de computador. O conceito de função Para explicar o conceito de função, vamos começar com o seguinte código: Figura 1. Código-fonte: o conceito de função. Na linha 4, temos o uso de uma função existente em C, a printf. Esta função escreve na tela o texto existente em parênteses e entre aspas. Existe uma complexidade gigante para que seja escrito na tela do computador um valor e existam instruções específicas para isso. Uma função é um conjunto de instruções que realizam uma determinada tarefa. Para que fique mais fácil o uso, elas têm nome. Seria preciso um conjunto dessas instruções todas as vezes em que essa operação fosse necessária em um programa. Para facilitar esse trabalho, em programação, existem dois conceitos muito importantes: biblioteca e funções. Na vida real, também temos algo parecido. Imagine que você tenha que fazer café. Automaticamente nós já realizamos todas as tarefas que estão en- volvidas: colocar água para ferver, colocar o pó do café, esperar a água ferver e despejar a água quente sobre o pó de café (essa é a maneira que eu faço café!) Então todas as vezes que eu vou fazer café, mando essas informações automaticamente para o meu cérebro. Em programação, é a mesma coisa: uma função é um conjunto de instruções organizadas em bloco, que possuem um nome e, quando for preciso, é chamada por meio deste. As funções podem ser criadas pelos programadores ou podem estar in- cluídas nas bibliotecas de uma determinada biblioteca — e é aqui que entra o nosso segundo conceito: uma biblioteca de programação é um conjunto de funções que já foram pré-definidas por outros programadores; você precisa simplesmente adicionar a biblioteca ao seu programa e utilizar as funções. Esse é o caso da função printf, presente na linha 4 do código apresentado na Figura 1. Agora, vamos aprender mais sobre essa e outra função, que são as funções básicas de entrada e saída na linguagem C. Entrada e saída de dados2 As funções printf() e scanf() Um computador é uma máquina que faz uso de programas e dados para realizar tarefas. Esses programas recebem esses dados, processam e entregam-nos como resposta a algum tipo de problema. Os programas são compostos de instruções que fazem esse processamento. Essas instruções podem ser funções de entrada e de saída, e é sobre elas que iremos tratar. Vale a pena ressaltar que estamos tratando da linguagem de programação C, e essas funções sãos funções desta linguagem. Para usar as funções scanf e printf, é preciso incluir a biblioteca stdio.h no código-fonte, por meio da linha #include <stdio.h> A função printf é a função de saída de dados no vídeo. Todas as funções têm uma sintaxe, que é uma regra que mostra como ela deve ser usada e qual o resultado esperado. A sintaxe de printf está representada na Figura 2, a seguir: Figura 2. Sintaxe da função printf. printf(”entrada de dados”); aqui você digita o texto que deseja apresentar na tela. 3Entrada e saída de dados Essa é a forma mais básica para utilizarmos essa função, quando queremos simplesmente apresentar na tela uma mensagem de texto. Mas pode haver situações em que queremos apresentar o valor de uma variável. Quando isso for necessário, basta que, em vez do texto, coloquemos somente a variável sem as aspas. Mas ainda pode existir a situação em que queremos apresentar um texto e uma variável na mesma saída de dados. Para entendermos como isso pode ser feito, vamos analisar o seguinte código, na Figura 3: Figura 3. O uso de printf com código de formatação. Esse código mostra o ano que a pessoa nasceu, usando, para isso, uma variável que contém a idade da pessoa. Foram definidas 3 variáveis do tipo inteiro: idade, anoAtual e anoNascimento. As variáveis idade e anoAtual possuem valores iniciais, ou seja, não temos uma entrada de dados por parte do usuário que executa o programa criado com esse código-fonte. A variável anoNascimento é calculada usando-se dois operadores: o de atribuição e o de subtração — esses operadores serão vistosem capítulos posteriores. Entrada e saída de dados4 Nesse primeiro momento, vamos entender o que a linha 6 faz, conforme representação na Figura 4: Figura 4. Expressão usando operadores e uma variável. Depois de realizar a operação, que fica à esquerda dessa expressão, o valor é armazenado dentro da variável anoNascimento Essa operação subtrai do valor 2018 o valor armazenado na variável idade Com o valor armazenado na variável anoNascimento, falta realizarmos a saída de dados, ou seja, escrever esse valor na tela. Isso é feito na linha 7, utilizando-se a função printf, só que desta vez essa função é usada com um código de formatação e a concatenação de uma variável. Concatenar uma variável é unir variáveis e/ou textos na mesma saída de dados, por exemplo. Para isso, adicionamos, ao final do texto que deverá aparecer na tela, uma vírgula (,), seguida das variáveis. Cada variável que é adicionada tem um tipo, e é preciso “avisar” ao printf que tipo é esse, para tal, o C tem o conceito de códigos de formatação. Mas antes de entendermos o que sãos os códigos de formatação, vamos à nossa função de entrada de dados. Bom, agora vamos para a próxima função, a scanf. Da mesma forma que a função printf é uma função que está em uma biblioteca padrão do C, scanf também está; a diferença é que scanf é uma função de entrada de dados. 5Entrada e saída de dados Vamos usar um exemplo de uso, apresentado na Figura 5, a seguir: Figura 5. Código-fonte com o uso de printf e scanf. Esse programa pede ao usuário que ele digite sua idade e o ano atual e, com esses dados, ele calcula o ano do nascimento. Na linha 6, temos o uso da função printf, que mostra na tela o texto, informando ao usuário a solicitação do dado. Em seguida, aparece o uso da função scanf. Quando o usuário digitar um valor e teclar enter, a linha 7 pode ser traduzida para: “armazene na variável idade o valor inteiro que foi digitado”. A sintaxe básica da função scanf é a que está representada na Figura 6: Figura 6. Sintaxe da função scanf. O primeiro valor da função scanf é o código de formatação entre aspas Já o segundo valor, também chamado de parâmetro, é a variável, precedida de & Entrada e saída de dados6 Podemos, também, receber mais de um número no mesmo scanf, con- forme pode ser visto no exemplo da Figura 7, a seguir: Figura 7. Código-fonte de um programa que soma dois valores, recebidos no mesmo scanf. Códigos de formatação Os códigos de formatação em C começam com % e permitem que as funções de entrada (scanf) e saída (printf) expressem os tipos de dados armazenados nas variáveis. Indicam o tipo do dado. � %c: imprime o conteúdo da variável com representação ASCII. � %d: imprime o conteúdo da variável com representação decimal com sinal. � %u: imprime o conteúdo da variável com representação decimal sem sinal. � %o: imprime o conteúdo da variável com representação octal sem sinal. � %x: imprime o conteúdo da variável com representação hexadecimal sem sinal. � %f: imprime o conteúdo da variável com representação com ponto decimal. � %e: imprime o conteúdo da variável com representação em notação científica (exponencial). � %g: formato geral, escolhe a representação mais curta entre %f e %e. Além desses códigos de formatação em C, nós temos as sequências de escape que podem auxiliar para impressão de texto na tela de forma formatada. Dentre elas, os mais usados são. 7Entrada e saída de dados � \n: quebra de linha � \t: realiza uma tabulação horizontal � \b: adiciona um “backspace” ao texto � \r: volta o cursor para o começo da linha sem mudar de linha � \a: emite um sinal sonoro � \”: quando você precisa, no seu texto, do uso de aspas duplas � \’: quando você , no seu texto, do uso de aspas simples � \\: quando você precisa, no seu texto, do uso de barra invertida � \0: caractere nulo No código da Figura 8, a seguir, você pode ver o uso de códigos de for- matação e sequências de escape. Figura 8. Uso de código de formatação, sequência de escape e funções de entrada e saída. PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 296p. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p. Leituras recomendadas Entrada e saída de dados8 DICA DO PROFESSOR As funções printf e scanf são funções existentes na biblioteca padrão stdio.h do C e são muito usadas em praticamente todos os programas que precisam de entrada e saída de dados. Acompanhe o vídeo da Dica do professor, onde você terá orientações sobre esses conceitos e sobre como usar essas funções. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Considerando o seguinte código, qual o valor das variáveis x e y no final da execução? A) X é 17 e y é 17. B) X é 25 e y é 25. C) X é 17 e y é 25. D) X é 25 e y é 17. E) Não é possível determinar os valores das variáveis. 2) Qual o valor da variável após a execução do seguinte código: A) 18. B) -2. C) O valor da variável x é um endereço de memória. D) Nada. Ocorre um erro, pois não é possível realizar uma operação do tipo x-2. E) 16. 3) Qual a definição de uma função em linguagem de programação? A) Uma função é um conjunto de instruções organizadas em forma de bloco e que têm um nome para que assim sejam utilizadas em um código-fonte. B) Uma função é uma regra matemática utilizada em programação para realizar cálculos. C) É uma regra para acesso de forma mais simples à memória do computador. D) Uma função é a forma com que os usuários entram com os dados em um programa. E) Uma função é uma entidade básica de um sistema computacional e existe somente em linguagens antigas. 4) Para que servem as funções printf e scanf? A) São funções utilizadas para realizar operações de impressão de um arquivo em um impressora e acesso ao scanner conectado à máquina. B) São funções para realização de operações matemáticas em um computador. C) A função printf mostra um valor na tela do computador e a função scanf serve para armazenar valores dentro de uma variável. D) A função printf armazena um valor em uma determinada variável, já a função scanf mostra um valor na tela. E) São instruções de acesso à memória. O que está faltando na linha 9 para que seja mostrado o seguinte texto: Soma:, seguido do valor da soma dos dois números digitados pelo usuário. 5) A) &soma. B) soma. C) "soma". D) 'soma'. E) +soma. NA PRÁTICA Ana está gerenciando o desenvolvimento de um sistema de pesquisa sobre o sistema bancário. O sistema é usado com interação direta com o usuário em terminais espalhados por um shopping para verificar o uso do aplicativo do banco e da confiabilidade dos clientes em cada banco disponível no terminal. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: CS Principles: Defining and Calling Functions Acompanhe no vídeo a seguir, como definir e usar funções em programação. Conteúdo interativo disponível na plataforma de ensino! Programação em C Acesse o vídeo para compreender melhor o que são os subprogramas ou funções, pois o vídeo traz uma introdução sobre esse conceito. Conteúdo interativo disponível na plataforma de ensino! Programar em C - Formatação de Ouput - Nesse vídeo você irá aprender formatação de output na Linguagem C. Conteúdo interativo disponível na plataforma de ensino! Operadores APRESENTAÇÃO Os operadores são símbolos utilizados para escrever expressões. Essas expressões podem ser de atribuição, aritméticas, lógicas e relacionais. Além de tipos diferentes, as expressões podem conter vários operadores, o que implica entender qual é a precedência entre esses operadores. Nesta Unidade de Aprendizagem, você irá compreender como funcionam os operadores e quais são eles em C. Além disso, você irá estudar os conceitos de incremento, como ele pode ser feito e seu importante papelna arte da programação de computadores. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Compreender o uso dos operadores de atribuição, aritméticos, relacionais e lógicos.• Construir expressões com vários operadores e precedência.• Desenvolver expressões que utilizem operadores de pré e pós-incremento/decremento.• DESAFIO Você foi contratado por uma empresa de jogos. Sua primeira atividade é desenvolver um jogo educativo que será utilizado no ensino de matemática. Você deverá entregar esse projeto em partes. Nessa primeira etapa, você irá implementar somente o seguinte: - Pedir ao usuário um número. - Calcular o antecessor e sucessor desse número. - Mostrar a tabuada de multiplicação desse número. - Apresentar os próximos três números com contagem de dois em dois. Esse jogo será modificado futuramente, pois se deseja adicionar algumas funcionalidades, como escolha do tipo de tabuada e tamanho do "passo" da contagem. Portanto, organize seu código de forma que outro programador possa entendê-lo. INFOGRÁFICO Como resolver expressões com vários operadores de tipos diferentes? O infográfico, a seguir, apresenta dicas simples de como fazê-lo e ter a resposta correta para expressões com muitos operadores usando, para isso, a ordem de precedência. CONTEÚDO DO LIVRO Os operadores são peças fundamentais para realizar diversas tarefas no mundo da programação utilizando expressões. Essas expressões podem ser de atribuição, relacionais ou lógicas, e podem configurar expressões de um tipo ou haver expressões com vários operadores de vários tipos. Além disso, existe uma forma rápida de realizar uma tarefa bastante comum na computação: incremento e decremento de uma variável. Leia mais no capítulo Operadores, da obra Algoritmos de programação, base teórica para esta Unidade de Aprendizagem. Boa leitura. ALGORITMOS DE PROGRAMAÇÃO Marcela Santos Operadores Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Reconhecer o uso dos operadores de atribuição, aritméticos, rela- cionais e lógicos. � Construir expressões com vários operadores e precedência. � Desenvolver expressões que utilizem operadores de pré e pós-incremento/decremento. Introdução Os operadores são símbolos que são utilizados para escrevermos expres- sões, as quais podem ser de atribuição, aritméticas, lógicas e relacionais. Além de tipos diferentes, as expressões podem conter vários operadores, o que implica entendermos qual a precedência entre estes. Neste capítulo, você vai compreender como funcionam os operadores e quais são eles em C. Além disso, você será apresentado aos conceitos de incremento, como ele pode ser feito e seu papel importante na arte da programação de computadores. Operadores de atribuição, aritméticos, relacionais e lógicos Como foi visto anteriormente, uma variável é um espaço de memória de um determinado tipo, que vai guardar um valor seja do tipo inteiro, real ou caractere. Existe uma função predefinida em uma biblioteca padrão do C, que nos permite guardar um valor digitado pelo usuário em uma variável declarada, a função scanf. Mas como podemos armazenar um valor em uma variável, sendo que ele não foi digitado pelo usuário — como, por exemplo, no momento que inicializamos uma variável? Observe a Figura 1. Identificação interna do documento H2KELUIHE5-1PZKMF1 Figura 1. Código para exemplificar o operador de atribuição. As linhas 3 e 4 mostram a declaração e inicialização de duas variáveis; tomemos a linha 3 como exemplo. Essa linha pode ser traduzida como: “armazeno o valor 34 dentro da variável idade”. Para realizar essa operação, utilizamos o operando = (igual), de atribuição. A sintaxe de uso deste operando em uma expressão de atribuição pode ser vista na Figura 2. Figura 2. Sintaxe do operador de atribuição. Esse valor armazenado pode ser um valor direto (como no exemplo), ou uma expressão aritmética, lógica ou relacional. Todas as operações aritméticas, já conhecidas da nossa matemática clássica, podem ser usadas em programação. Cada linguagem de programação tem seus operandos para representar essas operações — em alguns casos, são os mesmos que já conhecemos em outros, existindo uma pequena diferença. Operadores2 Identificação interna do documento H2KELUIHE5-1PZKMF1 Para exemplificar, vamos desenvolver um programa em C que realiza as quatro operações básicas com dois números inteiros, conforme representado na Figura 3. Figura 3. Código de uma calculadora com as quatro operações aritméticas. Ao executar esse programa e digitando os valores 5 e 2 para as variáveis numero1 e numero2, respectivamente, teremos a seguinte resposta, na Figura 4: Figura 4. Saída da calculadora com as quatro operações aritméticas. 3Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Um ponto interessante a se avaliar essa saída de dados é a resposta à operação de divisão. Em C, ao se dividir dois números inteiros, o resultado também é um número inteiro, mesmo que a resposta da divisão seja um número real, como no caso de 5 dividido por 2. Assim, a resposta aparece truncada, que quer dizer somente com a parte inteira. Para resolvermos isso, podemos declarar as variáveis como do tipo float e delimitar o número de casas decimais depois da vírgula. Isso pode ser visto, a seguir, na Figura 5 e na Figura 6. Figura 5. Código de uma calculadora com as quatro operações aritméticas usando o tipo float. Operadores4 Identificação interna do documento H2KELUIHE5-1PZKMF1 Figura 6. Saída da calculadora com as quatro operações aritméticas usando o tipo float. Além disso, existe um operando que permite que se armazene o resto da divisão, também chamado de operação módulo. Esta operação é realizada com o operando % (por cento). Para exemplificarmos, vamos mostrar o resto da divisão de um número digitado pelo usuário, por 2, conforme Figura 7. Como sabemos, se o resto for 0, o número é par. Vamos ao código em C! Figura 7. Uso do operador módulo. 5Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Como nós estamos utilizando a linguagem C, a seguir, você pode ver, na Tabela 1, a operação aritmética e o seu operando, bem como um exemplo de ex- pressão de utilização em um programa de computador escrito na linguagem C. Operação Operador Expressão Soma + a= b+1; Subtração - a= b-25 ; Multiplicação * a= a*2 ; Divisão / a=a/2 ; Módulo % a= 4%2 Tabela 1. Operadores aritméticos. Além dos operadores de atribuição e aritméticos, existem os operadores lógico-relacionais. Os operadores relacionais (Tabela 2, a seguir) são utiliza- dos quando se precisa comparar variáveis e/ou valores do mesmo tipo. Uma operação relacional tem como resultado os valores lógicos verdadeiro ou falso. Variáveis que podem ter somente dois tipos, como verdadeiro ou falso, são conhecidas em programação como variáveis do tipo booleano. Booleano vem da álgebra que usa esses valores, criada pelo matemático George Boole. O detalhe é que, em C até o compilador de 1999, nós não tínhamos esse tipo, sendo necessário que os programadores simulassem. Atualmente, basta que seja adicionada a biblioteca stdbool.h. Vamos usar bastante os operadores relacionais e o tipo bool que pode ter o valor 1 ou 0, quando estivermos uti- lizando as estruturas de seleção. Por agora, vale a pena conhecer o operando e a sua função. Operadores6 Identificação interna do documento H2KELUIHE5-1PZKMF1 Para saber mais sobre o tipo bool e a biblioteca stdbool, acesse: https://goo.gl/5g1xr2 Operador relacional Exemplo : sejam a e b duas variáveis do mesmo tipo, como, por exemplo, a = 10 e b =5 Descrição Resultado == a == b Avalie se a é igual b 0 > a > b Avalie se a é maior que b 1 < a < b Avalie se a é menor que b 0 >= a > = b Avalie se a é maior ou menor que b 1 <= a <= b Avaliese a é menor ou igual a b 0 != a ! = b Avalie se a é diferente de b 1 Tabela 2. Operadores relacionais. 7Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Para mais detalhes da Álgebra Booleana, leia Scheinerman (2003), e o tipo bool em C. Acesse: https://goo.gl/3gSrrh Por fim, temos os operadores lógicos que nos proporcionam escrever expressões lógicas, as quais realizam funções lógicas, dentre as quais temos: e, ou e não. Além de um operador lógico, também conhecido como conectivo, uma expressão lógica é formada por duas proposições. Uma proposição é uma afirmação que pode ser verdadeira ou falsa. Assim, uma expressão lógica é formada pela conexão de duas ou mais proposições por meio de um conector. Existe uma maneira de mapear todas as possibilidades de valores dessas proposições, bem como o valor da expressão — essa forma de mapeamento é denominada tabela-verdade. Cada operador tem uma tabela-verdade. A seguir, você pode ver esse mapeamento com os 3 operadores, bem como os símbolos que os representam: e (&&), ou (||) e não (!). Vamos nomear uma das proposições de P e a outra de T, e, neste primeiro momento, ter true(1) ou false(0) como valores dessas proposições. Observe as Tabelas 3, 4 e 5. P T P && T True True True True False False False True False False False False Tabela 3. Tabela-verdade da operação E Lógico. Operadores8 Identificação interna do documento H2KELUIHE5-1PZKMF1 P T P || T True True True True False True False True True False False False Tabela 4. Tabela-verdade da operação Ou Lógico. P ! P True False Fale True Tabela 5. Tabela-verdade da operação Não Lógico. Da mesma forma do caso das operações e expressões relacionais, vamos usar bastante as tabelas-verdade e operadores lógicos quando estivermos tratando das estruturas de seleção. Como mencionado anteriormente, existe um tipo de variável em C que representa o tipo booleano. Veja alguns detalhes, a seguir. Para utilizá-la, é preciso a adição da biblioteca stdbool com a seguinte linha de código: # include <stdbool.h> A declaração das variáveis é feita da seguinte forma: bool a. A inicialização e atribuição podem ser feitas usando-se true/false ou 1/0. Atribuir o valor verdadeiro para a variável a: a=true ; (a=1). A resposta das operações lógicas será SEMPRE 0 e 1. Para exemplificar, nas Figuras 8 e 9, segue um código-fonte e a execução de um programa que mostra o uso dos operadores lógicos: E, Ou e Não. 9Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Figuras 8 e 9. Operadores lógicos. Para finalizar, observe a Tabela 6, com operadores lógicos em C. Operação Operador E && Ou || Não ! Tabela 6. Operadores lógicos. Assim podemos fazer uma tabela-resumo (Tabela 7) com todos os opera- dores que foram vistos até agora: Operadores10 Identificação interna do documento H2KELUIHE5-1PZKMF1 Tipo Operação Operador Aritmético Multiplicação * Aritmético Divisão / Aritmético Soma + Aritmético Subtração - Aritmético Módulo % Relacional Menor que < Relacional Menor que ou igual a <= Relacional Maior que > Relacional Maior que ou igual a >= Relacional Igual a == Relacional Diferente de != Lógico E && Lógico Ou || Lógico Não ! Tabela 7. Resumo de todos os operadores: aritméticos, relacionais e lógicos. Expressões com vários operadores e precedência As expressões aritméticas, relacionais e lógicas podem ter vários operadores, e, para isso, existe uma ordem de precedência entre os operadores do mesmo tipo. A primeira regra e mais importante é: se existir, em uma expressão, uma subexpressão dentro de um parênteses, essa expressão deve ser a primeira a ser resolvida, ou seja, os parênteses, quando existentes, são sempre os primeiros a serem resolvidos. Antes de avaliarmos uma expressão com vários tipos de operadores, vamos avaliar expressões com vários operadores, porém do mesmo tipo. Para isso, vamos usar a ordem de precedência respeitada pelo compilador da linguagem C. Entre esses operadores, começamos com os aritméticos. Observe a Tabela 8. 11Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Ordem de execução Operação Operador 1 Multiplicação * 2 Divisão / 3 Soma + 4 Subtração - 5 Módulo % Tabela 8. Ordem de precedência dos operadores aritméticos. O que isso quer dizer? Isso significa que, se em uma expressão existir uma multiplicação, uma divisão e uma soma, a ordem deve ser a seguinte: multiplicação, divisão e soma. Veja um exemplo na Figura 10. Figura 10. Expressão com operadores aritméticos. Nessa expressão, a multiplicação deve ser feita antes da subtração — basta seguir a regra de precedência da tabela mostrada anteriormente. Da mesma forma, existe uma ordem de precedência respeitada pelo compilador C, entre os operadores relacionais. Essa ordem pode ser observada na Tabela 9, a seguir. Operadores12 Identificação interna do documento H2KELUIHE5-1PZKMF1 Ordem de execução Operação Operador 1 Menor que < 2 Menor que ou igual a <= 3 Maior que > 4 Maior que ou igual a >= 5 Igual a == 6 Diferente de != Tabela 9. Ordem de precedência dos operadores relacionais. Vamos a um exemplo. Observe a Figura 11. Figura 11. Expressão com operadores relacionais. Nessa expressão, as operações relacionais de maior e menor de cada lado da operação igual a devem ser feitas primeiro. Logo, em seguida, comparam-se os valores obtidos entre essas operações e, dependendo do valor de a, b, c e d, teremos um valor verdadeiro (true,1) ou falso (false,0). 13Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Para finalizar, temos a ordem de precedência dos nossos operadores lógicos. Observe a Tabela 10. Ordem de execução Operação Operador 1 E && 2 Ou || 3 Não ! Tabela 10. Ordem de precedência dos operadores lógicos. Para exemplificar, vamos usar a seguinte expressão, conforme a Figura 12. Figura 12. Expressão com operadores lógicos. Seguindo as regras, a operação E é feita antes, para só em seguida a operação Ou ser executada. Agora, vamos colocar todos os operadores — aritméticos, relacionais e lógicos — em uma única tabela e reorganizar a ordem de pre- cedência. Veja na Tabela 11. Operadores14 Identificação interna do documento H2KELUIHE5-1PZKMF1 Ordem de execução Operação Operador 1 Multiplicação * 2 Divisão / 3 Soma + 4 Subtração - 5 Módulo % 6 Menor que < 7 Menor que ou igual a <= 8 Maior que > 9 Maior que ou igual a >= 10 Igual a == 11 Diferente de != 12 E && 13 Ou || 14 Não ! Tabela 11. Ordem de precedência de todos os operadores. A ordem de precedência é a seguinte: � As operações aritméticas são realizadas primeiramente. � Em seguida, são realizadas as operações relacionais. � O próximo passo é realizar operações lógicas, na seguinte ordem (ver Figura 13). Exemplificamos, descobrindo o valor da expressão: (y + z < x) OU (x>15) E (y < 55), sendo x igual a 15, y igual a 70 e z igual a 5. 15Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Figura 13. Expressão com operadores aritméticos, rela- cionais e lógicos. � Primeiro, precisamos avaliar todas as operações que estão em parênteses. � O primeiro passo é realizar a operação y+z, que é igual a 75. � Agora, é preciso avaliar as operações relacionais. ■ (y+z<x) : (75<15), que é falso. ■ (x>15): (15>15), que é falso. ■ (y<55): (70<55) que é falso. � Se colocarmos os valores lógicos na expressão inicial, temos: ■ (falso) ou (falso) e (falso) � A operação e é realizada primeiro e, pela tabela-verdade, é possível ver que, quando temos dois valores falsos, o resultado é falso. � Assim, a expressão fica: falso ou falso, resultando em falso, e esse é o valor final dessa expressão. Uma dica para evitar confusão é definir as precedências usando parên- teses. As expressões dentro dos parênteses mais internos são resolvidas primeiramente. Operadores de pré e pós-incremento/ decremento Por fim e não menos importante,nós temos, neste capítulo, operadores de incremento e decremento. Estas operações são utilizadas para acelerar o processo de aumentar ou diminuir unidades de variáveis. Operadores16 Identificação interna do documento H2KELUIHE5-1PZKMF1 O operador de incremento ++ adiciona a 1 a variável que utiliza esse operador. Já o operador de decremento -- subtrai 1 da variável. Essas operações podem ser feitas antes ou depois do uso da variável, ou seja, um pré ou pós-incremento e um pré ou pós-decremento. No pré-incremento (decremento), o valor será modificado na instrução que a variável está sendo avaliada. Já, no caso de pós, o valor da variável será modificado na próxima instrução. Para exemplificarmos, temos o seguinte código e sua saída de execução. Veja as Figuras 14 e 15. Figura 14. Código-fonte para exemplificar o uso dos operadores de incremento e decre- mento e suas formas de uso. Figura 15. Saída da execução do código-fonte para exemplificar o uso dos operadores de incremento e decremento e suas formas de uso. 17Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 Uma das grandes utilidades dos operadores de incremento ou decremento é no uso de variáveis contadoras. Imagine que você tenha que desenvolver um sistema de fichas para uma central de atendimento. Os números de ficha entregues para os usuários nada mais são do que valores que, a cada solicitação, aumenta-se 1, ou seja, vamos contando de 1 em 1. Vamos criar um programa que conte de 1 até 5 de duas formas: como a operação de soma, usando o operador +, e com a operação de incremento, usando o operador ++. Veja as duas formas nos códigos da Figura 16, a seguir. Figura 16. Contadores: uso do incremento. Os dois programas realizam a mesma tarefa: contam de 1 a 5 e mostram esta contagem na tela. A diferença está na forma que isso pode ser feito. A forma reduzida é bastante utilizada em programação, e outro detalhe interessante é que podemos também incrementar valores diferentes de 1. Imagine contar de 1 a 10, somente os números pares. A seguir, na Figura 17, serão mostradas as duas formas de se realizar essa tarefa: forma convencional e forma reduzida. Operadores18 Identificação interna do documento H2KELUIHE5-1PZKMF1 Figura 17. Contadores: uso do incremento, para um contador de números pares. BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http:// en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018. SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson Pio- neira, 2003. Leituras recomendadas PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 296p. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p. 19Operadores Identificação interna do documento H2KELUIHE5-1PZKMF1 DICA DO PROFESSOR Como usar operandos aritméticos e relacionais para resolver um problema real utilizando a linguagem C? Acompanhe o vídeo da Dica do Professor para receber orientações sobre o uso desses operadores e uma dica especial sobre o tipo booleando na linguagem C. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Considerando o trecho de código escrito na linguagem C, qual é o valor da variável resultado1? A) 56.5. B) É impossível determinar, pois em C não se pode fazer operações aritméticas com tipos diferentes. C) 56. D) 7. E) 7.5. 2) Considerando o trecho de código, qual é o valor que será impresso na tela ao final da execução? A) 7. B) 7.5. C) 7.00. Não se pode realizar operações com números inteiros e armazenar em uma variável do D) tipo float. Portanto, esse código não é executado, havendo um erro de sintaxe. E) Não é possível determinar, pois a variável resultado não foi inicializada. 3) Avalie o seguinte código, e diga qual é o resultado que será impresso. A) 20.10. B) 11. C) 8. D) 15.7. E) 10.10. 4) Assinale a opção que indica a diferença entre os operadores = e ==, ambos utilizados na linguagem C. A) = é um operando de atribuição, e == é um operando relacional que avalia se duas variáveis são iguais. B) Não existe diferença, os dois operandos são de atribuição. C) Não existe diferença, os dois operandos são relacionais, utilizados para avaliar se dois valores são iguais. D) == é um operando de atribuição, e = é um operando relacional que avalia se duas variáveis são iguais. E) Esses operandos não existem na linguagem C. 5) Qual é a função dos operadores ++ e -- na linguagem C, respectivamente? A) São operadores de incremento e decremento. B) É o operador de soma e de subtração, respectivamente. C) É o operador de decremento e de incremento, respectivamente. D) Esses operadores não existem em C. E) São operadores de multiplicação e de divisão, escritos de forma diferente. NA PRÁTICA Fernando foi contratado para desenvolver um programa para auxiliar o RH de uma empresa do segmento de vestuário com o cálculo de descontos e salários para uma folha de contra-cheque. Após analisar a solicitação da empresa, Fernando concluiu que poderia utilizar operadores em programação C para resolver o problema. Conteúdo interativo disponível na plataforma de ensino! Com o programa desenvolvido por Fernando, a empresa conseguiu fazer a análise da folha de pagamento dos funcionários de forma satisfatória. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Operadores aritméticos e relacionais No vídeo, você vai ver o uso de operadores para desenvolver um programa no qual são usados operadores aritméticos e relacionais. Conteúdo interativo disponível na plataforma de ensino! Operadores lógicos e relacionais No vídeo, você vai conhecer mais sobre operadores lógicos e relacionais. Conteúdo interativo disponível na plataforma de ensino! Programação em C O que é o incremento de uma variável e para que ele serve? O vídeo vai mostrar o uso dos operadores de incremento e de decremento em C. Conteúdo interativo disponível na plataforma de ensino! Estruturas de Seleção APRESENTAÇÃO Em programação, podemos construir programas sequenciais, ou seja, que possuem somente um fluxo de execução. No entanto, há casos em que isso não é o suficiente para resolver um determinado problema. Uma estrutura de seleção é uma ferramenta utilizada para modificarmos o fluxo de execução de um programa. Com esse tipo de estrutura, é possível escolher um grupo de ações a serem executadas de acordo com o valor lógico de alguma expressão lógica e/ou relacional. Nesta Unidade de Aprendizagem, você estudará a construção de um algoritmo, os conceitos básicos envolvidos, os tipos e como funciona a estrutura de seleção. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Usar a estrutura de seleção if-else e switch.• Criar programas que usam a estrutura de seleção simples, composta e encadeada.• Praticar a resolução de problemas computacionais com a estrutura de seleção ternária.• DESAFIO Você foi contratado por uma empresa de desenvolvimento de software, e todos os novos integrantes do time em que você vai trabalhar passarão por um teste, que é uma forma de entrosamento. No teste, você deverá desenvolver o jogo Pedra-Papel-Tesoura junto com um colega. As regras do jogo Pedra-Papel-Tesoura são: Pedra ganha da tesoura (amassando-a ou quebrando-a). Tesoura ganha do papel (cortando-o). Papel ganha da pedra (embrulhando-a). No jogo, o usuário deve enfrentar o computador. Então, vocês precisam desenvolver alguma forma que o computador gere um valor randômico. Vocês tiveram uma ideia: representar cada jogada com números inteiros, usando uma biblioteca do C, que gera números aleatórios: a stdlib. O desafio é desenvolver o jogo e entregá-lo na reunião comemorativa, no primeiro dia de trabalho. INFOGRÁFICO Quando devemos usar uma estruturaencadeada? Existe alguma forma correta de encadear if- elses? Acompanhe, neste Infográfico, dicas de uso dessa estrutura. CONTEÚDO DO LIVRO Todo programa de computador tem um fluxo de execução que pode ser sequencial, ou seja, sem nenhum desvio. Porém, para escrever programas cada vez mais complexos, é preciso que se tenha ferramentas para mudança de fluxo de acordo com algum comportamento do usuário, por exemplo. Uma dessas estruturas é a de seleção, que pode ser simples ou composta, e que pode ser usada de forma simples ou encadeada. Além disso, existe uma ferramenta que proporciona o uso reduzido do conceito da estrutura de seleção. Leia o capítulo Estruturas de seleção, da obra Algoritmos de programação, base teórica para esta Unidade de Aprendizagem, e conheça detalhes dessa estrutura. Boa leitura. ALGORITMOS DE PROGRAMAÇÃO Marcela Santos Estruturas de seleção Introdução Ao final deste texto, você deve apresentar os seguintes aprendizados: � Usar as estruturas de seleção if-else e switch. � Criar programas que usam as estruturas de seleção simples, composta e encadeada. � Resolver problemas computacionais com a estrutura de seleção ternária. Objetivos de aprendizagem Em programação, podemos construir programas sequenciais, ou seja, que possuem somente um fluxo de execução. Todavia, existem casos que isso não é o suficiente para resolver um determinado problema. Uma estrutura de decisão é uma ferramenta utilizada para modificarmos o fluxo de execução de um programa. Com esse tipo de estrutura, é possível escolher um grupo de ações a serem executadas de acordo com o valor lógico de alguma expressão lógica e/ou relacional. Neste capítulo, você estudará a construção de um algoritmo, os con- ceitos básicos envolvidos, os tipos e o funcionamento da estrutura de seleção. As estruturas de seleção if-else e switch Quando criamos um programa de computador, utilizamos a seguinte sequência de operações na grande maioria das vezes: entrada de dados, processamento e saída. Para que essas operações sejam executadas de forma a resolver o problema ou a realizar uma determinada tarefa, é importante que ele siga um fluxo de execução que faça sentido, ou seja, que tenha uma determinada lógica. Quando existe somente um fluxo de execução, ou seja, não há a necessidade de escolha entre dois ou mais caminhos, chamamos a execução de sequencial. Ela segue do início do código-fonte ao final e, toda vez que for executada, terá a mesma ordem de execução das instruções que compõem o código-fonte. Mas existem situações onde é preciso que o programa tenha mais de um fluxo de execução. Imagine que você esteja escrevendo um programa que calcule a média de um aluno e mostre, ao final, a situação dele de acordo com essa média. Para exemplificar, vamos usar as seguintes regras: � Se a média for menor que 5, o aluno está reprovado. � Se a média for maior que 5 e menor que 7, ele estará em recuperação. � Acima de 7, ele será aprovado. Não é possível que o aluno esteja em recuperação, aprovado e reprovado ao mesmo tempo. Então, o programa precisará ter mais de um fluxo de exe- cução, e isso é obtido por meio da utilização de uma estrutura conhecida como estrutura de seleção. Esta permite que decisões sejam tomadas e ações diferentes sejam executadas. Existem dois tipos de estrutura de seleção em C: if-else e switch — cada uma tem sua sintaxe e podem ser utilizadas em situações diferentes. Tomemos como exemplo um programa que, dado um número inteiro, tem como saída um texto mostrando se o número é maior que 0. Observe a Figura 1, a seguir. Figura 1. Uso do if-simples. Estruturas de seleção2 As linhas em destaque (6,7 e 8) mostram o uso da estrutura if. Nesse caso, o programa só vai ter um caminho diferente para seguir: quando o número for maior que zero. Por isso, foi usado somente o if (sem o else) e seu funcio- namento pode ser visto no seguinte fluxograma, representado pela Figura 2. Figura 2. Fluxograma do if-simples. Os testes lógicos são construídos com os operadores relacionais somente, ou pode-se unir expressões relacionais com operadores lógicos. A sintaxe do if segue a seguinte regra, apresentada na Figura 3. Figura 3. Sintaxe do if-simples. 3Estruturas de seleção Usando o mesmo exemplo, imagine agora que o programa deve, ao final da execução, dizer se o número é maior que zero ou se o número digitado é menor ou igual a zero. Diferentemente do primeiro exemplo, esse problema requer o desenvolvimento de dois fluxos de execução. Vamos dar uma olhada no código-fonte que resolve essa questão, na Figura 4. Figura 4. Uso do if-else-composto. Nas linhas em destaque, podemos ver o uso da estrutura if-else. Nesse caso, temos dois caminhos a tomar (por enquanto): escrever o texto referente ao número maior que zero; e, no caso contrário, se o número for menor ou igual a zero. Estruturas de seleção4 A sintaxe e o funcionamento da estrutura if-else podem ser vistos a seguir, nas Figuras 5 e 6. Figura 5. Sintaxe if-else-composta. Figura 6. Fluxograma if-else-composto. 5Estruturas de seleção O nosso segundo tipo de estrutura de seleção é o switch. Para exemplificar, imagine um programa que você digite o mês em formato numérico e ele retorne o mês em forma de texto. Na Figura 7, está representado o código-fonte que realiza essa tarefa. Figura 7. Uso do switch. Estruturas de seleção6 O switch acaba sendo uma alternativa mais simples para o if. Seu uso é bastante simples: quando comparamos uma variável com valores diferentes e temos ações específicas, caso essa variável seja igual a um dos valores comparados. Sua sintaxe segue as seguintes regras: � Você precisa definir qual variável o switch irá avaliar. � Em seguida, você tem uma sequência de casos, onde a variável é com- parada com um valor. � Cada caso é feito usando-se a palavra reservada case, seguida do valor e dois pontos. Um detalhe importante em cada caso é o fato de termos, como última linha, a palavra reservada break, que faz com que somente um caso seja avaliado por vez. Essa palavra quebra a execução do switch e faz com que o fluxo siga para a primeira linha após o switch. O switch é bastante utilizado quando se deseja implementar um menu. Imagine que você esteja desenvolvendo um jogo que tenha níveis. Um possível menu pode ser feito da seguinte forma, conforme Figura 8. Figura 8. Uso do switch, implementando menu. 7Estruturas de seleção Um detalhe importante é o uso do default. Já percebeu para que ele serve? Caso a variável testada não seja igual a nenhum valor presente nos cases, o switch executa as instruções presentes no default. O case só serve quando o teste que queremos fazer é por meio da utilização do operador igual a (==). Se for preciso fazer vários testes, mas com outros operadores, precisamos encadear if-elses, como será visto a seguir. As estruturas de seleção if-else e switch Uma estrutura de seleção simples é aquela formada por um único if. Como vimos anteriormente, o if sozinho é usado quando temos somente um caminho para seguir no fluxo de execução do programa. Já, quando usamos somente um if-else, estamos usando uma estrutura de seleção composta. Ela é usada quando é preciso tomar uma decisão e existe um conjunto de instruções a ser executado, caso o teste seja verdadeiro ou falso. Porém, existem casos onde é preciso mais que dois caminhos a seguir no fluxo de execução do programa. Tomemos como exemplo o programa que diz se um número é maior, menor ou igual a zero. Do jeito que escrevemos o código anteriormente, é impossível saber se o número é 0 ou menor que zero. Precisamos, nesse caso, implementar um programa que tenha 3 caminhos a seguir: � maior que zero; � menor que zero; � igual a zero. Estruturas de seleção8 Nesses casos, utilizamos estrutura de seleção encadeada, ou seja, uma dentro da outra. Segue o código do nosso problema, representado pela Figura9, agora com estrutura de seleção encadeada. Figura 9. Código para exemplificar o uso da estrutura de seleção encadeada. Seguem algumas dicas para a escrita da estrutura de seleção composta: � Quem tem teste lógico é sempre o if, o else nunca testa variável. � Cada if tem o teste lógico e o conjunto de chaves para delimitar o que será executado dentro do if. � Cada else tem seu conjunto de chaves para delimitar o que será exe- cutado dentro do else. � Fica mais fácil se o que estiver dentro do if ou do else for indentado, ou seja, aplicamos um recuo (com o uso da tecla tab), para indicar a hierarquia do código. 9Estruturas de seleção Lembra do exemplo da situação do aluno, lá do início do nosso capítulo? Vamos escrever o código para resolver esse problema. Observe a Figura 10. Figura 10. Código para exemplificar o uso da estrutura de seleção encadeada (situação aluno). A estrutura de seleção ternária O operador ternário é uma maneira que a linguagem C tem de escrever uma estrutura if-else de forma compactada. Como exemplo, vamos escrever um programa que, dados dois números, mostra o maior deles. Vamos implementar esse programa, primeiro somente com if-else e, depois, substituindo um destes pela estrutura ternária. Veja a Figura 11, a seguir. Estruturas de seleção10 Figura 11. Comparação entre estrutura de seleção composta e estrutura de seleção ternária. Do lado esquerdo, temos o código com o uso do if-else interno, para avaliar qual o maior número. Esse if-else pode ser substituído pelas linhas 9 e 10 do código à direita e, especificamente, pela linha 9, onde usamos a estrutura de seleção ternária. A sintaxe da estrutura de seleção ternária é representada em seguida, na Figura 12. Figura 12. Sintaxe da estrutura de seleção ternária. A variável de atribuição vai receber o valor de: � expressão 1, se a condição for verdadeira; � expressão 2, se a condição for falsa. Lembre-se de que a condição pode ser feita por meio do uso de operadores relacionais e/ou lógicos. 11Estruturas de seleção BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http:// en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018. PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 296p. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p. SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson Pioneira, 2003. Leituras recomendadas Estruturas de seleção12 DICA DO PROFESSOR Vamos aprender como usar estruturas de seleção de forma encadeada, desenvolvendo um jogo de adivinhação? No vídeo, você terá orientações sobre essa estrutura de maneira prática e divetida. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O seguinte programa deve receber um número e apresentar um texto indicando se esse número é par ou ímpar. O que deve ser escrito nas linhas 7 e 10 para que a saída seja de acordo com as imagens de saída de execução? Na linha 7: printf("O numero %d eh parn",numero); na linha 10: printf("O numero %d eh A) imparn",numero); B) Na linha 7: printf("O numero %d eh imparn",numero); na linha 10: printf("O numero %d eh parn",numero); C) Na linha 7: printf("O numero eh parn",numero); na linha 10: printf("O numero eh imparn",numero); D) Na linha 7: printf("O numero %d eh parn"); na linha 10: printf("O numero %d eh imparn"); E) Na linha 10: printf("O numero eh parn",numero); na linha 7: printf("O numero eh imparn",numero); 2) Qual a diferença entre uma estrutura de seleção simples e uma composta na linguagem C? A) A estrutura simples é usada em programas simples e a composta em problemas mais complexos. B) Não existe estrutura de seleção simples e composta em C. C) A estrutura simples só tem if, ou seja, só se executa operações se o teste for verdadeiro. Já a estrutura composta tem if-else. D) A estrutura composta só tem if, ou seja, só se executa operações se o teste for verdadeiro. Já a estrutura simples tem if-else. E) Não existe diferença, cabendo ao programador escolher uma entre as duas. 3) A seguir, vemos a sintaxe da estrutura switch: switch (expressao){ case valor1: comandos; comandos; break; case valor2: comandos; comandos; break; case valor3: comandos; comandos; break; default: comandos; comandos; } Sobre ela, é correto afirmar: A) Os valores (valor1, valor2...) podem ser um teste condicional, usando os operadores relacionais. B) O código para o caso default é obrigatório. C) A expressão pode conter qualquer operador: aritmético, lógico ou relacional. D) Somente um dos cases é executado por vez. E) O comando break não é permitido no interior dos grupos de comandos. 4) Como você pode reescrever o código a seguir, usando a estrutura de seleção ternária? Ou seja, se substituirmos as linhas 9 a 14, como deve estar escrita uma nova linha, usando o operador ternário para termos a mesma saída? A) maior=numero1>numero2?numero2:numero1; B) maior=numero2>numero1?numero1:numero2; C) maior=numero1>numero2?numero1:numero2; D) maior=numero1>numero2?numero1::numero2; E) Não é possível realizar esse tipo de operação com o operador ternário. 5) Qual estrutura está representada na imagem a seguir? A) Estrutura de seleção simples. B) Estrutura de seleção composta. C) Estrutura sequencial. D) Não é possível, somente com o diagrama, saber qual é a estrutura. E) Estrutura switch. NA PRÁTICA Priscila é desenvolvedora de sistemas e está trabalhando em um sistema para um posto de combustíveis. O posto tem a seguinte tabela de descontos: Álcool: - Até 25 litros, desconto de 5%. - Acima de 25, desconto de 7,5%. Gasolina: - Até 25 litros, desconto de 7%. - Acima de 25 litros, desconto de 9%. O programa solicitado para Priscila deve ter como entrada de dados: tipo de combustível e valor em litros que o carro foi abastecido. Como saída, o valor a pagar, sabendo que a gasolina é R$ 3,00 e o álcool é R$ 2,00. Como Priscila pode escrever esse programa em código C, usando estruturas de seleção? O código-fonte precisa ser compilado para poder ser executado: Conteúdo interativo disponível na plataforma de ensino! SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Me Salva! Programação em C Assista ao vídeo que mostra como você pode fazer validar seus dados, usando o if. Conteúdo interativo disponível na plataforma de ensino! Estruturas Condicionais 1 - Curso de Algoritmos #07. Para saber mais sobre estruturas condicionais, assista aos vídeos a seguir com exemplos e explicaçães a partir dos conceitos de algoritmos e lógica de programação. Conteúdo interativo disponível na plataforma de ensino! Estruturas Condicionais 2 Veja como criar algoritmos com estruturas condicionais aninhadas e estruturas de múltipla escolha. Conteúdo interativo disponível na plataforma de ensino! Estruturas de Repetição APRESENTAÇÃO Em muitas situações, não basta que tenhamos somente uma estrutura de seleção em um programa de computador ou a forma sequencial de implementação. Em resolução de problemas reais, é comum a necessidade de uso de estrutura de repetição, que seleciona, de certa forma, um trecho de código e faz com que ele seja executado um determinado número de vezes ou quando alguma operação acontecer. Nesta Unidade de Aprendizagem, você estudará a construção de um algoritmo usando praticamente todos os conceitos de programação, com destaque para os tipos de estrutura de repetição existentes. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Reconhecer o funcionamento da estrutura while.• Implementar programas de computador usando o for.• Entender como a estrutura do-while funciona. • DESAFIO Você foi contratado para desenvolver um sistema a ser usado em uma enquete.A empresa que o contratou precisa tabelar os resultados da seguinte enquete, feita a uma grande quantidade de organizações: Qual o melhor sistema operacional para uso em servidores? As possíveis respostas são: 1- Windows Server. 2 - Unix. 3 - Linux. 4 - Netware. 5 - Mac OS. 6 - Outro. O programa deverá ler os valores até ser informado o valor 0, que encerra a entrada dos dados. Não deverão ser aceitos valores além dos válidos para o programa (0 a 6). Após os dados terem sido completamente informados, o programa deverá calcular a percentual de cada um dos concorrentes. Ao final, devem ser mostrados todos os sistemas operacionais com a quantidade de votos e o percentual de cada um. INFOGRÁFICO Quer entender como a estrutura de repetição funciona? No Infográfico, podemos comparar o loop da montanha-russa com todos os passos de uma estrutura de repetição. CONTEÚDO DO LIVRO Em programação, muitas vezes é preciso repetir um trecho de código para conseguir resolver um determinado problema ou realizar uma determinada tarefa. Em C, existem três tipos de estrutura de repetição: while, for e do-while. No capítulo Estruturas de repetição, da obra Algoritmos de programação, que serve de base teórica para esta Unidade de Aprendizagem, você vai saber mais sobre cada um deles. Boa leitura. ALGORÍTMO DE PROGRAMAÇÃO Marcela Santos Estruturas de repetição Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Compreender o funcionamento da estrutura while. � Implementar programas de computador usando o for. � Entender como a estrutura do-while funciona. Introdução Em muitas situações, não basta que tenhamos somente uma estrutura de seleção em um programa de computador, tão pouco somente a forma sequencial de implementação. Em resolução de problemas reais, é comum a necessidade do uso de estrutura de repetição, que seleciona, de certa forma, um trecho de código e faz com que ele seja executo um determinado número de vezes ou quando alguma operação acontecer. Neste capítulo, você estudará a construção de um algoritmo, usando praticamente todos os conceitos de programação, dando destaque aos tipos de estrutura de repetição existentes. A estrutura while Existem algumas situações em programação que precisamos repetir o mesmo trecho de código com valores diferentes para as nossas variáveis. Um programa que calcula a média de uma turma de 40 alunos vai repetir a mesma operação 40 vezes: leitura da matrícula do aluno, leituras das notas, cálculo da média e, por fim, mostrar para o usuário o resultado desse processamento de dados. Da mesma forma que as estruturas de seleção fazem um controle do fluxo de execução, as estruturas de repetição vão mudar o fluxo, repetindo um trecho de código um determinado número de vezes ou quando alguma operação for executada. Podemos pensar a estrutura de repetição como o loop da montanha-russa, onde o carrinho vem em seu fluxo e faz um giro. Em programação, esse loop é conhecido como repetição. O loop pode ficar repetindo um número X de vezes. Esse número pode ser determinado pelo programador ou pode ser um valor digitado pelo usuário. Em todos os casos, esse valor ficará armazenado em uma variável que é co- nhecida como contadora. Um detalhe: você pode dar o nome que quiser para essa variável, mas lembre-se de que é legal o nome da variável ter relação com o significado do que ela armazena. Além disso, o loop também pode ser controlado por algo que o usuário digita ou alguma operação interna a ele. Imagine que o cálculo da média seja digitado até que seja zero para a matrícula do aluno. O loop, então, encerraria como resultado de uma operação. Esse tipo de loop é obtido por meio de um teste condicional com uma variável, que é conhecida como variável de controle. Em C, existem os seguintes loops: while, for e do-while. Vamos começar com o while. Para isso, vamos a um código simples, que mostre os números de 1 a 5, primeiro sem estrutura de repetição. Veja na Figura 1, a seguir. Figura 1. Código simples sem estrutura de repetição. Estruturas de repetição2 Como pode ser visto na Figura 1, repetimos as linha 5 e 6 por 5 vezes, que é a escrita na tela da variável contador. Nesse exemplo, inicializamos a variável contador com 0. Portanto, para que a contagem seja de 1 a 5, é necessário realizar primeiro um incremento de 1 nessa variável para depois exibirmos na tela. Agora, vamos usar a estrutura de repetição while para realizar a mesma tarefa. Veja na Figura 2, a seguir. Figura 2. Estrutura de repetição while. As linhas 5 a 8 mostram o uso da estrutura de repetição while. Sua sintaxe é a demonstrada na Figura 3: Figura 3. Sintaxe da estrutura de repetição while. 3Estruturas de repetição Alguns detalhes: � A condição é uma expressão relacional e/ou lógica com a variável de controle. � A variável de controle deve ser inicializada antes do loop. � A variável de controle precisa ser modificada dentro do loop de repetição. Esses detalhes são importantes, pois, se eles não estiverem presentes no código, o loop pode ou não funcionar ou funcionar de forma errada. Para exemplificar, vamos a dois erros bastante comuns que podem acontecer, ou melhor, acontecem com todos que estão aprendendo a programar. Veja este exemplo, na Figura 4. Figura 4. Exemplo de problema de semântica. Esse programa compila, mas, ao executar, nada acontece — trata-se de um problema de semântica. A linha em destaque é a que inicializa a variável de controle, contador. Ela foi inicializada com o valor 6, e na linha 5 temos a estrutura while. Estruturas de repetição4 No while, é feito um teste condicional, o qual, na primeira rodada, é falso. O fluxo do programa não passa pelo loop (delimitado pelo conjunto de chaves) e vai direto para a linha 9, finalizando o código. Com esse código, deu para perceber que o bloco de operações dentro do while só será executado caso, ou melhor, enquanto o teste condicional for verdadeiro. Por isso, cuidado com o valor inicial de sua variável de controle. Vamos melhorar a sintaxe do while, na Figura 5. Figura 5. Sintaxe do while. Esse é o nosso primeiro problema comum em estrutura de repetição. Vamos ao segundo. Veja o código a seguir, na Figura 6. Figura 6. Exemplo de problema de loop infinito. 5Estruturas de repetição Dessa vez, o código compila, mas tem uma saída diferente: ele fica impri- mindo na tela o valor 0, e isso vai ficar acontecendo para sempre ou, melhor dizendo, infinitas vezes. Esse problema é conhecido como loop infinito e acontece porque não houve modificação do valor da variável de controle dentro do loop, ou seja, o teste condicional vai dar sempre verdadeiro e a linha 6 vai ser executada para sempre. Então, duas dicas valiosas, ao escrever uma estrutura de repetição no seu programa, são: � inicializar a variável de controle de forma conveniente. � ter uma linha dentro do loop, que realiza a modificação do valor da variável de controle. Outro detalhe do uso do while é quando não tivermos a quantidade de vezes que a repetição irá acontecer. Veja o seguinte código da Figura 7. Figura 7. Exemplo uso do while — não há quantidade de vezes da repetição. Ele soma todos os valores que são digitados. Não temos como saber quantas vezes a pessoa vai digitar um valor válido, mas sabemos que o loop irá parar quando o valor digitado, que será armazenado na variável número, for zero, pois o teste condicional é a expressão numero!=0, ou seja, o código irá repetir enquanto o número for diferente de zero. Estruturas de repetição6 Outro detalhe para esse código é o uso da variável soma. Esse tipo de uso é o que chamamos de variável, que vai acumulando os valores, bastante útil em programação, como, por exemplo, para calcularmos média de valores. É como se a variável soma fosse uma grande caixa que, na primeira vez que passa pelo código, contém valor 0; depois, todos os númerosque são colocados lá dentro são somados com o valor que já existia. Veja a Figura 8, a seguir. Figura 8. Exemplo de variável soma. 45 1 0 9 0 soma soma soma soma Cada passagem pelo loop 45 55 64 Então, o superpoder do while é que podemos usá-lo quando não sabemos a quantidade de vezes que o laço vai acontecer — e não se esqueça: o teste condicional do while é feito logo do início da sua execução. Vamos agora para o segundo tipo de estrutura de repetição: o for. A estrutura de repetição for A estrutura de repetição for também nos auxilia quando precisamos repetir um trecho de código. Sua principal diferença, quando comparada com o while e o do-while — que veremos a seguir —, é que só pode ser usado quando se sabe a quantidade de vezes que o loop vai acontecer. 7Estruturas de repetição Vamos avaliar o seguinte código da Figura 9. Figura 9. Exemplo de código com estrutura de repetição for. Esse código também acumula, somando todos os valores que são digitados pelo usuário. A diferença está no uso da estrutura de repetição for. Para que ela seja usada, precisamos definir quantas vezes a repetição irá acontecer — nesse caso, isso é definido com a variável count. A sintaxe da estrutura de repetição for é a seguinte: Figura 10. Sintaxe do for. O primeiro valor dentro dos parênteses é a variável de controle — nesse caso, declarada, dentro do próprio for, uma prática bastante comum em lin- guagem C. O segundo termo é o teste condicional, que pode ser traduzido para o seguinte: enquanto o teste for verdadeiro, o loop continua; enquanto a variável i for menor que a variável count e o último termo, e como a variável i vai ser modificada, ou seja, a instrução que muda o valor da variável de controle, nesse caso, o i será incrementado de um em um. Estruturas de repetição8 Os seguintes detalhes devem ser observados: � A variável de controle não precisa ser declarada no for, mas deve levar ao seguinte: quando acabar o loop, a variável deixa de existir. � O teste condicional pode ser feito usando-se qualquer operador lógico e/ou relacional. � O último termo, também chamado de passo do loop, pode ser de in- cremento, de decremento e do tamanho que for conveniente para o programa. � O for é delimitado por um conjunto de chaves, assim como o while. � O loop fica executando enquanto o teste condicional for verdadeiro, ou seja, ao chegar na última linha , o fluxo de execução volta para o teste e verifica se ele é verdadeiro ou falso. Podemos ver o funcionamento do loop for com o seguinte fluxograma, representado na Figura 11: Figura 11. Fluxograma com loop for. 9Estruturas de repetição Vamos a mais um exemplo, veja o seguinte código, na Figura 12. Figura 12. Código com loop for. Muito parecido com o anterior, exceto pelo valor de count ser pedido ao usuário e não atribuído dentro do código. O programa continua sabendo quantas vezes o loop vai acontecer, só que agora foi o usuário do programa que definiu. Em ambos os casos, podemos usar o for, pois sabemos esse limite. E o while? Pode ser usado nesses casos também? A resposta é sim, o while é multiuso nesse aspecto. Vamos finalizar nossas estruturas de repetição com o último tipo: o do-while. A estrutura de repetição do-while Para finalizar, vamos à terceira estrutura de repetição: do-while. Como vimos anteriormente, existe uma diferença no uso de while e for, mas ambos têm algo em comum: o teste condicional é feito no início da estrutura. O do-while é uma estrutura de repetição onde o teste condicional é feito no fim, ou seja, o bloco de operações será executado pelo menos uma vez, independentemente do valor lógico do teste condicional. Estruturas de repetição10 Vamos refazer o exemplo do acumulador de valores, agora usando o do- -while. Observe a Figura 13. Figura 13. Exemplo de acumulador de valores com do-while. O do-while também funciona quando não sabemos quantas vezes a repetição vai acontecer, assim como o while. Um detalhe importante é que o bloco de código que está dentro da estrutura de repetição será executado pelo menos uma vez, visto que o teste condicional é feito somente no fim. Também é preciso tomar os mesmos cuidados quanto ao loop infinito, ou seja, para que o loop aconteça de forma conveniente à resolução de um deter- minando, é preciso que a variável de controle seja modificada dentro do loop. A sintaxe de do-while pode ser vista na Figura 14. Figura 14. Sintaxe de do-while. 11Estruturas de repetição Para finalizarmos, observe o Quadro 1, com uma comparativa entre as 3 estruturas de repetição existentes na linguagem C. Nome da estrutura Teste condicional é feito no início ou no fim do loop? Necessidade de se saber quantas vezes o loop vai acontecer? While Início Não For Início Sim Do-while Fim Não Quadro 1. Síntese das três estruturas de repetição da linguagem C. Ao se escolher qual estrutura usar, precisa-se analisar o problema e como se deseja resolvê-lo computacionalmente. A prática vai de ajudar sempre nessa escolha. Portanto, programe sempre. BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http:// en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev 2018. MIZRAHI, V. V. Treinamento em Linguagem C: curso completo em um volume. 2. ed. São Paulo: Pearson, 2008. PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p. SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson Pioneira, 2003. Leituras recomendadas Estruturas de repetição12 DICA DO PROFESSOR O que é uma estrutura de repetição e como ela funciona? Acompanhe o vídeo e tenha orientações sobre esses conceitos e o modo como a linguagem C trata essas questões. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O seguinte programa pede para o usuário um número e mostra a tabuada de multiplicação desse número. Foram retiradas as linhas 6 e 10 dessa estrutura, e agora você precisa adicioná-las para um correto funcionamento desse código. O que deve ser digitado nas linhas 6 e 10? A) na linha 6: contador=1; na linha 10: contador=contador*1; B) na linha 6: contador=0; na linha 10: contador=contador+1; C) na linha 6: contador=1; na linha 10: contador=contador+1; D) na linha 6: contador=1; na linha 10: contador=contador-1; E) na linha 6: contador=10; na linha 10: contador=contador+1; Como podemos reescrever o seguinte trecho de código, utilizando como estrutura de repetição o for? #include <stdio.h> int main(){ int qtd,contador; float valor,soma; soma=0; contador=1; printf(" Lista de Compras n"); while(contador<6) { printf("Digite a qtd: "); scanf("%d",&qtd); printf("Digite o valor por unidade: "); scanf("%f",&valor); valor=valor*qtd; soma=soma+valor; 2) contador=contador+1; } printf("Valor total da compra: R$ %.2fn",soma); return 0; } A) B) C) D) E) Esse tipo de programa não pode ser implementado usando-se o for. 3) Em que ocasião ocorre um loop infinito? A) Quando a estrutura de repetição fica executando para sempre. B) Quando o programa precisa de todo o poder de processamento do computador, algumas vezes chegando até a desligá-lo. C) Quando a estrutura de repetição não consegue resolver o problema de forma correta, por este ser muito complexo. D) Quando a variável de controle do loop não é inicializada. E) Quando a repetição nunca é executada . 4) Qual a diferença entre a estrutura while e a do-while? A) Na estrutura de repetição while, o teste condicional é feito no fim do loop; já na estrutura do-while, o teste é feito no início. B) Na estrutura de repetição while, não é preciso modificar o valor da variável de controle; já na estrutura do-while, essa modificação é obrigatória. C) Na estrutura de repetição while, o teste condicional é feito no início do loop; já na estruturado-while, o teste é feito no fim. D) A while só pode ser usada quando se sabe quantas vezes o loop será executado; já na do- while esse dado não é obrigatório. E) Não existe diferença alguma entre as duas estruturas. 5) Em que ocasião podemos substituir a while pela for? A) Somente quando se sabe quantas vezes a estrutura de repetição será executada. B) Sempre é possível substituir uma estrutura while por uma for. C) Nunca podemos substituir uma estrutura while por uma for. D) Somente quando a while estiver efetuando operações aritméticas. E) Somente quando não for preciso inicializar a variável de controle. NA PRÁTICA Marcela está, junto com seu time de desenvolvedores, analisando o código de um programa que realiza uma tarefa. Considera-se a população de duas cidades, A e B, sendo que A tem menos habitantes que B. O usuário entra com a taxa de crescimento de cada uma delas, e o programa precisa calcular em quantos anos a população que começou com menos habitantes irá ultrapassar a da outra cidade. Durante a análise, ela se deparou com um loop infinito. Aponte onde está o erro e como consertá-lo. Confira o que fez Marcela. Conteúdo interativo disponível na plataforma de ensino! O código-fonte precisa ser compilado para poder ser executado: gcc napraticauaer.c SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Programação em C - PLC0 Assista ao vídeo Me Salva! Programação em C - PLC07 - Comando 'for', para aprender um pouco mais sobre a estrutura de repetição for Conteúdo interativo disponível na plataforma de ensino! Unplugged - For Loop Fun - Lesson in Action Assista ao vídeo Unplugged - For Loop Fun - Lesson in Action, para entender como um loop funciona de forma unplugged, ou seja, sem usar computação. Conteúdo interativo disponível na plataforma de ensino! Estruturas de Repetição 1 - Curso de Algoritmos #09 A estrutura de repetição ENQUANTO vai permitir que você execute blocos de comandos várias vezes e simplificar a forma de representar lógicas que vão construir programas. Conteúdo interativo disponível na plataforma de ensino! Estruturas de Repetição 2 - Curso de Algoritmos #10 A estrutura Repita..Ate é uma estrutura de repetição com teste lógico no final, o que permite que você execute o bloco interno pelo menos uma vez, independente do resultado do teste. Conteúdo interativo disponível na plataforma de ensino! Estruturas de Repetição 3 - Curso de Algoritmos #11 A estrutura Para.. Faça é uma estrutura de repetição com variável de controle, o que permite que você execute o bloco interno uma quantidade determinada de vezes. Conteúdo interativo disponível na plataforma de ensino! Hour of Code - Mark Zuckerburg teaches Repeat Loops Assista ao vídeo Hour of Code - Mark Zuckerburg teaches Repeat Loops, no qual o fundador do Facebook explica como funciona o loop. Conteúdo interativo disponível na plataforma de ensino! Estrutura de Dados Homogêneas do Tipo Matriz APRESENTAÇÃO O uso de dispositivos computacionais cresceu de forma exponencial nos últimos anos. É por isso que, a cada dia, o mercado de trabalho está apresentando melhores oportunidades para os programadores. Contudo, é preciso estar atento porque, como em qualquer outro ramo de atividade, os melhores profissionais ganham destaque! Para que você seja um destes profissionais destacados, é fundamental conhecer as estruturas de dados que podem ser utilizadas na linguagem de programação com a qual você estiver trabalhando. Nesta Unidade de Aprendizagem, você vai aprender a diferenciar o conceito de variáveis simples, vetores e matrizes, além de aprender a manipular matrizes (inserir e consultar dados). Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Diferenciar o conceito de variáveis simples, vetores e matrizes.• Descrever o conceito de matrizes com duas dimensões, elementos com tipos de dados iguais, uso de dois índices (linha x coluna). Apresentar formas de acesso aos elementos, com a indicação dos dois índices (tanto para escrita de um elemento quanto para recuperação do seu valor). • Descrever a necessidade de utilização de dois laços de repetição (em geral do tipo para...faça) para se percorrer uma matriz, seja para inicializar, ler ou escrever seus elementos. • DESAFIO Quando você utilizar matrizes para resolver um problema, você precisará utilizar dois laços de repetição. Isso acontece porque o primeiro laço será utilizado para percorrer linhas, e o segundo laço será utilizado para percorrer colunas. Assim, se você quiser inserir um valor na matriz, precisará informar a linha e a coluna onde deseja inserir. Por exemplo, se quiser inserir o valor a na linha 2 e na coluna 3, você fará da seguinte forma: matriz[2,3] = a. Utilizando laços de repetição, você consegue inserir dados em todos os campos da matriz, da seguinte forma: para linha de 1 ate 10 passo 1 faca para coluna de 1 ate 10 passo 1 faca matriz[linha,coluna]=a fimpara fimpara Foi solicitado à sua equipe programar um jogo de damas. Para você, coube fazer a estrutura de dados do tabuleiro. Considere: 1. O tabuleiro de damas é formado por casas: você pode considerar que cada posição da matriz representa uma casa. 2. O tabuleiro de damas possui 8 colunas e 8 linhas. 3. O jogo de damas possuirá dois jogadores, assim você precisa definir: informação que indica casa vazia, informação que indica as peças do jogador das peças brancas, informação que indica as peças do jogador de peças pretas, bem como a informação que permitirá identificar as damas de cada um dos jogadores. 4. Você precisa inicializar o tabuleiro, colocando as informações: das casas vazias e das peças iniciais de cada jogador. 5. Você precisa mostrar esse tabuleiro. Bom trabalho! INFOGRÁFICO Veja agora um infográfico que sintetiza os conteúdos que você está estudando. Neste material estão contidas as definições e uma diferenciação entre variáveis simples, vetores e matrizes. Confira! CONTEÚDO DO LIVRO Faça a leitura do livro Algoritmos e Programação para aprender mais sobre a declaração e inicialização de variáveis, vetores e matrizes, e também para estudar a diferença entre cada um deles e a forma de utilização. Inicie seu estudo no capítulo 7.1 matrizes. Boa leitura! 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programaçãopara alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 170 Algoritmos e Programação com Exemplos em Pascal e C 6.3.2 operações sobre mais de um vetor Os trechos de código a seguir utilizam três vetores inteiros de 10 elementos chamados respec- tivamente de original, pares e ímpares. Constante: MAXI = 50 Variáveis: original, pares, ímpares (arranjo [1..MAXI] de inteiro) O vetor original é preenchido por leitura e, a partir dele, devem ser gerados os vetores pa- res e ímpares, com os valores pares e ímpares do vetor original. Os valores fornecidos no vetor original poderão ser pares e ímpares, só pares ou só ímpares. Então, os vetores pares e ímpares poderão terminar preenchidos com 0 a 10 elementos. 1 2 3 4 5 valor 5 8 -2 1 10 1 2 3 4 5 5 8 -2 1 1 Vetor original Passo 1 1 2 3 4 5 5 8 -2 -2 1 Passo 2 etc. … figura 6.3 Deslocamento de valores do vetor. Capítulo 6 Variáveis Estruturadas: Arranjos Unidimensionais 171 A seguir, temos os trechos que executam essas operações, finalizando com a escrita do vetor de pares, que é semelhante à escrita do vetor de ímpares. a preenchimento do vetor original por leitura: para i de 1 incr 1 até MAXI faça início escrever('Valor inteiro: ', i, ' = ') ler(original[i]) fim b preenchimento dos vetores pares e ímpares. Para acesso aos elementos desses vetores, são utilizadas como índices duas variáveis inteiras: i_par e i_ímpar, para os vetores pares e ímpares respectivamente. Essas variáveis indicam, sempre, a última posição ocupada no vetor correspondente e são inicializadas com zero, pois inicialmente esses dois vetores estão vazios: i_par ← 0 i_ímpar ← 0 para i de 1 incr 1 até MAXI faça se original[i] mod 2 = 0 então início i_par ← i_par + 1 pares[i_par] ← original[i] fim senão início i_ímpar ← i_ímpar + 1 ímpares[i_ímpar] ← original[i] fim c apresentação dos valores contidos no vetor pares, lembrando que a última posição ocu- pada é indicada pelo índice i_par: se i_par > 0 então para i de 1 incr 1 até i_par faça escrever(pares[i]) senão escrever ('Nenhum valor par encontrado') Conforme pode ser observado, nesse problema os vetores pares e ímpares são preenchidos a partir do início, mas não obrigatoriamente de forma total, e não são inicializados. Para percorrê-los, os valores finais dos índices usados para gerá-los são utilizados como limite, o que garante que somente as posições efetivamente ocupadas são acessadas. observações complementares. Em alguns problemas, ao serem preenchidos os vetores, a posição do dado no vetor também é informação. Isso acontece, por exemplo, no exercício que contabiliza a frequência absoluta de número de pontos obtidos por 500 candidatos a um concurso (Exercício 6.4 dos exercícios de fixação), em que o iésimo elemento do vetor freq indica quantos candidatos obtiveram i pontos no concurso. Nesse caso, alterar a posição do dado no vetor, sem maiores cuidados, provocará perda de informação. 172 Algoritmos e Programação com Exemplos em Pascal e C Uma solução para evitar a perda dessa informação, no caso de ocorrerem trocas de posição dos elementos, é criar um vetor adicional que contenha, inicialmente, em cada posição, o valor do índice correspondente. Assim, ao realizar, por exemplo, uma reordenação dos dados no vetor freq, sempre que um par de dados tiver que trocar de posição, as posições corres- pondentes do vetor adicional com os índices serão trocadas da mesma forma. 6.3.3 pesquisa e classificação de vetores Duas operações sobre dados são frequentemente utilizadas na solução de problemas: pes- quisa e classificação de vetores. A pesquisa envolve examinar um conjunto de dados procurando determinar a presença (ou ausência) de um ou mais valores no mesmo e, se presentes, sua localização. A classificação ou ordenação envolve rearranjar um conjunto de dados segundo alguma ordem predeterminada. Boas soluções para essas duas operações se tornam importantes à medida que aumenta o vo- lume dos dados a processar. Inúmeras estratégias para pesquisa e classificação de dados foram desenvolvidas (Knuth, 1997; Saraiva; Azeredo, 2008). Conforme o número de dados envolvidos, algumas estratégias podem ser extremamente interessantes ou totalmente catastróficas, seja sob o ponto de vista de exigência de recursos de armazenamento seja de tempo de execução. Nos exercícios de fixação a seguir, são apresentados, a título de ilustração, dois métodos de pesquisa e dois de classificação. Outros métodos para essas tarefas são apresentados em outras seções deste livro. 6.4 exercícios de fixação exercício 6.1 Preencher por leitura um vetor com valores reais que representam tempera- turas. Determinar qual a menor temperatura. Escrever todo o conteúdo do vetor e a menor temperatura encontrada. Algoritmo MenorTempComVet {DETERMINA MENOR TEMPERATURA. USA UM VETOR} Constante: MAXTEMP = 200 Entradas: vetor (arranjo [1..MAXTEMP] de real){TEMPERATURAS} Saídas: {VETOR DE TEMPERATURAS} menor (real) {MENOR TEMPERATURA} Variável auxiliar: j (inteiro) início para j de 1 incr 1 até MAXTEMP faça ler (vetor[j] {PREENCHE VETOR POR LEITURA} menor ← vetor[1] {INICIALIZA MENOR COM PRIMEIRO ELEM. DO VETOR} para j de 2 incr 1 até MAXTEMP faça se vetor[j] < menor {PERCORRE VETOR COMPARANDO COM MENOR} então menor ← vetor[j] {TROCA CONTEÚDO DE MENOR SE NECESSÁRIO} Capítulo 6 Variáveis Estruturadas: Arranjos Unidimensionais 173 escrever('Vetor lido') para j de 1 incr 1 até MAXTEMP faça escrever(vetor[j]) {ESCREVE CONTEÚDO DO VETOR} escrever('Menor temperatura = ',menor) {ESCREVE MENOR TEMPERATURA} fim exercício 6.2 Preencher um vetor com valores inteiros por leitura. Gerar, a partir dele, um novo vetor apenas com os valores múltiplos de cinco contidos no vetor original. O novo vetor gerado deve ser preenchido de modo contínuo, ou seja, a partir do início, posição após posi- ção. Apresentar o novo vetor gerado ou, se for o caso, uma mensagem informando que não existem valores com essa característica no vetor original. Algoritmo GeraVetMult5 {LE UM VETOR – GERA E APRESENTA OUTRO, SÓ COM OS VALORES MÚLTIPLOS DE 5} Constante: MAX = 50 Entradas: orig (arranjo [1..MAX] de inteiro) {VALORES ORIGINAIS} Saídas: mult5 (arranjo [1..MAX] de inteiro) {MÚLTIPLOS DE 5} Variáveis auxiliares: k (inteiro) {ÍNDICE PARA PERCORRER VETOR ORIG} contmult5 (inteiro) {ÍNDICE E CONTADOR DOS MÚLTIPLOS DE 5} início para k de 1 incr 1 até MAX faça ler (orig[k]) {PREENCHE ORIG POR LEITURA} contmult5 ← 0 {INICIALIZA CONTADOR DE MÚLTIPLOS DE 5 EM ZERO} para k de 1 incr 1 até MAX faça {PERCORRE ORIG DO INÍCIO AO FINAL} se orig[k] mod 5 = 0 {TESTA SE VALOR CONTIDO EM ORIG É MÚLTIPLO DE 5} então início contmult5 ← contmult5 + 1 {INCREMENTA CONTADOR DE MÚLTIPLOS DE 5} mult5[contmult5] ← orig[k] {COPIA VALOR PARA VETOR MULT5} fim se contmult5 = 0 {TESTA SE ENCONTROU ALGUM VALOR MÚLTIPLO DE 5} então escrever('Não há valores múltiplos de 5!') senão início {ESCREVE VALORES MÚLTIPLOS DE 5} escrever('Valores múltiplos de 5:') para k de 1 incr 1 até contmult5 faça escrever(mult5[k]) fim fim exercício 6.3 Operações sobre conjuntos podem ser implementadas com o uso de vetores. A seguir é apresentada a criação do vetor intersecção vet_inters a partir dos valores de dois vetores inteiros de entrada, vet1 e vet2. Somente os valores que existam tanto em vet1 quanto em vet2 devem ser transferidos para vet_inters. 174 Algoritmos e Programação com Exemplosem Pascal e C Supõe-se que vet1 não tenha valores duplicados, o mesmo acontecendo com vet2, mas que entre eles possa haver valores iguais. A estratégia de criação do vetor intersecção é selecionar, um após outro, os valores de vet1 e, para cada valor, compará-lo com todos os valores de vet2, até que um valor igual seja encontrado ou que vet2 não tenha mais valores a serem examinados. O índice utilizado no vetor intersecção só é incrementado quando um novo valor é acrescentado a esse vetor. Dessa forma, ao concluir-se a tentativa de geração do vetor intersecção, pode-se saber se o vetor intersecção está vazio e, se ele não estiver, quantos elementos ele contém. Na apresentação dos valores do vetor intersecção, só as posições efetivamente ocupadas são acessadas. Algoritmo GeraVetIntersc {LÊ DOIS VETORES E GERA O VETOR INTERSECÇÃO. APRESENTA O VETOR GERADO OU UMA MENSAGEM CASO O VETOR INTERSECÇÃO SEJA VAZIO} Constante: MAX = 50 Entradas: vet1, vet2 (arranjo [1..MAX] de inteiro) {VETORES DE ENTRADA} Saídas: vet_inters (arranjo [1..MAX] de inteiro) {VETOR INTERSECÇÃO} Variáveis auxiliares: i, j (inteiro) {ÍNDICES DOS VETORES VET1 E VET2} k (inteiro) {ÍNDICE DO VETOR VET_INTERS} igual (lógica) início {LEITURA DOS DOIS VETORES DE ENTRADA} para i de 1 incr 1 até MAX faça ler (vet1[i]) para i de 1 incr 1 até MAX faça ler (vet2[i]) {GERAÇÃO DO VETOR INTERSECÇÃO} k ← 0 {INICIALIZA – ÍNDICE PARA VETOR VAZIO} para i de 1 incr 1 até MAX faça {I PERCORRE VET1} início j ← 1 {J VAI PERCORRER VET2} igual ← falso {INICIALIZA VARIÁVEL LÓGICA} repita se vet1[i] = vet2[j] então igual ← verdadeiro {ACHOU ELEM. IGUAL EM VET1 E VET2} j ← j + 1 {AVANÇA PARA PRÓXIMO ELEMENTO EM VET2} até (igual = verdadeiro) ou (j > MAX) se igual = verdadeiro então início k ← k + 1 {INCREMENTA ÍNDICE DE VET_INTERS} vet_inters[k] ← vet1[i] {COPIA ELEMENTO PARA VET_INTERS} fim Capítulo 6 Variáveis Estruturadas: Arranjos Unidimensionais 175 fim {PARA-FAÇA} {APRESENTAÇÃO DO RESULTADO: VETOR INTERSECÇÃO OU MENSAGEM} se k >0 então início escrever('Conjunto intersecção') para i de 1 incr 1 até k faça escrever(vet_inters[i]) fim senão escrever('Não há conjunto intersecção') fim exercício 6.4 Contabilizar a frequência absoluta de número de pontos obtidos na prova por 500 candidatos a um concurso. A quantidade de pontos varia de 0 a 120. Na solução apresentada, o número de pontos é usado como índice para acesso ao vetor freq onde são realizadas as contagens. Dessa forma, o índice da posição onde o dado está arma- zenado faz parte da informação. Notar que, como os índices de arranjos na pseudolinguagem iniciam em 1, o vetor de frequências terá tamanho igual ao valor máximo de pontos mais um, e o número de pontos dos candidatos será acrescido de um após a leitura, para servir de índice ao vetor freq. Algoritmo FreqCandConcurs {CONTABILIZA A FREQUÊNCIA ABSOLUTA DOS PONTOS DOS CANDIDATOS A UM CONCURSO} Constantes: MAXCAND = 500 {NÚMERO MÁXIMO DE CANDIDATOS} MAXPONTOS = 120 {LIMITE SUPERIOR DE PONTOS} Entradas: pontos (inteiro) {QUANTIDADE DE PONTOS OBTIDOS POR UM CANDIDATO} Saídas: freq (arranjo [1..MAXPONTOS + 1] de inteiro) {FREQUÊNCIA ABSOLUTA DOS PONTOS} Variáveis auxiliares: i (inteiro) {CONTADOR DE CANDIDATOS} k (inteiro) {ÍNDICE DO VETOR FREQ} início para i de 1 incr 1 até (MAXPONTOS + 1) faça freq(i) = 0; {INICIALIZA COM ZEROS VETOR FREQ} para i de 1 incr 1 até MAXCAND faça {PARA CADA CANDIDATO} início repita ler (pontos) {LÊ PONTOS DO CANDIDATO} se pontos<0 ou pontos>MAXPONTOS {TESTA VALIDADE DE PONTOS} então escrever ('pontos inválidos') {IGNORA OS INVÁLIDOS} até pontos≥0 e pontos≤MAXPONTOS {ATÉ VALOR DE PONTOS VÁLIDO} freq[pontos + 1] ← freq[pontos + 1] + 1 {INCREMENTA FREQ} fim 176 Algoritmos e Programação com Exemplos em Pascal e C escrever ('Frequência absoluta de pontos') para k de 1 incr 1 até MAXPONTOS + 1 escrever (k – 1, freq[k]) fim exercício 6.5 Ler o número de identificação e o escore de 30 atletas (com verificação de correção dos dados) e apresentar os dados dos atletas com escore igual ou superior à média. Neste problema, os vetores usados para armazenar os números de identificação e os escores dos atletas têm correspondência de posição, conforme mostrado na Figura 6.4. Os dados do primeiro atleta serão armazenados na posição 1 de cada um dos dois vetores, os dados do segundo atleta na posição 2 de cada um dos dois vetores, etc. Algoritmo AtletasEscore {APRESENTA DADOS DE ATLETAS COM ESCORE IGUAL OU SUPERIOR À MÉDIA} Constantes: MAXATLETAS = 30 {NÚMERO MÁXIMO DE ATLETAS} MAXESCORE = 100 {NÚMERO MÁXIMO DE ESCORES} Entradas: número, escore (arranjo [1..MAXATLETAS] de inteiro) Saídas: {número, escore} {DADOS DE ALGUNS ATLETAS} Variáveis auxiliares: i (inteiro) {VALORES DOS ÍNDICES DOS VETORES} somatório (inteiro) {FAZ SOMATÓRIO DOS ESCORES} média (real) {MÉDIA DOS ESCORES} início somatório ← 0 {INICIALIZA SOMATÓRIO DE ESCORES EM ZERO} para i de 1 incr 1 até MAXATLETAS faça {PARA CADA ATLETA} início repita ler (número[i]) {LEITURA DO NÚMERO DO ATLETA} se número[i] < 1 ou número[i] > MAXATLETAS {TESTA VALIDADE LEITURA} então escrever ('número inválido') até número[i] > 0 e número[i] ≤ MAXATLETAS repita ler (escore[i]) {LEITURA DO ESCORE DO ATLETA} se escore[i] < 0 ou escore[i] > MAXESCORE {TESTA VALIDADE ESCORE} então escrever ('escore inválido') até escore[i] ≥ 0 e escore[i] ≤ MAXESCORE somatório ← somatório + escore[i] {ACUMULA ESCORE LIDO} fim média ← somatório / MAXATLETAS {FAZ A MÉDIA DOS ESCORES} escrever ('Atletas com escore ≥ média') para i de 1 incr 1 até MAXATLETAS faça {PARA CADA ATLETA} Capítulo 6 Variáveis Estruturadas: Arranjos Unidimensionais 177 se escore[i] ≥ média {TESTA SE ESCORE É ≥ QUE MÉDIA} então escrever (número[i], escore[i]) {INFORMA DADOS ATLETA} fim 1 2 3 4 5 6 7número 1 2 3 4 5 6 7 30 ... 30 1 2 3 4 5 6 7escore 99 87 70 98 100 79 95 88 ... 30 D a d o s d o a lu n o d e có d ig o 1 D a d o s d o a lu n o d e có d ig o 5 figura 6.4 Vetores com dados de atletas: número de identificação e escore. DICA DO PROFESSOR O vídeo a seguir aborda a diferença de vetores, matrizes e variáveis simples. Além disso, dá a você o acesso a algumas dicas que facilitarão seu trabalho com matrizes. Assista! Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Qual a principal diferença entre variáveis, vetores e matrizes? A) Variáveis e vetores armazenam um único valor; matriz, por ser bidimensional, permite armazenar mais de um valor. B) Variáveis e vetores, por serem unidimensionais, armazenam um único tipo de dados. Matrizes, por serem bidimensionais, podem armazenar mais de um tipo de dados, desde que separados por linhas diferentes. C) Matrizes necessitam de um laço de repetição para a manutenção dos valores. Nas variáveis, isso não é necessário. D) Vetores necessitam de dois laços de repetição para a manutenção dos valores; nas variáveis, apenas um é necessário. E) Variáveis armazenamapenas um valor; vetores e matrizes armazenam mais de um valor simultaneamente, sendo em vetores lado a lado e em matrizes, separado por linha e coluna. 2) Qual alternativa apresenta a sintaxe correta da declaração de uma matriz de strings? A) matriz: vetor [ ][ ] de string B) matriz: conjunto [0..7][0..7] de string C) matriz: vetor [0..7,0..7] de caracter D) matriz: vetor [7, 7] de caracter E) dados: matriz [0..7,0..7] de string 3) Qual alternativa descreve corretamente o processo de atribuição de valores para todos os elementos de uma matriz com 5 linhas e 7 colunas? A) para a de 1 ate 5 passo 1 faca para b de 1 ate 7 passo 1 faca matriz[a,b] <- x fimpara fimpara para a de 0 ate 5 passo 1 faca para b de 0 ate 7 passo 1 faca B) matriz[a,b] <- x fimpara fimpara C) para a de 0 ate 35 passo 1 faca matriz[a] <- x fimpara fimpara para a de 1 ate 7 passo 1 faca para b de 1 ate 5 passo 1 faca matriz[a,b] <- x fimpara D) fimpara E) para a ate 5 passo 1 faca para b ate 7 passo 1 faca matriz[a,b] <- x fimpara fimpara 4) Qual alternativa NÃO é uma afirmação verdadeira sobre as estruturas de dados homogêneas? A) Matrizes também são chamadas de "arrays bidimensionais". B) Ao adicionar um valor para uma variável, este valor está sendo salvo temporariamente no banco de dados. C) Para efetuar a leitura de um valor que está salvo em uma matriz, é necessário referenciar os índices de linha e coluna, por exemplo, matriz[2,2]. D) Para ler todos os valores contidos em uma matriz, é necessário utilizar dois laços PARA e, em cada execução, verificar um índice da matriz. E) Um exemplo de utilização de matrizes em software são os jogos de tabuleiro. 5) Para fins de apresentação de resultados, é necessário programar para que seja "quebrada" uma linha em um determinado momento da leitura de uma matriz, para que ela seja apresentada com as dimensões corretas. Dada uma matriz de 8x8, qual alternativa apresenta o código correto para exibição dos resultados com a quebra de linha ao final de cada linha da matriz? A) para linha de 0 ate 7 passo 1 faca para coluna de 0 ate 7 passo 1 faca escreva(tabuleiro[linha,coluna]," ") fimpara escreval(" ") fimpara B) para linha de 0 ate 7 passo 1 faca escreval(" ") para coluna de 0 ate 7 passo 1 faca escreva(tabuleiro[linha,coluna]," ") fimpara fimpara para linha de 0 ate 7 passo 1 faca para coluna de 0 ate 7 passo 1 faca escreva(tabuleiro[linha,coluna]," ") fimpara C) fimpara D) para linha de 0 ate 7 passo 1 faca para coluna de 0 ate 7 passo 1 faca escreval(tabuleiro[linha,coluna]," ") fimpara fimpara para linha de 0 ate 7 passo 1 faca escreval(“ “) para coluna de 0 ate 7 passo 1 faca escreva(tabuleiro[linha,coluna]," ") E) fimpara escreval(“ “) fimpara NA PRÁTICA Você foi contratado para desenvolver a estrutura de um jogo de Batalha Naval. Para construir esse jogo você recebeu as seguintes informações: • O campo de batalha deve ter 5 linhas e 5 colunas (pequeno para auxiliar nos testes!) • Pequenas embarcações ocupam duas casas subsequentes • Médias embarcações ocupam três casas subsequentes • Grandes embarcações ocupam 4 casas subsequentes • Para simplificar o problema, as embarcações somente podem estar em uma única linha Faça um programa que leia o campo de batalha e identifique onde estão as embarcações! Mãos-a-obra! Você inicialmente precisa definir o seu campo de batalha, que será uma matriz 5x5. Na sequência você precisa definir como irá codificar a informação de cada embarcação. Aqui você tem duas alternativas: a) utilizar apenas dois códigos: 0 para indicar o vazio e 1 para indicar que tem embarcação; mas nesta situação quando duas embarcações estiverem juntas será difícil saber qual é. b utilizar: 0 para indicar o vazio, 2 para indicar embarcações pequenas, 3 para indicar embarcações médias e 4 para indicar embarcações grandes. Na tabela a seguir você pode ver um exemplo do campo de batalha, onde na primeira linha se tem uma embarcação média, na segunda uma pequena, na terceira uma grande, na quarta duas pequenas e na última uma média. Lembre-se que o usuário pode não digitar corretamente a informação das embarcações! Agora é sua vez! Temos certeza que consegue! Clique para ver o código SAIBA MAIS http://lrq2.sagah.com.br/sagahcm/ua/11273/2/37/img_conteudo/Na_pratica_BATALHA.ALG Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Vetores - curso de algoritmos #14 - Gustavo Guanabara Conteúdo interativo disponível na plataforma de ensino! Matrizes - curso de algoritmos #15 - Gustavo Guanabara Conteúdo interativo disponível na plataforma de ensino! Variáveis, vetores e matrizes Conteúdo interativo disponível na plataforma de ensino! Estruturas Homogêneas: Vetores e Matrizes Conteúdo interativo disponível na plataforma de ensino! Introdução a Algoritmos Conteúdo interativo disponível na plataforma de ensino! Variáveis Indexadas (Vetores) APRESENTAÇÃO Vetores, arranjos simples ou estruturas de dados homogêneas de uma dimensão representam coleções lineares de elementos armazenados em sequência que são identificados por índices. A linguagem MATLAB fornece recursos poderosos para trabalhar com vetores, que vão desde simples operações até funções complexas, que realizam cálculos avançados com o objetivo de encontrar soluções para diversas questões do mundo real que podem ser representadas por expressões matemáticas. Nesta Unidade de Aprendizagem, você vai estudar sobre a declaração de estruturas de dados homogêneas de uma dimensão e a construção de algoritmos em pseudocódigo e em MATLAB na solução de problemas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Declarar estruturas de dados de uma dimensão (vetores) em pseudocódigo e linguagem MATLAB. • Construir algoritmos com estruturas de dados homogêneas (vetores) em pseudocódigo e linguagem MATLAB. • Aplicar as estruturas de dados homogêneas (vetores) na solução de problemas.• INFOGRÁFICO Um vetor é um arranjo de elementos dispostos de modo linear, como uma linha ou uma coluna de uma tabela (1 x N ou N x 1). Cada elemento do vetor possui um índice, que inicia com um e vai até a quantidade de elementos do arranjo. É por meio desse índice que as estruturas de repetição permitem realizar a navegação e acessar os elementos do vetor individualmente para ler, editar ou excluir dados. Veja, no Infográfico a seguir, a ilustração da declaração de um vetor e como realizar a navegação em seus elementos por meio de uma estrutura de repetição. CONTEÚDO DO LIVRO Vetores são estruturas de dados homogêneas que armazenam coleções de elementos em sequência na memória. Na engenharia, aprender a desenvolver programas com vetores é uma atividade muito importante, uma vez que permite trabalhar com dados que podem ser tabuados e armazenados para a realização de diversas operações, como cálculos e simulações. Nesse contexto, a linguagem MATLAB possui diversos recursos que facilitam a manipulação e a execução de operações com vetores. Para saber mais, leia o capítulo Variáveis indexadas (vetores), do livro Algoritmos e Programação, que serve como base teórica desta Unidade de Aprendizagem. Boa leitura. Variáveis indexadas (vetores) Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Declarar estruturas de dados de uma dimensão (vetores) em pseu- docódigo e linguagem MATLAB. Construir algoritmos com estruturas de dados homogêneas (vetores) em pseudocódigo e linguagem MATLAB. Aplicar asestruturas de dados homogêneas (vetores) na solução de problemas. Introdução Vetores, arranjos simples ou estruturas de dados homogêneas de uma dimensão representam coleções lineares de elementos armazenados em sequência que são identificados por índices. A linguagem MATLAB fornece recursos poderosos para trabalhar com vetores, que vão desde simples operações até funções complexas, que realizam cálculos avançados com o objetivo de encontrar soluções para diversas questões do mundo real que podem ser representadas por expressões matemáticas. Neste capítulo, você vai estudar sobre a declaração de estruturas de dados homogêneas de uma dimensão e a construção de algoritmos em pseudocódigo e em MATLAB na solução de problemas. Estruturas de dados de uma dimensão (vetores) em pseudocódigo e linguagem MATLAB Uma estrutura de dados de uma dimensão, também conhecida como vetor, array ou arranjo simples (unidimensional), é uma lista ou relação de elementos dispostos em sequência. Essa estrutura, em comparação com uma tabela, é representada por uma linha ou uma coluna (PALM, 2013). Um vetor é uma estrutura de elementos homogêneos, isto é, seus elementos são todos do mesmo tipo de dados, como uma relação de números inteiros, de números reais ou de strings. Isso significa que não é possível inserir elementos de tipos diferentes em um vetor, mesmo que a linguagem de programação não exija que a declaração do tipo de dados seja explícita (GILAT, 2012). Algumas linguagens de programação exigem que as variáveis sejam declaradas com um tipo de dados específico, como Pascal, C, Java e outras. No entanto, há linguagens que realizam a conversão implícita de dados e, assim, não requerem que o tipo seja informado na declaração, como MATLAB, Visual Basic, PHP, etc. Nesse caso, um vetor que contém números inteiros e reais terá seus elementos convertidos para números reais. Vetores são organizados por índices ou subscritos, que representam cada uma das posições da estrutura. Na linguagem MATLAB, o índice de um vetor inicia a partir da primeira posição, seguindo até o número total de elementos da estrutura, conforme ilustrado na Figura 1 (GILAT, 2012). Figura 1. Estrutura de um vetor. Os elementos de um vetor são armazenados em posições contíguas da memória do dispositivo ou da máquina virtual que o armazenam, por isso os elementos podem ser acessados diretamente por meio de seus índices (DEITEL; DEITEL, 2011). A linguagem MATLAB foi desenvolvida especificamente para tratar com vetores de quaisquer dimensões. Dessa forma, qualquer relação de elementos pode ser tratada como um vetor, por exemplo, dados estatísticos de determinada população (GILAT, 2012). Variáveis indexadas (vetores)2 A declaração de um vetor em pseudocódigo pode ser realizada pela indica- ção de um nome para a variável que representa o arranjo seguida da atribuição dos valores da lista, ou seja, dos valores dos elementos de cada posição: Esse exemplo cria um vetor de cinco posições, cujos elementos foram inseridos automaticamente na sua declaração. É possível, ainda, declarar um vetor sem indicar os elementos na sua criação, podendo inseri-los posterior- mente por meio de uma estrutura de repetição, conforme será apresentado adiante neste capítulo. No MATLAB, a declaração é muito semelhante, bastando substituir o caractere-chave por colchete, além de substituir, opcionalmente, as vírgulas que separam os elementos pelo caractere espaço. Esse tipo de declaração se chama vetor de linha (PALM, 2013): Um vetor de coluna no MATLAB é declarado quando seus elementos são separados pelo caractere ponto e vírgula, pela indicação de uma aspa simples no final ou por quebras de linha (operador de transposição). Nesse tipo de vetor, os elementos são exibidos um abaixo do outro (PALM, 2013): É possível, ainda, criar um vetor com elementos espaçados de um fator constante no MATLAB. Para isso, deve-se indicar o valor do primeiro ele- mento, o incremento e o valor do último elemento. Nesse tipo de declaração, os caracteres colchetes ou parênteses são opcionais (CHAPRA, 2013). Observe: 3Variáveis indexadas (vetores) Se o incremento, que representa o parâmetro do meio, não for informado, o interpretador do MATLAB usará o valor 1, incrementando a sequência a cada número inteiro. No entanto, se o incremento superar o último valor, o vetor receberá até o último valor que não exceder o valor final (CHAPRA, 2013). Observe: Outra opção para declarar um vetor com atribuição de valores se dá por meio da função . Essa função cria um vetor com espaçamento linear, que identifica automaticamente os elementos intermediários do vetor por meio de um parâmetro que especifica a quantidade de elementos (GILAT, 2012). Nesse exemplo, a função é usada para atribuir quatro valores, entre 1 e 10, para o vetor: Algoritmos com estruturas de dados homogêneas (vetores) em pseudocódigo e linguagem MATLAB Uma vez defi nidas as declarações das estruturas de dados homogêneas uni- dimensionais, isto é, dos vetores, conforme visto anteriormente, é possível executar diversas ações com esses dados, como pesquisar, editar, concatenar e acrescentar elementos, entre outras. Acessar elementos Sabendo que o índice de um vetor inicia na posição 1, é possível acessar diretamente qualquer elemento do vetor a partir de seu índice, informando apenas a posição ou um intervalo, de acordo com os seguintes exemplos: Variáveis indexadas (vetores)4 Editar elementos A edição de um vetor também ocorre pela seleção do índice de seus ele- mentos. Essa edição pode modifi car um único elemento ou uma faixa que indica a posição inicial e a posição fi nal. Se houver a atribuição para uma posição inexistente, essa posição será criada e seus elementos intermediários receberão 0 (CHAPRA, 2013). Além disso, é possível excluir elementos de um vetor pela atribuição de um valor nulo para determinada posição ou para uma faixa de posições. Nesse caso, o vetor reduz o seu tamanho para a quantidade de itens restantes. Concatenar vetores A concatenação de dois vetores se dá pela união de seus elementos. O resultado pode ser atribuído a outra variável ou a qualquer uma das variáveis que estão sendo concatenadas: Operações com vetores É possível realizar diversas operações com vetores, como soma, subtração, divisão, multiplicação, exponenciação e outras. As operações adição, subtração e multiplicação por um escalar podem ser realizadas de forma direta, usando os operadores conhecidos da computação: +, - e * (GILAT, 2012). 5Variáveis indexadas (vetores) No entanto, as operações multiplicação, divisão e potenciação exigem uma representação um pouco diferente. Para isso, utiliza-se um ponto antes do operador na expressão, em uma representação conhecida no MATLAB por operações elemento por elemento (GILAT, 2012): Para realizar operações entre vetores, é necessário que eles tenham a mesma dimensão, isto é, não é possível, por exemplo, somar dois vetores de dimensões diferentes, sendo um com cinco elementos e o outro com quatro. Caso haja uma tentativa de realizar uma operação com vetores de dimensões diferentes, o seguinte erro será apresentado pelo MATLAB: matrix dimensions must agree. Percorrer vetores É possível percorrer um vetor para realizar comparações ou operações com seus elementos. A navegação em um vetor se dá pelo índice dos elementos, que apontam para o conteúdo de cada posição, entre um e o número total de itens do arranjo (PALM, 2013). O pseudocódigo de uma estrutura de repetição em um vetor é apresentado a seguir. Nessa estrutura, uma variável chamada índice indica a posição de cada elemento pela navegação na estrutura, permitindo, assim, imprimir o conteúdo de cada elemento: Variáveis indexadas (vetores)6 Para percorrer um vetor de elementos com o MATLAB, é preciso usar uma das estruturas de repetição, como ou . O seguinte exemplo navega em um vetor de cincoposições e multiplica por dois apenas os elementos pares que compõem a estrutura. Observe: Estruturas de dados homogêneas (vetores) na solução de problemas A linguagem MATLAB é uma poderosa ferramenta para a solução de pro- blemas matemáticos. Inúmeras funções nativas estão disponíveis para o uso em vetores, que facilitam e agilizam cálculos e operações nessas estruturas, conforme será apresentado a seguir. Contagem de elementos A instrução pode ser utilizada para obter a dimensão de um vetor, cujo resultado apresenta dois números: a quantidade de linhas e de colunas (CHAPRA, 2013). Outra forma de encontrar o número de elementos de um vetor se dá pela função , conforme os seguintes exemplos: 7Variáveis indexadas (vetores) Seleção de elementos Não raras vezes, é necessário encontrar e/ou selecionar elementos de um vetor de acordo com determinados critérios, como menor e maior, média, mediana e soma, entre outros (CHAPRA, 2013). Seleção de índices e valores Utilize a função para selecionar os índices dos elementos que satisfaçam a determinados critérios de pesquisa (GILAT, 2012). No exemplo a seguir, os índices são identifi cados e os valores dos elementos têm valor maior que o número 4. Funções nativas Diversas funções matemáticas estão disponíveis para o uso com vetores no MATLAB. Essas funções servem de apoio para a execução de cálculos avançados, que vão desde a soma e o produto de um vetor até funções mais complexas, como produto escalar, produto vetorial, seno, cosseno e tangente, entre outros (GILAT, 2012). Variáveis indexadas (vetores)8 Geração de números aleatórios Números aleatórios são importantes para a geração de dados que servem de base para diversas atividades da Engenharia, por exemplo, simulações. O MATLAB tem três formas diferentes de gerar números aleatórios para vetores, que produzem números diferentes a cada execução, conforme segue (GILAT, 2012). Instrução rand Essa instrução gera números aleatórios entre 0 e 1 uniformemente distribuídos. Se apenas um parâmetro for passado, uma matriz quadrada será produzida com números aleatórios. No entanto, para produzir um vetor com números aleatórios por meio da função , utilize um parâmetro para forçar a geração de apenas uma linha ou coluna. 9Variáveis indexadas (vetores) Instrução randi Essa instrução gera números aleatórios inteiros uniformemente distribuídos, entre 1 e o número passado como parâmetro. Havendo necessidade de gerar números por determinada faixa, utilize um parâmetro adicional que recebe um vetor e a dimensão da matriz, indicando a quantidade de linhas e colunas, conforme os seguintes exemplos. Instrução randn Essa instrução gera uma distribuição normalizada de números defi nidos pela média 0 e desvio padrão 1. Com isso, pode gerar variáveis escalares, vetoriais ou matriciais, cujos parâmetros defi nem as linhas e as colunas da matriz. Você pode utilizar lookfor para obter detalhes das instruções e palavras reservadas do MATLAB. Exemplo: lookfor randi. randi – pseudorandom integers from a uniform discrete distribution. rng – control the random number generator used by RAND, RANDI, and RANDN. randi – pseudorandom integers from a uniform discrete distribution. randi – CODISTRIBUTED.RANDI Create a codistributed array of random integers. randiLike – randiLike codistributed array. randi – codistributed array of normally distributed pseudorandom numbers using codistributor. randi – codistributed array of normally distributed pseudorandom numbers using codistributor. randi – DISTRIBUTED.RANDI Create a distributed array of random integers. randi – build a gpuArray of uniformly distributed pseudo-random integers. randi – GPUARRAY.RANDI Create a gpuArray of random integers. Variáveis indexadas (vetores)10 Entrada e saída de dados em vetores Embora muitos problemas possam ser resolvidos pela defi nição de dados fi xos em variáveis, em outros casos pode ser necessário promover a interação do usuário com a aplicação, por meio da entrada e da saída de dados. Entrada de dados No MATLAB, a entrada de dados em vetores pode ser realizada pelo teclado ou pela leitura de arquivos armazenados em alguma pasta no disco rígido ou em memória auxiliar, como um pen drive, por exemplo. Para isso, a instrução pode ser utilizada para enviar uma mensagem ao usuário e, ao mesmo tempo, capturar a resposta inserida na aplicação (GILAT, 2012). Nesse exemplo, declaramos um vetor vazio e implementamos um laço de repetição para realizar a leitura de três posições. A instrução converte um número para string para formar a mensagem exibida ao usuário e a função captura a leitura para dentro do vetor. Observe: Existem diversas formas de ler arquivos no MATLAB, porém, foge ao escopo deste capítulo explicar cada uma delas. Nesse sentido, trataremos a forma mais simplificada, que simplesmente carrega para um vetor os dados de um arquivo que estejam em formato compatível. Essa entrada de dados facilita a execução de programas que têm dados já armazenados, isto é, que foram capturados por outras fontes, mas que podem ser trabalhados no MATLAB. Para carregar um arquivo, utilize a instrução (GILAT, 2012). Nesse exemplo, o MATLAB cria uma variável com o nome do arquivo e atribui o conteúdo do arquivo a ela. Na sequência, um laço de repetição percorre o vetor para exibir cada um dos elementos. Observe: o conteúdo do arquivo deve ser compatível com um vetor (Figura 2). 11Variáveis indexadas (vetores) Figura 2. Arquivo que contém os dados de um vetor. Saída de dados No MATLAB, a saída pode ser realizada pela simples execução de uma variável – modo como foi apresentado até agora –, ou pelas instruções disp e fprintf. Para ambos os modos, é possível apresentar os dados de um vetor de forma única ou pela navegação em seus elementos por meio de uma estrutura de repetição (PALM, 2013). A instrução é muito simples e exibe o conteúdo de uma variável, sem qualquer parâmetro adicional: Já a função é mais elaborada e se comporta de forma seme- lhante ao comando da linguagem C. Assim, é possível controlar a apresentação da saída dos dados, como definir o formato dos números, inserir quebras de linhas, etc. Variáveis indexadas (vetores)12 Acesse o link ou o código a seguir e descubra outras infor- mações sobre entrada e saída de dados no MATLAB. https://goo.gl/h3kzMD CHAPRA, S. C. Métodos numéricos aplicados com MATLAB® para engenheiros e cientistas. 3. ed. Porto Alegre: AMGH, 2013. DEITEL, P. J.; DEITEL, H. M. Como Programar em C. 6. ed. São Paulo: Pearson, 2011. GILAT, A. MATLAB com aplicações em engenharia. 4. ed. Porto Alegre: Bookman, 2012. PALM III, W. J. Introdução ao MATLAB para engenheiros. 3. ed. Porto Alegre: AMGH, 2013. 13Variáveis indexadas (vetores) Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Vetores são estruturas de dados unidimensionais que têm a capacidade de armazenar uma sequência de elementos que podem ser identificados por um índice. Pelo índice, é possível percorrer cada um dos elementos do vetor para avaliar, comparar e realizar operações, como, por exemplo, contabilizar a quantidade de votos de um plenário e calcular seus respectivos valores percentuais. Assista ao seguinte vídeo para conhecer a declaração, entrada e saída de vetores no MATLAB. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Indique a alternativa que representa corretamente a declaração de um vetor de linha que contém os elementos ímpares entre 0 e 10 no MATLAB. A) v= [1; 3; 5; 7; 9]; B) v= [1: 3: 5: 7: 9]; C) v= [1:2:10]; D) v= (1 3 5 7 9); E) v= [0:10, unpaired]; Considerando os dois vetores lineares v e w, declarados a seguir, marque a 2) alternativa que representa corretamente a operação de multiplicaçãode elementos na linguagem MATLAB, de modo que o conteúdo do vetor z seja 2, 12 e 30: v= [1 3 5]; w= [2 4 6]; A) z= v * w; B) z= v .* w; C) z= v ** w; D) z= multi(v, w); E) z= prod(v, w); 3) Considerando os dois vetores v e w, declarados abaixo, indique a alternativa que apresenta o resultado correto da concatenação desses vetores em um vetor linear z, cujo conteúdo é: 1, 3, 5, 2, 4 e 6. v= [1 3 5]; w= [2 4 6]; A) z= [v w]; B) z= [v; w]; C) z= [v + w]; D) z= [v & w]; E) z= concat(v, w); 4) Analise o seguinte algoritmo baseado na linguagem MATLAB e marque a alternativa que representa o conteúdo do vetor w: v= [1:10] * 3; w= []; for i= 1 : length(v) if mod(v(i), 2) ~= 0 w= [w v(i)]; end end A) 1, 3, 6, 9. B) 3, 9, 15, 21, 27. C) 6, 12, 18, 24, 30. D) 9, 12, 15, 18, 21, 24, 27, 30. E) 1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30. Dado o seguinte algoritmo escrito na linguagem MATLAB, indique a alternativa que representa o objetivo correto. 5) a= -5; b= 5; n= (b - a) * rand(1, 10) + a; disp(round(n)) A) Gerar 5 números aleatórios entre -5 e 5. B) Gerar 5 números aleatórios entre 1 e 10. C) Gerar 10 números aleatórios entre 0 e 1. D) Gerar 10 números aleatórios entre -5 e 5. E) Gerar 10 números aleatórios entre 1 e 10. NA PRÁTICA MATLAB é uma linguagem de programação voltada para cálculos de álgebra bastante utilizados na engenharia, especialmente para a manipulação de estruturas de dados de uma dimensão, como vetores ou arrays. Cálculos com vetores na álgebra podem ser realizados em diversas funções, como, por exemplo, o produto interno que calcula o tipo do ângulo entre dois vetores que representam a movimentação e a aceleração de uma partícula em relação ao solo. Carlos é engenheiro e precisa realizar o cálculo do produto interno de dois vetores em R3, isto é, em um plano de três dimensões: x, y e z. Acompanhe, na imagem a seguir, como Carlos resolveu o cálculo. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Lógica de programação - aula 15 - Vetores No link a seguir, você terá acesso a um vídeo que apresentará a lógica de programação de vetores. Conteúdo interativo disponível na plataforma de ensino! Lógica de Programação - Vetores - Exemplo de uso no VisualG No link a seguir, você terá acesso a um vídeo que trará um exemplo para auxiliar a compreender a lógica de programação com vetores. Conteúdo interativo disponível na plataforma de ensino! Curso de Introdução ao MATLAB - Aula 5: Criando Vetores Nolink a seguir, você terá acesso a um vídeo que fará a criação e a manipulação de vetores com MATLAB. Conteúdo interativo disponível na plataforma de ensino! Correção de erros, Depuração e Documentação APRESENTAÇÃO Corrigir erros, essa passa a ser uma atividade de um desenvolvedor logo que termina seu código e tenta compilá-lo ou interpretá-lo. Durante sua vida de programador você terá que procurar pelos erros de diferentes naturezas, corrigí-los e documentar seu código para que todas essas tarefas sejam realizadas de forma mais eficiente por você ou por outro desenvolvedor ou desenvolvedora. Nesta Unidade de Aprendizagem, você estudará quais os tipos de erros que existem, como procurá-los usando o processo de depuração e estratégias para documentar seu código do mais simples ao mais complexo. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Identificar erros léxicos, sintáticos e semânticos em C e aplicar estratégias de correção.• Conhecer o processo de depuração: estratégias e recursos do ambiente.• Aplicar o processo de indentação de código e estratégias de documentação por comentários. • DESAFIO Você faz parte do time de desenvolvimento de um sistema financeiro de uma empresa da sua cidade. Sua tarefa é a seguinte: de posse da especificação do que o sistema precisa fazer, você deve fazer uma análise no código, encontrando os erros e corrigido-os. A especificação é a seguinte: - O sistema a ser desenvolvido é uma calculadora com as operações: soma, subtração, multiplicação e divisão. - Os operadores serão representados por números inteiros de 1 a 4. - Se o usuário digitar um operador inválido, não deve ser pedido os operandos, ou seja, os números para a operação; - Se o usuário digitar 5, o programa deve ser encerrado e também não deverá ser pedido os operandos. - A entrada do sistema são 3 números: um operador e dois operandos. - A saída e o resultado da operação. - Depois de realizar a operação e mostrar o resultado o programa deve mostrar o menu de escolha de operações. O código que você deve analisar é o seguinte: Você deve entregar um relatório contendo a linha do erro e como corrigí-la. INFOGRÁFICO Em que fase do desenvolvimento de um programa, é possível encontrar erros sintáticos e semânticos? Para qual etapa deve-se voltar para corrigir esses erros? Acompanhe no infográfico o que são erros sintáticos e semânticos e em que fase do desenvolvimento encontrá-los. CONTEÚDO DO LIVRO Em programação e usando-se a linguagem C, depois de desenvolver o código-fonte é preciso compilar para obter o programa executável. Porém podem acontecer alguns erros que impeçam que um programa seja gerado ou pode acontecer que o programa gerado não execute exatamente o que se deseja, ou seja o programa não resolve de forma correta o problema a que se propôs. O papel do desenvolvedor é procurar erros para corrigi-los e para isso a equipe de desenvolvimento pode usar ferramentas e traçar estratégias. Além disso se o código estiver bem documentado, fica mais legível e proporciona eficiência para todo o processo de desenvolvimento de sistemas. Leia mais no capítulo Correção de erros, depuração e documentação, da obra Algoritmos de Programação, que serve de base teórica para esta Unidade de Aprendizagem. ALGORITMOS DE PROGRAMAÇÃO Marcela Santos Correção de erros, depuração e documentação Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Identificar erros léxicos, sintáticos e semânticos em C e aplicar estra- tégias de correção. � Conhecer o processo de depuração: estratégias e recursos do ambiente. � Aplicar o processo de indentação de código e estratégias de docu- mentação por comentários. Introdução A correção de erros passa a ser uma atividade de um desenvolvedor logo que termina seu código e tenta compilá-lo ou interpretá-lo. Durante sua vida de programador, você terá que procurar pelos erros de diferentes naturezas, corrigi-los e documentar seu código para que todas as ta- refas sejam realizadas de forma mais eficiente por você ou por outro desenvolvedor. Neste capítulo, você estudará os tipos de erros que existem, como procurá-los por meio do uso de processo de depuração e estratégias para documentar seu código, do mais simples ao mais complexo. Erros léxicos, sintáticos e semânticos em C e estratégias de correção Durante o processo de desenvolvimento de um programa de computador, o desenvolvedor pode encontrar alguns erros. Antes de entendermos o que é um erro sintático, vamos a uma definição de sintaxe e semântica em linguagem de programação. Sintaxe é um conjunto de regras que define a forma de uma linguagem, estabelecendo a composição de suas estruturas básicas (palavras). Em outras palavras, sintaxe define as regras que precisam ser seguidas para se escrever um programa em uma determinada linguagem. Dentre essas regras, existem: � Regras léxicas — que descrevem as combinações de caracteres possíveis para formarmos palavras reservadas, identificadores, operadores, etc. � Regras sintáticas — que descrevem a maneira correta de se formar instruções válidas (comandos, expressões, sub-rotinas, etc.). Um erro sintático é ocasionado quando não seguimos uma regra sintática, e o mesmo ocorrepara um erro léxico. Em C, esses dois tipos de erros são detectados quando vamos compilar o código-fonte, ou seja, não conseguimos gerar o programa e precisamos voltar para a etapa de desenvolvimento para a realização do processo de depuração do código. Aqui, a título de simplificação de classificação, adotaremos o termo “erro sintático” para os erros léxicos e sintáticos. São exemplos de erros sintáticos: � deixar de colocar o ponto e vírgula (;) no fim de uma instrução; � fazer uso de uma variável sem antes a ter declarado; � trocar o operador relacional == pelo operador de atribuição; � falta ou excesso de chaves { }. Agora, para entendermos o terceiro tipo de erro, vamos primeiro ao conceito de semântica. Responsável por descrever como as construções da linguagem devem ser interpretadas e executadas, a semântica avalia a adequação do uso de estruturas, comandos e instruções. Violar uma regra semântica não impede que o programa seja executado, o problema é que ele não gerará o que se espera dele. A estrutura if-else em C, por exemplo, tem a seguinte sintaxe (Figura 1). Figura 1. Sintaxe if-else. Correção de erros, depuração e documentação2 Sua semântica é: se o valor atual da expressão for verdadeiro, a instrução incorporada será selecionada para execução. Para exemplificar, vamos avaliar o código apresentado na Figura 2 e desco- brir se existem erros sintáticos (sintático ou léxico) ou semânticos. O código- -fonte foi feito pensando-se em, dadas duas notas, calcular a média aritmética e mostrar aprovado, caso a média seja maior ou igual a 7, e reprovado, caso contrário. Figura 2. Análise de código procurando erros: sintáticos e semânticos. Ao tentarmos compilar esse código, a mensagem demonstrada na Figura 3, a seguir, aparece como saída. Figura 3. Erro sintático. Esse é um dos erros sintáticos, pois a variável média foi usada antes de ser declarada. Para consertarmos, basta declararmos essa variável. Agora, com 3Correção de erros, depuração e documentação a variável declarada, conseguimos rodar o programa, porém, para esse caso, onde o aluno tem média acima de 7, aparece reprovado como saída. Isso é conveniente? Não parece, não é mesmo? O programa está escrito de forma correta, porém a lógica está trocada. Nesse caso, temos um erro semântico. A maneira correta para esse programa é a seguinte (Figura 4). Figura 4. Correção de erros sintáticos e semânticos. Depuração: estratégias e recursos do ambiente Depuração ou debug é o processo de procurar erros no código-fonte e corrigi- -los. Como mostrado na seção anterior, existem erros que impedem de o código ser compilado e outros que não. O processo de depuração visa a atacar os dois tipos de erros. Correção de erros, depuração e documentação4 Este processo pode ser feito por meio da utilização de um debugger, que permite que o desenvolvedor veja o código sendo executado linha por linha ou crie pontos de parada para avaliar o comportamento do seu código. Nos ambientes integrados de programação, existem debugger no próprio ambiente, permitindo que seu uso seja bastante amigável. São exemplos de IDE: Dev-C++, Code::Blocks, Visual Studio e Eclipse. Já, se você não está usando uma IDE, existe um debugger bastante difundido e que pode ser usado tanto no ambiente Windows como no Linux: o gdg. Para ter mais detalhes sobre a ferramenta de debug do Linux, o GDG, acesse: https://goo.gl/GMVDhw A diferença é que, caso você não esteja usando um ambiente integrado, a depuração não será visual, mas em forma de texto. E esta é uma das estratégias quando se fala em depurar: use a ferramenta correta. Em todos os casos, os recursos de ambiente auxiliam, mas uma boa inves- tigada no seu código pode ser o primeiro passo e, algumas vezes, a estratégia mais rápida para encontrarmos um erro. Outro detalhe é quando estamos procurando um erro em um código bastante complexo e que talvez a melhor saída seja resolver o problema que o código está buscando despachar de maneira mais simples. Se essa forma existe, por que não fazê-la ao invés de ficar procurando erro em um código complexo? Por falar da complexidade do código, outro detalhe que pode ajudar na debug do código é codificar por meio da tática do baby steps, ou seja, pequenos passos: tão logo o step tenha sido codificado, realiza-se testes simples. Esses testes podem ser manuais, como: entrada de dados e/ou impressão de valores de variáveis ao longo do seu código em lugares estratégicos. É muito comum, logo que estamos aprendendo a programar, codificar praticamente o programa inteiro. Quanto maior a quantidade de erros, mais complicado fica para se fazer uma correção. Em resumo, uma ótima estratégia é errar o quanto antes, em pedaços menores do código, pois a correção torna-se mais acessível, e, ao final, todo o código construído por partes já estará corrigido. 5Correção de erros, depuração e documentação Em síntese, podemos listar as seguintes estratégias de debug: � use a ferramenta correta; � foque na resolução do problema; � divida para conquistar, escreva pequenos trechos e faça testes; � utilize saída de dados em lugares estratégicos para ver o comportamento do seu programa. Indentação de código e estratégias de documentação por comentários Para finalizarmos este capítulo, vamos falar de como podemos criar estra- tégias para escrever um código mais organizado, ou seja, que fique legível e contenha informações que auxiliem a sua leitura por qualquer desenvolvedor que conheça a linguagem de programação utilizada. A primeira ferramenta é realizar a indentação do código. Esse processo consiste em alinhar os comandos, respeitando o nível de pertencimento entre eles. Dessa forma, fica claro quando uma estrutura está contida na outra, bem como onde ela começa e termina. Para se realizar a indentação, basta inserimos espaços em branco à esquerda de cada instrução, utilizando a tecla tab. Observe a Figura 5, a seguir. Figura 5. Código com e sem indentação. Correção de erros, depuração e documentação6 Em C, a indentação não é obrigatória, mas certamente ajuda muito na leitura do código e, quanto mais fácil de ler, mais rápido torna o processo de debug manual. A seguir, na Figura 6, você pode ver alguns estilos de indentação para todas as estruturas que vemos neste capítulo. Figura 6. Estilos de indentação para estruturas bási- cas: seleção e repetição. Um detalhe importante é que podemos ter uma estrutura dentro de outra, portanto a indentação será uma ferramenta muito importante para apoiar o desenvolvimento de um código legível. Além da indentação, outra prática é documentar o código, utilizando-se comentários ao longo do programa. Um comentário é uma linha ou linhas existentes no código-fonte, mas que não serão compiladas ou interpretadas. 7Correção de erros, depuração e documentação Isso acontece porque existem marcadores, caracteres especiais, que sinali- zam para as ferramentas de compilação (interpretação) que o que está escrito é um comentário e não um comando ou instrução. Existem comentários de uma linha ou várias linhas. Para comentários de uma linha, usamos // (barra barra). O que vier depois dessas duas barras será o comentário. Como estamos falando de documentação usando comentário, pode-se colocá-lo, por exemplo, logo no início para se ter um cabeçalho de documentação. Veja a Figura 7. Figura 7. Uso de comentário de uma linha para documentar código-fonte. Já o comentário de mais de uma linha é feito utilizando-se /* comentario */. Assim, pode-se realizar comentário de múltiplas linhas para documentar, por exemplo, o que uma estrutura de repetição executará, ou mesmo, qual o pro- blema que o código-fonte deseja resolver, conforme demonstrado na Figura 8. Figura 8. Uso de comentário de múltiplas linhas para documentar código-fonte. Correção de erros, depuração e documentação8 Use comentários para documentar seu código, por exemplo, no início: descrição do que o algoritmofaz, como utilizá-lo, o que as variáveis mais importantes significam, as estruturas de dados e métodos especiais utilizados, o autor e a data de escrita. Uma dica é, quando o código mudar, lembrar-se de mudar o comentário também: comentário errado é pior que código sem comentário. GNU DEBUGGER. Wikipédia, Flórida, 2017. Disponível em: https://pt.wikipedia.org/ wiki/GNU_Debugger. Acesso em: 23 fev. 2017. Leituras recomendadas BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http:// en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018. MIZRAHI, V. V. Treinamento em Linguagem C: curso completo em um volume. 2. ed. São Paulo: Pearson, 2008. PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p. SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson Pioneira, 2003. Referência 9Correção de erros, depuração e documentação Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Os comentários podem ser peça fundamental quando precisamos procurar erros, entender o que o código-fonte faz ou até mesmo dar manutenção em um código criado por outro desenvolvedor. No vídeo da Dica do Professor, você terá orientações sobre o uso de comentários como estratégia de documentação. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O que é um erro sintático em programação? A) Não existem erros sintáticos em linguagem de programação. B) Um erros sintático é um erro que causa a não compilação de um código em C e são caracterizados por um erro na formação das estruturas básicas da linguagem, falta de uma pontuação, não declaração de variáveis. C) Erro sintático é um erro na lógica do programa, o programa é compilado mas não realiza a tarefa a qual foi desenvolvido, de forma correta. D) Erros sintáticos são erros ocasionados pela falta de identação do código-fonte escrito em C. E) Erros sintáticos são ocasionados pela escrita de forma incorreta de comentários dentro do código-fonte. Com relação ao código em anexo, é correto afirmar que:2) #include <stdio.h> int main(){ int a,b; a=10; b=15; printf("a= %d, b=%d\n",a,b); temp=b; b=a; a=temp; printf("a= %d, b=%d\n",a,b); return 0; } A) O código possui um erro sintático, por esse motivo não irá rodar e o erro aparecerá no momento da compilação. B) O programa imprimirá a = 10, b = 15 em uma linha e, na seguinte, a = 15, b =10. C) O programa imprimirá a = 10, b = 15 em uma linha e, na seguinte, a = 10, b =15. D) O programa imprimirá a = 10, b =1 5 duas vezes na mesma linha. E) O programa imprimirá a = 15, b = 10 em uma linha e, na seguinte, a = 15, b =10. O seguinte código não será executado pois: #include <stdio.h> int main(){ numero=10; //tete condicional if(numero<50){ printf("numero menor que 50"); 3) } else{ printf("numero maior que 50"); } return 0; } A) Existe um erro no comentário. B) A identação do código está incorreta. C) A variável numero não está declarada. D) Existe um erro no teste condicional do if. E) Existe um erro no comando dentro do else. 4) Do que se trata o processo de depuração em programação de computadores? A) É o processo de encontrar erros (bugs) em um código fonte. B) É o processo de compilar e executar um código-fonte. C) É o processo de interpretar um código-fonte. D) É o processo de transformar um algoritmo em um código-fonte E) Não se trata de depeuração em software, somente em hardware. 5) Quais são os marcadores para comentário de única linha de de múltiplas linhas em C? A) Para única linha: não existe comentário de linha única em C para múltipla linha: /* */ B) Para única linha: / / para múltipla linha: não existe comentário de múltipla linha em C C) Para única linha: / / para múltipla linha: /* */ D) Para única linha: /* * / para múltipla linha: / / E) Não existe comentários em C. NA PRÁTICA Daniela é programadora em uma empresa que constrói sistemas financeiros e precisa corrigir um sistema criado por seu colega de trabalho que não está mais na empresa. O sistema foi desenvolvido para uma organização educacional que pretende dar aumento de salário aos seus colaboradores. O problema é que Daniela só tem a especificação do sistema e o código não contem nenhuma linha de comentário para ajudá-la. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Debugar código? Quer entender o que é o processo de debug? Nesse video você pode aprender o que é e como realizar esse processo no seu código fonte. Conteúdo interativo disponível na plataforma de ensino! Comments in C - Ingles (habilitar legenda em português) O vídeo aborda o uso de comentários em C e como escrevê-los. Conteúdo interativo disponível na plataforma de ensino! Como usar comentários? Dicas para documentar o seu código em C. Programar em C - Fazer Comentários em C | Caractere Nova Linha n - Aula 3. Conteúdo interativo disponível na plataforma de ensino! Comandos básicos (entrada, saída, atribuição e declaração) APRESENTAÇÃO Nesta Unidade de Aprendizagem, estudaremos os comandos de entrada e saída de dados em um algoritmo através da representação em pseudolinguagem e fluxograma. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Analisar algoritmos simples com comandos de entrada e saída em pseudolinguagem.• Identificar algoritmos simples com comandos de entrada e saída em fluxograma.• Aplicar comandos de entrada e saída na solução de problemas.• DESAFIO Muitas linguagens de programação possuem funções para inverter um número já pronto na linguagem. O nosso desafio é encontrar uma solução utilizando os comandos de entrada, saída e atribuição para que faça a inversão de um número inteiro de 4 dígitos. O valor lido deve estar armazenado em uma única variável e, ao final, deverá ser impressa como saída somente uma variável com o valor invertido, e não 4 variáveis separadas. A inversão deverá ser desenvolvida utilizando comandos aritméticos, resto da divisão e divisão inteira. Exemplo: Valor normal : 4567 Valor invertido: 7654 a) Declare as variáveis necessárias e seus tipos para resolver o problema apresentado. Todos os valores da tabela devem ser atribuídos para as variáveis para serem utilizadas nos cálculos. b) Identifique e descreva quais são os comandos de entrada necessários para solucionar o problema apresentado (representar em pseudolinguagem e fluxograma). c) Analise o problema e descreva a sequência correta dos comandos de atribuições e cálculos necessários para a solução do problema apresentado (para inverter o número). (Representar em pseudolinguagem e fluxograma.) d) Identifique e descreva quais são os comandos de saída necessários para solucionar o problema apresentado (representar em pseudolinguagem e fluxograma). INFOGRÁFICO O esquema mostra os principais temas que serão abordados nesta Unidade de Aprendizagem. CONTEÚDO DO LIVRO Os algoritmos sequenciais normalmente possuem uma estrutura básica com três etapas: entrada de dados, processamento (cálculos e atribuições) e saída de dados. Em alguns algoritmos, esse esquema básico pode não ter definida a entrada de dados, quando os valores já estão predefinidos no programa. Para auxiliar nos estudos, acompanhe um trecho da seguinte obra: EDELWEISS, N.; LIVI, M.A.C. Algoritmos e programação com exemplos em Pascal e C - Vol. 23. Série Livros Didáticos Informática UFRGS. Porto Alegre: Bookman, 2014. O livro servirá como base para esta Unidade de Aprendizagem. Boa leitura. 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programaçãocom exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 32 Algoritmos e Programação com Exemplos em Pascal e C 2.3.1 expressões aritméticas Expressões aritméticas são expressões cujos resultados são valores numéricos, inteiros ou fracionários. A sintaxe de uma expressão aritmética é a seguinte: <operando> <operador aritmético> <operando> Na pseudolinguagem utilizada neste livro, os operadores que podem ser usados em expres- sões aritméticas são os mesmos utilizados nas expressões aritméticas comuns. Mas, da mes- ma forma que nas linguagens de programação, o símbolo utilizado para a multiplicação é o asterisco, e o símbolo de divisão é a barra inclinada. A Tabela 2.1 mostra os operadores que podem ser utilizados em expressões aritméticas, na forma adotada pela pseudolinguagem. Capítulo 2 Unidades Léxicas, Variáveis, Constantes e Expressões 33 tabela 2.1 Operadores aritméticos na pseudolinguagem Operador Significado Observação + Soma - - Subtração - * Multiplicação - / Divisão - ** Potência - Div Divisão inteira Operandos inteiros Mod Resto da divisão inteira Operandos inteiros Os operadores aritméticos têm diferentes precedências na execução das operações: primeiro são calculadas as potências, depois as multiplicações e as divisões e, no final, as somas e as subtra- ções. Expressões com operadores de mesma precedência justapostos são avaliadas da esquerda para a direita. Essa ordem de precedência pode ser alterada através do uso de parênteses. Os seguintes tipos de operandos podem ser utilizados: 1. valores numéricos literais; 2. variáveis numéricas; 3. chamadas a funções1 que devolvem um valor numérico; 4. expressões aritméticas, as quais podem incluir partes entre parênteses. Se uma expressão aritmética incluir funções, essas terão precedência maior na execução. Exemplos de expressões aritméticas: a + 1 a * 2 + 7,32 ( x / 2 ) / C – ( valor + 1 / 2 ) 2 + cos(x) onde cos(x) é uma função As expressões aritméticas devem ser escritas horizontalmente, em uma mesma linha, com eventuais valores fracionários expressos linearmente. Muitas vezes é necessário o emprego de parênteses para garantir a execução na ordem correta. A necessidade de linearização possibi- lita a uma expressão aritmética ter sua aparência inicial bastante modificada, como no caso da expressão a seguir: A representação dessa expressão em pseudolinguagem fica: a + ( ( b – 4 ) * ( a / 2 + 4 * z42) / ( c + d ) ) 1 Uma FUNÇÃO é um subprograma. Pode receber parâmetros (valores) para realizar sua tarefa e normalmente devolve um valor em seu nome, sendo o tipo do valor devolvido o próprio tipo da função. Mais detalhes sobre definição de funções são vistos no Capítulo 9. 34 Algoritmos e Programação com Exemplos em Pascal e C Algumas funções básicas predefinidas já vêm embutidas nas linguagens de programação. Entre elas, funções matemáticas, como o cálculo do cosseno de um ângulo utilizado no exemplo an- terior. Algumas dessas funções necessitam de alguma informação para calcular o que é pedido como, por exemplo, o valor do ângulo do qual se quer o cosseno. As informações requeridas são chamadas de parâmetros da função e são listadas logo após o nome da função, entre parênteses. Um parâmetro pode ser fornecido através de uma expressão cujo valor, depois de avaliado, será utilizado pela função. Na Tabela 2.2 são listadas algumas funções que podem ser utilizadas na pseudolinguagem, definidas de forma idêntica ou similar àquela em que ocorrem na maioria das linguagens de programação. tabela 2.2 Funções predefinidas na pseudolinguagem Nome da função Parâmetro Significado abs valor Valor absoluto do valor sen ângulo Seno do ângulo cos ângulo Cosseno do ângulo tan ângulo Tangente do ângulo arctan valor Arco cuja tangente tem o valor sqrt valor Raiz quadrada do valor sqr valor Quadrado do valor pot base, expoente Base elevada ao expoente ln valor Logaritmo neperiano log valor Logaritmo na base 10 58 Algoritmos e Programação com Exemplos em Pascal e C 3.1 esquema básico dos algoritmos sequenciais Os problemas puramente sequenciais geralmente incluem três atividades, que ocorrem nor- malmente na ordem indicada a seguir: entrada de dados, processamento realizado sobre es- ses dados (cálculos, comparações) e saída de dados ou apresentação dos resultados. Mesmo em problemas mais complexos, essas atividades constituem o esquema básico subjacente. O processamento e a saída de dados são elementos sempre presentes; já a entrada pode eventualmente não ocorrer, como nos casos em que o processamento se baseia em valores predefinidos e constantes. Entradas são os dados fornecidos pelo usuário durante a execução do programa, sem os quais não é possível solucionar o problema. Existem casos em que alguns dados de entrada, pela sua constância e regularidade, podem ser utilizados como constantes em uma solução. No Exercício de Fixação 3.3 (discutido na Seção 3.6), em que um valor em reais é convertido para dólares, em um período de estabilidade da moeda americana a taxa de conversão para o dólar poderia ser colocada como um valor constante na expressão de cálculo. Mas caso fosse preciso alterar essa taxa, seria necessário alterar o código. Nesse, e em casos semelhantes, sugere-se optar pela solução mais genérica, em que mesmo os dados relativamente estáveis são sempre fornecidos como entradas. As saídas de um problema são geralmente os elementos mais facilmente determináveis, uma vez que correspondem aos resultados esperados. No problema apresentado no Algoritmo 1.1 (no Capítulo 1, Seção 1.1.4), em que é calculada a soma de dois valores, os dois valores a serem somados são as entradas que devem ser infor- madas; o processamento é o cálculo da soma; e a saída é a soma calculada. Na sequência veremos os comandos que permitirão a leitura dos dados de entrada, a produ- ção de resultados e sua apresentação em um meio externo. Capítulo 3 Algoritmos Sequenciais 59 3.2 comandos de entrada e de saída Os comandos de entrada e de saída de dados fazem a ligação entre o programa e o usuá- rio. Toda a comunicação entre o mundo virtual e o mundo real é feita através desses co- mandos, sem os quais o usuário não ficaria ciente do que ocorre durante e ao término do processamento. 3.2.1 comando de entradade dados Através de um comando de entrada de dados, o programador solicita que um ou mais dados sejam obtidos (lidos) pelo computador a partir de um dispositivo de entrada como, por exemplo, o teclado. Os valores lidos devem ser armazenados em variáveis na memória para que essas possam depois ser utilizadas pelo programa. Para isso, o comando de entrada de dados deve, além de solicitar a operação de leitura, informar os nomes das variáveis que irão armazenar os valores lidos. Na pseudolinguagem, um comando de entrada de dados é identificado pela palavra reserva- da ler, seguida da lista de variáveis que irão armazenar os valores lidos, as quais aparecem separadas por vírgulas e entre parênteses: ler ( <lista de variáveis separadas por vírgulas> ) Por exemplo, o comando: ler (nota) pede que seja lido um valor no dispositivo de entrada de dados, dizendo ainda que o valor lido deve ser armazenado na variável denominada nota. Outro exemplo é o comando: ler (a, b, c) onde a, b e c são nomes de variáveis. Através desse comando serão lidos três valores de entra- da, sendo o primeiro colocado na variável a, o segundo na b e o terceiro na c. 3.2.2 comando de saída de dados Comandos de saída de dados são usados para transferir para fora do computador os re- sultados que foram solicitados a fim de que esses sejam vistos pelo usuário ou utilizados em futuro processamento. Um comando de saída inicia sempre pela palavra reservada escrever, seguida da lista de valores que deverão ser informados, os quais aparecem separados por vírgulas e entre parênteses: escrever ( <lista de valores de saída separados por vírgulas> ) A lista de valores de saída pode conter: 60 Algoritmos e Programação com Exemplos em Pascal e C ■ nomes das variáveis cujos conteúdos devem ser informados; ■ expressões que serão avaliadas, sendo seu resultado informado na saída; ■ strings formadas por cadeias de caracteres entre apóstrofos simples. As strings não são analisadas pelo computador, sendo simplesmente copiadas para o dispositivo de saída. Servem para explicar ao usuário o significado dos valores que são listados. Por exemplo, o comando: escrever (a, b) vai transferir para a saída o valor contido na variável a, seguido do valor da variável b. Já o comando: escrever (a * b + 1 / sin (c)) vai avaliar a expressão fornecida (a * b + 1 / sin (c)), transferindo para a saída somente seu resultado. Como exemplo da utilização de strings na saída, considere o comando: escrever ('Maior valor: ', maior, ' Resultado: ' , soma) Neste comando, maior e soma são nomes de variáveis. Supondo que o valor contido na variá- vel maior seja 15 e que o valor de soma seja 20, a saída produzida seria a seguinte: Maior valor: 15 Resultado: 20 3.2.3 formatação de entrada e saída As linguagens de programação possibilitam definir como os dados deverão ser apresentados, ou seja, como as informações deverão ser fornecidas na entrada de dados e como os resul- tados deverão ser dispostos na saída. Ao escrever um algoritmo, deve-se analisar somente quais as ações que devem integrá-lo para que represente uma solução adequada e correta para o problema que se pretende solucionar. Não é aconselhável definir formatos de entrada e saída neste momento, deixando para fazê-lo na tradução do algoritmo para uma linguagem de programação específica. Por isso, a pseudolinguagem utilizada ao longo deste livro não define a formatação de entrada e de saída de dados, deixando para mostrá-la nas seções específicas das linguagens Pascal e C. 3.3 comando de atribuição No comando de atribuição, o resultado de uma expressão é atribuído a uma variável, ou seja, é colocado no espaço de memória reservado para essa variável. Se já existia algum valor armazenado na variável, ele é substituído pelo novo valor, e o valor anterior é perdido. Na pseudolinguagem, um comando de atribuição tem à esquerda o nome da variável que vai receber o valor, seguido de uma flecha direcionada para a esquerda, seguida à direita pela expressão cujo valor vai ser utilizado na atribuição. O sentido da flecha representa visualmente que o resultado da expressão é colocado na variável: <variável> ← <expressão> Capítulo 3 Algoritmos Sequenciais 61 Somente um nome de variável pode ser colocado à esquerda em um comando de atribuição. A execução do comando inicia avaliando a expressão à direita, colocando depois seu resulta- do na variável à esquerda. Por exemplo, no comando: a ← b + 1 o resultado da expressão b + 1 é atribuído à variável a. O tipo da variável que vai receber a atribuição deve ser compatível com o resultado da expres- são à direita. Dependendo do tipo dessa variável, três tipos de atribuição são identificados, os quais são analisados a seguir. 3.3.1 atribuição numérica Se a variável for numérica, o valor da expressão deve ser também um valor numérico. O valor a ser atribuído à variável pode ser (1) informado diretamente através de um número, (2) o valor armazenado em outra variável numérica ou (3) o resultado de uma expressão aritmética. Pode ser utilizada qualquer expressão aritmética, incluindo nomes de variáveis e chamadas a funções. O nome da variável à qual vai ser atribuído o valor pode também ser utilizado na expressão aritmética – nesse caso, a expressão é avaliada com o valor que a variável conti- nha antes da execução do comando, sendo esse valor perdido ao ser feita a atribuição do novo valor. O tipo do valor a ser atribuído à variável deve ser compatível com o tipo da variável que vai receber a atribuição. Assim, variáveis inteiras devem receber valores inteiros, e variáveis reais devem receber valores reais. Uma exceção a essa regra, entretanto, é a atribuição de valores inteiros a variáveis reais. Vamos supor que foram declaradas as seguintes variáveis: i, k (inteiro) a, r (real) Utilizando essas variáveis, os comandos de atribuição a seguir são válidos: i ← 10 { i RECEBE O VALOR 10 } i ← k { i RECEBE O VALOR DA VARIÁVEL k } i ← k – 2 { i RECEBE VALOR DA EXPRESSÃO ARITMÉTICA k – 2} i ← i + k – 7 { VARIÁVEL PODE SER UTILIZADA NA EXPRESSÃO } a ← 10 { VARIÁVEL REAL PODE RECEBER VALOR INTEIRO } a ← 3,14 * sqr(r) { EXPRESSÃO π.r2 UTILIZANDO CHAMADA À FUNÇÃO } Os comandos de atribuição a seguir são inválidos: i ← a { VARIÁVEL INTEIRA NÃO PODE RECEBER VALOR REAL} i ← i + a { EXPRESSÃO TEM RESULTADO REAL POIS a É REAL } i ← a > r { EXPRESSÃO NÃO PODE SER LÓGICA } a + b ← a { NO LADO ESQUERDO NÃO PODE TER EXPRESSÃO } a, b ← 0 { SOMENTE UMA VARIÁVEL NO LADO ESQUERDO } 62 Algoritmos e Programação com Exemplos em Pascal e C Uma construção bastante comum é a variável que vai receber o valor da atribuição ser tam- bém utilizada na expressão à direita do sinal de atribuição. Nesses casos, a expressão é avalia- da utilizando o valor contido na variável e, terminada a avaliação da expressão, seu resultado é colocado na variável, alterando então seu valor. Por exemplo, supondo que a variável a é inteira e contém o valor 5, o valor contido em a, após a execução do comando de atribuição a seguir, é 8: a ← a + 3 3.3.2 atribuição lógica Se a variável à esquerda do comando de atribuição for lógica, ela poderá receber somente um dos dois valores lógicos: verdadeiro ou falso. O valor lógico a ser atribuído pode (1) ser re- presentado explicitamente através de uma dessas duas palavras reservadas, (2) ser o conteúdo de outra variável lógica ou (3) resultar da avaliação de uma expressão lógica. Considerar as seguintes declarações: i, k (inteiro) x, y (lógico) Os exemplos a seguir são comandos de atribuição lógica válidos: x ← verdadeiro { VALOR LÓGICO INFORMADO EXPLICITAMENTE } x ← y { x RECEBE VALOR LÓGICO DE y } x ← i = k { x verdadeiro SE i IGUAL A k } x ← i > 7 ou y { x RECEBE RESULTADO DA EXPRESSÃO LÓGICA } Os comandos a seguir são inválidos: x ← i { i É INTEIRO, NÃO É VALOR LÓGICO } x ← x > 7 { ERRO NA EXPRESSÃO LÓGICA } x ← k + 1 { EXPRESSÃO TEM VALOR INTEIRO, NÃOLÓGICO } 3.3.3 atribuição de caracteres Se a variável for do tipo caractere, a expressão à direita deve resultar em um caractere; se a variável for do tipo string, a expressão deve resultar em uma string. Considerar que foram declaradas as seguintes variáveis: nome (string) letra, letra2 (caractere) Utilizando essas variáveis, os exemplos a seguir mostram comandos de atribuição válidos: nome ← 'Ana Terra' { STRING ATRIBUÍDA À VARIÁVEL nome } letra ← 'Z' { letra RECEBE CARACTERE 'Z' } letra ← letra2 { letra RECEBE CARACTERE DE letra2 } Capítulo 3 Algoritmos Sequenciais 63 Ainda utilizando as mesmas variáveis, os comandos a seguir são inválidos: nome ← 10 { STRING NÃO PODE RECEBER VALOR NUMÉRICO } letra ← i > 2 { CARACTERE NÃO PODE RECEBER VALOR LÓGICO } letra ← nome { VARIÁVEL CARACTERE NÃO PODE RECEBER STRING } letra ← letra + 10 { EXPRESSÃO À DIREITA ESTÁ INCORRETA} Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR O comando de entrada permite que o algoritmo possa receber dados informados pelo usuário, que serão utilizados pelo algoritmo em seu processamento. Da mesma forma, o comando de saída permite ao usuário ter acesso aos resultados do processamento, mostrando mensagens e valores das variáveis e constantes. Assista ao vídeo para conhecer um pouco mais sobre esse tema. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Uma empresa da indústria automotiva recebeu como doação um forno para moldar ponteiras de eixo por calor, um equipamento importado muito antigo, que foi desenvolvido pelos funcionários de uma empresa americana. Esse equipamento utiliza um termômetro com a medida em Fahrenheit. Em função da dificuldade encontrada pelos operadores em realizar a conversão que não faz parte da medida utilizada no Brasil, a empresa está buscando um programador para desenvolver um algoritmo que receba a temperatura do operador em graus Celsius, converta-a em Fahrenheit e exiba a informação em Fahrenheit para o operador do equipamento. A) Entrada: Leia(Celsius) Saída: Escreva(Fahrenheit) B) Entrada: Leia (Fahrenheit) Saída: Escreva(Celsius) C) Entrada: Leia (Fahrenheit,Celsius) Saída: Escreva(Fahrenheit) D) Entrada: Não possui comandos de entrada Saída: Escreva(Fahrenheit) E) Entrada: Leia (Celsius) Saída: Não possui comandos de saída 2) Uma empresa necessita calcular o salário reajustado do funcionário. Para isso, analise os algoritmos abaixo, e assinale o que traz as diretrizes solicitadas pela empresa listadas abaixo: - O valor do salário bruto será informado pelo usuário. - Todos os funcionários recebem um bônus de 20% sobre o valor do salário bruto como presente de final de ano. - Após o acréscimo do bônus, deverá ser descontado o imposto de 7% do salário reajustado. Ao término do algoritmo, deverá ser impresso na tela o valor final do salário com o bônus e depois o valor reajustado do salário do funcionário. Regras: Conteúdo interativo disponível na plataforma de ensino! A) Estão corretas as alternativas I e II. B) Apenas a alternativa I. C) Estão corretas as alternativas I e III. D) Todas as alternativas. E) Nenhuma das alternativas. Considerando-se os comandos de entrada, comandos de saída e atribuição, analise as sentenças apresentadas abaixo. I. O comando de saída é utilizado para mostrar os dados na tela ou na impressora. 3) II. O comando de entrada é utilizado para receber dados digitados pelo usuário, que serão armazenados em variáveis. III. O comando de entrada é representado pela palavra reservada Leia ou Ler, e o comando de saída é representado por Escreva ou Imprima. É INCORRETO apenas o que se afirma em: A) Alternativa I. B) Alternativas I e II. C) Alternativas I e III. D) Todas as alternativas. E) Nenhuma alternativa. 4) São dados os seguintes blocos aplicados na representação em fluxograma: Quais figuras podem ser utilizadas para representar comandos de entrada? A) Figuras 1, 2 e 3. B) Figuras 3 e 4. C) Figuras 2, 5 e 6. D) Figuras 4, 5 e 6. E) Figura 2. 5) Os comandos de entrada e saída utilizam periféricos para introduzir os dados para serem processados e visualizar os dados após serem processados. Os periféricos de entrada enviam a informação para o computador, e os periféricos de saída transmitem a informação do computador para o usuário. Para isso, temos vários dispositivos-padrão utilizados como periféricos de entrada e de saída, e até mesmo periféricos que servem tanto para entrada como para saída (discos de armazenamento). Selecione o periférico básico que é considerado periférico de saída. A) Teclado. B) Mouse. C) Leitor de código de barras. D) Impressora. E) Câmera de vídeo. NA PRÁTICA Quanto de ração meus cachorros consomem? Quanto devo comprar? Para quantos dias duram a ração que comprei? Vamos desenvolver um algoritmo para auxiliar na questão de cálculo de quantos dias dura a raç - A ração comprada é em quilos - A quantidade diária consumida pelo cachorro é sempre a mesma. - A quantidade de ração consumida diariamente é medida em gramas. - Temos 2 cachorros - Cada cachorro consome quantidade diferente de ração, em função do seu tamanho. Ex: Cachorro 1 consome 300 gramas e o Cachorro 2 consome 100 gramas diárias. Quais serão os dados de entrada necessários para resolver o problema? Quantos quilos de ração foram comprados? Quantas gramas eles consomem diariamente: o cachorro1 e o cachorro2? Quais serão os dados de saída do problema? O Número de dias que a ração comprada vai durar para alimentar os 2 cachorros. Uma solução proposta: Algoritmo "consumo" Var Racao, cachorro1, cachorro2, Consumo_cachorro1, Consumo_cachorro2, Total_consumo_dia, Dias: real Inicio Escreva("Digite a quantidade de ração comprada ( em quilos):" ) Leia (Racao) Escreva("Digite a quantidade de ração consumida Cachorro 1 ( em gramas) por dia:”) Leia (cachorro1) Escreva("Digite a quantidade de ração consumida Cachorro 2 ( em gramas) por dia:”) Leia (cachorro2) // agora já temos os dados de entrada, podemos realizar as atribuições(cálculos) // calcula a quantidade de quilos consumidos por cada cachorro Consumo_cachorro1 <- cachorro1/1000 Consumo_cachorro2 <- cachorro2/1000 // soma o total de quilos consumidos pelos 2 animais Total_consumo_dia <- Consumo_cachorro1 + Consumo_cachorro2 // em quilos // calcula quantos dias vai dar a quantidade de ração comprada Dias <- Racao / Total_consumo_dia Escreva("Total de dias de duração da ração comprada : ” , Dias) Fimalgoritmo Em Fluxograma como ficaria a solução? O que o algoritmo necessita de dado de entrada para resolver o problema? Quais serão os dados de saída que o algoritmo vai mostrar para o usuário? O que precisamos exibir como saída? SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Lógica de programação - comandos de entrada e saída de dados Assista o vídeo e aprenda mais sobre os comandos de entrada e saída de dados. Conteúdo interativo disponível na plataforma de ensino! Algoritmos em pseudocódigo e visualg Veja nesse material sobre Pseudocódigo e Visualg (ferramenta para criação de algoritmos), Conteúdo interativo disponível na plataforma de ensino! Utilizando o MOD Veja esse vídeo aula sobre operadores aritméticos, em especial sobre o resto da divisão (MOD) e a diferença entre ele e a divisão. Conteúdo interativo disponível na plataforma de ensino! Conceitos básicos e tipos de dados APRESENTAÇÃO Nesta unidade, estudaremos a representação interna de dados em um computador, declaração de variáveis, constantes e definição de tipos de dados básicos que são aplicados no desenvolvimento de algoritmos. Bons estudos. Ao final destaUnidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Reconhecer a representação interna de dados em um computador.• Diferenciar variáveis e constantes.• Demonstrar de forma correta os tipos de dados na solução de problemas.• DESAFIO Pensar é preciso e muito!! .... para que os nossos algoritmos manipulem os seus dados corretamente e gerem como saída dados corretos e confiáveis. Assim, vamos analisar uma situação para auxiliar uma família a controlar seus gastos de forma cronológica (por dia), necessitando, desta forma, um auxílio para gerenciar e organizar as suas despesas durante este mês. Ao final, a família deseja receber a informação do total gasto com todas as despesas e quais as despesas que ainda não estão quitadas, informando o valor total já quitado e o valor total ainda não quitado das despesas do mês. Levando em consideração o problema apresentado, responda: a) Declare todas as variáveis/constantes necessárias para solucionar o problema ( conforme regras apresentadas na unidade para definição dos identificadores) e faça uma pequena descrição sobre qual a sua função/descrição no problema apresentado. b) Defina os tipos de cada identificador(variável/constante) declarado na letra a, conforme sintaxe apresentada na unidade de aprendizagem. c) Justifique o porquê da escolha de cada tipo de dado para as variáveis/constantes definidas na letra b. d) Descreva qual será o conjunto de dados que cada identificador definido na letra b poderá receber para a solução do problema proposto. INFOGRÁFICO O esquema mostra os principais temas que serão abordados nesta unidade. CONTEÚDO DO LIVRO Para a construção de algoritmos e programas eficientes e eficazes, precisamos compreender e manipular de forma correta todos os dados gerenciados por ele. Os dados em um computador devem ser armazenados de acordo com o tipo de informação que se deseja representar e com o tipo de operação que será realizada com este dado. Desta forma, a representação correta e adequada de uma informação permite a otimização dos recursos computacionais disponíveis, assim como acelerar o seu processamento. Para auxiliá-lo, acompanhe um trecho da obra Algoritmos e Programação com exemplos em Pascal e C de Nina Edelweiss. O livro servirá como base para a nossa Unidade de Aprendizagem. Neste segundo Capítulo, será apresentada a forma de definição e manipulação dos dados que são necessários para a solução de problemas através de algoritmos. Boa leitura. 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 ■ ■ Este primeiro capítulo discute algoritmos, formas de expressar algoritmos, etapas para a construção de um algoritmo e de um programa, paradigmas de programação, programação estruturada e fundamentos de representação interna de dados. Introduz, ainda, as linguagens de programação Pascal e C, utilizadas no livro. fundamentos capítulo 1 6 Algoritmos e Programação com Exemplos em Pascal e C Computadores constituem uma poderosa ferramenta para auxiliar o trabalho do homem. O uso mais comum dos computadores é por meio de aplicativos já desenvolvidos e disponíveis, tais como editores de texto, planilhas eletrônicas, sistemas de gerenciamento de bancos de dados, programas de acesso à Internet e jogos. Entretanto, por vezes, as pessoas desenvol- vem soluções específicas para determinadas aplicações, de modo a permitir que as informa- ções dessas aplicações possam ser acessadas e manipuladas de forma mais segura, rápida e eficiente ou com um custo mais baixo. Este livro trata dessa segunda forma de uso dos com- putadores, ou seja, de como um usuário pode projetar e desenvolver soluções próprias para resolver problemas específicos de seu interesse. Este primeiro capítulo apresenta alguns conceitos básicos utilizados no restante do livro: o que vem a ser um algoritmo, formas de expressar algoritmos, etapas para a construção de um algoritmo e de um programa, algumas considerações a respeito das linguagens de programa- ção utilizadas, o que vem a ser a programação estruturada, que é a técnica de programação adotada no desenvolvimento dos programas aqui apresentados, e alguns fundamentos de representação interna de dados. 1.1 o que é um algoritmo Vejamos como são solucionados alguns problemas do cotidiano. exemplo 1: Telefone público. Para utilizar um telefone público como um “orelhão” ou similar, as operações que devemos realizar estão especificadas junto a esse telefone, sendo mais ou menos assim: 1. leve o fone ao ouvido; 2. insira seu cartão no orifício apropriado; 3. espere o sinal para discar; 4. assim que ouvir o sinal, disque o número desejado; 5. ao final da ligação, retorne o fone para a posição em que se encontrava; 6. retire seu cartão. Esse conjunto de operações é o que se denomina algoritmo. Qualquer pessoa pode executar essas operações, na ordem especificada, para fazer suas ligações telefônicas, desde que pos- sua um cartão específico e conheça o número para o qual quer telefonar. exemplo 2: Compra de um livro. Uma compra em um estabelecimento comercial também obedece a uma sequência de ações predeterminadas. Por exemplo, para comprar um livro em uma livraria deve-se: 1. entrar na livraria; 2. verificar se o livro está disponível. Para isso, precisa-se conhecer (1) o título e o autor do livro e (2) ter disponibilidade financeira para a compra. Caso a compra venha a ser efetu- ada, deve-se: a. levar o livro até o balcão; b. esperar que a compra seja registrada no caixa; Capítulo 1 Fundamentos 7 c. pagar o valor correspondente; d. esperar que seja feito o pacote; e. levar o livro comprado. 3. sair da livraria. Os dois exemplos apresentados são resolvidos por uma sequência de ações bem definidas, que devem ser executadas em uma determinada ordem. Outras aplicações de nosso dia a dia podem ser detalhadas de forma semelhante: uma receita de um bolo, o acesso a terminais eletrônicos de bancos, a troca do pneu de um carro, etc. definição de algoritmo. Um algoritmo é definido como uma sequência finita de opera- ções que, quando executadas na ordem estabelecida, atingem um objetivo determinado em um tempo finito. Um algoritmo deve atenderaos seguintes requisitos: ■ possuir um estado inicial; ■ consistir de uma sequência lógica finita de ações claras e precisas; ■ produzir dados de saída corretos; ■ possuir estado final previsível (deve sempre terminar). Além de definir algoritmos para resolver problemas do dia a dia, podemos também desenvol- ver algoritmos que podem ser transformados, total ou parcialmente, em programas e execu- tados em computadores. Este livro concentra-se em problemas resolvidos através de algorit- mos que podem ser integralmente executados por computadores. 1.1.1 algoritmos executados por um computador Para que um algoritmo possa ser totalmente executado por um computador é necessário identificar claramente quais as ações que essa máquina pode executar. O exemplo a seguir permite identificar, através de uma simulação, algumas das ações básicas que um computa- dor executa e como isso é feito. Vamos supor que um professor, na sala de aula, mostre aos alunos como é calculada a média das notas de uma prova. Para simplificar, suponhamos que a turma tenha somente cinco alunos. As provas estão sobre sua mesa, já corrigidas. O professor desenha uma grade no quadro, dando nome a cada um dos espaços nos quais vai escrever a nota de cada aluno: Nota1, Nota2, etc. (Figura 1.1). Acrescenta mais um espaço para escrever os resultados de seus cálculos, que chama de Resultado. Para formalizar o que está fazendo, ele escreveu a sequência de ações que está executando em uma folha sobre sua mesa. Ele inicia pegando a primeira prova, olha sua nota (vamos supor que seja 10) e escreve essa nota no espaço reservado para ela, que chamou de Nota1. Essa prova ele coloca em uma segunda pilha sobre a mesa, pois já foi usada e não deve ser considerada uma segunda vez para calcular a média. Em seguida, faz o mesmo para a segun- da prova (nota 8), escrevendo seu valor em Nota2 e colocando-a na pilha das já utilizadas. Ele repete essa operação para cada uma das provas restantes. 8 Algoritmos e Programação com Exemplos em Pascal e C Obtidas todas as notas das provas, o professor passa a realizar as operações que vão calcular a média. Inicialmente, precisa somar todas as notas. Em cima da sua mesa, está uma cal- culadora. Ele consulta cada um dos valores das notas que escreveu no quadro e utiliza essa calculadora para fazer sua soma: Soma = Nota1 + Nota2 + Nota3 + Nota4 + Nota5 O resultado da soma ele escreve no espaço que chamou de Resultado (Figura 1.2a). Feita a soma, ela deve ser dividida por cinco para que seja obtida a média das notas. Utili- zando novamente a calculadora, o professor consulta o que escreveu no espaço Resultado (onde está a soma) e divide este valor por cinco. Como não vai mais precisar do valor da soma, o professor utiliza o mesmo espaço, chamado Resultado, para escrever o valor obtido para a média, apagando o valor anterior (Figura 1.2b). Finalizando, o professor escreve as cinco notas obtidas nas provas e a média em uma folha, utilizando uma máquina de escrever, para informar à direção da escola. 7 Xxxx Xxxx xxxx Qweqweq wewerwr tyutu6 hjhk567 123456 Máquina de escrever Máquina de calcular Sequência de ações Provas corrigidas 10 8 7 Nota1 Nota2 Nota3 Nota4 Nota5 Resultado Quadro Professor 8 Xxxx Xxxx xxxx Provas já usadas figura 1.1 Simulação de um algoritmo. Capítulo 1 Fundamentos 9 A sequência de ações que foram executadas foi a seguinte: 1. ler a nota da primeira prova e escrevê-la em Nota1; 2. ler a nota da prova seguinte e escrevê-la em Nota2; 3. ler a nota da prova seguinte e escrevê-la em Nota3; 4. ler a nota da prova seguinte e escrevê-la em Nota4; 5. ler a nota da prova seguinte e escrevê-la em Nota5; 6. somar os valores escritos nos espaços Nota1, Nota2, Nota3, Nota4 e Nota5. Escrever o resultado da soma em Resultado; 7. dividir o valor escrito em Resultado por cinco e escrever o valor deste cálculo em Resultado; 8. usando a máquina de escrever, escrever os valores contidos em Nota1, Nota2, Nota3, Nota4, Nota5 e Resultado; 9. terminar a execução desta tarefa. Essa sequência de operações caracteriza um algoritmo, sendo que todas as ações realizadas nesse algoritmo podem ser executadas por um computador. A tradução desse algoritmo para uma linguagem que um computador possa interpretar gera o programa que deve ser exe- cutado pelo computador. O professor corresponde à unidade central de processamento (UCP ou, mais comumente, CPU, de Central Processing Unit), responsável pela execução desse pro- grama. Essa unidade organiza o processamento e garante que as instruções sejam executadas na ordem correta. 10 8 7 5 9 39 10 8 7 5 9 7,8 (a) (b) Quadro Quadro Nota1 Nota2 Nota3 Nota4 Nota5 Resultado Nota1 Nota2 Nota3 Nota4 Nota5 Resultado figura 1.2 Valores durante a simulação. 10 Algoritmos e Programação com Exemplos em Pascal e C Fazendo um paralelo entre o exemplo e um computador real, os espaços desenhados na gra- de do quadro constituem a memória principal do computador, que é composta por espaços acessados pelos programas através de nomes dados pelo programador. Nesses espaços são guardadas, durante o processamento, informações lidas na entrada e re- sultados de processamentos, como no exemplo visto. Cada um desses espaços só pode conter um valor a cada momento, perdendo o valor anterior se um novo valor for armazenado nele, como ocorreu quando se escreveu a média em Resultado, apagando o valor da soma que lá estava. Denomina-se variável cada um desses espaços utilizados para guardar valores, denotando que seu valor pode variar ao longo do tempo. As instruções de um programa que está sendo executado também são armazenadas na memória principal. Todas as informações armazenadas nas variáveis da memória principal são perdidas no momento em que termina a execução do programa. Unidades de memória secundária podem ser utilizadas para guardar informações (dados) a fim de serem utilizadas em outra ocasião. Exemplos de dispositivos de memória secundária são HDs (Hard Disks), CDs, DVDs e pendrives. A comunicação do computador com o usuário durante o processamento e ao seu final é feita através de unidades de entrada e saída. No exemplo anterior, a pilha de provas corresponde à unidade de entrada do computador, através da qual são obtidos os valores que serão utili- zados no processamento. A unidade de entrada mais usada para interação entre o usuário e o programa durante a execução é o teclado do computador. Quando se trata de imagens, a unidade de entrada pode ser, por exemplo, uma máquina fotográfica ou um scanner. A máquina de escrever corresponde à unidade de saída, que informa aos usuários o resul- tado do processamento. Exemplos de unidades de saída são o vídeo do computador e uma impressora. As unidades de entrada e saída de dados constituem as únicas interfaces do computador com seu usuário. Observe que, sem as unidades de entrada e saída, não é possível fornecer dados ao computador nem saber dos resultados produzidos. A máquina de calcular corresponde à unidade aritmética e lógica do computador, responsá- vel pelos cálculos e inferências necessários ao processamento. Sua utilização fica totalmente transparente ao usuário, que somente é informado dos resultados do processamento. Resumindo, um computador processa dados. Processar compreende executar atividades como, por exemplo, comparações, realização de operações aritméticas, ordenações. A partir de dados (de entrada), processando-os, o computador produz resultados (saídas). Na figu- ra 1.3, vê-se um esquema simplificado da organização funcional de um computador. Nela podem ser observados os sentidos em que as informações fluem durante a execução de um programa: o sistema central do computador compreende a CPU e a memória principal; na CPU estão as unidades de controle e de aritmética e lógica; a unidade de controle tem acesso à memória principal, às unidades de entrada e de saída de dados e aos dispositivos de me- mória secundária. Capítulo1 Fundamentos 11 1.1.2 comandos básicos executados por um computador Analisando o exemplo anterior, identificamos as primeiras ações que podem ser executadas por um computador: ■ obter um dado de uma unidade de entrada de dados, também chamada de leitura de um dado; ■ informar um resultado através de uma unidade de saída, também chamada de escrita de uma informação ou saída de um dado; ■ resolver expressões aritméticas e lógicas; ■ colocar o resultado de uma expressão em uma variável. Essas ações são denominadas instruções ou comandos. Outros comandos serão vistos ao longo deste livro. 1.1.3 da necessidade do desenvolvimento de algoritmos para solucionar problemas computacionais Nas atividades cotidianas já vistas, é sem dúvida necessária alguma organização por parte de quem vai realizar a tarefa. No uso do telefone, retirar o fone do gancho e digitar o número e, só depois, inserir o cartão não será uma boa estratégia, assim como, no caso da livraria, levar o livro sem passar pelo caixa também resultará em problemas. Nessas atividades, no entanto, grande parte das pessoas não necessita colocar por escrito os passos a realizar para cumprir a tarefa. Porém, quando se trata de problemas a solucionar por computador, a sequência de Unidade de entrada Unidade de saída Unidade de memória auxiliar Memória principal Unidade Central de Processamento - UCP Sistema central Unidade aritmética e lógica Unidade de controle figura 1.3 Esquema simplificado de um computador. 12 Algoritmos e Programação com Exemplos em Pascal e C ações que o computador deve realizar é por vezes bastante extensa e nem sempre conhecida e óbvia. Para a programação de computadores, a análise cuidadosa dos elementos envolvidos em um problema e a organização criteriosa da sequência de passos necessários à sua solução (algoritmo) devem obrigatoriamente preceder a escrita do programa que busque solucionar o problema. Para problemas mais complexos, o recomendável é desenvolver um algoritmo detalhado antes de passar à etapa de codificação, mas para problemas mais simples, o algo- ritmo pode especificar apenas os passos principais. 1.1.4 formas de expressar um algoritmo Em geral, no desenvolvimento de algoritmos computacionais não são utilizadas nem as lin- guagens de programação nem a linguagem natural, mas formas mais simplificadas de lingua- gens. As formas mais usuais de representação de algoritmos são a linguagem textual, alguma pseudolinguagem e o fluxograma. Para exemplificar cada uma delas vamos usar o seguinte exemplo: obter a soma de dois valores numéricos quaisquer. linguagem textual. Foi a forma utilizada para introduzir o conceito de algoritmo nos exem- plos anteriores. Analisando o problema aqui colocado, para obter a soma de dois valores é preciso realizar três operações na ordem a seguir: 1. obter os dois valores 2. realizar a soma 3. informar o resultado pseudolinguagem. Para padronizar a forma de expressar algoritmos são definidas pseu- dolinguagens. Uma pseudolinguagem geralmente é bastante semelhante a uma linguagem de programação, sem, entretanto, entrar em detalhes como, por exemplo, formatação de in- formações de entrada e de saída. As operações básicas que podem ser executadas pelo com- putador são representadas através de palavras padronizadas, expressas na linguagem falada (no nosso caso, em Português). Algumas construções também são padronizadas, como as que especificam onde armazenar valores obtidos e calculados, bem como a forma de calcular expressões aritméticas e lógicas. Antecipando o que será visto nos capítulos a seguir, o algoritmo do exemplo recém-discutido é expresso na pseudolinguagem utilizada neste livro como: Algoritmo 1.1 – Soma2 {INFORMAR A SOMA DE 2 VALORES} Entradas: valor1, valor2 (real) Saídas: soma (real) início ler (valor1, valor2) {ENTRADA DOS 2 VALORES} soma ← valor1 + valor2 {CALCULA A SOMA} escrever (soma) {INFORMA A SOMA} fim Capítulo 1 Fundamentos 13 fluxograma. Trata-se de uma representação gráfica que possibilita uma interpretação visual do algoritmo. Cada ação é representada por um bloco, sendo os blocos interligados por linhas dirigidas (setas) que representam o fluxo de execução. Cada forma de bloco representa uma ação. A Figura 1.4 mostra alguns blocos utilizados em fluxogramas neste livro, juntamente com as ações que eles representam. São adotadas as formas propostas na padronização feita pela ANSI (American National Standards Institute) em 1963 (Chapin, 1970), com algumas adaptações. Outras formas de blocos serão introduzidas ao longo do texto. A representação do algoritmo do exemplo acima está na Figura 1.5. A representação através de fluxogramas não é adequada para algoritmos muito extensos, com grande número de ações a executar. Utilizaremos a representação de fluxogramas so- mente como apoio para a compreensão das diferentes construções que podem ser utilizadas nos algoritmos. 1.1.5 eficácia e eficiência de algoritmos Dois aspectos diferentes devem ser analisados quando se constrói um algoritmo para ser exe- cutado em um computador: sua eficácia (exatidão) e sua eficiência. eficácia (corretude) de um algoritmo. Um algoritmo deve realizar corretamente a tarefa para a qual foi construído. Além de fazer o que se espera, o algoritmo deve fornecer o resul- tado correto para quaisquer que sejam os dados fornecidos como entrada. A eficácia de um algoritmo deve ser exaustivamente testada antes que ele seja implementado em um compu- tador, o que levou ao desenvolvimento de diversas técnicas de testes, incluindo testes formais. A forma mais simples de testar um algoritmo é através de um “teste de mesa”, no qual se si- ENTRADA lista de variáveis variável expressão Ponto em que inicia a execução do algoritmo. Ponto em que termina a execução do algoritmo. Entrada de dados: leitura de informações para preencher a lista de variáveis. Saída de dados: informa conteúdos das variáveis da lista. Atribuição: variável recebe o resultado da expressão. início fim SAÍDA lista de variáveis figura 1.4 Blocos de fluxograma. 14 Algoritmos e Programação com Exemplos em Pascal e C mula com lápis e papel sua execução, com conjuntos diferentes de dados de entrada. No final de cada capítulo deste livro, são indicados alguns cuidados a adotar para verificar a exatidão dos algoritmos durante os testes. eficiência de um algoritmo. A solução de um problema através de um algoritmo não é necessariamente única. Na maioria dos casos, algoritmos diferentes podem ser construídos para realizar uma mesma tarefa. Neste livro será enfatizada a utilização de técnicas que levam à construção de algoritmos mais eficientes. Entretanto, em alguns casos não se pode dizer a priori qual a melhor solução. Pode-se, sim, calcular qual a forma mais eficiente, com base em dois critérios: tempo de execução e espaço de memória ocupado. Aspectos de eficiência de algoritmos são vistos em outro livro desta série (Toscani; Veloso, 2012). Um exemplo da diferença entre eficácia e eficiência pode ser observado na receita de ovo mexido mostrada a seguir: 1. ligar o fogão em fogo baixo; 2. separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto; 3. quebrar o ovo em uma tigela; 4. colocar sal na tigela; 5. misturar levemente o ovo e o sal, com um garfo; 6. aquecer a manteiga na frigideira até que comece a derreter; 7. jogar o ovo na frigideira, mexendo com uma colher até ficar firme; 8. retirar da frigideira e servir. ENTRADA valor1, valor2 soma valor1 + valor2 início fim SAÍDA soma figura 1.5 Fluxograma da soma de dois números. Capítulo 1 Fundamentos 15 Se analisarmos o algoritmo acima, podemos observar que, embora o ovo mexido seja obtido, garantindo a eficácia da receita, existe uma clara ineficiência em relação ao gasto de gás, uma vez que ligar o fogão não é pré-requisito para a quebra do ovo e mistura do ovo e do sal. Já em outras ações, como as especificadas nos passos 3 e 4,a sequência não é relevante. Se modificarmos apenas a sequência das ações, conforme indicado abaixo, então teremos um algoritmo eficaz e mais eficiente: 1. separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto; 2. quebrar o ovo em uma tigela; 3. colocar sal nesta tigela; 4. misturar levemente o ovo e o sal, com um garfo; 5. ligar o fogão em fogo baixo; 6. aquecer a manteiga na frigideira até que comece a derreter; 7. jogar o ovo na frigideira, misturando com uma colher até ficar firme; 8. retirar da frigideira e servir. 1.2 etapas de construção de um programa A construção de um algoritmo para dar suporte computacional a uma aplicação do mundo real deve ser feita com todo cuidado para que ele realmente execute as tarefas que se quer de forma correta e em tempo razoável. Programar não é uma atividade trivial, muito antes pelo contrário, requer muito cuidado e atenção. A dificuldade em gerar bons programas levou à definição de técnicas específicas que iniciam frequentemente com a construção de um algoritmo. A forma mais simples de garantir a qualidade de um programa é construí-lo seguindo uma série de etapas. Parte-se de uma análise inicial da realidade envolvida na aplicação, desenvol- vendo a solução de forma gradual, e chega-se ao produto final: um programa que executa as funcionalidades necessárias à aplicação. A seguir, são explicadas as etapas que devem ser cumpridas para assegurar a construção de um programa correto (Figura 1.6). Observe que este processo não é puramente sequencial, mas, em cada etapa, pode ser necessário voltar a alguma etapa anterior para desenvolver com mais detalhes algum aspecto. ■ análise detalhada do problema. Inicia-se com uma análise detalhada do problema, identificando os aspectos que são relevantes para a sua solução. No Algoritmo 1.1, o problema é: Informar a soma de dois valores. ■ especificação dos requisitos do problema. Nessa etapa são identificados e especi- ficados os resultados que deverão ser produzidos (saídas) e os dados que serão neces- sários para a execução da tarefa requerida (entradas). No Algoritmo 1.1, os dados de entrada e saída são: 16 Algoritmos e Programação com Exemplos em Pascal e C Entradas: dois valores numéricos, digitados via teclado. Saída: a soma dos dois valores, mostrada na tela. Esse é um problema simples, adequado à introdução dos conceitos iniciais. Contudo, na prática, não apenas os objetivos podem ser mais complexos como a identificação de en- tradas e saídas pode incluir formatos e valores válidos, bem como quantidades de valores e a especificação de outros dispositivos de entrada e saída. ■ construção de um algoritmo. A etapa seguinte é o projeto de um algoritmo que solucione o problema, ou seja, de um conjunto finito de ações que, quando executadas na ordem estabelecida, levem ao resultado desejado em um tempo finito. É importante notar que mesmo os problemas mais simples tendem a ter mais de uma solução possí- vel, devendo ser determinada a solução que será adotada. Nesta etapa já devem ser cria- dos nomes de variáveis que irão armazenar os valores de entrada e os valores gerados durante o processamento. O Algoritmo 1.1. representa uma possível solução alcançada nesta etapa. ■ validação do algoritmo. Em seguida, deve ser feita a validação lógica do algoritmo desenvolvido. Essa validação muitas vezes é feita através de um teste de mesa, ou seja, simulando sua execução com dados virtuais. Procura-se, através desses testes, verificar se a solução proposta atinge o objetivo. Devem ser feitos testes tanto com valores corretos como incorretos. No exemplo que está sendo utilizado aqui, os dados para testes devem incluir valores nulos, positivos e negativos, como por exemplo: Problema Entradas e saídas Verificação do programa Manutenção Construção do algoritmo Análise Validação do algoritmo Construção do programa figura 1.6 Etapas da construção de um programa. Capítulo 1 Fundamentos 17 Valor1 Valor2 Soma 0 0 0 26 12 38 -4 –10 –14 12 –10 2 -5 2 –3 ■ codificação do programa. É a tradução do algoritmo criado para resolver o problema para uma linguagem de programação. Os programas em Pascal e C gerados a partir do algoritmo desenvolvido para o exemplo (Algoritmo 1.1) são apresentados no Capítulo 3. ■ verificação do programa. Consiste nas verificações sintática (compilação) e semântica (teste e depuração) do programa gerado. Os mesmos valores utilizados no teste de mesa podem ser utilizados para testar o programa gerado. ■ manutenção. Uma vez considerado pronto, o programa passa a ser utilizado por usuá- rios. A etapa de manutenção do programa inicia no momento em que ele é liberado para execução, e acompanha todo seu tempo de vida útil. A manutenção tem por finalidade corrigir eventuais erros detectados, assim como adicionar novas funcionalidades. Cada uma dessas fases é importante, devendo ser respeitada e valorizada para se chegar a programas de qualidade. Neste sentido, aqui são fornecidos subsídios a fim de que todas as etapas sejam consideradas durante a escrita de programas como, por exemplo, a indicação de valores que devem ser utilizados nos testes de cada comando e conselhos para deixar os programas legíveis, de modo a facilitar a sua manutenção. 1.3 paradigmas de programação O programa realmente executado por um computador é escrito em uma linguagem com- preendida pela máquina, por isso denominada linguagem de máquina, na qual as instru- ções são codificadas no sistema de numeração binário. A utilização direta de linguagem de máquina é bastante complicada. Para tornar a escrita de programas mais acessível a usuá- rios comuns foram desenvolvidas linguagens de mais alto nível, denominadas linguagens de programação. São linguagens que permitem a especificação das instruções que deverão ser executadas pelo computador através de uma linguagem mais próxima da linguagem natural. Um programa escrito numa linguagem de programação, denominado programa-fonte, deve ser primeiro traduzido para linguagem de máquina, para só então ser executado pelo com- putador. A tradução do programa-fonte para o programa em linguagem de máquina corres- pondente é feita por um outro programa, específico para a linguagem utilizada, denominado compilador (Figura 1.7). Na busca de uma forma simples, clara e precisa de escrever programas, diversas linguagens de programação foram desenvolvidas nos últimos anos. Toda linguagem possui uma sintaxe bem definida, que determina as construções corretas a serem utilizadas para a elaboração de programas. Além disso, cada linguagem de programação utiliza um conjunto de concei- 18 Algoritmos e Programação com Exemplos em Pascal e C tos adotados na solução de problemas, o qual corresponde à semântica desta linguagem, ou seja, à forma como construções sintaticamente corretas são executadas. Esses conceitos possibilitam diferentes abordagens de problemas e formulações de soluções, isto é, seguem diferentes paradigmas de programação. A palavra “paradigma” corresponde a um modelo ou padrão de como uma realidade é entendi- da e de como se interage com essa realidade. Aqui, um paradigma de programação corresponde à forma como a solução está estruturada e será executada no programa gerado, incluindo téc- nicas e conceitos específicos, bem como os recursos disponibilizados. Os principais paradigmas das linguagens de programação são (Ghezzi; Jazayeri, 1987; Melo, Silva, 2003; Sebesta, 2003): ■ imperativo ou procedural, no qual um programa é composto por uma sequência de comandos a serem executados pelo computador em uma determinada ordem. Dentre as linguagens de programação voltadas a esse paradigma destacam-se Pascal, C, Fortran, Cobol, PL/1, Basic, Algol, Modula e Ada, entre outras; ■ funcional, em que um programa é composto pela declaração de funções que transfor- mam a(s) entrada(s) na(s) saída(s) desejada(s). Exemplos de linguagens funcionais são Lisp, ML, Miranda, Haskell eOCaml; ■ lógico, que utiliza a avaliação de condições lógicas como base para a escrita dos progra- mas. Um programa é composto por regras que disparam ações a partir da identificação de premissas. Um exemplo desse paradigma é a linguagem Prolog; ■ orientação a objetos, em que o mundo real é representado por meio de classes de objetos e das operações que podem ser realizadas sobre eles, as quais definem seu com- portamento. Herança e polimorfismo são conceitos básicos adotados nesse paradigma. Smalltalk, C++, Java, PascalOO, Delphi, C#, Eiffel e Simula são exemplos de linguagens orientadas a objetos. A forma de escrever um programa em cada um desses paradigmas é bastante diferente. Neste livro será considerado somente o paradigma imperativo ou procedural. Essa opção, para um primeiro curso em programação, justifica-se pelas seguintes razões: ■ o paradigma imperativo permite representar de uma forma intuitiva os problemas do dia a dia, que geralmente são executados através de sequências de ações; Programa-fonte Programa em linguagem de programação Programa em linguagem de máquina COMPILADOR Programa executável figura 1.7 Tradução de programa-fonte para executável. Capítulo 1 Fundamentos 19 ■ historicamente, os primeiros programas foram desenvolvidos utilizando linguagens impe- rativas, sendo esse um paradigma dominante e bem estabelecido; ■ existe um grande número de algoritmos e de sistemas implementados em linguagens que seguem esse paradigma, os quais podem ser utilizados como base para o desenvol- vimento de novos programas. A opção de utilizar as linguagens Pascal e C neste livro deu-se por serem essas as linguagens mais utilizadas como introdutórias à programação na maior parte dos cursos brasileiros de ciência da computação, informática e engenharia da computação. A linguagem Pascal foi definida por Niklaus Wirth em 1970 (Wirth, 1971, 1972, 1978) com a finalidade de ser utilizada em aplicações de propósito geral e, principalmente, para ensino de programação. Uma característica importante de Pascal é que foi, desde sua criação, pensada para dar suporte à programação estruturada. Pascal serviu de base para o desenvol- vimento de diversas outras linguagens de programação (Ghezzi; Jazayeri, 1987). Portanto, o aprendizado de novas linguagens de programação, sobretudo as que seguem o paradigma imperativo, se torna mais fácil para quem conhece Pascal. A linguagem C foi desenvolvida por Dennis Ritchie nos anos 1970 (Kernighan; Ritchie, 1988) com o propósito de ser uma linguagem para a programação de sistemas. É hoje largamente utilizada em universidades e no desenvolvimento de software básico. 1.4 programação estruturada A programação estruturada (Jackson, 1975) pode ser vista como um subconjunto do pa- radigma imperativo. Baseia-se no princípio de que o fluxo do programa deve ser estruturado, devendo esse fluxo ficar evidente a partir da estrutura sintática do programa. A estruturação deve ser garantida em dois níveis: de comandos e de unidades. No nível de comandos, a programação estruturada fundamenta-se no princípio básico de que um programa deve possuir um único ponto de entrada e um único ponto de saída, existindo de “1 a n” caminhos definidos desde o princípio até o fim do programa e sendo todas as ins- truções executáveis, sem que apareçam repetições (loops) infinitas de alguns comandos. Nes- se ambiente, o programa deve ser composto por blocos elementares de instruções (coman- dos), interconectados através de apenas três mecanismos de controle de fluxo de execução: sequência, seleção e iteração. Cada bloco elementar, por sua vez, é delimitado por um ponto de início – necessariamente no topo do bloco – e por um ponto de término – necessariamente no fim do bloco – de execução, ambos muito bem definidos. Os três mecanismos de controle do fluxo de execução estão representados na Figura 1.8 através de fluxogramas, nos quais se observa claramente os pontos de entrada e de saída de cada bloco de instruções. Alguns dos blocos que constam nessa figura serão vistos nos próximos capítulos deste livro. Uma característica fundamental da programação estruturada é que o uso de desvios incondi- cionais no programa, implementados pelo comando GOTO (VÁ PARA), é totalmente proibido. 20 Algoritmos e Programação com Exemplos em Pascal e C Embora esse tipo de comando, em alguns casos, possa facilitar a construção de um progra- ma, dificulta enormemente sua compreensão e manutenção. No nível de unidades, a programação estruturada baseia-se na ideia proposta em 1972 pelo cientista de computação E. W. Dijkstra: “A arte de programar consiste na arte de organizar e dominar a complexidade dos sistemas”. A programação estruturada enfatiza a utilização de unidades separadas de programas, chamadas de módulos, que são ativadas através de comandos especiais. Propõe que os programas sejam divididos em um conjunto de subpro- gramas menores, cada um com seu objetivo específico e bem definido, mais fáceis de imple- mentar e de testar (seguindo a tática de “dividir para conquistar”). O desenvolvimento de programas deve ser feito de forma descendente, com a decomposição do problema inicial em módulos ou estruturas hierárquicas, de modo a dividir ações comple- xas em uma sequência de ações mais simples, desenvolvidas de forma mais fácil. Essa técnica decorre da programação estruturada e é também conhecida como programação modular. Resumindo, a programação estruturada consiste em: ■ uso de um número muito limitado de estruturas de controle; ■ desenvolvimento de algoritmos por fases ou refinamentos sucessivos; ■ decomposição do algoritmo total em módulos. Essas técnicas para a solução de problemas visam à correção da solução desenvolvida, bem como à simplicidade dessa solução, garantindo uma melhor compreensão do que é feito e facilitando a manutenção dos programas por outras pessoas além do desenvolvedor inicial. Neste texto será utilizada a programação estruturada, incentivando o desenvolvimento de programas através de módulos, de forma a garantir a qualidade dos programas construídos (Farrer et al., 1999). Seguindo os preceitos da programação estruturada, comandos do tipo GOTO (VÁ PARA), que alteram o fluxo de execução incondicionalmente, não serão tratados neste livro. Sequência Seleção Iteração figura 1.8 Estruturas de controle de fluxo de execução na programação estruturada. Capítulo 1 Fundamentos 21 1.5 elementos de representação interna de dados Internamente, os computadores digitais operam usando o sistema numérico binário, que utiliza apenas os símbolos 0 e 1. Na memória e nos dispositivos de armazenamento, o com- ponente conceitual básico e a menor unidade de armazenamento de informação é o bit. Bit vem do Inglês binary digit, ou seja, dígito binário, e um bit pode memorizar somente um entre dois valores: zero ou um. Qualquer valor numérico pode ser expresso por uma sucessão de bits usando o sistema de numeração binário. Para representar caracteres, são utilizados códigos armazenados em conjuntos de bits. Os códigos mais comuns armazenam os caracteres em bytes, que são conjuntos de 8 bits. Nos códigos de representação de caracteres, cada caractere tem associado a si, por convenção, uma sequência específica de zeros e uns. Três códigos de representação de caracteres são bastante utilizados: ASCII (7 bits por caractere), EBCDIC (8 bits por caractere) e UNICODE (16, 32 ou mais bits). Tanto o ASCII (American Standard Code for Information Interchange), que é o código utiliza- do pela maioria dos microcomputadores e em alguns periféricos de equipamentos de grande porte, quanto o EBCDIC (Extended Binary Coded Decimal Interchange Code) utilizam um byte para representar cada caractere, sendo que, na representação do conjunto de caracteres ASCII padrão, o bit mais significativo (bit mais à esquerda) do byte é sempre igual a 0. A represen- tação dos caracteres A e Z nos dois códigos é: Caracteres EBCDIC ASCII A 11000001 0100 0001 Z 1110 1001 0101 1010 O UNICODE é promovido e desenvolvido pelo Unicode Consortium. Busca permitir aos com- putadores representar e manipular textos de forma consistente nos múltiplos sistemas de escrita existentes. Atualmente, ele compreende mais de 100.000 caracteres. Dependendo do conjunto de caracteres que esteja em uso em uma aplicação, um, dois ou mais bytes podem ser utilizados na representação dos caracteres. As unidades de medida utilizadas para quantificar a memória principal e indicar a capacidade de armazenamento de dispositivos são: K quilo (mil) 103 M mega (milhão) 106 G giga (bilhão) 109 T tera (trilhão) 1012 O sistema métrico de unidades de medida utiliza os mesmos prefixos, mas o valor exato de cada um deles em informática é levemente superior. Como o sistema de numeração utilizado 22 Algoritmos e Programação com Exemplos em Pascal e C internamente em computadores é o binário (base 2), as capacidades são representadas como potências de 2: K 1.024 210 M 1.048.576 220 etc... A grafia dos valores expressos em múltiplos de bytes pode variar. Assim, por exemplo, 512 quilobytes podem ser escritos como 512K, 512KB, 512kB ou 512Kb. Já os valores expressos em bits, via de regra, são escritos por extenso, como em 512 quilobits. 1.6 dicas Critérios que devem ser observados ao construir um algoritmo: ■ procurar soluções simples para proporcionar clareza e facilidade de entendimento do algoritmo; ■ construir o algoritmo através de refinamentos sucessivos; ■ seguir todas as etapas necessárias para a construção de um algoritmo de qualidade; ■ identificar o algoritmo, definindo sempre um nome para ele no cabeçalho. Este nome deve traduzir, de forma concisa, seu objetivo. Por exemplo: Algoritmo 1.1 – Soma2 indica, através do nome, que será feita a soma de dois valores; ■ definir, também no cabeçalho, o objetivo do algoritmo, suas entradas e suas saídas; ■ nunca utilizar desvios incondicionais, como GOTO (VÁ PARA). 1.7 testes Testes de mesa. É importante efetuar, sempre que possível, testes de mesa para verificar a efi- cácia (corretude) de um algoritmo antes de implementá-lo em uma linguagem de programa- ção. Nestes testes, deve-se utilizar diferentes conjuntos de dados de entrada, procurando usar dados que cubram a maior quantidade possível de situações que poderão ocorrer durante a utilização do algoritmo. Quando o algoritmo deve funcionar apenas para um intervalo defini- do de valores, é recomendável que se simule a execução para valores válidos, valores limítrofes válidos e inválidos e valores inválidos acima e abaixo do limite estabelecido. Por exemplo, se um determinado algoritmo deve funcionar para valores inteiros, no intervalo de 1 a 10, inclusive, o teste de mesa deveria incluir a simulação da execução para, no mínimo, os valores 0, 1, 10, 11 e um valor negativo. ■ ■ Este capítulo apresenta as unidades léxicas de linguagens de programação imperativas, como Pascal e C. Discute as declarações de variáveis, de constantes e de tipos, bem como a representação de expressões aritméticas e lógicas. Neste capítulo, e nos que o sucedem, todos os conceitos são apresentados e analisados inicialmente em linguagem algorítmica, sendo a seguir comentados e exemplificados em Pascal e C. constantes e expressões unidades léxicas, variáveis, capítulo 2 26 Algoritmos e Programação com Exemplos em Pascal e C Para que um algoritmo se transforme em um programa executável, é necessário que esse seja inicialmente traduzido para uma linguagem de programação pelo compilador corresponden- te, que irá gerar o programa a ser executado. Essa tradução é feita com base na gramática da linguagem. Nesse processo, cada símbolo, cada palavra e cada construção sintática utilizados no programa devem ser reconhecidos pelo compilador. Isso é possível porque toda linguagem de programação possui uma gramática bem definida que rege a escrita dos programas, ou seja, que define sua sintaxe. A primeira representação da gramática de uma linguagem de programação foi apresentada por John Backus, em 1959, para expressar a gramática da linguagem Algol. Esta notação deu origem à BNF (Backus-Naur Form ou Backus Normal Form) (Knuth, 2003; Wiki, 2012), que se tornou a forma mais utilizada para representar a gramática de linguagens de progra- mação. Neste livro, é utilizada uma forma simplificada da BNF (ver Apêndice) para representar a gramática da pseudolinguagem e das linguagens Pascal e C. As gramáticas das linguagens de programação imperativas são bastante parecidas no que se refere a unidades léxicas e comandos disponíveis. Esses elementos são apresentados a partir deste capítulo, que inicia apresentando as unidades léxicas de linguagens de programação imperativas. A seguir, ele mostra como devem ser feitas as declarações de variáveis, de cons- tantes e de tipos, incluindo a análise de diferentes tipos de variáveis e dos valores que podem conter. Por fim, esse capítulo apresenta as expressões aritméticas e lógicas e suas represen- tações. Outros tipos de declarações serão vistos mais adiante neste livro. Todos os conceitos são apresentados e analisados na linguagem algorítmica, sendo depois traduzidos para as linguagens de programação Pascal e C. 2.1 componentes das linguagens de programação Os componentes básicos de uma linguagem de programação são denominados unidades léxicas. As unidades léxicas mais simples, analisadas a seguir, são valores literais, identificado- res, palavras reservadas, símbolos especiais e comentários. 2.1.1 literais Literais são valores representados explicitamente no programa e que não mudam durante a execução. Podem ser números, valores lógicos, caracteres ou strings. números. Usualmente é utilizada a notação decimal para representar números nos progra- mas, embora se saiba que internamente eles sejam representados na forma binária. Podem ser utilizados valores numéricos inteiros ou fracionários (chamados de reais), positivos ou negativos. Os números são representados na linguagem algorítmica exatamente como apare- cem nas expressões aritméticas em português. Ex.: 123 –45 +6,7 As linguagens de programação geralmente também permitem uma forma alternativa de es- crita, mais compacta, de números muito grandes ou muito pequenos, denominada notação Capítulo 2 Unidades Léxicas, Variáveis, Constantes e Expressões 27 exponencial, científica ou de ponto flutuante. Nessa notação, um número real é representado por um valor inteiro (denominado mantissa) multiplicado por potências de 10 (indicadas pelo seu expoente). Por exemplo, o valor 3.000.000.000.000 seria representado como 3 x 1011. Tanto a mantissa como o expoente podem ter sinal (positivo ou negativo). Cada linguagem de programação define uma forma para a representação de números em notação exponencial, conforme será visto nas seções correspondentes a Pascal e C. valores lógicos. Os valores lógicos (ou booleanos) verdadeiro e falso podem ser utiliza- dos diretamente nos programas quando for feita alguma comparação. caracteres. Permitem representar um símbolo ASCII qualquer, como uma letra do alfa- beto, um dígito numérico (aqui, sem conotação quantitativa, apenas como representação de um símbolo) ou um caractere especial (um espaço em branco também corresponde a um caractere especial). Nos programas, os caracteres são geralmente representados entre apóstrofos. Essa é também a forma utilizada na pseudolinguagem aqui empregada. Ex.: 'A' 'b' '4' '+' strings. São sequências de um ou mais caracteres. Quaisquer caracteres podem ser utiliza- dos (letras, dígitos e símbolos), incluindo o símbolo que representa um espaço em branco. Strings normalmente são representadas entre apóstrofos em um programa, forma também utilizada na pseudolinguagem. Ex.: 'Ana Maria' 'A12B3' 'a$b' '91340-330/1' 2.1.2 identificadores São as palavras criadas pelo programador para denominar o próprioprograma ou elementos dentro do mesmo, tais como: variáveis, constantes ou subprogramas. Toda linguagem de programação define regras específicas para a formação de identificadores, para que eles possam ser reconhecidos pelo compilador. Na pseudolinguagem utilizada neste livro, um identificador deve sempre iniciar por uma letra, seguida de qualquer número de letras e dígitos, incluindo o símbolo “_” (sublinhado), por ser essa a forma mais frequentemente utilizada em linguagens de programação. Tratando-se de uma pseudolinguagem, a acentuação e a letra “ç” também podem ser utilizadas de forma a traduzir de forma mais fiel os valores que devem ser representados. A pseudolinguagem não diferencia letras maiúsculas de minúsculas, mas se recomenda que sejam usadas apenas minúsculas nos nomes de identificadores, reservando as maiúsculas para iniciais e para casos específicos que serão destacados oportunamente. Exemplos de identificadores: valor número1 a7b21 Nome_Sobrenome 28 Algoritmos e Programação com Exemplos em Pascal e C 2.1.3 palavras reservadas São identificadores que têm um significado especial na linguagem, representando comandos e operadores, ou identificando subprogramas já embutidos na linguagem. As palavras re- servadas não podem ser utilizadas como identificadores definidos pelo programador. Algumas das palavras reservadas definidas na pseudolinguagem são: início fim se então escrever ler função 2.1.4 símbolos especiais Símbolos especiais servem para delimitar ações, separar elementos, efetuar operações ou indicar ações específicas. Na pseudolinguagem aqui adotada, também existem alguns símbo- los especiais com significado específico, como: ← + ( ) < > : ; 2.1.5 comentários Comentários são recursos oferecidos pelas linguagens de programação que permitem, por exemplo, a inclusão de esclarecimentos sobre o que o programa faz e como isso é feito. Os comentários são identificados e delimitados por símbolos especiais e podem compreender quaisquer sequências de caracteres. Todo o conteúdo compreendido entre os símbolos deli- mitadores de comentários é ignorado pelo compilador durante a tradução do programa, ser- vindo apenas para documentar e facilitar o entendimento pelos seres humanos que tiverem acesso ao código do programa. Na pseudolinguagem, os comentários são delimitados pelos símbolos “{” e “}”. Exemplo de comentário: { Este é um comentário @#$% } 2.2 declarações Todos os itens utilizados em um programa devem ser declarados antes de sua utilização. Os nomes e as características desses itens são definidos através de declarações. Nesta seção, são analisadas declarações de variáveis, de tipos de dados e de constantes. Outras declarações são vistas em capítulos subsequentes. Capítulo 2 Unidades Léxicas, Variáveis, Constantes e Expressões 29 2.2.1 declaração de variáveis Uma variável representa um espaço de memória identificado e reservado para guardar um valor durante o processamento. Ressalte-se que somente um valor pode estar armazenado em uma variável em um determinado momento. Caso seja definido um novo valor para uma variável, o anterior será perdido. Sempre que um programador decidir utilizar uma variável em seu programa, ele deverá informar seu nome e o tipo de valores que ela irá armazenar. Isso faz com que, ao final da compilação do programa, exista um espaço reservado para essa variável na memória principal do computador, com um determinado endereço físico. O tamanho do espaço alocado para a variável depende do tipo definido para ela. Uma vez alocada a variável, ela passa a ser referenciada no programa através do nome dado pelo programador, não sendo necessário saber seu endereço físico. Variáveis de dois tipos, bastante diferentes no seu conteúdo e forma de uso, podem ser utiliza- das em um programa: (1) variáveis que armazenam os valores manipulados no programa e (2) variáveis que guardam endereços físicos de memória, denominadas ponteiros. Esse segundo tipo de variável será tratado mais adiante, no Capítulo 14. Até lá, sempre que forem feitas refe- rências a variáveis se estará tratando das que armazenam valores e não endereços de memória. Toda variável utilizada pelo programa deve ser declarada no seu início, através de uma decla- ração de variáveis, em que são definidos seu nome e o tipo de dados que poderá armazenar. Os tipos de dados utilizados nas linguagens de programação se classificam, de acordo com os valores que podem armazenar, em: ■ tipos simples: ■ numéricos; ■ alfanuméricos; ■ lógicos ou booleanos; ■ ponteiros. ■ tipos compostos: ■ arranjos; ■ registros; ■ enumerações; ■ conjuntos; ■ arquivos. Inicialmente serão analisados somente os três primeiros tipos de dados simples. O tipo pontei- ro e os tipos compostos serão gradualmente apresentados ao longo deste livro. Os nomes dados aos tipos de dados simples na pseudolinguagem são: ■ inteiro, para armazenar somente valores numéricos inteiros; ■ real, em que são armazenados valores numéricos fracionários; ■ caractere, para armazenar somente um caractere alfanumérico, utilizando a codifica- ção de caracteres ASCII, que representa qualquer caractere em 8 bits; 30 Algoritmos e Programação com Exemplos em Pascal e C ■ string, em que são armazenadas cadeias de caracteres alfanuméricos; ■ lógico, para variáveis que podem armazenar somente um dos dois valores lógicos, ver- dadeiro ou falso. Uma opção na declaração de uma variável simples do tipo string é definir o número de ca- racteres que poderá conter por meio de um inteiro entre colchetes. Por exemplo, uma variável definida com o tipo string[3] poderá conter somente três caracteres, enquanto que uma variável definida com o tipo string, sem limitação de tamanho, poderá ter o número de caracteres permitido na linguagem de programação utilizada. No Capítulo 1 ressaltou-se a importância de identificar os valores de entrada e de saída de um algoritmo. Esses valores são armazenados em variáveis. Na pseudolinguagem, sugere-se que as variáveis sejam definidas em conjuntos separados, identificando (1) as variáveis de entrada, que servirão para valores fornecidos ao programa, (2) as de saída, que vão armazenar os valo- res que serão informados pelo programa, resultantes de seu processamento, e (3) as variáveis auxiliares, que servirão somente para guardar valores durante o processamento. A sintaxe da declaração de variáveis é a seguinte: Entradas: <lista de nomes de variáveis com seus tipos> Saídas: <lista de nomes de variáveis com seus tipos> Variáveis auxiliares: <lista de nomes de variáveis com seus tipos> Os nomes escolhidos pelo programador para cada variável devem ser seguidos do tipo da variável entre parênteses: nome (string) valor (real) Várias variáveis do mesmo tipo podem ser agrupadas em uma lista de nomes separados por vírgula, seguida pelo tipo correspondente: int1, int2, int3 (inteiro) Um exemplo do cabeçalho de um algoritmo, incluindo as declarações das variáveis já identifi- cadas conforme sua futura utilização, é mostrado a seguir: Algoritmo – MédiaEMaiorValor {INFORMA A MÉDIA DE 2 VALORES E QUAL O MAIOR DELES} Entradas: valor1, valor2 (real) Saídas: média (real) maior (real) Variáveis auxiliares: aux (real) 2.2.2 declaração de tipos de dados As linguagens de programação geralmente permitem a definição de novos tipos de da- dos. Um novo tipo é identificado através de um nome dado pelo programador. Sua defini- ção se baseia em um tipo-base, anteriormente definido ou predefinido na linguagem. Na Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Conhecer a forma correta de definição e manipulação dos tipos de dados é muito importante para o desenvolvimento de algoritmos/programas, para que desta forma consigamos solucionar os problemas de forma eficiente e eficaz.Assista ao vídeo para conhecer um pouco mais sobre este tema. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Verificamos na unidade de aprendizagem que para a definição de um identificador, ou seja, o nome de uma variável ou constante, possuímos regras, e estas precisam ser seguidas na construção dos algoritmos. Como boa prática de Programação e não de forma obrigatória, para facilitar a compreensão dos algoritmos, devemos sempre procurar definir os nomes para os identificadores sempre baseados no conteúdo que elas armazenarão. Como exemplo podemos citar o identificador para armazenar o salário do funcionário, e para esta, utilizar na sua definição com o nome de "idade", sendo que ela vai armazenar o salário do funcionário e não a idade dele. O nome correto para este identificador deveria ser "salario" ou de forma abreviada "sal" para assim já identificar o seu conteúdo e facilitar a análise dos algoritmos. Considerando as regras apresentadas no material da unidade, para a definição dos identificadores, avalie as alternativas de nomes a seguir. I) Valor1 II) Média Total III) A+B IV) SalTotal V) 1Nota É correto apenas o que se afirma em: A) I e II estão corretas. B) I, II e III estão corretas. C) I e IV estão corretas. D) I, IV e V estão corretas. E) Todas as alternativas. 2) Na especificação de memória de computador, costuma-se utilizar como unidade de medida o Byte e seus múltiplos (KB, MB, GB, TB, PB, etc.). Analise as alternativas abaixo e realize as devidas conversões. Dentre as alternativas abaixo, quais corresponde ao valor equivalente a 1,5 MB (1,5 megabyte)? I) 1.536 KB ou 1.048.576 Bytes II) 1.572.864 Bytes ou 1.536 KB III) 1.572.864 KB ou 1.536Bytes IV) 0,0014 GB ou 1.536Bytes É correto apenas o que se afirma em: A) I e II estão corretas. B) II e IV estão corretas. C) III e IV estão corretas. D) I, III e IV estão corretas. E) Apenas a afirmativa II está correta. 3) Uma das principais funções do computador é a manipulação de informações, mas para que esta manipulação seja correta, necessitamos da definição correta dos tipos que serão manipulados na memória do computador, para que este possa transformar os dados na forma digital e processá-los. O tipo de dado é um conjunto definido de objetos que tem em comum o mesmo comportamento diante de um conjunto de operações definidos e aplicados. Neste contexto, precisamos conhecer muito bem o que queremos guardar para, assim, selecionar o melhor "recipiente" para guardá-los e manipulá-los. Considerando o conceito de variáveis e constantes e os seus tipos básicos, analise as sentenças a seguir. I) A _________________ é um nome de um endereço de memória de um determinado conteúdo, podendo este variar ao longo do tempo. II) A ________________ é um nome de um endereço de memória de um determinado conteúdo, sendo este um valor fixo , não podendo este variar ao longo do tempo. III) O tipo ________________ pode armazenar caracteres individuais ou conjuntos de caracteres também denominados de strings/conjunto de caracteres. IV) O tipo _______________ pode armazenar valores inteiros positivos e negativos. V) O tipo _______________ pode armazenar valores fracionários positivos e negativos. VI) O tipo _______________ pode armazenar somente um conjunto de dois valores com significados opostos que geralmente são representados por 0(zero) e 1(um) ou Verdadeiro (V) e falso (F). Complete as sentenças conforme alternativas apresentadas abaixo. É correta a ordem apresentada apenas em: A) Variável-Constante-Caractere-Inteiro-Real-Lógico B) Constante-Variável-Caractere-Inteiro-Real-Lógico C) Variável-Constante-Caractere-Real-Inteiro-Lógico D) Variável-Constante-Lógico-Inteiro-Real-Caractere E) Constante-Variável-Lógico-Real-Inteiro-Caractere 4) A cada ano as configurações de computadores aumentam sua capacidade de processamento e armazenamento de informações. Hoje é comum encontrar computadores com 8 GB de memória RAM, 1 TB de disco rígido(unidade secundária) no mercado. Certamente esta configuração já se tornará obsoleta em poucos anos, devido ao avanço contínuo da tecnologia nesta área. Como comparação de tamanho de memória, analisamos um livro, onde uma página armazenada em formato ASCII, em torno de 50 linhas e 80 caracteres por linha, ou seja, em torno de 4000 caracteres por página. Assim, um livro de 500 páginas armazena em torno de 2.000.000 de caracteres. Neste contexto, um disco rígido de 1TB poderia guardar em torno de quantos livros deste tipo? A) Aproximadamente 5.000 livros B) Aproximadamente 500.000 livros C) Aproximadamente 50.000 livros D) Aproximadamente 30.000 livros E) Aproximadamente 300.000 livros Levando em consideração o tipo de sistema de numeração utilizado pelos computadores digitais, analise as afirmativas abaixo e identifique se a mesma é V- Verdadeira ou F-Falsa. ,I) O Bit é a menor unidade de informação utilizada pelo computador. Este tem atribuições lógicas 0 ou 1. II) O Byte é conjunto de 8 bits e pode ter até 28 = 256 configurações diferentes. III) No sistema de numeração binário, a notação que é utilizada possui apenas 2 algarismos ou dígitos para representar uma quantidade desejada, o 0 e o 1. 5) É correto apenas o que se afirma em: A) F-F-F B) V-F-V C) V-F-F D) V-V-V E) F-V-V NA PRÁTICA Vamos ver agora algumas situações práticas de armazenamento de produtos no nosso dia a dia e qual a sua relação com o armazenamento de dados em um computador. Você já analisou uma geladeira? E a diversidade de produtos guardados dentro da geladeira? E ainda a diversidade de recipientes existentes nela para guardar toda esta variedade de produtos? Acompanhe na imagem a seguir esta relação com tipos de dados. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Variáveis e Tipos Conteúdo interativo disponível na plataforma de ensino! Comandos condicionais simples (fluxograma) APRESENTAÇÃO Na construção de programas, muitas vezes é necessário desviar o fluxo de execução e executar somente determinados blocos de comandos se uma determinada condição for atendida.Nesta Unidade de Aprendizagem, estudaremos a solução de problemas através da utilização de estruturas condicionais simples no desenvolvimento de algoritmos em forma de fluxograma. Veremos também sua estrutura básica e a análise de aplicações práticas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Analisar algoritmos com estruturas condicionais simples em fluxograma.• Identificar problemas que necessitam de comandos condicionais simples para a sua solução. • Resolver problemas através da aplicação de comandos condicionais simples em fluxograma. • DESAFIO Um aluno de determinada instituição de ensino superior particular deseja realizar o cálculo do valor da mensalidade do seu curso de Engenharia para o próximo ano. Para a resolução do problema, leve em consideração as seguintes informações: - a instituição aplicará um reajuste ao final do ano, o qual deverá ser informado para o algoritmo; - cada turno é composto por quatro créditos, assim, a entrada deve ser em créditos e não em turnos que o aluno pretende estudar. Não são aceitos créditos quebrados, somente inteiros; - para calcular o valor da parcela, o algoritmo necessita como entrada a quantidade de parcelas que o aluno deseja para o semestre. - A instituição quer estimular financeiramente o aluno a matricular-se em mais créditos, criando uma nova regra para o próximo ano. Alunos que efetuarem matrícula entre 14 e 24 créditos receberão um desconto de 18% no valor total da mensalidade. Considerando as informações apresentadas, desenvolva um algoritmo em fluxograma que receba os dados de entrada necessários, calcule o reajuste e o valor da parcela e exibaao final as seguintes informações: - o valor total antigo do semestre; - o valor total da mensalidade nova com o reajuste do semestre; - o valor somente do aumento do semestre (reajuste); - o total de créditos cursados; - o número de parcelas. - o valor de cada parcela (do valor reajustado). Poderá ser utilizado qualquer software para construir o fluxograma (DIA, PowerPoint, editor de texto, visio...), ou pode ser desenvolvido manualmente. Muitos são os softwares para desenvolver os fluxogramas, mas a maioria são pagos. Software DIA para Windows. Baixe aqui INFOGRÁFICO http://download.cnet.com/Dia/3001-2075_4-10833704.html?hlndr=1 CONTEÚDO DO LIVRO As estruturas de controle permitem testar uma condição (expressão lógica) antes de executar uma instrução, ou conjunto de instruções, desviando o fluxo de execução do programa. Assim, a execução de determinada ação está atrelada ao resultado da condição analisada, quebrando a linearidade de execução do programa. Para compreender melhor a estrutura de controle de seleção simples através de fluxograma, acompanhe um trecho da seguinte obra: EDELWEISS, N.; LIVI, M.A.C. Algoritmos e programação com exemplos em Pascal e C - Vol. 23. Série Livros Didáticos Informática UFRGS. O livro servirá como base para esta Unidade de Aprendizagem. No capítulo selecionado, serão apresentados a estrutura básica de funcionamento do comando de seleção simples e alguns exemplos desenvolvidos em fluxograma. Boa leitura. 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 ■ ■ Neste capítulo, são apresentados os comandos de seleção simples, dupla e múltipla. São analisadas, ainda, as possibilidades de aninhamento de comandos e o conceito de comando composto. estruturas condicionais capítulo 4 e de seleção 90 Algoritmos e Programação com Exemplos em Pascal e C Os algoritmos que solucionam os problemas apresentados até o momento são puramente sequenciais: todas as instruções são executadas na ordem em que foram definidas, uma após a outra, sem exceção. Este capítulo introduz uma nova classe de problemas, na qual uma ou mais ações podem ou não ser executadas, dependendo da avaliação prévia de condições. Para resolver esses problemas são apresentados três novos comandos que possibilitam a alteração do fluxo sequencial de execução de um programa. No capítulo anterior, foi resolvido o problema do cálculo da média aritmética de três notas de um aluno em uma disciplina. Estendendo essa aplicação, o professor que utiliza esse pro- grama quer que, além da média das notas obtidas na disciplina, seja informado se o aluno foi aprovado (no caso de sua média ser igual ou superior a 6). Essa informação não pode ser obtida somente com o conjunto de comandos do Capítulo 3, uma vez que requer a análise de uma condição e a execução de uma ação somente se a condição analisada for verdadeira. Outra possibilidade é fornecer não apenas a informação de aprovação, mas também a de reprovação. Nesse caso, também condicionada ao conteúdo da média calculada, ocorre a execução de apenas uma de duas ações mutuamente exclusivas: se a média for maior ou igual a 6, o programa informa que o aluno foi aprovado; caso contrário, se a média for inferior a 6, informa que o aluno foi reprovado. Seguindo adiante nesse raciocínio, pode-se escrever um trecho de programa em que, depen- dendo da média obtida, também é informado o conceito correspondente à média calculada. Aqui, diferentes faixas de valor de uma mesma informação desencadeiam ações diferentes, também mutuamente exclusivas, isto é, a execução de uma ou mais instruções específicas está associada ao valor da informação. Os comandos que solucionam esses problemas são apresentados neste capítulo. 4.1 comando de seleção simples Um comando de seleção simples, também chamado de comando condicional, permite que a execução de um trecho do programa dependa do fato de uma condição ser verdadeira, isto é, vincula a execução de um ou mais comandos ao resultado obtido na avaliação de uma expressão lógica (também denominada expressão condicional). O comando de seleção sim- ples é sempre composto por uma condição e um comando. A condição é expressa por uma expressão lógica, cuja avaliação produz um resultado verdadeiro ou falso. A sintaxe de um comando de seleção simples é: se <expressão lógica> então <comando> Observe que o comando somente é executado se o resultado da expressão lógica for verda- deiro; se o resultado for falso, nada é executado. Por meio do comando de seleção simples pode-se, por exemplo, condicionar a exibição da infor- mação de que um aluno foi aprovado somente para o caso de sua média ser igual ou superior a 6: Capítulo 4 Estruturas Condicionais e de Seleção 91 se média ≥ 6 então escrever('Aprovado') A execução do comando escrever ocorre apenas quando a condição for verdadeira, ou seja, quando o conteúdo da média for igual ou superior a 6. Nada é executado se a média for inferior a 6. A Figura 4.1 representa o fluxograma de um comando de seleção simples. Um novo tipo de bloco, com formato de losango, é utilizado para representar a realização de um teste, escre- vendo-se dentro desse bloco a expressão lógica a ser avaliada. Esse bloco tem duas saídas, uma para o caso da expressão ser avaliada como verdadeira, e outra para quando o resultado da avaliação da expressão for falso. As informações que correspondem a cada saída devem estar claramente identificadas. O fluxograma mostra com clareza que nada é executado no caso do resultado da avaliação da expressão ser falso. <expressão lógica> verdadeiro falso <comando> figura 4.1 Fluxograma de um comando de seleção simples. O algoritmo a seguir informa, além da média de um aluno, se ele foi aprovado: Algoritmo 4.1 – Média2 {INFORMA A MÉDIA DAS 3 NOTAS DE UM ALUNO E SE ELE FOI APROVADO} Entradas: nota1, nota2, nota3 (real) Saídas: média (real) {Informação de aprovado} início ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS} média ←(nota1 + nota2 + nota3)/3 escrever (média) {INFORMA MÉDIA CALCULADA} se média ≥ 6 então escrever('Aprovado') {INFORMA SE ALUNO FOI APROVADO} fim 92 Algoritmose Programação com Exemplos em Pascal e C A Figura 4.2 apresenta o fluxograma relativo a esse algoritmo. ENTRADA nota1, nota2, nota3 SAÍDA média início fim ( nota1 + nota2 + nota3 ) média 3 média 6 falso verdadeiro SAÍDA ‘Aprovado’ figura 4.2 Fluxograma de um exemplo com comando de seleção simples. 4.2 comando composto Na sintaxe do comando de seleção simples nota-se que somente um comando pode ser exe- cutado caso a condição seja verdadeira. Mas o que fazer quando se quer executar vários co- mandos condicionados à avaliação de uma mesma expressão lógica? Por exemplo, supondo que, na aplicação anterior, se queira saber a média somente no caso das três notas lidas serem iguais ou superiores a 6, então a média deve ser calculada e informada somente se a condição for verdadeira. Para que isso seja possível, é necessário que dois comandos, o de cálculo da média e o de saída dessa média, sejam executados quando a condição for verdadeira. Como a sintaxe do comando de seleção simples exige a execução de um único comando, faz-se necessária a de- finição de um novo tipo de comando, denominado comando composto. Na pseudolinguagem aqui utilizada, um comando composto é delimitado pelas palavras re- servadas início e fim. Sintaticamente, trata-se de um único comando. Quaisquer comandos podem ser incluídos dentro de um comando composto. Algumas linguagens de programação permitem, inclusive, a definição de novas variáveis dentro de um comando composto, as quais são alocadas na memória apenas no momento em que inicia a execução desse coman- Capítulo 4 Estruturas Condicionais e de Seleção 93 do e são liberadas no término da execução do comando. Contudo, essa possibilidade não será considerada neste livro. O problema proposto no início desta seção pode ser resolvido com a utilização desse novo recurso, conforme mostrado no Algoritmo Média3: Algoritmo 4.2 – Média3 {INFORMA MÉDIA DO ALUNO SOMENTE SE SUAS 3 NOTAS FOREM IGUAIS OU SUPE- RIORES A 6} Entradas: nota1, nota2, nota3 (real) Saídas: média (real) {Informação de aprovado} início ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS} se (nota1 ≥ 6) e (nota2 ≥ 6) e (nota3 ≥ 6) então início {COMANDO COMPOSTO} média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA} escrever (média) {INFORMA MÉDIA} fim fim O fluxograma desse algoritmo, apresentado na Figura 4.3, mostra com clareza que o conjunto de comandos pode não ser executado, dependendo do resultado da condição. ENTRADA nota1, nota2, nota3 início nota1 6 e nota2 6 e nota3 6 falso verdadeiro ( nota1 + nota2 + nota3 ) média 3 SAÍDA média fim figura 4.3 Fluxograma de comando de seleção simples com comando composto. Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Até o momento, os valores de entrada ou os comandos do algoritmos não importavam, o fluxo de execução era sempre único, ou seja, as instruções a serem executadas eram sempre as mesmas. A partir da aplicação das estruturas de controle, será possível desenvolver algoritmos com um maior grau de complexidade e flexibilidade, desviando o seu fluxo de execução. Assista ao vídeo para conhecer um pouco mais sobre essa estrutura, além de compreender e analisar algumas soluções práticas apresentadas de aplicação dos comandos de seleção simples em forma de fluxograma. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Considerando-se que a=2, b=6, c= 7 e d= 3, informe se as expressões lógicas apresentadas abaixo são V (Verdadeiras) ou F (Falsas). I - ( a <= b+3 ) e ( c = b ) II – (( a+2 ) >10 ) ou (a + b) = (b+a) III - não (a = c) e (d = a) A) V-V-V B) V-F-V C) V-V-F D) F-V-F E) F-F-F 2) Dada a seguinte situação: leia um número inteiro e verifique se é par. Se for par, deverá imprimir a seguinte mensagem: “O número xx é par”. Analise os fluxogramas apresentados nas alternativas abaixo: A) Apenas a alternativa I. B) São verdadeiras as alternativas II e IV. C) É verdadeira a alternativa III. D) São verdadeiras as alternativas II e III. E) Todas as alternativas. Observe o fluxograma:3) Selecione a alternativa que preenche corretamente a expressão lógica do comando de controle simples no fluxograma apresentado. A) (num >0) e (num <1) B) num > 0 C) num < 0 D) num = 0 E) (num >0 ) ou ( num <1) Após a execução do algoritmo em fluxograma:4) Em C estará armazenado o valor falso se, originalmente: A) A > B B) A <= B C) A >= B D) A < B E) A = B Com relação às estruturas de controle e as características do comando de seleção 5) simples, analise as alternativas abaixo. I – O comando de seleção simples é também conhecido por comando condicional. II – As estruturas de controle executam todos os comandos um após o outro de forma linear. III – Em um comando de seleção simples, a execução de um trecho de programa está vinculada ao fato de uma condição ser verdadeira. É incorreto o que se afirma: A) Apenas na alternativa I. B) Apenas na alternativa II. C) Nas alternativas I e II, as informações são falsas. D) Na alternativas I e III, as informações são falsas. E) Todas as alternativas são falsas. NA PRÁTICA Tomada de decisão no nosso cotidiano: Ao acordar e nos preparamos para sair ao trabalho, realizamos uma série de ações até ficarmos prontos, como: • Tomar banho • Pentear o cabelo • Vestir camisa • Vestir casaco • Calçar os sapatos ... Mas, se pararmos para pensar um pouco, o nosso mundo não é tão perfeito, ou “certinho”, sem dúvidas ou qualquer tipo de variação. Você já imaginou executar os passos acima todos os dias? Imagine se a temperatura estiver 38 graus no dia! Você vai suar muito durante o trabalho! Dessa forma, se pensarmos no nosso dia a dia, podemos verificar que, já ao levantarmos, uma das nossas primeiras ações é verificar como está o tempo e decidir como iremos nos vestir para ir ao trabalho. • Esse é o nosso mundo, com muitas dúvidas e muitas variações no dia a dia, as quais exigem tomadas de decisão • - Poderíamos solucionar o problema apresentado acima da seguinte forma: • Tomar banho • Pentear o cabelo • Vestir camisa • Vestir calça • Se estiver frio, vestir casaco • Calçar os sapatos ... O comando de vestir casaco já está no nosso algoritmo. Somente agora sua execução está atrelada ao resultado do teste (se estiver muito frio) ser verdadeiro. Se o resultado for falso, é porque está quente, e o casaco não será usado. Analise a solução em fluxograma apresentada abaixo. Vamos criar um fluxograma para demonstrar o comando condicional simples? Mas, se pararmos para pensar um pouco, o nosso mundo não é tão perfeito, ou “certinho”, sem dúvidas ou qualquer tipo de variação. Você já imaginou executar os passos acima todos os dias? Imagine se a temperatura estiver 38 graus no dia! O comando de decisão simples nos faz pensar computacionalmente as nossas atividades diárias, que muitas vezes executamos de forma automática: - Que produtos comprar no mercado? Tem dinheiro? Está de carro? Vários são os fatores que envolvem a tomada de decisão. - O que comer? Está com fome? O que deseja comer? - Onde comer? Quanto de dinheiro tem para gastar? • Chegamos ao final do dia exaustos de tanto testar e executar os comandos condicionais no nosso cotidiano • SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Software DIA para desenvolver diagramas e fluxogramas Conteúdo interativo disponível na plataforma de ensino! Tutorial ferramenta DIA Conteúdo interativo disponível na plataforma de ensino! Comandos condicionais compostos (fluxograma) APRESENTAÇÃO Na construção de programas utilizando comandos de seleção duplos ou compostos, as duas alternativas dependem da mesma condição, uma da condição verdadeira eoutra da condição falsa, aumentando, dessa forma, a flexibilidade e o grau de complexidade dos algoritmos. Nesta Unidade de Aprendizagem, estudaremos a solução de problemas através da utilização de comandos de seleção compostos ou duplos no desenvolvimento de algoritmos em forma de fluxograma, assim como sua estrutura básica de funcionamento e análise de aplicações práticas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Analisar algoritmos com comandos condicionais duplos ou compostos em fluxograma.• Desenvolver algoritmos em fluxograma que precisam, para a sua solução, de comandos condicionais duplos ou compostos. • Compreender a estrutura básica de um comando de seleção duplo ou composto em fluxograma. • DESAFIO Uma escola particular de segundo grau está desenvolvendo um projeto de benefícios para captar novos alunos e beneficiar famílias com rendas mais baixas. Atualmente, o valor anual para um aluno fica em torno de R$ 10.000,00. Dado o valor normal da mensalidade, será atribuído um benefício com desconto desse valor aplicado a famílias que atendem aos seguintes critérios: Junto às empresas do setor comercial do município, a direção da escola conseguiu uma bolsa de estudos que será oferecida em forma de gratuidade para alunos carentes. A bolsa será oferecida às famílias da seguinte forma: O valor da bolsa será descontado do valor da mensalidade. Para o recebimento dos valores de desconto e de bolsa, um dos familiares deverá desenvolver trabalho voluntário junto à comunidade escolar. Para cada R$ 10,00 recebido, o representante da família (que poderá ser qualquer pessoa maior de idade) deverá trabalhar uma hora durante o ano vigente da matrícula. Calcule o total de horas que a família deverá trabalhar junto à comunidade escolar, desenvolvendo atividades de limpeza, concerto, eventos, entre outras atividades que ficam a critério da necessidade da comunidade escolar e das habilidades da família. Vamos desenvolver um algoritmo para auxiliar a escola a calcular o valor da mensalidade para os alunos e a quantidade de horas voluntárias? Desenvolva um algoritmo em fluxograma que receba os dados de entrada (o valor da mensalidade deverá ser lido, pois sempre sofre reajustes) necessários para resolver o problema, calcule e imprima: - o valor de desconto da mensalidade - o valor da bolsa de estudos - o valor final da mensalidade - o total de horas de trabalho voluntário INFOGRÁFICO Acompanhe o esquema com os comandos de seleção composta em fluxograma. CONTEÚDO DO LIVRO As estruturas de controle de seleção composta são aplicadas em situações em que duas alternativas dependem da mesma expressão lógica, uma da condição verdadeira (então) e a outra da condição falsa (senão). Para compreender melhor a estrutura de controle de seleção composta através de fluxograma, acompanhe um trecho da seguinte obra: Algoritmos e programação com exemplos em Pascal e C - Vol. 23. O livro serve como base para esta Unidade de Aprendizagem. 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 94 Algoritmos e Programação com Exemplos em Pascal e C 4.3 comando de seleção dupla Supondo que, além de informar a média das três notas do aluno, também se queira que o programa informe se ele foi aprovado (quando a média for igual ou superior a 6) ou repro- vado (média inferior a 6). Dois comandos, se-então, são necessários para imprimir essas mensagens: se média ≥ 6 então escrever('Aprovado') {INFORMA SE O ALUNO FOI APROVADO} se média < 6 então escrever('Reprovado') {INFORMA SE O ALUNO FOI REPROVADO} Os dois comandos implementam ações mutuamente exclusivas e dependem da avaliação de uma mesma condição, sendo uma das ações associada ao resultado verdadeiro e outra ao resultado falso. Para evitar a repetição da comparação, pode ser utilizado um comando de seleção dupla que, a partir do resultado da avaliação de uma condição, seleciona um de dois comandos para ser executado. Sua sintaxe é: se <expressão lógica> então <comando> senão <comando> Somente um comando pode ser definido em cada uma das cláusulas então e senão. Esse comando pode ser simples ou composto, como no caso do comando de seleção simples. O exemplo anterior, resolvido através de dois comandos de seleção simples, equivale ao seguinte comando de seleção dupla: se média ≥ 6 então escrever('Aprovado') senão escrever('Reprovado') O fluxograma que representa esse comando, mostrado na Figura 4.4, mostra claramente que o fluxo do programa passa por apenas um dos dois comandos, o qual é selecionado pelo resultado da expressão lógica. O algoritmo que calcula a média de três notas e informa se o aluno foi aprovado ou reprova- do é o seguinte: Algoritmo 4.3 – Média4 {INFORMA A MÉDIA DO ALUNO E SE FOI APROVADO OU REPROVADO} Entradas: nota1, nota2, nota3 (real) Saídas: média (real) {Informação de aprovado ou reprovado} início ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS} média ← (nota1+nota2+nota3)/3 escrever (média) {INFORMA MÉDIA CALCULADA} Capítulo 4 Estruturas Condicionais e de Seleção 95 se média ≥ 6 então escrever('Aprovado') {INFORMA SE O ALUNO FOI APROVADO} senão escrever('Reprovado') {INFORMA SE O ALUNO FOI REPROVADO} fim 4.4 comandos de seleção aninhados Conforme visto, somente um comando pode ser utilizado nas cláusulas então e senão, mas não há restrição quanto ao tipo de comando. Pode, inclusive, ser usado um novo comando de seleção – simples ou dupla. Nesse caso, diz-se que os comandos de seleção estão aninhados ou encadeados. Estendendo um pouco mais a aplicação de apoio a um professor, suponha que se queira ob- ter o conceito do aluno com base na sua média, de acordo com a seguinte conversão: Conceito A: Média ≥ 9,0 Conceito B: 9,0 > Média ≥ 7,5 Conceito C: 7,5 > Média ≥ 6,0 Conceito D: Média < 6,0 A solução pode ser implementada através de uma sequência de comandos condicionais (op- ção 1): se média ≥ 9 então conceito ← 'A' se (média < 9) e (média ≥ 7,5) então conceito ← 'B' se (média < 7,5) e (média ≥ 6,0) então conceito ← 'C' se (média < 6) então conceito ← 'D'<expressão lógica> verdadeirofalso <comando><comando> figura 4.4 Fluxograma do comando de seleção dupla. 96 Algoritmos e Programação com Exemplos em Pascal e C Nessa sequência de comandos, somente uma das condições será verdadeira e, apesar disso, todas as condições serão sempre avaliadas, desnecessariamente. Para evitar isso, o algorit- mo a seguir calcula a média e o conceito, utilizando comandos de seleção dupla aninhados (opção 2). Note que, uma vez encontrada uma condição verdadeira, as que estão após ela, na cláusula senão, não são mais avaliadas. Cabe ressaltar que, nessa solução, não foi feita a análise da validade dos dados de entrada, partindo-se do pressuposto que eles foram corre- tamente informados. Algoritmo 4.4 – MédiaConceito1 {INFORMA A MÉDIA E O CONCEITO DE UM ALUNO} Entradas: nota1, nota2, nota3 (real) Saídas: média (real) conceito (caractere) início ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS} média ← (nota1+nota2+nota3)/3 {CÁLCULO DA MÉDIA} escrever (média) {INFORMA MÉDIA CALCULADA} se média ≥ 9 {CÁLCULO DO CONCEITO} então conceito ← 'A' senão se média ≥ 7,5 então conceito ← 'B' senão se média ≥ 6,0 então conceito ← 'C' senão conceito ← 'D' {MÉDIA < 6} escrever (conceito) {INFORMA CONCEITO} fim Nesse algoritmo, o trecho de programa que calcula o conceito corresponde a um único co- mando de seleção dupla. Se a média for igual ou superior a 9,0, o conceito “A” é atribuído ao aluno e a execução desse comando termina. No caso dessa condição não ser verdadeira, então é avaliada a segunda condição, que verifica se a média é igual ou superior a 7,5. Se essa condição for verdadeira, o aluno recebe o conceito “B” e o comando é concluído. Se não for verdadeira, então a média é novamente analisada, dessa vez verificando se é maior ou igual a 6,0. Finalmente, independentemente da condição ser verdadeira ou falsa, o comando é encerrado com a atribuição do conceito “C” (expressão verdadeira) ou “D” (expressão falsa). A compreensão do funcionamento dos comandos de seleção aninhados é bem mais clara do que a da sequência de comandos condicionais (opção 1). Além disso, a segunda opção de re- presentação realiza menos comparações do que a primeira, o que diminui o tempo de execução. uso de indentação para delimitar comandos aninhados. A pseudolinguagem utilizada neste livro faz uso da indentação para mostrar visualmente o escopo de cada um dos coman- Capítulo 4 Estruturas Condicionais e de Seleção 97 dos de seleção aninhados. Sem a indentação, é bem mais difícil visualizar o funcionamento dos comandos aninhados, como pode ser observado na reescrita do trecho do Algoritmo 4.4 que examina a média: se média ≥ 9 então conceito ← 'A' senão se média ≥ 7,5 então conceito ← 'B' senão se média ≥ 6,0 então conceito ← 'C' senão conceito ← 'D' {MÉDIA < 6} Contudo, a indentação por si só não garante a correção do código e pode até mesmo masca- rar erros se não corresponder à sintaxe do código utilizado. No trecho a seguir, no comando de seleção dupla, o comando da cláusula então é um comando condicional. A indentação utilizada faz crer que a cláusula senão pertence ao comando mais externo, quando, pela sin- taxe, ela pertence ao mais interno: se nota1 = 10 {COMANDO DE SELEÇÃO DUPLA} então se média > 9 {COMANDO CONDICIONAL} então escrever ('Parabéns pela boa média!') senão escrever ('A primeira nota não é 10! ') A indentação que reflete a sintaxe do que está escrito é: se nota1 = 10 {COMANDO SELEÇÃO DUPLA TRATADO COMO CONDICIONAL} então se média > 9 {COMANDO CONDICIONAL TRATADO COMO SELEÇÃO DUPLA} então escrever ('Parabéns pela boa média!') senão escrever ('A primeira nota não é 10!') Da forma como está o trecho, independentemente da indentação utilizada, se a Nota1 forne- cida for 10 e a média não for superior a 9, será produzida a mensagem ‘A primeira nota não é 10!’, que claramente está incorreta. Nesse caso, o problema pode ser corrigido através do uso dos delimitadores de um comando composto, para indicar que somente a cláusula então faz parte do comando que testa a condição “se média > 9”: se nota1 = 10 {COMANDO DE SELEÇÃO DUPLA} então início {COMANDO COMPOSTO} se média > 9 {COMANDO CONDICIONAL} então escrever ('Parabéns pela boa média! ) fim senão escrever ('A primeira nota não é 10!') Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Com a aplicação de comandos de seleção compostos, aumentamos o grau de complexidade e flexibilidade dos nossos algoritmos. Com a sua utilização, é possível diferenciar a execução de um comando ou um conjunto de comandos, se determinada condição é verdadeira, e também executar outro comando ou conjunto de comandos quando o resultado da condição for falso, permitindo, dessa forma, a execução diferenciada de comandos em ambas as situações. Assista ao vídeo para conhecer um pouco mais sobre a estrutura de comandos de seleção composta e para compreender, analisar e testar algumas soluções práticas apresentadas em forma de fluxograma. Conteúdo interativo disponível na plataforma de ensino! v EXERCÍCIOS 1) Considerando os valores para as variáveis k=9, p=5 e x=6. Analise as expressões lógicas e aplique o teste de mesa dos trechos condicionais compostos dos fluxogramas nas sentenças a seguir: A) Apenas a opção III escreve "Verdadeiro". B) Apenas as opções I e II escrevem "Verdadeiro". C) Apenas a opção I escreve "Falso". D) Todos as opções escrevem "Falso". E) Todos as opções escrevem "Verdadeiro". 2) Dado o problema: Ler três valores L1, L2 e L3 que representam os lados de um triângulo. Verifique se os lados formam um triângulo equilátero, sabendo que, para formar um triângulo equilátero, é preciso ter os três lados iguais. Caso possa ser formado um triângulo equilátero, exiba a mensagem “Forma um triângulo equilátero”; caso contrário, exiba a mensagem “Não forma um triângulo equilátero”. Analise e avalie os fluxogramas abaixo. É correto o fluxograma que se apresenta em: , A) Fluxograma I. B) Fluxograma II. C) Fluxograma III. D) Todas as alternativas estão corretas. E) Nenhuma alternativa correta. Dado o fluxograma que recebe três valores de entrada, L1, L2 e L3, que representam os lados de um triângulo. Para que seja formado um triângulo isóscele, ele necessita ter o comprimento de dois lados iguais. Os três lados não podem iguais para que o triângulo não se torne equilátero. Analise o fluxograma abaixo. 3) Selecione a alternativa que representa corretamente a expressão lógica para o problema apresentado. , A) ((L1=L2) ou (L1=L3) ou (L2=L3)). B) ((L1=L2) ou (L1=L3) ou (L2=L3)) e ((L1=L2) e L2=L3). C) ((L1=L2) e (L1=L3) e (L2=L3)). D) ((L1=L2) ou (L1=L3) ou (L2=L3)) e nao((L1=L2) e (L2=L3 )). E) (L1=L2) ou (L2=L3). Dado o algoritmo em fluxograma, 4) Realize o teste de mesa para o algoritmo em fluxograma apresentado acima para os valores de n sendo 3 e 6. Selecione a alternativa que preenche corretamente com o valor de x ao término do algoritmo, com os valores 3 e 6, respectivamente. A) x = 9 e x = 72. B) x = 12 e x = 48. C) x = 9 e x = 48. D) x = 12 e x = 72. E) Nenhuma alternativa está correta. 5) Com relação a estruturas condicionais estudadas, qual o comando de decisão que pode executar vários comandos se uma determinada expressão lógica for falsa? A) Comando de seleção simples. B) Comando de seleção simples com comando composto. C) Comando de seleção composta. D) Comando de seleção composta com comando composto. E) Estrutura sequencial. NA PRÁTICA TAXA DE ÁGUA E ESGOTO Os comandos condicionais compostos são muito utilizados no nosso dia a dia e são aplicados em situações em que duas alternativas dependem da mesma expressãológica, uma da condição verdadeira (então) e a outra da condição falsa (senão), podendo, dessa forma, determinar ações diferentes dependendo do resultado da análise da expressão lógica. Se for verdadeiro, vai executar um conjunto de ações; se for falso, executará outro conjunto de ações, conforme exemplo de fluxograma apresentado abaixo. No fluxograma acima, pode-se perceber que as ações para a condição “Está frio?” são diferentes para o verdadeiro e para o falso. Outro exemplo que sentimos no nosso bolso durante todos os meses é o pagamento da conta de água e esgoto. Levando como case de estudo um município da região sul do Brasil por meio de informações do Serviço Social Autônomo Municipal de Água e Esgoto (SAMAE ), o município possui pagamentos diferenciados de consumidores em situação de vulnerabilidade social, o que é denominado Tarifa Social de Água e Esgoto, que prevê descontos diferenciados de até 60% para os consumidores. O programa tem por objetivo auxiliar as pessoas de baixa renda e diminuir os registros clandestinos. As famílias que se enquadram nessa categoria devem possuir: Renda familiar – até três salários mínimos ou meio salário mínimo por pessoa/mês. Aposentados, pensionista e pessoas com deficiência e residem sozinhas – até um salário mínimo. Após a comprovação de enquadramento nesses critérios, o consumidor deverá encaminhar ao SAMAE a solicitação de Tarifa Social, juntamente com o comprovante emitido pela Fundação de Ação Social (FAS). O desconto referente à taxa é de 60% para até 10 m³ de água consumidos. É necessário comprovar a cada dois anos, junto ao SAMAE, a regularidade da inscrição no Cadastro Único da FAS. Para essa condição, utilizaremos o comando de seleção composto. Como entrada para o cálculo da taxa, necessitamos do consumo em m3 da residência e se ela está cadastrada em situação de vulnerabilidade social. Veja uma proposta de fluxograma para o problema: Vários municípios e estados regulamentam a tarifa social e possuem descontos diferenciados entre as faixas de consumo. A taxa social é um projeto do governo para reduzir as ligações clandestinas e intensificar o uso racional da água. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Lógica de Programação - Desvio Condicional Composto Vídeo sobre Lógica de Programação - Desvio Condicional Composto (SE...ENTÃO...SENÃO) (If Then Else) - Controle de Decisão Conteúdo interativo disponível na plataforma de ensino! Comandos condicionais de múltipla escolha APRESENTAÇÃO Em muitas situações práticas, a utilização de comando de seleção encadeado torna o algoritmo difícil de desenvolver e até mesmo de validar. Por isso, substituir o comando de seleção encadeado pelo comando de seleção múltipla é uma boa opção em aplicações que permitem essa alteração. Nesta Unidade de Aprendizagem, estudaremos a solução de problemas através da utilização de estruturas condicionais de seleção múltipla no desenvolvimento de algoritmos em forma de fluxograma, sua estrutura básica, análise e teste de aplicações práticas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Analisar algoritmos com estruturas de seleção múltipla em fluxograma.• Identificar problemas que podem ser resolvidos com a aplicação de comando de seleção múltipla. • Construir algoritmos em fluxograma que necessitam de comandos de seleção múltipla para a solução. • DESAFIO Desenvolva um algoritmo em fluxograma para criar uma minicalculadora com algumas operações básicas. O algoritmo deve solicitar ao usuário dois valores reais (operandos) e o símbolo da operação que deseja realizar com os dois valores lidos. Para a solução desse problema, deve-se utilizar o comando de seleção múltipla. O menu que deverá aparecer para o usuário será: Se o operador “+” for digitado, deverá realizar a soma dos dois valores. Se o operador “-” for digitado, deverá realizar a subtração dos dois valores, o primeiro menos o segundo. Se o operador “*“ for digitado, deverá realizar a multiplicação dos dois valores. Se o operador “/“ for digitado, deverá realizar a divisão do maior valor pelo menor valor. Deverá, primeiramente, encontrar quem é o maior e quem é o menor. Se for digitado um operador diferente de “+”, “-“, “*” e “/”, deverá mostrar a frase “Operador inválido” e não permitir a realização e impressão de nenhum cálculo. Ao final, deve ser impresso o resultado da operação, caso seja digitada uma operação válida. O fluxograma poderá ser desenvolvido em qualquer ferramenta (editor de texto, PowerPoint, Visio, DIA, ou feito à mão e escaneado para entregar). Entregue o fluxograma em um arquivo. INFOGRÁFICO A partir da imagem você visualiza os temas que serão tratados nesta Unidade de Aprendizagem, os mesmos fornecem uma base para compreender os comandos que envolvem múltipla escolha. CONTEÚDO DO LIVRO As estruturas de seleção múltipla são aplicadas em situações nas quais pode haver uma ou mais condições a serem testadas e um comando ou um conjunto de comandos diferentes a serem executados em cada uma delas. Para melhor compreender a estrutura de controle de seleção múltipla através de fluxograma, acompanhe um trecho da seguinte obra: EDELWEISS, N.; LIVI, M.A.C. Algoritmos e programação com exemplos em Pascal e C - Vol. 23. Série Livros Didáticos Informática UFRGS. Porto Alegre: Bookman, 2014. O livro servirá como base para esta Unidade de Aprendizagem. No capítulo selecionado, serão apresentados a estrutura básica de funcionamento do comando de seleção múltipla e alguns exemplos de aplicações desenvolvidas. 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 98 Algoritmos e Programação com Exemplos em Pascal e C 4.5 comando de seleção múltipla O comando de seleção múltipla seleciona uma dentre diversas opções, com base na ava- liação de uma expressão. Na pseudolinguagem aqui utilizada, a sintaxe deste comando é: caso <expressão> seja <rótulo 1>: <comando 1> <rótulo 2>: <comando 2> ... <rótulo n>: <comando n> [ senão <comandos> ] fim caso onde ossímbolos “[” e “]” significam que essa linha é opcional. O comando inicia com um cabeçalho caso <expressão> seja, seguido de uma série de comandos rotulados, ou seja, comandos precedidos por um valor seguido do caractere “:”. O resultado da avaliação da expressão utilizada no cabeçalho e os valores representados nos rótulos devem ser todos do mesmo tipo e corresponder a um valor ordinal como, por exem- plo, inteiro ou caractere. Cada rótulo corresponde a somente um comando. Um comando composto pode ser utilizado caso se queira executar mais de uma ação para um determina- do rótulo. Depois de avaliada a expressão, seu resultado é comparado com cada um dos rótulos, na ordem em que são definidos. Somente o comando associado ao primeiro rótulo que for igual ao resultado da expressão é executado. Só a igualdade é verificada. Se o valor da expressão não for igual a qualquer dos rótulos, nada será executado pelo comando. Opcionalmente, poderá ser utilizada a cláusula senão, que indica o comando a ser executado caso nenhum dos rótulos corresponda ao valor da expressão do cabeçalho. O final do comando de seleção múltipla é indicado pelas palavras reservadas fim caso. Por exemplo, supondo que a variável a seja uma variável do tipo inteiro: caso a seja 1: a ← 0 {COMANDO SIMPLES PARA O CASO a = 1} 2: início {COMANDO COMPOSTO PARA O CASO a = 2} ler(a) escrever(a) fim 3: a ← a + 1 {COMANDO SIMPLES PARA O CASO a = 3} senão escrever(a) {CLÁUSULA OPCIONAL PARA OUTROS VALORES DE a} fim caso Um comando de seleção múltipla equivale a um comando de seleção dupla com outros co- mandos de seleção dupla aninhados nele. O exemplo anterior equivale a: Capítulo 4 Estruturas Condicionais e de Seleção 99 se a = 1 então a ← 0 {COMANDO SIMPLES PARA O CASO a = 1} senão se a = 2 então início {COMANDO COMPOSTO PARA O CASO a = 2} ler(a) escrever(a) fim senão se a = 3 então a ← a + 1 {COMANDO SIMPLES PARA O CASO a = 3} senão escrever(a) {CLÁUSULA OPCIONAL} Uma vantagem de usar o comando de seleção múltipla em lugar desses comandos aninhados está na possibilidade de utilizar somente um nível de indentação, o que torna mais clara a visualização das alternativas existentes. A Figura 4.5 representa o fluxograma correspondente ao exemplo anterior. Pode-se observar que o fluxo do programa somente passará por um dos comandos associados aos rótulos. a = 1 a 0 verdadeiro a = 2 a = 3 a a + 1 verdadeiro verdadeiro falso falso falso SAÍDA a ENTRADA a SAÍDA a figura 4.5 Fluxograma de um comando de seleção múltipla. O algoritmo a seguir, que calcula e informa a média e o conceito de um aluno, ilustra a utili- zação de rótulos do tipo caractere em um comando de seleção múltipla: Algoritmo 4.5 – MédiaConceito2 {INFORMA MÉDIA E CONCEITO DE UM ALUNO} Entradas: nota1, nota2, nota3 (real) Saídas: média (real) Informação do conceito do aluno Variável auxiliar: conceito (char) 100 Algoritmos e Programação com Exemplos em Pascal e C início ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS} média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA} escrever (média) {INFORMA MÉDIA} se média ≥ 9 {CÁLCULO DO CONCEITO} então conceito ← 'A' senão se média ≥ 7,5 então conceito ← 'B' senão se média ≥ 6,0 então conceito ← 'C' senão conceito ← 'D' {MÉDIA < 6} caso conceito seja {INFORMA CONCEITO} 'A': escrever('Conceito A – Parabéns!') 'B': escrever('Conceito B') 'C': escrever('Conceito C') 'D': escrever('Conceito D – Você foi reprovado') fim caso fim A implementação do comando de seleção múltipla varia, dependendo da linguagem de pro- gramação utilizada. Algumas linguagens permitem que um comando seja rotulado com uma lista de valores, ou mesmo com um intervalo. No exemplo a seguir, nota somente pode con- ter um valor inteiro: caso nota seja 0..5: escrever('Reprovado'){RÓTULO DO TIPO INTERVALO} 6, 7, 8, 9, 10: escrever('Aprovado') {LISTA DE RÓTULOS} fim caso O primeiro comando é rotulado com o intervalo 0..5, representando os valores inteiros 0, 1, 2, 3, 4 e 5. O comando associado ao intervalo será executado quando o valor da variável nota for um desses valores. O segundo comando apresenta uma lista de rótulos. Se o valor da variável nota for igual a um deles, o segundo comando será executado. Observar que a utili- zação desses dois tipos de rótulos gerou um comando conciso e muito fácil de compreender. 4.6 exercícios de fixação exercício 4.1 Ler um número inteiro. Se o número lido for positivo, escrever uma mensagem indicando se ele é par ou ímpar. Algoritmo ParOuÍmpar {INFORMA SE UM VALOR LIDO DO TECLADO É PAR OU ÍMPAR} Entrada: valor (inteiro) {VALOR A SER TESTADO} Saída: Mensagem de 'par' ou 'ímpar' DICA DO PROFESSOR Em situações nas quais há um grande número de alternativas em um comando de seleção, sempre que possível, deve-se optar pelo comando de seleção múltipla, pois ele também seleciona uma dentre várias opções, com base na avaliação de uma expressão. O comando de seleção múltipla é uma forma diferente de escrever o comando se-então-senão encadeado. Assista ao vídeo para conhecer um pouco mais sobre essa estrutura e sobre as expressões lógicas aplicadas, além de compreender e analisar algumas soluções práticas e o teste de mesa do comando de seleção múltipla em forma de fluxograma. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS Observe o fluxograma:1) Analise as alternativas abaixo com relação ao algoritmo apresentado. É correto o que se afirma em: A) Os valores atribuídos para a variável “valor” são iguais para todos os dias da semana. B) O algoritmo armazena um valor diferente na variável “valor” conforme o dia da semana, sendo esses de 1 a 7. Caso seja digitado um dia diferente de 1, 2, 3, 4, 5, 6 e 7, ele exibe a frase " O dia da semana é inválido" e imprime o conteúdo da variável “Valor” como sendo zero (0). C) Se for introduzido o número 4 para a variável dia, o valor que será impresso na tela será 7.0. D) Se não fosse permitido imprimir o valor zero quando fosse digitado um valor de dia inválido, somente imprimir o valor quando fosse digitado um valor de 1 a 7, a solução seria excluir o comando de escreva “valor” antes do fim do algoritmo. E) O comando de saída Escreva “Dia da semana inválido” é obrigatório na estrutura de um comando de seleção múltipla; sem esse comando, a estrutura não funciona. Observe o fluxograma: 2) Dados os valores de entrada para a=100 e cod =1, qual será o valor armazenado na variável D após executar o trecho de fluxograma apresentado acima? A) 100 B) 130 C) 1 D) 120 E) Nenhuma alternativa correta. Uma empresa de confecções deseja gratificar seus funcionários durante um mês de trabalho em função do aumento de produção e também em função do mês da mulher. Para isso, deverá ser realizado o cálculo do bônus através do gênero dos funcionários. O fluxograma deve receber como dado de entrada a idade e o sexo de uma pessoa, podendo ser “F” para feminino e “M” para masculino. Então, deverá calcular e imprimir o valor do bônus que receberá conforme regras apresentadas na tabela abaixo. Analise o fluxograma abaixo, o qual apresenta uma proposta para a questão. 3) Avalie as sentenças apresentadas com relação ao fluxograma desenvolvido. É correto o que se afirma em: A) No fluxograma, o valor atribuído para o Bônus para idade>21 é de 50.00 e para idade<=21 é de 60.00. Assim, os valores atribuídos ao Bônus para sexo=“M” estão invertidos para os intervalos de idades apresentados na tabela. B) Com valores de entrada para idade = 22 e sexo = “F”, o valor do bônus que será impresso ao final do algoritmo será 65.00. C) Com valores de entrada para idade=25 e sexo=“M”, o valor do Bônusque será impresso ao final do algoritmo será zero(0). D) O algoritmo utiliza o comando de seleção simples, e na condição Sexo=“F”, também possui um comando de seleção simples. E) Com valores de entrada para idade = 19 e sexo =“F’’, o valor do Bônus que será impresso ao final do algoritmo será 0. Os comandos condicionais são estruturas muito utilizadas na solução de problemas nos quais é necessária a seleção de uma dentre várias opções, sendo baseadas em um mesmo teste condicional, podendo este ser verdadeiro ou falso. Analise a tabela apresentada abaixo, que representa, a partir de um código, qual será a alíquota a ser aplicada de imposto. 4) Com base na análise do número de testes a ser realizado e a performance do algoritmo, selecione qual a melhor estrutura apresentada nas alternativas abaixo a ser utilizada para resolver e calcular o imposto baseado em um determinado código. A) Comando de seleção simples. B) Comando de seleção simples de comando composto. C) Estrutura sequencial. D) Estrutura de repetição. E) Comando de seleção múltipla. Considerando o conceito e a aplicação de comandos de seleção múltipla, analise as alternativas abaixo. I – Utilizado em situações que exigem a escolha de uma dentre várias alternativas. II – O comando de seleção múltipla é uma maneira diferente de escrever um comando de seleção composto se-então-senão-fimse encadeado. III – Os problemas representados com comandos de seleção compostos nunca podem ser representados por comandos de seleção múltipla. 5) Identifique as alternativas verdadeiras (V) e falsas (F) e selecione a alternativa correta. A) V, F, V. B) F, F, V. C) V, V, F. D) Todas as alternativas são verdadeiras. E) Todas as alternativas são falsas. NA PRÁTICA % de INSS- Enquadramento do grau de risco O enquadramento do grau de risco, assim como a definição da alíquota que as empresas pagam, é calculado conforme o risco de acidente de trabalho (RAT). Como vimos, um problema pode ter várias soluções, e este problema pode ser resolvido aplicando o comando de seleção composto encadeado, ou, também, pode ser solucionado através da aplicação de um comando de seleção múltipla. A tabela abaixo representa resumidamente a classificação do grau de risco e suas alíquotas. O grau de risco no qual cada empresa está enquadrada é determinado pelo seu Código de Atividade Econômica identificado através do CNPJ da empresa. A tabela completa pode ser consultada no site da Previdência. Site da Previdência Conteúdo interativo disponível na plataforma de ensino! Vamos desenvolver um algoritmo em fluxograma para determinar e imprimir a alíquota do INSS sobre o risco de acidente do trabalho (RAT) para as empresas utilizando seleção múltipla? SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Exemplo de aplicação Conteúdo interativo disponível na plataforma de ensino! Desenvolvimento de algoritmos sequenciais através de fluxogramas APRESENTAÇÃO Nesta Unidade de Aprendizagem, estudaremos a solução de problemas através do desenvolvimento de algoritmos sequenciais em forma de fluxogramas, além de abordarmos a análise e o estudo de várias aplicações práticas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Analisar algoritmos sequenciais em forma de fluxograma.• Desenvolver algoritmos sequenciais através de fluxogramas.• Usar os fluxogramas para representar a resolução de problemas.• DESAFIO Uma empresa comprou um torno e, em função do aumento das despesas fixas, está com dificuldades para cumprir com o pagamento da prestação do mês, que já está em atraso. Faça um algoritmo em fluxograma para calcular e imprimir o valor de uma prestação em atraso. Para o seu desenvolvimento, o usuário da empresa necessita informar o valor normal da prestação, a taxa de juros paga ao mês e o número de dias que a prestação está atrasada. Para o problema, considere o mês composto por 30 dias. O gestor quer visualizar os seguintes dados ao final do algoritmo: valor (em R$) do juro a ser pago e o valor total da parcela com os juros. Exemplo: Valor da prestação: R$ 1.000,00 Juros ao mês: 10 Dias de atraso: 6 Juros a pagar = R$ 20,00 Valor total = R$ 1020,00 Analise o problema apresentado e responda: a) Quais são os dados de entrada? b) Qual a sequência correta do processamento para solucionar o problema? c) Quais são os dados de saída? d) Represente a sua solução em forma de fluxograma. Você pode utilizar qualquer editor para construir o fluxograma. Entregue em forma de imagem. INFOGRÁFICO O esquema mostra os principais temas que serão abordados nesta Unidade de Aprendizagem. CONTEÚDO DO LIVRO A aplicação de fluxograma é muito útil para compreender e descrever a sequência de instruções que um processo deve executar. Para auxiliar nos estudos, acompanhe um trecho da obra Algoritmos e programação com exemplos em Pascal e C - Vol. 23. O livro serve como base para esta Unidade de Aprendizagem. Boa leitura! 23 s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s algoritmos e programação com exemplos em Pascal e C nina edelweiss maria aparecida castro livi E22a Edelweiss, Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014. Editado também como livro impresso em 2014. ISBN 978-85-8260-190-7 1. Informática. 2. Algoritmos – Programação. I. Livi, Maria Aparecida Castro. II. Título. CDU 004.421 as autoras Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni- versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge- nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais e internacionais. Participou de diversos projetos de pesquisa financiados por agências de fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e desenvolvimento de software. Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro- fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial quanto a distância. Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052 ■ ■ Este primeiro capítulo discute algoritmos, formas de expressar algoritmos, etapas para a construção de um algoritmo e de um programa, paradigmas de programação, programação estruturada e fundamentos de representação interna de dados. Introduz, ainda, as linguagens de programação Pascal e C, utilizadas no livro. fundamentos capítulo 1 6 Algoritmos e Programação com Exemplos em Pascal e C Computadores constituem uma poderosa ferramenta para auxiliar o trabalho do homem. O uso mais comum dos computadores é por meio de aplicativos já desenvolvidos e disponíveis, tais como editores de texto, planilhas eletrônicas, sistemas de gerenciamento de bancos de dados, programas de acesso à Internet e jogos. Entretanto, por vezes, as pessoas desenvol- vem soluções específicas para determinadas aplicações, de modo a permitir que as informa- ções dessas aplicações possam ser acessadas e manipuladas de forma mais segura, rápida e eficiente ou com um custo mais baixo. Este livro trata dessa segunda forma de uso dos com-putadores, ou seja, de como um usuário pode projetar e desenvolver soluções próprias para resolver problemas específicos de seu interesse. Este primeiro capítulo apresenta alguns conceitos básicos utilizados no restante do livro: o que vem a ser um algoritmo, formas de expressar algoritmos, etapas para a construção de um algoritmo e de um programa, algumas considerações a respeito das linguagens de programa- ção utilizadas, o que vem a ser a programação estruturada, que é a técnica de programação adotada no desenvolvimento dos programas aqui apresentados, e alguns fundamentos de representação interna de dados. 1.1 o que é um algoritmo Vejamos como são solucionados alguns problemas do cotidiano. exemplo 1: Telefone público. Para utilizar um telefone público como um “orelhão” ou similar, as operações que devemos realizar estão especificadas junto a esse telefone, sendo mais ou menos assim: 1. leve o fone ao ouvido; 2. insira seu cartão no orifício apropriado; 3. espere o sinal para discar; 4. assim que ouvir o sinal, disque o número desejado; 5. ao final da ligação, retorne o fone para a posição em que se encontrava; 6. retire seu cartão. Esse conjunto de operações é o que se denomina algoritmo. Qualquer pessoa pode executar essas operações, na ordem especificada, para fazer suas ligações telefônicas, desde que pos- sua um cartão específico e conheça o número para o qual quer telefonar. exemplo 2: Compra de um livro. Uma compra em um estabelecimento comercial também obedece a uma sequência de ações predeterminadas. Por exemplo, para comprar um livro em uma livraria deve-se: 1. entrar na livraria; 2. verificar se o livro está disponível. Para isso, precisa-se conhecer (1) o título e o autor do livro e (2) ter disponibilidade financeira para a compra. Caso a compra venha a ser efetu- ada, deve-se: a. levar o livro até o balcão; b. esperar que a compra seja registrada no caixa; Capítulo 1 Fundamentos 7 c. pagar o valor correspondente; d. esperar que seja feito o pacote; e. levar o livro comprado. 3. sair da livraria. Os dois exemplos apresentados são resolvidos por uma sequência de ações bem definidas, que devem ser executadas em uma determinada ordem. Outras aplicações de nosso dia a dia podem ser detalhadas de forma semelhante: uma receita de um bolo, o acesso a terminais eletrônicos de bancos, a troca do pneu de um carro, etc. definição de algoritmo. Um algoritmo é definido como uma sequência finita de opera- ções que, quando executadas na ordem estabelecida, atingem um objetivo determinado em um tempo finito. Um algoritmo deve atender aos seguintes requisitos: ■ possuir um estado inicial; ■ consistir de uma sequência lógica finita de ações claras e precisas; ■ produzir dados de saída corretos; ■ possuir estado final previsível (deve sempre terminar). Além de definir algoritmos para resolver problemas do dia a dia, podemos também desenvol- ver algoritmos que podem ser transformados, total ou parcialmente, em programas e execu- tados em computadores. Este livro concentra-se em problemas resolvidos através de algorit- mos que podem ser integralmente executados por computadores. 1.1.1 algoritmos executados por um computador Para que um algoritmo possa ser totalmente executado por um computador é necessário identificar claramente quais as ações que essa máquina pode executar. O exemplo a seguir permite identificar, através de uma simulação, algumas das ações básicas que um computa- dor executa e como isso é feito. Vamos supor que um professor, na sala de aula, mostre aos alunos como é calculada a média das notas de uma prova. Para simplificar, suponhamos que a turma tenha somente cinco alunos. As provas estão sobre sua mesa, já corrigidas. O professor desenha uma grade no quadro, dando nome a cada um dos espaços nos quais vai escrever a nota de cada aluno: Nota1, Nota2, etc. (Figura 1.1). Acrescenta mais um espaço para escrever os resultados de seus cálculos, que chama de Resultado. Para formalizar o que está fazendo, ele escreveu a sequência de ações que está executando em uma folha sobre sua mesa. Ele inicia pegando a primeira prova, olha sua nota (vamos supor que seja 10) e escreve essa nota no espaço reservado para ela, que chamou de Nota1. Essa prova ele coloca em uma segunda pilha sobre a mesa, pois já foi usada e não deve ser considerada uma segunda vez para calcular a média. Em seguida, faz o mesmo para a segun- da prova (nota 8), escrevendo seu valor em Nota2 e colocando-a na pilha das já utilizadas. Ele repete essa operação para cada uma das provas restantes. 8 Algoritmos e Programação com Exemplos em Pascal e C Obtidas todas as notas das provas, o professor passa a realizar as operações que vão calcular a média. Inicialmente, precisa somar todas as notas. Em cima da sua mesa, está uma cal- culadora. Ele consulta cada um dos valores das notas que escreveu no quadro e utiliza essa calculadora para fazer sua soma: Soma = Nota1 + Nota2 + Nota3 + Nota4 + Nota5 O resultado da soma ele escreve no espaço que chamou de Resultado (Figura 1.2a). Feita a soma, ela deve ser dividida por cinco para que seja obtida a média das notas. Utili- zando novamente a calculadora, o professor consulta o que escreveu no espaço Resultado (onde está a soma) e divide este valor por cinco. Como não vai mais precisar do valor da soma, o professor utiliza o mesmo espaço, chamado Resultado, para escrever o valor obtido para a média, apagando o valor anterior (Figura 1.2b). Finalizando, o professor escreve as cinco notas obtidas nas provas e a média em uma folha, utilizando uma máquina de escrever, para informar à direção da escola. 7 Xxxx Xxxx xxxx Qweqweq wewerwr tyutu6 hjhk567 123456 Máquina de escrever Máquina de calcular Sequência de ações Provas corrigidas 10 8 7 Nota1 Nota2 Nota3 Nota4 Nota5 Resultado Quadro Professor 8 Xxxx Xxxx xxxx Provas já usadas figura 1.1 Simulação de um algoritmo. Capítulo 1 Fundamentos 9 A sequência de ações que foram executadas foi a seguinte: 1. ler a nota da primeira prova e escrevê-la em Nota1; 2. ler a nota da prova seguinte e escrevê-la em Nota2; 3. ler a nota da prova seguinte e escrevê-la em Nota3; 4. ler a nota da prova seguinte e escrevê-la em Nota4; 5. ler a nota da prova seguinte e escrevê-la em Nota5; 6. somar os valores escritos nos espaços Nota1, Nota2, Nota3, Nota4 e Nota5. Escrever o resultado da soma em Resultado; 7. dividir o valor escrito em Resultado por cinco e escrever o valor deste cálculo em Resultado; 8. usando a máquina de escrever, escrever os valores contidos em Nota1, Nota2, Nota3, Nota4, Nota5 e Resultado; 9. terminar a execução desta tarefa. Essa sequência de operações caracteriza um algoritmo, sendo que todas as ações realizadas nesse algoritmo podem ser executadas por um computador. A tradução desse algoritmo para uma linguagem que um computador possa interpretar gera o programa que deve ser exe- cutado pelo computador. O professor corresponde à unidade central de processamento (UCP ou, mais comumente, CPU, de Central Processing Unit), responsável pela execução desse pro- grama. Essa unidade organiza o processamento e garante que as instruções sejam executadas na ordem correta. 10 8 7 5 9 39 10 8 7 5 9 7,8 (a) (b) Quadro Quadro Nota1 Nota2 Nota3 Nota4 Nota5 Resultado Nota1 Nota2 Nota3 Nota4 Nota5 Resultado figura 1.2 Valores durante a simulação. 10 Algoritmos e Programação com Exemplos em Pascal e C Fazendo um paralelo entre o exemplo e um computador real, os espaços desenhados na gra- de do quadro constituem a memória principal do computador, que é composta por espaços acessados pelos programas através de nomes dados pelo programador. Nesses espaços são guardadas, durante o processamento, informações lidas na entrada e re- sultados de processamentos, como no exemplo visto. Cada um desses espaços só pode conter um valor a cada momento, perdendo o valor anterior se um novo valor for armazenado nele, como ocorreu quandose escreveu a média em Resultado, apagando o valor da soma que lá estava. Denomina-se variável cada um desses espaços utilizados para guardar valores, denotando que seu valor pode variar ao longo do tempo. As instruções de um programa que está sendo executado também são armazenadas na memória principal. Todas as informações armazenadas nas variáveis da memória principal são perdidas no momento em que termina a execução do programa. Unidades de memória secundária podem ser utilizadas para guardar informações (dados) a fim de serem utilizadas em outra ocasião. Exemplos de dispositivos de memória secundária são HDs (Hard Disks), CDs, DVDs e pendrives. A comunicação do computador com o usuário durante o processamento e ao seu final é feita através de unidades de entrada e saída. No exemplo anterior, a pilha de provas corresponde à unidade de entrada do computador, através da qual são obtidos os valores que serão utili- zados no processamento. A unidade de entrada mais usada para interação entre o usuário e o programa durante a execução é o teclado do computador. Quando se trata de imagens, a unidade de entrada pode ser, por exemplo, uma máquina fotográfica ou um scanner. A máquina de escrever corresponde à unidade de saída, que informa aos usuários o resul- tado do processamento. Exemplos de unidades de saída são o vídeo do computador e uma impressora. As unidades de entrada e saída de dados constituem as únicas interfaces do computador com seu usuário. Observe que, sem as unidades de entrada e saída, não é possível fornecer dados ao computador nem saber dos resultados produzidos. A máquina de calcular corresponde à unidade aritmética e lógica do computador, responsá- vel pelos cálculos e inferências necessários ao processamento. Sua utilização fica totalmente transparente ao usuário, que somente é informado dos resultados do processamento. Resumindo, um computador processa dados. Processar compreende executar atividades como, por exemplo, comparações, realização de operações aritméticas, ordenações. A partir de dados (de entrada), processando-os, o computador produz resultados (saídas). Na figu- ra 1.3, vê-se um esquema simplificado da organização funcional de um computador. Nela podem ser observados os sentidos em que as informações fluem durante a execução de um programa: o sistema central do computador compreende a CPU e a memória principal; na CPU estão as unidades de controle e de aritmética e lógica; a unidade de controle tem acesso à memória principal, às unidades de entrada e de saída de dados e aos dispositivos de me- mória secundária. Capítulo 1 Fundamentos 11 1.1.2 comandos básicos executados por um computador Analisando o exemplo anterior, identificamos as primeiras ações que podem ser executadas por um computador: ■ obter um dado de uma unidade de entrada de dados, também chamada de leitura de um dado; ■ informar um resultado através de uma unidade de saída, também chamada de escrita de uma informação ou saída de um dado; ■ resolver expressões aritméticas e lógicas; ■ colocar o resultado de uma expressão em uma variável. Essas ações são denominadas instruções ou comandos. Outros comandos serão vistos ao longo deste livro. 1.1.3 da necessidade do desenvolvimento de algoritmos para solucionar problemas computacionais Nas atividades cotidianas já vistas, é sem dúvida necessária alguma organização por parte de quem vai realizar a tarefa. No uso do telefone, retirar o fone do gancho e digitar o número e, só depois, inserir o cartão não será uma boa estratégia, assim como, no caso da livraria, levar o livro sem passar pelo caixa também resultará em problemas. Nessas atividades, no entanto, grande parte das pessoas não necessita colocar por escrito os passos a realizar para cumprir a tarefa. Porém, quando se trata de problemas a solucionar por computador, a sequência de Unidade de entrada Unidade de saída Unidade de memória auxiliar Memória principal Unidade Central de Processamento - UCP Sistema central Unidade aritmética e lógica Unidade de controle figura 1.3 Esquema simplificado de um computador. 12 Algoritmos e Programação com Exemplos em Pascal e C ações que o computador deve realizar é por vezes bastante extensa e nem sempre conhecida e óbvia. Para a programação de computadores, a análise cuidadosa dos elementos envolvidos em um problema e a organização criteriosa da sequência de passos necessários à sua solução (algoritmo) devem obrigatoriamente preceder a escrita do programa que busque solucionar o problema. Para problemas mais complexos, o recomendável é desenvolver um algoritmo detalhado antes de passar à etapa de codificação, mas para problemas mais simples, o algo- ritmo pode especificar apenas os passos principais. 1.1.4 formas de expressar um algoritmo Em geral, no desenvolvimento de algoritmos computacionais não são utilizadas nem as lin- guagens de programação nem a linguagem natural, mas formas mais simplificadas de lingua- gens. As formas mais usuais de representação de algoritmos são a linguagem textual, alguma pseudolinguagem e o fluxograma. Para exemplificar cada uma delas vamos usar o seguinte exemplo: obter a soma de dois valores numéricos quaisquer. linguagem textual. Foi a forma utilizada para introduzir o conceito de algoritmo nos exem- plos anteriores. Analisando o problema aqui colocado, para obter a soma de dois valores é preciso realizar três operações na ordem a seguir: 1. obter os dois valores 2. realizar a soma 3. informar o resultado pseudolinguagem. Para padronizar a forma de expressar algoritmos são definidas pseu- dolinguagens. Uma pseudolinguagem geralmente é bastante semelhante a uma linguagem de programação, sem, entretanto, entrar em detalhes como, por exemplo, formatação de in- formações de entrada e de saída. As operações básicas que podem ser executadas pelo com- putador são representadas através de palavras padronizadas, expressas na linguagem falada (no nosso caso, em Português). Algumas construções também são padronizadas, como as que especificam onde armazenar valores obtidos e calculados, bem como a forma de calcular expressões aritméticas e lógicas. Antecipando o que será visto nos capítulos a seguir, o algoritmo do exemplo recém-discutido é expresso na pseudolinguagem utilizada neste livro como: Algoritmo 1.1 – Soma2 {INFORMAR A SOMA DE 2 VALORES} Entradas: valor1, valor2 (real) Saídas: soma (real) início ler (valor1, valor2) {ENTRADA DOS 2 VALORES} soma ← valor1 + valor2 {CALCULA A SOMA} escrever (soma) {INFORMA A SOMA} fim Capítulo 1 Fundamentos 13 fluxograma. Trata-se de uma representação gráfica que possibilita uma interpretação visual do algoritmo. Cada ação é representada por um bloco, sendo os blocos interligados por linhas dirigidas (setas) que representam o fluxo de execução. Cada forma de bloco representa uma ação. A Figura 1.4 mostra alguns blocos utilizados em fluxogramas neste livro, juntamente com as ações que eles representam. São adotadas as formas propostas na padronização feita pela ANSI (American National Standards Institute) em 1963 (Chapin, 1970), com algumas adaptações. Outras formas de blocos serão introduzidas ao longo do texto. A representação do algoritmo do exemplo acima está na Figura 1.5. A representação através de fluxogramas não é adequada para algoritmos muito extensos, com grande número de ações a executar. Utilizaremos a representação de fluxogramas so- mente como apoio para a compreensão das diferentes construções que podem ser utilizadas nos algoritmos. 1.1.5 eficácia e eficiência de algoritmos Dois aspectos diferentes devem ser analisados quando se constrói um algoritmo para ser exe- cutado em um computador: sua eficácia (exatidão) e sua eficiência. eficácia (corretude) de um algoritmo. Um algoritmo deve realizar corretamente a tarefa para a qual foi construído. Além de fazer o que se espera, o algoritmo deve fornecer o resul- tado correto para quaisquer que sejam os dadosfornecidos como entrada. A eficácia de um algoritmo deve ser exaustivamente testada antes que ele seja implementado em um compu- tador, o que levou ao desenvolvimento de diversas técnicas de testes, incluindo testes formais. A forma mais simples de testar um algoritmo é através de um “teste de mesa”, no qual se si- ENTRADA lista de variáveis variável expressão Ponto em que inicia a execução do algoritmo. Ponto em que termina a execução do algoritmo. Entrada de dados: leitura de informações para preencher a lista de variáveis. Saída de dados: informa conteúdos das variáveis da lista. Atribuição: variável recebe o resultado da expressão. início fim SAÍDA lista de variáveis figura 1.4 Blocos de fluxograma. 14 Algoritmos e Programação com Exemplos em Pascal e C mula com lápis e papel sua execução, com conjuntos diferentes de dados de entrada. No final de cada capítulo deste livro, são indicados alguns cuidados a adotar para verificar a exatidão dos algoritmos durante os testes. eficiência de um algoritmo. A solução de um problema através de um algoritmo não é necessariamente única. Na maioria dos casos, algoritmos diferentes podem ser construídos para realizar uma mesma tarefa. Neste livro será enfatizada a utilização de técnicas que levam à construção de algoritmos mais eficientes. Entretanto, em alguns casos não se pode dizer a priori qual a melhor solução. Pode-se, sim, calcular qual a forma mais eficiente, com base em dois critérios: tempo de execução e espaço de memória ocupado. Aspectos de eficiência de algoritmos são vistos em outro livro desta série (Toscani; Veloso, 2012). Um exemplo da diferença entre eficácia e eficiência pode ser observado na receita de ovo mexido mostrada a seguir: 1. ligar o fogão em fogo baixo; 2. separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto; 3. quebrar o ovo em uma tigela; 4. colocar sal na tigela; 5. misturar levemente o ovo e o sal, com um garfo; 6. aquecer a manteiga na frigideira até que comece a derreter; 7. jogar o ovo na frigideira, mexendo com uma colher até ficar firme; 8. retirar da frigideira e servir. ENTRADA valor1, valor2 soma valor1 + valor2 início fim SAÍDA soma figura 1.5 Fluxograma da soma de dois números. Capítulo 1 Fundamentos 15 Se analisarmos o algoritmo acima, podemos observar que, embora o ovo mexido seja obtido, garantindo a eficácia da receita, existe uma clara ineficiência em relação ao gasto de gás, uma vez que ligar o fogão não é pré-requisito para a quebra do ovo e mistura do ovo e do sal. Já em outras ações, como as especificadas nos passos 3 e 4, a sequência não é relevante. Se modificarmos apenas a sequência das ações, conforme indicado abaixo, então teremos um algoritmo eficaz e mais eficiente: 1. separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto; 2. quebrar o ovo em uma tigela; 3. colocar sal nesta tigela; 4. misturar levemente o ovo e o sal, com um garfo; 5. ligar o fogão em fogo baixo; 6. aquecer a manteiga na frigideira até que comece a derreter; 7. jogar o ovo na frigideira, misturando com uma colher até ficar firme; 8. retirar da frigideira e servir. 1.2 etapas de construção de um programa A construção de um algoritmo para dar suporte computacional a uma aplicação do mundo real deve ser feita com todo cuidado para que ele realmente execute as tarefas que se quer de forma correta e em tempo razoável. Programar não é uma atividade trivial, muito antes pelo contrário, requer muito cuidado e atenção. A dificuldade em gerar bons programas levou à definição de técnicas específicas que iniciam frequentemente com a construção de um algoritmo. A forma mais simples de garantir a qualidade de um programa é construí-lo seguindo uma série de etapas. Parte-se de uma análise inicial da realidade envolvida na aplicação, desenvol- vendo a solução de forma gradual, e chega-se ao produto final: um programa que executa as funcionalidades necessárias à aplicação. A seguir, são explicadas as etapas que devem ser cumpridas para assegurar a construção de um programa correto (Figura 1.6). Observe que este processo não é puramente sequencial, mas, em cada etapa, pode ser necessário voltar a alguma etapa anterior para desenvolver com mais detalhes algum aspecto. ■ análise detalhada do problema. Inicia-se com uma análise detalhada do problema, identificando os aspectos que são relevantes para a sua solução. No Algoritmo 1.1, o problema é: Informar a soma de dois valores. ■ especificação dos requisitos do problema. Nessa etapa são identificados e especi- ficados os resultados que deverão ser produzidos (saídas) e os dados que serão neces- sários para a execução da tarefa requerida (entradas). No Algoritmo 1.1, os dados de entrada e saída são: 16 Algoritmos e Programação com Exemplos em Pascal e C Entradas: dois valores numéricos, digitados via teclado. Saída: a soma dos dois valores, mostrada na tela. Esse é um problema simples, adequado à introdução dos conceitos iniciais. Contudo, na prática, não apenas os objetivos podem ser mais complexos como a identificação de en- tradas e saídas pode incluir formatos e valores válidos, bem como quantidades de valores e a especificação de outros dispositivos de entrada e saída. ■ construção de um algoritmo. A etapa seguinte é o projeto de um algoritmo que solucione o problema, ou seja, de um conjunto finito de ações que, quando executadas na ordem estabelecida, levem ao resultado desejado em um tempo finito. É importante notar que mesmo os problemas mais simples tendem a ter mais de uma solução possí- vel, devendo ser determinada a solução que será adotada. Nesta etapa já devem ser cria- dos nomes de variáveis que irão armazenar os valores de entrada e os valores gerados durante o processamento. O Algoritmo 1.1. representa uma possível solução alcançada nesta etapa. ■ validação do algoritmo. Em seguida, deve ser feita a validação lógica do algoritmo desenvolvido. Essa validação muitas vezes é feita através de um teste de mesa, ou seja, simulando sua execução com dados virtuais. Procura-se, através desses testes, verificar se a solução proposta atinge o objetivo. Devem ser feitos testes tanto com valores corretos como incorretos. No exemplo que está sendo utilizado aqui, os dados para testes devem incluir valores nulos, positivos e negativos, como por exemplo: Problema Entradas e saídas Verificação do programa Manutenção Construção do algoritmo Análise Validação do algoritmo Construção do programa figura 1.6 Etapas da construção de um programa. Capítulo 1 Fundamentos 17 Valor1 Valor2 Soma 0 0 0 26 12 38 -4 –10 –14 12 –10 2 -5 2 –3 ■ codificação do programa. É a tradução do algoritmo criado para resolver o problema para uma linguagem de programação. Os programas em Pascal e C gerados a partir do algoritmo desenvolvido para o exemplo (Algoritmo 1.1) são apresentados no Capítulo 3. ■ verificação do programa. Consiste nas verificações sintática (compilação) e semântica (teste e depuração) do programa gerado. Os mesmos valores utilizados no teste de mesa podem ser utilizados para testar o programa gerado. ■ manutenção. Uma vez considerado pronto, o programa passa a ser utilizado por usuá- rios. A etapa de manutenção do programa inicia no momento em que ele é liberado para execução, e acompanha todo seu tempo de vida útil. A manutenção tem por finalidade corrigir eventuais erros detectados, assim como adicionar novas funcionalidades. Cada uma dessas fases é importante, devendo ser respeitada e valorizada para se chegar a programas de qualidade. Neste sentido, aqui são fornecidos subsídios a fim de que todas as etapas sejam consideradas durante a escrita de programas como, por exemplo, a indicação de valores que devem ser utilizados nos testes de cada comando e conselhos para deixar os programas legíveis, de modo a facilitar a sua manutenção. 1.3 paradigmas de programação O programa realmente executado por um computador é escritoem uma linguagem com- preendida pela máquina, por isso denominada linguagem de máquina, na qual as instru- ções são codificadas no sistema de numeração binário. A utilização direta de linguagem de máquina é bastante complicada. Para tornar a escrita de programas mais acessível a usuá- rios comuns foram desenvolvidas linguagens de mais alto nível, denominadas linguagens de programação. São linguagens que permitem a especificação das instruções que deverão ser executadas pelo computador através de uma linguagem mais próxima da linguagem natural. Um programa escrito numa linguagem de programação, denominado programa-fonte, deve ser primeiro traduzido para linguagem de máquina, para só então ser executado pelo com- putador. A tradução do programa-fonte para o programa em linguagem de máquina corres- pondente é feita por um outro programa, específico para a linguagem utilizada, denominado compilador (Figura 1.7). Na busca de uma forma simples, clara e precisa de escrever programas, diversas linguagens de programação foram desenvolvidas nos últimos anos. Toda linguagem possui uma sintaxe bem definida, que determina as construções corretas a serem utilizadas para a elaboração de programas. Além disso, cada linguagem de programação utiliza um conjunto de concei- 18 Algoritmos e Programação com Exemplos em Pascal e C tos adotados na solução de problemas, o qual corresponde à semântica desta linguagem, ou seja, à forma como construções sintaticamente corretas são executadas. Esses conceitos possibilitam diferentes abordagens de problemas e formulações de soluções, isto é, seguem diferentes paradigmas de programação. A palavra “paradigma” corresponde a um modelo ou padrão de como uma realidade é entendi- da e de como se interage com essa realidade. Aqui, um paradigma de programação corresponde à forma como a solução está estruturada e será executada no programa gerado, incluindo téc- nicas e conceitos específicos, bem como os recursos disponibilizados. Os principais paradigmas das linguagens de programação são (Ghezzi; Jazayeri, 1987; Melo, Silva, 2003; Sebesta, 2003): ■ imperativo ou procedural, no qual um programa é composto por uma sequência de comandos a serem executados pelo computador em uma determinada ordem. Dentre as linguagens de programação voltadas a esse paradigma destacam-se Pascal, C, Fortran, Cobol, PL/1, Basic, Algol, Modula e Ada, entre outras; ■ funcional, em que um programa é composto pela declaração de funções que transfor- mam a(s) entrada(s) na(s) saída(s) desejada(s). Exemplos de linguagens funcionais são Lisp, ML, Miranda, Haskell e OCaml; ■ lógico, que utiliza a avaliação de condições lógicas como base para a escrita dos progra- mas. Um programa é composto por regras que disparam ações a partir da identificação de premissas. Um exemplo desse paradigma é a linguagem Prolog; ■ orientação a objetos, em que o mundo real é representado por meio de classes de objetos e das operações que podem ser realizadas sobre eles, as quais definem seu com- portamento. Herança e polimorfismo são conceitos básicos adotados nesse paradigma. Smalltalk, C++, Java, PascalOO, Delphi, C#, Eiffel e Simula são exemplos de linguagens orientadas a objetos. A forma de escrever um programa em cada um desses paradigmas é bastante diferente. Neste livro será considerado somente o paradigma imperativo ou procedural. Essa opção, para um primeiro curso em programação, justifica-se pelas seguintes razões: ■ o paradigma imperativo permite representar de uma forma intuitiva os problemas do dia a dia, que geralmente são executados através de sequências de ações; Programa-fonte Programa em linguagem de programação Programa em linguagem de máquina COMPILADOR Programa executável figura 1.7 Tradução de programa-fonte para executável. Capítulo 1 Fundamentos 19 ■ historicamente, os primeiros programas foram desenvolvidos utilizando linguagens impe- rativas, sendo esse um paradigma dominante e bem estabelecido; ■ existe um grande número de algoritmos e de sistemas implementados em linguagens que seguem esse paradigma, os quais podem ser utilizados como base para o desenvol- vimento de novos programas. A opção de utilizar as linguagens Pascal e C neste livro deu-se por serem essas as linguagens mais utilizadas como introdutórias à programação na maior parte dos cursos brasileiros de ciência da computação, informática e engenharia da computação. A linguagem Pascal foi definida por Niklaus Wirth em 1970 (Wirth, 1971, 1972, 1978) com a finalidade de ser utilizada em aplicações de propósito geral e, principalmente, para ensino de programação. Uma característica importante de Pascal é que foi, desde sua criação, pensada para dar suporte à programação estruturada. Pascal serviu de base para o desenvol- vimento de diversas outras linguagens de programação (Ghezzi; Jazayeri, 1987). Portanto, o aprendizado de novas linguagens de programação, sobretudo as que seguem o paradigma imperativo, se torna mais fácil para quem conhece Pascal. A linguagem C foi desenvolvida por Dennis Ritchie nos anos 1970 (Kernighan; Ritchie, 1988) com o propósito de ser uma linguagem para a programação de sistemas. É hoje largamente utilizada em universidades e no desenvolvimento de software básico. 1.4 programação estruturada A programação estruturada (Jackson, 1975) pode ser vista como um subconjunto do pa- radigma imperativo. Baseia-se no princípio de que o fluxo do programa deve ser estruturado, devendo esse fluxo ficar evidente a partir da estrutura sintática do programa. A estruturação deve ser garantida em dois níveis: de comandos e de unidades. No nível de comandos, a programação estruturada fundamenta-se no princípio básico de que um programa deve possuir um único ponto de entrada e um único ponto de saída, existindo de “1 a n” caminhos definidos desde o princípio até o fim do programa e sendo todas as ins- truções executáveis, sem que apareçam repetições (loops) infinitas de alguns comandos. Nes- se ambiente, o programa deve ser composto por blocos elementares de instruções (coman- dos), interconectados através de apenas três mecanismos de controle de fluxo de execução: sequência, seleção e iteração. Cada bloco elementar, por sua vez, é delimitado por um ponto de início – necessariamente no topo do bloco – e por um ponto de término – necessariamente no fim do bloco – de execução, ambos muito bem definidos. Os três mecanismos de controle do fluxo de execução estão representados na Figura 1.8 através de fluxogramas, nos quais se observa claramente os pontos de entrada e de saída de cada bloco de instruções. Alguns dos blocos que constam nessa figura serão vistos nos próximos capítulos deste livro. Uma característica fundamental da programação estruturada é que o uso de desvios incondi- cionais no programa, implementados pelo comando GOTO (VÁ PARA), é totalmente proibido. 20 Algoritmos e Programação com Exemplos em Pascal e C Embora esse tipo de comando, em alguns casos, possa facilitar a construção de um progra- ma, dificulta enormemente sua compreensão e manutenção. No nível de unidades, a programação estruturada baseia-se na ideia proposta em 1972 pelo cientista de computação E. W. Dijkstra: “A arte de programar consiste na arte de organizar e dominar a complexidade dos sistemas”. A programação estruturada enfatiza a utilização de unidades separadas de programas, chamadas de módulos, que são ativadas através de comandos especiais. Propõe que os programas sejam divididos em um conjunto de subpro- gramas menores, cada um com seu objetivo específico e bem definido, mais fáceis de imple- mentar e de testar (seguindo a tática de “dividir para conquistar”). O desenvolvimento de programas deve ser feito de forma descendente, com a decomposição do problema inicial em módulos ou estruturas hierárquicas, de modo a dividir ações comple- xas em uma sequência de ações mais simples, desenvolvidas de forma mais fácil. Essa técnica decorre da programação estruturadae é também conhecida como programação modular. Resumindo, a programação estruturada consiste em: ■ uso de um número muito limitado de estruturas de controle; ■ desenvolvimento de algoritmos por fases ou refinamentos sucessivos; ■ decomposição do algoritmo total em módulos. Essas técnicas para a solução de problemas visam à correção da solução desenvolvida, bem como à simplicidade dessa solução, garantindo uma melhor compreensão do que é feito e facilitando a manutenção dos programas por outras pessoas além do desenvolvedor inicial. Neste texto será utilizada a programação estruturada, incentivando o desenvolvimento de programas através de módulos, de forma a garantir a qualidade dos programas construídos (Farrer et al., 1999). Seguindo os preceitos da programação estruturada, comandos do tipo GOTO (VÁ PARA), que alteram o fluxo de execução incondicionalmente, não serão tratados neste livro. Sequência Seleção Iteração figura 1.8 Estruturas de controle de fluxo de execução na programação estruturada. Capítulo 1 Fundamentos 21 1.5 elementos de representação interna de dados Internamente, os computadores digitais operam usando o sistema numérico binário, que utiliza apenas os símbolos 0 e 1. Na memória e nos dispositivos de armazenamento, o com- ponente conceitual básico e a menor unidade de armazenamento de informação é o bit. Bit vem do Inglês binary digit, ou seja, dígito binário, e um bit pode memorizar somente um entre dois valores: zero ou um. Qualquer valor numérico pode ser expresso por uma sucessão de bits usando o sistema de numeração binário. Para representar caracteres, são utilizados códigos armazenados em conjuntos de bits. Os códigos mais comuns armazenam os caracteres em bytes, que são conjuntos de 8 bits. Nos códigos de representação de caracteres, cada caractere tem associado a si, por convenção, uma sequência específica de zeros e uns. Três códigos de representação de caracteres são bastante utilizados: ASCII (7 bits por caractere), EBCDIC (8 bits por caractere) e UNICODE (16, 32 ou mais bits). Tanto o ASCII (American Standard Code for Information Interchange), que é o código utiliza- do pela maioria dos microcomputadores e em alguns periféricos de equipamentos de grande porte, quanto o EBCDIC (Extended Binary Coded Decimal Interchange Code) utilizam um byte para representar cada caractere, sendo que, na representação do conjunto de caracteres ASCII padrão, o bit mais significativo (bit mais à esquerda) do byte é sempre igual a 0. A represen- tação dos caracteres A e Z nos dois códigos é: Caracteres EBCDIC ASCII A 1100 0001 0100 0001 Z 1110 1001 0101 1010 O UNICODE é promovido e desenvolvido pelo Unicode Consortium. Busca permitir aos com- putadores representar e manipular textos de forma consistente nos múltiplos sistemas de escrita existentes. Atualmente, ele compreende mais de 100.000 caracteres. Dependendo do conjunto de caracteres que esteja em uso em uma aplicação, um, dois ou mais bytes podem ser utilizados na representação dos caracteres. As unidades de medida utilizadas para quantificar a memória principal e indicar a capacidade de armazenamento de dispositivos são: K quilo (mil) 103 M mega (milhão) 106 G giga (bilhão) 109 T tera (trilhão) 1012 O sistema métrico de unidades de medida utiliza os mesmos prefixos, mas o valor exato de cada um deles em informática é levemente superior. Como o sistema de numeração utilizado 22 Algoritmos e Programação com Exemplos em Pascal e C internamente em computadores é o binário (base 2), as capacidades são representadas como potências de 2: K 1.024 210 M 1.048.576 220 etc... A grafia dos valores expressos em múltiplos de bytes pode variar. Assim, por exemplo, 512 quilobytes podem ser escritos como 512K, 512KB, 512kB ou 512Kb. Já os valores expressos em bits, via de regra, são escritos por extenso, como em 512 quilobits. 1.6 dicas Critérios que devem ser observados ao construir um algoritmo: ■ procurar soluções simples para proporcionar clareza e facilidade de entendimento do algoritmo; ■ construir o algoritmo através de refinamentos sucessivos; ■ seguir todas as etapas necessárias para a construção de um algoritmo de qualidade; ■ identificar o algoritmo, definindo sempre um nome para ele no cabeçalho. Este nome deve traduzir, de forma concisa, seu objetivo. Por exemplo: Algoritmo 1.1 – Soma2 indica, através do nome, que será feita a soma de dois valores; ■ definir, também no cabeçalho, o objetivo do algoritmo, suas entradas e suas saídas; ■ nunca utilizar desvios incondicionais, como GOTO (VÁ PARA). 1.7 testes Testes de mesa. É importante efetuar, sempre que possível, testes de mesa para verificar a efi- cácia (corretude) de um algoritmo antes de implementá-lo em uma linguagem de programa- ção. Nestes testes, deve-se utilizar diferentes conjuntos de dados de entrada, procurando usar dados que cubram a maior quantidade possível de situações que poderão ocorrer durante a utilização do algoritmo. Quando o algoritmo deve funcionar apenas para um intervalo defini- do de valores, é recomendável que se simule a execução para valores válidos, valores limítrofes válidos e inválidos e valores inválidos acima e abaixo do limite estabelecido. Por exemplo, se um determinado algoritmo deve funcionar para valores inteiros, no intervalo de 1 a 10, inclusive, o teste de mesa deveria incluir a simulação da execução para, no mínimo, os valores 0, 1, 10, 11 e um valor negativo. ■ ■ Este capítulo trata da construção de algoritmos sequenciais. São analisados os comandos de entrada de dados, de saída de dados e de atribuição. É apresentada a estrutura de um algoritmo completo, com cabeçalho, declarações, comandos e comentários, bem como sua tradução para as linguagens Pascal e C. algoritmos sequenciais capítulo 3 58 Algoritmos e Programação com Exemplos em Pascal e C A partir deste capítulo, passarão a ser analisados problemas reais e serão mostrados algorit- mos possíveis para solucioná-los via computador. A complexidade dos algoritmos aumentará gradativamente e, em cada capítulo, haverá a introdução de novos elementos, que ampliarão a gama de problemas passíveis de solução computacional. No Capítulo 1 foi introduzido o conceito de algoritmo, tendo sido identificados alguns co- mandos básicos executados por um computador, como entrada e saída de dados e atribuição de um valor a uma variável. O Capítulo 2 tratou de variáveis e expressões, incluindo suas formas de representação. Neste capítulo os elementos já introduzidos são utilizados na escrita dos primeiros programas completos gerados a partir de algoritmos puramente sequenciais. Os programas são desenvolvidos na pseudolinguagem e, logo após, convertidos para as linguagens de progra- mação Pascal e C. 3.1 esquema básico dos algoritmos sequenciais Os problemas puramente sequenciais geralmente incluem três atividades, que ocorrem nor- malmente na ordem indicada a seguir: entrada de dados, processamento realizado sobre es- ses dados (cálculos, comparações) e saída de dados ou apresentação dos resultados. Mesmo em problemas mais complexos, essas atividades constituem o esquema básico subjacente. O processamento e a saída de dados são elementos sempre presentes; já a entrada pode eventualmente não ocorrer, como nos casos em que o processamento se baseia em valores predefinidos e constantes. Entradas são os dados fornecidos pelo usuário durante a execução do programa, sem os quais não é possível solucionar o problema. Existem casos em que alguns dados de entrada, pela sua constância e regularidade, podem ser utilizados como constantes em uma solução. No Exercício de Fixação 3.3 (discutido na Seção 3.6), em que um valor em reais é convertido para dólares, em um período de estabilidade da moeda americana a taxa de conversão para o dólar poderia ser colocada como um valor constante na expressão de cálculo. Mas caso fosse preciso alterar essa taxa, seria necessário alterar