Baixe o app para aproveitar ainda mais
Prévia do material em texto
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 uso das 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 paraC, 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 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 árduade 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 da segunda, 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: 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 vistos em 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 �ca à 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 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 divididopor 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 Avalie se 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ãocom 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 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 deseleçã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 Figura 9, 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 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úmeros que 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 10 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 LINGUAGEM DE PROGRAMAÇÃO Maurício de Oliveira Saraiva Funções e procedimentos Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Definir funções e procedimentos. � Criar a chamada de funções e procedimentos. � Usar variáveis locais e globais. Introdução Escrever programas legíveis e de fácil manutenção está entre os prin- cipais objetivos de qualquer programador de computador. Na prática, não raras vezes, encontra-se programas grandes, os quais geralmente repetem trechos de código, e a experiência tem mostrado que eles são difíceis de entender e que dividi-los em módulos menores pode facilitar a legibilidade e o entendimento, bem como aumentar a produtividade por meio do reuso de código. Neste capítulo, você estudará a declaração e a chamada de funções, bem como o uso de variáveis locais e globais. Funções e procedimentos Ao longo dos anos, analistas e programadores têm percebido que dividir programas em blocos menores facilita o entendimento e a manutenção dos códigos escritos, uma vez que resolver os problemas de pequenos módulos é mais fácil que de programas inteiros (DEITEL; DEITEL, 2011). No âmbito das linguagens de programação, como C e C++, os programas são divididos em módulos ou subprogramas por meio de funções ou procedi- mentos, que proporcionam diversas vantagens a eles, sendo uma das principais a reutilização de código, pois pode ser aproveitado em várias partes de um ou outros programas, evitando a repetição de comandos e instruções (VOTRE, 2016). Com isso, os programadores escrevem blocos de comandos que realizam determinadas atividades de forma independente, como um cálculo matemático. A função deve ser concisa, objetiva e executar apenas uma atividade ou funcionalidade. Assim, caso haja dificuldade de nomeá-la, significa que ela poderá ser subdividida em outras funções mais especializadas (DEITEL; DEITEL, 2011). De modo geral, o procedimento e a função podem ser conceituados da seguinte forma (SILVA FILHO, 2010). � Procedimento: é um conjunto de instruções que desviam o fluxo de sequência de um programa, podendo ou não receber parâmetros, po- rém, não retorna nenhum valor. Por exemplo, uma rotina que inclui o cabeçalho e o rodapé com dados da empresa em uma tela do sistema. � Função: é um conjunto de instruções que desviam o fluxo de execução de um programa, podendo ou não receber parâmetros. No entanto, uma função deve, obrigatoriamente, retornar um valor após a sua execução. Por exemplo, calcular o imposto de cada produto de uma nota fiscal. Com a linguagem C++, é comum os programadores referenciarem as funções e os procedimentos como se fossem funções, porém, a diferença entre eles está no tipo do valor do retorno, pois o primeiro retorna um valor, já o segundo não retorna nada. A declaração de uma função é realizada da mesma forma, tanto na lingua- gem C como na C++ e segue o seguinte modelo, conforme explicam Deitel e Deitel (2011): tipo de valor de retorno + nome da função + (lista de parâmetros) Em que: � Tipo de valor de retorno: especifica o tipo do retorno. Para função, ele geralmente é um tipo primitivo, como int, float, char, etc., mas pode ser uma estrutura, um ponteiro, um objeto ou algum outro. Já para procedimento, ele se define pela palavra reservada void, que não possui retorno. Funções e procedimentos2 � Nome da função: define o nome pelo qual a função pode ser invocada ou chamada. � Lista de parâmetros: compreende os dados que são transferidos e podem ser utilizados e modificados dentro da função. Esse item é opcional, uma vez que a função não precisa ter parâmetros, por isso, nesse caso, pode-se usar a palavra reservada void para indicar que não existem parâmetros ou, simplesmente, deixar vazio. Escolher os nomes de funções e parâmetros significativos torna os programas mais legíveis e ajuda a evitar o uso excessivo de comentários (DEITEL; DEITEL, 2011). Veja o exemplo de uma função que recebe dois números do tipo double por parâmetro, efetua sua soma e retorna um valor, cujo tipo é double e se define pela palavra reserva return, que devolve a variável soma no final da execução. Já as variáveis n1 e n2 são passadas por parâmetro juntamente ao seu tipo de dados (double). Note que essa função define o tipo do seu retorno, assim, a instrução return deve, obrigatoriamente, devolver um valor do mesmo tipo de dados. Em um exemplo semelhante, vê-seuma função que não retorna valor (um procedimento) e, nesse caso, deseja-se imprimir a subtração na tela, em vez de retornar o valor da soma. Na declaração da função, as diferenças estão na troca do tipo double por void e, na ausência da instrução, return. 3Funções e procedimentos O terceiro exemplo apresenta uma função que não recebe parâmetros, nem devolve algum retorno. Por isso, ela imprime na tela o valor da cons- tante matemática PI (M_PI), que está disponível na biblioteca <cmath> da linguagem C++. Na linguagem C++, as funções e os procedimentos podem passar parâ- metros de duas formas distintas, por valor e referência, sendo que, em uma mesma função, é possível passa-los apenas por um ou por outro, ou ambos simultaneamente (SILVA FILHO, 2010). A passagem de parâmetros por valor se trata do modo mais usual, no qual uma cópia das variáveis é passada para a função e qualquer modificação nelas não produz alteração nas que foram passadas como parâmetro, porque a linguagem C++ cria outro endereço de memória para alocar, temporariamente, esses parâmetros usados apenas durante a execução da função. Quando a função se encerra, essas variáveis são liberadas da memória. Já na passagem de parâmetros por referência, a função recebe o endereço de memória das variáveis que são passadas. Assim, qualquer modificação nelas produz alteração no seu conteúdo original, pois, em vez de alocar outra área na memória para os parâmetros, ela utiliza a mesma área da variável. Para receber o endereço de memória das variáveis passadas como parâmetro por referência, é preciso que a função utilize ponteiros, pois, por meio deles, ela consegue acessar o endereço e modificar o valor original dessas variáveis. Você pode ver exemplos de passagem de parâmetros por valor e referência no tópico de chamadas de funções. Chamada de funções e procedimentos Você já viu como declarar funções e procedimentos, porém, ainda não apren- deu como são realizadas as chamadas desses elementos. Para entender como isso funciona, deve-se rever a execução de um programa na linguagem C++. A execução de um programa em C++ se inicia pelo método main, que é o primeiro a ser executado. Já o seu fluxo se realiza comando por comando, até que a última instrução seja executada e o programa se encerre (AGUILAR, 2008). No entanto, quando se executa uma função, o fluxo de sequência pula Funções e procedimentos4 para as suas instruções e, ao final, retorna ao método principal ou ao que realizou a chamada para dar seguimento ao fluxo de execução do programa (AGUILAR, 2008). Para realizar a chamada de uma função, é preciso conhecer o seu funciona- mento, identificar se possui ou não retorno e quais os parâmetros requeridos, bem como conhecer os tipos de dados desses itens. Essa chamada é realizada pelo seu nome, e se a função retorna um valor, este pode ser atribuído a uma variável ou diretamente à outra função, como cout. O exemplo a seguir realiza a chamada das funções mostradas anteriormente. Veja no método main que a chamada da função somar se realiza por meio da instrução que recebe dois parâmetros do tipo double (1.3 e 1.4) e retorna a soma à variável resultado, cujo valor é 2.7, conforme apresentado a seguir. Na sequência, o programa realiza a chamada da função imprimePI, a qual não possui parâmetros, nem fornece nenhum retorno. No exemplo apresentado, as funções estão implementadas acima do método main e, portanto, quando a main é executada, essas funções já são conhecidas. 5Funções e procedimentos Contudo, deve-se inserir anteriormente o seu protótipo quando uma função é implementada depois do método que realiza a sua chamada. O protótipo de uma função deve ser utilizado quando ela está implementada abaixo do método que realiza a sua chamada. Nesse caso, ele é colocado acima desse método para indicar o comportamento da função, o seu tipo de valor de retorno e os seus parâmetros — podendo indicar apenas o tipo de dado ou também as variáveis, conforme o seguinte exemplo. Como mencionado anteriormente, existem duas formas de passar parâ- metros para uma função: valor e referência. Para explicar as diferenças entre elas, serão apresentadas duas funções que recebem dois números inteiros e invertem seus valores. Funções e procedimentos6 A função invertePorValor recebe os números 2 e 3 pelas variáveis a e b, respectivamente, e inverte os valores com o auxílio de uma variável auxiliar. No entanto, a mudança dos valores de a e b, por meio das variáveis n1 e n2, é refletiva apenas dentro da função e deixa os valores originais de a e b como 2 e 3. Já a função invertePorReferencia, que recebe os números 2 e 3 pelo caractere &, utiliza ponteiros para referenciar o endereço de memória das variáveis a e b por meio das variáveis *n1 e *n2. Assim, quando inverte os valores dentro da função, reflete essa modificação nas variáveis que estão fora dela, no mé- todo main. Na Figura 1, você pode ver o resultado da execução do algoritmo apresentado. Figura 1. Resultado da execução do algoritmo. Em um programa C++, é possível fazer uma função reali- zar sua própria chamada, esse recurso se chama função recursiva ou recursividade. Para saber mais sobre isso, veja o link ou o código a seguir. https://goo.gl/iBYuAS 7Funções e procedimentos Uso de variáveis locais e globais As variáveis são expressões que podem armazenar valores temporariamente na memória, e seu conteúdo deve estar de acordo com o tipo de dado de sua declaração, por exemplo, uma variável do tipo int precisa armazenar um número inteiro. Além do tipo de dado, uma variável segue uma regra de escopo, na qual sua visibilidade varia conforme o local do programa em que foi declarada. Na linguagem C++, existem dois tipos, locais e globais (VOTRE, 2016). Variáveis locais As variáveis locais são declaradas dentro de uma função ou de um bloco de comandos e, por isso, apenas as instruções que estão na estrutura possuem acesso a elas. Assim, declarar e usar uma variável dentro de uma função ou de um bloco faz parte das melhores práticas, pois economizam recursos ao utilizar dados temporários de curta duração (VOTRE, 2016). Para ilustrar que uma variável local e declarada não pode ser acessada fora do escopo, apresenta-se o seguinte exemplo, o qual tenta imprimir o conteúdo de uma variável declarada dentro de uma função. Note que a variável x foi declarada dentro da função acessaVariavel e não pode ser acessada fora do seu escopo — da função apresentada. Nesse caso, ao tentar acessar o conteúdo de x pela instrução cout no método main, o seguinte erro será apresentado: ‘x’ was not declared in this scope. Ainda em relação ao escopo, é possível declarar uma variável local com o mesmo nome de outra, desde que elas pertençam a escopos diferentes. Assim, ao utilizar uma delas, o programa usará sempre aquela que pertence ao escopo atual. Funções e procedimentos8 No próximo exemplo, tem-se a criação de uma variável local chamada x, do tipo int, dentro da função escopo, com valor 10. Na sequência, verifica-se se ela é par e, caso seja positivo, atribui-se 3 a ela e cria-se outra variável com o mesmo nome, porém, do tipo float. Por fim, imprime-se o valor das variáveis, cujo resultado é 1.2 e 3. Na linguagem C++, também se conhece uma variável local como automá- tica. A instrução auto pode ser inserida antes do seu tipo de dado, porém, é opcional e, geralmente, a maioria dos programadores não a utiliza. Um exemplo de declaração de variável local automática está apresentado a seguir, em que ambas as declarações possuem o mesmo significado (DEITEL; DEITEL, 2011). O armazenamento automático se trata de um meio de economizar memória, pois as variáveis automáticas existem somente quando necessárias. Elas são criadas ao se acionar a função na qual foram declaradas, e destruídas quando a função é encerrada (DEITEL; DEITEL, 2011). Portanto, uma variável local armazena seus dados apenas durante a exe- cução das instruções
Compartilhar