Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 1 ESTRUTURA DE DADOS I PROF. CARLOS DANILO LUZ “A Faculdade Católica Paulista tem por missão exercer uma ação integrada de suas atividades educacionais, visando à geração, sistematização e disseminação do conhecimento, para formar profissionais empreendedores que promovam a transformação e o desenvolvimento social, econômico e cultural da comunidade em que está inserida. Missão da Faculdade Católica Paulista Av. Cristo Rei, 305 - Banzato, CEP 17515-200 Marília - São Paulo. www.uca.edu.br Nenhuma parte desta publicação poderá ser reproduzida por qualquer meio ou forma sem autorização. Todos os gráficos, tabelas e elementos são creditados à autoria, salvo quando indicada a referência, sendo de inteira responsabilidade da autoria a emissão de conceitos. Diretor Geral | Valdir Carrenho Junior ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 3 SUMÁRIO AULA 01 AULA 02 AULA 03 AULA 04 AULA 05 AULA 06 AULA 07 AULA 08 AULA 09 AULA 10 AULA 11 AULA 12 AULA 13 AULA 14 AULA 15 AULA 16 05 18 37 56 72 82 90 97 108 123 132 141 149 155 163 173 CONCEITOS INICIAIS SOBRE LINGUAGEM DE PROGRAMAÇÃO C ENTRADA E SAÍDA DE DADOS, EXPRESSÕES E OPERADORES INSTRUÇÕES CONDICIONAIS DE DECISÃO ESTRUTURAS DE REPETIÇÃO, VETORES E MATRIZES FUNÇÕES E PONTEIROS LISTAS ENCADEADAS E DUPLAMENTE ENCADEADAS LISTAS ORDENADAS E CIRCULARES LISTAS DINÂMICAS ESTRUTURAS DE PILHAS E FILAS ÁRVORES BINÁRIA E ESTRITAMENTE BINÁRIA ÁRVORE BINÁRIA COMPLETA E IMPLEMENTAÇÃO EM LINGUAGEM C BUSCAS EM ÁRVORES BINÁRIAS E MONTAGEM DE ÁRVORES BINÁRIAS TÉCNICAS DE ORDENAÇÃO BUBBLESORT E INSERTIONSORT TÉCNICAS DE ORDENAÇÃO SELECTIONSORT E QUICKSORT TÉCNICAS DE ORDENAÇÃO SHELLSORT E MERGESORT TEORIA DOS GRAFOS ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 4 INTRODUÇÃO Caro(a) aluno(a), seja bem-vindo(a) a este livro que foi elaborado especialmente para que você possa conhecer os conceitos básicos e iniciais de lógica de programa- ção e estrutura de dados. O livro está dividido em diversas aulas, nas quais aprende- remos os conceitos iniciais da linguagem de programação C, que é uma linguagem muito popularizada por ser considerada base para o desenvolvimento das linguagens atuais, como C#, JAVA, PHP, entre outras. Todas as unidades apresentam exemplos utilizando a linguagem C. Veremos um breve histórico da linguagem C, suas características e os conceitos iniciais sobre programação. Estudaremos como é a estrutura básica de um programa em linguagem C, a declaração de variáveis e manipulação de dados através de entrada e saída de dados. Conheceremos também os operadores e expressões, entre outros conceitos que o(a) ajudarão no desenvolvimento de seus programas em linguagem C, através disso, você, aluno(a), terá o conhecimento necessário para desenvolver os seus primeiros programas em linguagem C. Será apresentado a você as estruturas de dados em forma de árvore, que é muito utilizada para a organização dos dados na memória por ser de fácil manipulação pelo sistema. Iremos estudar também sobre as listas lineares que são um tipo de vetor para armazenarmos e recuperamos dados. Veremos ainda as listas encadeadas, du- plamente encadeadas, circulares e ordenadas. Por fim, será visto o conceito das duas estruturas de dados mais importantes, estrutura de FILA e PILHA, conceitos esses utilizados para diversos algoritmos de busca e ordenação de dados. Conheceremos os conceitos sobre ordenação de dados, pois quanto mais organi- zados e ordenados os elementos, mais rápida será a manipulação deles. Serão com- preendidos alguns dos algoritmos de ordenação mais comuns como o BubbleSort (método bolha), InsertionSort, ShellSort (concha), MergeSort (dividir para conquistar) entre outros. Por fim, vamos estudar sobre a teoria dos grafos, como esta teoria surgiu, a sua importância para a área da computação, suas características e representações. Desejo a você, aluno(a), uma ótima leitura e bons estudos! ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 5 AULA 1 CONCEITOS INICIAIS SOBRE LINGUAGEM DE PROGRAMAÇÃO C Fonte: https://br.freepik.com/fotos-gratis/codigo-de-programacao-com-fundo-laptop_902700.htm A linguagem C está entre uma das linguagens de programação mais conhecidas entre a comunidade de programadores. Inicialmente desenvolvida para criação de sis- temas operacionais, ao longo dos anos foi ganhando cada vez mais adeptos de sua estrutura. Além de sistemas operacionais, a linguagem foi e ainda é muito utilizada na criação de sistemas embarcados e jogos eletrônicos. Muitas vezes subestimada por ser uma das primeiras linguagens de alto nível, a linguagem C oferece muitos recursos e flexibilidade no desenvolvimento de software. Além disso, muito do que iremos apresentar nesta unidade pode ser compartilhado com outras linguagens de programação, visto que a estrutura apresentada possui características universais de programação. Para iniciar nossa abordagem, vamos conhecer um pouco da história dessa linguagem e suas primeiras contribuições para o desenvolvimento de software. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 6 Neste primeiro momento, vamos apresentar um pouco da história e as caracterís- ticas básicas da linguagem C. Esta que é uma das primeiras linguagens de programa- ção e que deu origem a outras linguagens como C++, Java, C#, Objective C. Além de influenciar o desenvolvimento de outras linguagens, a linguagem C é uma linguagem bastante flexível, sendo facilmente utilizada em qualquer tipo de plataforma. Com uma sintaxe simples e estruturada, a linguagem C permite a criação de programas extremamente rápidos em tempo de execução. 1.1 Linguagem de programação C Durante a evolução dos computadores, o desenvolvimento de softwares sempre esteve condicionado à capacidade das linguagens de programação. À medida com que os computadores foram avançando tecnologicamente, as linguagens de progra- mação também tiveram avanços significativos que permitiram a criação de softwares mais robustos. Dentre as linguagens de programação que permearam os primeiros avanços da computação, a linguagem C foi uma das que se popularizou entre a comu- nidade de programadores. A linguagem C foi desenvolvida por Dennis Ritchie no início da década de 70, que também era um dos responsáveis pelo desenvolvimento do sistema operacional Unix. Inicialmente, a linguagem foi implementada em um computador DEC PDP-11 que uti- liza o sistema operacional Unix. Vale ressaltar que a linguagem C origina-se a partir do processo de desenvolvimento de outras linguagens como a BCPL, desenvolvida por Martin Richards e que originou a criação da linguagem B, desenvolvida por Kenneth Thompson. Pode-se dizer que a linguagem desenvolvida por Thompson foi a precur- sora da linguagem C. Estes três indivíduos faziam parte da equipe de desenvolvedores da Laboratórios Bell da AT&T, uma empresa de telecomunicações norte americana. Inicialmente, a proposta da linguagem C era o desenvolvimento de sistemas opera- cionais e compiladores, assim, uma nova versão do Unix foi totalmente desenvolvida utilizando a nova linguagem. Isso fez com que a linguagem C ganhasse cada vez mais adeptos pelo mundo, visto a popularidade do sistema Unix. Outro aspecto fundamen- tal neste processo de disseminação da linguagem C foi por meio de uma publicação feita no ano de 1978, denominada The C Programming Language por Kernigham e Ritchie. O sucesso do livro influenciou diretamente a adesão da linguagem por grande parte ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 7 da comunidadede programadores. De acordo com Schildt (1997, p. 85), “embora não houvesse um padrão, os códigos-fontes escritos em linguagem C, eram altamente compatíveis”. Dessa forma, um programa que era escrito em um microcomputador era facilmente compilado em outro. Com a popularidade dos microcomputadores, um grande número de implementa- ções de C foi criado. Quase que por um milagre, os códigos-fontes aceitos por essas implementações eram altamente compatíveis (isto é, um programa escrito com um deles podia normalmente ser compilado com sucesso usando-se outro) (SCHILDT, 1997, p. 3). No entanto, a partir da década de 80, a linguagem C passou a ser adotada por inúmeras empresas no desenvolvimento de aplicações de propósito geral. Esse cres- cimento fez com que o número de compiladores para a linguagem C também au- mentasse. Mas, existiam muitas discrepâncias entre eles, justamente por não haver um padrão para a linguagem. Somente em 1983, foi estabelecido um padrão para a linguagem C, por meio de um comitê organizado pelo American National Standards Institute (ANSI). Atualmente, a maioria dos compiladores já adotam o padrão C ANSI. A linguagem Estruturada C Uma das características do C é o fato de ser uma linguagem estruturada. Embora não apresente rigorosamente os mesmos atributos de outras linguagens estrutura- das em blocos, ainda assim trata-se de uma linguagem estruturada, que permite a compartimentalização do código e seus respectivos dados. Por meio das sub-rotinas (funções), a linguagem emprega o uso de variáveis lo- cais, dessa forma, eventuais ações que acontecem dentro de cada sub-rotina não ocasionam efeitos inesperados em outras partes do código. O uso de variáveis locais torna-se uma grande vantagem em relação às variáveis globais, visto que o uso exces- sivo de variáveis globais pode resultar em erros de compilação ou até mesmo outras situações indesejadas no programa. A estrutura apresentada pela linguagem C permite ao programador compartilhar funções de maneira fácil e dinâmica, de modo que não é necessário saber exatamen- te como a função executa uma determinada ação. Basta que o programador saiba o que ela faz e, então, chamá-la em um trecho de código que deseja contemplar. O uso de funções estabelece a codificação em partes separadas, de acordo com suas funcionalidades, permitindo um desenvolvimento modular. Assim como em outras lin- ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 8 guagens, a linguagem C permite o uso de estruturas de repetição e estruturas condi- cionais (laços), tornando o código mais limpo e eficiente. 1.2 Estrutura básica do arquivo em linguagem C Agora que já conhecemos um pouco da estrutura que compõe a linguagem C, va- mos avançar nossos estudos trazendo estes conceitos à prática. A seguir, temos um exemplo de código em linguagem C, que apresenta a frase “Olá Mundo!”. O primeiro passo para iniciarmos nosso programa é incluirmos a biblioteca que fun- ciona como uma espécie de cabeçalho do programa, ou seja, deve ser declarada no início do código. A biblioteca stdio.h é uma das mais conhecidas, pois permite utilizar as funções de entrada e saída do programa, neste caso, os comandos printf e scanf. No entanto, é óbvio que um programa pode possuir outras bibliotecas, considerando suas necessidades específicas. Caso tente utilizar uma determinada função, cuja bi- blioteca não tenha sido informada, certamente o programa apresentará um erro du- rante a compilação. Mais adiante veremos outras bibliotecas. Para declarar uma determinada biblioteca devemos utilizar o comando #include, que representa a inclusão da biblioteca. Além disso, é importante destacar que toda declaração de biblioteca deve ser informada entre os sinais <>. Segue abaixo o exem- plo da biblioteca stdio.h: Além da biblioteca, outro elemento obrigatório em nosso código é a função int main. A função main define a estrutura contida dentro dela como sendo a parte principal do programa. No padrão ANSI, esse tipo de função retorna um valor do tipo inteiro (int). Assim, a declaração da função deve ser feita da seguinte forma: #include <stdio.h> #include <stdio.h> int main(){ } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 9 Após incluir a biblioteca e declarar a função int main, estamos prontos para apre- sentar nosso primeiro programa em linguagem C com a expressão “Olá Mundo!”. Se- gue abaixo o exemplo: Basicamente, nosso primeiro programa em linguagem C está pronto. No entanto, ainda precisamos adicionar o comando de retorno. Para isso utilizamos o comando return: Opcionalmente, podemos atribuir um valor de retorno para o comando. Neste caso, foi definido o valor 0 (zero), que representa a execução do programa com sucesso. Com nosso primeiro programa totalmente finalizado, vamos à compilação e execu- ção. Para realizar o processo de compilação e execução você poderá utilizar qualquer IDE que interprete a linguagem de programação. Se estiver tudo ok, o programa está pronto para ser executado: Resultado do primeiro programa Fonte: elaborado pelo autor #include <stdio.h> int main(){ printf(“Ola Mundo!!!”); } #include <stdio.h> int main(){ printf(“Ola Mundo!!!”); return (0); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 10 Após realizar esta breve sequência de passos, temos então nosso primeiro código em linguagem C executado com sucesso. 1.3 Escrevendo código em linguagem C, primeiros passos Ao escrever programas em C podemos utilizar IDEs que sejam compatíveis com a linguagem. Como a DEVC++ , Eclipse, Netbeans, CodeBlocks entre outros. Estas IDEs são ótimas opções, pois apresentam recursos que permitem a marcação de sinta- xe, numeração de linhas, depuração1, compilação e a execução do programa escrito. Também é possível escrever códigos em linguagem C por meio de um simples editor de texto, como no Bloco de Notas do Windows. No entanto, sem a mesma gama de recursos disponíveis nas ferramentas citadas. Para escrever um código é importante que o programador adquira um bom conhe- cimento, no que diz respeito à sintaxe e à semântica que compõem a estrutura da linguagem C. Isso ajudará em inúmeras situações durante o desenvolvimento de seus programas. Além disso, uma boa prática bastante utilizada em meio à comunidade de programadores é o uso de comentários nas linhas de comando que permitem si- nalizar ou até mesmo explicar de maneira detalhada o que um determinado trecho de código faz. Isso auxilia a equipe de desenvolvimento e também outros programadores que futuramente darão manutenção ao programa, a se localizarem melhor em meio à infinidade de linhas de códigos que estarão presentes no programa. Exemplo: Outro aspecto importante que deve ser levado em consideração durante a escrita de um código é a prática da indentação que permite organizar o código de modo que a leitura dele se torne mais fluida. 1 Esclarecimento: Conhecido também como debuging, a depuração é o processo de encontrar e/ou reduzir os erros genéricos no código. #include <stdio.h> int main(){ // este printf deverá imprimir a frase Olá Mundo!!! printf(“Ola Mundo!!!”); return (0); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 11 Exemplo: Imprimindo uma Linha Conforme vimos anteriormente em nosso primeiro programa, podemos utilizar co- mandos específicos para imprimir mensagens no console do DOS. No exemplo apre- sentado, utilizamos a função printf que permite inserir o texto que desejamos apresen- tar. A declaração da função printf deve ser feita utilizando parênteses e o texto a ser apresentado na tela deve ser escrito entre aspas (duplas). Exemplo: Com o programa em execução, a mensagem a ser exibida ficará conforme o exem- plo anteriormente apresentado em nossoprimeiro programa em C, com a frase: Ola Mundo. Vale lembrar que, inicialmente, a linguagem C é configurada a partir do idio- ma inglês, sendo assim, a leitura de textos com acentuação do idioma em português requer configuração por meio da função SET LOCALE que veremos mais adiante nas próximas unidades. A Biblioteca Padrão de C Nos exemplos que já foram apresentados, pudemos perceber o uso de funções e comandos que são responsáveis por realizar ações específicas dentro do programa. Isso porque, a linguagem C é caracterizada pela chamada de funções que está presen- te em sua biblioteca padrão. Esta biblioteca está presente em todos os compiladores da linguagem C e é formada por um conjunto mínimo de arquivos de cabeçalho que compõem o padrão C ANSI. Para Schildt (1997, p. 3), “todo compilador C vem com uma biblioteca C padrão de funções que realizam as tarefas necessárias mais comuns, O padrão C ANSI especifi- ca o conjunto mínimo de funções que estará contido na biblioteca”. Na tabela a seguir podemos conferir a descrição referente a cada arquivo de cabe- çalho: printf(“Ola Mundo!!!”); ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 12 Biblioteca Descrição assert.h Auxilia na identificação de erros em versões de depuração de programas. complex.h Permite o tratamento no que se refere à manipulação de números complexos. ctype.h Realiza o tratamento de caracteres, como, por exemplo, a conversão de maiúsculas, minúsculas. errno.h Teste de códigos de erro reportados pelas funções de bibliotecas. fenv.h Definição de funções para tratamento de exceções em variáveis do tipo ponto flutuante. float.h Definição de limites e precisão para variáveis do tipo ponto flutuante. inttypes.h Utilizada para o tratamento de conversão entre variáveis do tipo inteiro. iso646.h Permite a programação a partir da codificação de caracteres de acordo com a ISO646. limits.h Define a limitação de recursos locale.h Permite a formação de acordo com a localização, como moeda, data, acentuação, etc. math.h Utilizada na manipulação de funções matemáticas. setjmp.h Permite definir macros (setjmp e longjmp) para saídas não locais e realização do tratamento de exceções. signal.h Permite receber e realizar o tratamento de sinais específicos. stdarg.h Utilizada no acesso aos argumentos passados para funções com parâmetro variável. stdbool.h Tratamento de dados do tipo booleano. stdint.h Padrões de definição de tipos de dados inteiros. stddef.h Padrões de definições de tipos. stdio.h Utilizada para funções de entrada/saída. stdlib.h Possibilita o uso de funções nas mais diversas operações, como conversão, alocação de memória, controle de processo, funções de busca e ordenação. string.h Utilizada para funções no tratamento de strings. tgmath.h Permite implementar facilidades na utilização de funções matemáticas. time.h Permite o tratamento de tipos de data e hora. wchar.h Possibilita o tratamento de caracteres para suportar idiomas diversos. wctype.h Contém funções para classificação de caracteres wide. Biblioteca C padrão Fonte: elaborado pelo autor Basicamente, por se tratar de uma linguagem baseada no uso de funções, em al- gum momento será inevitável informar a biblioteca correspondente às funções que estão sendo chamadas no programa. Caso contrário, o programa certamente não ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 13 será executado. 1.4 Variáveis e Tipos de Variáveis Para efetuarmos a manipulação de dados em nossos programas é necessário efetuar o armazenamento de determinadas informações e, para isso, utilizamos as variáveis. Segundo Lopes e Garcia (2002, p. 25), “uma variável é um espaço na memória principal do computador que pode conter diferentes valores e cada ins- tante de tempo”. As variáveis são o aspecto fundamental de qualquer linguagem de computador. Uma variável em C é um espaço de memória reservado para armazenar certo tipo de dado e tendo um nome para referenciar o seu conteúdo. [...] uma variável é um espaço de memória que pode contar, a cada tempo, valores diferentes (MIZRAHI, 2008, p. 13). Em linguagem C as variáveis mais utilizadas são do tipo: INT, FLOAT e CHAR, sendo atribuídos a variáveis numéricas e string (caracteres), em linguagem C, não existe o tipo de variável boolean, pois a linguagem considera qualquer valor verda- deiro, intrinsecamente podemos dizer que todas as variáveis são diferentes de 0. Outra particularidade é que variáveis do tipo CHAR armazenam um caractere ou um conjunto de caracteres, sendo assim a mesma variável pode armazenar uma letra apenas, uma palavra ou frase dependendo de como esta irá ser utilizada no programa. Conforme apresentado, as variáveis são armazenadas na memória do computa- dor, consequentemente ocupam um determinado valor de bytes; podemos utilizar alguns modificadores para determinar o tamanho de armazenamento, estes são: unsigned, signed, short e long. O modificador unsigned utilizamos para declarar como sem sinal, assim dupli- cando a gama de valores, signed aceita valores positivos e negativos; podemos utilizar o short para reduzir a capacidade de armazenamento e o long aumenta a capacidade. Vejamos a tabela “Tipos de dados e faixa de valores” a seguir, a qual apresenta a faixa de valores e o tamanho aproximado em bytes. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 14 Tipo Faixa de valores Tamanho em Bytes char -127 a 127 1 unsigned char 0 a 255 1 signed char -127 a 127 1 int -2.147.483.648 a 2.147.483.647 4 unsigned int 0 a 4.294.967.295 4 signed int -2.147.483.648 a 2.147.483.647 4 short int -32.768 a 32.767 2 unsigned short int 0 a 65.535 2 signed short int -32.768 a 32.767 2 long int -2.147.483.648 a 2.147.483.647 4 signed long int -2.147.483.648 a 2.147.483.647 4 unsigned long int 0 a 4.294.967.295 4 float seis dígitos de precisão 4 double dez dígitos de precisão 8 long double dez dígitos de precisão 10 Tipos de dados e faixa de valores Fonte: Albano e Albano (2010, adaptado). A criação ou declaração de uma variável é efetuada no início do programa, no caso da linguagem C, logo após da declaração main(), uma variável começa com a identificação do seu tipo, após isso, o nome da variável. Sintaxe da declaração de uma variável: tipo_variavel nome_variavel; Exemplo de declaração de variável: int numeros; float valores; char caracteres; ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 15 Vejamos na figura “Estrutura de declaração de variáveis”, a declaração de vari- ável em linguagem C: Por vezes, teremos que declarar muitas variáveis do mesmo tipo para utilizar no programa, podemos efetuar a declaração na mesma expressão, declarando o tipo e, logo em seguida, os nomes das variáveis separadas por vírgula, conforme apresentado na figura “Declaração de variáveis do mesmo tipo”, a seguir, em lin- guagem C. Declaração de variáveis do mesmo tipo Um detalhe importante que devemos atentar é para com os nomes das vari- áveis, os nomes de referência não podem conter caracteres especiais (acentos, %, &, #, dentre outros), espaços e também não podem começar com números, vejamos, a seguir, na tabela “Declaração de variáveis de modo incorreto”, algumas declarações incorretas em linguagem C. #include <stdio.h> main(){ int numero1; // variável numérica int numero2; // variável numérica char nome1; // variável srting char nome2; // variável string /* bloco de código fonte em linguagem C */ } #include <stdio.h> int main(){ int numero1, numero2, numero3; // variável numérica char nome1, nome2; // variável string /* bloco de código fonte em linguagem C */ } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 16 Declaraçãoda variável Descrição float 85telefone; int 2nota, 3nota; char 1end; char 1lugar, 2lugar; O nome de referência das variáveis se inicia com número. float número; int telefone, código; char endereço; char município, cidade; O nome de referência das variáveis contém caracteres especiais. int numero de telefone; float produto, código do produto; char nome e sobrenome; char primeiro nome, número da residência; O nome de referência contém caracteres es- peciais e espaços. Declaração de variáveis de modo incorreto Fonte: elaborado pelo autor Devemos também nos atentar no modo de declarar as variáveis, o indicado é se utilizar o nome das variáveis sempre em maiúscula ou minúscula, pois em lingua- gem C se utiliza do conceito de Case Sensitive2; se declararmos o nome de referên- cia sendo idade, esta será diferente de Idade, IDADE ou iDade. Por vezes, temos a percepção de que nosso código pode conter erros, mas na verdade, estamos apenas confundindo os nomes das variáveis, pois isso, temos que ter atenção sobre os nomes das variáveis declaradas. Por fim, temos as variáveis reservadas, chamadas como “Palavras reservadas” são palavras que não se pode utilizar sendo uma variável criada pelo desenvolve- dor, toda e qualquer linguagem de programa possui palavras que são de uso exclu- sivo da linguagem e tem características exclusivas ao serem interpretadas por um compilador, vejamos na tabela “Palavras Reservadas”, a seguir, algumas palavras reservadas da linguagem C. 2 Esclarecimento: O conceito de case sensitive se baseia na forma de escrita, linguagens que usam este conceito fazem diferença nas variáveis, por ex.: Soma e soma, para estas linguagens as variáveis são tratadas sendo distintas. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 17 PALAVRAS RESERVADAS: dessa linguagem são nomes utilizados pelo compilador para re- presentar comandos de controle do programa, operadores e diretivas. abstract continue for new switch assert default if package this boolean do goto private synchronized break double implements protected throw byte else import public throws case enum instanceof return transient catch extens int short try char final interface static void class finally long strictfp volatile const float native super while Palavras reservadas Fonte: Ascencio e Campos (2010, p. 30). Conforme já apresentado, as variáveis são os elementos-chave para o funcio- namento de um software, independente qual seja a linguagem em que ele foi de- senvolvido. As escolhas pelos nomes e tipos de variáveis podem interferir no bom desempenho de um software, por isso que é essencial saber sobre os tipos de variáveis e como estas operam. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 18 AULA 2 ENTRADA E SAÍDA DE DADOS, EXPRESSÕES E OPERADORES Fonte: https://br.freepik.com/fotos-gratis/linguagem-de-programacao-no-local-de-trabalho_902701.htm Escrever um programa em linguagem C requer a definição de alguns elementos essenciais. Conforme mencionado anteriormente, os arquivos de cabeçalho são responsáveis por definir o ponto inicial de um programa escrito em linguagem C. Sendo assim, essa é uma informação que precisa estar presente nas primeiras linhas do programa antes mesmo da função main 2.1 Funções I/O As operações de entrada e saída são realizadas por funções específicas que são responsáveis por garantir a leitura e a impressão dos dados de acordo com seu tipo. Essas funções são o scanf e printf, que inclusive vimos exemplificado em ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 19 nosso primeiro programa em C (“Ola Mundo”). A função scanf permite realizar a leitura de dados a partir de uma fonte externa, como, por exemplo, o que é digitado no teclado pelo usuário. Já a função printf é responsável por exibir os valores na tela. A função printf pode ser utilizada em sua sintaxe básica ou por meio da utiliza- ção de argumentos que permitem apresentar textos e valores de variáveis. Exemplo: Sintaxe básica: printf(“Mensagem que será apresentada na tela para o usuário:”); Utilizando argumentos: printf(“Sua renda mensal é: R$ %f”, renda); Neste segundo exemplo, o %f define o local onde será escrita a variável do tipo float. E o “total” representa a variável apresentada na posição %f. Já a função scanf possui uma sintaxe um pouco diferente, pois obrigatoriamen- te requer o uso de argumentos que definem o tipo de dado da variável que será lida. A sintaxe básica é dada da seguinte forma: scanf(“expressão de controle”, lista de argumentos); Exemplo prático: scanf(“%f”, &renda); Neste exemplo, nossa lista de argumento é responsável por informar o ende- reço da variável (renda), para a qual utilizamos o símbolo & como prefixo. Assim como no exemplo do printf, o %f representa o tipo de variável que deverá ser lida pela função scanf. Mais adiante, veremos sobre os tipos e variáveis que compõem a linguagem C. No entanto, para este tópico é importante destacar os tipos bási- cos de dados, bem como sua respectiva representação. Confira a Tabela “Tipos básicos de variáveis”, a seguir. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 20 Tabela 2: Tipos básicos de variáveis Fonte: elaborado pelo autor. Certamente, estes tipos de dados são apenas uma breve representação, for- mando uma composição básica ou tipos primitivos. Mas, boa parte do que iremos aprender em linguagem C será contemplado por estes tipos de dados. 2.2 Operadores Relacionais e Lógicos Seja qual for a linguagem de programação, ao escrever um código, muitas vezes se faz necessário o uso de operadores lógicos e/ou relacionais que permitem reali- zar comparações de verdadeiro ou falso. Embora ofereçam recursos semelhantes, vale ressaltar que se tratam de operadores com funções distintas. De acordo com Schildt (1997, p. 74), “no termo operador relacional, relacional refere-se às relações que os valores podem ter uns com os outros. No termo ope- rador lógico, lógico refere-se às maneiras como essas relações podem ser conec- tadas”. Enquanto os operadores relacionais são utilizados para estabelecer as re- lações que podem ocorrer entre os valores comparados, os operadores lógicos estão diretamente relacionados à maneira como estas relações podem acontecer. Operadores Relacionais Operadores relacionais também são conhecidos como operadores de compara- ção, pois, possibilitam estabelecer uma relação de comparação entre dois valores ou duas variáveis. Também é possível que esta relação de comparação seja feita entre um determinado valor e uma variável. Um exemplo simples disso é quando, pretende-se saber se o valor da variável Saldo é maior do que o valor 0. Neste caso, estamos apenas fazendo uma comparação entre uma variável e um valor. Ao escrever o código, essa comparação deve ser apresentada da seguinte forma: Saldo > 0 Tipo de dado Representação Formato caractere char %c inteiro int %d ou %i real float %f cadeia de caracteres char[] %s ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 21 Além do operador de comparação maior (>), visto no exemplo apresentado, exis- tem outros operadores relacionais ou de comparação que são muito utilizados no desenvolvimento de programas em linguagem C. Vejamos a tabela “Operadores relacionais”, a seguir. Operadores relacionais Fonte: elaborado pelo autor Ao realizar comparações de valores e/ou variáveis, o resultado obtido precisa ser um valor lógico, ou seja, verdadeiro ou falso. Considerando o exemplo do Saldo (apresentado acima), se o valor da variável Saldo for maior do que 0 (verdadeiro), significa que a conta bancária possui dinheiro disponível. Caso contrário (falso), a conta não possui dinheiro disponível. OperadoresLógicos Já os operadores lógicos realizam um outro tipo de verificação, mas que tam- bém está baseada na ideia de verdadeiro ou falso. Em diversas linguagens de pro- gramação são utilizados três operadores que foram definidos a partir da Álgebra Booleana. Vejamos a tabela “Operadores lógicos” a seguir: Operador Função Descrição || disjunção OU lógico (OR) && conjunção E lógico (AND) ! negação Negação (NOT) Operadores lógicos Fonte: elaborado pelo autor Operador Função Exemplo <> Diferente 1 <> 2, X <> Y == Igual a 1 == 1, X == Y > Maior que 2 > 1, X > Y < Menor que 1 < 2, X < Y >= Maior ou igual a 2 >= 1, X >= Y <= Menor ou igual a 1 <= 2, X <= Y ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 22 É importante ressaltar que na programação operadores possuem precedência sobre outros, assim como ocorre na matemática. Dessa forma, algumas opera- ções possuem prioridade em relação às demais. Considerando os tipos de ope- radores que foram vistos neste capítulo referentes à linguagem C, a ordem de prioridade entre eles é representada, a seguir, na tabela “Precedência operadores”. !, != NOT (Negação) Maior prioridade Menor prioridade && AND (E lógico) || OR (OU lógico) =, <>, >, <, >=, <= Operadores relacionais ? : Operador ternário Tabela 6: Precedência operadores Fonte: elaborado pelo autor É importante estar atento à ordem de prioridade de cada operador, pois isso impacta diretamente no resultado final no código que está sendo escrito. Operador Ternário (?) O operador ternário permite verificar uma determinada condição e em seguida retornar um entre dois valores previamente definidos. Este tipo de operador apre- senta-se como uma alternativa para a estrutura de decisão IF, que veremos mais adiante neste capítulo. No entanto, vale ressaltar que não se trata de uma estrutu- ra de decisão propriamente dita, mas sim de um atalho que pode ser utilizado em situações mais simples. Enquanto a estrutura IF utiliza ao menos quatro linhas de código na escolha entre duas opções, o operador ternário possui uma estrutura linear (inline), na qual a mesma situação pode ser executada em apenas uma linha de código. A sintaxe do operador ternário é apresentada abaixo: condição? primeira_expressão : segunda_expressão; Enquanto o sinal de interrogação (?) é utilizado para testar a condição desejada, o sinal de dois pontos ( : ) é responsável por separar os valores que serão retorna- dos, caso a condição informada seja verdadeira ou falsa. A “primeira_expressão” retorna o valor caso a condição testada seja verdadeira. Caso contrário, o valor ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 23 retornado será o da “segunda_expressão”, (condição testada for falsa). Vejamos a figura “Exemplo operador ternário”. Exemplo operador ternário Fonte: elaborado pelo autor Neste trecho será feito o teste relacional para verificar qual dos dois valores in- formados é o maior. Caso o valor de “a” seja maior, então a variável “maior” recebe o seu valor. Caso contrário será o valor de “b”. 2.3 Operações Aritméticas Operadores aritméticos são utilizados para efetuar cálculos em um software, por meio destes, obtemos resultados numéricos que podem ser utilizados dentro do software, sendo utilizados com variáveis do tipo inteiro (INT) ou real (FLOAT), não sendo aplicados em expressões com caracteres. As expressões estão diretamente relacionadas ao conceito de fórmula mate- mática, em que um conjunto de variáveis e constantes relaciona-se por meio de operadores (LOPES; GARCIA, 2002). Vejamos na tabela “Operadores aritméticos” a seguir, os operadores aritméticos utilizados na linguagem C, suas representações e forma de uso: #include <stdio.h> int main(){ int a, b, maior; printf(“Informe o primeiro numero: “); scanf(“%d”, &a); printf(“Informe o segundo numero: “); scanf(“%d”, &b); // verificar os valores de a e b com operador ternário maior = a > b ? a : b; printf(“O valor maior e: %d”, maior); return(0); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 24 OPERAÇÃO OPERADOR DESCRIÇÃO Soma + Operador utilizado para efetuar a soma de variáveis. Exemplo: duas variáveis do tipo inteiro A e B, para efetuar a soma dos valores atribuídos destas variáveis vamos utilizar a seguinte ex- pressão: A + B. Subtração - Simboliza a subtração de variáveis. Exemplo: duas variáveis do tipo inteiro C e D, para efetuar a subtração dos valores atribuídos destas variáveis vamos utilizar a seguinte expressão: C – D. Multiplicação * Utilizado para efetuar a multiplicação de variáveis. Exemplo: duas variáveis do tipo inteiro C e D, vamos utilizar a seguinte expressão: C * D. Divisão / É operador utilizado para a divisão entre variáveis. Exemplo A / B. Resto % Usamos esta expressão quando queremos encontrar o resto da divisão entre duas variáveis. Dadas as seguintes variáveis A=3 e B=2, usamos A%B, o resultado desta expressão será o número 1. Operadores aritméticos Fonte: elaborado pelo autor Os mais variados softwares desenvolvidos se utilizam de algumas expressões arit- méticas apresentadas, pode-se utilizar os operadores de modo simples, sendo A + B ou podemos efetuar expressão mais complexas como A + B / C - D, note que utilizados diversos operadores na mesma expressão, para exemplificar melhor, observe o código fonte abaixo, ilustrado na figura “Código fonte, operadores aritméticos”. Código fonte, operadores aritméticos #include <stdio.h> #include <stdlib.h> main(){ int A = 55; int B = 68; int C = 38; int D = 2; int resultado1, resultados2; resultado1 = A + B; printf(“%d”, resultado1); printf(“%n”); // utilizamos o \n quando queremos forçar uma quebra de linha resultado2 = A + B / C – D; printf(“%d”, resultado2); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 25 Observe que ao declararmos as variáveis já estamos atribuindo os valores delas, geralmente utilizamos esta estratégia quando estamos trabalhando com valores fixos no código, mas em algumas situações apenas declaramos as variáveis e atri- butos, os valores por meio da leitura do que o usuário digita, por meio do scanf(), conforme estudado anteriormente. Vejamos, na figura “Programa em execução, operadores aritméticos”, o resultado deste código fonte depois de compilado e executado. Programa em execução, operadores aritméticos Elaborado pelo autor. Devemos atentar para dois pontos muito importantes neste código que acaba- mos de desenvolver: 1º Ponto: quando trabalhamos com variáveis do tipo int os resultados sempre serão valores inteiros como 1, 63, 157, entre outros. Quando precisamos trabalhar com valores que se utilizam de separações, como a altura 1.75, aplicamos o tipo de variável float. 2º Ponto: note a que o resultado 2 obteve o valor de 54 na expressão A + B / C - D, o valor correto seria 1, mas o porquê deste valor 54, então? A resposta é bem simples, o computador não efetua o cálculo de modo linear: resultado de A + B depois / C e posteriormente - D. O que acontece é que o computador elenca priori- dades, operadores aritméticos como multiplicação (*) e divisão (/) recebem peso maior na expressão do que os operadores de soma (+) e subtração (-). Para resolver o problema apontado no segundo ponto basta priorizar o cálculo manualmente, atribuindo o que deseja executar primeiro dentro dos parentes, igual a cálculos matemáticos convencionais, vejamos, na figura “Código fonte, operado- res aritméticos com prioridades”, o código fonte com esta atribuição. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 26 Código fonte, operadores aritméticos com prioridades Elaborado pelo autor. Agora, vejamos na figura “Programa em execução,operadores aritméticos com prioridades”, o resultado do código compilado e executado. Programa em execução, operadores aritméticos com prioridades Fonte: elaborado pelo autor. Com a atribuição da prioridade o resultado da operação aritmética está de acor- do com o esperado, dependendo do cálculo que desejamos, podemos ter vários pontos de prioridades em uma operação, como exemplo (A+B) / (C-D), a leitura desta operação será: o resultado de A+B será dividido por C, o resultado é poste- riormente subtraído por D, desta forma conseguimos obter o resultado esperado sem problemas. Observe que o valor apresentado é 1 e não 1,23 este resultado não é apresentado, pois a declaração da variável é como inteiro. #include <stdio.h> #include <stdlib.h> main(){ int A = 55; int B = 68; int C = 38; int D = 2; int resultado1, resultados2; resultado1 = A + B; printf(“%d”, resultado1); printf(“%n”); // utilizamos o \n quando queremos forçar uma quebra de linha resultado2 = (A + B) / C – D; printf(“%d”, resultado2); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 27 2.4 Operadores de Atribuição e Acumuladores Conforme apresentado no tópico anterior, os operadores aritméticos são de grande importância e são utilizados constantemente nos códigos fontes de diver- sos softwares. Outros operadores muito úteis são os de atribuição e acumulação, os quais recebem valores e os trata de modo simplificado, por exemplo: X = X + Y, podemos atribuir para X += Y, o elemento de atribuição += pega o valor acumulado na variá- vel X e soma o valor que está contido em Y, esses tipos de operadores são muito utilizados, vejamos na tabela “Operadores de atribuição e acumulação”, a seguir, outros operadores e suas funções: Operador Exemplo Descrição += A += B Equivale a A = A + B -= A -= B Equivale a A = A - B *= A *= B Equivale a A = A * B /= A /= B Equivale a A = A / B %= A %= B Equivale a A = A % B ++ C++ Equivale a C = C + 1 C = ++D Equivale a D = D + 1 depois C = D C = D++ Equivale a C = D depois D = D + 1 -- F-- Equivale a F = F - 1 F = --G Equivale a G = G - 1 depois F = G F = G-- Equivale a F = G depois G = G - 1 Operadores de atribuição e acumulação Fonte: adaptado de Ascencio e Campos (2010). Os operadores de acumulação e atribuição são utilizados para representar de maneira sintética uma operação aritmética, para aprimorar nossos estudos, ve- jamos os mesmos sendo utilizados no código a seguir, conforme ilustra a Figura Código fonte, operadores atribuição e acumulação. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 28 Código fonte, operadores atribuição e acumulação Vejamos, agora na Figura “Programa em execução, atribuição e acumulação”, o resultado do código compilado e executado. Programa em execução, atribuição e acumulação Fonte: elaborado pelo autor O que devemos observar é que o computador lê as informações por ordem de entrada, no caso da operação A-- antes da operação D-=A, o valor de A na segunda operação não será 55, mas sim 54, pois efetuamos o decremento do valor de 55 antes, temos que tomar cuidado onde inserir os operadores de atribuição ou acu- mulação em nossos códigos, pois um simples erro de posicionamento pode gerar problemas futuros. #include <stdio.h> #include <stdlib.h> main(){ int A = 55; int B = 68; int C = 38; int D = 2; int h, i, j, k; B+=D; D-=A; C++; A--; printf(“%d \n”, B); printf(“%d \n”, D); printf(“%d \n”, C); printf(“%d \n”, A); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 29 2.5 Exemplos Dirigidos Imaginamos que uma determinada empresa foi contratada para desenvolver um software para uma instituição de ensino, um dos requisitos deste sistema é a geração do boletim de notas dos alunos matriculados, em conversa com o diretor desta instituição foi informado que a nota final dos alunos que deve constar no boletim é a média3 de notas dos quatro bimestres do ano. Pensando em atender este requisito, elaborou o seguinte código fonte em lin- guagem C, ilustrado na Figura “Código fonte, média de notas”, a seguir. Código fonte, média de notas Fonte: elaborado pelo autor 3 Afirmação: O cálculo da média se dá pela soma dos grupos e depois dividindo pela quantida- de de grupos. Ex.: (1+2+3+4)/4. #include <stdio.h> #include <stdlib.h> #define bim 4 main(){ float nota1, nota2, nota3 nota4, media; printf(“Informe a nota do 1 Bimestre: ”); scanf(“%f”, ¬a1); printf(“Informe a nota do 2 Bimestre: ”); scanf(“%f”, ¬a2); printf(“Informe a nota do 3 Bimestre: ”); scanf(“%f”, ¬a3); printf(“Informe a nota do 4 Bimestre: ”); scanf(“%f”, ¬a4); media = (nota1 + nota2 + nota3 + nota4) / bim; printf(“Media final do aluno: %.1f”, media); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 30 No código-fonte apresentado, temos as seguintes composições: A definição da quantidade de bimestres utilizando uma constante #define bim 4; Foram criadas cinco variáveis do tipo real float nota1, nota2 nota3, nota4, media; É utilizado o comando printf para informar ao usuário o que digitar; O comando scanf, conforme vimos, é utilizado para efetuar a entrada de dados; É atribuído para a variável média o cálculo da média das notas de um alu- no; Por fim, o resultado da média de notas do aluno é apresentado na tela, utilizamos a expressão %. 1f para que seja mostrado apenas um número após o ponto. Vejamos na figura “Programa em execução, média de notas”, a seguir, o código- -fonte após ele ter sido compilado e executado. Programa em execução, média de notas Fonte: elaborado pelo autor Podemos observar as entradas de dados para as variáveis, as quais compõem o cálculo da média (6.8+7.5+5.5+6.3), como já foi definido a quantidade de bimes- tres no início do código, basta então pegar o resultado da soma das entradas de dados (21.1) e dividir por 4, assim obtendo a média do aluno e a quantidade de valores que deve aparecer após o ponto. Recebendo e Imprimindo Caracteres Todo e qualquer programa desenvolvido com dois princípios básicos, o de re- ceber dados dos usuários e o de imprimir os caracteres, sejam eles números ou letras, na tela para o usuário. Para este procedimento, vamos nos utilizar dos co- mandos scanf(), para a entrada de dados e printf() para a imprimir os dados. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 31 Neste exemplo, vamos imaginar que você está testando os seus conhecimen- tos em linguagem C, e que, gostaria de efetuar um programa que perguntasse para um usuário qual o seu primeiro nome, sobrenome, idade e altura, e após todas as informações preenchidas, imprimisse na tela os dados digitados. Vejamos na figura “Código fonte, recebendo e imprimindo dados”, a seguir, como seria o seu código fonte em linguagem C. Código fonte, recebendo e imprimindo dados Fonte: elaborado pelo autor Perceba, aluno(a), que neste código-fonte mesclamos vários tipos que irão rece- ber os dados digitados pelos usuários, isso é muito comum nos sistemas desen- volvidos, nos quais contamos com diversas declarações de variáveis diferentes. #include <stdio.h> #include <stdlib.h> main(){ char nome[50], sobrenome[50]; int idade; float altura; printf(“Informe qual o seu primeiro nome: “); scanf(“%s”, &nome); printf(“Informe qual o seu sobrenome: “); scanf(“%s”, &sobrenome); printf(“Informe a sua idade: “); scanf(“%d”, &idade); printf(“Informe sua altura: “); scanf(“%f”, &altura); system(“cls”); // limpa a tela para a impressão dos dados - Windows // system(“clear”); // limpaa tela para a impressão dos dados - linux printf(“Nome e sobrenome do usuario: %s %s \n”, nome, sobrenome); printf(“Idade do usuario: %d \n”, idade); printf(“Altura do usuario: %.2f \n”, altura); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 32 Vejamos na Figura “Programa em execução, recebendo dados”, a seguir, o progra- ma em execução para a entrada de dados: Programa em execução, recebendo dados Fonte: elaborado pelo autor Após o usuário ter digitado todos os seus dados, a tela é limpa, por meio do sys- tem(“cls”), sendo retornado apenas os dados impressos na tela, conforme a figura “Programa em execução, imprimindo dados”, a seguir. Programa em execução, imprimindo dados Fonte: elaborado pelo autor Perceba que os dados de entrada digitados pelo usuário são apagados da tela, mas ainda estão armazenados na memória do computador, por isso que consegui- mos imprimir os caracteres de entrada na tela sem problemas, podemos utilizar a função system() para deixar a tela mais limpa, sem uma poluição visual para o usuário assim ele pode compreender mais fácil as informações que estão sendo impressas na tela. Cálculo de IMC Imaginamos que você é um programador recém-contratado em uma empresa de desenvolvimento de software, e o seu primeiro programa a ser desenvolvido em linguagem C é o sistema de acompanhamento de cálculo de IMC de uma acade- mia, vejamos a seguir os requisitos apresentados pelos stakeholders4. 4 Esclarecimento: Stakeholders são partes interessadas, no contexto, podemos afirmar serem os donos do projeto. É um termo utilizado em diversas áreas como gestão de projetos, comunicação social, desenvolvimento de software, engenheiro de requisito, dentre outras áreas. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 33 Requisitos do sistema O sistema deve armazenar e mostrar na tela o nome e a idade do aluno. Efetuar o cálculo de IMC do 1º e 2º mês, com base nos dados forneci- dos pelo professor na academia. No final, deve-se mostrar na tela, de modo limpo, apenas os dados do aluno, seguido dos dados dos cálculos de IMC e a diferença entre os dois pri- meiros meses. Também é muito importante apresentar a quantidade de meses que o aluno terá um acompanhamento junto ao professor da academia. Após analisar dos requisitos levantados foi se desenvolvido o seguinte código fonte, apresentado no Quadro Código fonte, sistema de cálculo de IMC, a seguir. #include<stdio.h> #include<stdlib.h> #include<locale.h> #define plano 4 int main() { setlocale(LC_ALL, “Portuguese”); float peso1, altura1, IMC1; float peso2, altura2, IMC2; float diferenca; char nome[50]; int idade; printf(“Digite o nome do aluno: “); scanf(“%s”, &nome); printf(“Digite a idade do aluno: “); scanf(“%d”, &idade); system(“cls”); // limpa a tela para a impressão dos dados Windows //system(“clear”); // limpa a tela para a impressão dos dados linux printf(“Digite os dados para o cálculo de IMC do 1º Mês\n\n”); printf(“Digite o peso: “); scanf(“%f”, &peso1); ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 34 Código fonte, sistema de cálculo de IMC Fonte: elaborado pelo autor Podemos observar que o código-fonte desenvolvido traz todos os elementos que estudamos nesta unidade, conforme já apresentado em tópicos anteriores é comum nos sistemas desenvolvidos termos várias funções e entradas de dados em um sistema, onde contamos com diversas declarações de variáveis diferentes. Vejamos um passo a passo até a execução final do programa. printf(“Digite a altura: “); scanf(“%f”, &altura1); IMC1 = peso1 / (altura1*altura1); system(“cls”); // limpa a tela para a impressão dos dados Windows //system(“clear”); // limpa a tela para a impressão dos dados linux printf(“Digite os dados para o cálculo de IMC do 2º Mês\n\n”); printf(“Digite o peso: “); scanf(“%f”, &peso2); printf(“Digite a altura: “); scanf(“%f”, &altura2); IMC2 = peso2 / (altura2*altura2); system(“cls”); // limpa a tela para a impressão dos dados Windows //system(“clear”); // limpa a tela para a impressão dos dados linux diferenca = IMC1 - IMC2; printf(“Nome do aluno: %s \n”, nome); printf(“Idade do aluno: %d \n”, idade); printf(“-----------------------------\n”); printf(“IMC do 1º Mês: %.2f \n”, IMC1); printf(“IMC do 2º Mês: %.2f \n”, IMC2); printf(“-----------------------------\n”); printf(“Diferença entre o IMC do 1º e 2º Mês: %.2f \n”, diferenca); printf(“Quantidade de acompanhamento com base no plano contratado: %d \n”, plano); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 35 1º Passo - Dados de entrada do aluno, ilustrado na figura “Programa em execu- ção, sistema de cálculo de IMC”. Programa em execução, sistema de cálculo de IMC Fonte: elaborado pelo autor 2º Passo - Dados para cálculo de IMC do 1º mês, ilustrado na Figura Programa em execução, sistema de cálculo de IMC. Figura: Programa em execução, sistema de cálculo de IMC Fonte: elaborado pelo autor 3º Passo - Dados para cálculo de IMC do 1º mês, ilustrado na figura “Programa em execução, sistema de cálculo de IMC”. Programa em execução, sistema de cálculo de IMC Fonte: elaborado pelo autor ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 36 4º Passo - Resultado final, ilustrado na figura “Programa em execução, sistema de cálculo de IMC”. Programa em execução, sistema de cálculo de IMC Fonte: elaborado pleo autor Conforme os dados de entrada são digitados pelo usuário, este são apagados da tela, mas continuam na memória do computador, após o preenchimento de todos os dados e os cálculos efetuados, imprimimos na tela o que foi requisitado pelos stakeholders do projeto. Podemos dizer que ao término de seu primeiro programa desenvolvido em lin- guagem C é possível compreender os diversos elementos que irão lhe ajudar a de- senvolver os seus primeiros algoritmos e além de enriquecer o seu conhecimento sobre a linguagem C. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 37 AULA 3 INSTRUÇÕES CONDICIONAIS DE DECISÃO Fonte: https://pixabay.com/pt/photos/decis%c3%a3o-dist%c3%a2ncia-lista-jun%c3%a7%c3%a3o-5291766/ Em determinados momentos devemos tomar decisões a partir de perguntas ou situações geradas, tais como: qual a carreira profissional devo seguir? Devo ou não viajar? Caso o tempo esteja virado para chuva, vou trabalhar de moto ou carro? Em um software isso também acontece, se determinadas situações ou variá- veis apresentarem certos acontecimentos, o software poderá tratar determinados blocos de códigos, chamamos isso de desvio condicional, em que, caso a situação for favorável ou não se executar um trecho de código estabelecido, efetuamos este processo por meio das expressões if e if-else. Em nosso livro, estudamos a linguagem C, entretanto, toda e qualquer lingua- gem de programação possui estas expressões de desvio condicional, para auxiliar https://pixabay.com/pt/photos/decis%c3%a3o-dist%c3%a2ncia-lista-jun%c3%a7%c3%a3o-5291766/ ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 38 seus usuários em suas tarefas ou tomada de decisões. 3.1 Instrução Condicional Simples A estrutura condicional if é utilizada quando se trata de seleções simples, do tipo SE - ENTÃO, a qual é testada antes de executar um trecho de código, de modo bem simples podemos dizer que se a condição for atendida, um bloco de instru- ções/códigos será executado, caso contrário não se executa nada. Segundo Forbellone e Eberspacher (2005, p.33), [...] uma estrutura de seleçãosimples permite a escolha de um grupo de ações (bloco) a ser executado quando determinadas condições, representadas por expressões lógicas ou relacionais, são ou não satisfeitas. Para melhor compreensão, vejamos a figura “Diagrama de execução da função SE – ENTÃO”, a seguir: Diagrama de execução da função SE - ENTÃO Fonte: Forbellone e Eberspacher (2005, p. 34). A expressão lógica ou condição a ser se refere a uma condição que deve ser retornar como verdadeiro. Para lhe ajudar a entender, vamos imaginar que temos duas variáveis de entrada A e B e os seus valores respectivos são 1 e 2, vejamos possíveis condições: A > B = caso a condição seja verdadeira o bloco será executado A > B = caso a condição seja falsa o bloco não será executado. No caso de nosso exemplo, a condição de A maior que B não será atendida ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 39 (falsa), pois 1 não é maior que 2 tendo um retorno falso para expressão. Para compor a expressão condicional, podemos utilizar qualquer um dos operadores relacionais. Em linguagem C a forma de escrever a função if no código fonte é da seguinte forma, observe a figura “Comando condicional simples”, a seguir. Comando condicional simples Fonte: elaborado pelo autor Observe que a condição a ser validada está entre os parênteses ( ) e o bloco de execução está entre chaves { }, conforme podemos notar no diagrama, caso a condição for atendida, todo o conjunto de código que estiver entre chaves será executado, caso não for atendida a condição, será ignorado. Vejamos um exemplo prático se baseando do algoritmo de média de notas do aluno: Estrutura de declaração da função if #include <stdio.h> #include <stdlib.h> #define bim 4 mai(){ float nota1, nota2, nota3, nota4, media; printf(“Informe a nota do 1 Bimestre: “); scanf(“%f”, ¬a1); printf(“Informe a nota do 2 Bimestre: “); scanf(“%f”, ¬a2); printf(“Informe a nota do 3 Bimestre: “); scanf(“%f”, ¬a3); printf(“Informe a nota do 4 Bimestre: “); scanf(“%f”, ¬a4); media=(nota1+nota2+nota3+nota4)/bim; printf(“Media final do Aluno: %.1f \n”, media); if(media >= 7.0){ // expressão condicional a ser testada printf(“Aluno Aprovado :)”); } } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 40 Ao executar este algoritmo, podemos obter duas situações mediante à ex- pressão condicional a ser testada, caso a média de notas do aluno for maior ou igual a 7, irá apresentar na tela a frase “Aluno Aprovado :)”, caso for menor, o trecho é ignorado, vejamos o algoritmo em execução na figura “Retorno da expressão condicional verdadeira” e na figura “Retorno da expressão condicio- nal falsa”. Retorno da expressão condicional verdadeira Fonte: elaborado pelo autor Retorno da expressão condicional falsa Fonte: elaborado pelo autor Perceba que no exemplo apresentado estamos validando apenas uma expressão (media >= 7), mas podemos utilizar expressões e operadores lógicos em conjunto para validar a expressão condicional da função if, para isso vamos utilizar o conceito da tabela verdade. Imagine que no algoritmo de média de notas que acabamos para o aluno ser aprovado ele tenha que atender os critérios: 1º Objeto A (media >= 7) 2º Objeto B (nota4 > 6) Agora, para que o aluno seja aprovado, ele tem que atender às duas condições, neste caso, ambas devem retornar como verdadeiro (operador lógico &&), acompanhe o teste de mesa na tabela “Verdade condição &&”, a seguir: ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 41 TABELA VERDADE Objeto A Objeto B A e B Condição do aluno Verdadeiro Verdadeiro Verdadeiro Aprovado Verdadeiro Falso Falso Reprovado Falso Verdadeiro Falso Reprovado Falso Falso Falso Reprovado Tabela verdade condição && Fonte: elaborado pelo autor Mas se a nossa expressão condicional fosse apresentada em vez de &&, ambas as expressões verdadeiras, fosse utilizado OU (operador lógico II), uma ou outra expres- são verdadeira, vejamos, a seguir, na tabela “Verdade condição II”. TABELA VERDADE Objeto A Objeto B A ou B Condição do aluno Verdadeiro Verdadeiro Verdadeiro Aprovado Verdadeiro Falso Verdadeiro Aprovado Falso Verdadeiro Verdadeiro Aprovado Falso Falso Falso Reprovado Tabela verdade condição II Fonte: elaborado pelo autor A estrutura do algoritmo irá ficar a mesma, apenas será inserida outra expres- são condicional para a tomada de decisão, junto com um operador lógico, podemos também ter no mesmo código várias funções IF, efetuando outros testes com outras expressões condicionais, vejamos o exemplo, a seguir: ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 42 Função If com operadores lógicos Fonte: elaborado pelo autor Veja que no mesmo algoritmo temos duas funções IF, cada função tem expressões condicionais e operadores lógicos, vejamos o algoritmo em execução na figura “Re- torno do algoritmo atendendo apenas a segunda função IF” e na figura “Retorno do algoritmo atendendo apenas a primeira função IF”. #include <stdio.h> #include <stdlib.h> #define bim 4 mai(){ float nota1, nota2, nota3, nota4, media; printf(“Informe a nota do 1 Bimestre: “); scanf(“%f”, ¬a1); printf(“Informe a nota do 2 Bimestre: “); scanf(“%f”, ¬a2); printf(“Informe a nota do 3 Bimestre: “); scanf(“%f”, ¬a3); printf(“Informe a nota do 4 Bimestre: “); scanf(“%f”, ¬a4); media=(nota1+nota2+nota3+nota4)/bim; printf(“Media final do Aluno: %.1f \n”, media); if(media >= 7.0 && nota4 >=6){ // expressão condicional a ser testada com operador lógico && printf(“Aluno Aprovado :) \n”); } if(nota2 > nota1 || nota4 > nota3){ // expressão condicional a ser testada com operador lógico || printf(“Entre os bimestres o aluno aumentou a sua nota.”); } } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 43 Retorno do algoritmo atendendo apenas a segunda função IF Fonte: elaborado pelo autor Retorno do algoritmo atendendo apenas a primeira função IF Fonte: elaborado pelo autor 3.2 Instrução Condicional Composta Podemos notar que no tópico anterior a estrutura condicional IF atende em cená- rios diferentes, entretanto nota-se que o resultado da estrutura ID trata apenas con- dições verdadeiras e não casos de retornos falsos, não apresentando nenhum tipo de mensagem caso as condições retornassem como “falso”, nestes casos podemos utilizar o desvio condicional composto o SE – SENÃO. Vejamos um exemplo em pseu- docódigo, ilustrado na figura “Representação textual, sobre desvio condicional com- posto”, a seguir. Representação textual, sobre desvio condicional composto Fonte: elaborado pleo autor Em linguagem C, este tipo de função é expressada sendo IF - ELSE, função está muito utilizada, pois, desta forma, o usuário não fica sem resposta, ou em outros ca- sos, se pode executar outro trecho de código, como se fosse um plano de contingên- cia. O Plano de Contingência é o planejamento preventivo e alternativo para atuação durante um evento que afete as atividades normais da organização. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 44 Segundo Forbellone e Eberspacher (2005, p.35), [...] quando tivermos situações em que duas alternativas dependem de uma mesma condição, uma de condição verdadeira e outra de a condição falsa, usamos a estrutura de seleção composta. Supondo que um conjunto de ações dependa da avaliação verdadeiro e uma única ação primitiva dependa da avaliação falso. Para melhor compreensão, vejamos o diagrama a seguir, ilustrado na Figura Dia- grama de execução da função SE - SENÃO. Diagrama de execução da função SE - SENÃO Fonte: Forbellone e Eberspacher (2005, p.36) O pseudocódigo apresentado executa a expressão condicional sobrea nota de um aluno, se for maior ou igual a 7, tornando-se assim uma condição verdadeira, será impresso na tela “Aprovado”, em caso da condição retornar falsa, será impresso “Re- provado”. Vejamos a estrutura do trecho de código em linguagem C, apresentado na figura “Código de exemplo expressão condicional composta”. Código de exemplo expressão condicional composta Fonte: elaborado pelo autor Para compreender como funciona a estrutura de IF - ELSE, vamos utilizar o mesmo algoritmo com a função IF e complementar com a estrutura ELSE. Vejamos o código fonte a seguir na figura “Função If - else com operadores lógicos”. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 45 Função If - else com operadores lógicos Fonte: elaborado pelo autor Com base no código fonte apresentado, agora temos duas opções de respostas caso o aluno tenha sido aprovado ou reprovado, isso também se reflete sobre as no- #include <stdio.h> #include <stdlib.h> #define bim 4 mai(){ float nota1, nota2, nota3, nota4, media; printf(“Informe a nota do 1 Bimestre: “); scanf(“%f”, ¬a1); printf(“Informe a nota do 2 Bimestre: “); scanf(“%f”, ¬a2); printf(“Informe a nota do 3 Bimestre: “); scanf(“%f”, ¬a3); printf(“Informe a nota do 4 Bimestre: “); scanf(“%f”, ¬a4); media=(nota1+nota2+nota3+nota4)/bim; printf(“Media final do Aluno: %.1f \n”, media); // estrutura IF - ELSE if(media >= 7.0 && nota4 >=6){ // expressão condicional a ser testada com operador lógico && printf(“Aluno Aprovado :) \n”); }else{ printf(“Aluno Reprovado :( \n”); } // estrutura IF - ELSE if(nota2 > nota1 || nota4 > nota3){ // expressão condicional a ser testada com operador lógico || printf(“Entre os bimestres o aluno aumentou a sua nota.”); }else{ Printf(“O aluno nao aumentou a sua nota dentre os bimestres”); } } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 46 tas do aluno entre os bimestres. Vejamos o algoritmo em execução, a seguir, na figura “Retorno do algoritmo com a estrutura IF – ELSE”. Retorno do algoritmo com a estrutura IF - ELSE Fonte: elaborado pelo autor Observe que agora temos uma resposta para cada desvio condicional, na primei- ra estrutura, como a média das notas do aluno foi maior que 7 e também a nota do quarto bimestre foi maior que 6, a mensagem que apareceu foi “Aluno Aprovado”, caso uma das duas expressões não fosse atendida, o bloco de código presente no else seria executado, neste caso, a informação impressa na tela seria “Aluno Reprovado”. Entretanto, na segunda estrutura de desvio condicional composto, devemos notar que mesmo com a expressão “nota2 > nota1” ter retornado falsa, já que as notas foram 8 para o primeiro e 7 no segundo, ainda assim foi impresso na tela “Entre os bimestres o aluno aumentou a sua nota”, isso aconteceu porque estamos utilizando o operador lógico OU ( || ), como a segunda expressão retornou como verdadeira, se- guindo o exemplo da tabela verdade apresentada, o bloco executado foi o do IF. A estrutura de decisão é muito útil no desenvolvimento de um programa, pois ao utilizá-la, sendo simples ou composta, podemos deixar o programa final mais auto- matizado, com base nas informações disponibilizadas pelo usuário ou por meio do comportamento de variáveis do programa. 3.3 Instrução de IFs Aninhados Conforme visto, as estruturas IF e IF-ELSE são de grande importância e muito úteis em um programa, mas, por vezes, a partir de uma decisão precisamos associar outra tomada de decisão, vejamos um exemplo descrito de modo literal: ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 47 SE vou viajar = sim ENTÃO SE tanque = vazio ENTÃO Ir ao posto SENÃO Ir para a rodovia SENÃO Guardar o carro Compreende-se, então, que temos dois IFs, um dentro de outro, em que a resposta final é associada às expressões condicionais de ambos, esta estrutura é chamada de IFs aninhados. Um if aninhado é um comando if que é o objeto de outro if ou else. IFs aninhados são muito comuns em programação. Em C, um comando else sempre se refere ao co- mando if mais próximo, que está dentro do mesmo bloco de else e não está associado a outro if [..] O padrão C ANSI especifica que pelo menos 15 níveis de aninhamentos devem ser suportados. Na prática, a maioria dos compiladores permite substancial- mente mais (SCHILDT, 1997 p. 64). Para melhor interpretar o conceito de IFs aninhados, observe o trecho de código a seguir, na figura “Trecho de código com IFs aninhados”. Figura: Trecho de código com IFs Aninhados Fonte: Schildt (1997, p. 64) É possível notar que no bloco de execução do primeiro IF(i), temos outras duas es- truturas IF(j) e IF(k) - ELSE, poderíamos ter outros IFs no bloco de execução do ELSE também se fosse o caso. Podemos melhorar o nosso algoritmo de média de notas do aluno, caso ele tenha sido aprovado e suas notas entre os bimestres forem boas, ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 48 vejamos este algoritmo com IFs aninhados. Algoritmo com IFs aninhados Fonte: elaborado pelo autor #include <stdio.h> #include <stdlib.h> #define bim 4 mai(){ float nota1, nota2, nota3, nota4, media; printf(“Informe a nota do 1 Bimestre: “); scanf(“%f”, ¬a1); printf(“Informe a nota do 2 Bimestre: “); scanf(“%f”, ¬a2); printf(“Informe a nota do 3 Bimestre: “); scanf(“%f”, ¬a3); printf(“Informe a nota do 4 Bimestre: “); scanf(“%f”, ¬a4); media=(nota1+nota2+nota3+nota4)/bim; printf(“Media final do Aluno: %.1f \n”, media); // estrutura IF - ELSE if(media >= 7.0 && nota4 >=6){ // expressão condicional a ser testada com operador lógico && if(nota4 >= 9){ // IF Aninhado printf(“Aluno Aprovado, notas acima da media :) \n”); }else{ printf(“Aluno Aprovado :) “) } }else{ printf(“Aluno Reprovado :( \n”); } // estrutura IF - ELSE if(nota2 > nota1 || nota4 > nota3){ // expressão condicional a ser testada com operador lógico || if(nota4 >= 9){ // IF Aninhado printf(“Entre os bimestres o aluno aumentou a sua nota, parabens pelo empenho.”); }else{ printf(“Entre os bimestres o aluno aumentou a sua nota.”); } }else{ Printf(“O aluno nao aumentou a sua nota dentre os bimestres”); } } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 49 Agora, caso o aluno seja aprovado, efetuamos uma nova validação: caso a nota do quarto bimestre deste aluno for maior ou igual a nove, a mensagem será “Aluno Apro- vado, notas acima da média :)”, caso não, será apresentado apenas “Aluno Aprovado”. A estrutura de IFs aninhados também foi implementada na condição de notas entre os bimestres, vejamos agora o algoritmo em execução Retorno do algoritmo com a estrutura de IFs aninhados Fonte: elaborado pelo autor O resultado que foi apresentado na tela está ligado diretamente com as estruturas de desvio condicional IF e IF - ELSE podemos aplicar o conceito de IFs aninhados também com IF - ELSE, assim iremos gerar uma cascata, cada vez vamos criando novos níveis e blocos de código, mas devemos tomar cuidado ao usar IFs aninhados para não nos perder no raciocínio entre estes deixando o código-fonte extremamente confuso. 3.4 Instrução Condicional Múltipla Escolha As estruturas condicionais IF e IF - ELSE são úteis em casos de tomadas de deci- sões simples, nos quais temos apenas dois desvios a serem tomados, com base nas expressões ou operadores lógicos. Entretanto, podemos nos deparar com situações em que temos diversos caminhos a serem seguidos, podemos chamar isto de seleção múltipla ou estrutura condicional de múltipla escolha. [...] C tem um comando interno de seleção múltipla, switch, que testa sucessivamente o valor de uma expressão contra uma lista de constantes internas ou de caractere.Quando o valor coincide, os comandos associados àquela constante são executados (SCHILDT, 1997, p. 70) [...] Podemos dizer que a estrutura de seleção switch é uma evolução das estruturas condicionais simples e compostas, pois, por meio desta, podemos ter um leque de opções e desvios. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 50 3.4.1 Estrutura do switch A estrutura de seleção múltipla switch deixa os algoritmos mais dinâmicos, pois po- demos testar diversas condições a partir de uma variável. Vamos pensar no seguinte ce- nário: um sistema de cadastro de indicação de filmes de uma locadora devemos fazer o cadastro dos itens seguindo as classificações indicativas que são regulamentações sobre as idades indicadas para consumir cada obra. Elas são feitas pela Secretaria Nacional de Justiça (SNJ), do Ministério da Justiça brasileiro. Ao desenvolvermos um algoritmo que efetue a leitura do dado informado, podemos ter diversas opções para a indicação, podemos utilizar a estrutura switch em conjunto com a expressão case, assim podemos compreender sendo uma lista com a validação dos desvios. A execução da estrutura switch compara todos os cases até encontrar um desvio con- dicional satisfatório, assim executando seu bloco de código, após iniciar a sequência de códigos, chamamos o comando break, o qual veremos com mais detalhes no próximo tópico. Caso nenhum dos itens do switch seja atendido, a estrutura default é acionada, este item é identificado sendo a saída padrão, caso nenhum dos case atenda à necessidade, neste momento, o bloco de código a ser executado será apenas o default. Vejamos, a se- guir, na figura “Composição do SWITCH CASE textual”, os comandos em linguagem C: Composição do SWITCH CASE textual Fonte: elaborado pelo autor ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 51 Mesmo sendo uma estrutura mais poderosa que as de IF - ELSE, devemos atentar para alguns pontos importantes. Segundo Schildt (1997 p. 70-71), estes itens são: 1. O comando switch difere do comando if porque switch só pode testar igualda- de, enquanto if pode avaliar uma expressão lógica ou relacional. 2. Duas constantes cases no mesmo switch não podem ter valores idênticos. Obviamente, um comando switch, incluído em outro switch mais externo, pode ter as mesmas constantes case. 3. Se constantes de caractere são usadas em um comando switch, elas são automaticamente convertidas para seus valores inteiros. Para compreendermos melhor, vamos relembrar o cenário anteriormente apresen- tado, no qual estamos desenvolvendo um sistema de cadastro de indicação de filmes com base na informação gerada do usuário e a classificação indicativa. Vejamos o código-fonte em C, a seguir: #include <stdio.h> #include <stdlib.h> #include <locale.h> main (){ setlocale(LC_ALL, “Portuguese”); int classificacao; printf(“-----------------------\n”); printf(“0 = Livre \n1 = 10 anos \n”); printf(“2 = 12 anos \n3 = 14 anos \n”); printf(“4 = 16 anos \n5 = 18 anos \n”); printf(“9 = Sem Classificação \n”); printf(“-----------------------\n”); printf(“Digite a classificação indicativa do filme: “); scanf(“%d”, &classificacao); switch (classificacao){ case 0 : printf(“\n Classificação livre: desenho animados.\n”); break; ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 52 Algoritmo de classificação de filmes Fonte: elaborado pelo autor No algoritmo apresentado será exibida na tela a classificação indicada, conforme os dados informados pelo usuário, a estrutura será percorrida até encontrar uma con- dição satisfatória ou será apresentada a mensagem que consta no desvio default. Vejamos este algoritmo em execução na figura “Retorno do algoritmo de adivinhe o número oculto”. case 1 : printf(“\n Classificação 10: presença de armas, medo e ten- são.\n”); break; case 2 : printf(“\n Classificação 12: violência, lesão corporal, des- crição de violência.\n”); break; case 3 : printf(“\n Classificação 14: morte, vulgaridade, drogas ilíci- tas.\n”); break; case 4 : printf(“\n Classificação 16: tortura, mutilação, violência, morte.\n”); break; case 5 : printf(“\n Classificação 18: violência de forte impacto, crueldade.\n”); break; default: printf(“\n Sem classificação.\n”); } return(0); } ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 53 Retorno do algoritmo de adivinhe o número oculto Fonte: elaborado pelo autor Ao executar o algoritmo, digitamos o número 2, que equivale à classificação de 12 anos, quando a estrutura processada é comparada ao primeiro case, como este não é o número 2 e passado para o segundo case este também não corresponde ao número 2, já o terceiro case corresponde com o que foi digitado, neste momento, o que estiver associado a ele será executado, com base em nosso algoritmo a informação exibi- da em tela terá sido “Classificação 12…”; compreender esta estrutura é interessante, porque funciona praticamente com a operação lógica de comparação, igualdade de elementos, não sendo aplicada quando trabalhamos com outros operadores lógicos como os de maior que, menor que, maior ou igual, dentre outros. 3.4.2 Comando break O comando break é implementado em diversas estruturas, uma destas é a switch - case que acabamos de ver, podemos utilizar o comando break ou o comando continue, para representar a parada ou o andamento da execução do bloco de códigos a serem executados. Os comandos break e continue são usados para alterar o fluxo de contro- le. O comando break, quando executado em uma estrutura while, for, do... while ou switch causa uma saída imediata dessa estrutura. A execução do programa continua com a próxima instrução. Os usos comuns do comando break são para escapar mais cedo de um loop ou para pular o restante de uma estrutura switch. (DEITEL; DEITEL, 2011, p. 94) Sobre as estruturas mencionadas, while - for - do...while, estas são consideradas como estruturas de repetição ou laço de repetição para compreendermos o quão im- portante é o uso do comando break na estrutura switch, vejamos o código, a seguir, ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 54 sem o uso do comando break: Algoritmo de classificação de filmes Fonte: elaborado pelo autor Este algoritmo é bem simples, ele requisita para o usuário escolher uma opera- ção aritmética, após isso, executamos a estrutura switch - case, observe que neste código-fonte desenvolvido em linguagem C não utilizamos o comando break após a #include <stdio.h> #include <stdlib.h> #include <locale.h> main (){ setlocale(LC_ALL, “Portuguese”); char operacao; printf(“Escolha uma oeração [ + - * / ]:”); scanf(“%c”, &operacao); switch (operacao){ case ‘+’ : printf(“\n Adição.\n”); break; case ‘-’ : printf(“\nSubtração”); break; case ‘*’ : printf(“\nMultitplicação”); break; case ‘/’ : printf(“\nDivisão”); break; default: printf(“\nNenhuma operação válida”); } return(0);} ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I ESPECIALISTA JOSÉ HENRIQUE HONJOYA FACULDADE CATÓLICA PAULISTA | 55 comparação de cada case, neste caso, vejamos este algoritmo em execução na figura “Retorno do algoritmo sem o comando break”. Retorno do algoritmo sem o comando break Fonte: elaborado pelo autor Ao executar o algoritmo e digitarmos o sinal de adição a estrutura switch é proces- sada, note que mesmo tendo um caminho de desvio compatível, todos os cases foram acessados e impressos na tela. O comando break é necessário nesta e em outras es- truturas para dar a saída da estrutura e não executar o bloco de códigos errados, com base nisto, vemos que é sempre necessário utilizar o comando break na estrutura de seleção múltipla.
Compartilhar