Prévia do material em texto
<p>Algoritmos e</p><p>PROGRAMAÇÃO</p><p>ALGORITMOS E</p><p>PROGRAMAÇÃO</p><p>Janeiro | 2020</p><p>Universidade La Salle Canoas | Av. Victor Barreto, 2288 | Canoas - RS</p><p>CEP: 92010-000 | 0800 541 8500 | ead@unilasalle.edu.br</p><p>Gestão Universidade</p><p>Gestão EaD</p><p>Reitor</p><p>Diretora de Graduação</p><p>Diretor de Marketing e Relacionamento</p><p>Procuradora Jurídica</p><p>Assessor de Assuntos Interinstitucionais e Internacionais</p><p>Chefe de Gabinete</p><p>Coordenador da Área de Educação e Cultura</p><p>Coordenador da Área de Gestão e Negócios</p><p>Coordenadora da Área de Inovação e Tecnologia</p><p>Coordenador dos Cursos de Adm., Processos Ger e Logística.</p><p>Coordenadora do Curso Gestão de Recursos Humanos</p><p>Coordenador dos Cursos Gestão Com., Gestão Fi n. e Marketing</p><p>Coordenadora do Curso de Pedagogia</p><p>Coordenadora do Curso de Serviço Social</p><p>Coordenadora do Curso de Letras</p><p>Coordenador do Curso de Engenharia da Produção</p><p>Coordenador do Curso de Análise e Desenv de Sistemas.</p><p>Prof. Dr. Paulo Fossati - Fsc</p><p>Cleiton Bierhals Decker</p><p>Michele Wesp Cardoso</p><p>Prof. Dr. Jefferson Marlon Monticelli</p><p>Prof. Dr. Renaldo Vieira de Souza</p><p>.</p><p>Prof. Dr. Daniel Silva Achutti</p><p>Profª. Drª Ingridi Vargas Bortolaso</p><p>Prof. Me. Carlos Eduardo dos Santos Sabrito</p><p>Profª. Drª. Denise Macedo Ziliotto</p><p>Profª. Me. Patrícia Coelho Motta de Souza</p><p>Prof. Dr. Paulo Roberto Ribeiro Vargas</p><p>Profª. Drª Hildegard Susana Jung</p><p>Profª. Drª. Michelle Bertoglio Clos</p><p>Profª. Drª. Lucia Regina Lucas da Rosa</p><p>Prof. Dr. José Rogério Vidal</p><p>Profª. Drª. Tatiana Vargas Maia</p><p>Prof. Me. Rafael Pieretti de Oliveira</p><p>Prof. Me. Mozart Lemos de Siqueira</p><p>Diretor</p><p>Coordenadora Pedagógica</p><p>Coordenador de Produção</p><p>Michele de Mattos Kreme</p><p>Coordenações Acadêmicas</p><p>Equipe de Produção EaD</p><p>Anderson Cordova Nunes</p><p>Arthur Menezes de Jesus</p><p>Bruno Giordani Faccio</p><p>Daniela dos S. Cardoso</p><p>Daniele Balbinot</p><p>Érika Konrath Toldo</p><p>Évelyn Rocha de Araujo</p><p>Gabriel Esteves de Castro</p><p>Gabriel da Silva Sobrosa</p><p>Guilherme P. Rovadoschi</p><p>Ingrid Rais da Silva</p><p>Jorge Fabiano Mendez</p><p>Nathália N. dos Santos S..</p><p>Patrícia Menna Barreto</p><p>Tiago Konrath Araujo</p><p>Prof. Dr. Cledes Casagrande - Fsc</p><p>Vitor Benites</p><p>Profª. M.ª Cristiele Magalhães Ribeiro</p><p>Prof. Dr. Mario Augusto Pires Pool</p><p>Prof. Me. Márcio Leandro Michel</p><p>Profª. Dr.ª Patricia Kayser Vargas Mangan</p><p>Patrick Ilan Schenkel Cantanhede</p><p>Prof. Dr. José Alberto Miranda</p><p>Vice-Reitor, Pró-Reitor de Pós-grad.,</p><p>Pesq. e Extensão e Pró-Reitor de Graduação</p><p>Pró-Reitor de Administração</p><p>Diretor da Educação a Distância</p><p>Diretor de Extensão e Pós-Graduação Lato Sensu</p><p>Diretora de Pesquisa e Pós-Graduação Stricto Sensu</p><p>Diretor Administrativo</p><p>Assessor de Inovação e Empreendedorismo</p><p>Prof. Dr. Mario Augusto Pires Pool</p><p>Prof. Dr. Jonas Rodrigues Saraiva</p><p>Coordenador da Área de Direito e Política</p><p>Coordenadora do Curso de Ciências Contábeis</p><p>Coordenador do Curso de Educação Física</p><p>Coordenadora do Curso de História</p><p>Prof. Dr. Renato Ferreira Machado</p><p>Prof. Me. Sílvio Denicol Júnior</p><p>Prezado estudante,</p><p>A equipe de gestão da EaD LaSalle sente-se honrada em entregar a</p><p>você este material didático. Ele foi produzido com muito cuidado para</p><p>que cada Unidade de estudos possa contribuir com seu aprendizado</p><p>da maneira mais adequada possível à modalidade que você escolheu</p><p>estudar: a modalidade a distância. Temos certeza de que o conteúdo</p><p>apresentado será uma excelente base para o seu conhecimento e para</p><p>a sua formação. Por isso, indicamos que, conforme as orientações de</p><p>seus professores e tutores, você reserve tempo semanalmente para</p><p>realizar a leitura detalhada dos textos deste livro, buscando sempre</p><p>realizar as atividades com esmero a fim de alcançar o melhor resultado</p><p>possível em seus estudos. Destacamos também a importância de</p><p>questionar, de participar de todas as atividades propostas no ambiente</p><p>virtual e de buscar, para além de todo o conteúdo aqui disponibilizado,</p><p>o conhecimento relacionado a esta disciplina que está disponível por</p><p>meio de outras bibliografias e por meio da navegação online.</p><p>Desejamos a você um excelente módulo e um produtivo ano letivo.</p><p>Bons estudos!</p><p>Gestão de EaD LaSalle</p><p>APRESENTAÇÃO</p><p>APRESENTANDO A DISCIPLINA</p><p>Olá!</p><p>Seja bem-vindo à disciplina de Algoritmos e Programação.</p><p>A disciplina de Algoritmos e Programação é a base para desenvolver</p><p>o pensamento lógico-matemático que permitirá avançar na lógica de</p><p>programação. Estas competências auxiliarão ao longo de todo o curso de</p><p>Análise e Desenvolvimento de Sistemas, em particular nas disciplinas que</p><p>envolvam construção de códigos computacionais. Por meio dessa disciplina,</p><p>será possível perceber que os algoritmos fazem parte do nosso dia-a-</p><p>dia. Nas mais diversas tarefas diárias, percebemos um algoritmo quanto</p><p>identificamos os seguintes requisitos: possuir um estado inicial, definir uma</p><p>sequência lógica finita de ações claras e precisas, produzir dados de saída</p><p>corretos, possuir estado final previsível (deve sempre terminar). Podemos</p><p>entender que estes algoritmos se materializam em programas através</p><p>de uma sequência finita de operações que ao ser executadas na ordem</p><p>estabelecida atinge um objetivo em determinado tempo finito. Ou seja, é</p><p>possível desenvolver algoritmos que podem ser transformados, total ou</p><p>parcialmente, em programas que podem ser executados em computadores.</p><p>Por isso, é importante no início do curso buscar compreender todos os</p><p>tópicos apresentados em cada capítulo, realizar as atividades extraclasses</p><p>e aprofundar o conhecimento nos itens que apresentam maiores</p><p>questionamentos. O objetivo desta disciplina é proporcionar ao aluno a</p><p>capacidade de elaborar, implementar e testar algoritmos básicos, aplicando</p><p>diferentes tipos de dados e utilizando estruturas de controle e de decisão no</p><p>desenvolvimento de códigos.</p><p>Esta disciplina está organizada em quatro unidades. A primeira unidade</p><p>é dedicada a introduzir os conceitos de algoritmos e de linguagens de</p><p>programação estruturada. Na segunda unidade será apresentado os conceitos</p><p>básicos de programação utilizando a Linguagem C, a qual será adotada nas</p><p>demais unidades. Nesta introdução, serão trabalhos principalmente elementos</p><p>relacionados à manipulação de dados. Nas unidades três e quatro, serão abordados</p><p>respectivamente os comandos condicionais e os comandos interativos.</p><p>Bons estudos!</p><p>Gestão de EaD LaSalle</p><p>Sumário</p><p>UNIDADE 1</p><p>Introdução aos Algoritmos .................................................................................................................. 9</p><p>Objetivo Geral ...................................................................................................................................... 9</p><p>Objetivos Específicos .......................................................................................................................... 9</p><p>Parte 1: Introdução a Lógica de Programação .....................................................................................11</p><p>Parte 2: Conceitos Básicos e Tipos de Dados ......................................................................................21</p><p>Parte 3: Introdução à Algorítmos e Lógica de Programação ...............................................................45</p><p>Parte 4: Métodos de Programação Paradigmas de Programação .......................................................59</p><p>Parte 5: Programação Estruturada .......................................................................................................71</p><p>UNIDADE 2</p><p>Introdução à Programação em C ....................................................................................................... 87</p><p>Objetivo Geral .................................................................................................................................... 87</p><p>Objetivos Específicos ........................................................................................................................ 87</p><p>Parte 1: A linguagem C - Conceitos Básicos ........................................................................................89</p><p>Parte 2: Tipos de Dados e Variáveis .....................................................................................................99</p><p>representando comandos</p><p>e operadores, ou identificando subprogramas já embutidos na linguagem. As palavras re-</p><p>servadas não podem ser utilizadas como identificadores definidos pelo programador.</p><p>Algumas das palavras reservadas definidas na pseudolinguagem são:</p><p>início</p><p>fim</p><p>se</p><p>então</p><p>escrever</p><p>ler</p><p>função</p><p>2.1.4 símbolos especiais</p><p>Símbolos especiais servem para delimitar ações, separar elementos, efetuar operações ou</p><p>indicar ações específicas. Na pseudolinguagem aqui adotada, também existem alguns símbo-</p><p>los especiais com significado específico, como:</p><p>← + ( ) < > : ;</p><p>2.1.5 comentários</p><p>Comentários são recursos oferecidos pelas linguagens de programação que permitem, por</p><p>exemplo, a inclusão de esclarecimentos sobre o que o programa faz e como isso é feito. Os</p><p>comentários são identificados e delimitados por símbolos especiais e podem compreender</p><p>quaisquer sequências de caracteres. Todo o conteúdo compreendido entre os símbolos deli-</p><p>mitadores de comentários é ignorado pelo compilador durante a tradução do programa, ser-</p><p>vindo apenas para documentar e facilitar o entendimento pelos seres humanos que tiverem</p><p>acesso ao código do programa. Na pseudolinguagem, os comentários são delimitados pelos</p><p>símbolos “{” e “}”.</p><p>Exemplo de comentário: { Este é um comentário @#$% }</p><p>2.2 declarações</p><p>Todos os itens utilizados em um programa devem ser declarados antes de sua utilização. Os</p><p>nomes e as características desses itens são definidos através de declarações. Nesta seção,</p><p>são analisadas declarações de variáveis, de tipos de dados e de constantes. Outras declarações</p><p>são vistas em capítulos subsequentes.</p><p>Edelweiss_02.indd 28Edelweiss_02.indd 28 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO42 Capítulo 2 Unidades Léxicas, Variáveis, Constantes e Expressões 29</p><p>2.2.1 declaração de variáveis</p><p>Uma variável representa um espaço de memória identificado e reservado para guardar um</p><p>valor durante o processamento. Ressalte-se que somente um valor pode estar armazenado</p><p>em uma variável em um determinado momento. Caso seja definido um novo valor para uma</p><p>variável, o anterior será perdido.</p><p>Sempre que um programador decidir utilizar uma variável em seu programa, ele deverá informar</p><p>seu nome e o tipo de valores que ela irá armazenar. Isso faz com que, ao final da compilação do</p><p>programa, exista um espaço reservado para essa variável na memória principal do computador,</p><p>com um determinado endereço físico. O tamanho do espaço alocado para a variável depende</p><p>do tipo definido para ela. Uma vez alocada a variável, ela passa a ser referenciada no programa</p><p>através do nome dado pelo programador, não sendo necessário saber seu endereço físico.</p><p>Variáveis de dois tipos, bastante diferentes no seu conteúdo e forma de uso, podem ser utiliza-</p><p>das em um programa: (1) variáveis que armazenam os valores manipulados no programa e (2)</p><p>variáveis que guardam endereços físicos de memória, denominadas ponteiros. Esse segundo</p><p>tipo de variável será tratado mais adiante, no Capítulo 14. Até lá, sempre que forem feitas refe-</p><p>rências a variáveis se estará tratando das que armazenam valores e não endereços de memória.</p><p>Toda variável utilizada pelo programa deve ser declarada no seu início, através de uma decla-</p><p>ração de variáveis, em que são definidos seu nome e o tipo de dados que poderá armazenar.</p><p>Os tipos de dados utilizados nas linguagens de programação se classificam, de acordo com</p><p>os valores que podem armazenar, em:</p><p>■ tipos simples:</p><p>■ numéricos;</p><p>■ alfanuméricos;</p><p>■ lógicos ou booleanos;</p><p>■ ponteiros.</p><p>■ tipos compostos:</p><p>■ arranjos;</p><p>■ registros;</p><p>■ enumerações;</p><p>■ conjuntos;</p><p>■ arquivos.</p><p>Inicialmente serão analisados somente os três primeiros tipos de dados simples. O tipo pontei-</p><p>ro e os tipos compostos serão gradualmente apresentados ao longo deste livro.</p><p>Os nomes dados aos tipos de dados simples na pseudolinguagem são:</p><p>■ inteiro, para armazenar somente valores numéricos inteiros;</p><p>■ real, em que são armazenados valores numéricos fracionários;</p><p>■ caractere, para armazenar somente um caractere alfanumérico, utilizando a codifica-</p><p>ção de caracteres ASCII, que representa qualquer caractere em 8 bits;</p><p>Edelweiss_02.indd 29Edelweiss_02.indd 29 12/03/14 08:5912/03/14 08:59</p><p>43 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>30 Algoritmos e Programação com Exemplos em Pascal e C</p><p>■ string, em que são armazenadas cadeias de caracteres alfanuméricos;</p><p>■ lógico, para variáveis que podem armazenar somente um dos dois valores lógicos, ver-</p><p>dadeiro ou falso.</p><p>Uma opção na declaração de uma variável simples do tipo string é definir o número de ca-</p><p>racteres que poderá conter por meio de um inteiro entre colchetes. Por exemplo, uma variável</p><p>definida com o tipo string[3] poderá conter somente três caracteres, enquanto que uma</p><p>variável definida com o tipo string, sem limitação de tamanho, poderá ter o número de</p><p>caracteres permitido na linguagem de programação utilizada.</p><p>No Capítulo 1 ressaltou-se a importância de identificar os valores de entrada e de saída de um</p><p>algoritmo. Esses valores são armazenados em variáveis. Na pseudolinguagem, sugere-se que</p><p>as variáveis sejam definidas em conjuntos separados, identificando (1) as variáveis de entrada,</p><p>que servirão para valores fornecidos ao programa, (2) as de saída, que vão armazenar os valo-</p><p>res que serão informados pelo programa, resultantes de seu processamento, e (3) as variáveis</p><p>auxiliares, que servirão somente para guardar valores durante o processamento. A sintaxe da</p><p>declaração de variáveis é a seguinte:</p><p>Entradas: <lista de nomes de variáveis com seus tipos></p><p>Saídas: <lista de nomes de variáveis com seus tipos></p><p>Variáveis auxiliares: <lista de nomes de variáveis com seus tipos></p><p>Os nomes escolhidos pelo programador para cada variável devem ser seguidos do tipo da</p><p>variável entre parênteses:</p><p>nome (string)</p><p>valor (real)</p><p>Várias variáveis do mesmo tipo podem ser agrupadas em uma lista de nomes separados por</p><p>vírgula, seguida pelo tipo correspondente:</p><p>int1, int2, int3 (inteiro)</p><p>Um exemplo do cabeçalho de um algoritmo, incluindo as declarações das variáveis já identifi-</p><p>cadas conforme sua futura utilização, é mostrado a seguir:</p><p>Algoritmo – MédiaEMaiorValor</p><p>{INFORMA A MÉDIA DE 2 VALORES E QUAL O MAIOR DELES}</p><p>Entradas: valor1, valor2 (real)</p><p>Saídas: média (real)</p><p>maior (real)</p><p>Variáveis auxiliares: aux (real)</p><p>2.2.2 declaração de tipos de dados</p><p>As linguagens de programação geralmente permitem a definição de novos tipos de da-</p><p>dos. Um novo tipo é identificado através de um nome dado pelo programador. Sua defini-</p><p>ção se baseia em um tipo-base, anteriormente definido ou predefinido na linguagem. Na</p><p>Edelweiss_02.indd 30Edelweiss_02.indd 30 12/03/14 08:5912/03/14 08:59</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>1</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 3</p><p>Introdução à Algorítmos e</p><p>Lógica de Programação</p><p>ALGORITMOS E PROGRAMAÇÃO46</p><p>Introdução a algoritmos</p><p>e lógica de programação</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p> Criar, reconhecer, interpretar e aplicar os algoritmos e sua lógica de</p><p>programação na solução de problemas.</p><p> Identificar, diferenciar e aplicar a representação e os tipos de dados</p><p>na construção de algoritmos e na solução de problemas.</p><p> Operar de forma correta os tipos de dados e suas relações.</p><p>Introdução</p><p>Neste capítulo, você estudará o conceito de lógica, verá o que é um</p><p>algoritmo e como ele está relacionado com a lógica. Além disso, aprenderá</p><p>a identificar e definir o que são tipos de dados, operadores aritméticos,</p><p>operadores relacionais, operadores lógicos, expressões aritméticas e</p><p>expressões relacionais.</p><p>Conceitos</p><p>de lógica de programação</p><p>A lógica não tem uma defi nição específi ca: inicialmente, era ligada à ma-</p><p>temática (lógica formal) e, atualmente, está relacionada a todas as áreas do</p><p>conhecimento humano.</p><p>Podemos relacionar a lógica com a “correção do pensamento”, pois uma de</p><p>suas preocupações é determinar quais operações são válidas e quais não são,</p><p>fazendo análises das formas e leis do pensamento. Como filosofia, ela procura</p><p>saber por que pensamos assim e não de outro jeito; como arte ou técnica,</p><p>ela nos ensina a usar corretamente as leis do pensamento (FORBELLONE;</p><p>EBERSPACHER, 2005).</p><p>C01_Algoritmos_Progr_Introducao.indd 1 04/05/2018 17:05:03</p><p>47 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução à Algorítmos e Lógica de Programação PARTE 3</p><p>Algoritmos</p><p>Para Forbellone e Ebersoacher (2005), algoritmo é um conjunto fi nito de</p><p>regras, bem defi nidas, que nos levam à solução de um problema em um</p><p>tempo fi nito. Segundo Berg e Figueiró (2002), algoritmo é a descrição de</p><p>um conjunto de ações que, obedecidas, resultam numa sucessão fi nita de</p><p>passos, atingindo o objetivo.</p><p>Para que se tenha um algoritmo, é preciso:</p><p>a) que se tenha um número finito de passos;</p><p>b) que cada passo esteja precisamente definido, sem possíveis ambiguidades;</p><p>c) que existam zero ou mais entradas;</p><p>d) que existam uma ou mais saídas;</p><p>e) que exista uma condição de fim, sempre atingida em tempo finito, para</p><p>quaisquer entradas.</p><p>Os algoritmos são criados e reconhecidos por sua lógica de programação.</p><p>Segundo Forbellone e Eberspacher (2005), a lógica está relacionada à coerência</p><p>e à racionalidade; lógica de programação é a racionalização dos processos</p><p>formais da programação de computadores e algoritmo é a sequência de passos</p><p>que visam atingir um objetivo bem definido.</p><p>Os algoritmos podem ser visualizados por meio de um fluxograma</p><p>convencional ou por meio de um fluxograma do tipo Chapin. Forbellone</p><p>e Eberspacher (2005) fornecem um exemplo básico da diferença entre</p><p>ambos e destacam que há uma série de vantagens e desvantagens para cada</p><p>um desses fluxogramas. Por exemplo, o fluxograma convencional é mais</p><p>fácil de desenhar e é previsto em etapas, enquanto o fluxograma Chapin</p><p>pode compactar as perguntas de F e V ou S e N em somente um bloco,</p><p>sendo considerado mais técnico e formal. Na Figura 1, você pode observar</p><p>essas diferenças.</p><p>Introdução a algoritmos e lógica de programação2</p><p>C01_Algoritmos_Progr_Introducao.indd 2 04/05/2018 17:05:03</p><p>ALGORITMOS E PROGRAMAÇÃO48</p><p>Figura 1. Fluxograma convencional e fluxograma Chapin.</p><p>Fonte: Forbellone e Eberspacher (2005).</p><p>Tipos de dados (primitivos)</p><p>Para entender os tipos primitivos, voltemos nossa atenção para um conceito</p><p>muito importante: a informação. Antes disso, vamos entender o que é um</p><p>3Introdução a algoritmos e lógica de programação</p><p>C01_Algoritmos_Progr_Introducao.indd 3 04/05/2018 17:05:04</p><p>49 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução à Algorítmos e Lógica de Programação PARTE 3</p><p>dado? Dados são códigos que constituem a matéria-prima da informação, ou</p><p>seja, é a informação não tratada que ainda não apresenta relevância.</p><p>A informação é constituída pelos dados tratados – o resultado do processa-</p><p>mento de dados são as informações. As informações têm significado e podem</p><p>contribuir no processo de tomada de decisões.</p><p>Os dados podem ser classificados conforme seu tipo e os principais serão</p><p>descritos a seguir.</p><p>Tipos numéricos</p><p> Inteiros: é um número que não possui casas decimais; por exemplo, a</p><p>idade de uma pessoa ou uma quantidade de itens num estoque.</p><p> Real: é um número que possui casas decimais, ou seja, é um número</p><p>fracionário; por exemplo, a altura de uma pessoa ou o peso de um</p><p>determinado produto.</p><p>Tipos alfanuméricos</p><p> Literal ou String: são os textos, que podem conter letras, números e</p><p>caracteres especiais. Não são utilizados para cálculos.</p><p>Tipos lógicos</p><p> Booleano: é um dado que só pode conter 2 informações (verdadeiro</p><p>ou falso).</p><p>Expressões</p><p>Expressões, no sentido matemático, são representações simbólicas de sequ-</p><p>ências de operações a serem feitas sobre determinados operandos visando a</p><p>obtenção de um resultado. Necessitam-se de dois tipos de expressões para a</p><p>elaboração de algoritmos: expressões aritméticas e expressões lógicas.</p><p>Introdução a algoritmos e lógica de programação4</p><p>C01_Algoritmos_Progr_Introducao.indd 4 04/05/2018 17:05:04</p><p>ALGORITMOS E PROGRAMAÇÃO50</p><p>Expressões aritméticas</p><p>Expressões aritméticas são aquelas cujos operadores são aritméticos e cujos</p><p>operandos são constantes e/ou variáveis do tipo numérico (inteiro ou real).</p><p>Operadores aritméticos</p><p>Soma +</p><p>Divisão /</p><p>Quociente da divisão inteira Div</p><p>Radiciação //</p><p>Subtração -</p><p>Multiplicação ·</p><p>Resto da divisão inteira Mod</p><p>10 div 3 = 3 10 mod 3 = 1 3 div 5 = 0</p><p>25 div 5 = 5 25 mod 5 = 0 3 mod 5 = 3</p><p>5Introdução a algoritmos e lógica de programação</p><p>C01_Algoritmos_Progr_Introducao.indd 5 04/05/2018 17:05:04</p><p>51 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução à Algorítmos e Lógica de Programação PARTE 3</p><p>Funções matemáticas</p><p>Função Descrição Exemplo</p><p>sqr (x) Quadrado de x (x2) sqr (4) = 16</p><p>sqrt (x) Raiz quadrada de x ( ) sqrt (25) = 5</p><p>sen (x) Seno de x sen (90) = 1</p><p>cos (x) Cosseno de x cos (90) = 0</p><p>tg (x) Tangente de x tg (45) = 1</p><p>int (x) Parte inteira de x int (23,49) = 23</p><p>frac (x) Parte fracionária de x frac (23,49) = 49</p><p>pot (x,y) X na potência y (xy) pot (3, 2) = 9</p><p>abs (x) Valor absoluto de x abs ( -39) = 39</p><p>Sinal (x) Fornece o valor –1, +1 ou zero conforme o</p><p>valor de x seja negativo, positivo pu nulo.</p><p>Sinal (-44) = -1</p><p>Precedência entre os operadores</p><p>Os operadores de mesma precedência na tabela são resolvidos da esquerda</p><p>para a direita, na ordem que aparecerem na expressão.</p><p>Introdução a algoritmos e lógica de programação6</p><p>C01_Algoritmos_Progr_Introducao.indd 6 04/05/2018 17:05:05</p><p>ALGORITMOS E PROGRAMAÇÃO52</p><p>5 + 9 + 7 + 8 / 4</p><p>5 + 9 + 7 + 2 = 23</p><p>1 - 4 · 3 / 6 - 2 · 3</p><p>1 - 4 · 3 / 6 - 6</p><p>1 - 12 / 6 - 6</p><p>1 - 2 - 6 = -7</p><p>3 · 2 - 4 / 2 + abs (5 - 3 · 5) / 2</p><p>3 · 2 - 4 / 2 + abs (5 - 15) / 2</p><p>3 . 2 - 4 / 2 + abs (-10) / 2</p><p>3 · 2 - 4 / 2 + 10 / 2</p><p>9 - 4 / 2 + 10 / 2</p><p>9 - 2 + 5 = 12</p><p>Expressões lógicas</p><p>Expressões lógicas são aquelas cujos operadores são lógicos e/ou relacionais</p><p>e cujos operandos são relações e/ou constantes e/ou variáveis de tipo lógico.</p><p>O resultado de uma expressão lógica sempre é uma constante lógica (F - falso</p><p>ou V - verdadeiro).</p><p>Operadores relacionais</p><p>= Igual < > Diferente</p><p>> Maior >= Maior ou igual</p><p>< Menor <= Menor ou igual</p><p>7Introdução a algoritmos e lógica de programação</p><p>C01_Algoritmos_Progr_Introducao.indd 7 04/05/2018 17:05:05</p><p>53 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução à Algorítmos e Lógica de Programação PARTE 3</p><p>2 · 4 = 24 / 3 = 8</p><p>V</p><p>2 + (8 – 7) > = 3 · 6 - 15</p><p>2 + 1 > = 18 - 15</p><p>3 > = 3</p><p>V</p><p>Operadores lógicos</p><p>Símbolo Função</p><p>E Conjunção</p><p>Ou Disjunção (não-exclusiva)</p><p>Não Negação</p><p>O operador lógico E é utilizado quando dois ou mais relacionamentos lógicos</p><p>de uma determinada condição necessitam ser verdadeiros. O operador lógico</p><p>E faz com que somente seja executada uma determinada operação se todos as</p><p>condições mencionadas forem simultaneamente verdadeiras, gerando, assim,</p><p>um resultado lógico verdadeiro.</p><p>SE (NÚMERO > = 20) E (NÚMERO < = 90)</p><p>Então, escrever “Número válido no intervalo”</p><p>Se NÃO, escrever “Número inválido, não está no intervalo”</p><p>Fim-SE</p><p>Introdução a algoritmos e lógica de programação8</p><p>C01_Algoritmos_Progr_Introducao.indd 8</p><p>04/05/2018 17:05:06</p><p>ALGORITMOS E PROGRAMAÇÃO54</p><p>O operador lógico OU é utilizado quando pelo menos um dos relaciona-</p><p>mentos lógicos (quando houver mais de um relacionamento) de uma condição</p><p>necessita ser verdadeiro. O operador lógico OU faz com que seja executada</p><p>uma determinada operação se pelo menos uma das condições mencionadas</p><p>gerar um resultado lógico verdadeiro.</p><p>SE (SEXO = ‘Masculino’) OU (SEXO = ‘Feminino’)</p><p>Então, escrever “O seu sexo é válido”</p><p>Se não, escrever “O seu sexo é inválido”</p><p>Fim-SE</p><p>O operador lógico NÃO é utilizado quando se necessita estabelecer que</p><p>uma determinada condição dever ser não verdadeira ou deve ser não falsa.</p><p>O operador lógico NÃO se caracteriza por inverter o estado lógico de uma</p><p>condição, isto é, inverte o resultado lógico da condição.</p><p>Algoritmo prog1</p><p>Var</p><p>A, B, C, X: Inteiro</p><p>Início</p><p>Ler (X, A, B)</p><p>SE NÃO (X > 5)</p><p>Então C: = (A + B) · X</p><p>Se não C: = (A – B) · X</p><p>Fim-SE</p><p>Escrever (C)</p><p>Fim</p><p>9Introdução a algoritmos e lógica de programação</p><p>C01_Algoritmos_Progr_Introducao.indd 9 04/05/2018 17:05:06</p><p>55 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução à Algorítmos e Lógica de Programação PARTE 3</p><p>Tabelas verdade</p><p>Tabela verdade é o conjunto de todas as possibilidades combinatórias entre os</p><p>valores de diversas variáveis lógicas, as quais se encontram em apenas duas</p><p>situações, e um conjunto de operadores lógicos.</p><p>Operador E</p><p>A B A e B</p><p>V V V</p><p>V F F</p><p>F V F</p><p>F F F</p><p>Operador OU</p><p>A B A ou B</p><p>V V V</p><p>V F V</p><p>F V V</p><p>F F F</p><p>Operador NÃO</p><p>A A não B</p><p>V F</p><p>F V</p><p>Introdução a algoritmos e lógica de programação10</p><p>C01_Algoritmos_Progr_Introducao.indd 10 04/05/2018 17:05:06</p><p>ALGORITMOS E PROGRAMAÇÃO56</p><p>Prioridades</p><p>Entre operadores lógicos:</p><p>Entre todos os operadores:</p><p>BERG, A.; FIGUEIRÓ, J. Lógica de programação. 3. ed. Canoas: Ed. ULBRA, 2002.</p><p>FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação: a construção de</p><p>algoritmos e estruturas de dados. 3. ed. São Paulo: Pearson, 2005.</p><p>Leituras recomendadas</p><p>CHAPRA, S. C. Métodos numéricos aplicados com MATLAB® para engenheiros e cientistas.</p><p>3. ed. Porto Alegre: AMGH, 2013.</p><p>OLIVEIRA, A. B.; BORATTI, I. C. Introdução à programação de algoritmos. Florianópolis:</p><p>Visual Books, 2004.</p><p>SOUZA, M. A. F. et al. Algoritmos e lógica de programação. 2. ed. São Paulo: Cengage,</p><p>2012.</p><p>11Introdução a algoritmos e lógica de programação</p><p>C01_Algoritmos_Progr_Introducao.indd 11 04/05/2018 17:05:06</p><p>57 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução à Algorítmos e Lógica de Programação PARTE 3</p><p>ANOTAÇÕES</p><p>ALGORITMOS E PROGRAMAÇÃO58</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>1</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 4</p><p>Métodos de Programação</p><p>Paradigmas de Programação</p><p>ALGORITMOS E PROGRAMAÇÃO60</p><p>Métodos de programação</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Explicar o que são métodos de programação.</p><p>� Sintetizar o histórico dos métodos de programação.</p><p>� Identificar os tipos de métodos de programação.</p><p>Introdução</p><p>Em geral, quando se trata do tema paradigmas de programação, não</p><p>se atribui a devida importância para o assunto. Todo o profissional de</p><p>programação de computadores deveria se atentar aos diferentes para-</p><p>digmas, pois eles são a base para as diferentes linguagens que existem</p><p>e existiram ao longo da evolução da programação.</p><p>É comum pensar, como estudantes ou profissionais, quais os be-</p><p>nefícios de entender os conceitos de linguagens de programação em</p><p>uma área com tantos temas muito pertinentes, mas saber como uma</p><p>linguagem funciona para interpretar as instruções e a evolução de lin-</p><p>guagens e conceitos ao longo do tempo, sem dúvidas, traz vantagens</p><p>na construção de softwares.</p><p>Neste capítulo, você aprenderá o que são os métodos de programa-</p><p>ção, quais são os diferentes tipos e como ocorreu a sua evolução.</p><p>Paradigmas de programação</p><p>Como seres humanos, sentimos necessidade de expressar nossos pensamentos,</p><p>seja de forma verbal, utilizando o nosso poder de comunicação, ou escrita,</p><p>escrevendo textualmente o que estamos pensando. A linguagem de progra-</p><p>mação, assim como a nossa linguagem natural, permite nossa comunicação</p><p>com as máquinas. Dessa maneira, podemos instruir, por meio de linhas de</p><p>comandos, as máquinas a executarem determinada instrução.</p><p>61 Introdução aos Algoritmos UNIDADE 1</p><p>Métodos de Programação Paradigmas de Programação PARTE 4</p><p>No entanto, para Tucker e Noonan (2009), as linguagens de programação</p><p>se diferem das linguagens naturais de duas maneiras importantes. Apesar</p><p>de permitirem a comunicação entre humanos e máquinas, elas possuem um</p><p>domínio de expressão mais reduzidos do que as linguagens naturais, pois</p><p>seu objetivo é permitir a compreensão de ideias computacionais, ou seja, se</p><p>propõem a atender diferentes requisitos das linguagens naturais.</p><p>Toda a linguagem de programação está construída sobre um paradigma.</p><p>Mas, afinal, o que é um paradigma? Um paradigma representa um padrão de</p><p>pensamento que guia um conjunto de atividades relacionadas, trata-se de um</p><p>padrão que define um modelo para a resolução de problemas e regra, basica-</p><p>mente, toda e qualquer linguagem de programação existente. Os paradigmas</p><p>de programação estão classificados em quatro diferentes tipos, que evoluíram</p><p>ao longo das últimas décadas:</p><p>� programação imperativa;</p><p>� programação funcional;</p><p>� programação lógica;</p><p>� programação orientada a objetos.</p><p>A Figura 1 ilustra de forma hierárquica os diferentes paradigmas de pro-</p><p>gramação atuais e sua derivação dos paradigmas imperativo e declarativo.</p><p>Figura 1. Paradigmas de programação.</p><p>Fonte: Adaptada de Simão (2018).</p><p>Paradigma de programação</p><p>Paradigma imperativo Paradigma declarativo</p><p>Paradigma</p><p>procedimental</p><p>Paradigma</p><p>funcional</p><p>Programação</p><p>baseada em</p><p>regras</p><p>Paradigma</p><p>lógico</p><p>Paradigma</p><p>orientado a</p><p>objetos</p><p>Programação</p><p>orientada a</p><p>eventos</p><p>Métodos de programação2</p><p>ALGORITMOS E PROGRAMAÇÃO62</p><p>Algumas linguagens de programação foram projetadas para suportar diferentes</p><p>paradigmas. Um exemplo disso, é o da linguagem de programação C++, que foi</p><p>projetada para ser uma linguagem imperativa e orientada a objetos.</p><p>No início da programação, o único meio de conseguir programar um</p><p>computador era inserindo um código binário de programas para a sua me-</p><p>mória principal, o que representava uma grande probabilidade de erros e uma</p><p>manutenção praticamente impossível. Nessa época, escrevia-se programas</p><p>utilizando linguagens de baixo nível, porém, com a popularidade dos computa-</p><p>dores, as demandas por softwares se tornaram enormes. Então, as linguagens</p><p>necessitaram evoluir para um paradigma de nível mais alto, sendo a evolução</p><p>dos métodos e linguagens uma consequência dessa demanda.</p><p>Na próxima seção, você verá um pouco da evolução dos paradigmas de</p><p>programação ao longo das décadas e o surgimento de diferentes linguagens</p><p>que possibilitaram o desenvolvimento de softwares com melhor compreensão</p><p>e manutenção do que os existentes no início da programação.</p><p>Histórico dos métodos de programação</p><p>No início da programação de computadores, as primeiras linguagens disponí-</p><p>veis eram as de máquinas e as próprias linguagens de construção (Assembly)</p><p>dos primeiros computadores. A partir delas, muitas linguagens de programa-</p><p>ção e dialetos foram desenvolvidos, algumas obtiveram sucesso e inclusive</p><p>influência sobre outras linguagens e, naturalmente, outras tiveram um tempo</p><p>de vida limitado Sebesta (2018).</p><p>A programação de computadores não tem uma data correta de início. Na</p><p>década de 1930, surgiram os primeiros computadores</p><p>elétricos; já em 1948,</p><p>Konrad Zuse publicou sua criação, a linguagem de programação Plankalkül.</p><p>Nessa época, ela ainda não tinha muita utilidade, então, foi esquecida. Con-</p><p>tudo, antes da programação passar para o computador, eram usados cartões</p><p>de papelão, que eram perfurados, criando códigos.</p><p>3Métodos de programação</p><p>63 Introdução aos Algoritmos UNIDADE 1</p><p>Métodos de Programação Paradigmas de Programação PARTE 4</p><p>Os paradigmas da programação foram criados, em sua maioria, na década</p><p>de 1970. Nessa época surgiram as seguintes linguagens:</p><p>� Simula — inventada nos anos de 1960 por Nygaard e Dahl, foi a primeira</p><p>linguagem a suportar o conceito de classes;</p><p>� C — foi uma das primeiras linguagens de programação de sistemas,</p><p>criado por Dennis Ritchie e Ken Thompson, tem uma das maiores</p><p>influências no mundo atual;</p><p>� Prolog — projetada em 1972, foi a primeira linguagem de programação</p><p>com paradigma lógico;</p><p>� Pascal — foi muito importante, mas atualmente está quase sem uso;</p><p>� C++ — criada para ser compatível com C, foi muito importante, pois</p><p>é mais simples e dinâmica;</p><p>� Perl — é uma boa linguagem para trabalhar em níveis de sobrecarga</p><p>grandes.</p><p>Nos anos de 1990, a internet surgiu como um furacão, mudando totalmente</p><p>o rumo da programação. As linguagens Java e JavaScript foram criadas nessa</p><p>época, ambas relacionadas à internet. Na mesma época, surgiram a Visual</p><p>Basic e o Object Pascal.</p><p>Java é uma linguagem relativamente simples, orientada a objetos, criada com</p><p>o intuito de revolucionar as linguagens de programação. Já PHP (acrônimo para</p><p>“pré-processador de hipertexto”) é muito importante para o desenvolvimento</p><p>de aplicativos para Web, é a linguagem que, cada vez mais, toma conta dos</p><p>websites (MILETTO; BERTAGNOLLI, 2014).</p><p>Na Figura 2, você verá um breve resumo histórico da evolução e da in-</p><p>fluência de algumas linguagens de programação sobre outras. Apesar desse</p><p>histórico não ser completo, é possível perceber alguns eventos e tendências</p><p>mais influentes.</p><p>Métodos de programação4</p><p>ALGORITMOS E PROGRAMAÇÃO64</p><p>Figura 2. Resumo da história das linguagens de programação.</p><p>Fonte: Tucker e Noonan (2009, p. 7).</p><p>A década de 1950 marcou a chegada das linguagens de alto nível. Essas</p><p>linguagens se diferenciavam das linguagens de máquina por não estarem dire-</p><p>tamente dependentes de uma arquitetura específica. As primeiras linguagens</p><p>que chegaram com essa característica foram Fortran, Cobol, Algol e Lisp.</p><p>Fortran e Cobol foram linguagens que alcançaram um grande sucesso e</p><p>possuem, até hoje, um grande legado de sistemas escritos que atuam inclusive</p><p>em grandes organizações, como segmento financeiro. Já Lisp foi caindo em</p><p>desuso e Algol praticamente sumiu (MILETTO; BERTAGNOLLI, 2014).</p><p>5Métodos de programação</p><p>65 Introdução aos Algoritmos UNIDADE 1</p><p>Métodos de Programação Paradigmas de Programação PARTE 4</p><p>Certamente, o maior motivador para o desenvolvimento das linguagens</p><p>e métodos de programação nas últimas décadas tem sido o rápido desenvol-</p><p>vimento dos recursos computacionais e o surgimento de novas e emergentes</p><p>tecnologias, entre as quais podemos destacar as seguintes áreas:</p><p>� inteligência artificial;</p><p>� World Wide Web ;</p><p>� sistemas e redes;</p><p>� dispositivos móveis.</p><p>Ao contrário do que costumamos imaginar, a programação funcional não é o oposto</p><p>de programação orientada a objetos. São tipos diferentes de programação, mas</p><p>podem, inclusive, ser usadas em uma mesma aplicação, principalmente em linguagens</p><p>multiparadigmas, como o JavaScript.</p><p>O projeto de uma nova linguagem de programação é algo bem complexo,</p><p>o projetista deve se preocupar com inúmeros desafios e adotar soluções es-</p><p>pecíficas, que se proponham a atender esses desafios. Os principais desafios</p><p>envolvidos no projeto de uma nova linguagem de programação são:</p><p>� arquitetura;</p><p>� requisitos técnicos;</p><p>� padrões.</p><p>Entre os desafios propostos aos projetistas, vamos destacar os padrões.</p><p>Sempre que uma linguagem de programação tem um amplo uso entre os</p><p>desenvolvedores, é natural que novo processo de padronização surja, ou</p><p>seja, a comunidade define um padrão de construção independentemente da</p><p>máquina da linguagem e que todos os seus programadores devem aderir. Isso</p><p>é importante porque o método de padronização, entre outras vantagens, busca</p><p>a estabilização em diferentes plataformas, possibilitando a portabilidade dos</p><p>programas construídos a partir dela.</p><p>Métodos de programação6</p><p>ALGORITMOS E PROGRAMAÇÃO66</p><p>Se observarmos essa evolução, é possível perceber que algumas lingua-</p><p>gens que obtiveram sucesso foram projetadas por comunidades ou grupos de</p><p>desenvolvedores, exigindo uma certa padronização quanto aos programas</p><p>construídos.</p><p>Tipos de programação</p><p>Os tipos de programação estão diretamente relacionados ao conceito do para-</p><p>digma no qual a linguagem foi concebida, por exemplo é impossível utilizar</p><p>uma linguagem linear como Ada ou Assembly e tentarmos construir um</p><p>programa com blocos de funções. Isso acontece porque o paradigma desse</p><p>tipo de linguagem não provê recursos que o paradigma procedural possibilita,</p><p>permitindo o reuso de código por meio de funções (blocos que executam uma</p><p>determinada funcionalidade).</p><p>Portanto, é importante entender e conhecer bem os tipos de paradigmas de</p><p>programação e seus conceitos, para que ao utilizar uma linguagem se saiba</p><p>como, de acordo com o tipo de paradigma em que ela foi concebida, devem</p><p>ser estruturados os códigos. A seguir você verá os tipos de paradigmas que</p><p>surgiram ao longo da evolução da programação.</p><p>Paradigma imperativo</p><p>Após a geração de programação linear com linguagens de máquina, houve</p><p>um grande avanço com o advento das linguagens procedurais. Esse tipo de</p><p>paradigma foi o primeiro que apresentou as linguagens de alto nível, que</p><p>permitiam a utilização de um vocabulário mais próximo ao natural para</p><p>construção de programas. Esse paradigma recebe o nome de imperativo pela</p><p>forma como as instruções nos códigos são repassadas para o compilador:</p><p>� Faça isso.</p><p>� Depois faça aquilo.</p><p>7Métodos de programação</p><p>67 Introdução aos Algoritmos UNIDADE 1</p><p>Métodos de Programação Paradigmas de Programação PARTE 4</p><p>É uma forma imperativa de dar ordens para que a máquina execute as</p><p>instruções dadas, e ela executará cada uma, passo a passo, com o propósito</p><p>de chegar no resultado esperado. Uma linguagem imperativa suporta algumas</p><p>características comuns:</p><p>� atribuições, declarações e expressões;</p><p>� estruturas de controle;</p><p>� abstração procedural.</p><p>Basicamente, os códigos são construídos obedecendo a estrutura de de-</p><p>clarações e as instruções. A linguagem mais popular desse paradigma é a</p><p>linguagem C (MILETTO; BERTAGNOLLI, 2014).</p><p>Paradigma declarativo</p><p>A principal característica das linguagens com programação declarativa é o</p><p>foco não estar em como uma execução vai ocorrer, mas sim no resultado a</p><p>ser atingido. Um dos melhores exemplos para entender esse paradigma são</p><p>as instruções structured query language (SQL), pois nela são passados para</p><p>o banco de dados apenas o que se pretende, sem a preocupação sobre como</p><p>o banco de dados vai executar a instrução, o foco é somente o retorno ou</p><p>resultado da consulta.</p><p>Atualmente, uma das principais linguagens de programação utilizada, o</p><p>framework JavaScript Angular, é um exemplo de implementação desse para-</p><p>digma, que, aliás, é muito utilizado em razão do advento dos sistemas Web,</p><p>no qual o código submete uma execução e espera o retorno.</p><p>Paradigma estruturado</p><p>No sentido mais restrito, o conceito de programação estruturada se refere à</p><p>forma do programa e do processo de codificação. É um conjunto de convenções</p><p>que o programador pode seguir</p><p>para produzir o código estruturado, e suas</p><p>regras de codificação impõem limitações sobre o uso das estruturas básicas</p><p>de controle, estruturas de composição modular e documentação.</p><p>Métodos de programação8</p><p>ALGORITMOS E PROGRAMAÇÃO68</p><p>As características do paradigma estruturado são:</p><p>� programação sem GOTO (eliminação completa ou parcial do comando</p><p>GOTO, que significa “ir para”);</p><p>� programação com apenas três estruturas básicas de controle — sequên-</p><p>cia, seleção e iteração;</p><p>� forma de um programa estruturado;</p><p>� aplicação de convenções de codificação estruturada a uma linguagem</p><p>de programação específica.</p><p>Algumas linguagens com esse paradigma são Pascal e C.</p><p>Paradigma orientado a objetos</p><p>O paradigma de orientação a objetos surge como o advento da reutilização de</p><p>código e a facilidade na manutenção. No paradigma de orientação a objetos,</p><p>o princípio é a construção de código, implementando as entidades do mundo</p><p>real por meio do conceito de classes que possuem relação entre si.</p><p>Como o desempenho das aplicações não é uma das grandes preocupações</p><p>na maioria delas (devido ao poder de processamento dos computadores atuais),</p><p>a programação orientada a objetos se tornou muito difundida. A programação</p><p>orientada a objetos está embasada em quatro pilares.</p><p>� Abstração: como estamos lidando com objetos do mundo real, por exem-</p><p>plo, carro, casa, pessoa etc.), precisamos imaginar como esses objetos</p><p>vão se integrar dentro do nosso sistema e modelar seu comportamento</p><p>abstraindo comportamento e características específicas de cada um.</p><p>� Encapsulamento: não importa para um código que invoca um método</p><p>saber como outro vai ser executado, trata-se de uma característica que</p><p>traz principalmente segurança ao código.</p><p>� Herança: assim como no mundo real, a herança em programação orientada</p><p>a objetos seria a capacidade de uma classe herdar de outra métodos e atri-</p><p>butos, sendo, portanto, uma característica relacionada ao reuso de código.</p><p>� Polimorfismo: existem animais capazes de se adaptar a algumas ne-</p><p>cessidades do mundo real e se comportar de forma diferenciada em</p><p>alguns casos, essa particularidade também é possível no paradigma</p><p>de orientação a objetos. Mesmo herdando o comportamento de outra</p><p>classe, a classe herdeira pode modificar o seu comportamento em de-</p><p>terminadas situações.</p><p>9Métodos de programação</p><p>69 Introdução aos Algoritmos UNIDADE 1</p><p>Métodos de Programação Paradigmas de Programação PARTE 4</p><p>Por ser algo muito abstrato, a programação orientada a objetos é difícil de aprender.</p><p>Vários conceitos são artificiais e isso torna o aprendizado bastante complicado. O</p><p>resultado que se vê é muito código não orientado ao objeto, mas escrito em linguagens</p><p>orientadas a objetos.</p><p>Para atender a diversidade e complexidade do universo da programação</p><p>é que os paradigmas são divididos. É importante salientar que não existe um</p><p>paradigma vinculado à determinada linguagem de programação, o paradigma</p><p>tem que ser independente de linguagem. Por exemplo, a orientação a objetos</p><p>é um paradigma criado para a solução de problemas de desenvolvedores e</p><p>não tem uma ligação de necessidade com nenhuma linguagem, quem aborda</p><p>esses paradigmas são as linguagens de programação. Você pode observar</p><p>que várias linguagens de programação abordam vários tipos de paradigma</p><p>de programação.</p><p>A escolha do melhor paradigma é necessariamente relacionada ao tipo de</p><p>problema que precisa ser solucionado.</p><p>Veja no link a seguir um site sobre os pilares e conceitos do paradigma de programação</p><p>orientada a objetos.</p><p>https://qrgo.page.link/JBCZA</p><p>MILETTO, E. M.; BERTAGNOLLI, S. C. Desenvolvimento de software II: introdução ao de-</p><p>senvolvimento web com HTML, CSS, JavaScript e PHP. Porto Alegre: Bookman, 2014.</p><p>276 p. (Série Tekne; Eixo Informação e Comunicação).</p><p>SEBESTA, R. W. Conceitos de linguagem de programação. 11. ed. Porto Alegre: Bookman,</p><p>2018. 758 p.</p><p>Métodos de programação10</p><p>ALGORITMOS E PROGRAMAÇÃO70</p><p>SIMÃO, J. M. Orientação a objetos: programação em C++. Curitiba: Departamento Acadê-</p><p>mico de Eletrotécnica, Universidade Federal Tecnológica do Paraná, 2018. 26 p. (Notas</p><p>de aula). Disponível em: http://www.dainf.ct.utfpr.edu.br/~jeansimao/Fundamentos1/</p><p>LinguagemC++/Fundamentos1-2-SlidesC++1-A-2018-08-01.pdf. Acesso em: 25 ago. 2019.</p><p>TUCKER, A. B.; NOONAN, R. E Linguagens de programação: princípios e paradigmas.</p><p>2. ed. Porto Alegre: AMGH, 2009. 630 p.</p><p>Leituras recomendadas</p><p>EDELWEISS, N.; LIVI, M. A. C. Algoritmos e programação: com exemplos em Pascal e C.</p><p>Porto Alegre: Bookman, 2014. 476 p. (Série Livros Didáticos Informática UFRGS).</p><p>LEDUR, C. L. Desenvolvimento de sistemas com C#. Porto Alegre: SAGAH, 2018. 268 p.</p><p>MACHADO, R. P.; FRANCO, M. H. I.; BERTAGNOLLI, S. C. Desenvolvimento de software III:</p><p>programação de sistemas web orientada a objetos em Java. Porto Alegre: Bookman,</p><p>2016. 220 p. (Série Tekne; Eixo Informação e Comunicação).</p><p>NEGRESIOLO, L. Tudo o que você precisa (e deveria) saber sobre Programação Orien-</p><p>tada a Objetos. Gizmodo Brasil, São Paulo, 22 jan. 2019. Disponível em: https://gizmodo.</p><p>uol.com.br/tudo-sobre-programacao-orientada-a-objetos/. Acesso em: 25 ago. 2019.</p><p>OKUYAMA, F. Y.; MILETTO, E. M.; NICOLAO, M. Desenvolvimento de software I: conceitos bá-</p><p>sicos. Porto Alegre: Bookman, 2014. 236 p. (Série Tekne; Eixo Informação e Comunicação).</p><p>PINHEIRO, F. A. C. Elementos de programação em C: em conformidade com o padrão</p><p>ISO / IEC 9899. Porto Alegre: Bookman, 2012. 548 p.</p><p>11Métodos de programação</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>1</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 5</p><p>Programação Estruturada</p><p>ALGORITMOS E PROGRAMAÇÃO72</p><p>Programação estruturada</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Reconhecer a programação estruturada.</p><p>� Descrever as linguagens de programação estruturada.</p><p>� Aplicar a programação estruturada.</p><p>Introdução</p><p>O paradigma de programação estruturada se refere a construção de</p><p>programas que permitem uma clareza lógica na implementação de seu</p><p>código. Esse paradigma, implementado por muitas linguagens, como</p><p>Pascal, C, Fortran e Cobol, foi muito utilizado em programas nas décadas</p><p>de 1970 e 1980.</p><p>A programação estruturada tem como princípio a estruturação do</p><p>código por intermédio de apenas três estruturas de controle básicas.</p><p>Neste capítulo, você entenderá melhor os conceitos da programação</p><p>estruturada, a sintaxe de algumas das linguagens que utilizam esse tipo</p><p>de programação e a sua aplicação em alguns programas.</p><p>Programação estruturada</p><p>Para entender a motivação que originou a programação estruturada, é funda-</p><p>mental lembrar que tudo começou com a famosa crise do software na década de</p><p>1960. Nessa época, Edsger W. Dijkstra, por meio do seu artigo A Case against</p><p>the GO TO Statement, criticou o uso excessivo desse comando na programação.</p><p>O comando GO TO, amplamente utilizado pelas linguagens de programação da</p><p>época, trata-se de uma estrutura de controle para permitir saltos de instruções.</p><p>Sua ampla utilização pelos programadores gerava um número considerável de</p><p>programas praticamente impossíveis de serem entendidos, e a consequência</p><p>disso era a dificuldade de manutenção dos programas.</p><p>73 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>Essa declaração foi originalmente essencial para a programação no Basic,</p><p>pois os intérpretes mais antigos apenas permitiam que as instruções if fossem</p><p>executadas em uma linha e não tinham manipulação mais avançada dos loops</p><p>for ou while. Nas versões modernas do Basic, você verá o GOTO, grafado</p><p>como uma única palavra, usado</p><p>apenas para retornar ao topo de um loop</p><p>principal (SEBESTA, 2018, p. 267). No exemplo a seguir, você pode observar</p><p>a implementação do comando GOTO no Basic, que fica lendo um valor na tela</p><p>e retornando à instrução para ler o novo número.</p><p>10 READ R</p><p>20 PRINT "R ="; R;</p><p>30 A = 3.14*R^2</p><p>40 PRINT "AREA ="; A</p><p>50 GOTO 10</p><p>Segundo Tucker e Noonan (2009, p. 168), “A controvérsia do comando</p><p>Go To começou com uma nova carta de Dijkstra, desta vez para o editor da</p><p>Communications of the ACM, intitulada Go To Statement Considered Harmful</p><p>(Declaração Go To considerada prejudicial). Com essa carta, a revolução da</p><p>programação estruturada estava lançada.</p><p>A partir de então, inicia-se uma revolução na forma de construção de</p><p>códigos para programas, que seria a base para o surgimento da programação</p><p>estruturada. De modo geral, esse paradigma de programação, com o objetivo</p><p>de corrigir os problemas citados, embasava o projeto de programas com prin-</p><p>cípios básicos por meio da utilização de apenas três estruturas de controle:</p><p>� Sequência — implementa os passos de processamento necessários</p><p>para a descrição de qualquer programa, por exemplo, um segmento</p><p>de código em que é enviado o comando ''faça tarefa 1'' e,</p><p>logo após, o comando ''faça tarefa 2'', pode ser representado</p><p>com a sequência de dois retângulos, ou em um pseudocódigo que seria</p><p>denotado pela expressão das duas tarefas uma após a outra.</p><p>� Seleção — possibilita que o fluxo de processamento seja selecionado</p><p>com base em sentenças lógicas, para isso são usadas duas formas de</p><p>condicional; a primeira seria o uso da condicional if then, e a</p><p>segunda, switch.</p><p>� Iteração — possibilita que segmentos do programa tenham a sua exe-</p><p>cução repetida até que uma determinada cláusula seja satisfeita. São</p><p>implementados por comandos while ou for, por exemplo.</p><p>Programação estruturada2</p><p>ALGORITMOS E PROGRAMAÇÃO74</p><p>Na Figura 1 são demonstrados um exemplo de cada condicional de seleção.</p><p>Figura 1. Exemplo de condicionais if e switch.</p><p>Fonte: Monteiro (2018, documento on-line).</p><p>Outra razão importante para o início do movimento pela programação</p><p>estruturada foi a mudança no custo maior da computação de hardware para</p><p>de software, o que, consequentemente, exigia uma maior preocupação com a</p><p>construção e a manutenção de programas de computador (SEBESTA, 2018,</p><p>p. 40).</p><p>De forma geral, a programação estruturada foi um sucesso e os objetivos</p><p>foram alcançados. Os programadores abandonaram o uso irrestrito do comando</p><p>Go To e passaram a utilizar as construções em condições de laços e condições,</p><p>tanto que é raro encontrar o uso do comando Go To, apesar de ele ainda ser</p><p>utilizado em algumas poucas linguagens de programação. A evolução na pro-</p><p>gramação e o surgimento de novos paradigmas também tiveram uma grande</p><p>influência nos princípios básicos que originaram o paradigma da programação</p><p>estruturada. Muitas linguagens implementaram seus conceitos, mas algumas</p><p>tiveram maior influência na divulgação deles.</p><p>O desenvolvimento das linguagens C, Fortran 77 e Pascal no final da década</p><p>de 1960 estimularam o sucesso da programação estruturada. Diferentemente</p><p>de Fortran 66, essas linguagens permitiam o uso de laços e condicionais,</p><p>incluindo os laços com teste no início e teste no final do bloco de execução</p><p>laços for, comandos if-then-else e comandos switch/case, junto</p><p>ao comando composto que permitia o alinhamento dessas construções. C</p><p>também incluiu formas restritas de comandos Go To, englobando os comandos</p><p>return, break e continue.</p><p>3Programação estruturada</p><p>75 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>A seguir, você verá como as linguagens Fortran e Pascal implementam os</p><p>conceitos da programação estruturada e como foram fundamentais na ampla</p><p>divulgação e implementação do seu paradigma pelos desenvolvedores ao longo</p><p>da evolução da programação.</p><p>Linguagens de programação estruturadas</p><p>Agora que você já viu o que significa o paradigma de programação estruturada,</p><p>vamos explicar um pouco sobre as linguagens Fortran 77 e Pascal, conside-</p><p>radas, juntamente a linguagem C, como as linguagens-chave no processo de</p><p>implantação do conceito de programação estruturada.</p><p>Fortran surgiu como linguagem de programação de propósito geral, mas</p><p>foi muito utilizada em aplicações na área de engenharia. Sua primeira versão</p><p>foi em 1957, mas sem dúvida a versão mais utilizada é a 77, que implementa</p><p>os conceitos de programação estruturada (FARRER et al., 1992, p. 35).</p><p>A grande inovação foi que muitos compiladores Fortran 77 admitem sub-</p><p>conjuntos de comandos, isto é, aceitam extensões fora do padrão estabelecido</p><p>pelo American National Standards Institute (ANSI). Um programa em Fortran</p><p>77 básico é composto por uma sequência de linhas de texto que devem obe-</p><p>decer a uma determinada sintaxe para ser reconhecido como programa em</p><p>Fortran válido. A Figura 2 mostra um exemplo de um programa em Fortran</p><p>simplificado.</p><p>Figura 2. Exemplo de programa em Fortran.</p><p>Fonte: Farrer et al. (1992, p. 45).</p><p>Programação estruturada4</p><p>ALGORITMOS E PROGRAMAÇÃO76</p><p>Segundo Farrer et al. (1992, p. 35) um programa em Fortran 77 deve</p><p>seguir algumas regras e restrições para a escrita de seu código fonte, ou seja,</p><p>podemos verificar regras que obedecem aos princípios e conceitos propostos</p><p>pela programação estruturada. Para que uma linguagem de programação seja</p><p>considerada estruturada é importante que, além do conceito de sequência,</p><p>também sejam implementadas as condicionais e comandos interativos. Em</p><p>Fortran 77, a estrutura condicional é alcançada pela instrução if-else. É</p><p>muito comum o uso da instrução if em Fortran, podendo ser empregada</p><p>de formas diferentes. O comando executável if (expressão lógica) deve ser</p><p>escrito em uma linha; no exemplo a seguir ela determina o valor absoluto de x:</p><p>if (x .LT. 0 ) x = -x</p><p>Se mais de um comando tiver de ser escrito dentro de if, então a seguinte</p><p>sintaxe será adotada:</p><p>if (expressão lógica) then</p><p>comandos</p><p>endif</p><p>Sendo assim, a estrutura geral de uma condicional if tem o seguinte</p><p>aspecto:</p><p>if (expressão lógica) then</p><p>comandos</p><p>elseif (expressão lógica) then</p><p>comandos</p><p>:</p><p>:</p><p>else</p><p>comandos</p><p>end if</p><p>Com relação a comandos interativos, o Fortran 77 tem apenas uma forma</p><p>de construção de loop, chamada do-loop. O do-loop corresponde ao que é</p><p>conhecido como for-loop em outras linguagens.</p><p>5Programação estruturada</p><p>77 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>A forma geral do comando do-loop é a seguinte:</p><p>do label var = expr1, expr2, expr3</p><p>comandos</p><p>label continue</p><p>onde:</p><p>var é uma variável do tipo integer (geralmente chamada de índice do loop);</p><p>expr1 especifica o valor inicial de var;</p><p>expr2 é o limite terminal do-loop;</p><p>expr3 é o incremento ou passo do-loop.</p><p>A variável do comando do-loop nunca deve ser modificada por outro comando dentro</p><p>do loop, pois isso causaria uma grande confusão. Muitos compiladores Fortran 77</p><p>permitem que do-loops sejam encerrados com o comando enddo. A vantagem é que o</p><p>comando label pode então ser omitido. A construção do loop com enddo é largamente</p><p>usada, mas não é um componente do Fortran 77 ANSI.</p><p>A linguagem C foi outra linguagem que teve importante papel na divulgação</p><p>da programação estruturada. Foi projetada inicialmente para ser implemen-</p><p>tada no sistema operacional UNIX nos laboratórios Bell, por Ken Thompson</p><p>e Dennis Ritchie, que participavam ativamente do desenvolvimento de um</p><p>avançado sistema operacional e que, ao contrário dos sistemas operacionais</p><p>criados, estava sendo escrito em Programming Language One (PL/I), em vez</p><p>de Assembly (OKUYAMA; MILETTO; NICOLAO, 2014, p. 78).</p><p>Após o laboratório Bell desistir</p><p>do projeto do sistema operacional, Thomp-</p><p>som e Ritchie continuaram o desenvolvimento de um sistema de documentação,</p><p>que seria independente de máquina e possibilitava a execução em minicompu-</p><p>tadores baratos do final de 1960. Nascia, assim, o sistema operacional UNIX.</p><p>A linguagem C foi utilizada na construção desse sistema operacional, incial-</p><p>mente baseada na linguagem Basic Combined Programming Language (BCPL),</p><p>que não possuía tipo (OKUYAMA; MILETTO; NICOLAO, 2014, p. 79).</p><p>Programação estruturada6</p><p>ALGORITMOS E PROGRAMAÇÃO78</p><p>A partir disso, a linguagem C foi muito utilizada, principalmente em</p><p>ambientes acadêmicos, tendo, inclusive, impacto no surgimento de inúme-</p><p>ras outras linguagens conhecidas atualmente, como Java, Python e C++</p><p>(PINHEIRO, 2012, p. 68).</p><p>A Common Business Oriented Language (Cobol) é uma linguagem de</p><p>programação que foi amplamente utilizada em organizações nas décadas</p><p>de 1970 e 1980. Outra linguagem de programação que teve importância na</p><p>disseminação do paradigma de programação estruturada foi a linguagem</p><p>Pascal, desenvolvida entre 1968 e 1970 por Nicklaus Wirth, da Universidade de</p><p>Zurique, na Suíça. Pascal tem grande relevância na programação estruturada,</p><p>porque um de seus objetivos era justamente segundo Farrer et al. (1999, p. 35)</p><p>“desenvolver uma linguagem de programação disciplinada de alto nível para</p><p>ensinar programação estruturada. Esta linguagem foi batizada com o nome</p><p>de Pascal, em homenagem a Blaise Pascal, filósofo e matemático francês que</p><p>viveu entre 1623 e 1662”.</p><p>Pascal obteve uma grande adesão, principalmente na comunidade acadê-</p><p>mica, sendo utilizada como linguagem de apresentação ao desenvolvimento</p><p>de programas por universidades nas décadas seguintes.</p><p>Todo programa construído em Pascal é basicamente subdividido em três</p><p>partes distintas, conforme detalhado a seguir.</p><p>� Cabeçalho do programa: é a área do código utilizada para se fazer a</p><p>identificação do programa, é atribuído pela instrução program seguido</p><p>de um nome, por exemplo, program CALCULA_AREA.</p><p>� Área de declarações: é utilizada para validar o uso de qualquer tipo</p><p>de identificador que não seja pré-definido, estando subdividida em</p><p>sete subáreas: uses, label, const, type, var, procedure e</p><p>function, por exemplo, A, B, C: integer.</p><p>� Corpo do programa: é o local em que o programa propriamente está</p><p>escrito, tem início com a instrução begin e é finalizado pela instrução</p><p>end, seguida do símbolo ponto (.). O uso dessas instruções caracteriza</p><p>o que chamamos de bloco.</p><p>7Programação estruturada</p><p>79 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>A Figura 3 mostra um exemplo de programa em Pascal.</p><p>Figura 3. Exemplo de programa em Pascal.</p><p>Fonte: Farrer et al. (1999, p. 41).</p><p>Pascal trabalha com estruturas condicionais representadas pelo comando</p><p>if, que tem por finalidade tomar uma decisão e desviar o fluxo de processa-</p><p>mento com base em uma sentença lógica.</p><p>if (x > 10) then</p><p>writeln("O valor da variável X é 10");</p><p>As estruturas de repetição em Pascal são implementadas pelos comandos</p><p>for, while e repeat, que tem por objetivo repetir a execução de um</p><p>bloco de instruções enquanto uma sentença for válida. Veja um exemplo de</p><p>estrutura for em Pascal:</p><p>for variavel := <início> to/downto <fim> do</p><p>begin</p><p>instrução1;</p><p>instrução2;</p><p>instrução3;</p><p>end;</p><p>Programação estruturada8</p><p>ALGORITMOS E PROGRAMAÇÃO80</p><p>E, agora, um exemplo de estrutura while em Pascal:</p><p>while <condição> do</p><p>begin</p><p><instruções para condição verdadeira>;</p><p>end;</p><p>E uma estrutura repeat em Pascal:</p><p>repeat</p><p><comando1>;</p><p><comando2>;</p><p><comando3>;</p><p>until <condição>;</p><p>A seguir, analisaremos alguns exemplos da aplicação da programação</p><p>estruturada em algoritmos para fixar o entendimento.</p><p>Desenvolvendo e aplicando programação</p><p>estruturada</p><p>Para ajudar a elucidar o conceito de programação estruturada, vamos come-</p><p>çar analisando o código em Pascal, apresentado na Figura 4. Esse exemplo</p><p>demonstra a criação de um programa que solicita um número e, em seguida,</p><p>escreve uma tabuada de multiplicação desse número, caso for digitado o</p><p>número 0, o programa é finalizado.</p><p>9Programação estruturada</p><p>81 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>Figura 4. Algoritmo em Pascal que escreve a multiplicação de um número.</p><p>Fonte: Farrer et al. (1999, p. 97).</p><p>No código apresentado, você pode perceber a utilização dos comandos</p><p>sequenciais em Pascal, nos quais o código comanda ao compilador que digite</p><p>o número por meio do comando (write) e, depois, leia o número digitado</p><p>pelo comando (read).</p><p>É possível identificar também o uso de estrutura de repetição por meio do</p><p>comando repeat, nesse código são usadas estruturas de repetição aninhadas,</p><p>pois dentro da estrutura de repetição repeat existe uma segunda estrutura</p><p>de repetição while (FARRER et al., 1999, p. 95).</p><p>Vamos, agora, comparar por meio do exemplo demonstrado pela Figura 5,</p><p>a sintaxe de um algoritmo em linguagem C, que consiste em ler um número e</p><p>imprimir a sua tabuada, assim como no exemplo anterior, em Pascal. É possível</p><p>perceber as características da programação estruturada como a estrutura de</p><p>repetição while.</p><p>Programação estruturada10</p><p>ALGORITMOS E PROGRAMAÇÃO82</p><p>Figura 5. Algoritmo em C que escreve a multiplicação de um número.</p><p>Fonte: Cunha (2012, documento on-line).</p><p>A seguir, vamos analisar o trecho de um código de um programa escrito</p><p>em Cobol 74. A Figura 6 ilustra o trecho do código em Cobol demonstrando,</p><p>como nos exemplos em C e Pascal, como fazer a tabuada de um número.</p><p>11Programação estruturada</p><p>83 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>Figura 6. Algoritmo em Cobol que escreve a multiplicação de um número.</p><p>Fonte: Danflits (2010, documento on-line).</p><p>Neste caso, também é podemos verificar o uso de estruturas condicionais,</p><p>ou seja, o paradigma de programação estruturada alcançou seu objetivo de</p><p>estruturar e organizar o código dos programas de computador.</p><p>Programação estruturada12</p><p>ALGORITMOS E PROGRAMAÇÃO84</p><p>CUNHA, R. S. Tabuada da Multiplicação. iMasters, São Paulo, 27 mar. 2012. Disponível em:</p><p>https://forum.imasters.com.br/topic/460715-tabuada-de-multiplica%C3%A7%C3%A3o/.</p><p>Acesso em: 4 set. 2019.</p><p>DANFITS. Código Programa de Tabuada. Cobol — Códigos e Comentários, [S. l.], 28 jul.</p><p>2010. Disponível em: http://cobolflits.blogspot.com/2010/07/codigo-programa-de-</p><p>-tabuada.html. Acesso em: 4 set. 2019.</p><p>FARRER, H. et al. Fortran estruturado: Fortran 77. Rio de Janeiro: Guanabara Koogan,</p><p>1992. 194 p. (Programação Estruturada de Computadores).</p><p>FARRER, H. et al. Pascal estruturado: Turbo Pascal. 3. ed. Rio de Janeiro: LTC, 1999. 279 p.</p><p>(Programação Estruturada de Computadores).</p><p>MONTEIRO, L. P. Linguagem de programação: classificações. Universidade da Tecnolo-</p><p>gia, São Paulo, 16 fev. 2018. Disponível em: https://universidadedatecnologia.com.br/</p><p>linguagem-de-programacao-classificacoes/. Acesso em: 4 set. 2019.</p><p>OKUYAMA, F. Y.; MILETTO, E. M.; NICOLAO, M. Desenvolvimento de software I: conceitos bá-</p><p>sicos. Porto Alegre: Bookman, 2014. 236 p. (Série Tekne; Eixo Informação e Comunicação).</p><p>PINHEIRO, F. A. C. Elementos de programação em C: em conformidade com o padrão</p><p>ISO / IEC 9899. Porto Alegre: Bookman, 2012. 548 p.</p><p>SEBESTA, R. W. Conceitos de linguagem de programação. 11. ed. Porto Alegre: Bookman,</p><p>2018. 758 p.</p><p>TUCKER, A. B.; NOONAN, R. E. Linguagens de programação: princípios e paradigmas.</p><p>2. ed. Porto Alegre: AMGH, 2009. 630 p.</p><p>Leituras recomendadas</p><p>DIJKSTRA, E. W. A Case against the GO TO Statement. Department of Computer Science –</p><p>University of Texas, Austin, 2011. Disponível em: http://www.cs.utexas.edu/users/EWD/</p><p>transcriptions/EWD02xx/EWD215.html. Acesso em: 4 set. 2019.</p><p>DIJKSTRA, E. W. Go To Statement Considered Harmful. Communications of the ACM, [S.</p><p>l.], v. 11, n. 3, p. 147–148, Mar. 1968. Disponível em: https://homepages.cwi.nl/~storm/</p><p>teaching/reader/Dijkstra68.pdf. Acesso em: 4 set. 2019.</p><p>EDELWEISS, N.; LIVI, M. A. C. Algoritmos e programação: com exemplos em Pascal e C.</p><p>Porto Alegre: Bookman, 2014. 476 p. (Série Livros Didáticos Informática UFRGS).</p><p>LEDUR, C. L. Desenvolvimento de sistemas com C#. Porto Alegre: SAGAH, 2018. 268 p.</p><p>MACHADO, R. P.; FRANCO, M. H. I.; BERTAGNOLLI, S. C. Desenvolvimento de software III:</p><p>programação de sistemas web orientada a objetos em Java. Porto Alegre: Bookman,</p><p>2016. 220 p. (Série Tekne; Eixo Informação e Comunicação).</p><p>NICOLETTI, M. C. A cartilha Prolog. São Carlos: Edufscar, 2003. 124 p. (Série Apontamentos).</p><p>13Programação estruturada</p><p>85 Introdução aos Algoritmos UNIDADE 1</p><p>Programação Estruturada PARTE 5</p><p>ANOTAÇÕES</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>2</p><p>Introdução à Programação em C</p><p>Prezado estudante,</p><p>Estamos começando uma unidade desta disciplina. Os textos que a compõem foram</p><p>organizados com cuidado e atenção, para que você tenha contato com um conteúdo</p><p>completo e atualizado tanto quanto possível. Leia com dedicação, realize as atividades e</p><p>tire suas dúvidas com os tutores. Dessa forma, você, com certeza, alcançará os objetivos</p><p>propostos para essa disciplina.</p><p>OBJETIVO GERAL</p><p>Demonstrar como criar programas com comandos de atribuição e com utilização de</p><p>variáveis e constantes.</p><p>OBJETIVOS ESPECÍFICOS</p><p>• Reconhecer o histórico da linguagem C.</p><p>• Identificar a estrutura básica de um programa em C.</p><p>• Identificar a diferença entre os tipos de dados.</p><p>• Realizar a inicialização e nomeação de variáveis.</p><p>• Descrever o conceito de função.</p><p>• Aplicar as funções printf() e scanf e desenvolver códigos de formatação dessas</p><p>funções.</p><p>• Compreender o uso dos operadores de atribuição, aritméticos, relacionais e lógicos.</p><p>• Construir expressões com vários operadores e precedência.</p><p>• Identificar erros léxicos, sintáticos e semânticos em C e aplicar estratégias de</p><p>correção.</p><p>• Conhecer o processo de depuração: estratégias e recursos do ambiente.</p><p>• Aplicar o processo de indentação de código e estratégias de documentação por</p><p>comentários.</p><p>• Declarar cadeias de caracteres (strings).</p><p>• Diferenciar variáveis numéricas e variáveis de caracteres.</p><p>• Construir algoritmos que utilizem variáveis do tipo caracteres.</p><p>ALGORITMOS E PROGRAMAÇÃO88</p><p>ANOTAÇÕES</p><p>unidade</p><p>2</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 1</p><p>A linguagem C - Conceitos Básicos</p><p>ALGORITMOS E PROGRAMAÇÃO90</p><p>Linguagem C</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Conhecer o histórico da linguagem C.</p><p>� Identificar a estrutura básica de um programa em C.</p><p>� Instalar e conhecer ambientes de desenvolvimento da linguagem C.</p><p>Introdução</p><p>Da mesma forma que existem vários idiomas no mundo, na computa-</p><p>ção, existem várias linguagens de programação, as LPs. Uma LP é uma</p><p>linguagem na qual os programas são escritos e que faz uma tradução do</p><p>algoritmo para uma linguagem que o computador entenda.</p><p>Neste texto, você vai estudar sobre a linguagem C, também conhecida</p><p>como a “linguagem das linguagens”, por ser bastante difundida no meio</p><p>acadêmico e usada para que você dê os primeiros passos no mundo da</p><p>programação. Você vai entender como surgiu a linguagem por meio do</p><p>histórico da linguagem C, compreender a estrutura básica da linguagem,</p><p>além de conhecer vários ambientes de desenvolvimento e configurar o</p><p>que melhor adaptar-se às suas necessidades.</p><p>Histórico da linguagem C</p><p>Antes de começarmos a falar sobre C, que é a linguagem que usaremos, vamos</p><p>entender o que é uma linguagem de programação. No capítulo Introdução</p><p>à Lógica de Programação, falamos sobre Algoritmos e como o seu papel é</p><p>importante no desenvolvimento de um programa. A Figura 1, a seguir, faz a</p><p>representação de como um algoritmo ajuda na resolução de problemas.</p><p>91 Introdução à Programação em C UNIDADE 2</p><p>A Linguagem C - Conceitos Básicos PARTE 1</p><p>Figura 1. Diagrama de como um algoritmo ajuda na resolução de problemas.</p><p>Problema Algoritmo</p><p>ProgramaSolução</p><p>Porém, se o algoritmo não está escrito em uma linguagem que o compu-</p><p>tador entenda, é preciso, então, fazer uma tradução da linguagem que nós,</p><p>humanos, usamos para a que a máquina entenda. Essa tradução é feita por</p><p>meio da utilização de uma linguagem de programação (LP). Existem várias</p><p>linguagens de programação, com paradigmas e níveis de abstração diferentes.</p><p>Quando uma LP assemelha-se à linguagem falada ou escrita por um ser</p><p>humano, ela é dita de alto nível, e, quando ela aproxima-se da linguagem de</p><p>máquina, é dita de baixo nível. Da mesma forma que o Português, por exemplo,</p><p>tem regras (sintaxe) para que seja compreendido por qualquer pessoa que fale</p><p>esta língua, as LPs também têm um conjunto de regras com as quais é possível</p><p>traduzir um algoritmo e gerar um programa.</p><p>Dito isso, podemos começar a falar da linguagem que vamos utilizar neste</p><p>livro: a linguagem de programação C. C é uma LP bastante popular, criada</p><p>por volta de 1970, por Dennis Ritchie.</p><p>C foi desenvolvida no Bell Laboratories, onde muitas de suas ideias iniciais</p><p>surgiram de outra linguagem, a B, que tem como antecessoras as linguagens</p><p>BCPL e CPL. CPL foi uma linguagem desenvolvida com o propósito de ser</p><p>uma linguagem de alto e baixo níveis. A maior desvantagem da CPL foi que</p><p>era muito pesada para o desenvolvimento de algumas aplicações. Em 1967, foi</p><p>desenvolvida a Basic CPL – BCPL, que mantinha as características básicas da</p><p>CPL. Ken Thompson, que trabalhava na Bell Labs, utilizou esse projeto para o</p><p>Linguagem C2</p><p>ALGORITMOS E PROGRAMAÇÃO92</p><p>desenvolvimento da linguagem B. Assim, B foi uma versão de BCPL escrita</p><p>para o desenvolvimento de sistemas. Em 1972, Dennis Ritchie, trabalhando com</p><p>Ken Thompson, desenvolveu uma linguagem também baseada na linguagem</p><p>BCPL, mas que mantinha parte da especificação para acesso a hardware, ou</p><p>seja, a parte das características de baixo nível da linguagem, conhecida como C.</p><p>A linguagem C é usada por programadores há muito tempo e poderosa no</p><p>desenvolvimento dos mais diversos tipos de sistema, desde sistemas operacio-</p><p>nais, passando por compiladores, editores de texto, etc. Além da diversidade de</p><p>sistemas, é importante ressaltar que C é uma linguagem que pode ser utilizada</p><p>em máquinas com um alto poder de processamento, bem como em máquinas</p><p>mais simples e com baixo poder de processamento.</p><p>Dentre as características de C, podemos destacar:</p><p>� Portabilidade: os programas em C são compilados, gerando um único</p><p>executável. Assim, é possível compilar um programa escrito em C para</p><p>qualquer máquina, desde que exista compilador C para ela. Na prática,</p><p>existem compiladores C para quase todos os computadores.</p><p>� Poder e variedade dos operadores: é possível trabalhar com funções</p><p>matemáticas, criação e manipulação de arquivos de Dos, dentre outras</p><p>possibilidades. Isso tudo pode ser feito de forma simplificada, com</p><p>adição de bibliotecas padronizadas, presentes na própria linguagem.</p><p>� Sintaxe elegante, estruturada e flexível: indicada para quem está co-</p><p>meçando a programar.</p><p>� Acesso facilitado à memória e a todo o hardware, quando preciso:</p><p>assim, é possível ir de um programa</p><p>simples até o desenvolvimento de</p><p>um sistema operacional.</p><p>� Uso de procedimentos e funções para desenvolver sistemas desacopla-</p><p>dos: sistemas desacoplados são sistemas onde é possível isolar pequenas</p><p>partes para, por exemplo, encontrar erros sem causar nenhum dano ao</p><p>restante do sistema.</p><p>Pela natureza de como foi desenvolvida, C também é chamada de lingua-</p><p>gem de Médio Nível, pois possui um conjunto de instruções necessárias para</p><p>acesso ao hardware, como as linguagens de baixo nível (Assembly). Além</p><p>disso, C pode ser simples e amigável, como uma linguagem de alto-nível</p><p>deve ser. Uma linguagem de médio nível pode, em alguns casos, não prover</p><p>as estruturas necessárias a uma linguagem de alto nível, mas certamente ela</p><p>tem ferramentas que podem ser usadas como blocos para construção dessas</p><p>estruturas necessárias.</p><p>3Linguagem C</p><p>93 Introdução à Programação em C UNIDADE 2</p><p>A Linguagem C - Conceitos Básicos PARTE 1</p><p>A primeira versão de C foi criada por Dennis Ritchie, em 1972, nos laboratórios Bell, para</p><p>ser incluída como um dos softwares a serem distribuídos juntamente com o sistema</p><p>operacional Unix do computador PDP-11.</p><p>Estrutura básica da linguagem C</p><p>Neste ponto, você deve estar querendo saber como é escrito um programa que</p><p>utiliza a linguagem C. A primeira coisa que temos que entender é o processo</p><p>da criação desse programa.</p><p>� Com o algoritmo em mente, você deve traduzi-lo para C em um arquivo</p><p>e salvá-lo com a extensão C. Por exemplo, imagine que eu escrevi meu</p><p>primeiro programa em um arquivo que irei nomear de programa1; ao</p><p>salvá-lo, esse arquivo precisa de um nome e de uma extensão; assim,</p><p>esse arquivo ficaria como: programa1.c</p><p>� A segunda parte é usar um compilador para gerar o programa. O com-</p><p>pilador nada mais é do que um programa que vai fazer toda a conversa</p><p>e tradução do seu código-fonte para a linguagem mais baixa do sistema,</p><p>a linguagem da máquina.</p><p>� Pronto, agora seu programa foi criado. Basta somente executá-lo.</p><p>� A Figura 2, a seguir, demonstra, por meio de um esquema, a criação</p><p>de um programa compilado.</p><p>Figura 2. Como um programa compilado é criado?</p><p>Linguagem C4</p><p>ALGORITMOS E PROGRAMAÇÃO94</p><p>Agora vamos entender a estrutura básica do nosso código-fonte, escrito em</p><p>linguagem C. Mais à frente, veremos com o uso das ferramentas precisamos,</p><p>mas, por hora, imagine que você abriu qualquer editor de texto da sua preferên-</p><p>cia e criou um arquivo novo, salvou-o com extensão C e, agora, chegou a hora</p><p>de preenchê-lo com seu código em C, conforme exemplificado na Figura 3.</p><p>Figura 3. Primeiro programa em C.</p><p>Durante todo este livro, vamos explicar os códigos, usando os números</p><p>das linhas na margem à esquerda dos códigos. Vamos a elas:</p><p>� Falamos sobre uma das características do C, o uso de bibliotecas pa-</p><p>dronizadas. A linha 1 é o comando para adicionar a biblioteca padrão</p><p>stdio.h no seu código-fonte. Uma das possibilidades que ela traz são</p><p>comandos de entrada e saída de dados.</p><p>� Na linha 2, temos a declaração da função principal, que, em C, é cha-</p><p>mada de main, e a palavra int antes dela indica que deverá “devolver”</p><p>algo do tipo inteiro. Depois de main, temos um par de parênteses vazio,</p><p>indicando que ela não tem nenhum argumento.</p><p>� Nas linhas 3 e 6, temos um par de chaves, entre as quais a magia</p><p>acontece, onde todo o seu algoritmo, agora traduzido para C, ficará.</p><p>� Na linha 4, temos um exemplo de instrução que escreve um texto na tela.</p><p>� Por fim, na linha 5, temos o valor que a função main retorna, 0.</p><p>Sabemos que, a essa altura do livro, poucas dessas palavras parecem fami-</p><p>liares, mas calma: foi assim com todos os programadores profissionais — todo</p><p>mundo, no início de aprendizado, passou por essa etapa. É preciso que neste</p><p>início (principalmente) você estude e pratique como se estivesse aprendendo</p><p>um novo idioma, como o inglês. Só assim tudo ficará mais familiar e, como</p><p>os programadores dizem, “no sangue”.</p><p>5Linguagem C</p><p>95 Introdução à Programação em C UNIDADE 2</p><p>A Linguagem C - Conceitos Básicos PARTE 1</p><p>No exemplo da Figura 4, o programa escreve algo na tela. Se você quiser</p><p>escrever um programa, por exemplo, que soma 2 números, deverá substituir</p><p>a linha 4 por toda a tradução do seu algoritmo. Então, a estrutura básica de</p><p>um código C é a seguinte:</p><p>Figura 4. Estrutura básica de um programa em C.</p><p>Agora temos o código-fonte. Na próxima seção, vamos conhecer os am-</p><p>bientes para desenvolvimento e, assim, gerar o programa em C.</p><p>Ambientes de desenvolvimento com</p><p>linguagem C</p><p>Existem dois caminhos a seguir em se tratando de desenvolvimento de pro-</p><p>gramas. Você pode usar um editor de texto e um compilador/interpretador da</p><p>linguagem que escolher, ou um ambiente integrado de desenvolvido, também</p><p>conhecido como IDE.</p><p>Muitas pessoas dizem que, no início dos estudos de programação, é me-</p><p>lhor usar um editor de texto, já que, em muitas vezes, uma IDE traz muita</p><p>informação que ainda não é familiar ao estudante.</p><p>Neste livro, vamos dar a você sugestões de editores de texto e IDE, para que,</p><p>assim, você possa fazer suas escolhas. Começando com os editores de texto:</p><p>� Sublime Text, que pode ser usado em ambientes OS X, Windows ou</p><p>Linux.</p><p>� Atom, que também pode ser usado em OS X, Windows ou Linux.</p><p>� Editores-padrão do seu sistema operacional.</p><p>Linguagem C6</p><p>ALGORITMOS E PROGRAMAÇÃO96</p><p>Agora, as IDEs:</p><p>� Dev-C++: ferramenta para desenvolvimento C e C++, para o ambiente</p><p>Windows — essa ferramenta é bastante difundida no meio acadêmico.</p><p>� Code::Blocks: ferramenta open-source, na qual se pode programar</p><p>em C,C++ e Fortran. (existe versão para Windows, Linux e OS X)</p><p>— uma das ferramentas mais flexíveis e com uma quantidade grande</p><p>de plugins, o que pode ajudar durante o desenvolvimento de algum</p><p>programa específico.</p><p>� Visual Studio: ambiente de programação para o Windows e OS X —</p><p>nessa IDE, é possível programar em várias linguagens, dentre elas a C.</p><p>� Eclipse: uma das IDEs mais completas, na qual se pode programar</p><p>(realizando a configuração adequada) em diversas linguagens — dis-</p><p>ponível para OS X, Windows ou Linux.</p><p>Alguns detalhes:</p><p>� Se você escolher usar o editor de texto, é preciso instalar também o</p><p>compilador C.</p><p>� Se você escolher usar uma IDE, deve configurá-la para a linguagem</p><p>C, no caso das IDEs que possuem uma vasta gama de possibilidade de</p><p>linguagens de programação.</p><p>Escolhido o ambiente de programação, vamos criar nosso primeiro pro-</p><p>grama? Vamos usar aqui o editor de texto+compilador no ambiente Linux. No</p><p>caso das IDEs, é preciso somente abrir um novo documento, “codar ”(termo</p><p>da moda e moderninho pra programar!!!), e clicar no ícone responsável por</p><p>compilar e/ou executar o programa.</p><p>Como o editor simples foi o escolhido, é preciso, agora, ir para a linha de</p><p>comando do Linux e digitar alguns comandos. É necessário acessar a pasta onde</p><p>o arquivo.c esteja e, em seguida, basta digitar o seguinte: gcc nomedoarquivo.c</p><p>-o nomedoprograma.</p><p>7Linguagem C</p><p>97 Introdução à Programação em C UNIDADE 2</p><p>A Linguagem C - Conceitos Básicos PARTE 1</p><p>Linha de comando para compilação de um programa em C:</p><p>� gcc — comando para executar o compilador C;</p><p>� nomedoarquivo — o arquivo deve ter sido salvo com extensão C e é preciso estar</p><p>na mesma pasta que ele;</p><p>� -o — opção necessária para gerar o executável em C;</p><p>� nomedoprograma — nome do programa que vai ser gerado; se não for digitado,</p><p>o compilador gera um programa cujo nome será a.out.</p><p>Depois disso, e se tudo ocorreu bem, o compilador gera um programa com</p><p>o nome nomedoprograma. Basta, agora, executá-lo</p><p>— e você escreveu seu</p><p>primeiro programa em C! Parabéns!</p><p>Além de IDEs, existem outras ferramentas para otimizar</p><p>o desenvolvimento de software. Para maiores detalhes,</p><p>acesse o link a seguir ou o código QR.</p><p>https://goo.gl/79C11q</p><p>PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012.</p><p>Leitura Recomendada</p><p>Linguagem C8</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>2</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 2</p><p>Tipos de Dados e Variáveis</p><p>ALGORITMOS E PROGRAMAÇÃO100</p><p>Tipos de dados e variáveis</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p> Identificar a diferença entre os tipos de dados.</p><p> Realizar a inicialização e nomeação de variáveis.</p><p> Aplicar a declaração de variáveis.</p><p>Introdução</p><p>Os dados que utilizamos nos programas de computadores precisam ser</p><p>armazenados na memória do computador. A memória é como um grande</p><p>arquivo cheio de gavetas, e, para uma melhor organização, essas gavetas</p><p>podem estar etiquetadas. Outro detalhe desse grande arquivo é que as</p><p>gavetas podem ter tamanhos diferentes e, de acordo com eles, guardam</p><p>determinado tipo de objeto. Usando essa analogia, cada gaveta é uma</p><p>variável que tem um nome (etiqueta) e um tamanho que representa o</p><p>seu tipo.</p><p>Neste capítulo, você vai compreender o que são variáveis e como</p><p>definimos os tipos de dados que podemos armazenar nelas.</p><p>Diferença entre os tipos de dados</p><p>Um computador é uma máquina que processa dados. Ao escrevermos um</p><p>programa, estamos, na verdade, realizando essa tarefa com os dados que o</p><p>usuário entrega para a máquina. Por exemplo, quando queremos que um pro-</p><p>grama realize o cálculo da média entre duas notas, é preciso que, de alguma</p><p>forma, o programa “receba” essas duas notas.</p><p>Os dados são os insumos que entregamos aos computadores para que eles</p><p>realizarem a tarefa, utilizando, para isso, um programa computacional. Esses</p><p>dados são armazenados em regiões de memória que chamamos de variáveis.</p><p>101 Introdução à Programação em C UNIDADE 2</p><p>Tipos de dados e Variáveis PARTE 2</p><p>Podemos pensar na memória do computador como um grande armário cheio</p><p>de gavetas, as variáveis são as gavetas e, para uma melhor organização, cada</p><p>uma possui uma etiqueta indicando o tipo de material que pode ser guardado</p><p>nela: papel, envelopes, canetas.</p><p>As variáveis também possuem etiquetas que são os nomes das variáveis, e</p><p>a classificação do que pode ser guardado em cada variável é dada pelos tipos</p><p>de variáveis de uma determinada linguagem de programação.</p><p>Existem cinco tipos de dados em C, e cada um representa um tipo de</p><p>informação. Os tipos são representados por uma palavra reservada da lin-</p><p>guagem, que são:</p><p> int: números inteiros</p><p> char: letras, caracteres, dados alfanuméricos</p><p> float: números reais com precisão simples, ocupa 4 bytes na memória</p><p>do computador</p><p> double: números reais com precisão dupla, ocupa 8 bytes na memória</p><p>do computador</p><p> void:vazio</p><p>Além dos tipos, existem em C os modificadores de tipo:</p><p> short: diminui o espaço em memória reservado para uma variável</p><p> long: aumenta o espaço em memória reservado para uma variável</p><p> unsigned: indica que a variável será guardada sem sinal</p><p> signed: indica que a variável será armazenada com sinal</p><p>Como a ideia desse material é focar em algoritmos de programação, mas</p><p>com nível básico, os modificadores não serão utilizados.</p><p>Tipos de dados e variáveis2</p><p>ALGORITMOS E PROGRAMAÇÃO102</p><p>Inicializando e nomeando variáveis</p><p>Se retomarmos ao exemplo da gaveta, os nomes que estão escritos nas etiquetas</p><p>identifi cam os elementos que estão na gaveta. Não é conveniente identifi car a</p><p>etiqueta como caneta, sendo que o que está sendo guardado nela seja adesivos.</p><p>Uma palavra reservada de uma linguagem é uma palavra que faz parte da sintaxe e tem</p><p>uma funcionalidade especificada na linguagem, não podendo ser usada para outro fim.</p><p>Com as variáveis, funciona da mesma forma. É conveniente colocar o</p><p>nome das variáveis para ajudar na leitura de um código. Lembre-se de que</p><p>você pode ter que reler o código para encontrar erros ou, até mesmo, outras</p><p>pessoas precisem realizar a tarefa árdua de leitura de código alheio.</p><p>Escolha nomes que identifiquem as variáveis. Existem algumas regras que</p><p>podem ajudar na hora de nomear uma variável:</p><p> Evite começar com letra maiúscula e nunca use um número para co-</p><p>meçar uma variável.</p><p> Não utilize caracteres especiais, como:, “, (,).</p><p> Você não pode usar nenhuma palavra reservada como variável.</p><p> Evite variáveis como a, b, n1,n2 , pois isso só tende a dificultar a</p><p>leitura de código.</p><p> Se a variável tem mais de uma palavra, a partir da segunda, coloque a</p><p>primeira letra da palavra em maiúscula, ou utilize underline.</p><p> Não coloque sinais de pontuação na sua variável.</p><p>Quando criamos um programa e utilizamos o conceito de variáveis, o</p><p>compilador associa a uma região de memória o nome desta variável. A memória</p><p>do computador é um recurso utilizado por todos os programas que estão sendo</p><p>executados ou que pararam de ser executados em algum momento, ou seja,</p><p>aquela região que agora é a variável do seu programa pode ter sido utilizada</p><p>por outro programa, o que deixou alguma informação nessa parte da memória,</p><p>como se fosse um lixo de dados.</p><p>3Tipos de dados e variáveis</p><p>103 Introdução à Programação em C UNIDADE 2</p><p>Tipos de dados e Variáveis PARTE 2</p><p>O que podemos fazer, então, para evitar erros no nosso código devido a</p><p>valores deixados na memória? Podemos limpar essa região de memória, e</p><p>isso pode ser feito inicializando o valor de uma variável logo em seguida à</p><p>declaração. A Figura 1 mostra a declaração e a inicialização de uma variável.</p><p>Figura 1. Declaração e inicialização de variáveis.</p><p>Declaração de variáveis</p><p>Quando um programa está sendo executado, signifi ca que ele está na memó-</p><p>ria do computador, onde armazenamos os dados nas variáveis. Precisamos</p><p>solicitar que o computador reserve essa região de memória que possuirá um</p><p>nome e um tipo.</p><p>O ato de solicitar essa região deve ser feito no programa e chama-se decla-</p><p>ração de variáveis. Em C, podemos declarar uma variável da seguinte forma:</p><p>Na linha 4, realizamos a declaração de uma variável; primeiramente, é</p><p>preciso colocar o tipo da variável, seguida do nome dela, e, por fim, o ponto-</p><p>-e-vírgula que finaliza toda e qualquer linha em C. Na linha 5, inicializamos</p><p>a variável idade com o valor 0, para que, assim, não corramos o risco de ter</p><p>um valor indesejado armazenado nessa variável, sendo utilizado no nosso</p><p>programa.</p><p>Vamos a outro exemplo. Imagine que você precise calcular a média de um</p><p>aluno. O seu usuário precisa digitar duas notas e você precisa calcular a média.</p><p>Vamos, nessa etapa, somente declarar e inicializar as variáveis necessárias.</p><p>Tipos de dados e variáveis4</p><p>ALGORITMOS E PROGRAMAÇÃO104</p><p>Figura 2. Declaração simultânea de variáveis.</p><p>Observe que, na linha 4, declaramos na mesma linha 3 variáveis do tipo</p><p>double, pois a média pode ser um número com vírgula. Essa é outra forma</p><p>de declarar variáveis de mesmo tipo de forma simultânea. Nas linhas 5,6 e</p><p>7, inicializamos essas variáveis para evitarmos quaisquer erros causados por</p><p>“lixo” de dados presente na memória. A Figura 2 apresenta uma declaração</p><p>simultânea de variáveis.</p><p>A definição do tipo das variáveis, do nome e de como você faz essas</p><p>escolhas constitui uma etapa importante do desenvolvimento de programas.</p><p>Faça essas escolhas com calma e analisando bem o que você utilizará e como.</p><p>PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.</p><p>296p.</p><p>PINHEIRO,</p><p>Parte 3: Entrada e Saída de Dados .....................................................................................................107</p><p>Parte 4: Operadores .............................................................................................................................117</p><p>Parte 5: Correção de Erros, Depuração e Documentação ..................................................................139</p><p>Parte 6: Manipulação de Caracteres...................................................................................................139</p><p>UNIDADE 3</p><p>Comandos Condicionais ................................................................................................................... 169</p><p>Objetivo Geral .................................................................................................................................. 169</p><p>Objetivos Específicos ...................................................................................................................... 169</p><p>Parte 1: Comandos Condicionais Simples (Fluxograma) ...................................................................171</p><p>Parte 2: Comandos Condicionais Compostos (Fluxograma) .............................................................177</p><p>Parte 3: Estruturas de Seleção ............................................................................................................183</p><p>Parte 4: Comandos Condicionais de Múltipla Escolha (Pseudocódigo) ............................................197</p><p>UNIDADE 4</p><p>Comandos Interativos ...................................................................................................................... 207</p><p>Objetivo Geral .................................................................................................................................. 207</p><p>Objetivos Específicos ...................................................................................................................... 207</p><p>Parte 1: Estrutura de Repetição Enquanto (Fluxograma) ..................................................................209</p><p>Parte 2: Estrutura de Repetição Para (Fluxograma)...........................................................................213</p><p>Parte 3: Estrutura de Repetição Enquanto. (Pseudocódigo) ..............................................................223</p><p>Parte 4: Estrutura de Repetição Repita...Até (Fluxograma) ...............................................................229</p><p>Parte 5: Estruturas de Repetição ........................................................................................................235</p><p>unidade</p><p>1</p><p>Introdução aos Algoritmos</p><p>Prezado estudante,</p><p>Estamos começando uma unidade desta disciplina. Os textos que a compõem foram</p><p>organizados com cuidado e atenção, para que você tenha contato com um conteúdo</p><p>completo e atualizado tanto quanto possível. Leia com dedicação, realize as atividades e</p><p>tire suas dúvidas com os tutores. Dessa forma, você, com certeza, alcançará os objetivos</p><p>propostos para essa disciplina.</p><p>OBJETIVO GERAL</p><p>Introduzir os conceitos de algoritmos e de linguagens de programação estruturada.</p><p>OBJETIVOS ESPECÍFICOS</p><p>• Conhecer o conceito de algoritmo: apresentação, exemplos e definição.</p><p>• Entender os conceitos de comandos, variáveis, expressões e instruções.</p><p>• Compreender as formas de execução de um programa: compilação e interpretação.</p><p>• Identificar os algoritmos e a lógica de programação na solução de problemas, bem</p><p>como a representação e os tipos de dados utilizados na construção de algoritmos.</p><p>• Operar de forma correta os tipos de dados e suas relações.</p><p>• Identificar os tipos de métodos de programação.</p><p>• Reconhecer a programação estruturada.</p><p>• Descrever as linguagens de programação estruturada.</p><p>ALGORITMOS E PROGRAMAÇÃO10</p><p>ANOTAÇÕES</p><p>unidade</p><p>1</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 1</p><p>Introdução a Lógica</p><p>de Programação</p><p>ALGORITMOS E PROGRAMAÇÃO12</p><p>Introdução à lógica</p><p>de programação</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Conhecer o conceito de algoritmo: apresentação, exemplos e definição.</p><p>� Entender os conceitos de comandos, variáveis, expressões e instruções.</p><p>� Compreender as formas de execução de um programa: compilação</p><p>e interpretação.</p><p>Introdução</p><p>Já parou para pensar como é feito um jogo, um site da Internet ou um</p><p>aplicativo do seu dispositivo móvel? Cada vez mais, usamos tecnologia</p><p>desde o nosso trabalho até a nossa diversão. E que tal você aprender</p><p>como os programas são desenvolvidos para poder criar seus próprios</p><p>jogos, sites, etc.? A base fundamental de um programa de computador</p><p>são os algoritmos e a lógica de programação. Esses conceitos, além de</p><p>serem bases da programação de computadores, desenvolvem habilidades,</p><p>como raciocínio lógico, que podem ser utilizadas na resolução dos mais</p><p>diversos problemas nas mais diversas áreas.</p><p>Neste capítulo, você vai acompanhar a construção de um algoritmo,</p><p>os conceitos básicos envolvidos e como funciona a execução de um</p><p>programa de computador.</p><p>Algoritmo: apresentação, exemplos e definição</p><p>Um algoritmo nada mais é do que um conjunto de passos para a realização</p><p>de uma determinada tarefa. O que é importante entendermos é que um algo-</p><p>ritmo não precisa ser necessariamente algo ligado à tecnologia. Na realidade,</p><p>o tempo todo estamos criando algoritmos para realizarem diversas tarefas.</p><p>Quer ver um exemplo?</p><p>13 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução a Lógica de Programação PARTE 1</p><p>Quando você vai sair de casa a caminho da faculdade, existe uma sequência</p><p>de passos que você realiza, que tem uma ordem. As ordens das coisas que você</p><p>precisa fazer para chegar à faculdade são escolhidas para te ajudar a realizar</p><p>a tarefa: “ir para a faculdade”.</p><p>Outros exemplos:</p><p>� Preparar um hambúrguer.</p><p>� Fazer um avião de papel.</p><p>� Trocar o pneu de um carro.</p><p>Exemplo — Preparar um hambúrguer</p><p>1. Cortar o pão e deixá-lo aberto com as partes de dentro voltadas para cima;</p><p>2. lavar a alface e o tomate;</p><p>3. fritar o hambúrguer;</p><p>4. colocar o hambúrguer sobre uma das partes do pão que está aberta;</p><p>5. colocar uma fatia de queijo, uma rodela de tomate e uma folha de alface sobre</p><p>o hambúrguer;</p><p>6. fechar o pão com a outra parte que ficou sem nada sobre ela.</p><p>Pronto — sanduíche prontinho! Mas podemos fazer algumas perguntas</p><p>sobre essa nossa aventura na cozinha:</p><p>� Existe somente um jeito de fazer esse hambúrguer?</p><p>� A ordem das atividades é importante?</p><p>Não existe uma única forma; o importante é que essas atividades sejam</p><p>organizadas de tal forma que a tarefa “preparar um hambúrguer” seja realizada.</p><p>Nesse momento, o importante é fazer, não importando se mais rápido, mais</p><p>gostoso ou com mais recheio. Assim, a ordem é de extrema importância para</p><p>que consigamos chegar ao objetivo final.</p><p>Afinal, o que isso tem a ver com computador? Bom, primeiro é preciso</p><p>entender por que o uso de computador para resolução dos mais diversos pro-</p><p>blemas e das mais diversas tarefas tornou-se tão imprescindível. Para isso,</p><p>vamos comparar o ser humano a um computador.</p><p>Introdução à lógica de programação2</p><p>ALGORITMOS E PROGRAMAÇÃO14</p><p>O humano é um ser inteligente, capaz de realizar diversas tarefas, como,</p><p>por exemplo, calcular o valor do desconto de um jogo que está prestes a</p><p>comprar. Já um computador é uma máquina “burrinha”, que só executa o</p><p>que mandamos. Em contrapartida, ele não se cansa. Imagina se você tivesse</p><p>que calcular, durante o dia inteiro, o desconto da venda de uma loja? Poderia</p><p>cansar-se e até cometer um erro, não é mesmo?</p><p>Então, é por isso que, desde quando foi criado até hoje, o papel fundamental</p><p>do computador é ajudar o ser humano nas suas tarefas. Mas quem ensina o</p><p>computador o que ele tem que fazer? Esse papel é do ser humano, que o faz</p><p>por meio dos programas.</p><p>Os programas de computador são conjuntos</p><p>F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.</p><p>Leituras recomendadas</p><p>5Tipos de dados e variáveis</p><p>105 Introdução à Programação em C UNIDADE 2</p><p>Tipos de dados e Variáveis PARTE 2</p><p>ANOTAÇÕES</p><p>ALGORITMOS E PROGRAMAÇÃO106</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>2</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 3</p><p>Entrada e Saída de Dados</p><p>ALGORITMOS E PROGRAMAÇÃO108</p><p>Entrada e saída de dados</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Definir função.</p><p>� Aplicar as funções printf() e scanf().</p><p>� Usar códigos de formatação.</p><p>Introdução</p><p>Os programas de computador são sistemas que processam dados. A tarefa</p><p>de um programa de computador é receber dados por meio de instruções</p><p>de entrada, processar essas informações de acordo com a lógica criada e</p><p>traduzida para uma determinada linguagem de programação e entregar</p><p>esses dados processados, utilizando as instruções de saída de dados.</p><p>Neste capítulo, você estudará uma parte importante no desenvol-</p><p>vimento de sistemas: as instruções necessárias para realizar a entrada e</p><p>saída de dados em um programa de computador.</p><p>O conceito de função</p><p>Para explicar o conceito de função, vamos começar com o seguinte código:</p><p>Figura 1. Código-fonte: o conceito de função.</p><p>109 Introdução à Programação em C UNIDADE 2</p><p>Entrada e Saída de Dados PARTE 3</p><p>Na linha 4, temos o uso de uma função existente em C, a printf. Esta</p><p>função escreve na tela o texto existente em parênteses e entre aspas. Existe</p><p>uma complexidade gigante para que seja escrito na tela do computador um</p><p>valor e existam instruções específicas para isso.</p><p>Uma função é um conjunto de instruções que realizam uma determinada tarefa. Para</p><p>que fique mais fácil o uso, elas têm nome.</p><p>Seria preciso um conjunto dessas instruções todas as vezes em que essa</p><p>operação fosse necessária em um programa. Para facilitar esse trabalho, em</p><p>programação, existem dois conceitos muito importantes: biblioteca e funções.</p><p>Na vida real, também temos algo parecido. Imagine que você tenha que</p><p>fazer café. Automaticamente nós já realizamos todas as tarefas que estão en-</p><p>volvidas: colocar água para ferver, colocar o pó do café, esperar a água ferver</p><p>e despejar a água quente sobre o pó de café (essa é a maneira que eu faço café!)</p><p>Então todas as vezes que eu vou fazer café, mando essas informações</p><p>automaticamente para o meu cérebro. Em programação, é a mesma coisa: uma</p><p>função é um conjunto de instruções organizadas em bloco, que possuem um</p><p>nome e, quando for preciso, é chamada por meio deste.</p><p>As funções podem ser criadas pelos programadores ou podem estar in-</p><p>cluídas nas bibliotecas de uma determinada biblioteca — e é aqui que entra</p><p>o nosso segundo conceito: uma biblioteca de programação é um conjunto de</p><p>funções que já foram pré-definidas por outros programadores; você precisa</p><p>simplesmente adicionar a biblioteca ao seu programa e utilizar as funções.</p><p>Esse é o caso da função printf, presente na linha 4 do código apresentado</p><p>na Figura 1. Agora, vamos aprender mais sobre essa e outra função, que são</p><p>as funções básicas de entrada e saída na linguagem C.</p><p>Entrada e saída de dados30</p><p>ALGORITMOS E PROGRAMAÇÃO110</p><p>As funções printf() e scanf()</p><p>Um computador é uma máquina que faz uso de programas e dados para realizar</p><p>tarefas. Esses programas recebem esses dados, processam e entregam-nos</p><p>como resposta a algum tipo de problema. Os programas são compostos de</p><p>instruções que fazem esse processamento. Essas instruções podem ser funções</p><p>de entrada e de saída, e é sobre elas que iremos tratar.</p><p>Vale a pena ressaltar que estamos tratando da linguagem de programação</p><p>C, e essas funções sãos funções desta linguagem.</p><p>Para usar as funções scanf e printf, é preciso incluir a biblioteca stdio.h no código-fonte,</p><p>por meio da linha</p><p>#include <stdio.h></p><p>A função printf é a função de saída de dados no vídeo. Todas as funções</p><p>têm uma sintaxe, que é uma regra que mostra como ela deve ser usada e qual o</p><p>resultado esperado. A sintaxe de printf está representada na Figura 2, a seguir:</p><p>Figura 2. Sintaxe da função printf.</p><p>printf(”entrada de dados”);</p><p>aqui você digita o</p><p>texto que deseja</p><p>apresentar na tela.</p><p>31Entrada e saída de dados</p><p>111 Introdução à Programação em C UNIDADE 2</p><p>Entrada e Saída de Dados PARTE 3</p><p>Essa á a forma mais básica para utilizarmos essa função, quando queremos</p><p>simplesmente apresentar na tela uma mensagem de texto. Mas pode haver</p><p>situações em que queremos apresentar o valor de uma variável. Quando isso</p><p>for necessário, basta que, ao invés do texto, coloquemos somente a variável</p><p>sem as aspas.</p><p>Mas ainda pode existir a situação em que queremos apresentar um texto</p><p>e uma variável na mesma saída de dados. Para entendermos como isso pode</p><p>ser feito, vamos analisar o seguinte código, na Figura 3:</p><p>Figura 3. O uso de printf com código de formatação.</p><p>Esse código mostra o ano que a pessoa nasceu, usando, para isso, uma</p><p>variável que contém a idade da pessoa. Foram definidas 3 variáveis do tipo</p><p>inteiro: idade, anoAtual e anoNascimento.</p><p>As variáveis idade e anoAtual possuem valores iniciais, ou seja, não temos</p><p>uma entrada de dados por parte do usuário que executa o programa criado</p><p>com esse código-fonte. A variável anoNascimento é calculada usando-se dois</p><p>operadores: o de atribuição e o de subtração — esses operadores serão vistos</p><p>em capítulos posteriores.</p><p>Entrada e saída de dados32</p><p>ALGORITMOS E PROGRAMAÇÃO112</p><p>Nesse primeiro momento, vamos entender o que a linha 6 faz, conforme</p><p>representação na Figura 4:</p><p>Figura 4. Expressão usando operadores e uma variável.</p><p>Depos de realizar a operação, que �ca à</p><p>esquerda dessa expressão, o valor é</p><p>armazenado dentro da variável</p><p>anoNascimento</p><p>Essa operação subtrai</p><p>do valor 2018 o valor</p><p>armazenado na variável</p><p>idade</p><p>Com o valor armazenado na variável anoNascimento, falta realizarmos</p><p>a saída de dados, ou seja, escrever esse valor na tela. Isso é feito na linha 7,</p><p>utilizando-se a função printf, só que desta vez essa função é usada com um</p><p>código de formatação e a concatenação de uma variável.</p><p>Concatenar uma variável é unir variáveis e/ou textos na mesma saída de</p><p>dados, por exemplo. Para isso, adicionamos, ao final do texto que deverá</p><p>aparecer na tela, uma vírgula (,), seguida das variáveis. Cada variável que é</p><p>adicionada tem um tipo, e é preciso “avisar” ao printf que tipo é esse, para tal,</p><p>o C tem o conceito de códigos de formatação. Mas antes de entendermos o que</p><p>sãos os códigos de formatação, vamos à nossa função de entrada de dados.</p><p>Bom, agora vamos para a próxima função, a scanf. Da mesma forma que</p><p>a função printf é uma função que está em uma biblioteca padrão do C, scanf</p><p>também está; a diferença é que scanf é uma função de entrada de dados.</p><p>33Entrada e saída de dados</p><p>113 Introdução à Programação em C UNIDADE 2</p><p>Entrada e Saída de Dados PARTE 3</p><p>Vamos usar um exemplo de uso, apresentado na Figura 5, a seguir:</p><p>Figura 5. Código-fonte com o uso de printf e scanf.</p><p>Esse programa pede ao usuário que ele digite sua idade e o ano atual e,</p><p>com esses dados, ele calcula o ano do nascimento. Na linha 6, temos o uso da</p><p>função printf, que mostra na tela o texto, informando ao usuário a solicitação</p><p>do dado.</p><p>Em seguida, aparece o uso da função scanf. Quando o usuário digitar um</p><p>valor e teclar enter, a linha 7 pode ser traduzida para: “armazene na variável</p><p>idade o valor inteiro que foi digitado”. A sintaxe básica da função scanf é a</p><p>que está representada na Figura 6:</p><p>Figura 6. Sintaxe da função scanf.</p><p>O primeiro valor da função</p><p>scanf é o código de</p><p>formatação entre aspas</p><p>Já o segundo valor,</p><p>também chamado</p><p>de parâmetro, é a</p><p>variável, precidida</p><p>de &</p><p>Entrada e saída de dados3434</p><p>ALGORITMOS E PROGRAMAÇÃO114</p><p>Podemos, também, receber mais de um número no mesmo scanf, conforme</p><p>pode ser visto no exemplo da Figura 7, a seguir:</p><p>Figura 7. Código-fonte de um programa que soma dois valores, recebidos no mesmo scanf.</p><p>Códigos de formatação</p><p>Os códigos de formatação em C começam com % e permitem que as funções</p><p>de entrada (scanf) e saída (printf) expressem os tipos de dados armazenados</p><p>nas variáveis. Indicam o tipo do dado.</p><p>� %c: imprime o conteúdo da variável com representação ASCII.</p><p>� %d: imprime o conteúdo da variável com representação decimal com</p><p>sinal.</p><p>� %u: imprime o conteúdo da variável com representação decimal sem</p><p>sinal.</p><p>� %o: imprime o conteúdo da variável com representação octal sem sinal.</p><p>� %x: imprime o conteúdo da variável com representação hexadecimal</p><p>sem sinal.</p><p>� %f: imprime o conteúdo da variável com representação com ponto</p><p>decimal.</p><p>� %e: imprime o conteúdo da variável com representação em notação</p><p>científica (exponencial).</p><p>� %g: formato geral, escolhe a representação mais curta entre %f e %e.</p><p>Além desses códigos de formatação em C, nós temos as sequências de</p><p>escape que podem auxiliar para impressão de texto na tela de forma formatada.</p><p>Dentre elas, os mais usados são.</p><p>35Entrada e saída de dados</p><p>115 Introdução à Programação em C UNIDADE 2</p><p>Entrada e Saída de Dados PARTE 3</p><p>� \n: quebra de linha</p><p>� \t: realiza uma tabulação horizontal</p><p>� \b: adiciona um “backspace” ao texto</p><p>� \r: volta o cursor para o começo da linha sem mudar de linha</p><p>� \a: emite um sinal sonoro</p><p>� \”: quando você precisa, no seu texto, do uso de aspas duplas</p><p>� \’: quando você , no seu texto, do uso de aspas simples</p><p>� \\: quando você precisa, no seu texto, do uso de barra invertida</p><p>� \0: caractere nulo</p><p>No código da Figura 8, a seguir, você pode ver o uso de códigos de for-</p><p>matação e sequências de escape.</p><p>Figura 8. Uso de código de formatação, sequência de escape e funções de entrada e saída.</p><p>PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.</p><p>296p.</p><p>PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.</p><p>Leituras recomendadas</p><p>Entrada e saída de dados36</p><p>ALGORITMOS E PROGRAMAÇÃO116</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>2</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 4</p><p>Operadores</p><p>ALGORITMOS E PROGRAMAÇÃO118</p><p>Operadores</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Reconhecer o uso dos operadores de atribuição, aritméticos, rela-</p><p>cionais e lógicos.</p><p>� Construir expressões com vários operadores e precedência.</p><p>� Desenvolver expressões que utilizem operadores de pré e</p><p>pós-incremento/decremento.</p><p>Introdução</p><p>Os operadores são símbolos que são utilizados para escrevermos expres-</p><p>sões, as quais podem ser de atribuição, aritméticas, lógicas e relacionais.</p><p>Além de tipos diferentes, as expressões podem conter vários operadores,</p><p>o que implica entendermos qual a precedência entre estes.</p><p>Neste capítulo, você vai compreender como funcionam os operadores</p><p>e quais são eles em C. Além disso, você será apresentado aos conceitos</p><p>de incremento, como ele pode ser feito e seu papel importante na arte</p><p>da programação de computadores.</p><p>Operadores de atribuição, aritméticos,</p><p>relacionais e lógicos</p><p>Como foi visto anteriormente, uma variável é um espaço de memória de</p><p>um determinado tipo, que vai guardar um valor seja do tipo inteiro, real ou</p><p>caractere. Existe uma função predefinida em uma biblioteca padrão do C,</p><p>que nos permite guardar um valor digitado pelo usuário em uma variável</p><p>declarada, a função scanf.</p><p>Mas como podemos armazenar um valor em uma variável, sendo que</p><p>ele não foi digitado pelo usuário — como, por exemplo, no momento que</p><p>inicializamos uma variável? Observe a Figura 1.</p><p>119 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Figura 1. Código para exemplificar o operador de atribuição.</p><p>As linhas 3 e 4 mostram a declaração e inicialização de duas variáveis;</p><p>tomemos a linha 3 como exemplo. Essa linha pode ser traduzida como:</p><p>“armazeno o valor 34 dentro da variável idade”. Para realizar essa operação,</p><p>utilizamos o operando = (igual), de atribuição. A sintaxe de uso deste operando</p><p>em uma expressão de atribuição pode ser vista na Figura 2.</p><p>Figura 2. Sintaxe do operador de atribuição.</p><p>Esse valor armazenado pode ser um valor direto (como no exemplo), ou</p><p>uma expressão aritmética, lógica ou relacional.</p><p>Todas as operações aritméticas, já conhecidas da nossa matemática clássica,</p><p>podem ser usadas em programação. Cada linguagem de programação tem</p><p>seus operandos para representar essas operações — em alguns casos, são</p><p>os mesmos que já conhecemos em outros, existindo uma pequena diferença.</p><p>Operadores2</p><p>ALGORITMOS E PROGRAMAÇÃO120</p><p>Para exemplificar, vamos desenvolver um programa em C que realiza as</p><p>quatro operações básicas com dois números inteiros, conforme representado</p><p>na Figura 3.</p><p>Figura 3. Código de uma calculadora com as quatro operações aritméticas.</p><p>Ao executar esse programa e digitando os valores 5 e 2 para as variáveis</p><p>numero1 e numero2, respectivamente, teremos a seguinte resposta, na Figura 4:</p><p>Figura 4. Saída da calculadora com as quatro operações aritméticas.</p><p>3Operadores</p><p>121 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Um ponto interessante a se avaliar essa saída de dados é a resposta à</p><p>operação de divisão. Em C, ao se dividir dois números inteiros, o resultado</p><p>também é um número inteiro, mesmo que a resposta da divisão seja um número</p><p>real, como no caso de 5 dividido por 2. Assim, a resposta aparece truncada,</p><p>que quer dizer somente com a parte inteira.</p><p>Para resolvermos isso, podemos declarar as variáveis como do tipo float e</p><p>delimitar o número de casas decimais depois da vírgula. Isso pode ser visto,</p><p>a seguir, na Figura 5 e na Figura 6.</p><p>Figura 5. Código de uma calculadora com as quatro operações aritméticas usando o tipo</p><p>float.</p><p>Operadores4</p><p>ALGORITMOS E PROGRAMAÇÃO122</p><p>Figura 6. Saída da calculadora com as quatro operações aritméticas usando o tipo float.</p><p>Além disso, existe um operando que permite que se armazene o resto da</p><p>divisão, também chamado de operação módulo. Esta operação é realizada com</p><p>o operando % (por cento). Para exemplificarmos, vamos mostrar o resto da</p><p>divisão de um número digitado pelo usuário, por 2, conforme Figura 7. Como</p><p>sabemos, se o resto for 0, o número é par. Vamos ao código em C!</p><p>Figura 7. Uso do operador módulo.</p><p>5Operadores</p><p>123 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Como nós estamos utilizando a linguagem C, a seguir, você pode ver, na</p><p>Tabela 1, a operação aritmética</p><p>e o seu operando, bem como um exemplo de ex-</p><p>pressão de utilização em um programa de computador escrito na linguagem C.</p><p>Operação Operador Expressão</p><p>Soma + a= b+1;</p><p>Subtração - a= b-25 ;</p><p>Multiplicação * a= a*2 ;</p><p>Divisão / a=a/2 ;</p><p>Módulo % a= 4%2</p><p>Tabela 1. Operadores aritméticos.</p><p>Além dos operadores de atribuição e aritméticos, existem os operadores</p><p>lógico-relacionais. Os operadores relacionais (Tabela 2, a seguir) são utiliza-</p><p>dos quando se precisa comparar variáveis e/ou valores do mesmo tipo. Uma</p><p>operação relacional tem como resultado os valores lógicos verdadeiro ou falso.</p><p>Variáveis que podem ter somente dois tipos, como verdadeiro ou falso,</p><p>são conhecidas em programação como variáveis do tipo booleano. Booleano</p><p>vem da álgebra que usa esses valores, criada pelo matemático George Boole.</p><p>O detalhe é que, em C até o compilador de 1999, nós não tínhamos esse</p><p>tipo, sendo necessário que os programadores simulassem. Atualmente, basta</p><p>que seja adicionada a biblioteca stdbool.h. Vamos usar bastante os operadores</p><p>relacionais e o tipo bool que pode ter o valor 1 ou 0, quando estivermos uti-</p><p>lizando as estruturas de seleção. Por agora, vale a pena conhecer o operando</p><p>e a sua função.</p><p>Operadores6</p><p>ALGORITMOS E PROGRAMAÇÃO124</p><p>Para saber mais sobre o tipo bool e a biblioteca stdbool, acesse:</p><p>https://goo.gl/5g1xr2</p><p>Operador</p><p>relacional</p><p>Exemplo :</p><p>sejam a e b</p><p>duas variáveis</p><p>do mesmo</p><p>tipo, como,</p><p>por exemplo,</p><p>a = 10 e b =5</p><p>Descrição Resultado</p><p>== a == b Avalie se a</p><p>é igual b</p><p>0</p><p>> a > b Avalie se a é</p><p>maior que b</p><p>1</p><p>< a < b Avalie se a é</p><p>menor que b</p><p>0</p><p>>= a > = b Avalie se a</p><p>é maior ou</p><p>menor que b</p><p>1</p><p><= a <= b Avalie se a</p><p>é menor ou</p><p>igual a b</p><p>0</p><p>!= a ! = b Avalie se a é</p><p>diferente de b</p><p>1</p><p>Tabela 2. Operadores relacionais.</p><p>7Operadores</p><p>125 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Para mais detalhes da Álgebra Booleana, leia Scheinerman (2003), e o tipo bool em</p><p>C. Acesse:</p><p>https://goo.gl/3gSrrh</p><p>Por fim, temos os operadores lógicos que nos proporcionam escrever</p><p>expressões lógicas, as quais realizam funções lógicas, dentre as quais temos:</p><p>e, ou e não. Além de um operador lógico, também conhecido como conectivo,</p><p>uma expressão lógica é formada por duas proposições.</p><p>Uma proposição é uma afirmação que pode ser verdadeira ou falsa. Assim,</p><p>uma expressão lógica é formada pela conexão de duas ou mais proposições por</p><p>meio de um conector. Existe uma maneira de mapear todas as possibilidades</p><p>de valores dessas proposições, bem como o valor da expressão — essa forma</p><p>de mapeamento é denominada tabela-verdade.</p><p>Cada operador tem uma tabela-verdade. A seguir, você pode ver esse</p><p>mapeamento com os 3 operadores, bem como os símbolos que os representam:</p><p>e (&&), ou (||) e não (!). Vamos nomear uma das proposições de P e a outra</p><p>de T, e, neste primeiro momento, ter true(1) ou false(0) como valores dessas</p><p>proposições. Observe as Tabelas 3, 4 e 5.</p><p>P T P && T</p><p>True True True</p><p>True False False</p><p>False True False</p><p>False False False</p><p>Tabela 3. Tabela-verdade da operação E Lógico.</p><p>Operadores8</p><p>ALGORITMOS E PROGRAMAÇÃO126</p><p>P T P || T</p><p>True True True</p><p>True False True</p><p>False True True</p><p>False False False</p><p>Tabela 4. Tabela-verdade da operação Ou Lógico.</p><p>P ! P</p><p>True False</p><p>Fale True</p><p>Tabela 5. Tabela-verdade da operação Não Lógico.</p><p>Da mesma forma do caso das operações e expressões relacionais, vamos</p><p>usar bastante as tabelas-verdade e operadores lógicos quando estivermos</p><p>tratando das estruturas de seleção.</p><p>Como mencionado anteriormente, existe um tipo de variável em C que</p><p>representa o tipo booleano. Veja alguns detalhes, a seguir.</p><p>Para utilizá-la, é preciso a adição da biblioteca stdbool com a seguinte</p><p>linha de código: # include <stdbool.h></p><p>A declaração das variáveis é feita da seguinte forma: bool a.</p><p>A inicialização e atribuição podem ser feitas usando-se true/false ou 1/0.</p><p>Atribuir o valor verdadeiro para a variável a: a=true ; (a=1).</p><p>A resposta das operações lógicas será SEMPRE 0 e 1.</p><p>Para exemplificar, nas Figuras 8 e 9, segue um código-fonte e a execução</p><p>de um programa que mostra o uso dos operadores lógicos: E, Ou e Não.</p><p>9Operadores</p><p>127 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Figuras 8 e 9. Operadores lógicos.</p><p>Para finalizar, observe a Tabela 6, com operadores lógicos em C.</p><p>Operação Operador</p><p>E &&</p><p>Ou ||</p><p>Não !</p><p>Tabela 6. Operadores lógicos.</p><p>Assim podemos fazer uma tabela-resumo (Tabela 7) com todos os opera-</p><p>dores que foram vistos até agora:</p><p>Operadores10</p><p>ALGORITMOS E PROGRAMAÇÃO128</p><p>Tipo Operação Operador</p><p>Aritmético Multiplicação *</p><p>Aritmético Divisão /</p><p>Aritmético Soma +</p><p>Aritmético Subtração -</p><p>Aritmético Módulo %</p><p>Relacional Menor que <</p><p>Relacional Menor que ou igual a <=</p><p>Relacional Maior que ></p><p>Relacional Maior que ou igual a >=</p><p>Relacional Igual a ==</p><p>Relacional Diferente de !=</p><p>Lógico E &&</p><p>Lógico Ou ||</p><p>Lógico Não !</p><p>Tabela 7. Resumo de todos os operadores: aritméticos, relacionais e lógicos.</p><p>Expressões com vários operadores e</p><p>precedência</p><p>As expressões aritméticas, relacionais e lógicas podem ter vários operadores,</p><p>e, para isso, existe uma ordem de precedência entre os operadores do mesmo</p><p>tipo. A primeira regra e mais importante é: se existir, em uma expressão, uma</p><p>subexpressão dentro de um parênteses, essa expressão deve ser a primeira a ser</p><p>resolvida, ou seja, os parênteses, quando existentes, são sempre os primeiros</p><p>a serem resolvidos.</p><p>Antes de avaliarmos uma expressão com vários tipos de operadores, vamos</p><p>avaliar expressões com vários operadores, porém do mesmo tipo. Para isso,</p><p>vamos usar a ordem de precedência respeitada pelo compilador da linguagem</p><p>C. Entre esses operadores, começamos com os aritméticos. Observe a Tabela 8.</p><p>11Operadores</p><p>129 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Ordem de execução Operação Operador</p><p>1 Multiplicação *</p><p>2 Divisão /</p><p>3 Soma +</p><p>4 Subtração -</p><p>5 Módulo %</p><p>Tabela 8. Ordem de precedência dos operadores aritméticos.</p><p>O que isso quer dizer? Isso significa que, se em uma expressão existir</p><p>uma multiplicação, uma divisão e uma soma, a ordem deve ser a seguinte:</p><p>multiplicação, divisão e soma. Veja um exemplo na Figura 10.</p><p>Figura 10. Expressão com operadores aritméticos.</p><p>Nessa expressão, a multiplicação deve ser feita antes da subtração — basta</p><p>seguir a regra de precedência da tabela mostrada anteriormente. Da mesma</p><p>forma, existe uma ordem de precedência respeitada pelo compilador C, entre</p><p>os operadores relacionais. Essa ordem pode ser observada na Tabela 9, a seguir.</p><p>Operadores12</p><p>ALGORITMOS E PROGRAMAÇÃO130</p><p>Ordem de execução Operação Operador</p><p>1 Menor que <</p><p>2 Menor que ou igual a <=</p><p>3 Maior que ></p><p>4 Maior que ou igual a >=</p><p>5 Igual a ==</p><p>6 Diferente de !=</p><p>Tabela 9. Ordem de precedência dos operadores relacionais.</p><p>Vamos a um exemplo. Observe a Figura 11.</p><p>Figura 11. Expressão com operadores relacionais.</p><p>Nessa expressão, as operações relacionais de maior e menor de cada lado da</p><p>operação igual a devem ser feitas primeiro. Logo, em seguida, comparam-se</p><p>os valores obtidos entre essas operações e, dependendo do valor de a, b, c e</p><p>d, teremos um valor verdadeiro (true,1) ou falso (false,0).</p><p>13Operadores</p><p>131 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Para finalizar, temos a ordem de precedência dos nossos operadores lógicos.</p><p>Observe a Tabela 10.</p><p>Ordem de execução Operação Operador</p><p>1 E &&</p><p>2 Ou ||</p><p>3 Não !</p><p>Tabela 10. Ordem de precedência dos operadores lógicos.</p><p>Para exemplificar, vamos usar a seguinte expressão, conforme a Figura 12.</p><p>Figura 12. Expressão com operadores lógicos.</p><p>Seguindo as regras, a operação E é feita antes, para só em seguida a operação</p><p>Ou ser executada. Agora, vamos colocar todos os operadores — aritméticos,</p><p>relacionais e lógicos — em uma única tabela e reorganizar a ordem de pre-</p><p>cedência. Veja na Tabela 11.</p><p>Operadores14</p><p>ALGORITMOS E PROGRAMAÇÃO132</p><p>Ordem de execução Operação Operador</p><p>1 Multiplicação *</p><p>2 Divisão /</p><p>3 Soma +</p><p>4 Subtração -</p><p>5 Módulo %</p><p>6 Menor que <</p><p>7 Menor que ou igual a <=</p><p>8 Maior que ></p><p>9 Maior que ou igual a >=</p><p>10 Igual a ==</p><p>11 Diferente de !=</p><p>12 E &&</p><p>13 Ou ||</p><p>14 Não !</p><p>Tabela 11. Ordem de precedência de todos os operadores.</p><p>A ordem de precedência é a seguinte:</p><p>� As operações aritméticas são realizadas primeiramente.</p><p>� Em seguida, são realizadas as operações relacionais.</p><p>� O próximo passo é realizar operações lógicas, na seguinte ordem (ver</p><p>Figura 13).</p><p>Exemplificamos, descobrindo o valor da expressão: (y + z < x) OU (x>15)</p><p>E (y < 55), sendo x igual a 15, y igual a 70 e z igual a 5.</p><p>15Operadores</p><p>133 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Figura 13. Expressão com operadores aritméticos, rela-</p><p>cionais e lógicos.</p><p>� Primeiro, precisamos avaliar todas as operações que estão em parênteses.</p><p>� O primeiro passo é realizar a operação y+z, que é igual a 75.</p><p>� Agora, é preciso avaliar as operações relacionais.</p><p>■ (y+z<x) : (75<15), que é falso.</p><p>■ (x>15): (15>15), que é falso.</p><p>■ (y<55): (70<55) que é falso.</p><p>� Se colocarmos os valores lógicos na expressão inicial, temos:</p><p>■ (falso) ou (falso) e (falso)</p><p>� A operação e é realizada primeiro e, pela tabela-verdade, é possível ver</p><p>que, quando temos dois valores falsos, o resultado é falso.</p><p>� Assim, a expressão fica: falso ou falso, resultando em falso, e esse é o</p><p>valor final dessa expressão.</p><p>Uma dica para evitar confusão é definir as precedências usando parên-</p><p>teses. As expressões dentro dos parênteses mais internos são resolvidas</p><p>primeiramente.</p><p>Operadores de pré e pós-incremento/</p><p>decremento</p><p>Por fim e não menos importante, nós temos, neste capítulo, operadores de</p><p>incremento e decremento. Estas operações são utilizadas para acelerar o</p><p>processo de aumentar ou diminuir unidades de variáveis.</p><p>Operadores16</p><p>ALGORITMOS E PROGRAMAÇÃO134</p><p>O operador de incremento ++ adiciona a 1 a variável que utiliza esse</p><p>operador. Já o operador de decremento -- subtrai 1 da variável.</p><p>Essas operações podem ser feitas antes ou depois do uso da variável, ou seja,</p><p>um pré ou pós-incremento e um pré ou pós-decremento. No pré-incremento</p><p>(decremento), o valor será modificado na instrução que a variável está sendo</p><p>avaliada. Já, no caso de pós, o valor da variável será modificado na próxima</p><p>instrução.</p><p>Para exemplificarmos, temos o seguinte código e sua saída de execução.</p><p>Veja as Figuras 14 e 15.</p><p>Figura 14. Código-fonte para exemplificar o uso dos operadores de incremento e decre-</p><p>mento e suas formas de uso.</p><p>Figura 15. Saída da execução do código-fonte para exemplificar</p><p>o uso dos operadores de incremento e decremento e suas formas</p><p>de uso.</p><p>17Operadores</p><p>135 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>Uma das grandes utilidades dos operadores de incremento ou decremento</p><p>é no uso de variáveis contadoras. Imagine que você tenha que desenvolver</p><p>um sistema de fichas para uma central de atendimento. Os números de ficha</p><p>entregues para os usuários nada mais são do que valores que, a cada solicitação,</p><p>aumenta-se 1, ou seja, vamos contando de 1 em 1.</p><p>Vamos criar um programa que conte de 1 até 5 de duas formas: como a</p><p>operação de soma, usando o operador +, e com a operação de incremento,</p><p>usando o operador ++. Veja as duas formas nos códigos da Figura 16, a seguir.</p><p>Figura 16. Contadores: uso do incremento.</p><p>Os dois programas realizam a mesma tarefa: contam de 1 a 5 e mostram esta</p><p>contagem na tela. A diferença está na forma que isso pode ser feito. A forma</p><p>reduzida é bastante utilizada em programação, e outro detalhe interessante é</p><p>que podemos também incrementar valores diferentes de 1. Imagine contar de</p><p>1 a 10, somente os números pares. A seguir, na Figura 17, serão mostradas as</p><p>duas formas de se realizar essa tarefa: forma convencional e forma reduzida.</p><p>Operadores18</p><p>ALGORITMOS E PROGRAMAÇÃO136</p><p>Figura 17. Contadores: uso do incremento, para um contador de números pares.</p><p>BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://</p><p>en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018.</p><p>SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson Pio-</p><p>neira, 2003.</p><p>Leituras recomendadas</p><p>PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.</p><p>296p.</p><p>PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.</p><p>19Operadores</p><p>137 Introdução à Programação em C UNIDADE 2</p><p>Operadores PARTE 4</p><p>ANOTAÇÕES</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>2</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 5</p><p>Correção de erros,</p><p>Depuração e Documentação</p><p>ALGORITMOS E PROGRAMAÇÃO140</p><p>Correção de erros,</p><p>depuração e documentação</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Identificar erros léxicos, sintáticos e semânticos em C e aplicar estra-</p><p>tégias de correção.</p><p>� Conhecer o processo de depuração: estratégias e recursos do ambiente.</p><p>� Aplicar o processo de indentação de código e estratégias de docu-</p><p>mentação por comentários.</p><p>Introdução</p><p>A correção de erros passa a ser uma atividade de um desenvolvedor logo</p><p>que termina seu código e tenta compilá-lo ou interpretá-lo. Durante sua</p><p>vida de programador, você terá que procurar pelos erros de diferentes</p><p>naturezas, corrigi-los e documentar seu código para que todas as ta-</p><p>refas sejam realizadas de forma mais eficiente por você ou por outro</p><p>desenvolvedor.</p><p>Neste capítulo, você estudará os tipos de erros que existem, como</p><p>procurá-los por meio do uso de processo de depuração e estratégias para</p><p>documentar seu código, do mais simples ao mais complexo.</p><p>Erros léxicos, sintáticos e semânticos em C</p><p>e estratégias de correção</p><p>Durante o processo de desenvolvimento de um programa de computador, o</p><p>desenvolvedor pode encontrar alguns erros. Antes de entendermos o que é um</p><p>erro sintático, vamos a uma definição de sintaxe e semântica em linguagem</p><p>de programação.</p><p>141 Introdução à Programação em C UNIDADE 2</p><p>Correção de erros, Depuração e Documentação PARTE 5</p><p>Sintaxe é um conjunto de regras que define a forma de uma linguagem,</p><p>estabelecendo a composição de suas estruturas básicas (palavras). Em outras</p><p>palavras, sintaxe define as regras que precisam ser seguidas para se escrever</p><p>um programa em uma determinada linguagem.</p><p>Dentre essas regras, existem:</p><p>� Regras léxicas — que descrevem as combinações de caracteres possíveis</p><p>para formarmos palavras reservadas,</p><p>identificadores, operadores, etc.</p><p>� Regras sintáticas — que descrevem a maneira correta de se formar</p><p>instruções válidas (comandos, expressões, sub-rotinas, etc.).</p><p>Um erro sintático é ocasionado quando não seguimos uma regra sintática,</p><p>e o mesmo ocorre para um erro léxico. Em C, esses dois tipos de erros são</p><p>detectados quando vamos compilar o código-fonte, ou seja, não conseguimos</p><p>gerar o programa e precisamos voltar para a etapa de desenvolvimento para</p><p>a realização do processo de depuração do código.</p><p>Aqui, a título de simplificação de classificação, adotaremos o termo “erro</p><p>sintático” para os erros léxicos e sintáticos. São exemplos de erros sintáticos:</p><p>� deixar de colocar o ponto e vírgula (;) no fim de uma instrução;</p><p>� fazer uso de uma variável sem antes a ter declarado;</p><p>� trocar o operador relacional == pelo operador de atribuição;</p><p>� falta ou excesso de chaves { }.</p><p>Agora, para entendermos o terceiro tipo de erro, vamos primeiro ao conceito</p><p>de semântica. Responsável por descrever como as construções da linguagem</p><p>devem ser interpretadas e executadas, a semântica avalia a adequação do</p><p>uso de estruturas, comandos e instruções. Violar uma regra semântica não</p><p>impede que o programa seja executado, o problema é que ele não gerará o</p><p>que se espera dele.</p><p>A estrutura if-else em C, por exemplo, tem a seguinte sintaxe (Figura 1).</p><p>Figura 1. Sintaxe if-else.</p><p>Correção de erros, depuração e documentação2</p><p>ALGORITMOS E PROGRAMAÇÃO142</p><p>Sua semântica é: se o valor atual da expressão for verdadeiro, a instrução</p><p>incorporada será selecionada para execução.</p><p>Para exemplificar, vamos avaliar o código apresentado na Figura 2 e desco-</p><p>brir se existem erros sintáticos (sintático ou léxico) ou semânticos. O código-</p><p>-fonte foi feito pensando-se em, dadas duas notas, calcular a média aritmética</p><p>e mostrar aprovado, caso a média seja maior ou igual a 7, e reprovado, caso</p><p>contrário.</p><p>Figura 2. Análise de código procurando erros: sintáticos e semânticos.</p><p>Ao tentarmos compilar esse código, a mensagem demonstrada na Figura 3,</p><p>a seguir, aparece como saída.</p><p>Figura 3. Erro sintático.</p><p>Esse é um dos erros sintáticos, pois a variável média foi usada antes de ser</p><p>declarada. Para consertarmos, basta declararmos essa variável. Agora, com</p><p>3Correção de erros, depuração e documentação</p><p>143 Introdução à Programação em C UNIDADE 2</p><p>Correção de erros, Depuração e Documentação PARTE 5</p><p>a variável declarada, conseguimos rodar o programa, porém, para esse caso,</p><p>onde o aluno tem média acima de 7, aparece reprovado como saída. Isso é</p><p>conveniente? Não parece, não é mesmo?</p><p>O programa está escrito de forma correta, porém a lógica está trocada.</p><p>Nesse caso, temos um erro semântico. A maneira correta para esse programa</p><p>é a seguinte (Figura 4).</p><p>Figura 4. Correção de erros sintáticos e semânticos.</p><p>Depuração: estratégias e recursos do ambiente</p><p>Depuração ou debug é o processo de procurar erros no código-fonte e corrigi-</p><p>-los. Como mostrado na seção anterior, existem erros que impedem de o</p><p>código ser compilado e outros que não. O processo de depuração visa a atacar</p><p>os dois tipos de erros.</p><p>Correção de erros, depuração e documentação4</p><p>ALGORITMOS E PROGRAMAÇÃO144</p><p>Este processo pode ser feito por meio da utilização de um debugger, que</p><p>permite que o desenvolvedor veja o código sendo executado linha por linha</p><p>ou crie pontos de parada para avaliar o comportamento do seu código.</p><p>Nos ambientes integrados de programação, existem debugger no próprio</p><p>ambiente, permitindo que seu uso seja bastante amigável. São exemplos de</p><p>IDE: Dev-C++, Code::Blocks, Visual Studio e Eclipse. Já, se você não está</p><p>usando uma IDE, existe um debugger bastante difundido e que pode ser usado</p><p>tanto no ambiente Windows como no Linux: o gdg.</p><p>Para ter mais detalhes sobre a ferramenta de debug do Linux, o GDG, acesse:</p><p>https://goo.gl/GMVDhw</p><p>A diferença é que, caso você não esteja usando um ambiente integrado, a</p><p>depuração não será visual, mas em forma de texto. E esta é uma das estratégias</p><p>quando se fala em depurar: use a ferramenta correta.</p><p>Em todos os casos, os recursos de ambiente auxiliam, mas uma boa inves-</p><p>tigada no seu código pode ser o primeiro passo e, algumas vezes, a estratégia</p><p>mais rápida para encontrarmos um erro.</p><p>Outro detalhe é quando estamos procurando um erro em um código bastante</p><p>complexo e que talvez a melhor saída seja resolver o problema que o código</p><p>está buscando despachar de maneira mais simples. Se essa forma existe, por</p><p>que não fazê-la ao invés de ficar procurando erro em um código complexo?</p><p>Por falar da complexidade do código, outro detalhe que pode ajudar na</p><p>debug do código é codificar por meio da tática do baby steps, ou seja, pequenos</p><p>passos: tão logo o step tenha sido codificado, realiza-se testes simples.</p><p>Esses testes podem ser manuais, como: entrada de dados e/ou impressão de</p><p>valores de variáveis ao longo do seu código em lugares estratégicos. É muito</p><p>comum, logo que estamos aprendendo a programar, codificar praticamente</p><p>o programa inteiro.</p><p>Quanto maior a quantidade de erros, mais complicado fica para se fazer</p><p>uma correção. Em resumo, uma ótima estratégia é errar o quanto antes, em</p><p>pedaços menores do código, pois a correção torna-se mais acessível, e, ao</p><p>final, todo o código construído por partes já estará corrigido.</p><p>5Correção de erros, depuração e documentação</p><p>145 Introdução à Programação em C UNIDADE 2</p><p>Correção de erros, Depuração e Documentação PARTE 5</p><p>Em síntese, podemos listar as seguintes estratégias de debug:</p><p>� use a ferramenta correta;</p><p>� foque na resolução do problema;</p><p>� divida para conquistar, escreva pequenos trechos e faça testes;</p><p>� utilize saída de dados em lugares estratégicos para ver o comportamento</p><p>do seu programa.</p><p>Indentação de código e estratégias de</p><p>documentação por comentários</p><p>Para finalizarmos este capítulo, vamos falar de como podemos criar estra-</p><p>tégias para escrever um código mais organizado, ou seja, que fique legível e</p><p>contenha informações que auxiliem a sua leitura por qualquer desenvolvedor</p><p>que conheça a linguagem de programação utilizada.</p><p>A primeira ferramenta é realizar a indentação do código. Esse processo</p><p>consiste em alinhar os comandos, respeitando o nível de pertencimento entre</p><p>eles. Dessa forma, fica claro quando uma estrutura está contida na outra,</p><p>bem como onde ela começa e termina. Para se realizar a indentação, basta</p><p>inserimos espaços em branco à esquerda de cada instrução, utilizando a tecla</p><p>tab. Observe a Figura 5, a seguir.</p><p>Figura 5. Código com e sem indentação.</p><p>Correção de erros, depuração e documentação6</p><p>ALGORITMOS E PROGRAMAÇÃO146</p><p>Em C, a indentação não é obrigatória, mas certamente ajuda muito na leitura</p><p>do código e, quanto mais fácil de ler, mais rápido torna o processo de debug</p><p>manual. A seguir, na Figura 6, você pode ver alguns estilos de indentação</p><p>para todas as estruturas que vemos neste capítulo.</p><p>Figura 6. Estilos de indentação para estruturas bási-</p><p>cas: seleção e repetição.</p><p>Um detalhe importante é que podemos ter uma estrutura dentro de outra,</p><p>portanto a indentação será uma ferramenta muito importante para apoiar o</p><p>desenvolvimento de um código legível. Além da indentação, outra prática é</p><p>documentar o código, utilizando-se comentários ao longo do programa. Um</p><p>comentário é uma linha ou linhas existentes no código-fonte, mas que não</p><p>serão compiladas ou interpretadas.</p><p>7Correção de erros, depuração e documentação</p><p>147 Introdução à Programação em C UNIDADE 2</p><p>Correção de erros, Depuração e Documentação PARTE 5</p><p>Isso acontece porque existem marcadores, caracteres especiais, que sinali-</p><p>zam para</p><p>as ferramentas de compilação (interpretação) que o que está escrito</p><p>é um comentário e não um comando ou instrução. Existem comentários de</p><p>uma linha ou várias linhas.</p><p>Para comentários de uma linha, usamos // (barra barra). O que vier depois</p><p>dessas duas barras será o comentário. Como estamos falando de documentação</p><p>usando comentário, pode-se colocá-lo, por exemplo, logo no início para se ter</p><p>um cabeçalho de documentação. Veja a Figura 7.</p><p>Figura 7. Uso de comentário de uma linha para documentar código-fonte.</p><p>Já o comentário de mais de uma linha é feito utilizando-se /* comentario */.</p><p>Assim, pode-se realizar comentário de múltiplas linhas para documentar, por</p><p>exemplo, o que uma estrutura de repetição executará, ou mesmo, qual o pro-</p><p>blema que o código-fonte deseja resolver, conforme demonstrado na Figura 8.</p><p>Figura 8. Uso de comentário de múltiplas linhas para documentar código-fonte.</p><p>Correção de erros, depuração e documentação8</p><p>ALGORITMOS E PROGRAMAÇÃO148</p><p>Use comentários para documentar seu código, por exemplo, no início:</p><p>descrição do que o algoritmo faz, como utilizá-lo, o que as variáveis mais</p><p>importantes significam, as estruturas de dados e métodos especiais utilizados,</p><p>o autor e a data de escrita. Uma dica é, quando o código mudar, lembrar-se</p><p>de mudar o comentário também: comentário errado é pior que código sem</p><p>comentário.</p><p>GNU DEBUGGER. Wikipédia, Flórida, 2017. Disponível em: https://pt.wikipedia.org/</p><p>wiki/GNU_Debugger. Acesso em: 23 fev. 2017.</p><p>Leituras recomendadas</p><p>BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://</p><p>en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018.</p><p>MIZRAHI, V. V. Treinamento em Linguagem C: curso completo em um volume. 2. ed.</p><p>São Paulo: Pearson, 2008.</p><p>PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.</p><p>PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.</p><p>SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson</p><p>Pioneira, 2003.</p><p>Referência</p><p>9Correção de erros, depuração e documentação</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>2</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 6</p><p>Manipulação de Caracteres</p><p>ALGORITMOS E PROGRAMAÇÃO150 272 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Strings ou cadeias de caracteres, como nomes de pessoas, de objetos ou textos, são utiliza-</p><p>das na quase totalidade dos problemas. Na pseudolinguagem, string é um tipo de dado</p><p>simples. Em cada linguagem de programação, este tipo de dado tem uma implementação</p><p>diferente, com uma ou mais funções para sua manipulação.</p><p>Neste capítulo, são apresentadas algumas características específicas desse tipo de dado e são</p><p>apresentadas algumas funções para serem utilizadas com strings. Em seguida, é visto como</p><p>strings são definidas em Pascal e C e algumas das funções mais comumente usadas para</p><p>processá-las nessas linguagens.</p><p>10.1 formas de manipular strings</p><p>Uma string consiste de uma cadeia de caracteres. Uma variável do tipo string pode ser mani-</p><p>pulada de duas formas: como uma variável simples ou como um vetor de caracteres.</p><p>variável string manipulada como variável simples. A forma mais simples de tratar uma</p><p>variável do tipo string é como uma variável simples, sobre a qual podem ser realizadas as</p><p>operações básicas, como preenchimento por leitura, impressão de seu conteúdo, atribuição</p><p>de valores e testes. No exemplo a seguir, são declaradas duas variáveis do tipo string, con-</p><p>forme mostrado no Capítulo 2, uma delas (nome) com comprimento definido. Em seguida,</p><p>são realizadas algumas operações sobre elas:</p><p>Variáveis:</p><p>nome (string[20])</p><p>endereço (string)</p><p>(...)</p><p>ler(nome) {PREENCHE VARIÁVEL NOME POR LEITURA, MÁXIMO 20 CARACTERES}</p><p>ler(endereço) {LÊ O NÚMERO DE CARACTERES QUE FOR FORNECIDO}</p><p>se nome = 'João Dias'</p><p>então escrever(nome) {IMPRIME CONTEÚDO DA VARIÁVEL NOME}</p><p>variável string manipulada como vetor de caracteres. Outra forma de visualizar uma</p><p>string é como um vetor de caracteres, mesmo que tenha sido definida como uma variável sim-</p><p>ples. Essa forma permite que se tenha acesso a cada um dos caracteres da string da mesma</p><p>forma como é feito o acesso a elementos de um vetor. Na pseudolinguagem, considera-se</p><p>que os elementos desse vetor são sempre numerados a partir de 1, conforme mostrado na</p><p>Figura 10.1.</p><p>Considerando as mesmas declarações feitas antes e uma variável inteira i, os comandos a</p><p>seguir mostram essa forma de utilização:</p><p>i ← 1 {ÍNDICE DO PRIMEIRO CARACTERE DA VARIÁVEL STRING}</p><p>repita</p><p>se nome[i] = 'x'</p><p>Edelweiss_10.indd 272Edelweiss_10.indd 272 12/03/14 09:0112/03/14 09:01</p><p>151 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 273</p><p>então nome[i] ← 'z' {TROCA CARACTERES 'x' POR 'z'}</p><p>i ← i + 1 {AVANÇA PARA O PRÓXIMO CARACTERE DA STRING}</p><p>até i = 21 {ATÉ O FINAL DA VARIÁVEL STRING NOME}</p><p>escrever(nome) {IMPRIME CONTEÚDO DA VARIÁVEL NOME}</p><p>10.2 tamanho de variáveis do tipo string</p><p>Na declaração de uma variável do tipo string define-se seu tamanho máximo. Por exemplo,</p><p>nas declarações anteriores, a variável nome tem no máximo 20 caracteres, enquanto para</p><p>a variável endereço não é definido o tamanho. Nesse caso, é assumido o maior tamanho</p><p>adotado pela linguagem de programação utilizada, o qual geralmente é de 256 caracteres.</p><p>Entretanto, durante a execução de um programa, não necessariamente todo esse espaço</p><p>declarado estará ocupado. Para otimizar a utilização desse tipo de variáveis, as linguagens</p><p>de programação fornecem uma forma de conhecer seu tamanho efetivo, ou seja, o número</p><p>de suas posições ocupadas em um certo momento. Na pseudolinguagem, o comprimento</p><p>efetivo é fornecido pela função compr, com a sintaxe:</p><p>compr (<nome da variável string>)</p><p>O comando a seguir imprime o número de posições efetivamente ocupadas na variável nome</p><p>com tamanho de 20 caracteres:</p><p>escrever('Tamanho efetivo da variável nome: ', compr(nome))</p><p>O comprimento efetivo de uma variável do tipo string é controlado automaticamente pela</p><p>linguagem de programação utilizada. Entretanto, sempre que a variável for manipulada como</p><p>um vetor de caracteres e tiver seu tamanho efetivo alterado, o controle automático de seu</p><p>comprimento será perdido, devendo sua atualização ser feita pelo programador. Para isso, o</p><p>programador precisará saber onde é armazenado o valor do comprimento efetivo. Para não</p><p>vincular os algoritmos a uma determinada linguagem de programação, a pseudolinguagem</p><p>não define onde esse comprimento é armazenado, não sendo possível, portanto, alterar seu</p><p>valor. Considera-se, entretanto, que o controle automático é perdido sempre que a variável</p><p>for manipulada como vetor de caracteres e tiver alterado seu tamanho efetivo.</p><p>nome</p><p>1 2 3 4 5 6 7 8 9</p><p>J o ã o D i a s</p><p>10 11 12 13 14 15 18 19 201716</p><p>endereço</p><p>1 2 3 4 5 6 7 8 9</p><p>A n d r a d a s 2</p><p>10 11</p><p>5 …</p><p>12</p><p>figura 10.1 Variáveis simples string manipuladas como vetores de caracteres.</p><p>Edelweiss_10.indd 273Edelweiss_10.indd 273 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO152 274 Algoritmos e Programação com Exemplos em Pascal e C</p><p>10.3 exercícios de fixação</p><p>exercício 10.1 Função que conta as ocorrências de uma determinada string no interior de</p><p>outra string.</p><p>Função ContaStrings: inteiro</p><p>{DEVOLVE O NÚMERO DE OCORRÊNCIAS DE UMA STRING DENTRO DE OUTRA}</p><p>Parâmetros de entrada:</p><p>st1 (string) {STRING ONDE É FEITA A BUSCA}</p><p>st2 (string) {STRING ANALISADA}</p><p>Variáveis locais:</p><p>inds1, inds2 (inteiro) {ÍNDICES PARA PERCORRER STRINGS}</p><p>comps1, comps2 (inteiro) {COMPRIMENTO DAS STRINGS}</p><p>cont (inteiro) {CONTADOR</p><p>DE OCORRÊNCIAS}</p><p>inicomp (inteiro) {ÍNDICE DE ST1 ONDE INICIA UMA COMPARAÇÃO}</p><p>início</p><p>inds1 ← 1 {INICIALIZA ÍNDICES}</p><p>inds2 ← 1</p><p>comps1 ← compr(st1) {FUNÇÃO COMPR DEVOLVE COMPRIMENTO DAS STRINGS}</p><p>comps2 ← compr(st2)</p><p>cont ← 0 {INICIALIZA CONTADOR DE OCORRÊNCIAS}</p><p>enquanto comps1 ≥ comps2 faça</p><p>início</p><p>inicomp ← inds1 {GUARDA ONDE INICIA ESTA COMPARAÇÃO}</p><p>enquanto (st1[inds1] = st2[inds2]) e (inds2 ≤ comps2) faça</p><p>início</p><p>inds1 ← inds1+1 {AVANÇA ÍNDICES NAS 2 STRINGS}</p><p>inds2 ← inds2+1</p><p>fim</p><p>se inds2 > comps2 {ENCONTROU UMA OCORRÊNCIA DE ST2 EM ST1}</p><p>então início</p><p>cont ← cont + 1 {INCREMENTA CONTADOR DE OCORRÊNCIAS}</p><p>comps1 ← comps1 – comps2</p><p>{DIMINUI COMPRIMENTO DE ST1 PARA BUSCA}</p><p>inds2 ← 1</p><p>{POSICIONA NOVAMENTE NO PRIMEIRO CARACTERE DE ST2}</p><p>fim</p><p>senão início</p><p>inds1 ← inicomp + 1</p><p>inds2 ← 1</p><p>comps1 ← comps1 – 1</p><p>fim</p><p>Edelweiss_10.indd 274Edelweiss_10.indd 274 12/03/14 09:0112/03/14 09:01</p><p>153 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 275</p><p>fim</p><p>ContaStrings ← cont {DEVOLVE CONTAGEM}</p><p>fim {ContaStrings}</p><p>exercício 10.2 Dadas uma string que representa uma linha de um texto e duas substrings, as</p><p>duas de mesmo comprimento, comprimento esse menor do que o da linha, quer-se substituir</p><p>na linha todas as ocorrências da primeira substring pela segunda. Essa tarefa é executada por</p><p>um procedimento que recebe três parâmetros: a linha e as duas substrings. Supõe-se que</p><p>os testes que verificam e garantem a correção dos tamanhos das strings são feitos antes de</p><p>chamar esse procedimento.</p><p>Observar que o comprimento efetivo da linha não é alterado, pois as eventuais substituições</p><p>são feitas por substrings de igual comprimento.</p><p>Procedimento SubstituiSubstr</p><p>{NA LINHA REPRESENTADA PELO PRIMEIRO PARÂMETRO, O PROCEDIMENTO</p><p>SUBSTITUI TODAS AS OCORRÊNCIAS DO SEGUNDO PARÂMETRO PELO TERCEIRO}</p><p>Parâmetro de entrada e de saída:</p><p>linha (string) {LINHA ONDE SÃO FEITAS AS SUBSTITUIÇÕES}</p><p>Parâmetros de entrada:</p><p>sst1, sst2 (string)</p><p>{SUBSTRINGS – PRIMEIRA É SUBSTITUÍDA PELA SEGUNDA}</p><p>Variáveis locais:</p><p>complinha (inteiro) {COMPRIMENTO DA LINHA}</p><p>compsstr (inteiro) {COMPRIMENTO DAS SUBSTRINGS}</p><p>ilinha (inteiro) {ÍNDICE QUE PERCORRE A LINHA}</p><p>isst (inteiro) {ÍNDICE PARA PERCORRER AS SUBSTRINGS}</p><p>iaux (inteiro)</p><p>{ÍNDICE QUE PERCORRE A LINHA DURANTE UMA COMPARAÇÃO}</p><p>terminou (lógico) {INDICA FINAL DAS BUSCAS}</p><p>início</p><p>{INICIALIZAÇÕES}</p><p>complinha ← compr(linha) {COMPRIMENTO DA LINHA RECEBIDA}</p><p>compsstr ← compr(sst1)</p><p>{PODERIA SER O COMPR DE SST2, POIS SÃO IGUAIS}</p><p>ilinha ← 1 {POSICIONA ÍNDICE NO PRIMEIRO CARACTERE DA LINHA}</p><p>terminou ← falso {CONTROLA O FINAL DAS ANÁLISES}</p><p>repita</p><p>{PERCORRE LINHA ATÉ ENCONTRAR PRIMEIRO CARACTERE DE SST1:}</p><p>enquanto (linha[ilinha] ≠ sst1[1])</p><p>e (complinha-ilinha ≤ compsstr) faça</p><p>ilinha ← ilinha + 1</p><p>se ((complinha-ilinha) + 1) ≥ compsstr</p><p>Edelweiss_10.indd 275Edelweiss_10.indd 275 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO154 276 Algoritmos e Programação com Exemplos em Pascal e C</p><p>então início {ENCONTROU PRIMEIRA LETRA DA SUBSTRING NA LINHA}</p><p>{COMPARA CARACTERES DA LINHA COM OS DA SUBSTRING}</p><p>iaux ← ilinha {POSICIONA ÍNDICE AUXILIAR NA LINHA}</p><p>isst ← 1 {ÍNDICE QUE VAI PERCORRER SST1}</p><p>{COMPARA CARACTERES DE LINHA E SST1 ATÉ COMPRIMENTO DE</p><p>SST1}</p><p>enquanto (linha[iaux] = sst1[isst])</p><p>e (isst < compsstr) faça</p><p>início</p><p>iaux ← iaux + 1</p><p>isst ← isst + 1</p><p>fim</p><p>se (isst = compsstr) e (linha[iaux] = sst1[isst])</p><p>então {ENCONTROU SST1 EM LINHA E VAI SUBSTITUIR POR SST2}</p><p>para isst de 1 até compsstr faça</p><p>início</p><p>linha[ilinha] ← sst2[isst]</p><p>ilinha ← ilinha + 1</p><p>fim</p><p>senão ilinha ← ilinha + 1 {AVANÇA PARA PRÓXIMO EM LINHA}</p><p>fim {ENTÃO}</p><p>senão terminou ← verdadeiro</p><p>até terminou {REPITA}</p><p>fim {SubstituiSubstr}</p><p>exercício 10.3 Um palíndromo é uma palavra, frase ou qualquer outra sequência de carac-</p><p>teres que tenha a propriedade de ser igual se lida da direita para a esquerda ou da esquerda</p><p>para a direita. Exemplos de palavras palíndromas: OVO – AMA – REVIVER – RIR – REGER –</p><p>OSSO. Neste exercício é apresentada uma função lógica que verifica se uma string, passada</p><p>como parâmetro, é ou não palíndroma.</p><p>Função Palíndroma: lógico</p><p>{A FUNÇÃO DEVOLVE VERDADEIRO SE A STRING PASSADA COMO PARÂMETRO FOR</p><p>PALÍNDROMA}</p><p>Parâmetros de entrada:</p><p>palavra (string) {STRING A SER VERIFICADA}</p><p>Variáveis locais:</p><p>frente, atrás (inteiro) {ÍNDICES QUE PERCORREM A STRING}</p><p>dif (lógico) {INDICA SE ENCONTROU LETRA DIFERENTE}</p><p>início</p><p>frente ← 1 {POSICIONA ÍNDICES NO INÍCIO DA PALAVRA...}</p><p>atrás ← compr(palavra) {E NO FINAL DA PALAVRA}</p><p>dif ← falso {INICIALIZA DIF}</p><p>enquanto não dif e frente < atrás faça</p><p>se palavra[frente] ≠ palavra[atrás]</p><p>Edelweiss_10.indd 276Edelweiss_10.indd 276 12/03/14 09:0112/03/14 09:01</p><p>155 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 277</p><p>então dif ← verdadeiro</p><p>senão início</p><p>frente ← frente + 1 {AVANÇA FRENTE}</p><p>atrás ← atrás – 1 {RETROCEDE ATRÁS}</p><p>fim</p><p>se não dif</p><p>então Palíndroma ← verdadeiro</p><p>senão Palíndroma ← falso</p><p>fim {Palíndroma}</p><p>10.4 em Pascal</p><p>Em Pascal, originalmente strings eram vetores de caracteres. Nas versões atuais da linguagem,</p><p>string é um tipo de dado simples, mas que também pode ser trabalhado como um vetor de</p><p>caracteres.</p><p>10.4.1 declaração de strings</p><p>Uma string em Pascal é armazenada na forma de um vetor de caracteres de 256 posições,</p><p>indexadas de 0 a 255. Esse vetor compreende posições para armazenamento dos caracteres,</p><p>nas posições de índices de 1 a 255, mais a posição zero, em que fica armazenado o número</p><p>de posições efetivamente ocupadas a cada momento. Na posição zero é armazenado um ca-</p><p>ractere cujo número de posição na tabela ASCII é igual ao número de caracteres efetivamente</p><p>ocupados pela string no vetor (Figura 10.2).</p><p>O tamanho máximo de uma variável do tipo string é definido em sua declaração: se, na</p><p>declaração, só aparecer a palavra string, seu tamanho máximo é 255 caracteres; se, na de-</p><p>claração da variável, aparecer após a palavra string um número entre colchetes (com valor</p><p>1 2 3 4 5 6 7 8 9</p><p>St Nome</p><p>100</p><p>Nome da variável string</p><p>Posição que armazena o comprimento</p><p>efetivo da string</p><p>Espaço para armazenamento da string</p><p>figura 10.2 Estrutura de uma string de 10 caracteres em Pascal.</p><p>Edelweiss_10.indd 277Edelweiss_10.indd 277 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO156 278 Algoritmos e Programação com Exemplos em Pascal e C</p><p>entre 1 e 255), esse passa a ser seu tamanho máximo. Em ambos os casos, a variável pode ser</p><p>manipulada como um vetor de caracteres.</p><p>No exemplo a seguir, sejam as declarações</p><p>das variáveis texto e nome, ambas do tipo string.</p><p>Texto tem o tamanho padrão, 256, e nome tem tamanho 37, embora, para todos os efeitos</p><p>práticos, sob o ponto de vista do usuário, o tamanho máximo no primeiro caso seja de 255</p><p>caracteres e, no segundo, de 36, ficando a posição de índice zero reservada para o tamanho</p><p>da string:</p><p>var</p><p>texto: string;</p><p>nome: string[36];</p><p>10.4.2 comprimento efetivo de strings</p><p>Em Pascal o comprimento efetivo de uma string é fornecido pela função length, cuja sintaxe</p><p>é:</p><p>length (<var_str>)</p><p>onde <var_str> é o nome de uma variável ou constante do tipo string. A saída dessa</p><p>função é um valor inteiro igual ao número de posições efetivamente ocupadas da string, não</p><p>incluída a posição que armazena o seu comprimento efetivo.</p><p>Considerando a variável string nome, a linha a seguir apresenta na tela o seu tamanho efetivo:</p><p>writeln('Tamanho efetivo da variavel nome: ', length(nome))</p><p>A alteração do comprimento efetivo de uma string pode acontecer de três maneiras, apresen-</p><p>tadas a seguir.</p><p>atribuição de uma cadeia de caracteres à string. Nesse caso, o sistema atualiza auto-</p><p>maticamente a posição zero da mesma:</p><p>nome := 'Maria'</p><p>Após esse comando, o tamanho de nome, se consultado, será 5.</p><p>manipulação da string como um vetor de caracteres. Ao manipular uma string como</p><p>uma cadeia de caracteres, o controle do seu comprimento passa a ser de responsabilidade</p><p>do usuário. Se o número de posições ocupadas na string mudar, cabe a ele acertar o valor na</p><p>posição de índice zero.</p><p>No exemplo a seguir, a variável string linha deve ser preenchida com um número de asteris-</p><p>cos igual ao valor contido na variável num. As seguintes declarações foram feitas previamente</p><p>ao trecho que preenche linha com asteriscos:</p><p>const</p><p>MAX = 80;</p><p>type</p><p>Edelweiss_10.indd 278Edelweiss_10.indd 278 12/03/14 09:0112/03/14 09:01</p><p>157 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 279</p><p>cadeia = string[MAX];</p><p>var</p><p>linha : cadeia;</p><p>i, num : integer;</p><p>Na sequência está o trecho que preenche linha e ajusta sua posição zero com seu novo ta-</p><p>manho:</p><p>for i := 1 to num do</p><p>linha[I] := '*';</p><p>linha[0] := chr(num); {AJUSTE DA POSICAO ZERO DA STRING}</p><p>utilização dos procedimentos insert e delete. Os procedimentos insert e delete</p><p>permitem aumentar ou reduzir o tamanho de uma variável string, enquanto ajustam automa-</p><p>ticamente o seu comprimento.</p><p>10.4.3 procedimentos para alteração de strings</p><p>Pascal possui dois procedimentos, insert e delete, que permitem aumentar ou reduzir,</p><p>respectivamente, o tamanho de uma variável string e ajustar automaticamente o seu com-</p><p>primento.</p><p>■ INSERT</p><p>Este procedimento permite inserir caracteres em uma string. A sintaxe da chamada a esse</p><p>procedimento é:</p><p>insert (<insertStr>, <targetStr>, <pos>)</p><p>onde <targetStr> (uma variável string) é a string que sofrerá a inserção, ou a string-alvo,</p><p><insertStr> (uma expressão string) é a substring com os caracteres a inserir e <pos> (uma</p><p>expressão inteira) corresponde à posição a partir da qual deverá ocorrer a inserção na string-</p><p>-alvo. Esse procedimento atualiza o tamanho da string-alvo. A string-alvo alterada é devolvida</p><p>por meio do segundo parâmetro. Se, como resultado da execução do insert, a string-alvo</p><p>resultar maior que 255 caracteres, os caracteres excedentes serão perdidos.</p><p>Seja a seguinte declaração:</p><p>var</p><p>estado: string;</p><p>e os seguintes comandos:</p><p>estado := 'Estado do Rio Grande';</p><p>insert(' do Sul', estado, 21);</p><p>estado := 'Estado do Sul';</p><p>insert(' Rio Grande do', estado, 9);</p><p>Edelweiss_10.indd 279Edelweiss_10.indd 279 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO158 280 Algoritmos e Programação com Exemplos em Pascal e C</p><p>estado resultará, após o insert, com o texto: “Estado do Rio Grande do Sul” e, como esse</p><p>texto possui 27 caracteres, na posição zero da string estará o caractere de posição 27 na</p><p>tabela ASCII.</p><p>■ DELETE</p><p>Este procedimento elimina um determinado número de caracteres de uma string, a partir de</p><p>uma certa posição. A sintaxe de sua chamada é:</p><p>delete (<targetStr>, <pos>, <numChars>)</p><p>onde <targetStr> (uma variável string) é a string-alvo, ou seja, a string da qual serão elimi-</p><p>nados caracteres; <pos> (uma expressão inteira) é a posição a partir da qual deverá ocorrer a</p><p>eliminação de caracteres na string-alvo; e <numChars> (uma expressão inteira) é o número de</p><p>caracteres a eliminar. Ao final da execução desse procedimento, os caracteres definidos terão</p><p>sido removidos da string-alvo. O procedimento ajusta o tamanho da string-alvo.</p><p>Considerando a mesma variável utilizada para exemplificar o procedimento insert, nos</p><p>exemplos a seguir primeiro eliminam-se os 10 primeiros caracteres que nela estão:</p><p>delete(Estado, 1, 10); {DEIXA O TEXTO 'Rio Grande do Sul' NA STRING}</p><p>A chamada ao procedimento delete a seguir elimina o que está após Rio Grande. Observar</p><p>o uso da função length(estado) para definir o número de caracteres a eliminar, da posição</p><p>11 até o final:</p><p>delete(estado, 11, length(estado));</p><p>No trecho a seguir, a variável hino é alterada usando insert e delete. Inicialmente, o trecho</p><p>“Ouviram do Ipiranga” é inserido com insert na variável hino, a partir da primeira posição.</p><p>Como resultado, o comprimento de hino passa a ser 19. Em seguida, é inserido em hino,</p><p>também com insert, o trecho “ as margens placidas”, a partir da posição 20. A variável hino</p><p>passa a conter o trecho “Ouviram do Ipiranga as margens placidas” e seu tamanho passa a</p><p>ser 39. Finalmente, com o procedimento delete, três posições, a partir da posição 21, são</p><p>retiradas do conteúdo da variável hino, resultando seu tamanho em 36:</p><p>insert ('Ouviram do Ipiranga', hino, 1);</p><p>writeln(hino, ' ', length(hino));</p><p>insert (' as margens placidas', hino, 20);</p><p>writeln(hino, ' ', length(hino));</p><p>delete (hino , 21, 3);</p><p>writeln(hino, ' ', length(hino));</p><p>Na tela, a execução do trecho produzirá:</p><p>Ouviram do Ipiranga 19</p><p>Ouviram do Ipiranga as margens placidas 39</p><p>Ouviram do Ipiranga margens placidas 36</p><p>Edelweiss_10.indd 280Edelweiss_10.indd 280 12/03/14 09:0112/03/14 09:01</p><p>159 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 281</p><p>10.4.4 comparação entre strings</p><p>A comparação entre strings é feita caractere a caractere, a partir do início, considerando o</p><p>valor dos caracteres no código ASCII, em que as letras maiúsculas vêm antes das letras mi-</p><p>núsculas e os dígitos de 0 a 9 antes dos dois tipos de letras. No if a seguir, o conteúdo das</p><p>variáveis string nome_entrada e nome_compara deve coincidir, caractere a caractere, para que</p><p>o teste resulte verdadeiro. Se um único caractere for diferente na mesma posição das duas</p><p>strings, ainda que esse caractere seja o de um espaço, o teste resultará falso:</p><p>if nome_entrada = nome_compara</p><p>then {...}</p><p>Nos itens alfabéticos, a mesma sequência de letras pode ser reconhecida como diferente se</p><p>não for totalmente coincidente na questão de maiúsculas e minúsculas.</p><p>10.4.5 procedimentos para conversão de tipos</p><p>Pascal possui dois procedimentos para conversão de tipos que envolvem strings: str, que</p><p>converte de numérico para string, e val, que converte de string para numérico.</p><p>■ STR</p><p>Este procedimento recebe um valor numérico e devolve a string correspondente. A sintaxe de</p><p>sua chamada é:</p><p>str(<inNum>, <strVal>)</p><p>onde <inNum> (expressão inteira ou real) é o valor numérico recebido e <strVal> (variável</p><p>do tipo string) é a string equivalente, resultante da execução do procedimento.</p><p>Sejam as seguintes declarações:</p><p>numeroForm: real;</p><p>stringNum: string[10];</p><p>Após os comandos:</p><p>numeroForm := 1025.169;</p><p>str(numeroForm:10:2,</p><p>stringNum);</p><p>stringNum conterá a string correspondente ao valor 1025.17.</p><p>■ VAL</p><p>Este procedimento recebe uma string supostamente numérica e tenta convertê-la para o seu</p><p>valor numérico correspondente. Um de seus parâmetros é uma variável que devolve o resul-</p><p>tado da tentativa de conversão: 0, se bem-sucedida, ou um valor numérico correspondente à</p><p>posição do primeiro caractere não numérico encontrado se mal-sucedida.</p><p>Edelweiss_10.indd 281Edelweiss_10.indd 281 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO160 282 Algoritmos e Programação com Exemplos em Pascal e C</p><p>A sintaxe de sua chamada é:</p><p>val(<inStr>, <numVar>, <codeVar>)</p><p>onde <inStr> (expressão string) é a string a ser convertida, <numVar> (variável do tipo</p><p>inteiro ou real) é onde deve ser armazenado o valor numérico resultante da conversão e</p><p><codeVar> (variável inteira) devolve o resultado da tentativa de conversão.</p><p>Sejam as declarações de variáveis:</p><p>numeroConv: real;</p><p>codigo: integer;</p><p>stringNumerica: string[6];</p><p>e os comandos:</p><p>numeroConv:= 0;</p><p>val(stringNumerica, numeroConv, codigo);</p><p>if codigo > 0</p><p>then writeln('Codigo: ', codigo)</p><p>else writeln(numeroConv:8:2);</p><p>Após a execução do procedimento val, o resultado da tentativa de conversão é testado e, se</p><p>ela foi bem-sucedida, o valor de NumeroConv é apresentado.</p><p>10.4.6 mais funções de manipulação de strings</p><p>Algumas funções adicionais de manipulação de strings disponíveis em Pascal são discutidas a</p><p>seguir: concat, copy, pos e upcase.</p><p>■ CONCAT</p><p>A função concat concatena strings, ou seja, produz uma nova string formada pela conca-</p><p>tenação de todas as strings que lhe são fornecidas como parâmetros, na ordem em que são</p><p>fornecidas. A sintaxe da chamada da função concat é:</p><p>concat (<string1>, <string2>, ..., <stringn>)</p><p>onde <string1> a <stringn> podem ser expressões string.</p><p>Por exemplo, a concatenação das variáveis string titulo, primeiroNome e sobrenome, com o</p><p>resultado colocado em nomeCompletoComTitulo, é feita da seguinte maneira:</p><p>nomeCompletoComTitulo := concat(titulo, primeiroNome, sobrenome);</p><p>Observar que a linha anterior produzirá o mesmo resultado que a linha seguinte:</p><p>nomeCompletoComTitulo := titulo + primeiroNome + sobrenome;</p><p>uma vez que a adição de strings também faz a concatenação como a função concat.</p><p>Edelweiss_10.indd 282Edelweiss_10.indd 282 12/03/14 09:0112/03/14 09:01</p><p>161 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 283</p><p>■ COPY</p><p>A função copy copia um trecho de uma string, devolvendo o trecho copiado como uma</p><p>string. A sintaxe de sua chamada é:</p><p>copy (<inStr>, <pos>, <numChars>)</p><p>onde <inStr> (expressão string) é a string de entrada, <pos> (expressão inteira) é a posição</p><p>a partir da qual a substring produzida pelo copy deve começar a ser extraída e <numChars></p><p>(expressão inteira) é o número de caracteres que devem ser extraídos de inStr. Se um nú-</p><p>mero de caracteres superior ao existente é indicado para a operação, apenas os caracteres</p><p>existentes são devolvidos.</p><p>Seja a variável linha (string[80]), cujas primeiras 44 posições (há espaços após a palavra</p><p>Gerente) apresentam o conteúdo a seguir,</p><p>0023Maria Souza Gerente</p><p>e as variáveis nome e cargo (ambas string[20]). A cópia de 20 posições de linha, iniciando</p><p>no M de Maria, e de mais outras 20 posições, iniciando no G de Gerente, respectivamente</p><p>para as variáveis nome e cargo, pode ser feita pelas atribuições:</p><p>nome:= copy(linha, 5, 20);</p><p>cargo := copy(linha, 25, 20);</p><p>■ POS</p><p>Função que devolve um valor inteiro, correspondente à posição em que inicia a primeira</p><p>ocorrência de uma string que se supõe seja substring de outra. A sintaxe de sua chamada é:</p><p>pos(<subStr>, <targetStr>)</p><p>onde <subStr> é a substring a localizar e <targetStr> é a string pesquisada. Se a substring</p><p>for encontrada, o valor devolvido pela função é a posição inicial da substring, caso contrário,</p><p>é 0.</p><p>O exemplo a seguir procura, na variável string cargo do exemplo anterior, a substring geren-</p><p>te e, se encontrar, executa algum processamento:</p><p>if (pos('Gerente', cargo) > 0</p><p>then { processa dados de um gerente da empresa}</p><p>■ UPCASE</p><p>Função que converte um caractere que representa uma letra minúscula para a representação</p><p>da letra maiúscula correspondente. Se a letra já for maiúscula, ou se o caractere informado</p><p>não for letra, a função nada faz. A sintaxe da chamada dessa função é:</p><p>upcase (<inChar>)</p><p>onde <inChar> é uma expressão do tipo caractere.</p><p>Edelweiss_10.indd 283Edelweiss_10.indd 283 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO162 284 Algoritmos e Programação com Exemplos em Pascal e C</p><p>No trecho a seguir, upcase recebe como parâmetro uma variável do tipo caractere chama-</p><p>da continuar:</p><p>if (upcase(continuar) = 'S')</p><p>then {segue processando}</p><p>10.5 em C</p><p>Em C, cadeias de caracteres ou strings não são um tipo básico de dado. Strings são vetores de</p><p>caracteres que contêm, como último caractere válido, o caractere “\0”. Esse caractere, cujo</p><p>valor é zero em binário, serve para sinalizar o fim das strings.</p><p>10.5.1 declaração de strings</p><p>O número de posições de um vetor de caracteres que armazene uma string deve sempre ser</p><p>igual ao número máximo de caracteres que se pretende armazenar nele, incrementado de</p><p>uma unidade para armazenar o caractere terminador “\0”.</p><p>Por exemplo, se a string nome_do_atleta deve armazenar nomes de até 30 caracteres, ela</p><p>deve ser declarada com tamanho 31:</p><p>#define TAMAX 31</p><p>char nome_do_atleta [TAMAX];</p><p>10.5.2 tamanho de strings</p><p>O tamanho declarado de um vetor de caracteres define o número máximo de caracteres que</p><p>ele pode armazenar. Entretanto, quando uma string é armazenada em um vetor de carac-</p><p>teres, apenas as posições ocupadas pela string interessam para o processamento, ou seja,</p><p>o tamanho real da string. Pode-se descobrir esse tamanho utilizando a função strlen (ver</p><p>Seção 10.5.6) ou contando as posições do vetor de caracteres que vão do início até o primeiro</p><p>“\0”. O for a seguir percorre o vetor ch2 até que um “\0” seja encontrado na posição ch2[i]</p><p>e a condição do for resulte falsa. A cada execução do for, o índice i é incrementado, assim</p><p>como o contador de caracteres cont. Logo, ao terminar a execução do for, o conteúdo de</p><p>cont será o tamanho da string:</p><p>for (i = 0, cont = 0; ch2[i]; i++, cont++);</p><p>10.5.3 declaração com inicialização de strings</p><p>Há três formas de declarar e ao mesmo tempo inicializar um vetor de caracteres com uma</p><p>string, acrescentando ao seu final o caractere terminador “\0”.</p><p>a Declaração com tamanho explícito e inicialização com texto. Por exemplo:</p><p>char estado[20] = "Rio Grande do Sul";</p><p>Edelweiss_10.indd 284Edelweiss_10.indd 284 12/03/14 09:0112/03/14 09:01</p><p>163 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 285</p><p>O vetor de caracteres estado, com tamanho máximo de 20 caracteres, é preenchido da posi-</p><p>ção 0 em diante com os caracteres do texto entre aspas duplas mais o caractere “\0” ao final.</p><p>b Declaração com tamanho explícito e inicialização com caracteres:</p><p>char estado[20] = {'P', 'i', 'a', 'u', 'i'};</p><p>O vetor de caracteres estado é preenchido da posição 0 em diante com os caracteres entre</p><p>chaves. Quaisquer posições não ocupadas do vetor, ao final do mesmo, são preenchidas com</p><p>o valor binário zero, ou seja, com o caractere “\0”.</p><p>c Declaração com tamanho implícito e inicialização com texto:</p><p>char estado[ ] = "Parana";</p><p>O sistema primeiro conta os caracteres entre aspas duplas e cria um vetor de caracteres com</p><p>tamanho igual a esse número mais um para colocar o caractere “\0”. Depois armazena nesse</p><p>vetor o texto entre</p><p>aspas duplas. No exemplo supracitado, o número de caracteres do vetor</p><p>estado será 7 (com o “\0”).</p><p>10.5.4 leitura de strings – função scanf</p><p>A função scanf pode ser usada para ler strings, com o nome da variável vetor de caracteres</p><p>escrito sem o caractere “&” na frente. Quanto ao formato, há duas possibilidades, uma usan-</p><p>do “%s” e outra usando “%[^\n]”. Por exemplo:</p><p>scanf("%s", estado);</p><p>scanf("%[^\n]", estado);</p><p>Quando “%s” for usado, se houver um espaço em branco no texto sendo lido, a leitura parará</p><p>ao encontrá-lo. Se “%[^\n]” for usado, a leitura do texto parará somente quando uma marca</p><p>de fim de linha (“\n”) for encontrada.</p><p>Para ler apenas o número de caracteres da string, basta acrescentar o tamanho da string antes</p><p>do símbolo “[”:</p><p>scanf("%20[^\n]", estado);</p><p>10.5.5 escrita de strings</p><p>Pelo menos duas funções podem ser usadas para escrever strings como uma unidade: printf</p><p>(ver Capítulo 3) e puts.</p><p>Função printf</p><p>Permite escrever o conteúdo de variáveis do tipo string com o formato “%s”. Exemplo:</p><p>printf("\nNome do estado: %s\n", estado);</p><p>Edelweiss_10.indd 285Edelweiss_10.indd 285 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO164 286 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Função puts</p><p>Esta função é utilizada exclusivamente para apresentação de strings e, após apresentar o con-</p><p>teúdo de uma variável ou constante string, para forçar uma mudança automática de linha. A</p><p>sintaxe de sua chamada é:</p><p>puts (<string>);</p><p>Exemplo de utilização de puts:</p><p>puts (estado);</p><p>Esse exemplo de uso de puts é equivalente a usar printf("%s\n", estado).</p><p>10.5.6 comparação entre strings e outras operações com uso da</p><p>biblioteca string.h</p><p>Em C não há operadores que permitam manipular strings inteiras de uma só vez. Portanto,</p><p>não é possível comparar diretamente duas strings ou atribuir uma string à outra, para mencio-</p><p>nar apenas duas operações comumente realizadas com outros tipos de dados. Essas e outras</p><p>operações envolvendo strings devem ser executadas operando-se sobre os vetores de caracte-</p><p>res das strings, seja com código desenvolvido sob medida para tal, seja valendo-se de funções</p><p>preexistentes para tratamento de strings, como as da biblioteca string.h.</p><p>Quando for desenvolvido código específico para operar sobre strings, lembrar que as strings,</p><p>sendo vetores de caracteres, podem ser acessadas usando ponteiros (ver Capítulo 14). No</p><p>trecho a seguir, temos a apresentação de uma string na tela na ordem inversa à da sua leitura.</p><p>No trecho a seguir, são utilizadas as variáveis comprimento (inteiro), linha (vetor de caracte-</p><p>res de 100 posições) e ptr (ponteiro para caractere):</p><p>comprimento = strlen(linha) – 1; // em comprimento vai o indice maximo</p><p>ptr = &linha[comprimento]; // ptr eh inicializado com o endereco limite</p><p>while (ptr >= linha) //enquanto endereco em ptr >= endereco inicial de</p><p>linha</p><p>putchar (*ptr--); // escreve conteudo da posicao apontada por ptr</p><p>// e decrementa ptr</p><p>■ funções de string da biblioteca string.h</p><p>As funções de string detalhadas a seguir integram a biblioteca string.h. Portanto, nos pro-</p><p>gramas que utilizam essas funções deve constar sempre o #include <string.h>.</p><p>■ função strcpy</p><p>A função strcpy copia uma string para outra string. A sintaxe de sua chamada é:</p><p>strcpy(<string_destino>, <string_origem>);</p><p>Edelweiss_10.indd 286Edelweiss_10.indd 286 12/03/14 09:0112/03/14 09:01</p><p>165 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 287</p><p>A <string_origem> é copiada para a <string_destino>. Deve-se declarar a</p><p><string_destino> com tamanho suficiente para que a cópia aconteça sem problemas, caso</p><p>contrário áreas de memória não previstas serão invadidas, gerando erros difíceis de detectar.</p><p>#include <string.h></p><p>(...)</p><p>char origem [10], destino[10];</p><p>// cópia da string</p><p>strcpy(destino, origem);</p><p>■ função strcat</p><p>A função strcat concatena strings. A sintaxe de sua chamada é:</p><p>strcat(<string_destino>, <string_origem>);</p><p>A <string_origem>, sem alteração, é anexada ao final da <string_destino>. Deve-se</p><p>declarar a <string_destino> com tamanho suficiente para que a concatenação aconteça</p><p>sem problemas, sem invasão indevida de áreas de memória.</p><p>#include <string.h></p><p>(...)</p><p>char origem[20], destino[40];</p><p>// leitura da string</p><p>strcat(destino, origem);</p><p>■ função strlen</p><p>A função strlen devolve um valor numérico que é o tamanho de uma string, ou seja, o</p><p>número de caracteres da string, sem contar o terminador “\0”. A sintaxe de sua chamada é:</p><p>strlen(<nome_string>);</p><p>Exemplo de utilização da função strlen:</p><p>#include <string.h></p><p>char primeiro[40];</p><p>//leitura da string</p><p>printf("\n%s tem comprimento %d\n", primeiro, strlen(primeiro) );</p><p>■ função strcmp</p><p>A função strcmp compara duas strings. A sintaxe de sua chamada é:</p><p>strcmp(<s1>, <s2>);</p><p>As duas strings <s1> e <s2> são comparadas, caractere a caractere, com base na posição dos</p><p>caracteres na tabela ASCII. Resultados possíveis dessa função:</p><p>Edelweiss_10.indd 287Edelweiss_10.indd 287 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO166 288 Algoritmos e Programação com Exemplos em Pascal e C</p><p>■ se s1 e s2 forem iguais, devolve zero;</p><p>■ se s1 for maior que s2, devolve um valor maior do que zero;</p><p>■ se s1 for menor que s2, devolve um valor menor do que zero.</p><p>Considerar a seguinte declaração das variáveis string primeiro e segundo:</p><p>#include <string.h></p><p>char primeiro[40], segundo[40] = "Maria";</p><p>A variável primeiro recebe informação do usuário (conforme trecho a seguir) e a variável</p><p>segundo é inicializada na declaração:</p><p>fgets (primeiro, sizeof(primeiro), stdin);</p><p>if (primeiro[strlen(primeiro) – 1] == '\n')</p><p>primeiro[strlen(primeiro) – 1] = '\0';</p><p>Lembrando que as maiúsculas vêm antes das minúsculas na tabela ASCII, ao ser apresentado</p><p>o resultado da comparação das duas variáveis, conforme segue:</p><p>printf("Resultado da comparacao de %s com %s: %d\n\n",</p><p>primeiro, segundo, strcmp(primeiro, segundo) );</p><p>Se for fornecido Maria para primeiro, será devolvido zero como resultado da comparação;</p><p>se for fornecido maria, o resultado será 1; e se for fornecido Aaria, o resultado será -1.</p><p>■ finalização de strings</p><p>Quando uma string é armazenada em um vetor de caracteres sem usar uma função que ga-</p><p>ranta a inserção do “\0” ao seu final, é responsabilidade do usuário colocar o “\0”, conforme</p><p>o exemplo a seguir:</p><p>//Duplicação das letras de um texto</p><p>char entrada[MAXIMO + 1], dup[MAXIMO * 2 + 1];</p><p>int i, j;</p><p>//leitura de entrada</p><p>for (i = 0, j = -1; entrada[i]; i++)</p><p>{j++;</p><p>dup[j] = entrada[i];</p><p>if ((entrada[i] >= 'a' && entrada[i] <= 'z') ||</p><p>(entrada[i] >= 'A' && entrada[i] <= 'Z'))</p><p>{j++;</p><p>dup[j] = entrada[i];</p><p>}</p><p>}</p><p>j++;</p><p>dup[j] = '\0'; //marca de fim da string</p><p>Edelweiss_10.indd 288Edelweiss_10.indd 288 12/03/14 09:0112/03/14 09:01</p><p>167 Introdução à Programação em C UNIDADE 2</p><p>Manipulação de Caracteres PARTE 6</p><p>Capítulo 10 Manipulação de Strings 289</p><p>10.6 dicas</p><p>cuidar com acesso a posições válidas. Tomar cuidado para só processar as posições vá-</p><p>lidas das strings.</p><p>cuidar com acesso a posições inválidas em C. Evitar, por todos os meios, executar em</p><p>C operações com strings que ultrapassem o tamanho previsto. Não haverá aviso por parte</p><p>do sistema, e os erros gerados por invasão de áreas de memória não ocupadas pela string são</p><p>potencialmente muito danosos e difíceis de detectar.</p><p>verificar caractere terminador de string em C. Em C, sempre que uma string for criada,</p><p>verificar se o caractere terminador “\0” foi incluído.</p><p>alterar comprimento efetivo por programa em Pascal. Ao</p><p>de instruções que o computa-</p><p>dor precisa realizar para poder concluir uma determinada tarefa. Então, um</p><p>algoritmo, em computação, também é um conjunto de passos, só que o foco</p><p>é desenvolver um programa de computador.</p><p>Um algoritmo bastante famoso é o utilizado pelo Google, para realizar suas</p><p>buscas. Ele foi desenvolvido a partir de 1995, pelos então estudantes Larry</p><p>Page e Sergey Brin. Imagine que você tenha que realizar uma busca por nome</p><p>em uma agenda telefônica — fica mais fácil se a agenda estiver organizada</p><p>por nome, concorda? Então, os primeiros sistemas de busca ordenavam os</p><p>sites dessa forma, sendo que o grande diferencial do Google foi utilizar um</p><p>algoritmo que ordenasse os sites do mais acessado para os menos acessados.</p><p>Dessa forma, a probabilidade do que o usuário estava procurando estar entre</p><p>os primeiros é maior.</p><p>Os algoritmos estão em várias áreas — medicina, bolsa de valores, mo-</p><p>bilidade urbana. Seu uso está cada vez mais difundido, e aprender como</p><p>escrever um algoritmo bem como torná-lo mais eficiente é uma habilidade</p><p>muito importante para os profissionais das mais diversas áreas.</p><p>Algoritmo pode ser definido como uma sequência de passos que visam a atingir um</p><p>objetivo definido (FORBELLONE; EBERSPÄCHER, 2005).</p><p>3Introdução à lógica de programação</p><p>15 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução a Lógica de Programação PARTE 1</p><p>Comandos, variáveis, expressões e instruções</p><p>No nosso exemplo do hambúrguer, falta pensarmos em uma coisa: saber</p><p>como escrever e definir quais são os passos necessários. Bom, cada pessoa</p><p>pode definir de um jeito, e isso poderia acontecer também ao escrevermos</p><p>um algoritmo para um programa de computador, o que tornaria o trabalho</p><p>dos computadores muito mais complicado, pois cada pessoa poderia definir</p><p>esses passos de uma forma. Em computação, costuma-se padronizar grande</p><p>parte dos conceitos envolvidos, e a definição dos passos de um algoritmo</p><p>também foi padronizada.</p><p>Por meio de comandos, podemos formar as instruções e as expressões.</p><p>Assim, os comandos são os tijolos da nossa construção; com eles, o computador</p><p>entende o que deve fazer. Escrever um texto na tela, por exemplo, pode ser a</p><p>ação que será executada pelo comando “escrever <texto” que será escrito na tela.</p><p>Existem vários tipos de comandos: comandos para atribuição de valor,</p><p>comandos para entrada e saída de dados, comandos para estruturas de seleção</p><p>ou de repetição — vamos conhecer todos eles. Agora, você precisa saber</p><p>que comando denota uma ação (ou um conjunto delas) que o computador irá</p><p>executar, tem forma e segue algumas regrinhas.</p><p>Outra definição que usaremos ao longo de todo o nosso curso é a de</p><p>variáveis. Durante a execução de um programa, dados são entregues ao</p><p>computador, que, executando esse programa, modifica os dados e “responde”</p><p>conforme o esperado.</p><p>Exemplo — Operação de saque em um autoatendimento</p><p>1. Entrar com os dados de conta e senha;</p><p>2. solicitar qual opção o cliente deseja realizar;</p><p>3. se for saque, solicitar o valor a ser sacado;</p><p>4. se existir saldo, entregar o dinheiro;</p><p>5. se não, mostrar a mensagem de “saldo indisponível” na tela;</p><p>6. encerrar a operação.</p><p>Introdução à lógica de programação4</p><p>ALGORITMOS E PROGRAMAÇÃO16</p><p>Esse valor que você solicitou é um dado que precisa ser armazenado na</p><p>memória do computador. Essa região da memória do computador, onde guar-</p><p>damos, mesmo que temporariamente, o dado, chamamos de “variável”, e, como</p><p>o próprio nome diz, pode sofrer mudança (variação) de valor.</p><p>Memória de um computador é o meio físico para armazenar dados temporariamente</p><p>ou permanentemente. Para saber mais, consulte TANENBAUM, 2000.</p><p>Para podermos usar as variáveis, precisamos inicialmente criá-las. Em</p><p>programação, a criação de uma variável é chamada de “declaração de uma</p><p>variável”, que pode ser comparada ao ato de etiquetar pequenas gavetas para</p><p>organizar diversos itens. A grande ideia por detrás da variável é que cada</p><p>uma delas tem um nome e um tipo. Assim, somente os dados daquele tipo</p><p>podem ser colocados na sua respectiva variável. Não daria para colocar um</p><p>grampeador em uma gaveta etiquetada com canetas. Veremos mais detalhes</p><p>sobre variável adiante.</p><p>Com as variáveis e os comandos, podemos formar as instruções e/ou</p><p>expressões. Uma expressão é uma combinação de variáveis, comandos e</p><p>operadores. Já uma instrução é uma operação única, que é executada pelo</p><p>processador do computador. Assim, o programa de computador é formado por</p><p>várias instruções. Em resumo, as instruções são formadas por comandos e/ou</p><p>variáveis. Todas essas ferramentas são usadas para escrever um programa,</p><p>utilizando o conceito de algoritmo.</p><p>Representação de um algoritmo</p><p>Como foi visto, um algoritmo é um conjunto de passos para que uma tarefa seja</p><p>realizada. Esses passos são organizados de forma lógica, a fim de se chegar</p><p>ao objetivo final. Existem várias formas de se representar um algoritmo — até</p><p>agora usamos o português para isso, mas existem representações gráficas:</p><p>fluxograma e diagrama de Chapin. Vamos representar o algoritmo do saque,</p><p>usando o fluxograma da Figura 1:</p><p>5Introdução à lógica de programação</p><p>17 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução a Lógica de Programação PARTE 1</p><p>Figura 1. Algoritmo do saque.</p><p>Fonte: Do autor.</p><p>INÍCIO</p><p>Solicitar dados</p><p>do usuário</p><p>Solicitar a opção</p><p>de operação</p><p>Se for</p><p>saque</p><p>Solicitar valor</p><p>a ser sacado</p><p>Saldo</p><p>su�ciente?</p><p>Mostrar mensagem</p><p>de saldo indisponível</p><p>Entregar o</p><p>valor solicitado</p><p>FIM</p><p>V</p><p>F V</p><p>As representações gráficas são mais fáceis de entender devido à sua própria</p><p>natureza. A lógica envolvida fica mais clara, porém é preciso que se aprenda a</p><p>padronização dos itens que podem ser usados. Por esse motivo, ao logo deste</p><p>livro, usaremos o português para a representação dos algoritmos.</p><p>Para saber mais sobre a representação de algoritmos, consulte FORBELLONE; EBERS-</p><p>PÄCHER, 2005.</p><p>Introdução à lógica de programação6</p><p>ALGORITMOS E PROGRAMAÇÃO18</p><p>Execução de um programa: compilação e</p><p>interpretação</p><p>Bom, já sabemos que um programa é um conjunto de instruções que são</p><p>entregues ao computador para que ele realize determinada tarefa. Essa ação</p><p>de realizar uma tarefa em computação chamamos de “execução de um pro-</p><p>grama”, e existem duas maneiras de um programa ser executado. Antes de</p><p>passarmos para essa etapa, é importante dizer que os algoritmos, mesmo que</p><p>padronizados, ainda não estão escritos em uma linguagem que o computador</p><p>entenda. Existem várias linguagens que o computador entende: C, Java, Python</p><p>são exemplos de linguagens de programação. Então, o processo de desenvolver</p><p>um programa passa por estas etapas:</p><p>1. Entender o problema ou a tarefa que queremos que o programa execute.</p><p>2. Desenvolver um algoritmo.</p><p>3. Escrever o algoritmo em uma linguagem de programação — esse ar-</p><p>quivo com o algoritmo escrito em uma linguagem de programação é</p><p>chamado de “código-fonte”.</p><p>4. Enviar o programa para que o processador o execute, compilando ou</p><p>interpretando o código-fonte.</p><p>■ Compilar um arquivo é traduzir de uma linguagem para outra. As-</p><p>sim, quando compilamos um código-fonte, estamos transformando</p><p>um arquivo escrito em uma linguagem de programação em uma</p><p>linguagem que o processador pode executar, também chamada de</p><p>linguagem de máquina. Exemplos de linguagens compiladas: C,</p><p>C++, Erlang, Haskell.</p><p>■ Outras linguagens de programação são interpretadas, funcionando</p><p>da seguinte forma: o código fonte é passado para o interpretador,</p><p>que pega cada instrução escrita no código-fonte e a executa de forma</p><p>direta, não realizando uma tradução de todo o código-fonte. Exemplos</p><p>de linguagens interpretadas: Java, Python, Ruby, PHP.</p><p>■ A maior vantagem de uma linguagem compilada é</p><p>alterar manualmente o com-</p><p>primento efetivo de uma string em Pascal, lembrar de converter o valor de seu novo compri-</p><p>mento para o caractere ASCII correspondente e de armazená-lo na posição zero da string.</p><p>utilizar subprogramas já existentes. Antes de realizar tarefas envolvendo strings, revisar</p><p>as funções e procedimentos que já estão disponíveis para tratar com este tipo de variável a</p><p>fim de evitar “reinventar a roda”.</p><p>10.7 testes</p><p>testar limites. Testar os códigos quanto aos limites inferior e superior das strings.</p><p>testar o comprimento de strings. Em Pascal, testar o valor do comprimento de uma va-</p><p>riável string imediatamente antes de utilizá-lo em alguma operação.</p><p>10.8 exercícios sugeridos</p><p>exercício 10.1 Faça um subprograma que leia um texto de até 80 caracteres e devolva, em</p><p>um vetor, a distribuição de frequência de comprimento de palavras do texto. Considerar que,</p><p>no texto, podem aparecer palavras de até 10 caracteres e que a menor palavra tem apenas</p><p>dois caracteres. As palavras podem estar separadas por espaços em branco ou pelos caracte-</p><p>res vírgula ou ponto.</p><p>exercício 10.2 Um texto é composto de palavras tendo, cada uma, 10 ou menos caracteres.</p><p>Escreva um programa que leia um texto de até 100 palavras e depois as imprima em ordem</p><p>alfabética.</p><p>exercício 10.3 Dado um texto, faça um programa que isole cada palavra deste texto e veri-</p><p>fique se é um palíndromo, conforme mostrado no Exercício 10.3, na Seção 10.3. As palavras</p><p>são separadas por caracteres de espaço em branco, ou pelos símbolos “,”, “.”, “!”, “:” e “;”. A</p><p>saída do programa deve ser cada uma das palavras identificadas, seguida por uma mensagem</p><p>indicando se a palavra é ou não um palíndromo.</p><p>Edelweiss_10.indd 289Edelweiss_10.indd 289 12/03/14 09:0112/03/14 09:01</p><p>ALGORITMOS E PROGRAMAÇÃO168</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>3</p><p>Comandos Condicionais</p><p>Prezado estudante,</p><p>Estamos começando uma unidade desta disciplina. Os textos que a compõem foram</p><p>organizados com cuidado e atenção, para que você tenha contato com um conteúdo completo</p><p>e atualizado tanto quanto possível. Leia com dedicação, realize as atividades e tire suas</p><p>dúvidas com os tutores. Dessa forma, você, com certeza, alcançará os objetivos propostos</p><p>para essa disciplina.</p><p>OBJETIVO GERAL</p><p>Compreender o funcionamento dos comandos condicionais (simples, compostos e de</p><p>múltipla escolha) .</p><p>OBJETIVOS ESPECÍFICOS</p><p>• Analisar algoritmos com estruturas condicionais simples em fluxograma.</p><p>• Identificar problemas que necessitam de comandos condicionais simples para a sua</p><p>solução.</p><p>• Criar programas que usam a estrutura de seleção simples, composta e encadeada.</p><p>• Praticar a resolução de problemas computacionais com a estrutura de seleção</p><p>ternária.</p><p>• Analisar algoritmos com estruturas de seleção múltipla em fluxograma.</p><p>• Identificar problemas que podem ser resolvidos com a aplicação de comando de</p><p>seleção múltipla.</p><p>ALGORITMOS E PROGRAMAÇÃO170</p><p>ANOTAÇÕES</p><p>unidade</p><p>3</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 1</p><p>Comandos Condicionais Simples</p><p>(Fluxograma)</p><p>ALGORITMOS E PROGRAMAÇÃO172</p><p>90 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Os algoritmos que solucionam os problemas apresentados até o momento são puramente</p><p>sequenciais: todas as instruções são executadas na ordem em que foram definidas, uma após</p><p>a outra, sem exceção. Este capítulo introduz uma nova classe de problemas, na qual uma ou</p><p>mais ações podem ou não ser executadas, dependendo da avaliação prévia de condições. Para</p><p>resolver esses problemas são apresentados três novos comandos que possibilitam a alteração</p><p>do fluxo sequencial de execução de um programa.</p><p>No capítulo anterior, foi resolvido o problema do cálculo da média aritmética de três notas</p><p>de um aluno em uma disciplina. Estendendo essa aplicação, o professor que utiliza esse pro-</p><p>grama quer que, além da média das notas obtidas na disciplina, seja informado se o aluno</p><p>foi aprovado (no caso de sua média ser igual ou superior a 6). Essa informação não pode ser</p><p>obtida somente com o conjunto de comandos do Capítulo 3, uma vez que requer a análise</p><p>de uma condição e a execução de uma ação somente se a condição analisada for verdadeira.</p><p>Outra possibilidade é fornecer não apenas a informação de aprovação, mas também a de</p><p>reprovação. Nesse caso, também condicionada ao conteúdo da média calculada, ocorre a</p><p>execução de apenas uma de duas ações mutuamente exclusivas: se a média for maior ou igual</p><p>a 6, o programa informa que o aluno foi aprovado; caso contrário, se a média for inferior a 6,</p><p>informa que o aluno foi reprovado.</p><p>Seguindo adiante nesse raciocínio, pode-se escrever um trecho de programa em que, depen-</p><p>dendo da média obtida, também é informado o conceito correspondente à média calculada.</p><p>Aqui, diferentes faixas de valor de uma mesma informação desencadeiam ações diferentes,</p><p>também mutuamente exclusivas, isto é, a execução de uma ou mais instruções específicas</p><p>está associada ao valor da informação.</p><p>Os comandos que solucionam esses problemas são apresentados neste capítulo.</p><p>4.1 comando de seleção simples</p><p>Um comando de seleção simples, também chamado de comando condicional, permite</p><p>que a execução de um trecho do programa dependa do fato de uma condição ser verdadeira,</p><p>isto é, vincula a execução de um ou mais comandos ao resultado obtido na avaliação de uma</p><p>expressão lógica (também denominada expressão condicional). O comando de seleção sim-</p><p>ples é sempre composto por uma condição e um comando. A condição é expressa por uma</p><p>expressão lógica, cuja avaliação produz um resultado verdadeiro ou falso. A sintaxe de um</p><p>comando de seleção simples é:</p><p>se <expressão lógica></p><p>então <comando></p><p>Observe que o comando somente é executado se o resultado da expressão lógica for verda-</p><p>deiro; se o resultado for falso, nada é executado.</p><p>Por meio do comando de seleção simples pode-se, por exemplo, condicionar a exibição da infor-</p><p>mação de que um aluno foi aprovado somente para o caso de sua média ser igual ou superior a 6:</p><p>Edelweiss_04.indd 90Edelweiss_04.indd 90 12/03/14 09:0312/03/14 09:03</p><p>173 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais Simples (Fluxograma) PARTE 1</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 91</p><p>se média ≥ 6</p><p>então escrever('Aprovado')</p><p>A execução do comando escrever ocorre apenas quando a condição for verdadeira, ou seja,</p><p>quando o conteúdo da média for igual ou superior a 6. Nada é executado se a média for</p><p>inferior a 6.</p><p>A Figura 4.1 representa o fluxograma de um comando de seleção simples. Um novo tipo de</p><p>bloco, com formato de losango, é utilizado para representar a realização de um teste, escre-</p><p>vendo-se dentro desse bloco a expressão lógica a ser avaliada. Esse bloco tem duas saídas,</p><p>uma para o caso da expressão ser avaliada como verdadeira, e outra para quando o resultado</p><p>da avaliação da expressão for falso. As informações que correspondem a cada saída devem</p><p>estar claramente identificadas. O fluxograma mostra com clareza que nada é executado no</p><p>caso do resultado da avaliação da expressão ser falso.</p><p><expressão lógica></p><p>verdadeiro</p><p>falso</p><p><comando></p><p>figura 4.1 Fluxograma de um comando de seleção simples.</p><p>O algoritmo a seguir informa, além da média de um aluno, se ele foi aprovado:</p><p>Algoritmo 4.1 – Média2</p><p>{INFORMA A MÉDIA DAS 3 NOTAS DE UM ALUNO E SE ELE FOI APROVADO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>{Informação de aprovado}</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ←(nota1 + nota2 + nota3)/3</p><p>escrever (média) {INFORMA MÉDIA CALCULADA}</p><p>se média ≥ 6</p><p>então escrever('Aprovado') {INFORMA SE ALUNO FOI APROVADO}</p><p>fim</p><p>Edelweiss_04.indd 91Edelweiss_04.indd 91 12/03/14 09:0312/03/14 09:03</p><p>ALGORITMOS E PROGRAMAÇÃO174 92 Algoritmos e Programação com Exemplos</p><p>em Pascal e C</p><p>A Figura 4.2 apresenta o fluxograma relativo a esse algoritmo.</p><p>ENTRADA</p><p>nota1, nota2, nota3</p><p>SAÍDA</p><p>média</p><p>início</p><p>fim</p><p>( nota1 + nota2 + nota3 )</p><p>média</p><p>3</p><p>média 6</p><p>falso</p><p>verdadeiro</p><p>SAÍDA</p><p>‘Aprovado’</p><p>figura 4.2 Fluxograma de um exemplo com comando de seleção simples.</p><p>4.2 comando composto</p><p>Na sintaxe do comando de seleção simples nota-se que somente um comando pode ser exe-</p><p>cutado caso a condição seja verdadeira. Mas o que fazer quando se quer executar vários co-</p><p>mandos condicionados à avaliação de uma mesma expressão lógica? Por exemplo, supondo</p><p>que, na aplicação anterior, se queira saber a média somente no caso das três notas lidas serem</p><p>iguais ou superiores a 6, então a média deve ser calculada e informada somente se a condição</p><p>for verdadeira.</p><p>Para que isso seja possível, é necessário que dois comandos, o de cálculo da média e o de</p><p>saída dessa média, sejam executados quando a condição for verdadeira. Como a sintaxe do</p><p>comando de seleção simples exige a execução de um único comando, faz-se necessária a de-</p><p>finição de um novo tipo de comando, denominado comando composto.</p><p>Na pseudolinguagem aqui utilizada, um comando composto é delimitado pelas palavras re-</p><p>servadas início e fim. Sintaticamente, trata-se de um único comando. Quaisquer comandos</p><p>podem ser incluídos dentro de um comando composto. Algumas linguagens de programação</p><p>permitem, inclusive, a definição de novas variáveis dentro de um comando composto, as</p><p>quais são alocadas na memória apenas no momento em que inicia a execução desse coman-</p><p>Edelweiss_04.indd 92Edelweiss_04.indd 92 12/03/14 09:0312/03/14 09:03</p><p>175 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais Simples (Fluxograma) PARTE 1</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 93</p><p>do e são liberadas no término da execução do comando. Contudo, essa possibilidade não será</p><p>considerada neste livro.</p><p>O problema proposto no início desta seção pode ser resolvido com a utilização desse novo</p><p>recurso, conforme mostrado no Algoritmo Média3:</p><p>Algoritmo 4.2 – Média3</p><p>{INFORMA MÉDIA DO ALUNO SOMENTE SE SUAS 3 NOTAS FOREM IGUAIS OU SUPE-</p><p>RIORES A 6}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>{Informação de aprovado}</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>se (nota1 ≥ 6) e (nota2 ≥ 6) e (nota3 ≥ 6)</p><p>então início {COMANDO COMPOSTO}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever (média) {INFORMA MÉDIA}</p><p>fim</p><p>fim</p><p>O fluxograma desse algoritmo, apresentado na Figura 4.3, mostra com clareza que o conjunto</p><p>de comandos pode não ser executado, dependendo do resultado da condição.</p><p>ENTRADA</p><p>nota1, nota2, nota3</p><p>início</p><p>nota1 6 e nota2 6</p><p>e nota3 6</p><p>falso</p><p>verdadeiro</p><p>( nota1 + nota2 + nota3 )</p><p>média</p><p>3</p><p>SAÍDA</p><p>média</p><p>fim</p><p>figura 4.3 Fluxograma de comando de seleção simples com comando composto.</p><p>Edelweiss_04.indd 93Edelweiss_04.indd 93 12/03/14 09:0312/03/14 09:03</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>3</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 2</p><p>Comandos Condicionais</p><p>Compostos (Fluxograma)</p><p>ALGORITMOS E PROGRAMAÇÃO178 94 Algoritmos e Programação com Exemplos em Pascal e C</p><p>4.3 comando de seleção dupla</p><p>Supondo que, além de informar a média das três notas do aluno, também se queira que o</p><p>programa informe se ele foi aprovado (quando a média for igual ou superior a 6) ou repro-</p><p>vado (média inferior a 6). Dois comandos, se-então, são necessários para imprimir essas</p><p>mensagens:</p><p>se média ≥ 6</p><p>então escrever('Aprovado') {INFORMA SE O ALUNO FOI APROVADO}</p><p>se média < 6</p><p>então escrever('Reprovado') {INFORMA SE O ALUNO FOI REPROVADO}</p><p>Os dois comandos implementam ações mutuamente exclusivas e dependem da avaliação de</p><p>uma mesma condição, sendo uma das ações associada ao resultado verdadeiro e outra ao</p><p>resultado falso. Para evitar a repetição da comparação, pode ser utilizado um comando de</p><p>seleção dupla que, a partir do resultado da avaliação de uma condição, seleciona um de</p><p>dois comandos para ser executado. Sua sintaxe é:</p><p>se <expressão lógica></p><p>então <comando></p><p>senão <comando></p><p>Somente um comando pode ser definido em cada uma das cláusulas então e senão. Esse</p><p>comando pode ser simples ou composto, como no caso do comando de seleção simples. O</p><p>exemplo anterior, resolvido através de dois comandos de seleção simples, equivale ao seguinte</p><p>comando de seleção dupla:</p><p>se média ≥ 6</p><p>então escrever('Aprovado')</p><p>senão escrever('Reprovado')</p><p>O fluxograma que representa esse comando, mostrado na Figura 4.4, mostra claramente que</p><p>o fluxo do programa passa por apenas um dos dois comandos, o qual é selecionado pelo</p><p>resultado da expressão lógica.</p><p>O algoritmo que calcula a média de três notas e informa se o aluno foi aprovado ou reprova-</p><p>do é o seguinte:</p><p>Algoritmo 4.3 – Média4</p><p>{INFORMA A MÉDIA DO ALUNO E SE FOI APROVADO OU REPROVADO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>{Informação de aprovado ou reprovado}</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1+nota2+nota3)/3</p><p>escrever (média) {INFORMA MÉDIA CALCULADA}</p><p>Edelweiss_04.indd 94Edelweiss_04.indd 94 12/03/14 09:0312/03/14 09:03</p><p>179 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais Compostos (Fluxograma) PARTE 2</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 95</p><p>se média ≥ 6</p><p>então escrever('Aprovado') {INFORMA SE O ALUNO FOI APROVADO}</p><p>senão escrever('Reprovado') {INFORMA SE O ALUNO FOI REPROVADO}</p><p>fim</p><p>4.4 comandos de seleção aninhados</p><p>Conforme visto, somente um comando pode ser utilizado nas cláusulas então e senão, mas</p><p>não há restrição quanto ao tipo de comando. Pode, inclusive, ser usado um novo comando de</p><p>seleção – simples ou dupla. Nesse caso, diz-se que os comandos de seleção estão aninhados</p><p>ou encadeados.</p><p>Estendendo um pouco mais a aplicação de apoio a um professor, suponha que se queira ob-</p><p>ter o conceito do aluno com base na sua média, de acordo com a seguinte conversão:</p><p>Conceito A: Média ≥ 9,0</p><p>Conceito B: 9,0 > Média ≥ 7,5</p><p>Conceito C: 7,5 > Média ≥ 6,0</p><p>Conceito D: Média < 6,0</p><p>A solução pode ser implementada através de uma sequência de comandos condicionais (op-</p><p>ção 1):</p><p>se média ≥ 9</p><p>então conceito ← 'A'</p><p>se (média < 9) e (média ≥ 7,5)</p><p>então conceito ← 'B'</p><p>se (média < 7,5) e (média ≥ 6,0)</p><p>então conceito ← 'C'</p><p>se (média < 6)</p><p>então conceito ← 'D'</p><p><expressão lógica> verdadeirofalso</p><p><comando><comando></p><p>figura 4.4 Fluxograma do comando de seleção dupla.</p><p>Edelweiss_04.indd 95Edelweiss_04.indd 95 12/03/14 09:0312/03/14 09:03</p><p>ALGORITMOS E PROGRAMAÇÃO180 96 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Nessa sequência de comandos, somente uma das condições será verdadeira e, apesar disso,</p><p>todas as condições serão sempre avaliadas, desnecessariamente. Para evitar isso, o algorit-</p><p>mo a seguir calcula a média e o conceito, utilizando comandos de seleção dupla aninhados</p><p>(opção 2). Note que, uma vez encontrada uma condição verdadeira, as que estão após ela,</p><p>na cláusula senão, não são mais avaliadas. Cabe ressaltar que, nessa solução, não foi feita a</p><p>análise da validade dos dados de entrada, partindo-se do pressuposto que eles foram corre-</p><p>tamente informados.</p><p>Algoritmo 4.4 – MédiaConceito1</p><p>{INFORMA A MÉDIA E O CONCEITO DE UM ALUNO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>conceito (caractere)</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1+nota2+nota3)/3 {CÁLCULO DA MÉDIA}</p><p>escrever (média) {INFORMA MÉDIA CALCULADA}</p><p>se média ≥ 9 {CÁLCULO DO CONCEITO}</p><p>então conceito ← 'A'</p><p>senão se média ≥ 7,5</p><p>então conceito ← 'B'</p><p>senão se média ≥ 6,0</p><p>então conceito ← 'C'</p><p>senão conceito ← 'D' {MÉDIA < 6}</p><p>escrever (conceito) {INFORMA CONCEITO}</p><p>fim</p><p>Nesse algoritmo, o trecho de programa que calcula o conceito corresponde a um único co-</p><p>mando de seleção dupla. Se a média for igual ou superior a 9,0, o conceito “A” é atribuído</p><p>ao aluno e a execução desse comando termina. No caso dessa condição não ser verdadeira,</p><p>então é avaliada a segunda condição, que verifica se a média é igual ou superior a 7,5. Se essa</p><p>condição for verdadeira, o aluno recebe o conceito “B” e o comando é concluído. Se não for</p><p>verdadeira, então a média é novamente analisada, dessa vez verificando se é maior ou igual</p><p>a 6,0. Finalmente, independentemente da condição ser verdadeira ou falsa, o comando é</p><p>encerrado com a atribuição do conceito “C” (expressão verdadeira) ou “D” (expressão falsa).</p><p>A compreensão do funcionamento dos comandos de seleção aninhados é bem mais clara do</p><p>que a da sequência de comandos condicionais (opção 1). Além disso, a segunda opção de re-</p><p>presentação realiza menos comparações do que a primeira, o que diminui o tempo de execução.</p><p>uso de indentação para delimitar comandos aninhados. A pseudolinguagem utilizada</p><p>neste livro faz uso da indentação para mostrar visualmente o escopo de cada um dos coman-</p><p>Edelweiss_04.indd 96Edelweiss_04.indd 96 12/03/14 09:0312/03/14 09:03</p><p>181 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais Compostos (Fluxograma) PARTE 2</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 97</p><p>dos de seleção aninhados. Sem a indentação, é bem mais difícil visualizar o funcionamento</p><p>dos comandos aninhados, como pode ser observado na reescrita do trecho do Algoritmo 4.4</p><p>que examina a média:</p><p>se média ≥ 9</p><p>então conceito ← 'A'</p><p>senão se média ≥ 7,5</p><p>então conceito ← 'B'</p><p>senão se média ≥ 6,0</p><p>então conceito ← 'C'</p><p>senão conceito ← 'D' {MÉDIA < 6}</p><p>Contudo, a indentação por si só não garante a correção do código e pode até mesmo masca-</p><p>rar erros se não corresponder à sintaxe do código utilizado. No trecho a seguir, no comando</p><p>de seleção dupla, o comando da cláusula então é um comando condicional. A indentação</p><p>utilizada faz crer que a cláusula senão pertence ao comando mais externo, quando, pela sin-</p><p>taxe, ela pertence ao mais interno:</p><p>se nota1 = 10 {COMANDO DE SELEÇÃO DUPLA}</p><p>então se média > 9 {COMANDO CONDICIONAL}</p><p>então escrever ('Parabéns pela boa média!')</p><p>senão escrever ('A primeira nota não é 10! ')</p><p>A indentação que reflete a sintaxe do que está escrito é:</p><p>se nota1 = 10 {COMANDO SELEÇÃO DUPLA TRATADO COMO CONDICIONAL}</p><p>então se média > 9 {COMANDO CONDICIONAL TRATADO COMO SELEÇÃO DUPLA}</p><p>então escrever ('Parabéns pela boa média!')</p><p>senão escrever ('A primeira nota não é 10!')</p><p>Da forma como está o trecho, independentemente da indentação utilizada, se a Nota1 forne-</p><p>cida for 10 e a média não for superior a 9, será produzida a mensagem ‘A primeira nota não</p><p>é 10!’, que claramente está incorreta. Nesse caso, o problema pode ser corrigido através do</p><p>uso dos delimitadores de um comando composto, para indicar que somente a cláusula então</p><p>faz parte do comando que testa a condição “se média > 9”:</p><p>se nota1 = 10 {COMANDO DE SELEÇÃO DUPLA}</p><p>então início {COMANDO COMPOSTO}</p><p>se média > 9 {COMANDO CONDICIONAL}</p><p>então escrever ('Parabéns pela boa média! )</p><p>fim</p><p>senão escrever ('A primeira nota não é 10!')</p><p>Edelweiss_04.indd 97Edelweiss_04.indd 97 12/03/14 09:0312/03/14 09:03</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>3</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 3</p><p>Estruturas de Seleção</p><p>ALGORITMOS E PROGRAMAÇÃO184</p><p>Estruturas de seleção</p><p>Introdução</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Usar as estruturas de seleção if-else e switch.</p><p>� Criar programas que usam as estruturas de seleção simples, composta</p><p>e encadeada.</p><p>� Resolver problemas computacionais com a estrutura de seleção</p><p>ternária.</p><p>Objetivos de aprendizagem</p><p>Em programação, podemos construir programas sequenciais, ou seja,</p><p>que possuem somente um fluxo de execução. Todavia, existem casos</p><p>que isso não é o suficiente para resolver um determinado problema. Uma</p><p>estrutura de decisão é uma ferramenta utilizada para modificarmos o fluxo</p><p>de execução de um programa. Com esse tipo de estrutura, é possível</p><p>escolher um grupo de ações a serem executadas de acordo com o valor</p><p>lógico de alguma expressão lógica e/ou relacional.</p><p>Neste capítulo, você estudará a construção de um algoritmo, os con-</p><p>ceitos básicos envolvidos, os tipos e o funcionamento da estrutura de</p><p>seleção.</p><p>As estruturas de seleção if-else e switch</p><p>Quando criamos um programa de computador, utilizamos a seguinte sequência</p><p>de operações na grande maioria das vezes: entrada de dados, processamento</p><p>e saída. Para que essas operações sejam executadas de forma a resolver o</p><p>problema ou a realizar uma determinada tarefa, é importante que ele siga um</p><p>fluxo de execução que faça sentido, ou seja, que tenha uma determinada lógica.</p><p>185 Técnicas de Integração UNIDADE 3</p><p>Volumes de Revolução PARTE 3</p><p>Quando existe somente um fluxo de execução, ou seja, não há a necessidade</p><p>de escolha entre dois ou mais caminhos, chamamos a execução de sequencial.</p><p>Ela segue do início do código-fonte ao final e, toda vez que for executada, terá</p><p>a mesma ordem de execução das instruções que compõem o código-fonte.</p><p>Mas existem situações onde é preciso que o programa tenha mais de um</p><p>fluxo de execução. Imagine que você esteja escrevendo um programa que</p><p>calcule a média de um aluno e mostre, ao final, a situação dele de acordo</p><p>com essa média.</p><p>Para exemplificar, vamos usar as seguintes regras:</p><p>� Se a média for menor que 5, o aluno está reprovado.</p><p>� Se a média for maior que 5 e menor que 7, ele estará em recuperação.</p><p>� Acima de 7, ele será aprovado.</p><p>Não é possível que o aluno esteja em recuperação, aprovado e reprovado</p><p>ao mesmo tempo. Então, o programa precisará ter mais de um fluxo de exe-</p><p>cução, e isso é obtido por meio da utilização de uma estrutura conhecida</p><p>como estrutura de seleção. Esta permite que decisões sejam tomadas e ações</p><p>diferentes sejam executadas.</p><p>Existem dois tipos de estrutura de seleção em C: if-else e switch — cada</p><p>uma tem sua sintaxe e podem ser utilizadas em situações diferentes. Tomemos</p><p>como exemplo um programa que, dado um número inteiro, tem como saída</p><p>um texto mostrando se o número é maior que 0. Observe a Figura 1, a seguir.</p><p>Figura 1. Uso do if-simples.</p><p>Estruturas de seleção2</p><p>ALGORITMOS E PROGRAMAÇÃO186</p><p>As linhas em destaque (6,7 e 8) mostram o uso da estrutura if. Nesse caso,</p><p>o programa só vai ter um caminho diferente para seguir: quando o número</p><p>for maior que zero. Por isso, foi usado somente o if (sem o else) e seu funcio-</p><p>namento pode ser visto no seguinte fluxograma, representado pela Figura 2.</p><p>Figura 2. Fluxograma do if-simples.</p><p>Os testes lógicos são construídos com os operadores relacionais somente,</p><p>ou pode-se unir expressões relacionais com operadores lógicos. A sintaxe do</p><p>if segue a seguinte regra, apresentada na Figura 3.</p><p>Figura 3. Sintaxe do if-simples.</p><p>3Estruturas de seleção</p><p>187 Técnicas de Integração UNIDADE 3</p><p>Volumes de Revolução PARTE 3</p><p>Usando o mesmo exemplo, imagine agora que o programa deve, ao final</p><p>da execução, dizer se o número é maior que zero ou se o número digitado é</p><p>menor ou igual a zero. Diferentemente do primeiro exemplo, esse problema</p><p>requer o desenvolvimento de dois fluxos de execução. Vamos dar uma olhada</p><p>no código-fonte que resolve essa questão, na Figura 4.</p><p>Figura 4. Uso do if-else-composto.</p><p>Nas linhas em destaque, podemos ver o uso da estrutura if-else. Nesse caso,</p><p>temos dois caminhos a tomar (por enquanto): escrever o texto referente ao número</p><p>maior que zero; e, no caso contrário, se o número for menor ou igual a zero.</p><p>Estruturas de seleção4</p><p>ALGORITMOS E PROGRAMAÇÃO188</p><p>A sintaxe e o funcionamento da estrutura if-else podem ser vistos a seguir,</p><p>nas Figuras 5 e 6.</p><p>Figura 5. Sintaxe if-else-composta.</p><p>Figura 6. Fluxograma if-else-composto.</p><p>5Estruturas de seleção</p><p>189 Técnicas de Integração UNIDADE 3</p><p>Volumes de Revolução PARTE 3</p><p>O nosso segundo tipo de estrutura de seleção é o switch. Para exemplificar,</p><p>imagine um programa que você digite o mês em formato numérico e ele retorne</p><p>o mês em forma de texto. Na Figura 7, está representado o código-fonte que</p><p>realiza essa tarefa.</p><p>Figura 7. Uso do switch.</p><p>Estruturas de seleção6</p><p>ALGORITMOS E PROGRAMAÇÃO190</p><p>O switch acaba sendo uma alternativa mais simples para o if. Seu uso é</p><p>bastante simples: quando comparamos uma variável com valores diferentes</p><p>e temos ações específicas, caso essa variável seja igual a um dos valores</p><p>comparados. Sua sintaxe segue as seguintes regras:</p><p>� Você precisa definir qual variável o switch irá avaliar.</p><p>� Em seguida, você tem uma sequência de casos, onde a variável é com-</p><p>parada com um valor.</p><p>� Cada caso é feito usando-se a palavra reservada case, seguida do valor</p><p>e dois pontos.</p><p>Um detalhe importante em cada caso é o fato de termos, como última linha,</p><p>a palavra reservada break, que faz com que somente um caso seja avaliado</p><p>por vez. Essa palavra quebra a execução do switch e faz com que o fluxo siga</p><p>para a primeira linha após o switch.</p><p>O switch é bastante utilizado quando se deseja implementar um menu.</p><p>Imagine que você esteja desenvolvendo um jogo que tenha níveis. Um possível</p><p>menu pode ser feito da seguinte forma, conforme Figura 8.</p><p>Figura 8. Uso do switch, implementando menu.</p><p>7Estruturas de seleção</p><p>191 Técnicas de Integração UNIDADE 3</p><p>Volumes de Revolução PARTE 3</p><p>Um detalhe importante é o uso do default. Já percebeu para que ele serve? Caso a</p><p>variável testada não seja igual a nenhum valor presente nos cases, o switch executa</p><p>as instruções presentes no default.</p><p>O case só serve quando o teste que queremos fazer é por meio da utilização</p><p>do operador igual a (==). Se for preciso fazer vários testes, mas com outros</p><p>operadores, precisamos encadear if-elses, como será visto a seguir.</p><p>As estruturas de seleção if-else e switch</p><p>Uma estrutura de seleção simples é aquela formada por um único if. Como</p><p>vimos anteriormente, o if sozinho é usado quando temos somente um caminho</p><p>para seguir no fluxo de execução do programa.</p><p>Já, quando usamos somente um if-else, estamos usando uma estrutura de</p><p>seleção composta. Ela é usada quando é preciso tomar uma decisão e existe um</p><p>conjunto de instruções a ser executado, caso o teste seja verdadeiro ou falso.</p><p>Porém, existem casos onde é preciso mais que dois caminhos a seguir no</p><p>fluxo de execução do programa. Tomemos como exemplo o programa que</p><p>diz se um número é maior, menor ou igual a zero. Do jeito que escrevemos o</p><p>código anteriormente, é impossível saber se o número é 0 ou menor que zero.</p><p>Precisamos, nesse caso, implementar um programa que tenha 3 caminhos a</p><p>seguir:</p><p>� maior que zero;</p><p>� menor que zero;</p><p>� igual a zero.</p><p>Estruturas de seleção8</p><p>ALGORITMOS E PROGRAMAÇÃO192</p><p>Nesses casos, utilizamos estrutura de seleção encadeada, ou seja, uma</p><p>dentro da outra. Segue o código do nosso problema, representado pela Figura 9,</p><p>agora com estrutura de seleção encadeada.</p><p>Figura 9. Código para exemplificar o uso da estrutura de seleção encadeada.</p><p>Seguem algumas dicas para a escrita da estrutura de seleção composta:</p><p>� Quem tem teste lógico é sempre o if, o else nunca testa variável.</p><p>� Cada if tem o teste lógico e o conjunto de chaves para delimitar o que</p><p>será executado dentro do if.</p><p>� Cada else tem seu conjunto de chaves para delimitar o que será exe-</p><p>cutado dentro do else.</p><p>� Fica mais fácil se o que estiver dentro do if ou do else for indentado,</p><p>ou seja, aplicamos um recuo (com o uso da tecla tab), para indicar a</p><p>hierarquia do código.</p><p>9Estruturas de seleção</p><p>193 Técnicas de Integração UNIDADE 3</p><p>Volumes de Revolução PARTE 3</p><p>Lembra do exemplo da situação do aluno, lá do início do nosso capítulo?</p><p>Vamos escrever o código para resolver esse problema. Observe a Figura 10.</p><p>Figura 10. Código para exemplificar o uso da estrutura de</p><p>seleção encadeada (situação aluno).</p><p>A estrutura de seleção ternária</p><p>O operador ternário é uma maneira que a linguagem C tem de escrever uma</p><p>estrutura if-else de forma compactada. Como exemplo, vamos escrever um</p><p>programa que, dados dois números, mostra o maior deles.</p><p>Vamos implementar esse programa, primeiro somente com if-else e, depois,</p><p>substituindo um dos destes pela estrutura ternária. Veja a Figura 11, a seguir.</p><p>Estruturas de seleção10</p><p>ALGORITMOS E PROGRAMAÇÃO194</p><p>Figura 11. Comparação entre estrutura de seleção composta e estrutura de seleção ternária.</p><p>Do lado esquerdo, temos o código com o uso do if-else interno, para avaliar</p><p>qual o maior número. Esse if-else pode ser substituído pelas linhas 9 e 10 do</p><p>código à direita e, especificamente, pela linha 9, onde usamos a estrutura de</p><p>seleção ternária. A sintaxe da estrutura de seleção ternária é representada em</p><p>seguida, na Figura 12.</p><p>Figura 12. Sintaxe da estrutura de seleção ternária.</p><p>A variável de atribuição vai receber o valor de:</p><p>� expressão 1, se a condição for verdadeira;</p><p>� expressão 2, se a condição for falsa.</p><p>Lembre-se de que a condição pode ser feita por meio do uso de operadores relacionais</p><p>e/ou lógicos.</p><p>11Estruturas de seleção</p><p>195 Técnicas de Integração UNIDADE 3</p><p>Volumes de Revolução PARTE 3</p><p>BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://</p><p>en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018.</p><p>PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.</p><p>296p.</p><p>PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.</p><p>SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson</p><p>Pioneira, 2003.</p><p>Leituras recomendadas</p><p>Estruturas de seleção12</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>3</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 4</p><p>Comandos Condicionais de</p><p>Múltipla Escolha (Pseudocódigo)</p><p>ALGORITMOS E PROGRAMAÇÃO198 98 Algoritmos e Programação com Exemplos em Pascal e C</p><p>4.5 comando de seleção múltipla</p><p>O comando de seleção múltipla seleciona uma dentre diversas opções, com base na ava-</p><p>liação de uma expressão. Na pseudolinguagem aqui utilizada, a sintaxe deste comando é:</p><p>caso <expressão> seja</p><p><rótulo 1>: <comando 1></p><p><rótulo 2>: <comando 2></p><p>...</p><p><rótulo n>: <comando n></p><p>[ senão <comandos> ]</p><p>fim caso</p><p>onde os símbolos “[” e “]” significam que essa linha é opcional.</p><p>O comando inicia com um cabeçalho caso <expressão> seja, seguido de uma série de</p><p>comandos rotulados, ou seja, comandos precedidos por um valor seguido</p><p>do caractere “:”.</p><p>O resultado da avaliação da expressão utilizada no cabeçalho e os valores representados nos</p><p>rótulos devem ser todos do mesmo tipo e corresponder a um valor ordinal como, por exem-</p><p>plo, inteiro ou caractere. Cada rótulo corresponde a somente um comando. Um comando</p><p>composto pode ser utilizado caso se queira executar mais de uma ação para um determina-</p><p>do rótulo.</p><p>Depois de avaliada a expressão, seu resultado é comparado com cada um dos rótulos, na</p><p>ordem em que são definidos. Somente o comando associado ao primeiro rótulo que for igual</p><p>ao resultado da expressão é executado. Só a igualdade é verificada. Se o valor da expressão</p><p>não for igual a qualquer dos rótulos, nada será executado pelo comando. Opcionalmente,</p><p>poderá ser utilizada a cláusula senão, que indica o comando a ser executado caso nenhum</p><p>dos rótulos corresponda ao valor da expressão do cabeçalho. O final do comando de seleção</p><p>múltipla é indicado pelas palavras reservadas fim caso. Por exemplo, supondo que a variável</p><p>a seja uma variável do tipo inteiro:</p><p>caso a seja</p><p>1: a ← 0 {COMANDO SIMPLES PARA O CASO a = 1}</p><p>2: início {COMANDO COMPOSTO PARA O CASO a = 2}</p><p>ler(a)</p><p>escrever(a)</p><p>fim</p><p>3: a ← a + 1 {COMANDO SIMPLES PARA O CASO a = 3}</p><p>senão escrever(a) {CLÁUSULA OPCIONAL PARA OUTROS VALORES DE a}</p><p>fim caso</p><p>Um comando de seleção múltipla equivale a um comando de seleção dupla com outros co-</p><p>mandos de seleção dupla aninhados nele. O exemplo anterior equivale a:</p><p>Edelweiss_04.indd 98 12/03/14 09:03</p><p>199 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais de Múltipla Escolha (pseudocodigo) PARTE 4</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 99</p><p>se a = 1</p><p>então a ← 0 {COMANDO SIMPLES PARA O CASO a = 1}</p><p>senão se a = 2</p><p>então início {COMANDO COMPOSTO PARA O CASO a = 2}</p><p>ler(a)</p><p>escrever(a)</p><p>fim</p><p>senão se a = 3</p><p>então a ← a + 1 {COMANDO SIMPLES PARA O CASO a = 3}</p><p>senão escrever(a) {CLÁUSULA OPCIONAL}</p><p>Uma vantagem de usar o comando de seleção múltipla em lugar desses comandos aninhados</p><p>está na possibilidade de utilizar somente um nível de indentação, o que torna mais clara a</p><p>visualização das alternativas existentes.</p><p>A Figura 4.5 representa o fluxograma correspondente ao exemplo anterior. Pode-se observar</p><p>que o fluxo do programa somente passará por um dos comandos associados aos rótulos.</p><p>a = 1 a 0 verdadeiro</p><p>a = 2</p><p>a = 3 a a + 1</p><p>verdadeiro</p><p>verdadeiro</p><p>falso</p><p>falso</p><p>falso</p><p>SAÍDA</p><p>a</p><p>ENTRADA</p><p>a</p><p>SAÍDA</p><p>a</p><p>figura 4.5 Fluxograma de um comando de seleção múltipla.</p><p>O algoritmo a seguir, que calcula e informa a média e o conceito de um aluno, ilustra a utili-</p><p>zação de rótulos do tipo caractere em um comando de seleção múltipla:</p><p>Algoritmo 4.5 – MédiaConceito2</p><p>{INFORMA MÉDIA E CONCEITO DE UM ALUNO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>Informação do conceito do aluno</p><p>Variável auxiliar: conceito (char)</p><p>Edelweiss_04.indd 99 12/03/14 09:03</p><p>ALGORITMOS E PROGRAMAÇÃO200 100 Algoritmos e Programação com Exemplos em Pascal e C</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever (média) {INFORMA MÉDIA}</p><p>se média ≥ 9 {CÁLCULO DO CONCEITO}</p><p>então conceito ← 'A'</p><p>senão se média ≥ 7,5</p><p>então conceito ← 'B'</p><p>senão se média ≥ 6,0</p><p>então conceito ← 'C'</p><p>senão conceito ← 'D' {MÉDIA < 6}</p><p>caso conceito seja {INFORMA CONCEITO}</p><p>'A': escrever('Conceito A – Parabéns!')</p><p>'B': escrever('Conceito B')</p><p>'C': escrever('Conceito C')</p><p>'D': escrever('Conceito D – Você foi reprovado')</p><p>fim caso</p><p>fim</p><p>A implementação do comando de seleção múltipla varia, dependendo da linguagem de pro-</p><p>gramação utilizada. Algumas linguagens permitem que um comando seja rotulado com uma</p><p>lista de valores, ou mesmo com um intervalo. No exemplo a seguir, nota somente pode con-</p><p>ter um valor inteiro:</p><p>caso nota seja</p><p>0..5: escrever('Reprovado'){RÓTULO DO TIPO INTERVALO}</p><p>6, 7, 8, 9, 10: escrever('Aprovado') {LISTA DE RÓTULOS}</p><p>fim caso</p><p>O primeiro comando é rotulado com o intervalo 0..5, representando os valores inteiros</p><p>0, 1, 2, 3, 4 e 5. O comando associado ao intervalo será executado quando o valor da variável</p><p>nota for um desses valores. O segundo comando apresenta uma lista de rótulos. Se o valor da</p><p>variável nota for igual a um deles, o segundo comando será executado. Observar que a utili-</p><p>zação desses dois tipos de rótulos gerou um comando conciso e muito fácil de compreender.</p><p>4.6 exercícios de fixação</p><p>exercício 4.1 Ler um número inteiro. Se o número lido for positivo, escrever uma mensagem</p><p>indicando se ele é par ou ímpar.</p><p>Algoritmo ParOuÍmpar</p><p>{INFORMA SE UM VALOR LIDO DO TECLADO É PAR OU ÍMPAR}</p><p>Entrada: valor (inteiro) {VALOR A SER TESTADO}</p><p>Saída: Mensagem de 'par' ou 'ímpar'</p><p>Edelweiss_04.indd 100 12/03/14 09:03</p><p>201 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais de Múltipla Escolha (pseudocodigo) PARTE 4</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 101</p><p>Variável auxiliar: ehPar (lógica)</p><p>início</p><p>ler(valor) {ENTRADA DO VALOR A SER TESTADO}</p><p>se valor ≥ 0 {VALOR LIDO É POSITIVO}</p><p>então início</p><p>ehPar ← (valor mod 2) = 0 {VERIFICA SE VALOR É PAR}</p><p>se ehPar {VERDADEIRO SE ehPar FOR VERDADEIRO}</p><p>então escrever('Par ! ')</p><p>senão escrever('Ímpar ! ')</p><p>fim</p><p>fim</p><p>exercício 4.2 Dados os coeficientes de uma equação do 2o grau, calcular e informar os va-</p><p>lores de suas raízes.</p><p>Algoritmo EquaçãoSegundoGrau</p><p>{INFORMA OS VALORES DAS RAÍZES DE UMA EQUAÇÃO DO SEGUNDO GRAU}</p><p>Entradas: a, b, c (real) {COEFICIENTES DA EQUAÇÃO}</p><p>Saídas: r1, r2 (real) {RAÍZES}</p><p>Variável auxiliar: disc (real) {DISCRIMINANTE}</p><p>início</p><p>ler(a, b, c) {ENTRADA DOS VALORES DOS COEFICIENTES DA EQUAÇÃO}</p><p>se a = 0</p><p>então início</p><p>escrever('Não é equação do segundo grau! ')</p><p>escrever('Raiz = ', (- c / b ))</p><p>fim</p><p>senão início</p><p>disc ← sqr(b) – 4 * a * c {CÁLCULO DO DISCRIMINANTE}</p><p>se disc < 0</p><p>então escrever('Raízes imaginárias !')</p><p>senão início</p><p>r1 ← ( – b + sqrt ( disc ) ) / ( 2 * a )</p><p>r2 ← ( – b – sqrt ( disc ) ) / ( 2 * a )</p><p>escrever('Raízes: ', r1, r2)</p><p>fim</p><p>fim</p><p>fim</p><p>exercício 4.3 Processar uma venda de livros em uma livraria. O cliente poderá comprar diver-</p><p>sas unidades de um mesmo tipo de livro. O código que define o tipo do livro vendido (A, B, C)</p><p>e o número de unidades desse livro são fornecidos como dados de entrada.</p><p>Preços: Tipo A – R$ 10,00</p><p>Tipo B – R$ 20,00</p><p>Tipo C – R$ 30,00</p><p>Edelweiss_04.indd 101 12/03/14 09:03</p><p>ALGORITMOS E PROGRAMAÇÃO202 102 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Calcular e informar o preço a pagar. Caso tenham sido vendidos mais de 10 livros, exibir uma</p><p>mensagem informando isso.</p><p>A solução deste problema é mostrada em duas etapas. Inicialmente, é apresentado um algo-</p><p>ritmo em passos gerais para dar uma visão global da solução. Depois, cada um dos passos é</p><p>detalhado, dando origem ao algoritmo completo.</p><p>Algoritmo UmaVenda – PASSOS GERAIS</p><p>{PROCESSA UMA VENDA DE LIVROS}</p><p>Entradas: tipo do livro ('A', 'B' ou 'C')</p><p>número de livros</p><p>Saídas: preço a pagar</p><p>mensagem indicando que foram vendidas mais de 10 unidades</p><p>1. Obter dados</p><p>2. Calcular preço de venda</p><p>3. Emitir mensagem caso necessário</p><p>4. Terminar</p><p>Detalhamento do algoritmo:</p><p>Algoritmo UmaVenda</p><p>{PROCESSA UMA VENDA DE LIVROS}</p><p>Entradas: código (caractere) {CÓDIGO DO LIVRO}</p><p>numeroUnidades (inteiro) {NR. UNIDADES VENDIDAS}</p><p>Saídas: aPagar (real) {PREÇO A PAGAR}</p><p>{Mensagem indicando que foram vendidas mais de 10</p><p>unidades}</p><p>início</p><p>ler(código, numeroUnidades) {ENTRADA DE DADOS}</p><p>se código = 'A' {CÁLCULO DO PREÇO DA VENDA}</p><p>então aPagar ← numeroUnidades * 10</p><p>senão se código = 'B'</p><p>então aPagar ← numeroUnidades * 20</p><p>senão se código = 'C'</p><p>então aPagar ← numeroUnidades * 30</p><p>senão início {CÓDIGO ESTÁ INCORRETO}</p><p>aPagar ← 0</p><p>escrever('Código errado')</p><p>fim</p><p>se aPagar > 0 {CÓDIGO ERA VÁLIDO}</p><p>então início</p><p>escrever(aPagar) {INFORMA VALOR A PAGAR}</p><p>se numeroUnidades > 10</p><p>então escrever ('Foram vendidas mais de 10 unidades')</p><p>fim</p><p>fim</p><p>Edelweiss_04.indd 102 12/03/14 09:03</p><p>203 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais de Múltipla Escolha (pseudocodigo) PARTE 4</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 103</p><p>exercício 4.4 Processar uma venda em um estabelecimento comercial. São fornecidos o</p><p>código do produto vendido e seu preço. Deverá ser dado um desconto, de acordo com a</p><p>seguinte tabela:</p><p>Código A – 20%</p><p>Código B – 10%</p><p>Produtos com código diferente de A ou B não terão desconto. Além disso, se o total a pagar</p><p>for maior ou igual a R$ 80,00, deverá ser dado um desconto adicional de 10%. Calcular e</p><p>informar o preço a pagar e o desconto dado na compra, se for o caso.</p><p>Algoritmo UmaVendaComércio</p><p>{PROCESSA UMA VENDA EM UM ESTABELECIMENTO COMERCIAL}</p><p>Entradas: preço (real)</p><p>código (caractere)</p><p>Saídas: desconto (real)</p><p>aPagar (real)</p><p>início</p><p>ler(código, preço) {ENTRADA DE DADOS}</p><p>aPagar ← preço {INICIALIZA aPagar}</p><p>desconto ← 0 {INICIALIZA desconto}</p><p>se código = 'A' {CALCULA desconto}</p><p>então desconto ← preço / 5</p><p>senão se código = 'B'</p><p>então desconto ← preço / 10</p><p>aPagar ← aPagar – desconto {CALCULA aPagar}</p><p>se aPagar ≥ 80,00 {VERIFICA SE COMPRA ≥ 80,00}</p><p>então início</p><p>desconto ← desconto + aPagar / 10</p><p>aPagar ← aPagar * 0,9 {MAIS 10% DE DESCONTO}</p><p>fim</p><p>escrever(aPagar) {INFORMA VALOR A PAGAR}</p><p>se desconto ≠ 0</p><p>então escrever(desconto) {INFORMA DESCONTO RECEBIDO}</p><p>fim</p><p>exercício 4.5 Escrever um programa que, dados um determinado mês (representado por um</p><p>número inteiro) e um ano, informe quantos dias tem esse mês. Para determinar o número de</p><p>dias de fevereiro, verificar primeiro se o ano é bissexto. Um ano será bissexto se terminar em</p><p>00 e for divisível por 400, ou se não terminar por 00, mas for divisível por 4.</p><p>Algoritmo DiasDoMês1</p><p>{INFORMA QUANTOS DIAS TEM UM DETERMINADO MÊS}</p><p>Entrada: mês, ano (inteiro) {DADOS DE ENTRADA – MÊS E ANO}</p><p>Saída: dias (inteiro) {NÚMERO DE DIAS DO MÊS NESTE ANO}</p><p>Variável auxiliar: ehBissexto (lógica)</p><p>Edelweiss_04.indd 103 12/03/14 09:03</p><p>ALGORITMOS E PROGRAMAÇÃO204 104 Algoritmos e Programação com Exemplos em Pascal e C</p><p>início</p><p>ler(mês, ano) {ENTRADA DE DADOS}</p><p>se mês = 2 {SE FEVEREIRO, VERIFICA SE ANO EH BISSEXTO}</p><p>início</p><p>eh Bissexto ← falso</p><p>se (ano mod 100) = 0</p><p>então início</p><p>se (ano mod 400) = 0</p><p>então ehBissexto ← verdadeiro</p><p>fim</p><p>senão se (ano mod 4) = 0</p><p>então ehBissexto ← verdadeiro</p><p>fim</p><p>se mês = 2 {FEVEREIRO}</p><p>então se ehBissexto</p><p>então dias ← 29</p><p>senão dias ← 28</p><p>senão se (mês=4) ou (mês=6) ou (mês=9) ou (mês=11)</p><p>então dias ← 30 {ABRIL, JUNHO, SETEMBRO, NOVEMBRO}</p><p>senão dias ← 31 {DEMAIS MESES}</p><p>escrever(dias) {INFORMA NÚMERO DE DIAS DO MÊS}</p><p>fim</p><p>Algoritmo DiasDoMês2</p><p>{INFORMA QUANTOS DIAS TEM UM DETERMINADO MÊS}</p><p>Entrada: mês, ano (inteiro) {DADOS DE ENTRADA – MÊS E ANO}</p><p>Saída: dias (inteiro) {NÚMERO DE DIAS DO MÊS NESTE ANO}</p><p>Variável auxiliar: ehBissexto (lógica)</p><p>início</p><p>ler(mês, ano) {ENTRADA DE DADOS}</p><p>caso mês seja</p><p>2 : {FEVEREIRO}</p><p>eh_Bissexto ← falso</p><p>se (ano mod 100) = 0</p><p>então início</p><p>se (ano mod 400) = 0</p><p>então ehBissexto ← verdadeiro</p><p>fim</p><p>senão se (ano mod 4) = 0</p><p>então ehBissexto ← verdadeiro</p><p>se ehBissexto</p><p>então dias ← 29 {ANO BISSEXTO}</p><p>senão dias ← 28</p><p>4, 6, 9, 11 : dias ← 30 {ABRIL, JUNHO, SETEMBRO, NOVEMBRO}</p><p>Edelweiss_04.indd 104 12/03/14 09:03</p><p>205 Técnicas de Integração UNIDADE 3</p><p>Comandos Condicionais de Múltipla Escolha (pseudocodigo) PARTE 4</p><p>Capítulo 4 Estruturas Condicionais e de Seleção 105</p><p>senão dias ← 31 {DEMAIS MESES}</p><p>fim caso {FIM COMANDO DE SELEÇÃO MÚLTIPLA}</p><p>escrever(dias) {INFORMA NÚMERO DE DIAS DO MÊS}</p><p>fim</p><p>exercício 4.6 Fazer um programa que leia um caractere e exiba uma mensagem informando</p><p>se ele é uma letra, um dígito numérico ou um caractere de operação aritmética. Se o caractere</p><p>não for de qualquer desses três tipos, informar que se trata de um caractere desconhecido.</p><p>Algoritmo IdentificarCaractere</p><p>{INFORMA TIPO DE CARACTERE LIDO}</p><p>Entradas: lido (caractere) {CARACTERE A SER IDENTIFICADO}</p><p>Saídas: Mensagem indicando o tipo de caractere lido</p><p>início</p><p>ler(lido) {CARACTERE A SER IDENTIFICADO}</p><p>caso lido seja</p><p>'A'..'Z', 'a'..'z' : escrever('Letra')</p><p>'0'..'9': escrever('Dígito')</p><p>'+', '-', '*', '/' : escrever('Operador aritmético')</p><p>senão escrever('Caractere desconhecido')</p><p>fim caso</p><p>fim</p><p>Sugestão: resolva este exercício sem utilizar o comando de seleção múltipla.</p><p>Edelweiss_04.indd 105 12/03/14 09:03</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>4</p><p>Comandos Interativos</p><p>Prezado estudante,</p><p>Estamos começando uma unidade desta disciplina. Os textos que a compõem foram</p><p>organizados com cuidado e atenção, para que você tenha contato com um conteúdo</p><p>completo e atualizado tanto quanto possível. Leia com dedicação, realize as atividades e</p><p>tire suas dúvidas com os tutores. Dessa forma, você, com certeza, alcançará os objetivos</p><p>propostos para essa disciplina.</p><p>OBJETIVO GERAL</p><p>Identificar problemas que precisem de repetição (laços) para construção da solução</p><p>algorítmica.</p><p>OBJETIVOS ESPECÍFICOS</p><p>• Compreender o funcionamento dos comandos de repetição.</p><p>• Reconhecer o funcionamento da estrutura while.</p><p>• Implementar programas de computador usando o for.</p><p>• Entender como a estrutura dowhile funciona.</p><p>ALGORITMOS E PROGRAMAÇÃO208</p><p>ANOTAÇÕES</p><p>unidade</p><p>4</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 1</p><p>Estrutura de Repetição</p><p>Enquanto. (Fluxograma)</p><p>ALGORITMOS E PROGRAMAÇÃO210 126 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Nos algoritmos vistos nos capítulos anteriores, os comandos são executados em sequência,</p><p>um após o outro, uma única vez ou até mesmo nenhuma vez, dependendo de uma condição</p><p>especificada. Este capítulo introduz uma nova situação, bastante comum na programação:</p><p>sequências de comandos que são executados repetidas vezes. O número de repetições pode</p><p>ser conhecido a priori ou pode estar associado à ocorrência de uma condição que se verifique</p><p>ao longo do processamento.</p><p>No capítulo anterior, foi resolvido o problema do cálculo da média aritmética de três notas de</p><p>um aluno, com a determinação de sua aprovação ou reprovação, complementado ainda pelo</p><p>cálculo do conceito correspondente à média obtida. Com frequência, esse processo é repetido</p><p>para um número determinado de alunos de uma turma. Nesse caso, os dados de cada aluno</p><p>são obtidos, processados e informados de forma semelhante, porém de forma independente,</p><p>sendo esse processo repetido tantas vezes quantos forem os alunos da turma – um número</p><p>conhecido, utilizado como limite no controle das repetições.</p><p>Existem também situações em que o número de repetições de um conjunto de comandos não</p><p>pode ser estabelecido previamente. No exemplo de cálculo dos conceitos, mesmo conhecen-</p><p>do-se o número total de alunos da turma pode acontecer de não se ter as notas de todos</p><p>eles,</p><p>porque um ou mais deixou de fazer as provas ou desistiu do curso. Quando não se desejar</p><p>processar os dados de todos os alunos, o final da entrada de dados pode ser limitado através,</p><p>por exemplo, do fornecimento de um conjunto de notas com valores nulos, ou do código</p><p>correspondente ao último aluno a ser analisado. Portanto, nos casos em que o número de re-</p><p>petições não é previamente conhecido, o encerramento das repetições é controlado por uma</p><p>condição que é verificada ao longo do processamento.</p><p>As sequências de comandos que são repetidas duas ou mais vezes são também chamadas de</p><p>laços de repetição. Para criar um laço de repetição, além da ação ou ações que nele devam</p><p>ser executadas, devem ser definidos:</p><p>1. uma forma para indicar o retorno a um ponto determinado do código, para repetir o laço</p><p>(o que, até este momento, não esteve disponível);</p><p>2. um recurso para registrar o número de vezes que o laço foi realizado, o que remete para</p><p>o uso de um contador a ser alterado cada vez que o laço for executado;</p><p>3. uma condição que, testada ao final da execução do laço, permita determinar se ele deve</p><p>ser repetido novamente ou não.</p><p>Os elementos acima são, em sua maioria, fornecidos nos comandos iterativos que permitem</p><p>implementar repetições. São eles: comando de repetição por contagem, comando de repe-</p><p>tição condicional por avaliação prévia de condição e comando de repetição condicional por</p><p>avaliação posterior de condição.</p><p>5.1 conceito de contador</p><p>O conceito de uma variável que atua como um contador está relacionado a repetições por</p><p>contagem. Esse é o caso, por exemplo, de uma roleta colocada na entrada de um centro de</p><p>Edelweiss_05.indd 126 12/03/14 09:02</p><p>211 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Enquanto. (Fluxograma) PARTE 1</p><p>Capítulo 5 Estruturas de Repetição 127</p><p>eventos com a finalidade de contar quantas pessoas entram no local. A roleta, inicialmente</p><p>zerada, soma uma unidade a cada pessoa que por ela passa. Essa informação permite inclu-</p><p>sive que a entrada de clientes seja encerrada quando o número registrado pela roleta atingir</p><p>a lotação máxima.</p><p>Dessa forma, uma variável do tipo contador pode ser utilizada tanto para contabilizar o nú-</p><p>mero de ocorrências de determinada ação como para determinar o seu encerramento. O</p><p>contador deve ser sempre:</p><p>1. inicializado, normalmente com o valor zero, antes de iniciar a contagem:</p><p>contador ← 0</p><p>2. incrementado, sempre que uma nova ocorrência do que está sendo contado for identi-</p><p>ficada ou processada. A forma de incrementar um contador é atribuindo a ele seu valor</p><p>atual, incrementado de uma unidade:</p><p>contador ← contador + 1</p><p>5.2 comando de repetição por contagem para/faça</p><p>O comando de repetição por contagem para/faça faz que a execução de uma ação,</p><p>ou grupo de ações, seja repetida um número predefinido de vezes. Isso é feito vinculando a</p><p>execução de um ou mais comandos ao valor de uma variável de controle, com funcionamento</p><p>análogo ao de um contador. O controle das repetições é definido através de um cabeçalho,</p><p>no qual são definidos o nome da variável de controle, seus valores inicial e final, e o valor do</p><p>incremento que a variável de controle deve receber após cada repetição.</p><p>A sintaxe do comando repetição por contagem para/faça é:</p><p>para <variável de controle> de <valor inicial> [ incr <valor do incre-</p><p>mento> ] até <valor final> faça</p><p><comando></p><p>Apenas variáveis ordinais simples podem ser utilizadas como variáveis de controle. Nesse tipo</p><p>de variável, os valores válidos integram um conjunto ordenado de valores discretos, ou seja,</p><p>se forem considerados três valores em sequência, entre o primeiro e o terceiro valor existi-</p><p>rá tão somente um valor. Variáveis inteiras e tipo caractere são exemplos de variáveis ordinais</p><p>simples.</p><p>Os valores inicial e final devem ser do mesmo tipo da variável de controle. Por exemplo, no</p><p>cabeçalho:</p><p>para i de 1 incr 1 até 10 faça</p><p>a variável de controle i deve ser inteira. Já no cabeçalho:</p><p>para letra de 'a' incr 1 até 'm' faça</p><p>a variável de controle letra deve ser do tipo caractere.</p><p>Edelweiss_05.indd 127 12/03/14 09:02</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>4</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 2</p><p>Estrutura de Repetição Para.</p><p>(fluxograma)</p><p>ALGORITMOS E PROGRAMAÇÃO214</p><p>Capítulo 5 Estruturas de Repetição 127</p><p>eventos com a finalidade de contar quantas pessoas entram no local. A roleta, inicialmente</p><p>zerada, soma uma unidade a cada pessoa que por ela passa. Essa informação permite inclu-</p><p>sive que a entrada de clientes seja encerrada quando o número registrado pela roleta atingir</p><p>a lotação máxima.</p><p>Dessa forma, uma variável do tipo contador pode ser utilizada tanto para contabilizar o nú-</p><p>mero de ocorrências de determinada ação como para determinar o seu encerramento. O</p><p>contador deve ser sempre:</p><p>1. inicializado, normalmente com o valor zero, antes de iniciar a contagem:</p><p>contador ← 0</p><p>2. incrementado, sempre que uma nova ocorrência do que está sendo contado for identi-</p><p>ficada ou processada. A forma de incrementar um contador é atribuindo a ele seu valor</p><p>atual, incrementado de uma unidade:</p><p>contador ← contador + 1</p><p>5.2 comando de repetição por contagem para/faça</p><p>O comando de repetição por contagem para/faça faz que a execução de uma ação,</p><p>ou grupo de ações, seja repetida um número predefinido de vezes. Isso é feito vinculando a</p><p>execução de um ou mais comandos ao valor de uma variável de controle, com funcionamento</p><p>análogo ao de um contador. O controle das repetições é definido através de um cabeçalho,</p><p>no qual são definidos o nome da variável de controle, seus valores inicial e final, e o valor do</p><p>incremento que a variável de controle deve receber após cada repetição.</p><p>A sintaxe do comando repetição por contagem para/faça é:</p><p>para <variável de controle> de <valor inicial> [ incr <valor do incre-</p><p>mento> ] até <valor final> faça</p><p><comando></p><p>Apenas variáveis ordinais simples podem ser utilizadas como variáveis de controle. Nesse tipo</p><p>de variável, os valores válidos integram um conjunto ordenado de valores discretos, ou seja,</p><p>se forem considerados três valores em sequência, entre o primeiro e o terceiro valor existi-</p><p>rá tão somente um valor. Variáveis inteiras e tipo caractere são exemplos de variáveis ordinais</p><p>simples.</p><p>Os valores inicial e final devem ser do mesmo tipo da variável de controle. Por exemplo, no</p><p>cabeçalho:</p><p>para i de 1 incr 1 até 10 faça</p><p>a variável de controle i deve ser inteira. Já no cabeçalho:</p><p>para letra de 'a' incr 1 até 'm' faça</p><p>a variável de controle letra deve ser do tipo caractere.</p><p>Edelweiss_05.indd 127 12/03/14 09:02</p><p>215 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Para. (Fluxograma) PARTE 2</p><p>128 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Observar que somente um comando, simples ou composto, pode ser utilizado após o cabeça-</p><p>lho na pseudolinguagem. Assim, sempre que se quiser repetir um conjunto de comandos, de-</p><p>verá ser utilizado um comando composto. Exemplo de utilização de um comando composto:</p><p>para i de 1 incr 1 até 10 faça</p><p>início</p><p>ler(valor)</p><p>escrever(valor)</p><p>fim</p><p>execução do comando para/faça. A execução do comando para/faça inicia pela atri-</p><p>buição do valor inicial à variável de controle. A seguir, o conteúdo da variável de controle</p><p>é comparado com o valor final: se o valor atual da variável de controle ultrapassou o valor</p><p>estabelecido como final, o comando para/faça é encerrado; se não ultrapassou o valor final</p><p>(é menor ou igual e ele), o comando a ser repetido é executado, lembrando que esse pode</p><p>ser um comando composto. Uma vez terminada a execução</p><p>do laço, a variável de controle</p><p>tem seu valor atualizado de acordo com o incremento definido (que pode ser positivo ou</p><p>negativo) e o fluxo de execução retorna à comparação dos conteúdos da variável de controle</p><p>com o valor estabelecido como final. Esse processo é repetido até que a variável de controle</p><p>ultrapasse o valor final. O número de vezes que o comando será repetido é determinado pela</p><p>relação existente entre valor inicial, incremento e valor final. A Figura 5.1 representa o fluxo-</p><p>grama referente à execução interna do comando de repetição para/faça.</p><p>Observar que, dependendo do valor inicial atribuído à variável de controle, o laço de repetição</p><p>pode não ser executado nem uma única vez. No exemplo a seguir, o valor inicial da variável</p><p><incrementa variável</p><p>de controle></p><p><inicialização da</p><p>variável de</p><p>controle></p><p><alcançou condição</p><p>de término? ></p><p>verdadeiro</p><p>falso</p><p><executa comando</p><p>do laço></p><p>figura 5.1 Fluxograma de execução interna do comando de repetição para/faça.</p><p>Edelweiss_05.indd 128 12/03/14 09:02</p><p>ALGORITMOS E PROGRAMAÇÃO216 Capítulo 5 Estruturas de Repetição 129</p><p>de controle já é superior ao seu valor final. Isso faz que o comando seja terminado sem que o</p><p>comando interno seja executado:</p><p>para i de 5 incr 1 até 3 faça</p><p>escrever (i)</p><p>■ representação do comando para/faça em fluxogramas.</p><p>O comando para/faça é representado em fluxogramas por um bloco especial, compreen-</p><p>dendo um losango com um retângulo acoplado, onde são mostrados a variável de controle,</p><p>seu valor inicial, seu incremento ou decremento e o teste que determina o término de sua</p><p>execução. A partir desse bloco, o fluxo do programa pode seguir dois caminhos: pela linha</p><p>vertical, que leva ao(s) comando(s) a ser(em) repetido(s); ou pela horizontal, que leva para o</p><p>comando seguinte quando terminarem as repetições, conforme mostrado na Figura 5.2. Lem-</p><p>brar que, se o laço de repetição contiver mais de um comando, eles deverão ser agrupados</p><p>em um comando composto. A Figura 5.3 mostra o fluxograma do exemplo anterior, em que</p><p>a leitura e a escrita de uma variável são repetidas 10 vezes.</p><p>valores inicial, final e incremento definidos por expressões. Os valores inicial, final e</p><p>do incremento podem ser definidos explicitamente ou através do resultado de uma expres-</p><p>são. Caso seja utilizada uma expressão, seu resultado deve ser do mesmo tipo da variável de</p><p>controle. As expressões contidas no cabeçalho de um comando para/faça são avaliadas</p><p>somente uma vez, no início da sua execução. Por exemplo, considerando as variáveis inteiras</p><p>i, var1 e var2, o cabeçalho:</p><p>para i de var1 incr 1 até (7 + var2) faça</p><p><comando></p><p><teste de término></p><p>verdadeiro</p><p>falso</p><p><inicialização></p><p><incremento ou</p><p>decremento></p><p>figura 5.2 Fluxograma do comando para/faça.</p><p>Edelweiss_05.indd 129 12/03/14 09:02</p><p>217 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Para. (Fluxograma) PARTE 2</p><p>130 Algoritmos e Programação com Exemplos em Pascal e C</p><p>indica que a variável de controle i é inicializada com o valor contido na variável var1 e que</p><p>o valor final é o resultado da expressão (7 + var2), avaliada no início do comando. Mes-</p><p>mo que o valor de var2 seja alterado durante a execução do comando para/faça, o valor</p><p>calculado para o limite final não será alterado. As expressões contidas no cabeçalho podem</p><p>também apresentar variáveis iguais, como no exemplo a seguir:</p><p>para i de var1 até (var1 + 10) faça</p><p>O valor do incremento deve ser inteiro e diferente de zero, podendo ser positivo ou negativo.</p><p>Quando o incremento for positivo, o valor inicial da variável de controle deve ser menor ou</p><p>igual ao valor final; quando for negativo, o valor inicial deve ser maior ou igual ao valor final</p><p>para que o comando seja executado pelo menos uma vez. Caso o valor do incremento seja 1,</p><p>sua definição pode ser omitida. Exemplos:</p><p>para i de 1 incr 2 até 10 faça {INCREMENTO POSITIVO}</p><p>escrever (i)</p><p>para i de 7 incr -1 até 3 faça {INCREMENTO NEGATIVO}</p><p>escrever (i)</p><p>para i de 1 até 10 faça {INCREMENTO +1 FICA IMPLÍCITO}</p><p>escrever (i)</p><p>utilização da variável de controle dentro do laço. Como mostrado nos últimos exem-</p><p>plos, a variável de controle pode ser utilizada nos comandos dentro do laço de repetição.</p><p>Embora seja permitido, não é aconselhável alterar o valor da variável de controle dentro do</p><p>i > 10</p><p>verdadeiro</p><p>falso</p><p>i 1</p><p>i + 1i</p><p>ENTRADA</p><p>valor</p><p>SAÍDA</p><p>valor</p><p>figura 5.3 Exemplo de fluxograma com comando para/faça.</p><p>Edelweiss_05.indd 130 12/03/14 09:02</p><p>ALGORITMOS E PROGRAMAÇÃO218 Capítulo 5 Estruturas de Repetição 131</p><p>laço, pois isso poderia alterar a quantidade de repetições a serem realizadas. A alteração</p><p>explícita do conteúdo da variável de controle, através de uma atribuição incluída dentro do</p><p>laço, faz que, em cada repetição, a variável de controle seja alterada duas vezes: a primeira</p><p>vez através do comando inserido no laço e a segunda controlada pelo comando para/faça.</p><p>Por exemplo, o comando</p><p>para var_contr de 1 incr 1 até 10 faça</p><p>início</p><p>var_contr ← var_contr + 1</p><p>escrever (var_contr)</p><p>fim</p><p>exibe somente os valores pares: a variável de controle var_contr é inicializada em 1, valor</p><p>com o qual é executado o comando composto. O primeiro comando contido no comando</p><p>composto incrementa novamente var_contr, que passa a valer 2, valor que é então exibido.</p><p>O controle volta ao comando para/faça, onde var_contr é novamente incrementada em</p><p>uma unidade, passando a valer 3. Novamente é incrementada no corpo do comando, passan-</p><p>do a valer 4, e o valor é apresentado. O último valor informado será 10. Observar que, mesmo</p><p>se utilizado intencionalmente, esse recurso descaracteriza a estrutura do comando de repeti-</p><p>ção para/faça, não sendo, por isso, considerado adequado pela programação estruturada.</p><p>exemplo. O Algoritmo 4.4, visto no Capítulo 4, mostra o processo completo para a obten-</p><p>ção das notas de um aluno, bem como cálculo e informação da média e conceito obtidos.</p><p>Observando as entradas e saídas especificadas nesse algoritmo, vê-se como entradas as variá-</p><p>veis nota1, nota2, nota3 e, como saídas, as variáveis média e conceito. Esses dados se refe-</p><p>rem a um único aluno. Mas, e se a turma for composta de 30 alunos? Sem utilizar repetição,</p><p>seriam necessárias cinco variáveis para cada aluno, num total de 150 variáveis. Contudo, os</p><p>comandos a serem repetidos se referem ao processamento de um único aluno, isto é, a leitura</p><p>de três notas, o cálculo da média, o cálculo do conceito e a informação da média e do con-</p><p>ceito obtidos por esse aluno. No caso de 30 alunos, esse procedimento deverá ser repetido 30</p><p>vezes, cada repetição correspondendo ao processamento completo das informações de um</p><p>aluno. As mesmas áreas de memória podem ser preenchidas em diferentes momentos com</p><p>diferentes conteúdos, uma vez que os dados de cada aluno são processados isoladamente</p><p>e de forma independente. Assim, a solução do problema é obtida através da repetição, por</p><p>30 vezes, dos mesmos comandos utilizados no Algoritmo 4.4. O Algoritmo 5.1 mostra esse</p><p>processamento, identificando cada aluno pela sua ordem.</p><p>Algoritmo 5.1 – Média30</p><p>{INFORMA MÉDIA E CONCEITO DOS 30 ALUNOS DE UMA TURMA}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: aluno (inteiro)</p><p>média (real)</p><p>conceito (caractere)</p><p>Variável auxiliar: aluno (inteiro) {VARIÁVEL DE CONTROLE}</p><p>início</p><p>para aluno de 1 incr 1 até 30 faça {INICIAL, INCREM E FINAL}</p><p>Edelweiss_05.indd 131 12/03/14 09:02</p><p>219 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Para. (Fluxograma) PARTE 2</p><p>132 Algoritmos e Programação com Exemplos em Pascal e C</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1 + nota2 + nota3)</p><p>/ 3 {CALCULA MÉDIA}</p><p>escrever (aluno, média) {INFORMA ORDEM DO ALUNO E SUA MÉDIA}</p><p>se média ≥ 9 {CÁLCULO DO CONCEITO}</p><p>então conceito ← 'A'</p><p>senão se média ≥ 7,5</p><p>então conceito ← 'B'</p><p>senão se média ≥ 6,0</p><p>então conceito ← 'C'</p><p>senão conceito ← 'D' {MÉDIA < 6}</p><p>escrever (conceito) {INFORMA CONCEITO}</p><p>fim {PARA/FAÇA}</p><p>fim</p><p>utilização de constantes no cabeçalho. O valor final utilizado em comandos de repetição</p><p>por contagem costuma corresponder ao número de elementos envolvidos no problema em</p><p>questão. No exemplo anterior, o valor final 30 corresponde ao número de alunos a processar.</p><p>Se o desejado fosse, no mesmo exemplo, calcular a média da turma, seria utilizado esse mes-</p><p>mo valor como divisor da expressão aritmética, onde a soma das médias individuais obtidas</p><p>por cada aluno seria dividida pelo número de alunos considerados. E esse mesmo valor seria</p><p>utilizado em outras sequências de instruções envolvendo o processamento de informações</p><p>referentes a essa turma. Consequentemente, a alteração do número de alunos processados</p><p>implicaria na alteração do valor 30 em diferentes pontos do programa. Essas alterações, além</p><p>de trabalhosas, podem gerar erros de execução resultantes da utilização equivocada desse</p><p>valor em algum ponto do programa. Para evitar esse problema, aconselha-se a declaração e a</p><p>utilização de uma constante (Seção 2.2.3) contendo esse valor, evitando assim a necessidade</p><p>de especificações e alterações repetidas em diferentes pontos do programa. Também o valor</p><p>inicial da variável de controle pode ser definido através de uma constante, facilitando sua</p><p>alteração.</p><p>O Algoritmo 5.2 mostra a utilização de constantes em comandos para/faça. Aqui, a cons-</p><p>tante NALUNOS é utilizada como limite do laço de repetições e como divisor no cálculo da</p><p>média das notas da turma. Notar que o conteúdo atual da variável de controle é usado dentro</p><p>do laço de repetições para informar o número sequencial do aluno cuja média está sendo</p><p>mostrada.</p><p>Algoritmo 5.2 – MédiaAlunoETurma</p><p>{INFORMA MÉDIA DOS ALUNOS DE UMA TURMA E A MÉDIA GERAL DESTA TURMA}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas:</p><p>média (real)</p><p>média_turma (real)</p><p>Variáveis auxiliares:</p><p>contador (inteiro) {VARIÁVEL DE CONTROLE}</p><p>Edelweiss_05.indd 132 12/03/14 09:02</p><p>ALGORITMOS E PROGRAMAÇÃO220 Capítulo 5 Estruturas de Repetição 133</p><p>soma_médias (real)</p><p>Constante: NALUNOS = 30 {NÚMERO DE ALUNOS DA TURMA}</p><p>início</p><p>soma_médias ← 0 {SOMA MÉDIAS INDIVIDUAIS: VALOR INICIAL ZERO}</p><p>para contador de 1 incr 1 até NALUNOS faça</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever (contador, média) {INFORMA NÚMERO DO ALUNO E MÉDIA}</p><p>soma_médias ← soma_médias + média {SOMA DAS MÉDIAS}</p><p>fim</p><p>média_turma ← soma_médias / NALUNOS {MÉDIA DA TURMA}</p><p>escrever (média_turma)</p><p>fim</p><p>5.2.1 aninhamento de comandos para/faça</p><p>Qualquer comando pode ser incluído no laço de repetição, inclusive outro comando</p><p>para/faça. Quando ocorre o aninhamento de comandos para/faça, a cada iteração do</p><p>laço externo, o laço interno é executado de forma completa.</p><p>No trecho de algoritmo a seguir, a tabuada dos números 1 a 10 é gerada a partir do aninha-</p><p>mento de comandos para/faça. Observar a inclusão dos comentários sinalizando o final dos</p><p>laços. Os comentários, embora não obrigatórios, aumentam a legibilidade dos algoritmos e</p><p>programas que incluem aninhamentos, funcionando de forma complementar à indentação.</p><p>para multiplicando de 1 incr 1 até 10 faça {LAÇO EXTERNO}</p><p>início</p><p>escrever ('Tabuada de', multiplicando)</p><p>para multiplicador de 1 incr 1 até 10 faça</p><p>início {LAÇO DA GERAÇÃO DA TABUADA DE MULTIPLICANDO}</p><p>produto ← multiplicando * multiplicador</p><p>escrever (multiplicando, ' X ', multiplicador, ' = ', produto)</p><p>fim {DO LAÇO DO MULTIPLICADOR}</p><p>fim {DO LAÇO DO MULTIPLICANDO}</p><p>Nesse outro exemplo de aninhamento de comandos para/faça, a variável de controle do</p><p>laço externo é incrementada até um valor constante e a variável de controle do laço interno é</p><p>decrementada até o valor corrente da variável de controle do laço externo:</p><p>para n1 de 1 incr +1 até 2 faça {LAÇO EXTERNO}</p><p>para n2 de 3 incr -1 até n1 faça {LAÇO INTERNO}</p><p>escrever(n1, n2)</p><p>Edelweiss_05.indd 133 12/03/14 09:02</p><p>221 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Para. (Fluxograma) PARTE 2</p><p>134 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Os valores de n1 e n2 mostrados pelo comando escrever seriam:</p><p>1 3</p><p>1 2</p><p>1 1</p><p>2 3</p><p>2 2</p><p>O aninhamento de repetições também ocorre quando é utilizado um comando composto</p><p>que contenha outro comando para/faça. Nesse caso, a cada repetição são executados os</p><p>comandos que compõem o comando composto, na ordem definida, e todas as repetições do</p><p>comando para/faça interno. Por exemplo, no comando:</p><p>para k de 1 incr 1 até 10 faça {LAÇO EXTERNO}</p><p>início {COMANDO COMPOSTO}</p><p>ler (número)</p><p>para valor de 1 incr 1 até número faça</p><p>{PARA/FAÇA INTERNO AO COMANDO COMPOSTO}</p><p>escrever(valor)</p><p>fim</p><p>para cada valor do laço externo, a cada uma das 10 execuções do laço externo, é lido um</p><p>novo valor para a variável número, que serve de limite para a repetição do laço interno.</p><p>5.3 comando de repetição condicional enquanto/faça</p><p>por avaliação prévia de condição</p><p>Existem situações em que as repetições não estão condicionadas a um número definido de vezes.</p><p>Por exemplo, em uma loja, não é possível saber quantas vendas ocorrerão ao longo de um dia,</p><p>mas se sabe que essas serão encerradas no horário definido para que a loja feche suas portas.</p><p>O processamento de cada venda (registro do valor da venda, do vendedor que efetuou a venda,</p><p>etc.) é semelhante, compondo um conjunto de comandos a serem repetidos. A repetição nesse</p><p>caso está condicionada à ocorrência de duas condições: venda efetuada e horário adequado.</p><p>O comando de repetição condicional enquanto/faça faz que um comando, simples</p><p>ou composto, tenha sua execução condicionada ao resultado de uma expressão lógica, isto</p><p>é, a execução desse comando é repetida enquanto o valor lógico resultante da avaliação da</p><p>expressão de controle for verdadeiro. A sintaxe de um comando de repetição condicional</p><p>enquanto/faça é:</p><p>enquanto <expressão lógica> faça</p><p><comando></p><p>A Figura 5.4 representa o fluxograma referente ao comando de repetição condicional</p><p>enquanto/faça.</p><p>O laço nunca será executado caso o valor inicial da expressão lógica seja falso logo de início,</p><p>já que a avaliação da condição de controle ocorre antes da execução do comando a ser repe-</p><p>Edelweiss_05.indd 134 12/03/14 09:02</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>4</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 3</p><p>Estrutura de Repetição</p><p>Enquanto. (Pseudocódigo)</p><p>ALGORITMOS E PROGRAMAÇÃO224</p><p>134 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Os valores de n1 e n2 mostrados pelo comando escrever seriam:</p><p>1 3</p><p>1 2</p><p>1 1</p><p>2 3</p><p>2 2</p><p>O aninhamento de repetições também ocorre quando é utilizado um comando composto</p><p>que contenha outro comando para/faça. Nesse caso, a cada repetição são executados os</p><p>comandos que compõem o comando composto, na ordem definida, e todas as repetições do</p><p>comando para/faça interno. Por exemplo, no comando:</p><p>para k de 1 incr 1 até 10 faça {LAÇO EXTERNO}</p><p>início {COMANDO COMPOSTO}</p><p>ler (número)</p><p>para valor de 1 incr 1 até número faça</p><p>{PARA/FAÇA INTERNO AO COMANDO COMPOSTO}</p><p>escrever(valor)</p><p>fim</p><p>para cada valor do laço externo, a cada uma das 10 execuções do laço externo,</p><p>é lido um</p><p>novo valor para a variável número, que serve de limite para a repetição do laço interno.</p><p>5.3 comando de repetição condicional enquanto/faça</p><p>por avaliação prévia de condição</p><p>Existem situações em que as repetições não estão condicionadas a um número definido de vezes.</p><p>Por exemplo, em uma loja, não é possível saber quantas vendas ocorrerão ao longo de um dia,</p><p>mas se sabe que essas serão encerradas no horário definido para que a loja feche suas portas.</p><p>O processamento de cada venda (registro do valor da venda, do vendedor que efetuou a venda,</p><p>etc.) é semelhante, compondo um conjunto de comandos a serem repetidos. A repetição nesse</p><p>caso está condicionada à ocorrência de duas condições: venda efetuada e horário adequado.</p><p>O comando de repetição condicional enquanto/faça faz que um comando, simples</p><p>ou composto, tenha sua execução condicionada ao resultado de uma expressão lógica, isto</p><p>é, a execução desse comando é repetida enquanto o valor lógico resultante da avaliação da</p><p>expressão de controle for verdadeiro. A sintaxe de um comando de repetição condicional</p><p>enquanto/faça é:</p><p>enquanto <expressão lógica> faça</p><p><comando></p><p>A Figura 5.4 representa o fluxograma referente ao comando de repetição condicional</p><p>enquanto/faça.</p><p>O laço nunca será executado caso o valor inicial da expressão lógica seja falso logo de início,</p><p>já que a avaliação da condição de controle ocorre antes da execução do comando a ser repe-</p><p>Edelweiss_05.indd 134 12/03/14 09:02</p><p>225 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Enquanto. (Pseudocódigo) PARTE 3</p><p>136 Algoritmos e Programação com Exemplos em Pascal e C</p><p>5.3.1 sinalização de final de dados</p><p>Para exemplificar o uso do comando enquanto/faça, considere uma situação em que o</p><p>número de alunos que terão as notas processadas é desconhecido. Neste caso, como saber</p><p>quando encerrar o processo de leitura de notas, cálculo de média e informação da média</p><p>obtida pelo aluno? O encerramento de um comando de repetição condicional que inclui a</p><p>entrada dos dados a serem processados pode ser implementado de três formas, apresentadas</p><p>a seguir.</p><p>marca de parada no último dado válido. Define-se, dentre os valores a serem lidos,</p><p>qual o último valor que deve ser processado, valor esse que funciona como marca de parada.</p><p>Como essa marca de parada é um dado válido, só depois de processá-la e de processar os</p><p>demais dados a ela associados é que o processamento deve ser encerrado. No exemplo das</p><p>notas de alunos, esse controle poderia ser o código do último aluno a ser processado, como</p><p>mostrado no Algoritmo 5.3, que lê as notas e o código de um conjunto de alunos e informa</p><p>as suas médias:</p><p>Algoritmo 5.3 – MédiaAlunos_1</p><p>{INFORMA MÉDIA DOS ALUNOS DE UMA TURMA}</p><p>{CONDIÇÃO DE PARADA: CÓDIGO DO ÚLTIMO ALUNO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>código, cod_último (inteiro)</p><p>Saídas: média (real)</p><p>início</p><p>ler(cod_último) {ENTRADA DO CÓDIGO DO ÚLTIMO ALUNO}</p><p>código ← 0 {INICIALIZA CÓDIGO SÓ PARA COMPARAR A PRIMEIRA VEZ}</p><p>enquanto código ≠ cod_último faça</p><p>início</p><p>ler(código) {LÊ CÓDIGO DO ALUNO}</p><p>ler(nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever(código, média) {INFORMA CÓDIGO DO ALUNO E SUA MÉDIA}</p><p>fim</p><p>fim</p><p>marca de parada após os dados válidos. É definido um valor de parada que não consti-</p><p>tui um dado válido. Esse valor não deve ser processado, funcionando somente como indica-</p><p>ção de parada das repetições. Por exemplo, no caso dos alunos pode ser uma primeira nota</p><p>negativa:</p><p>Algoritmo 5.4 – MédiaAlunos_2</p><p>{INFORMA MÉDIA DOS ALUNOS DE UMA TURMA}</p><p>{CONDIÇÃO DE PARADA: PRIMEIRA NOTA LIDA É NEGATIVA}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Edelweiss_05.indd 136 12/03/14 09:02</p><p>ALGORITMOS E PROGRAMAÇÃO226 Capítulo 5 Estruturas de Repetição 137</p><p>código (inteiro)</p><p>Saídas: média (real)</p><p>início</p><p>ler (nota1, nota2, nota3) {ENTRADA DE 3 NOTAS}</p><p>enquanto nota1 ≥ 0 faça</p><p>início</p><p>ler(código) {LÊ CÓDIGO DO ALUNO}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever(código, média) {INFORMA CÓDIGO DO ALUNO E SUA MÉDIA}</p><p>ler(nota1, nota2, nota3) {ENTRADA DAS PRÓXIMAS 3 NOTAS}</p><p>fim</p><p>fim</p><p>Observar que foi necessário ler as notas do primeiro aluno antes de entrar no comando de re-</p><p>petição para que o teste do comando enquanto/faça pudesse ser realizado adequadamente</p><p>já na sua primeira execução. Ao final do processamento das notas de um aluno, são lidas</p><p>as do próximo, devolvendo o controle ao comando enquanto/faça para que seja realizado</p><p>novamente o teste da primeira nota, definindo se vai ser realizada nova repetição ou se o</p><p>comando deve ser terminado. Assim tem-se a garantia de que não são processadas, como se</p><p>fossem dados válidos, as notas que contêm a marca de parada.</p><p>parada solicitada pelo usuário. Ao final de cada iteração, o usuário decide se deseja conti-</p><p>nuar ou parar, respondendo a uma pergunta explícita, conforme mostrado no Algoritmo 5.5:</p><p>Algoritmo 5.5 – MédiaAlunos_3</p><p>{INFORMA MÉDIA DOS ALUNOS DE UMA TURMA}</p><p>{CONDIÇÃO DE PARADA: INFORMADA PELO USUÁRIO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>código (inteiro)</p><p>continuar (caractere)</p><p>Saídas: média (real)</p><p>início</p><p>continuar ← 'S'{INICIALIZA CÓDIGO PARA COMPARAR A PRIMEIRA VEZ}</p><p>enquanto continuar = 'S' faça</p><p>início</p><p>ler(código) {LÊ CÓDIGO DO ALUNO}</p><p>ler(nota1, nota2, nota3) {ENTRADA DAS 3 NOTAS}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever(código, média) {INFORMA CÓDIGO DO ALUNO E SUA MÉDIA}</p><p>escrever('Mais alunos? Responda S ou N ')</p><p>ler(continuar) {USUÁRIO INFORMA SE TEM MAIS ALUNOS}</p><p>fim</p><p>fim</p><p>Edelweiss_05.indd 137 12/03/14 09:02</p><p>227 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Enquanto. (Pseudocódigo) PARTE 3</p><p>138 Algoritmos e Programação com Exemplos em Pascal e C</p><p>5.3.2 contagem de repetições</p><p>Caso se necessite saber quantas repetições foram realizadas, uma vez que esse número é</p><p>desconhecido, é preciso fazer uso de uma variável do tipo contador, incrementada dentro</p><p>do laço a cada iteração. O algoritmo a seguir estende o Algoritmo 5.4, informando também</p><p>a média da turma. Para o cálculo dessa média é necessário conhecer o número de alunos,</p><p>informado através do contador cont_al:</p><p>Algoritmo 5.6 – MédiaAlunoETurma_2</p><p>{INFORMA MÉDIA DOS ALUNOS DE UMA TURMA E A MÉDIA GERAL DESSA TURMA.</p><p>PARA INDICAR FIM DE PROCESSAMENTO, O CONTEÚDO INFORMADO EM NOTA1 SERÁ</p><p>NEGATIVO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>soma_médias (real)</p><p>média_turma (real)</p><p>Variável auxiliar:</p><p>cont_al (inteiro) {CONTADOR DE ALUNOS PROCESSADOS}</p><p>início</p><p>soma_médias ← 0 {SOMA MÉDIAS INDIVIDUAIS: VALOR INICIAL ZERO}</p><p>cont_al ← 0 {CONTADOR DE ALUNOS: VALOR INICIAL ZERO}</p><p>ler(nota1, nota2, nota3) {ENTRADA DAS 3 PRIMEIRAS NOTAS}</p><p>enquanto nota1 ≥ 0 faça</p><p>início</p><p>cont_al ← cont_al + 1 {CONTA ALUNO LIDO}</p><p>média ← (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever(cont_al, média) {INFORMA MÉDIA}</p><p>soma_médias ← soma_médias + média {SOMA DAS MÉDIAS}</p><p>ler(nota1, nota2, nota3) {ENTRADA DAS PRÓXIMAS 3 NOTAS}</p><p>fim {DO ENQUANTO}</p><p>média_turma ← soma_médias / cont_al {MÉDIA DA TURMA}</p><p>escrever(média_turma)</p><p>fim</p><p>5.3.3 comandos de repetição aninhados</p><p>Assim como para o comando para/faça, o comando incluído dentro de um laço de repeti-</p><p>ções do comando enquanto/faça pode ser um comando qualquer, inclusive outro comando</p><p>de repetição para/faça ou enquanto/faça. O exemplo a seguir mostra o aninhamento de</p><p>um comando para/faça dentro de um enquanto/faça. A variável mais_um é do tipo ca-</p><p>ractere. Os comandos do laço do enquanto/faça serão repetidos enquanto não for lido</p><p>um caractere “N”. A cada repetição, todo o comando</p><p>a velocidade de</p><p>execução. Como, nesse tipo de linguagem, o código-fonte é convertido</p><p>diretamente em uma linguagem de máquina, a execução é mais rápida</p><p>e eficiente quando comparada com uma linguagem interpretada</p><p>especialmente em sistemas onde a complexidade é alta.</p><p>■ Já as linguagens interpretadas não precisam ser totalmente tradu-</p><p>zidas para um código de máquina, pois cada uma das instruções é</p><p>executada diretamente pelo seu interpretador. Logo quando foram</p><p>7Introdução à lógica de programação</p><p>19 Introdução aos Algoritmos UNIDADE 1</p><p>Introdução a Lógica de Programação PARTE 1</p><p>inventadas essas linguagens, a velocidade do tempo de execução,</p><p>quando comparadas com as linguagens compiladas, era, sem som-</p><p>bra de dúvidas, muito alta e a principal desvantagem quando feita</p><p>essa comparação. Porém, com a invenção da tecnologia just-in-time</p><p>(JIT), essa desvantagem continua existindo, mas bem menor. Essa</p><p>técnica consiste em realizar uma tradução dinâmica, em tempo de</p><p>execução e não antes da execução. Assim, a diferença de execução</p><p>entre linguagens compiladas e interpretadas diminuiu.</p><p>■ Em contrapartida, um programa compilado precisa ser gerado para</p><p>cada plataforma que for rodar: Windows, Linux, Mac OS. Já um</p><p>programa interpretado pode rodar em qualquer máquina, já que sua</p><p>“interpretação” é feita em tempo de execução, sendo que a única</p><p>necessidade é ter o interpretador na máquina onde esse programa</p><p>será executado.</p><p>Para saber mais sobre JIT, consulte:</p><p>https://goo.gl/GjiWhs</p><p>FORBELLONE, A. L. V.; EBERSPÄCHER, H. F. Lógica de programação: a construção de</p><p>algoritmos e estrutura de dados. São Paulo: Makron Books, 2005.</p><p>TANENBAUM, A. S. Sistemas operacionais. Porto Alegre: Bookman, 2000.</p><p>Introdução à lógica de programação8</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>1</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 2</p><p>Conceitos Básicos e</p><p>Tipos de Dados</p><p>ALGORITMOS E PROGRAMAÇÃO22</p><p>6 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Computadores constituem uma poderosa ferramenta para auxiliar o trabalho do homem. O</p><p>uso mais comum dos computadores é por meio de aplicativos já desenvolvidos e disponíveis,</p><p>tais como editores de texto, planilhas eletrônicas, sistemas de gerenciamento de bancos de</p><p>dados, programas de acesso à Internet e jogos. Entretanto, por vezes, as pessoas desenvol-</p><p>vem soluções específicas para determinadas aplicações, de modo a permitir que as informa-</p><p>ções dessas aplicações possam ser acessadas e manipuladas de forma mais segura, rápida e</p><p>eficiente ou com um custo mais baixo. Este livro trata dessa segunda forma de uso dos com-</p><p>putadores, ou seja, de como um usuário pode projetar e desenvolver soluções próprias para</p><p>resolver problemas específicos de seu interesse.</p><p>Este primeiro capítulo apresenta alguns conceitos básicos utilizados no restante do livro: o</p><p>que vem a ser um algoritmo, formas de expressar algoritmos, etapas para a construção de um</p><p>algoritmo e de um programa, algumas considerações a respeito das linguagens de programa-</p><p>ção utilizadas, o que vem a ser a programação estruturada, que é a técnica de programação</p><p>adotada no desenvolvimento dos programas aqui apresentados, e alguns fundamentos de</p><p>representação interna de dados.</p><p>1.1 o que é um algoritmo</p><p>Vejamos como são solucionados alguns problemas do cotidiano.</p><p>exemplo 1: Telefone público. Para utilizar um telefone público como um “orelhão” ou</p><p>similar, as operações que devemos realizar estão especificadas junto a esse telefone, sendo</p><p>mais ou menos assim:</p><p>1. leve o fone ao ouvido;</p><p>2. insira seu cartão no orifício apropriado;</p><p>3. espere o sinal para discar;</p><p>4. assim que ouvir o sinal, disque o número desejado;</p><p>5. ao final da ligação, retorne o fone para a posição em que se encontrava;</p><p>6. retire seu cartão.</p><p>Esse conjunto de operações é o que se denomina algoritmo. Qualquer pessoa pode executar</p><p>essas operações, na ordem especificada, para fazer suas ligações telefônicas, desde que pos-</p><p>sua um cartão específico e conheça o número para o qual quer telefonar.</p><p>exemplo 2: Compra de um livro. Uma compra em um estabelecimento comercial também</p><p>obedece a uma sequência de ações predeterminadas. Por exemplo, para comprar um livro em</p><p>uma livraria deve-se:</p><p>1. entrar na livraria;</p><p>2. verificar se o livro está disponível. Para isso, precisa-se conhecer (1) o título e o autor do</p><p>livro e (2) ter disponibilidade financeira para a compra. Caso a compra venha a ser efetu-</p><p>ada, deve-se:</p><p>a. levar o livro até o balcão;</p><p>b. esperar que a compra seja registrada no caixa;</p><p>Edelweiss_01.indd 6Edelweiss_01.indd 6 12/03/14 08:5912/03/14 08:59</p><p>23 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 7</p><p>c. pagar o valor correspondente;</p><p>d. esperar que seja feito o pacote;</p><p>e. levar o livro comprado.</p><p>3. sair da livraria.</p><p>Os dois exemplos apresentados são resolvidos por uma sequência de ações bem definidas,</p><p>que devem ser executadas em uma determinada ordem. Outras aplicações de nosso dia a dia</p><p>podem ser detalhadas de forma semelhante: uma receita de um bolo, o acesso a terminais</p><p>eletrônicos de bancos, a troca do pneu de um carro, etc.</p><p>definição de algoritmo. Um algoritmo é definido como uma sequência finita de opera-</p><p>ções que, quando executadas na ordem estabelecida, atingem um objetivo determinado em</p><p>um tempo finito.</p><p>Um algoritmo deve atender aos seguintes requisitos:</p><p>■ possuir um estado inicial;</p><p>■ consistir de uma sequência lógica finita de ações claras e precisas;</p><p>■ produzir dados de saída corretos;</p><p>■ possuir estado final previsível (deve sempre terminar).</p><p>Além de definir algoritmos para resolver problemas do dia a dia, podemos também desenvol-</p><p>ver algoritmos que podem ser transformados, total ou parcialmente, em programas e execu-</p><p>tados em computadores. Este livro concentra-se em problemas resolvidos através de algorit-</p><p>mos que podem ser integralmente executados por computadores.</p><p>1.1.1 algoritmos executados por um computador</p><p>Para que um algoritmo possa ser totalmente executado por um computador é necessário</p><p>identificar claramente quais as ações que essa máquina pode executar. O exemplo a seguir</p><p>permite identificar, através de uma simulação, algumas das ações básicas que um computa-</p><p>dor executa e como isso é feito.</p><p>Vamos supor que um professor, na sala de aula, mostre aos alunos como é calculada a média</p><p>das notas de uma prova. Para simplificar, suponhamos que a turma tenha somente cinco</p><p>alunos. As provas estão sobre sua mesa, já corrigidas. O professor desenha uma grade no</p><p>quadro, dando nome a cada um dos espaços nos quais vai escrever a nota de cada aluno:</p><p>Nota1, Nota2, etc. (Figura 1.1). Acrescenta mais um espaço para escrever os resultados de</p><p>seus cálculos, que chama de Resultado.</p><p>Para formalizar o que está fazendo, ele escreveu a sequência de ações que está executando</p><p>em uma folha sobre sua mesa. Ele inicia pegando a primeira prova, olha sua nota (vamos</p><p>supor que seja 10) e escreve essa nota no espaço reservado para ela, que chamou de Nota1.</p><p>Essa prova ele coloca em uma segunda pilha sobre a mesa, pois já foi usada e não deve ser</p><p>considerada uma segunda vez para calcular a média. Em seguida, faz o mesmo para a segun-</p><p>da prova (nota 8), escrevendo seu valor em Nota2 e colocando-a na pilha das já utilizadas. Ele</p><p>repete essa operação para cada uma das provas restantes.</p><p>Edelweiss_01.indd 7Edelweiss_01.indd 7 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO24 8 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Obtidas todas as notas das provas, o professor passa a realizar as operações que vão calcular</p><p>para/faça é executado:</p><p>Edelweiss_05.indd 138 12/03/14 09:02</p><p>Capítulo 5 Estruturas de Repetição 139</p><p>ler(mais_um)</p><p>enquanto mais_um ≠ 'N' faça</p><p>início</p><p>ler(lim_sup)</p><p>para i de 1 incr 1 até lim_sup faça</p><p>escrever(i)</p><p>ler(mais_um)</p><p>fim</p><p>5.4 comando de repetição condicional repita/até por</p><p>avaliação posterior de condição</p><p>O comando de repetição condicional por avaliação posterior repita/até também vin-</p><p>cula a execução de um conjunto de comandos ao resultado da avaliação de uma expressão</p><p>lógica. O comando inicia pela execução do laço e, quando essa execução é concluída, a ex-</p><p>pressão é avaliada: se o valor lógico obtido for falso, o laço é executado novamente; se for</p><p>verdadeiro, o comando é encerrado. Isso significa que o laço é sempre executado pelo menos</p><p>uma vez, independentemente do valor lógico inicial resultante da avaliação da expressão de</p><p>controle. Observar que, normalmente, o valor inicial da expressão lógica será falso, pois se</p><p>deseja repetir o laço mais de uma vez. Portanto, é necessário que, em algum momento, o</p><p>conteúdo de alguma variável utilizada nesta expressão lógica tenha o valor alterado dentro do</p><p>laço, de forma a modificar o valor resultante de sua avaliação para verdadeiro, evitando assim</p><p>a ocorrência de um laço – loop – infinito.</p><p>A sintaxe de um comando de repetição condicional repita/até é a seguinte:</p><p>repita</p><p><comandos></p><p>até <expressão lógica></p><p>Observar que, diferentemente dos comandos anteriores, aqui não é necessário um comando</p><p>composto, pois a sintaxe aceita múltiplos comandos, delimitados pela cláusula até.</p><p>O fluxograma representado na Figura 5.5 mostra o funcionamento desse comando, em que</p><p>o laço de repetição é sempre executado pelo menos uma vez.</p><p>O aninhamento de comandos de repetição também se aplica ao comando repita/até, in-</p><p>cluindo os outros comandos de repetição já vistos.</p><p>O Algoritmo 5.7, a seguir, adapta o Algoritmo 5.6, utilizando no laço de repetição um co-</p><p>mando repita/até em lugar do enquanto/faça. Observar que, como o laço desse coman-</p><p>do é sempre executado pelo menos uma vez, se tornou necessária a inclusão de um comando</p><p>condicional logo no início para condicionar a execução do laço ao valor inicial de nota1.</p><p>Edelweiss_05.indd 139 12/03/14 09:02</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>4</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 4</p><p>Estrutura de Repetição Repita...</p><p>Até (Fluxograma)</p><p>ALGORITMOS E PROGRAMAÇÃO230</p><p>Capítulo 5 Estruturas de Repetição 139</p><p>ler(mais_um)</p><p>enquanto mais_um ≠ 'N' faça</p><p>início</p><p>ler(lim_sup)</p><p>para i de 1 incr 1 até lim_sup faça</p><p>escrever(i)</p><p>ler(mais_um)</p><p>fim</p><p>5.4 comando de repetição condicional repita/até por</p><p>avaliação posterior de condição</p><p>O comando de repetição condicional por avaliação posterior repita/até também vin-</p><p>cula a execução de um conjunto de comandos ao resultado da avaliação de uma expressão</p><p>lógica. O comando inicia pela execução do laço e, quando essa execução é concluída, a ex-</p><p>pressão é avaliada: se o valor lógico obtido for falso, o laço é executado novamente; se for</p><p>verdadeiro, o comando é encerrado. Isso significa que o laço é sempre executado pelo menos</p><p>uma vez, independentemente do valor lógico inicial resultante da avaliação da expressão de</p><p>controle. Observar que, normalmente, o valor inicial da expressão lógica será falso, pois se</p><p>deseja repetir o laço mais de uma vez. Portanto, é necessário que, em algum momento, o</p><p>conteúdo de alguma variável utilizada nesta expressão lógica tenha o valor alterado dentro do</p><p>laço, de forma a modificar o valor resultante de sua avaliação para verdadeiro, evitando assim</p><p>a ocorrência de um laço – loop – infinito.</p><p>A sintaxe de um comando de repetição condicional repita/até é a seguinte:</p><p>repita</p><p><comandos></p><p>até <expressão lógica></p><p>Observar que, diferentemente dos comandos anteriores, aqui não é necessário um comando</p><p>composto, pois a sintaxe aceita múltiplos comandos, delimitados pela cláusula até.</p><p>O fluxograma representado na Figura 5.5 mostra o funcionamento desse comando, em que</p><p>o laço de repetição é sempre executado pelo menos uma vez.</p><p>O aninhamento de comandos de repetição também se aplica ao comando repita/até, in-</p><p>cluindo os outros comandos de repetição já vistos.</p><p>O Algoritmo 5.7, a seguir, adapta o Algoritmo 5.6, utilizando no laço de repetição um co-</p><p>mando repita/até em lugar do enquanto/faça. Observar que, como o laço desse coman-</p><p>do é sempre executado pelo menos uma vez, se tornou necessária a inclusão de um comando</p><p>condicional logo no início para condicionar a execução do laço ao valor inicial de nota1.</p><p>Edelweiss_05.indd 139 12/03/14 09:02</p><p>231 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Repita...Até (Fluxograma) PARTE 4</p><p>140 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Algoritmo 5.7 – MédiaAlunoETurma_3</p><p>{INFORMA MÉDIA DOS ALUNOS DE UMA TURMA E A MÉDIA GERAL DESSA TURMA.</p><p>PARA INDICAR FIM DE PROCESSAMENTO, O CONTEÚDO INFORMADO EM NOTA1 SERÁ</p><p>NEGATIVO}</p><p>Entradas: nota1, nota2, nota3 (real)</p><p>Saídas: média (real)</p><p>soma_médias (real)</p><p>média_turma (real)</p><p>Variável auxiliar:</p><p>cont_al (inteiro) {CONTADOR DE ALUNOS PROCESSADOS}</p><p>início</p><p>soma_médias ← 0 {SOMA MÉDIAS INDIVIDUAIS: VALOR INICIAL ZERO}</p><p>cont_al ← 0 {CONTADOR DE ALUNOS: VALOR INICIAL ZERO}</p><p>ler(nota1) {LEITURA DA PRIMEIRA NOTA}</p><p>se nota1 ≥ 0</p><p>então início</p><p>repita</p><p>ler(nota2, nota3) {LEITURA DAS OUTRAS 2 NOTAS}</p><p>cont_al ← cont_al + 1 {CONTA ALUNO LIDO}</p><p>média (nota1 + nota2 + nota3) / 3 {CALCULA MÉDIA}</p><p>escrever (cont_al, média) {INFORMA MÉDIA}</p><p>soma_médias ← soma_médias + média {SOMA DAS MÉDIAS}</p><p>ler(nota1) {LEITURA DA PRIMEIRA NOTA DO PRÓXIMO ALUNO}</p><p><comando></p><p><expressão lógica></p><p>verdadeiro</p><p>falso</p><p><comando></p><p>…</p><p>figura 5.5 Fluxograma do comando de repetição repita/até.</p><p>Edelweiss_05.indd 140 12/03/14 09:02</p><p>ALGORITMOS E PROGRAMAÇÃO232 Capítulo 5 Estruturas de Repetição 141</p><p>até nota1 < 0 {FINAL DO COMANDO REPITA}</p><p>fim {DO COMANDO SE/ENTÃO}</p><p>média_turma ← soma_médias / cont_al {MÉDIA DA TURMA}</p><p>escrever(média_turma)</p><p>fim</p><p>5.5 garantia da consistência de dados através de</p><p>comandos de repetição</p><p>Sempre que possível, os valores lidos devem ser verificados quanto à validade antes de seu</p><p>armazenamento em variáveis. Por exemplo, se o intervalo de valores de notas de provas é de 0</p><p>a 10, então qualquer valor de nota informado que não estiver dentro desse intervalo está in-</p><p>correto e deve ser descartado e substituído por um novo valor válido. A consistência de dados</p><p>de entrada pode ser implementada através do uso de comandos de repetição condicional.</p><p>No caso dos algoritmos de processamento de notas incluídos neste capítulo, toda a leitura de</p><p>nota deveria incluir a consistência do valor informado. Nos exemplos a seguir, a consistência</p><p>das leituras é garantida através do uso de enquanto/faça e de repita/até, de acordo com</p><p>o funcionamento de cada comando.</p><p>{CONSISTÊNCIA COM COMANDO ENQUANTO/FAÇA}</p><p>ler (nota1)</p><p>enquanto (nota1 < 0 ou nota1 > 10) e nota1 ≠ -1 faça</p><p>início {SÓ EXECUTA SE NOTA INVÁLIDA}</p><p>escrever('Nota inválida! Informe novamente. ')</p><p>ler(nota1)</p><p>fim {ENQUANTO}</p><p>{CONSISTÊNCIA DE DADOS COM COMANDO REPITA/ATÉ}</p><p>repita {CONSISTÊNCIA DE NOTA2}</p><p>ler(nota2) {SEMPRE EXECUTA 1 VEZ, REPETE SE INVÁLIDA}</p><p>se nota2 < 0 ou nota2 > 10</p><p>então escrever('Nota inválida! Informe novamente.')</p><p>até (nota2 ≥ 0 e nota2 ≤ 10)</p><p>Apesar das diferenças no modo de funcionamento, os comandos enquanto/faça e</p><p>repita/até podem ser utilizados indistintamente nas situações em que o uso de comandos</p><p>desse tipo for adequado. Entretanto, o comando repita/até, por apresentar a característica</p><p>de sempre executar o conteúdo do laço pelo menos uma vez, é o mais indicado</p><p>para a consis-</p><p>tência de dados de entrada. A leitura dos dados deverá ocorrer obrigatoriamente pelo menos</p><p>uma vez, e a avaliação do resultado da leitura determinará o encerramento (dado lido válido)</p><p>ou a repetição do comando (dado lido inválido).</p><p>O trecho a seguir apresenta a utilização do comando repita/até para a consistência da lei-</p><p>tura de uma letra minúscula, garantindo que o caractere digitado esteja dentro do intervalo</p><p>“a” a “z”, mas sem emitir mensagem de erro de digitação.</p><p>Edelweiss_05.indd 141 12/03/14 09:02</p><p>233 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estrutura de Repetição Repita...Até (Fluxograma) PARTE 4</p><p>ANOTAÇÕES</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>unidade</p><p>4</p><p>O conteúdo deste livro é</p><p>disponibilizado por SAGAH.</p><p>Parte 5</p><p>Estruturas de Repetição</p><p>ALGORITMOS E PROGRAMAÇÃO236</p><p>Estruturas de repetição</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Compreender o funcionamento da estrutura while.</p><p>� Implementar programas de computador usando o for.</p><p>� Entender como a estrutura do-while funciona.</p><p>Introdução</p><p>Em muitas situações, não basta que tenhamos somente uma estrutura</p><p>de seleção em um programa de computador, tão pouco somente a</p><p>forma sequencial de implementação. Em resolução de problemas reais,</p><p>é comum a necessidade do uso de estrutura de repetição, que seleciona,</p><p>de certa forma, um trecho de código e faz com que ele seja executo um</p><p>determinado número de vezes ou quando alguma operação acontecer.</p><p>Neste capítulo, você estudará a construção de um algoritmo, usando</p><p>praticamente todos os conceitos de programação, dando destaque aos</p><p>tipos de estrutura de repetição existentes.</p><p>A estrutura while</p><p>Existem algumas situações em programação que precisamos repetir o mesmo</p><p>trecho de código com valores diferentes para as nossas variáveis. Um programa</p><p>que calcula a média de uma turma de 40 alunos vai repetir a mesma operação</p><p>40 vezes: leitura da matrícula do aluno, leituras das notas, cálculo da média</p><p>e, por fim, mostrar para o usuário o resultado desse processamento de dados.</p><p>Da mesma forma que as estruturas de seleção fazem um controle do fluxo</p><p>de execução, as estruturas de repetição vão mudar o fluxo, repetindo um trecho</p><p>de código um determinado número de vezes ou quando alguma operação for</p><p>executada.</p><p>237 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estruturas de Repetição PARTE 5</p><p>Podemos pensar a estrutura de repetição como o loop da montanha-russa,</p><p>onde o carrinho vem em seu fluxo e faz um giro. Em programação, esse loop</p><p>é conhecido como repetição.</p><p>O loop pode ficar repetindo um número X de vezes. Esse número pode ser</p><p>determinado pelo programador ou pode ser um valor digitado pelo usuário.</p><p>Em todos os casos, esse valor ficará armazenado em uma variável que é co-</p><p>nhecida como contadora. Um detalhe: você pode dar o nome que quiser para</p><p>essa variável, mas lembre-se de que é legal o nome da variável ter relação</p><p>com o significado do que ela armazena.</p><p>Além disso, o loop também pode ser controlado por algo que o usuário</p><p>digita ou alguma operação interna a ele. Imagine que o cálculo da média seja</p><p>digitado até que seja zero para a matrícula do aluno. O loop, então, encerraria</p><p>como resultado de uma operação. Esse tipo de loop é obtido por meio de um</p><p>teste condicional com uma variável, que é conhecida como variável de controle.</p><p>Em C, existem os seguintes loops: while, for e do-while. Vamos começar</p><p>com o while. Para isso, vamos a um código simples, que mostre os números</p><p>de 1 a 5, primeiro sem estrutura de repetição. Veja na Figura 1, a seguir.</p><p>Figura 1. Código simples sem estrutura de repetição.</p><p>Estruturas de repetição2</p><p>ALGORITMOS E PROGRAMAÇÃO238</p><p>Como pode ser visto na Figura 1, repetimos as linha 5 e 6 por 5 vezes,</p><p>que é a escrita na tela da variável contador. Nesse exemplo, inicializamos</p><p>a variável contador com 0. Portanto, para que a contagem seja de 1 a 5, é</p><p>necessário realizar primeiro um incremento de 1 nessa variável para depois</p><p>exibirmos na tela.</p><p>Agora, vamos usar a estrutura de repetição while para realizar a mesma</p><p>tarefa. Veja na Figura 2, a seguir.</p><p>Figura 2. Estrutura de repetição while.</p><p>As linhas 5 a 8 mostram o uso da estrutura de repetição while. Sua sintaxe</p><p>é a demonstrada na Figura 3:</p><p>Figura 3. Sintaxe da estrutura de repetição while.</p><p>3Estruturas de repetição</p><p>239 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estruturas de Repetição PARTE 5</p><p>Alguns detalhes:</p><p>� A condição é uma expressão relacional e/ou lógica com a variável de</p><p>controle.</p><p>� A variável de controle deve ser inicializada antes do loop.</p><p>� A variável de controle precisa ser modificada dentro do loop de repetição.</p><p>Esses detalhes são importantes, pois, se eles não estiverem presentes no</p><p>código, o loop pode ou não funcionar ou funcionar de forma errada. Para</p><p>exemplificar, vamos a dois erros bastante comuns que podem acontecer, ou</p><p>melhor, acontecem com todos que estão aprendendo a programar.</p><p>Veja este exemplo, na Figura 4.</p><p>Figura 4. Exemplo de problema de semântica.</p><p>Esse programa compila, mas, ao executar, nada acontece — trata-se de</p><p>um problema de semântica. A linha em destaque é a que inicializa a variável</p><p>de controle, contador. Ela foi inicializada com o valor 6, e na linha 5 temos</p><p>a estrutura while.</p><p>Estruturas de repetição4</p><p>ALGORITMOS E PROGRAMAÇÃO240</p><p>No while, é feito um teste condicional, o qual, na primeira rodada, é falso.</p><p>O fluxo do programa não passa pelo loop (delimitado pelo conjunto de chaves)</p><p>e vai direito para a linha 9, finalizando o código.</p><p>Com esse código, deu para perceber que o bloco de operações dentro do</p><p>while só será executado caso, ou melhor, enquanto o teste condicional for</p><p>verdadeiro. Por isso, cuidado com o valor inicial de sua variável de controle.</p><p>Vamos melhorar a sintaxe do while, na Figura 5.</p><p>Figura 5. Sintaxe do while.</p><p>Esse é o nosso primeiro problema comum em estrutura de repetição. Vamos</p><p>ao segundo. Veja o código a seguir, na Figura 6.</p><p>Figura 6. Exemplo de problema de loop infinito.</p><p>5Estruturas de repetição</p><p>241 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estruturas de Repetição PARTE 5</p><p>Dessa vez, o código compila, mas tem uma saída diferente: ele fica impri-</p><p>mindo na tela o valor 0, e isso vai ficar acontecendo para sempre ou, melhor</p><p>dizendo, infinitas vezes. Esse problema é conhecido como loop infinito e</p><p>acontece porque não houve modificação do valor da variável de controle dentro</p><p>do loop, ou seja, o teste condicional vai dar sempre verdadeiro e a linha 6 vai</p><p>ser executada para sempre.</p><p>Então, duas dicas valiosas, ao escrever uma estrutura de repetição no seu</p><p>programa, são:</p><p>� inicializar a variável de controle de forma conveniente.</p><p>� ter uma linha dentro do loop, que realiza a modificação do valor da</p><p>variável de controle.</p><p>Outro detalhe do uso do while é quando não tivermos a quantidade de vezes</p><p>que a repetição irá acontecer. Veja o seguinte código da Figura 7.</p><p>Figura 7. Exemplo uso do while — não há quantidade de vezes da repetição.</p><p>Ele soma todos os valores que são digitados. Não temos como saber quantas</p><p>vezes a pessoa vai digitar um valor válido, mas sabemos que o loop irá parar</p><p>quando o valor digitado, que será armazenado na variável número, for zero,</p><p>pois o teste condicional</p><p>é a expressão numero!=0, ou seja, o código irá repetir</p><p>enquanto o número for diferente de zero.</p><p>Estruturas de repetição6</p><p>ALGORITMOS E PROGRAMAÇÃO242</p><p>Outro detalhe para esse código é o uso da variável soma. Esse tipo de uso</p><p>é o que chamamos de variável, que vai acumulando os valores, bastante útil</p><p>em programação, como, por exemplo, para calcularmos média de valores. É</p><p>como se a variável soma fosse uma grande caixa que, na primeira vez que</p><p>passa pelo código, contém valor 0; depois, todos os números que são colocados</p><p>lá dentro são somados com o valor que já existia. Veja a Figura 8, a seguir.</p><p>Figura 8. Exemplo de variável soma.</p><p>45 10 9</p><p>0</p><p>soma soma soma soma</p><p>Cada passagem pelo loop</p><p>45 55 64</p><p>Então, o superpoder do while é que podemos usá-lo quando não sabemos</p><p>a quantidade de vezes que o laço vai acontecer — e não se esqueça: o teste</p><p>condicional do while é feito logo do início da sua execução. Vamos agora para</p><p>o segundo tipo de estrutura de repetição: o for.</p><p>A estrutura de repetição for</p><p>A estrutura de repetição for também nos auxilia quando precisamos repetir</p><p>um trecho de código. Sua principal diferença, quando comparada com o while</p><p>e o do-while — que veremos a seguir —, é que só pode ser usado quando se</p><p>sabe a quantidade de vezes que o loop vai acontecer.</p><p>7Estruturas de repetição</p><p>243 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estruturas de Repetição PARTE 5</p><p>Vamos avaliar o seguinte código da Figura 9.</p><p>Figura 9. Exemplo de código com estrutura de repetição for.</p><p>Esse código também acumula, somando todos os valores que são digitados</p><p>pelo usuário. A diferença está no uso da estrutura de repetição for. Para que</p><p>ela seja usada, precisamos definir quantas vezes a repetição irá acontecer —</p><p>nesse caso, isso é definido com a variável count.</p><p>A sintaxe da estrutura de repetição for é a seguinte:</p><p>Figura 10. Sintaxe do for.</p><p>O primeiro valor dentro dos parênteses é a variável de controle — nesse</p><p>caso, declarada, dentro do próprio for, uma prática bastante comum em lin-</p><p>guagem C. O segundo termo é o teste condicional, que pode ser traduzido</p><p>para o seguinte: enquanto o teste for verdadeiro, o loop continua; enquanto a</p><p>variável i for menor que a variável count e o último termo, e como a variável</p><p>i vai ser modificada, ou seja, a instrução que muda o valor da variável de</p><p>controle, nesse caso, o i será incrementado de um em um.</p><p>Estruturas de repetição8</p><p>ALGORITMOS E PROGRAMAÇÃO244</p><p>Os seguintes detalhes devem ser observados:</p><p>� A variável de controle não precisa ser declarada no for, mas deve levar</p><p>ao seguinte: quando acabar o loop, a variável deixa de existir.</p><p>� O teste condicional pode ser feito usando-se qualquer operador lógico</p><p>e/ou relacional.</p><p>� O último termo, também chamado de passo do loop, pode ser de in-</p><p>cremento, de decremento e do tamanho que for conveniente para o</p><p>programa.</p><p>� O for é delimitado por um conjunto de chaves, assim como o while.</p><p>� O loop fica executando enquanto o teste condicional for verdadeiro, ou</p><p>seja, ao chegar na última linha , o fluxo de execução volta para o teste</p><p>e verifica se ele é verdadeiro ou falso.</p><p>Podemos ver o funcionamento do loop for com o seguinte fluxograma,</p><p>representado na Figura 11:</p><p>Figura 11. Fluxograma com loop for.</p><p>9Estruturas de repetição</p><p>245 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estruturas de Repetição PARTE 5</p><p>Vamos a mais um exemplo, veja o seguinte código, na Figura 12.</p><p>Figura 12. Código com loop for.</p><p>Muito parecido com o anterior, exceto pelo valor de count ser pedido</p><p>ao usuário e não atribuído dentro do código. O programa continua sabendo</p><p>quantas vezes o loop vai acontecer, só que agora foi o usuário do programa</p><p>que definiu. Em ambos os casos, podemos usar o for, pois sabemos esse limite.</p><p>E o while? Pode ser usado nesses casos também? A resposta é sim, o while é</p><p>multiuso nesse aspecto. Vamos finalizar nossas estruturas de repetição com</p><p>o último tipo: o do-while.</p><p>A estrutura de repetição do-while</p><p>Para finalizar, vamos à terceira estrutura de repetição: do-while. Como vimos</p><p>anteriormente, existe uma diferença no uso de while e for, mas ambos têm</p><p>algo em comum: o teste condicional é feito no início da estrutura. O do-while</p><p>é uma estrutura de repetição onde o teste condicional é feito no fim, ou seja, o</p><p>bloco de operações será executado pelo menos uma vez, independentemente</p><p>do valor lógico do teste condicional.</p><p>Estruturas de repetição10</p><p>ALGORITMOS E PROGRAMAÇÃO246</p><p>Vamos refazer o exemplo do acumulador de valores, agora usando o do-</p><p>-while. Observe a Figura 13.</p><p>Figura 13. Exemplo de acumulador de valores com do-while.</p><p>O do-while também funciona quando não sabemos quantas vezes a repetição</p><p>vai acontecer, assim como o while. Um detalhe importante é que o bloco de</p><p>código que está dentro da estrutura de repetição será executado pelo menos</p><p>uma vez, visto que o teste condicional é feito somente no fim.</p><p>Também é preciso tomar os mesmos cuidados quanto ao loop infinito, ou</p><p>seja, para que o loop aconteça de forma conveniente à resolução de um deter-</p><p>minando, é preciso que a variável de controle seja modificada dentro do loop.</p><p>A sintaxe de do-while pode ser vista na Figura 14.</p><p>Figura 14. Sintaxe de do-while.</p><p>11Estruturas de repetição</p><p>247 Integração em Múltiplas Variáveis UNIDADE 4</p><p>Estruturas de Repetição PARTE 5</p><p>Para finalizarmos, observe o Quadro 1, com uma comparativa entre as 3</p><p>estruturas de repetição existentes na linguagem C.</p><p>Nome da estrutura</p><p>Teste condicional</p><p>é feito no início ou</p><p>no fim do loop?</p><p>Necessidade de se</p><p>saber quantas vezes</p><p>o loop vai acontecer?</p><p>While Início Não</p><p>For Início Sim</p><p>Do-while Fim Não</p><p>Quadro 1. Síntese das três estruturas de repetição da linguagem C.</p><p>Ao se escolher qual estrutura usar, precisa-se analisar o problema e como se deseja</p><p>resolvê-lo computacionalmente. A prática vai de ajudar sempre nessa escolha. Portanto,</p><p>programe sempre.</p><p>BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://</p><p>en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev 2018.</p><p>MIZRAHI, V. V. Treinamento em Linguagem C: curso completo em um volume. 2. ed.</p><p>São Paulo: Pearson, 2008.</p><p>PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.</p><p>PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.</p><p>SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson</p><p>Pioneira, 2003.</p><p>Leituras recomendadas</p><p>Estruturas de repetição12</p><p>ALGORITMOS E PROGRAMAÇÃO248</p><p>Se você encontrar algum problema nesse material, entre em</p><p>contato pelo email eadproducao@unilasalle.edu.br. Descreva o</p><p>que você encontrou e indique a página.</p><p>Lembre-se: a boa educação se faz com a contribuição de todos!</p><p>CONTRIBUA COM A QUALIDADE DO SEU CURSO</p><p>ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO</p><p>PELA SAGAH PARA ESTA PARTE DA UNIDADE.</p><p>PREZADO ESTUDANTE</p><p>Av. Victor Barreto, 2288</p><p>Canoas - RS</p><p>CEP: 92010-000 | 0800 541 8500</p><p>ead@unilasalle.edu.br</p><p>a média. Inicialmente, precisa somar todas as notas. Em cima da sua mesa, está uma cal-</p><p>culadora. Ele consulta cada um dos valores das notas que escreveu no quadro e utiliza essa</p><p>calculadora para fazer sua soma:</p><p>Soma = Nota1 + Nota2 + Nota3 + Nota4 + Nota5</p><p>O resultado da soma ele escreve no espaço que chamou de Resultado (Figura 1.2a).</p><p>Feita a soma, ela deve ser dividida por cinco para que seja obtida a média das notas. Utili-</p><p>zando novamente a calculadora, o professor consulta o que escreveu no espaço Resultado</p><p>(onde está a soma) e divide este valor por cinco. Como não vai mais precisar do valor da soma,</p><p>o professor utiliza o mesmo espaço, chamado Resultado, para escrever o valor obtido para</p><p>a média, apagando o valor anterior (Figura 1.2b).</p><p>Finalizando, o professor escreve as cinco notas obtidas nas provas e a média em uma folha,</p><p>utilizando uma máquina de escrever, para informar à direção da escola.</p><p>7</p><p>Xxxx</p><p>Xxxx</p><p>xxxx</p><p>Qweqweq</p><p>wewerwr</p><p>tyutu6</p><p>hjhk567</p><p>123456</p><p>Máquina de</p><p>escrever</p><p>Máquina de</p><p>calcular</p><p>Sequência</p><p>de ações</p><p>Provas</p><p>corrigidas</p><p>10 8 7</p><p>Nota1 Nota2 Nota3 Nota4 Nota5 Resultado</p><p>Quadro</p><p>Professor</p><p>8</p><p>Xxxx</p><p>Xxxx</p><p>xxxx</p><p>Provas</p><p>já usadas</p><p>figura 1.1 Simulação de um algoritmo.</p><p>Edelweiss_01.indd 8Edelweiss_01.indd 8 12/03/14 08:5912/03/14 08:59</p><p>25 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 9</p><p>A sequência de ações que foram executadas foi a seguinte:</p><p>1. ler a nota da primeira prova e escrevê-la em Nota1;</p><p>2. ler a nota da prova seguinte e escrevê-la em Nota2;</p><p>3. ler a nota da prova seguinte e escrevê-la em Nota3;</p><p>4. ler a nota da prova seguinte e escrevê-la em Nota4;</p><p>5. ler a nota da prova seguinte e escrevê-la em Nota5;</p><p>6. somar os valores escritos nos espaços Nota1, Nota2, Nota3, Nota4 e</p><p>Nota5. Escrever o resultado da soma em Resultado;</p><p>7. dividir o valor escrito em Resultado por cinco e escrever o valor deste</p><p>cálculo em Resultado;</p><p>8. usando a máquina de escrever, escrever os valores contidos em Nota1,</p><p>Nota2, Nota3, Nota4, Nota5 e Resultado;</p><p>9. terminar a execução desta tarefa.</p><p>Essa sequência de operações caracteriza um algoritmo, sendo que todas as ações realizadas</p><p>nesse algoritmo podem ser executadas por um computador. A tradução desse algoritmo para</p><p>uma linguagem que um computador possa interpretar gera o programa que deve ser exe-</p><p>cutado pelo computador. O professor corresponde à unidade central de processamento (UCP</p><p>ou, mais comumente, CPU, de Central Processing Unit), responsável pela execução desse pro-</p><p>grama. Essa unidade organiza o processamento e garante que as instruções sejam executadas</p><p>na ordem correta.</p><p>10 8 7 5 9 39</p><p>10 8 7 5 9 7,8</p><p>(a)</p><p>(b)</p><p>Quadro</p><p>Quadro</p><p>Nota1 Nota2 Nota3 Nota4 Nota5 Resultado</p><p>Nota1 Nota2 Nota3 Nota4 Nota5 Resultado</p><p>figura 1.2 Valores durante a simulação.</p><p>Edelweiss_01.indd 9Edelweiss_01.indd 9 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO26 10 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Fazendo um paralelo entre o exemplo e um computador real, os espaços desenhados na gra-</p><p>de do quadro constituem a memória principal do computador, que é composta por espaços</p><p>acessados pelos programas através de nomes dados pelo programador.</p><p>Nesses espaços são guardadas, durante o processamento, informações lidas na entrada e re-</p><p>sultados de processamentos, como no exemplo visto. Cada um desses espaços só pode conter</p><p>um valor a cada momento, perdendo o valor anterior se um novo valor for armazenado nele,</p><p>como ocorreu quando se escreveu a média em Resultado, apagando o valor da soma que</p><p>lá estava. Denomina-se variável cada um desses espaços utilizados para guardar valores,</p><p>denotando que seu valor pode variar ao longo do tempo. As instruções de um programa que</p><p>está sendo executado também são armazenadas na memória principal. Todas as informações</p><p>armazenadas nas variáveis da memória principal são perdidas no momento em que termina</p><p>a execução do programa.</p><p>Unidades de memória secundária podem ser utilizadas para guardar informações (dados) a</p><p>fim de serem utilizadas em outra ocasião. Exemplos de dispositivos de memória secundária</p><p>são HDs (Hard Disks), CDs, DVDs e pendrives.</p><p>A comunicação do computador com o usuário durante o processamento e ao seu final é feita</p><p>através de unidades de entrada e saída. No exemplo anterior, a pilha de provas corresponde</p><p>à unidade de entrada do computador, através da qual são obtidos os valores que serão utili-</p><p>zados no processamento. A unidade de entrada mais usada para interação entre o usuário e</p><p>o programa durante a execução é o teclado do computador. Quando se trata de imagens, a</p><p>unidade de entrada pode ser, por exemplo, uma máquina fotográfica ou um scanner.</p><p>A máquina de escrever corresponde à unidade de saída, que informa aos usuários o resul-</p><p>tado do processamento. Exemplos de unidades de saída são o vídeo do computador e uma</p><p>impressora.</p><p>As unidades de entrada e saída de dados constituem as únicas interfaces do computador com</p><p>seu usuário. Observe que, sem as unidades de entrada e saída, não é possível fornecer dados</p><p>ao computador nem saber dos resultados produzidos.</p><p>A máquina de calcular corresponde à unidade aritmética e lógica do computador, responsá-</p><p>vel pelos cálculos e inferências necessários ao processamento. Sua utilização fica totalmente</p><p>transparente ao usuário, que somente é informado dos resultados do processamento.</p><p>Resumindo, um computador processa dados. Processar compreende executar atividades</p><p>como, por exemplo, comparações, realização de operações aritméticas, ordenações. A partir</p><p>de dados (de entrada), processando-os, o computador produz resultados (saídas). Na figu-</p><p>ra 1.3, vê-se um esquema simplificado da organização funcional de um computador. Nela</p><p>podem ser observados os sentidos em que as informações fluem durante a execução de um</p><p>programa: o sistema central do computador compreende a CPU e a memória principal; na</p><p>CPU estão as unidades de controle e de aritmética e lógica; a unidade de controle tem acesso</p><p>à memória principal, às unidades de entrada e de saída de dados e aos dispositivos de me-</p><p>mória secundária.</p><p>Edelweiss_01.indd 10Edelweiss_01.indd 10 12/03/14 08:5912/03/14 08:59</p><p>27 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 11</p><p>1.1.2 comandos básicos executados por um computador</p><p>Analisando o exemplo anterior, identificamos as primeiras ações que podem ser executadas</p><p>por um computador:</p><p>■ obter um dado de uma unidade de entrada de dados, também chamada de leitura de</p><p>um dado;</p><p>■ informar um resultado através de uma unidade de saída, também chamada de escrita de</p><p>uma informação ou saída de um dado;</p><p>■ resolver expressões aritméticas e lógicas;</p><p>■ colocar o resultado de uma expressão em uma variável.</p><p>Essas ações são denominadas instruções ou comandos. Outros comandos serão vistos ao</p><p>longo deste livro.</p><p>1.1.3 da necessidade do desenvolvimento de algoritmos para</p><p>solucionar problemas computacionais</p><p>Nas atividades cotidianas já vistas, é sem dúvida necessária alguma organização por parte de</p><p>quem vai realizar a tarefa. No uso do telefone, retirar o fone do gancho e digitar o número e,</p><p>só depois, inserir o cartão não será uma boa estratégia, assim como, no caso da livraria, levar</p><p>o livro sem passar pelo caixa também resultará em problemas. Nessas atividades, no entanto,</p><p>grande parte das pessoas não necessita colocar por escrito os passos a realizar para cumprir</p><p>a tarefa. Porém, quando se trata de problemas a solucionar por computador, a sequência de</p><p>Unidade</p><p>de</p><p>entrada</p><p>Unidade</p><p>de</p><p>saída</p><p>Unidade</p><p>de</p><p>memória auxiliar</p><p>Memória</p><p>principal</p><p>Unidade Central de</p><p>Processamento</p><p>- UCP</p><p>Sistema central</p><p>Unidade</p><p>aritmética e</p><p>lógica</p><p>Unidade</p><p>de</p><p>controle</p><p>figura 1.3 Esquema simplificado de um computador.</p><p>Edelweiss_01.indd 11Edelweiss_01.indd 11 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO28 12 Algoritmos e Programação com Exemplos em Pascal e C</p><p>ações que o computador deve realizar é por vezes bastante extensa e nem sempre conhecida</p><p>e óbvia. Para a programação de computadores, a análise cuidadosa dos elementos envolvidos</p><p>em um problema e a organização criteriosa da sequência de passos necessários à sua solução</p><p>(algoritmo) devem obrigatoriamente preceder a escrita do programa que busque solucionar</p><p>o problema. Para problemas mais complexos, o recomendável é desenvolver um algoritmo</p><p>detalhado antes de passar à etapa de codificação, mas para problemas mais simples, o algo-</p><p>ritmo pode especificar apenas os passos principais.</p><p>1.1.4 formas de expressar um algoritmo</p><p>Em geral, no desenvolvimento de algoritmos computacionais não são utilizadas nem as lin-</p><p>guagens de programação nem a linguagem natural, mas formas mais simplificadas de lingua-</p><p>gens. As formas mais usuais de representação de algoritmos são a linguagem textual, alguma</p><p>pseudolinguagem e o fluxograma. Para exemplificar cada uma delas vamos usar o seguinte</p><p>exemplo: obter a soma de dois valores numéricos quaisquer.</p><p>linguagem textual. Foi a forma utilizada para introduzir o conceito de algoritmo nos exem-</p><p>plos anteriores. Analisando o problema aqui colocado, para obter a soma de dois valores é</p><p>preciso realizar três operações na ordem a seguir:</p><p>1. obter os dois valores</p><p>2. realizar a soma</p><p>3. informar o resultado</p><p>pseudolinguagem. Para padronizar a forma de expressar algoritmos são definidas pseu-</p><p>dolinguagens. Uma pseudolinguagem geralmente é bastante semelhante a uma linguagem</p><p>de programação, sem, entretanto, entrar em detalhes como, por exemplo, formatação de in-</p><p>formações de entrada e de saída. As operações básicas que podem ser executadas pelo com-</p><p>putador são representadas através de palavras padronizadas, expressas na linguagem falada</p><p>(no nosso caso, em Português). Algumas construções também são padronizadas, como as</p><p>que especificam onde armazenar valores obtidos e calculados, bem como a forma de calcular</p><p>expressões aritméticas e lógicas.</p><p>Antecipando o que será visto nos capítulos a seguir, o algoritmo do exemplo recém-discutido</p><p>é expresso na pseudolinguagem utilizada neste livro como:</p><p>Algoritmo 1.1 – Soma2</p><p>{INFORMAR A SOMA DE 2 VALORES}</p><p>Entradas: valor1, valor2 (real)</p><p>Saídas: soma (real)</p><p>início</p><p>ler (valor1, valor2) {ENTRADA DOS 2 VALORES}</p><p>soma ← valor1 + valor2 {CALCULA A SOMA}</p><p>escrever (soma) {INFORMA A SOMA}</p><p>fim</p><p>Edelweiss_01.indd 12Edelweiss_01.indd 12 12/03/14 08:5912/03/14 08:59</p><p>29 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 13</p><p>fluxograma. Trata-se de uma representação gráfica que possibilita uma interpretação visual</p><p>do algoritmo. Cada ação é representada por um bloco, sendo os blocos interligados por linhas</p><p>dirigidas (setas) que representam o fluxo de execução. Cada forma de bloco representa uma</p><p>ação. A Figura 1.4 mostra alguns blocos utilizados em fluxogramas neste livro, juntamente</p><p>com as ações que eles representam. São adotadas as formas propostas na padronização feita</p><p>pela ANSI (American National Standards Institute) em 1963 (Chapin, 1970), com algumas</p><p>adaptações. Outras formas de blocos serão introduzidas ao longo do texto. A representação</p><p>do algoritmo do exemplo acima está na Figura 1.5.</p><p>A representação através de fluxogramas não é adequada para algoritmos muito extensos,</p><p>com grande número de ações a executar. Utilizaremos a representação de fluxogramas so-</p><p>mente como apoio para a compreensão das diferentes construções que podem ser utilizadas</p><p>nos algoritmos.</p><p>1.1.5 eficácia e eficiência de algoritmos</p><p>Dois aspectos diferentes devem ser analisados quando se constrói um algoritmo para ser exe-</p><p>cutado em um computador: sua eficácia (exatidão) e sua eficiência.</p><p>eficácia (corretude) de um algoritmo. Um algoritmo deve realizar corretamente a tarefa</p><p>para a qual foi construído. Além de fazer o que se espera, o algoritmo deve fornecer o resul-</p><p>tado correto para quaisquer que sejam os dados fornecidos como entrada. A eficácia de um</p><p>algoritmo deve ser exaustivamente testada antes que ele seja implementado em um compu-</p><p>tador, o que levou ao desenvolvimento de diversas técnicas de testes, incluindo testes formais.</p><p>A forma mais simples de testar um algoritmo é através de um “teste de mesa”, no qual se si-</p><p>ENTRADA</p><p>lista de variáveis</p><p>variável expressão</p><p>Ponto em que inicia a execução do algoritmo.</p><p>Ponto em que termina a execução do algoritmo.</p><p>Entrada de dados: leitura de informações</p><p>para preencher a lista de variáveis.</p><p>Saída de dados: informa conteúdos das</p><p>variáveis da lista.</p><p>Atribuição: variável recebe o resultado da</p><p>expressão.</p><p>início</p><p>fim</p><p>SAÍDA</p><p>lista de variáveis</p><p>figura 1.4 Blocos de fluxograma.</p><p>Edelweiss_01.indd 13Edelweiss_01.indd 13 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO30 14 Algoritmos e Programação com Exemplos em Pascal e C</p><p>mula com lápis e papel sua execução, com conjuntos diferentes de dados de entrada. No final</p><p>de cada capítulo deste livro, são indicados alguns cuidados a adotar para verificar a exatidão</p><p>dos algoritmos durante os testes.</p><p>eficiência de um algoritmo. A solução de um problema através de um algoritmo não é</p><p>necessariamente única. Na maioria dos casos, algoritmos diferentes podem ser construídos</p><p>para realizar uma mesma tarefa. Neste livro será enfatizada a utilização de técnicas que levam</p><p>à construção de algoritmos mais eficientes. Entretanto, em alguns casos não se pode dizer a</p><p>priori qual a melhor solução. Pode-se, sim, calcular qual a forma mais eficiente, com base em</p><p>dois critérios: tempo de execução e espaço de memória ocupado. Aspectos de eficiência de</p><p>algoritmos são vistos em outro livro desta série (Toscani; Veloso, 2012).</p><p>Um exemplo da diferença entre eficácia e eficiência pode ser observado na receita de ovo</p><p>mexido mostrada a seguir:</p><p>1. ligar o fogão em fogo baixo;</p><p>2. separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto;</p><p>3. quebrar o ovo em uma tigela;</p><p>4. colocar sal na tigela;</p><p>5. misturar levemente o ovo e o sal, com um garfo;</p><p>6. aquecer a manteiga na frigideira até que comece a derreter;</p><p>7. jogar o ovo na frigideira, mexendo com uma colher até ficar firme;</p><p>8. retirar da frigideira e servir.</p><p>ENTRADA</p><p>valor1, valor2</p><p>soma valor1 + valor2</p><p>início</p><p>fim</p><p>SAÍDA</p><p>soma</p><p>figura 1.5 Fluxograma da soma de dois números.</p><p>Edelweiss_01.indd 14Edelweiss_01.indd 14 12/03/14 08:5912/03/14 08:59</p><p>31 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 15</p><p>Se analisarmos o algoritmo acima, podemos observar que, embora o ovo mexido seja obtido,</p><p>garantindo a eficácia da receita, existe uma clara ineficiência em relação ao gasto de gás, uma</p><p>vez que ligar o fogão não é pré-requisito para a quebra do ovo e mistura do ovo e do sal. Já</p><p>em outras ações, como as especificadas nos passos 3 e 4, a sequência não é relevante.</p><p>Se modificarmos apenas a sequência das ações, conforme indicado abaixo, então teremos um</p><p>algoritmo eficaz e mais eficiente:</p><p>1. separar 1 ovo, 1 colher de sobremesa de manteiga e sal a gosto;</p><p>2. quebrar o ovo em uma tigela;</p><p>3. colocar sal nesta tigela;</p><p>4. misturar levemente o ovo e o sal, com um garfo;</p><p>5. ligar o fogão em fogo baixo;</p><p>6. aquecer a manteiga na frigideira até que comece a derreter;</p><p>7. jogar o ovo na frigideira, misturando com uma colher até ficar firme;</p><p>8. retirar da frigideira e servir.</p><p>1.2 etapas de construção de um programa</p><p>A construção de um algoritmo para dar suporte computacional a uma aplicação do mundo</p><p>real deve ser feita com todo cuidado para que ele realmente execute as tarefas que se quer</p><p>de forma correta e em tempo razoável. Programar não é uma atividade trivial, muito antes</p><p>pelo contrário, requer muito cuidado e atenção. A dificuldade em gerar bons programas</p><p>levou à definição de técnicas específicas que iniciam frequentemente com a construção de</p><p>um algoritmo.</p><p>A forma mais simples de garantir a qualidade de um programa é construí-lo seguindo uma</p><p>série de etapas. Parte-se de uma análise inicial da realidade envolvida na aplicação, desenvol-</p><p>vendo a solução de forma gradual, e chega-se ao produto final: um programa que executa as</p><p>funcionalidades necessárias à aplicação.</p><p>A seguir, são explicadas as etapas que devem ser cumpridas para assegurar a construção de</p><p>um programa correto (Figura 1.6). Observe que este processo não é puramente sequencial,</p><p>mas, em cada etapa, pode ser necessário voltar a alguma etapa anterior para desenvolver com</p><p>mais detalhes algum aspecto.</p><p>■ análise detalhada do problema. Inicia-se com uma análise detalhada do problema,</p><p>identificando os aspectos que são relevantes para a sua solução. No Algoritmo 1.1, o</p><p>problema é:</p><p>Informar a soma de dois valores.</p><p>■ especificação dos requisitos do problema. Nessa etapa são identificados e especi-</p><p>ficados os resultados que deverão ser produzidos (saídas) e os dados que serão neces-</p><p>sários para a execução da tarefa requerida (entradas). No Algoritmo 1.1, os dados de</p><p>entrada e saída são:</p><p>Edelweiss_01.indd 15Edelweiss_01.indd 15 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO32 16 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Entradas: dois valores numéricos, digitados via teclado.</p><p>Saída: a soma dos dois valores, mostrada na tela.</p><p>Esse é um problema simples, adequado à introdução dos conceitos iniciais. Contudo, na</p><p>prática, não apenas os objetivos podem ser mais complexos como a identificação de en-</p><p>tradas e saídas pode incluir formatos e valores válidos, bem como quantidades de valores</p><p>e a especificação de outros dispositivos de entrada e saída.</p><p>■ construção de um algoritmo. A etapa seguinte é o projeto de um algoritmo que</p><p>solucione o problema, ou seja, de um conjunto finito de ações que, quando executadas</p><p>na ordem estabelecida, levem ao resultado desejado em um tempo finito. É importante</p><p>notar que mesmo os problemas mais simples tendem a ter mais de uma solução possí-</p><p>vel, devendo ser determinada a solução que será adotada. Nesta etapa já devem ser cria-</p><p>dos nomes de variáveis que irão armazenar os valores de entrada e os valores gerados</p><p>durante o processamento. O Algoritmo 1.1. representa uma possível solução alcançada</p><p>nesta etapa.</p><p>■ validação do algoritmo. Em seguida, deve ser feita a validação lógica do algoritmo</p><p>desenvolvido. Essa validação muitas vezes é feita através de um teste de mesa, ou seja,</p><p>simulando sua execução com dados virtuais. Procura-se, através desses testes, verificar se</p><p>a solução proposta atinge o objetivo. Devem ser feitos testes tanto com valores corretos</p><p>como incorretos. No exemplo que está sendo utilizado aqui, os dados para testes devem</p><p>incluir valores nulos, positivos e negativos, como por exemplo:</p><p>Problema</p><p>Entradas</p><p>e saídas</p><p>Verificação do</p><p>programa</p><p>Manutenção</p><p>Construção do</p><p>algoritmo</p><p>Análise</p><p>Validação do</p><p>algoritmo</p><p>Construção do</p><p>programa</p><p>figura 1.6 Etapas da construção de um programa.</p><p>Edelweiss_01.indd 16Edelweiss_01.indd 16 12/03/14 08:5912/03/14 08:59</p><p>33 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 17</p><p>Valor1 Valor2 Soma</p><p>0 0 0</p><p>26 12 38</p><p>-4 –10 –14</p><p>12 –10 2</p><p>-5 2 –3</p><p>■ codificação do programa. É a tradução do algoritmo criado para resolver o problema</p><p>para uma linguagem de programação. Os programas em Pascal e C gerados a partir do</p><p>algoritmo desenvolvido para o exemplo (Algoritmo 1.1) são apresentados no Capítulo 3.</p><p>■ verificação do programa. Consiste nas verificações sintática (compilação) e semântica</p><p>(teste e depuração) do programa gerado. Os mesmos valores utilizados no teste de mesa</p><p>podem ser utilizados para testar o programa gerado.</p><p>■ manutenção. Uma vez considerado pronto, o programa passa a ser utilizado por usuá-</p><p>rios. A etapa de manutenção do programa inicia no momento em que ele é liberado para</p><p>execução, e acompanha todo seu tempo de vida útil. A manutenção tem por finalidade</p><p>corrigir eventuais erros detectados, assim como adicionar novas funcionalidades.</p><p>Cada uma dessas fases é importante, devendo ser respeitada e valorizada para se chegar a</p><p>programas de qualidade. Neste sentido, aqui são fornecidos subsídios a fim de que todas as</p><p>etapas sejam consideradas durante a escrita de programas como, por exemplo, a indicação</p><p>de valores que devem ser utilizados nos testes de cada comando e conselhos para deixar os</p><p>programas legíveis, de modo a facilitar a sua manutenção.</p><p>1.3 paradigmas de programação</p><p>O programa realmente executado por um computador é escrito em uma linguagem com-</p><p>preendida pela máquina, por isso denominada linguagem de máquina, na qual as instru-</p><p>ções são codificadas no sistema de numeração binário. A utilização direta de linguagem de</p><p>máquina é bastante complicada. Para tornar a escrita de programas mais acessível a usuá-</p><p>rios comuns foram desenvolvidas linguagens de mais alto nível, denominadas linguagens de</p><p>programação. São linguagens que permitem a especificação das instruções que deverão ser</p><p>executadas pelo computador através de uma linguagem mais próxima da linguagem natural.</p><p>Um programa escrito numa linguagem de programação, denominado programa-fonte, deve</p><p>ser primeiro traduzido para linguagem de máquina, para só então ser executado pelo com-</p><p>putador. A tradução do programa-fonte para o programa em linguagem de máquina corres-</p><p>pondente é feita por um outro programa, específico para a linguagem utilizada, denominado</p><p>compilador (Figura 1.7).</p><p>Na busca de uma forma simples, clara e precisa de escrever programas, diversas linguagens</p><p>de programação foram desenvolvidas nos últimos anos. Toda linguagem possui uma sintaxe</p><p>bem definida, que determina as construções corretas a serem utilizadas para a elaboração</p><p>de programas. Além disso, cada linguagem de programação utiliza um conjunto de concei-</p><p>Edelweiss_01.indd 17Edelweiss_01.indd 17 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO34 18 Algoritmos e Programação com Exemplos em Pascal e C</p><p>tos adotados na solução de problemas, o qual corresponde à semântica desta linguagem,</p><p>ou seja, à forma como construções sintaticamente corretas são executadas. Esses conceitos</p><p>possibilitam diferentes abordagens de problemas e formulações de soluções, isto é, seguem</p><p>diferentes paradigmas de programação.</p><p>A palavra “paradigma” corresponde a um modelo ou padrão de como uma realidade é entendi-</p><p>da e de como se interage com essa realidade. Aqui, um paradigma de programação corresponde</p><p>à forma como a solução está estruturada e será executada no programa gerado, incluindo téc-</p><p>nicas e conceitos específicos, bem como os recursos disponibilizados. Os principais paradigmas</p><p>das linguagens de programação são (Ghezzi; Jazayeri, 1987; Melo, Silva, 2003; Sebesta, 2003):</p><p>■ imperativo ou procedural, no qual um programa é composto por uma sequência de</p><p>comandos a serem executados pelo computador em uma determinada ordem. Dentre as</p><p>linguagens de programação voltadas a esse paradigma destacam-se Pascal, C, Fortran,</p><p>Cobol, PL/1, Basic, Algol, Modula e Ada, entre outras;</p><p>■ funcional, em que um programa é composto pela declaração de funções que transfor-</p><p>mam a(s) entrada(s) na(s) saída(s) desejada(s). Exemplos de linguagens funcionais são</p><p>Lisp, ML, Miranda, Haskell e OCaml;</p><p>■ lógico,</p><p>que utiliza a avaliação de condições lógicas como base para a escrita dos progra-</p><p>mas. Um programa é composto por regras que disparam ações a partir da identificação</p><p>de premissas. Um exemplo desse paradigma é a linguagem Prolog;</p><p>■ orientação a objetos, em que o mundo real é representado por meio de classes de</p><p>objetos e das operações que podem ser realizadas sobre eles, as quais definem seu com-</p><p>portamento. Herança e polimorfismo são conceitos básicos adotados nesse paradigma.</p><p>Smalltalk, C++, Java, PascalOO, Delphi, C#, Eiffel e Simula são exemplos de linguagens</p><p>orientadas a objetos.</p><p>A forma de escrever um programa em cada um desses paradigmas é bastante diferente. Neste</p><p>livro será considerado somente o paradigma imperativo ou procedural. Essa opção, para</p><p>um primeiro curso em programação, justifica-se pelas seguintes razões:</p><p>■ o paradigma imperativo permite representar de uma forma intuitiva os problemas do dia</p><p>a dia, que geralmente são executados através de sequências de ações;</p><p>Programa-fonte</p><p>Programa em</p><p>linguagem de</p><p>programação</p><p>Programa em</p><p>linguagem de</p><p>máquina</p><p>COMPILADOR</p><p>Programa executável</p><p>figura 1.7 Tradução de programa-fonte para executável.</p><p>Edelweiss_01.indd 18Edelweiss_01.indd 18 12/03/14 08:5912/03/14 08:59</p><p>35 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 19</p><p>■ historicamente, os primeiros programas foram desenvolvidos utilizando linguagens impe-</p><p>rativas, sendo esse um paradigma dominante e bem estabelecido;</p><p>■ existe um grande número de algoritmos e de sistemas implementados em linguagens</p><p>que seguem esse paradigma, os quais podem ser utilizados como base para o desenvol-</p><p>vimento de novos programas.</p><p>A opção de utilizar as linguagens Pascal e C neste livro deu-se por serem essas as linguagens</p><p>mais utilizadas como introdutórias à programação na maior parte dos cursos brasileiros de</p><p>ciência da computação, informática e engenharia da computação.</p><p>A linguagem Pascal foi definida por Niklaus Wirth em 1970 (Wirth, 1971, 1972, 1978)</p><p>com a finalidade de ser utilizada em aplicações de propósito geral e, principalmente, para</p><p>ensino de programação. Uma característica importante de Pascal é que foi, desde sua criação,</p><p>pensada para dar suporte à programação estruturada. Pascal serviu de base para o desenvol-</p><p>vimento de diversas outras linguagens de programação (Ghezzi; Jazayeri, 1987). Portanto, o</p><p>aprendizado de novas linguagens de programação, sobretudo as que seguem o paradigma</p><p>imperativo, se torna mais fácil para quem conhece Pascal.</p><p>A linguagem C foi desenvolvida por Dennis Ritchie nos anos 1970 (Kernighan; Ritchie, 1988)</p><p>com o propósito de ser uma linguagem para a programação de sistemas. É hoje largamente</p><p>utilizada em universidades e no desenvolvimento de software básico.</p><p>1.4 programação estruturada</p><p>A programação estruturada (Jackson, 1975) pode ser vista como um subconjunto do pa-</p><p>radigma imperativo. Baseia-se no princípio de que o fluxo do programa deve ser estruturado,</p><p>devendo esse fluxo ficar evidente a partir da estrutura sintática do programa. A estruturação</p><p>deve ser garantida em dois níveis: de comandos e de unidades.</p><p>No nível de comandos, a programação estruturada fundamenta-se no princípio básico de que</p><p>um programa deve possuir um único ponto de entrada e um único ponto de saída, existindo</p><p>de “1 a n” caminhos definidos desde o princípio até o fim do programa e sendo todas as ins-</p><p>truções executáveis, sem que apareçam repetições (loops) infinitas de alguns comandos. Nes-</p><p>se ambiente, o programa deve ser composto por blocos elementares de instruções (coman-</p><p>dos), interconectados através de apenas três mecanismos de controle de fluxo de execução:</p><p>sequência, seleção e iteração. Cada bloco elementar, por sua vez, é delimitado por um ponto</p><p>de início – necessariamente no topo do bloco – e por um ponto de término – necessariamente</p><p>no fim do bloco – de execução, ambos muito bem definidos. Os três mecanismos de controle</p><p>do fluxo de execução estão representados na Figura 1.8 através de fluxogramas, nos quais se</p><p>observa claramente os pontos de entrada e de saída de cada bloco de instruções. Alguns dos</p><p>blocos que constam nessa figura serão vistos nos próximos capítulos deste livro.</p><p>Uma característica fundamental da programação estruturada é que o uso de desvios incondi-</p><p>cionais no programa, implementados pelo comando GOTO (VÁ PARA), é totalmente proibido.</p><p>Edelweiss_01.indd 19Edelweiss_01.indd 19 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO36</p><p>37 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>Capítulo 1 Fundamentos 21</p><p>1.5 elementos de representação interna de dados</p><p>Internamente, os computadores digitais operam usando o sistema numérico binário, que</p><p>utiliza apenas os símbolos 0 e 1. Na memória e nos dispositivos de armazenamento, o com-</p><p>ponente conceitual básico e a menor unidade de armazenamento de informação é o bit. Bit</p><p>vem do Inglês binary digit, ou seja, dígito binário, e um bit pode memorizar somente um</p><p>entre dois valores: zero ou um. Qualquer valor numérico pode ser expresso por uma sucessão</p><p>de bits usando o sistema de numeração binário.</p><p>Para representar caracteres, são utilizados códigos armazenados em conjuntos de bits. Os</p><p>códigos mais comuns armazenam os caracteres em bytes, que são conjuntos de 8 bits. Nos</p><p>códigos de representação de caracteres, cada caractere tem associado a si, por convenção,</p><p>uma sequência específica de zeros e uns. Três códigos de representação de caracteres são</p><p>bastante utilizados: ASCII (7 bits por caractere), EBCDIC (8 bits por caractere) e UNICODE (16,</p><p>32 ou mais bits).</p><p>Tanto o ASCII (American Standard Code for Information Interchange), que é o código utiliza-</p><p>do pela maioria dos microcomputadores e em alguns periféricos de equipamentos de grande</p><p>porte, quanto o EBCDIC (Extended Binary Coded Decimal Interchange Code) utilizam um byte</p><p>para representar cada caractere, sendo que, na representação do conjunto de caracteres ASCII</p><p>padrão, o bit mais significativo (bit mais à esquerda) do byte é sempre igual a 0. A represen-</p><p>tação dos caracteres A e Z nos dois códigos é:</p><p>Caracteres EBCDIC ASCII</p><p>A 1100 0001 0100 0001</p><p>Z 1110 1001 0101 1010</p><p>O UNICODE é promovido e desenvolvido pelo Unicode Consortium. Busca permitir aos com-</p><p>putadores representar e manipular textos de forma consistente nos múltiplos sistemas de</p><p>escrita existentes. Atualmente, ele compreende mais de 100.000 caracteres. Dependendo do</p><p>conjunto de caracteres que esteja em uso em uma aplicação, um, dois ou mais bytes podem</p><p>ser utilizados na representação dos caracteres.</p><p>As unidades de medida utilizadas para quantificar a memória principal e indicar a capacidade</p><p>de armazenamento de dispositivos são:</p><p>K quilo (mil) 103</p><p>M mega (milhão) 106</p><p>G giga (bilhão) 109</p><p>T tera (trilhão) 1012</p><p>O sistema métrico de unidades de medida utiliza os mesmos prefixos, mas o valor exato de</p><p>cada um deles em informática é levemente superior. Como o sistema de numeração utilizado</p><p>Edelweiss_01.indd 21Edelweiss_01.indd 21 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO38 22 Algoritmos e Programação com Exemplos em Pascal e C</p><p>internamente em computadores é o binário (base 2), as capacidades são representadas como</p><p>potências de 2:</p><p>K 1.024 210</p><p>M 1.048.576 220</p><p>etc...</p><p>A grafia dos valores expressos em múltiplos de bytes pode variar. Assim, por exemplo, 512</p><p>quilobytes podem ser escritos como 512K, 512KB, 512kB ou 512Kb. Já os valores expressos</p><p>em bits, via de regra, são escritos por extenso, como em 512 quilobits.</p><p>1.6 dicas</p><p>Critérios que devem ser observados ao construir um algoritmo:</p><p>■ procurar</p><p>soluções simples para proporcionar clareza e facilidade de entendimento do</p><p>algoritmo;</p><p>■ construir o algoritmo através de refinamentos sucessivos;</p><p>■ seguir todas as etapas necessárias para a construção de um algoritmo de qualidade;</p><p>■ identificar o algoritmo, definindo sempre um nome para ele no cabeçalho. Este nome</p><p>deve traduzir, de forma concisa, seu objetivo. Por exemplo: Algoritmo 1.1 – Soma2</p><p>indica, através do nome, que será feita a soma de dois valores;</p><p>■ definir, também no cabeçalho, o objetivo do algoritmo, suas entradas e suas saídas;</p><p>■ nunca utilizar desvios incondicionais, como GOTO (VÁ PARA).</p><p>1.7 testes</p><p>Testes de mesa. É importante efetuar, sempre que possível, testes de mesa para verificar a efi-</p><p>cácia (corretude) de um algoritmo antes de implementá-lo em uma linguagem de programa-</p><p>ção. Nestes testes, deve-se utilizar diferentes conjuntos de dados de entrada, procurando usar</p><p>dados que cubram a maior quantidade possível de situações que poderão ocorrer durante a</p><p>utilização do algoritmo. Quando o algoritmo deve funcionar apenas para um intervalo defini-</p><p>do de valores, é recomendável que se simule a execução para valores válidos, valores limítrofes</p><p>válidos e inválidos e valores inválidos acima e abaixo do limite estabelecido. Por exemplo, se um</p><p>determinado algoritmo deve funcionar para valores inteiros, no intervalo de 1 a 10, inclusive,</p><p>o teste de mesa deveria incluir a simulação da execução para, no mínimo, os valores 0, 1, 10,</p><p>11 e um valor negativo.</p><p>Edelweiss_01.indd 22Edelweiss_01.indd 22 12/03/14 08:5912/03/14 08:59</p><p>39 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>26 Algoritmos e Programação com Exemplos em Pascal e C</p><p>Para que um algoritmo se transforme em um programa executável, é necessário que esse seja</p><p>inicialmente traduzido para uma linguagem de programação pelo compilador corresponden-</p><p>te, que irá gerar o programa a ser executado. Essa tradução é feita com base na gramática da</p><p>linguagem. Nesse processo, cada símbolo, cada palavra e cada construção sintática utilizados</p><p>no programa devem ser reconhecidos pelo compilador. Isso é possível porque toda linguagem</p><p>de programação possui uma gramática bem definida que rege a escrita dos programas, ou</p><p>seja, que define sua sintaxe.</p><p>A primeira representação da gramática de uma linguagem de programação foi apresentada</p><p>por John Backus, em 1959, para expressar a gramática da linguagem Algol. Esta notação deu</p><p>origem à BNF (Backus-Naur Form ou Backus Normal Form) (Knuth, 2003; Wiki, 2012),</p><p>que se tornou a forma mais utilizada para representar a gramática de linguagens de progra-</p><p>mação. Neste livro, é utilizada uma forma simplificada da BNF (ver Apêndice) para representar</p><p>a gramática da pseudolinguagem e das linguagens Pascal e C.</p><p>As gramáticas das linguagens de programação imperativas são bastante parecidas no que se</p><p>refere a unidades léxicas e comandos disponíveis. Esses elementos são apresentados a partir</p><p>deste capítulo, que inicia apresentando as unidades léxicas de linguagens de programação</p><p>imperativas. A seguir, ele mostra como devem ser feitas as declarações de variáveis, de cons-</p><p>tantes e de tipos, incluindo a análise de diferentes tipos de variáveis e dos valores que podem</p><p>conter. Por fim, esse capítulo apresenta as expressões aritméticas e lógicas e suas represen-</p><p>tações. Outros tipos de declarações serão vistos mais adiante neste livro. Todos os conceitos</p><p>são apresentados e analisados na linguagem algorítmica, sendo depois traduzidos para as</p><p>linguagens de programação Pascal e C.</p><p>2.1 componentes das linguagens de programação</p><p>Os componentes básicos de uma linguagem de programação são denominados unidades</p><p>léxicas. As unidades léxicas mais simples, analisadas a seguir, são valores literais, identificado-</p><p>res, palavras reservadas, símbolos especiais e comentários.</p><p>2.1.1 literais</p><p>Literais são valores representados explicitamente no programa e que não mudam durante a</p><p>execução. Podem ser números, valores lógicos, caracteres ou strings.</p><p>números. Usualmente é utilizada a notação decimal para representar números nos progra-</p><p>mas, embora se saiba que internamente eles sejam representados na forma binária. Podem</p><p>ser utilizados valores numéricos inteiros ou fracionários (chamados de reais), positivos ou</p><p>negativos. Os números são representados na linguagem algorítmica exatamente como apare-</p><p>cem nas expressões aritméticas em português.</p><p>Ex.: 123 –45 +6,7</p><p>As linguagens de programação geralmente também permitem uma forma alternativa de es-</p><p>crita, mais compacta, de números muito grandes ou muito pequenos, denominada notação</p><p>Edelweiss_02.indd 26Edelweiss_02.indd 26 12/03/14 08:5912/03/14 08:59</p><p>ALGORITMOS E PROGRAMAÇÃO40 Capítulo 2 Unidades Léxicas, Variáveis, Constantes e Expressões 27</p><p>exponencial, científica ou de ponto flutuante. Nessa notação, um número real é representado</p><p>por um valor inteiro (denominado mantissa) multiplicado por potências de 10 (indicadas pelo</p><p>seu expoente). Por exemplo, o valor 3.000.000.000.000 seria representado como 3 x 1011.</p><p>Tanto a mantissa como o expoente podem ter sinal (positivo ou negativo). Cada linguagem de</p><p>programação define uma forma para a representação de números em notação exponencial,</p><p>conforme será visto nas seções correspondentes a Pascal e C.</p><p>valores lógicos. Os valores lógicos (ou booleanos) verdadeiro e falso podem ser utiliza-</p><p>dos diretamente nos programas quando for feita alguma comparação.</p><p>caracteres. Permitem representar um símbolo ASCII qualquer, como uma letra do alfa-</p><p>beto, um dígito numérico (aqui, sem conotação quantitativa, apenas como representação</p><p>de um símbolo) ou um caractere especial (um espaço em branco também corresponde a</p><p>um caractere especial). Nos programas, os caracteres são geralmente representados entre</p><p>apóstrofos. Essa é também a forma utilizada na pseudolinguagem aqui empregada.</p><p>Ex.: 'A' 'b' '4' '+'</p><p>strings. São sequências de um ou mais caracteres. Quaisquer caracteres podem ser utiliza-</p><p>dos (letras, dígitos e símbolos), incluindo o símbolo que representa um espaço em branco.</p><p>Strings normalmente são representadas entre apóstrofos em um programa, forma também</p><p>utilizada na pseudolinguagem.</p><p>Ex.: 'Ana Maria' 'A12B3' 'a$b' '91340-330/1'</p><p>2.1.2 identificadores</p><p>São as palavras criadas pelo programador para denominar o próprio programa ou elementos</p><p>dentro do mesmo, tais como: variáveis, constantes ou subprogramas. Toda linguagem de</p><p>programação define regras específicas para a formação de identificadores, para que eles</p><p>possam ser reconhecidos pelo compilador.</p><p>Na pseudolinguagem utilizada neste livro, um identificador deve sempre iniciar por uma letra,</p><p>seguida de qualquer número de letras e dígitos, incluindo o símbolo “_” (sublinhado), por ser</p><p>essa a forma mais frequentemente utilizada em linguagens de programação. Tratando-se de</p><p>uma pseudolinguagem, a acentuação e a letra “ç” também podem ser utilizadas de forma</p><p>a traduzir de forma mais fiel os valores que devem ser representados. A pseudolinguagem</p><p>não diferencia letras maiúsculas de minúsculas, mas se recomenda que sejam usadas apenas</p><p>minúsculas nos nomes de identificadores, reservando as maiúsculas para iniciais e para casos</p><p>específicos que serão destacados oportunamente.</p><p>Exemplos de identificadores:</p><p>valor</p><p>número1</p><p>a7b21</p><p>Nome_Sobrenome</p><p>Edelweiss_02.indd 27Edelweiss_02.indd 27 12/03/14 08:5912/03/14 08:59</p><p>41 Introdução aos Algoritmos UNIDADE 1</p><p>Conceitos Básicos e Tipos de Dados PARTE 2</p><p>28 Algoritmos e Programação com Exemplos em Pascal e C</p><p>2.1.3 palavras reservadas</p><p>São identificadores que têm um significado especial na linguagem,</p>