Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORITMOS E PROGRAMAÇÃO APLICADA PROF. ME. RAFAEL BARBOSA Reitor: Prof. Me. Ricardo Benedito de Oliveira Pró-reitor: Prof. Me. Ney Stival Gestão Educacional: Prof.a Ma. Daniela Ferreira Correa PRODUÇÃO DE MATERIAIS Diagramação: Alan Michel Bariani Thiago Bruno Peraro Revisão Textual: Felipe Veiga da Fonseca Letícia Toniete Izeppe Bisconcim Luana Ramos Rocha Produção Audiovisual: Márcio Alexandre Júnior Lara Marcus Vinicius Pellegrini Osmar da Conceição Calisto Gestão de Produção: Kamila Ayumi Costa Yoshimura Fotos: Shutterstock © Direitos reservados à UNINGÁ - Reprodução Proibida. - Rodovia PR 317 (Av. Morangueira), n° 6114 Prezado (a) Acadêmico (a), bem-vindo (a) à UNINGÁ – Centro Universitário Ingá. Primeiramente, deixo uma frase de Sócrates para reflexão: “a vida sem desafios não vale a pena ser vivida.” Cada um de nós tem uma grande responsabilidade sobre as escolhas que fazemos, e essas nos guiarão por toda a vida acadêmica e profissional, refletindo diretamente em nossa vida pessoal e em nossas relações com a sociedade. Hoje em dia, essa sociedade é exigente e busca por tecnologia, informação e conhecimento advindos de profissionais que possuam novas habilidades para liderança e sobrevivência no mercado de trabalho. De fato, a tecnologia e a comunicação têm nos aproximado cada vez mais de pessoas, diminuindo distâncias, rompendo fronteiras e nos proporcionando momentos inesquecíveis. Assim, a UNINGÁ se dispõe, através do Ensino a Distância, a proporcionar um ensino de qualidade, capaz de formar cidadãos integrantes de uma sociedade justa, preparados para o mercado de trabalho, como planejadores e líderes atuantes. Que esta nova caminhada lhes traga muita experiência, conhecimento e sucesso. Prof. Me. Ricardo Benedito de Oliveira REITOR 33WWW.UNINGA.BR U N I D A D E 01 SUMÁRIO DA UNIDADE INTRODUÇÃO ..............................................................................................................................................................5 1. CONCEITOS BÁSICOS DE HARDWARE E SOFTWARE DE UM COMPUTADOR.................................................6 1.1 HARDWARE ............................................................................................................................................................8 1.2 UNIDADE CENTRAL DE PROCESSAMENTO - UCP ...........................................................................................8 1.3 MEMÓRIAS ...........................................................................................................................................................8 1.4 PERIFÉRICOS DE ENTRADA E SAÍDA .................................................................................................................8 1.5 SISTEMA OPERACIONAL .....................................................................................................................................9 2. SISTEMA DE NUMERAÇÃO: DECIMAL, BINÁRIO, OCTAL E HEXADECIMAL ....................................................9 2.1 CONVERSÃO DECIMAL PARA BINÁRIOS .......................................................................................................... 10 2.2 CONVERTER BINÁRIO EM DECIMAL ............................................................................................................... 12 CONCEITOS BÁSICOS DA CIÊNCIA DA COMPUTAÇÃO, ÁLGEBRA DE BOOLE E FUNDAMENTOS DA LÓGICA DE PROGRAMAÇÃO PROF. ME. RAFAEL BARBOSA ENSINO A DISTÂNCIA DISCIPLINA: ALGORITMOS E PROGRAMAÇÃO APLICADA 4WWW.UNINGA.BR 2.3 CONVERTER DECIMAL PARA OCTAL ................................................................................................................ 13 2.4 CONVERTER DECIMAL PARA HEXADECIMAL ................................................................................................. 14 2.5 CONVERTER BINÁRIO PARA OCTAL ................................................................................................................. 15 2.6 CONVERTER BINÁRIO PARA HEXADECIMAL .................................................................................................. 16 3. TABELA ASCII ....................................................................................................................................................... 16 4. ÁLGEBRA DE BOOLE ........................................................................................................................................... 20 4.1 HISTÓRIA DA ÁLGEBRA DE BOOLE ................................................................................................................. 20 4.2 FUNÇÕES DE BOOLE .......................................................................................................................................... 21 4.3 FUNÇÕES BOOLEANAS BÁSICAS E SUAS TABELAS VERDADES ...................................................................23 4.4 POSTULADOS DA ÁLGEBRA DE BOOLE ......................................................................................................... 25 4.5 PROPRIEDADES DA ÁLGEBRA DE BOOLE ..................................................................................................... 26 4.5.1 TEOREMAS DE ÁLGEBRA DE BOOLE ........................................................................................................... 26 5. FUNDAMENTOS DA LÓGICA DE PROGRAMAÇÃO .............................................................................................27 5.1 ALGORITMOS ......................................................................................................................................................27 5.2 CONSTRUÇÃO DE FLUXOGRAMAS ................................................................................................................. 28 5WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA INTRODUÇÃO A onda de novas tecnologias computacionais tende a gerar novos tipos de sistemas, novas formas de criar ferramentas, novas formas de dados e assim por diante, que muitas vezes derrubaram seus predecessores. O que pareceu ser a evolução é, de certa forma, uma série de revoluções. Entretanto o desenvolvimento de tecnologias de computação é mais do que uma cadeia de inovação - um processo que tem sido uma característica das tecnologias físicas que moldam nosso mundo. Por exemplo, existe uma cadeia de inspiração da roda hidráulica, da máquina a vapor, ao motor de combustão interna. Subjacente a isso, é um processo de habilitação. A indústria de construção de motores a vapor produziu as habilidades, materiais e ferramentas utilizados na construção dos primeiros motores de combustão interna. Na computação, algo mais rico está acontecendo, novas tecnologias emergem, não só pela substituição dos predecessores, mas também pela envolvente. A computação está criando plataformas em que se reinventa. Nesta unidade iremos explorar alguns conceitos básicos de ciência da computação e como que interpretar a linguagem de máquina (binários) e a lógica que norteia a computação. 6WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 1. CONCEITOS BÁSICOS DE HARDWARE E SOFTWARE DE UM COMPUTADOR A evolução dos computadores pode ser considerada desde o surgimento do ENIAC (Eletronic Numerical Integrator and Computer - Computador Integrador Numérico Eletrônico), como o primeiro computador digital de grande escala, até o Tianhe-2, o supercomputador chinês que alcançou a marca de 33,86 petaflop/s, ou seja, 33,8615 operações por segundo. Para se ter uma ideia, isso representa um equipamento 1 milhão de vezes mais rápido que um computador comercial comum. Esses avanços foram graças às descobertas e pesquisas no campo da eletrônica: • Em 1904, o inglês John Ambrose Fleming (1849-1945) desenvolveu a válvula termiônica, também chamadavárias vezes de válvula a vácuo, como podemos observar na Figura 1. As válvulas eram utilizadas como componente de controle para integrar dispositivos biestáveis (com dois estados estáveis ON/OFF). Figura 1 - Válvula Termiônica. Fonte: Domínio Público (2017). • Na década de 50, com aperfeiçoamento das técnicas, foi possível utilizar os semicondutores, para o desenvolvimento do diodo e o transistor, permitindo a redução do tamanho de circuitos e aumentando a confiabilidade dos equipamentos. Figura 2 – Transistor. Fonte: King of Wallpapers (2017). 7WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA • Nos anos seguintes, começou a miniaturização com os circuitos integrados, composto basicamente por dispositivos semicondutores sobre um substrato fino de material semicondutor (BRIAN, 1998). Figura 3 - Circuito integrado. Fonte: Wiki Wand (2017). • Na década de 70 surgiu o microprocessador, que conseguiu implementar toda a CPU de um computador num único elemento integrado (Friederich e Korbs, 2014). A maioria dos computadores segue a arquitetura de von Neumann, que descreve um computador de três partes principais: CPU (Computer Processing Unit - Unidade Central de Processamento), Memória e dispositivos de entrada e saída. Esses componentes podem ser vistos na Figura 4. Figura 4 - Diagrama do princípio do funcionamento do computador. Fonte: Doc Player (2017). 8WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 1.1 Hardware Pela definição usual, Hardware é a parte física do computador, formado por componentes eletrônicos, como por exemplo, mouse, teclado, monitor, caixa de som dentre outros. Não necessariamente apenas componentes externos, como também os internos, por exemplo, memória RAM, placa de vídeo, placa de rede e etc. 1.2 Unidade Central de Processamento - UCP Basicamente é um circuito eletrônico, conhecido como processador, tem a função de executar as instruções de um programa, executando as operações aritméticas, lógicas e o controle das entradas e saídas especificadas pela instrução (WEIK, 1971). A forma, a concepção e a implementação da UCP mudaram ao longo de sua história, mas sua operação fundamental permanece inalterada. Os componentes principais da UCP são a Unidade Lógica Aritmética (ULA), que tem a função de executar as operações lógicas e aritméticas; a Unidade de Controle (UC ou CC), que tem como atribuição direcionar a operação do processador para responder as instruções do programa; e os registradores, que têm como função armazenar os dados para o processamento. Alguns autores dizem que os registradores se incluem na mesma categoria das memórias cache. 1.3 Memórias Na computação, memória refere-se aos dispositivos de hardware do computador usados para armazenar informações para uso imediato. A memória opera a uma velocidade elevada, por exemplo, a memória de acesso aleatório (RAM), que armazena grandes quantidades de dados. Nesta subseção, iremos ver os dois tipos de memória, a principal e a secundária. Memória Principal: • Memória RAM (Random-access memory - Memória de Acesso Aleatório): armazena as instruções do programa para aumentar a velocidade, ou seja, permite que os itens de dados sejam lidos ou escritos independentes da localização física dos dados da memória. • Memória ROM (Random-Only Memory - Memória exclusiva para leitura): é um tipo de memória não volátil. Os dados são armazenados permanentemente ou não, serve para armazenar informações do firmware (software que está intimamente ligado ao hardware). Memória Secundária: • As memórias secundárias ou auxiliares são um meio para guardar informações que não podem ser perdidas, mesmo quando o computador é desligado por qualquer motivo. Este tipo de memória é conhecido ainda como memória de massa ou externa (Frederich e Korb, 2014). Alguns exemplos, disco magnéticos (HD) ou flexível (disquete), CD-ROM e Pen drive. 1.4 Periféricos de Entrada e Saída São dispositivos que permitem a comunicação com o computador. Todos esses dispositivos são processados pela UCP. 9WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA • Dispositivos de entrada: são utilizados para introduzir informações para o computador. Exemplos: teclado, mouse, leitora de código de barras, scanner. • Dispositivos de saída: são utilizados para exibir informações armazenadas ou processadas pelo computador. Exemplos: impressora, Display, mostradores digitais. 1.5 Sistema Operacional Basicamente, o Sistema Operacional (SO) é um software de sistema que gerencia recursos de hardware e software e fornece serviços comuns para os programas de computador. Todos os programas de computador, salvo o firmware, necessitam de um sistema operacional para funcionar. Os sistemas operacionais utilizam um recurso chamado (time-sharing), esse recurso serve para planejar tarefas para uso eficiente do processador, armazenamento de dados em massa, impressão e outros recursos. Para as funções de hardware como entrada e saída e alocação de memória, o sistema operacional atua como intermediário entre os programas e o hardware do computador (STALLINGS, 2005). Embora o código do programa seja normalmente executado diretamente pelo hardware, o programa frequentemente faz chamada para o SO ou até mesmo é interrompido por ele. Os sistemas operacionais (SO) de desktop (referência ao computador de mesa) e notebooks mais utilizados, de acordo com o Global Stats (2015), no período de 2015, é dominante o SO da Microsoft, o Windows, com uma participação do mercado de cerca de 82%. O SO da Apple Inc. está em segundo lugar (9,8%), e o Linux o SO gratuito está em terceiro com 1,5%. Ainda de acordo com a Global Stats, o mercado de sistema operacionais de celulares, o Android do Google é dominante, com 87,5%, em segundo o iOS da Apple com 12,1%, os outros SO somam 0,4%. No setor de supercomputadores e servidores é dominante o sistema operacional Linux. 2. SISTEMA DE NUMERAÇÃO: DECIMAL, BINÁRIO, OCTAL E HEXADECIMAL Com o surgimento da computação no campo da multimídia, é comum termos um olhar de máquinas de manipulação de texto, vídeos e imagens, mas realmente os computadores funcionam manipulando apenas números. Sons e imagens são interpretados pelo computador como um conjunto de números. De acordo com Damas (2011), tudo começou com a invenção do bit (binary digital), que pode ser representado por dois estados: ligado e desligado. Geralmente ligado (1) e desligado (0), um bit serve perfeitamente para indicar o sexo de um determinado indivíduo, pois existe o sexo masculino e o feminino: • 1 - Feminino • 0 - Masculino Se pretendermos representar o estado civil de uma pessoa, o bit já não chega, pois existem vários estados: solteiro, casado, divorciado e viúvo. Precisamos juntar dois bits de forma a representar o estado civil: • 00 - Solteiro • 01 - Casado • 10 - Divorciado 10WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA • 11 - Viúvo No entanto, em vias de normas, podemos juntar apenas grupos de 8 bits, o que passa a ser chamado de byte. O byte representa uma letra, sinal de pontuação, pixel e outras informações que o computador processa. Para que isso ocorra, os computadores utilizam uma tabela que combina números binários com símbolos, a tabela ASCII (American Standard Code for Information Interchange), que iremos ver mais adiante ainda nesta unidade. 2.1 Conversão Decimal para Binários O sistema decimal de numeração (base 10) possui dez possíveis valores (0,1,2,3,4,5,6,7,8,9) para cada casa numérica. Já o sistema binário possui dois valores (0,1) para cada casa numérica. Já que apenas o sistema binário é a linguagem interna dos computadores, o programador deve saber converter decimal para binário. Existem vários métodos para a conversão,no entanto, vamos ensinar o método mais prático, que é a divisão curta por dois com resto, por exemplo: Converter 1810 para binário. Solução: para converter esse número decimal em binário, faça a divisão por dois e escreva o resto. 1810 Resultado Fracionada? Binário 18/2 9 Não, é uma divisão exata 0 9/2 4,5 Sim, divisão fracionada 1 4/2 2 Não, é uma divisão exata 0 2/2 1 Não, é uma divisão exata 0 1/2 0,5 Sim, divisão fracionada 1 1810 = 100102 Escreva os binários de baixo para cima 11WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA b) Converter 12510 para binário: 12510 Resultado Binário 125/2 62,5 1 62/2 31 0 31/2 15,5 1 15/2 7,5 1 7/2 3,5 1 3/2 1,5 1 1/2 0,5 1 12510 = 11111012 c) Converter 19210 para binário: 19210 Resultado Binário 192/2 96 0 96/2 48 0 48/2 24 0 24/2 12 0 12/2 6 0 6/2 3 0 3/2 1,5 1 1/2 0,5 1 19210 = 110000002 A conversão não parece ser difícil, mas deve-se ter atenção. São muitos números e muitas variáveis, se houver erros, a leitura final ficará comprometida! 12WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Na tabela a seguir observe os decimais convertidos em binários. Decimal Binário 0 00000 1 00001 2 00010 3 00011 4 00100 5 00101 6 00110 7 00111 8 01000 9 01001 Tabela 1 - Decimal e seu valor correspondente em binário. Fonte: o autor. 2.2 Converter Binário em Decimal Se analisarmos a tabela 1, vemos que os múltiplos de 2 estão todos colocados estrategicamente, contendo um dos bits e todos os outros zeros. Por exemplo, o decimal 9, observe se enumerarmos da esquerda para direita, cada casa é uma posição, que pode representar dois valores (0 ou 1), ou seja base 2. Vamos verificar o exemplo abaixo: 010012 Binário 0 1 0 0 1 24 23 22 21 20 Resultado 0 8 0 0 1 A soma é igual: 0+8+0+0+1 = 9 Outro exemplo, o mesmo no caso: 100102 Binário 1 0 0 1 0 24 23 22 21 20 Resultado 16 0 0 2 0 A soma é igual: 16+0+0+2+0 = 18 13WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 2.3 Converter decimal para octal O octal se tornou amplamente utilizado na computação pois era ideal em converter sistemas binários uma vez que cada dígito octal pode ser escrito como um único número binário de três dígitos. Assim, foi possível diminuir custos de display e calculadoras (PRICE; PESELNICK, 1987). Basicamente é um sistema numérico de base 8, (0,1,2,3,4,5,6 e 7), para converter um número decimal em octal é simples. Exemplos: 1810 para octal: Podemos verificar que 1810 = 228 Caso esteja com dúvidas tire a prova real: 2×81 + 2× 80 = 16 + 2 = 18 b) 1610 para octal: Para não ficar muito confuso, na operação, coloque apenas o resto. 1610 = 208 c) 9610 para octal: 9610 = 1408 Caso esteja com dúvidas, faça a prova real: 1x 82 +4 x 81 + 0 x 80 = 64 + 32 + 0 = 96 14WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Decimal Octal 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 10 9 11 Tabela 2 - Decimal para octal. Fonte: o autor. 2.4 Converter Decimal Para Hexadecimal O sistema numérico hexadecimal tem a base numérica 16, possui 16 símbolos possíveis para representar um único dígito (0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F). Para converter precisamos do auxílio da tabela a seguir. Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F Os números hexadecimais são amplamente utilizados por profissionais da computação, pois é mais conveniente que o binário, mais adiante iremos verificar a razão disso. Agora vamos ver um exemplo. Converter 1810 em hexadecimal Utilizaremos o mesmo princípio, da operação para converter em octal, mas só que agora com a base 16. Então 1810 = 1216 b) Converter 102410 em hexadecimal Para números decimais muito grandes o sistema hexadecimal é vantajoso veja: 102410 = 40016 15WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA b) Converter 12510 em hexadecimal: 12510 = 7D D = 13, como podemos ver na tabela 2. 2.5 Converter Binário Para Octal É extremamente simples converter Binário para Octal, temos que observar que a base octal (8 valores) pode ser representada por 3 bits. Podemos confirmar isso visualizando a tabela a seguir: Octal Binário 0 000 1 001 2 010 3 011 4 100 5 101 6 110 7 111 Tabela 3 - Octal para binário. Fonte: o autor. Exemplos: 1001102 para octal Vamos agrupar os bits 3 em 3: De acordo com a tabela (100) = 4 e (110) = 6 b) 101101012 para octal: 101101012 = 2658 16WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 2.6 Converter Binário Para Hexadecimal Tem o mesmo princípio que o Octal, porém a base não é a mesma, hexadecimal (16 valores), nesse caso deve-se agrupar os bits em grupos de 4. Hexa Binário Hexa Binário 0 0000 8 1000 1 0001 9 1001 2 0010 A 1010 3 0011 B 1011 4 0100 C 1100 5 0101 D 1101 6 0110 E 1110 7 0111 F 1111 Tabela 4 – Converter Binário para Hexadecimal. Fonte: o autor. Exemplos: 1001102 para Hexadecimal: Observe que foram inseridos dois zeros no lado esquerdo, para fazer agrupamento de 4 bits. 1001102 = 2616 b) 101101012 para Hexadecimal: 101101012 = B516 3. TABELA ASCII A tabela ASCII (American Standard Code for Information Interchange - Código Padrão Americano para Intercâmbio de Informações), representa texto em computadores, equipamentos de telecomunicação e outros dispositivos. A maioria dos dispositivos modernos de codificação se baseiam no ASCII (MACKENZIE, 1980). A ASCII foi desenvolvida a partir do código telegráfico. Seu primeiro uso comercial foi como código de teleimpressor de sete bits, promovido pelos serviços de dados da empresa Bell. O trabalho sobre o padrão ASCII começou nos anos 60, três anos depois foi publicada a primeira versão e foi submetida a uma revisão no final dos anos 60, e passou por uma atualização em 1986. Originalmente baseado no alfabeto inglês, ASCII codifica 128 caracteres especificados em inteiros de sete bits. Os caracteres codificados podem ser vistos na tabela a seguir. 17WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Caractere Decimal Hexadecimal Binário Comentário NUL 00 00 0000 0000 Caracter Nulo SOH 01 01 0000 0001 Começo de cabeçalho de transmissão STX 02 02 0000 0010 Começo de texto ETX 03 03 0000 0011 Fim de texto EOT 04 04 0000 0100 Fim de transmissão ENQ 05 05 0000 0101 Interroga ACK 06 06 0000 0110 Confirmação BEL 07 07 0000 0111 Sinal sonoro BS 08 08 0000 0100 Volta um caracter HT 09 09 0000 1001 Tabulação Horizontal LF 10 0A 0000 1010 Próxima linha VT 11 0B 0000 1011 Tabulação Vertical FF 12 0C 0000 1100 Próxima Página CR 13 0D 0000 1101 Início da Linha SO 14 0E 0000 1110 Shift-out SI 15 0F 0000 1111 Shift-in DLE 16 10 0001 0000 Data link escape D1 17 11 0001 0001 Controle de dispositivo D2 18 12 0001 0010 Controle de dispositivo D3 19 13 0001 0011 Controle de dispositivo D4 20 14 0001 0100 Controle de dispositivo NAK 21 15 0001 0101 Negativa de Confirmação SYN 22 16 0001 0110 Synchronous idle ETB 23 17 0001 0111 Fim de transmissão de bloco CAN 24 18 0001 1000 Cancela EM 25 19 0001 1001 Fim de meio de transmissão SUB 26 1A 0001 1010 Substitui ESC 27 1B 0001 1011 Escape FS 28 1C 0001 1100 Separador de Arquivo GS 29 1D 0001 1101 Separador de Grupo RS 30 1E 0001 1110 Separador de registro US 31 1F 0001 1111 Separador de Unidade Tabela 5 – ASCII. Fonte: Mackenzie (1980). 18WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Espaço 32 20 0010 0000 ! 33 21 0010 0001 “ 34 22 0010 0010 # 35 23 0010 0011 $ 36 24 0010 0100 % 37 25 0010 0101 & 38 26 0010 0110 ‘ 39 27 0010 0111 ( 40 28 0010 1000 ) 41 29 0010 1001 * 42 2A 0010 1010 + 43 2B 0010 1011 , 44 2C 00101100 - 45 2D 0010 1101 . 46 2E 0010 1110 / 47 2F 0010 FFFF 0 48 30 0011 0000 1 49 31 0011 0001 2 50 32 0011 0010 3 51 33 0011 0011 4 52 34 0011 0100 5 53 35 0011 0101 6 54 36 0011 0110 7 55 37 0011 0111 8 56 38 0011 1000 9 57 39 0011 1001 : 58 3A 0011 1010 ; 59 3B 0011 1011 < 60 3C 0011 1100 = 61 3D 0011 1101 > 62 3E 0011 1110 ? 63 3F 0011 1111 @ 64 40 0100 0000 A 65 41 0100 0001 B 66 42 0100 0010 C 67 43 0100 0011 D 68 44 0100 0100 19WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA E 69 45 0100 0101 F 70 46 0100 0110 G 71 47 0100 0111 H 72 48 0100 1000 I 73 49 0100 1001 J 74 4A 0100 1010 K 75 4B 0100 1011 L 76 4C 0100 1100 M 77 4D 0100 1101 N 78 4E 0100 1110 O 79 4F 0100 1111 P 80 50 0101 0000 Q 81 51 0101 0001 R 82 52 0101 0010 S 83 53 0101 0011 T 84 54 0101 0100 U 85 55 0101 0101 V 86 56 0101 0110 W 87 57 0101 0111 X 88 58 0101 1000 Y 89 59 0101 1001 Z 90 5A 0101 1010 [ 91 5B 0101 1011 \ 92 5C 0101 1100 ] 93 5D 0101 1101 ^ 94 5E 0101 1110 _ 95 5F 0101 1111 ` 96 60 0110 0000 a 97 61 0110 0001 b 98 62 0110 0010 c 99 63 0110 0011 d 100 64 0110 0100 e 101 65 0110 0101 f 102 66 0110 0110 g 103 67 0110 0111 h 104 68 0110 1000 i 105 69 0110 1001 20WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA j 106 6A 0110 1010 k 107 6B 0110 1011 l 108 6C 0110 1100 m 109 6D 0110 1101 n 110 6E 0110 1110 o 111 6F 0110 1111 p 112 70 0111 0000 q 113 71 0111 0001 r 114 72 0111 0010 s 115 73 0111 0011 t 116 74 0111 0100 u 117 75 0111 0101 v 118 76 0111 0110 w 119 77 0111 0111 x 120 78 0111 1000 y 121 79 0111 1001 z 122 7A 0111 1010 { 123 7B 0111 1011 | 124 7C 0111 1100 } 125 7D 0111 1101 ~ 126 7E 0111 1110 DELETE 127 7F 0111 1111 Tabela 6 – Caracteres. Fonte: Mackenzie (1980). Cabe lembrar que o ASCII reserva 32 códigos (0 - 31) para caracteres de controle (veja a coluna de comentários), originalmente destinados a não representar informações imprimíveis, mas sim para dispositivos de controle (como impressoras) que fazem o uso do ASCII. 4. ÁLGEBRA DE BOOLE 4.1 História da Álgebra de Boole A álgebra de Boole antecede os desenvolvimentos modernos no campo da álgebra abstrata e na lógica matemática, no entanto está intimamente ligada às origens de ambos os campos (DUNN; HARDEGREE, 2001). Em 1847, dois grandes trabalhos inovadores foram publicados por matemáticos britânicos: Lógica Formal por Augustus de Morgan (1806-1871) e a Análise Matemática da Lógica por George Boole (1815-1864). Ambos os autores procuraram expandir os limites da lógica tradicional, desenvolvendo um método geral para representar e manipular inferências logicamente válidas. 21WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Embora de natureza explicitamente algébrica, a abordagem audaz e original de Boole levou a um sistema de álgebra muito estranho. Em seu trabalho publicado no livro “Uma Investigação das Leis do Pensamento”, publicado em 1854, Boole explorou essa álgebra estranha e verificou que seu sistema se assemelhava e divergia da álgebra tradicional. Apesar de não ter sido bem recebido na época, posteriormente tornou-se um campo de estudo em matemática e uma ferramenta poderosa na concepção e estudo de circuitos eletrônicos e arquitetura de computadores. Na década de 1930, ao estudar circuitos de comutação, Claude Shannon (1916 - 2001), matemático e engenheiro eletrônico estadunidense, conhecido como pai da teoria da informação, observou que também se poderia aplicar as regras da álgebra de Boole na configuração de circuitos de comutação, como uma maneira de analisar e projetar circuitos por meios algébricos em termos de porta lógicas. A implementação eficiente das funções booleanas, para resolução de problemas fundamentais em circuitos lógicos combinacionais, fez desenvolver as modernas ferramentas de automação, permitindo o desenvolvimento da computação. 4.2 Funções de Boole O estudo da Álgebra de Boole passa pela definição de uma série de símbolos, com a finalidade de formalização de expressões matemáticas para análise mais adequada de suas funções. Enquanto a álgebra tradicional opera com relações quantitativas, a álgebra de Boole opera com relações lógicas. As variáveis booleanas são representadas por letras que podem assumir apenas dois valores (0 ou 1), e as variáveis da álgebra tradicional representam números reais. Vamos considerar dois operadores “+” e “”, soma e multiplicação, como ficaria esses operadores na álgebra booleana? Veja na tabela a seguir. Operador Álgebra Tradicional Álgebra Booleana “+” Soma “OR” ou “OU” “” Multiplicação “AND” ou “E” Tabela 7 - Operadores da álgebra tradicionais e booleana. Fonte: o autor. Verificando a tabela, podemos perceber que a álgebra booleana não exige uma resposta numérica, contudo, busca uma conclusão lógica de alguma expressão. Vamos analisar o exemplo a seguir na Figura 5: Figura 5 - Circuito elétrico simples com chave tipo switch. Fonte: o autor. 22WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Para representarmos o estado da variável binária, utilizamos um procedimento chamado tabela verdade. A tabela a seguir representa a função binária . Número de variáveis binárias é 4, logo a tabela tem 24 = 16 linhas. a b c d S 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 Tabela 8 - verdade da função S = f(a,b,c,d) = a . b + c . d . Fonte: o autor. Em um circuito elétrico simples, para ligar a lâmpada basta fechar os interruptores (a e b) ou (c e d). Qual a função lógica formada por variáveis binárias que representa esse circuito? Lembrando que as variáveis na álgebra booleana podem representar dois números (0 ou 1). Logo a função que representa esse circuito é: S = f(a,b,c,d) = a·b + c·d 23WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 4.3 Funções Booleanas básicas e suas tabelas verdades A seguir, iremos estudar as funções booleanas básicas e as respectivas tabelas verdades: • Função Igualdade: S(a) = a a S 0 0 1 1 • Função União (OR ou OU) - Soma lógica: S (a,b) = a+b a b S 0 0 0 0 1 1 1 0 1 1 1 1 • Função intersecção (AND ou E) - Multiplicação lógica: S (a,b) = a . b a b S 0 0 0 0 1 0 1 0 0 1 1 1 24WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA • Função negação (NOT ou N): S (a) = α a S 0 1 1 0 • Função da negação da intersecção (NAND ou NE): S (a,b) = a · b a b S 0 0 1 0 1 1 1 0 1 1 1 0 • Função negação da reunião (NOR ou NOU): S(a,b) = a + b a b S 0 0 1 0 1 0 1 0 0 1 1 0 25WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA • Função OR ou OU exclusivo (XOR ou XOU) (): S(a,b) = a⋅b + a⋅b S(a,b) = a⊕b a b S 0 0 0 0 1 1 1 0 1 1 1 0 4.4. Postulados da Álgebra de Boole Por meio dos postulados e teoremas, é possível simplificar as expressões lógicas. Seguem os postulados e teoremas de acordo com Daghlin (1995): Postulado 1 - A soma lógica de uma variável (a) mais 1 é sempre 1. Postulado 2 - A soma lógica de uma variável mais um valor lógico 0 sempre será igual a variável. Postulado 3 - O produto lógico de uma variável por um valor lógico 1 sempre será a variável. Postulado 4 - O produto lógico de uma variável por um valor lógico 0 será sempre 0. Postulado 5 - A soma lógica ou o produto de duas variáveis iguais é igual a própria variável. Postulado 6 - A soma lógica de uma variável mais a negação da mesma é sempre 1. Postulado 7 - O produto lógico de uma variável pela negação da mesma é sempre 1. Postulado 8 - A variável negada duas vezes (ou par de vezes) fica sempre constante. 26WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Postulado 9 - Se dois membros de uma igualdade forem negados, não sofrerá alteração, ou seja: 4.5 Propriedades da Álgebra de Boole Dentro da álgebra de Boole existem três tipos de propriedades: a comutativa, associativa e a distributiva: • Comutativa a+b = b+a a b = b a • Associativa a + (b + c) = (a + b) + c = a + b + c a (bc) =(ab)c = abc • Distributiva a (b + c) = ab + ac 4.5.1 Teoremas de Álgebra de Boole Os teoremas são propostos para simplificações em álgebra booleana, são no total três teoremas fundamentais, o terceiro foi formulado pelo matemático De Morgan um dos responsáveis pelo desenvolvimento da lógica: • Teorema 1 • Teorema 2 • Teorema 3 de De Morgan: 27WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 5. FUNDAMENTOS DA LÓGICA DE PROGRAMAÇÃO Os computadores mais antigos foram frequentemente programados sem a ajuda de uma linguagem de programação, a inserção dos códigos era geralmente na forma binária com cartões perfurados ou fita magnética, ou, alternando interruptores no painel frontal do computador. As linguagens de máquinas foram posteriormente substituídas pelas linguagens de programação, com o intuito de facilitar no desenvolvimento do programa. Para entendermos o funcionamento da lógica de programação é preciso saber alguns conceitos, que falaremos adiante. 5.1 Algoritmos De acordo com Salvetti (1999), o algoritmo é uma sequência finita de instruções ou operações cuja execução, em tempo finito, resolve um problema computacional, qualquer que seja sua instância. Sobre a origem da palavra Algoritmo, encontra-se no sobrenome, Al-Khwarizmi, do matemático persa Mohamed ben Musa que viveu no século IX. Além de matemático, também era astrônomo, membro da “Casa da Sabedoria”, uma academia de cientistas em Bagdá (LOUREIRO, 2010). A álgebra foi introduzida na Europa ocidental por meio dos seus trabalhos, cujas obras foram traduzidas no ocidente no século XII, uma dessas obras falava sobre o sistema decimal. Um algoritmo é formalmente uma sequência de passos finitos que levam uma execução de uma tarefa. Podemos pensar em algoritmo como uma receita (MORAES, 2000). Por exemplo: Exemplo 1 - Somar dois números Passo 1: Receber os dois números. Passo 2: Somar os dois números. Passo 3: Mostrar o resultado obtido Exemplo 2 - Sacar dinheiro em caixa eletrônico Passo 1: Ir até o caixa eletrônico. Passo 2: Colocar o cartão. Passo 3: Digitar senha. Passo 4: Selecionar a opção “saque”. Passo 5: Digitar valor da quantia que deseja sacar. Passo 6: Retirar o cartão. Passo 7: Retirar o dinheiro. Passo 8: Sair. Você deve estar pensando que poderia alterar os passos para simplificar ou deixar mais detalhado, entretanto devemos pensar que o problema pode ser resolvido de várias maneiras diferentes, porém atingindo o mesmo objetivo. Em suma, podemos ter vários algoritmos diferentes para resolver o mesmo problema. 28WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA 5.2 Construção de fluxogramas De acordo com Ascencio e Campos (2000), para desenvolver qualquer algoritmo são necessários alguns passos descritos a seguir: a) Ler atentamente o enunciado, destacando os pontos importantes. b) Definir os dados de entrada, ou seja, quais dados serão fornecidos. c) Definir o processamento, ou seja, quais cálculos serão efetuados e quais as restrições para esses cálculos. O processamento é responsável pela transformação dos dados de entrada em dados de saída. d) Definir dados de saída, ou seja, quais dados serão gerados depois do processamento. e) Construir o algoritmo utilizando o método de fluxograma. f) Testar o algoritmo realizando simulações. O fluxograma consiste em analisar o enunciado do problema e escrever, utilizando símbolos e gráficos predefinidos. A vantagem desse tipo de organização do algoritmo é que os elementos gráficos facilitam o entendimento em relação ao texto. Na tabela a seguir, iremos analisar o conjunto de símbolos utilizados no fluxograma. Tabela 9 - Conjunto de símbolos principais utilizados no fluxograma. Fonte: Pereira (2009, p. 5) 29WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA Exemplos de fluxogramas a) Faça um fluxograma para mostrar o resultado da multiplicação de dois números: b) Faça um algoritmo para mostrar o resultado da divisão de dois números: 30WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 ENSINO A DISTÂNCIA c) Faça um algoritmo para calcular a média aritmética entre duas notas de um aluno e para mostrar a situação desse aluno, ou seja, se o aluno tiver igual ou maior que a nota 6, aprovado, se menor a nota for menor que 6, reprovado. 3131WWW.UNINGA.BR U N I D A D E 02 SUMÁRIO DA UNIDADE INTRODUÇÃO ............................................................................................................................................................ 32 1. HISTÓRIA DA LINGUAGEM C .............................................................................................................................. 33 2. DEV C++ ................................................................................................................................................................ 33 3. LINK DEV C++ ...................................................................................................................................................... 34 4. PRIMEIROS PROGRAMAS ................................................................................................................................. 36 4.1 CARACTERES ESPECIAIS ...................................................................................................................................40 4.2 TIPOS DE DADOS BÁSICOS .............................................................................................................................. 41 5. ESTRUTURA DE CONTROLE ............................................................................................................................... 46 5.1 ESTRUTURA SEQUENCIAL................................................................................................................................. 47 5.2 ESTRUTURA CONDICIONAL .............................................................................................................................50 5.3 ESTRUTURA CONDICIONAL - SIMPLES ..........................................................................................................50 5.4 ESTRUTURA CONDICIONAL - COMPOSTA ...................................................................................................... 52 ESTRUTURA DE PROGRAMAÇÃO SEQUENCIAL E CONDICIONAL PROF. ME. RAFAEL BARBOSA ENSINO A DISTÂNCIA DISCIPLINA: ALGORITMOS E PROGRAMAÇÃO APLICADA 32WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA INTRODUÇÃO A linguagem de programação é importante, porque define o relacionamento, a semântica e a gramática, o que permite que os programadores se comuniquem efetivamente com as máquinas que eles programam. Uma linguagem de programação serve para várias finalidades: • Você pode instruir o computador o que fazer, de forma legível por humanos. • Permite que o programador estruture as instruções em funções, procedimentos etc. Isso também permite que o programa seja dividido em “pedaços” que podem ser desenvolvidos por um grupo de desenvolvedores. • Fornece portabilidade - as instruções de baixo nível de um computador serão diferentes das de outro computador. Os programadores de computador têm uma compreensão completa do modo e do porquê dos sistemas informáticos, incluindo as limitações do sistema, e podem estabelecer expectativas realistas e trabalhar emtorno dessas limitações para maximizar completamente o uso do equipamento e seus acessórios. Nesta unidade, iremos estudar uma linguagem de programação, a mais comum e a base de várias outras linguagens: a famosa linguagem C. 33WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA 1. HISTÓRIA DA LINGUAGEM C A linguagem de programação C foi concebida no início dos anos 70 por Dennis M. Ritchie, um funcionário da Bell Labs (AT&T). Nos anos 60, Ritchie trabalhou com vários outros funcionários da Bell Labs em um projeto chamado Multics. O objetivo do projeto era desenvolver um sistema operacional para um computador grande, que pudesse ser usado por mil usuários. Em 1969, a Bell Labs retirou-se do projeto, porque não poderia produzir um sistema economicamente viável. Assim, os funcionários da Bell Labs tiveram que procurar outro projeto para trabalhar (principalmente Dennis e Thompson). Thompson começou a trabalhar no desenvolvimento de um novo sistema de arquivos. Ele descreveu uma versão do novo sistema para o DEC PDP-7, um computador produzido pela Digital Equipment Corporation, que custava na época 70 mil dólares, e tinha arquitetura de 18 bits, bastante poderoso para a época. Desenvolveu o sistema utilizando a linguagem assembler. Depois de algum tempo, começaram a fazer melhorias e adicionar expansões, que culminou no jogo Space Travel, bastante popular e que exigia muito do processador para gerar gráficos e ilustração dos planetas. Depois do sistema completo, a equipe chamou-o de UNIX (uma referência sarcástica do sistema fracassado Multics). Detalhe, o programa todo estava escrito em código assembly. Após alguns anos, o UNIX contava com um “intérprete” para a linguagem B, linguagem criada por Martin Richards, derivada do nome BCPL, Basic Combined Programming Language (Linguagem de Programação Básica Combinada). Antes da linguagem B, para criar um código demandava muitas páginas, com a linguagem B o mesmo código poderia ser escrito em poucas linhas. Todavia ao programar utilizando a linguagem BCPL, ninguém conseguia representar dados, ou seja, isso incapacitava o uso de estruturas. Diante dessa necessidade, Dennis M. Ritchie junto com sua equipe (em 1971-1973) transformaram a linguagem B em C, mantendo maior parte da sintaxe e adicionaram os tipos de dados, deixando a linguagem mais funcional. Na época, Dennis Ritchie viu o potencial da linguagem de programação C e junto com sua equipe reescreveram o sistema operacional UNIX em um DEC PDP-11 e mais tarde, um livro sobre a linguagem de programação em C, clássico, chamado “The C Programming Language, 1 st edition”. No livro se encontra o famoso programa “Hello, World”. Durante muitos anos, o livro de Dennis Ritchie (principal autor) era considerado padrão. Entretanto, em 1983, um comitê foi formado pelo American National Standards Institute (ANSI), para desenvolver uma definição moderna para a linguagem de programação em C. Algumas modificações foram feitas, porém nada que afetasse os programas antigos. Em 1988, o comitê define a linguagem C. Posteriormente, a norma foi adotada pela International Standards Organization (ISO). 2. DEV C++ Basicamente o ciclo de desenvolvimento de uma aplicação engloba três fases distintas: • Desenvolvimento do código fonte: etapa do trabalho realizado pelo programador. • Compilação do código: verificar se os códigos respeitaram as sintaxes das instruções. Este procedimento de compilação é realizado pelo compilador, que detecta situações que não podem ser traduzidas pelo computador. Sendo assim o programador deve verificar possíveis erros de digitação ou estruturais. 34WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA • Execução do programa: depois de compilado o código, só executar a aplicação. Para desenvolver programas em linguagem C no sistema operacional Windows, precisamos do programa DEV C++, um software gratuito que oferece um ambiente de desenvolvimento de aplicações. Nesse programa, muitas funcionalidades são oferecidas para a escrita, compilação, debugging (evita que o programa execute de forma inesperada) e execução de programas em C e C++ (extensão da linguagem C). Utilizaremos uma versão leve e completa, que pode ser instalada em qualquer sistema operacional Windows. A seguir, o link para instalação do programa: <https://drive.google.com/ open?id=0B0ccdGtHNUWjd1RUNGE4dC0ta00>. 3. LINK DEV C++ Procedimentos de instalação: 1. Depois do download do programa, abra o “devcpp4.9.9.2_setup”. Figura 1 - Instalação do DEC C++, selecionando linguagem. Fonte: o autor. Para executar os projetos, o programa utiliza os padrões ANSI C, apesar do programa ser livre e de código aberto, foi descontinuado oficialmente em 2006, porém muitos desenvolvedores continuam o projeto independente, personalizando o programa e adicionando outras funcionalidades. 35WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA 2. Após aceitar o termo, selecione o tipo de instalação “Full”. Figura 2 - Instalação do DEV C++, instalando os componentes. Fonte: o autor. 3. Selecione a pasta do diretório de preferência, ou deixe padrão de acordo com a Figura a seguir. Figura 3 - Instalação do DEV C++, selecionando a pasta de destino. Fonte: o autor. 36WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA 4. Depois de instalado, execute o programa para verificar se está tudo correto Figura 4 - Ambiente do software DEV C++. Fonte: o autor. 4. PRIMEIROS PROGRAMAS Com o DEV C++ aberto, siga o procedimento a seguir: Figura 5 - Como criar o primeiro programa em C. Fonte: o autor. 37WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Escreva o código abaixo: Figura 6 - Primeiro programa em C (Hello World). Fonte: o autor. Compile o programa e execute: Figura 7 - Compilando e executando o programa, se preferir apenas aperte a tecla F9. Fonte: o autor. 38WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Salve o programa: Figura 8 - Salvando o primeiro programa. Fonte: o autor. Figura 9 - Programa Hello World. Fonte: o autor. Caso você digite errado alguma linha, irá aparecer um “log” abaixo do ambiente de programação, veja na Figura 10. 39WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Figura 10 - Mensagem de erro do compilador, o erro foi a falta de (;), no final da linha 7. Fonte: o autor. O erro mais comum é esquecer o (;), no final da linha da função, mas você pode ter percebido que a linha #include <stdio.h> não tem (;), isso porque a extensão (.h) não é linguagem C, mas sim uma diretiva que indica ao compilador adicionar um processo de compilação, no caso um cabeçalho padrão que vem da expressão inglesa (standard input-output header), que significa “cabeçalho padrão de entrada/saída”. Veja mais detalhes do algoritmo que desenvolvemos: #include <stdio.h> → Inclui funções de entrada e saída main ( ) → O programa começa aqui { → Início do bloco de instruções printf (“Hello World”); → Escrever a string (sequência de caracteres) usando a função printf } → Fim do bloco de instruções (e fim do programa) 40WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA A função printf mostra todos os caracteres, desde que estejam com aspas (“”). E como representar a mudança de linha (ENTER)? Uma nova linha (New Line) em C é representada por \n. Tente desenvolver um programa assim: #include <stdio.h> main ( ) { printf (“Hello \n”); printf (“World”); } 4.1 Caracteres Especiais O símbolo \ é utilizado para retirar o significado especial de caractere, ou em outroscasos como \n, serve para representar um comando. Veja a tabela: \7 Bell (sinal sonoro do computador) \a Bell (sinal sonoro do computador) \n Nova linha \\ Caractere \ (representação \ ) \’ Caractere ‘ (aspas simples) \” Caractere “ (aspas) \? Caractere ? (ponto de interrogação) Tabela 1 - Caracteres e comandos. Fonte: o autor. Geralmente, se você pesquisar na internet alguns algoritmos, verá que o programador faz “comentários” sobre o seu programa. Evidentemente que os comentários não são dedicados para o compilador e sim para o leitor entender o seu código, é a razão para descrever o algoritmo daquela forma. Os comentários não interferem no programa, e é representado por /*. Tente compilar o seguinte: #include <stdio.h> main () { printf (“Hello \n”); /*printf (“World”); /* } 41WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Você irá perceber que a palavra “World” sumiu, porque o compilador entende que é um comentário e não entra no programa final. Para você entender melhor a função dos comentários, veja a seguir um exemplo: #include <stdio.h> /*Inclui funções de entrada e saída*/ main () /*O programa começa aqui*/ { /* Início do bloco de instruções */ printf (“Hello World”); /* Escrever a string (sequência de caracteres) usando a função printf */ } /* Fim do bloco de instruções (e fim do programa) */ 4.2 Tipos de Dados Básicos Na programação em C, é necessário conhecer o tipo de dado para só então utilizá-lo. Podemos fazer uma analogia com a geladeira. Você não vai colocar uma lata de refrigerante no recipiente dos ovos, claro que você vai guardar o produto nos melhores recipientes possíveis. É a mesma coisa na linguagem C, com relação aos tipos de dados, que são basicamente quatro (char, int, float e double), e serão apresentados detalhadamente em seguida. Antes de falar sobre os tipos de dados, é bom termos alguns conceitos bem definidos. Por exemplo, sempre que desejarmos guardar um valor que, por qualquer razão, não seja fixo, devemos fazê-lo utilizando variáveis. De acordo com Damas (1995), uma variável é nada mais que um nome que damos a uma determinada posição de memória para conter um valor de um determinado tipo. 42WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA a) Inteiros – int: Como o nome indica, int é um tipo de variável que armazena valores que pertencem ao conjunto dos números inteiros positivos e negativos. EX: -1, 0, 2341234234. As operações dos inteiros, pode ser visto na Tabela 2 a seguir: Operação Descrição Exemplo Resultado + Soma 25+4 29 - Subtração 25-4 21 * Multiplicação 25*4 100 / Divisão Inteira 25/4 6,25 % Resto da Divisão 25%4 1 Tabela 2 – Operadores. Fonte: o autor. É importante ressaltar que qualquer operação entre inteiros o resultado será inteiro. Como é feita a declaração do inteiro, veja a seguir: int num; /*números inteiros*/ Vamos aprender como se escreve os números inteiros em um algoritmo em C: #include <stdio.h> main () { int num = 24; printf (“O valor de num = %d e o valor seguinte = %d \n”, num,num+1); } O que vai aparecer em sua tela provavelmente é a seguinte string: O valor de um num = 24 e o valor seguinte = 25 Você já deve ter percebido que para representar num dentro da string do printf devemos escrever um inteiro de um printf, no formato de escrita utilizando o símbolo %d. É bom lembrar que a declaração de uma variável tem que ser sempre realizada antes de qualquer instrução. Você irá entender logo em seguida. 43WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Depois temos que indicar ao printf quais os valores que terá que colocar nos locais assinalados por %d. Por isso, a importância de colocar em ordem as variáveis ou os valores que substituíram %d, separados por vírgula. Da mesma forma que existe uma função printf para a escrita de valores, existe também uma função para leitura de valores - a função scanf. Teste esse exemplo: #include <stdio.h> main() { int num; printf (“introduza um numero:”); scanf (“%d”,&num); printf (“O numero introduzido foi %d\n”,num); } b) Reais - Float e double As variáveis declaradas do tipo float ou double são utilizadas para armazenar valores numéricos reais. Geralmente é denominado ponto flutuante, porque consegue representar a parte fracionária (EX: 0.00003234). A diferença entre as declarações float e double é o número de bytes que é reservado para armazenamento. O float consegue até 7 dígitos decimais e são necessários 4 bytes de memória. Já o double e até 15 dígitos decimais e são necessários 8 bytes. Para ler qualquer variável é necessário que a função scanf preceda de & (E comercial), como no algoritmo anterior. scanf (“%d”,&num); 44WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Os números fracionários na declaração devem conter ponto para separar inteiros da parte decimal, EX: 12.5 e não 12,5. Teste essa aplicação: escreva um programa que calcule o perímetro e a área de uma circunferência. #include <stdio.h> main() { float raio, perimetro; double Pi = 3.1415927, area; printf (“Introduza o Raio da Circunferencia: “); scanf (“%f ”,&raio); area = Pi*raio*raio; perimetro = 2*Pi*raio; printf (“Area = %f\n”, area); printf (“Perimetro = %f\n”, perimetro); } c) Caracteres – char: Para armazenar caracteres utilizamos o char, porém serve apenas para armazenar UM, e somente UM, caractere. É importante enfatizar isso porque um dos erros mais comuns de programação em C é pensar que o tipo char permite armazenar strings ou conjunto de caracteres numa variável do tipo char. 45WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Escreva o algoritmo a seguir, para testar a variável char. #include <stdio.h> main () { char ch; printf (“Introduza um Caractere: “); scanf (“%c”, &ch); printf (“O caractere introduzido foi %c\n”, ch); } Existe uma função chamada getchar que serve para fazer leitura de caracteres sem ter que recorrer a função scanf. O interessante é que ela pode ser invocada sem qualquer parâmetro, ou seja, a função lê o caractere e mostra o caractere obtido como um resultado, evitando-se assim o &. Veja como ficaria o programa anterior: #include <stdio.h> main () { char ch; printf (“Introduza um Caractere: “); ch = getchar (); printf (“O caractere introduzido foi %c\n”, ch); } Agora, escreva o algoritmo a seguir e veja algo interessante note no algoritmo %c, representa a variável char, nomeada como ch. 46WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA #include <stdio.h> int main() { char ascii = 82; printf(“%c”,ascii); } Provavelmente na tela irá aparecer R, agora tente rodar esse programa: #include <stdio.h> int main() { char ascii = 83; printf(“%c”,ascii); } Apareceu S? Se sim, dê uma olhada na tabela ASCII na unidade I, o decimal 83, certamente, está associado ao caractere S. E 82 o R. O interessante que você pode fazer códigos ou senhas utilizando a tabela ASCII. Exemplo: #include <stdio.h> int main() { printf(“%c%c%c%c%c”,83,69,78,72,65); } Veja que palavra irá aparecer. 5. ESTRUTURA DE CONTROLE Uma estrutura de controle é um bloco de programação que analisa variáveis e escolhe uma direção para onde ir, com base em determinados parâmetros. O termo controle de fluxo detalha a direção que o programa leva (de que maneira o controle do programa “flui”). O controle de fluxo determina como um computador responderá as condições e parâmetros. O fluxo de controle é dividido em três categorias: • Estrutura Sequencial → Realiza um conjunto predeterminado de comandos de forma sequencial, ou seja, na ordem que foram declarados. • Estrutura Condicional → Éuma estrutura que realiza ações dependendo da condição imposta (verdadeira ou falsa). 47WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA • Estrutura de Repetição → A estrutura executa sempre em laço infinito. Dependendo do algoritmo pode-se criar uma condição para sair do laço. 5.1 Estrutura Sequencial Como o nome sugere, essa estrutura basicamente realiza um conjunto predeterminado de instruções de comandos de cima para baixo, sequencialmente, você pode visualizar olhando a Figura 11, a seguir. Figura 11 - Fluxograma de uma Estrutura Sequencial. Fonte: o autor. 48WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Escreva o algoritmo a seguir: #include <stdio.h> int main() { float num1, num2, sum, sub, mult, div; printf(“Digite o primeiro numero: “ ); scanf(“%f ”, &num1); printf(“Digite o segundo numero: “ ); scanf(“%f ”, &num2); //Soma sum = num1 + num2; //Subtração sub = num1 - num2; //Multiplicaçao mult = num1 * num2; //Divisão div = num1/num2; printf(“%.2f + %.2f = %.2f\n”, num1, num2, sum); printf(“%.2f - %.2f = %.2f\n”, num1, num2, sub); printf(“%.2f * %.2f = %.2f\n”, num1, num2, mult); printf(“%.2f / %.2f = %.2f\n”, num1, num2, div); } Certamente você verificou alguns detalhes dessa programação, uma nova forma de escrever comentários (//), e além de identificar o seguinte comando %.2f, a razão dessa função é limitar o número de casas quando calculado o resultado. Percebemos também que o algoritmo funciona de forma sequencial, respeitando as instruções. Vamos ver outro exemplo, um pouco mais aplicado, no caso para calcular o salário de um funcionário: 49WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA #include <stdio.h> main( ) { float vlrHora, nroHoras, INSS, vlrINSS, salBruto, salLiquido; printf(“Informe o valor por hora trabalhada:\n”); scanf(“%f ”, &vlrHora); printf(“\nInforme o nro de horas trabalhadas:\n”); scanf(“%f ”, &nroHoras); printf(“\nInforme o %% de desconto do INSS:\n”); scanf(“%f ”, &INSS); salBruto = vlrHora * nroHoras; vlrINSS = salBruto * (INSS / 100); salLiquido = salBruto - vlrINSS; printf(“\n\nSalario bruto = R$ %.2f ”, salBruto); printf(“\nDesconto INSS = R$ %.2f ”, vlrINSS); printf(“\n=============================”); printf(“\nSalario liquido = R$ %.2f ”, salLiquido); } E como ficaria o algoritmo anterior, caso queira inserir horas extras? Tente escrever o algoritmo, utilize o programa DEV C++. Outro exemplo de algoritmo sequencial: #include <stdio.h> main() { float litros, kms, vlrLitro, vlrKm, vlrTotal; printf(“Informe o valor do litro de combustivel:\n”); scanf(“%f ”, &vlrLitro); printf(“\nInforme a qtde de litros gastos:\n”); scanf(“%f ”, &litros); printf(“\nInforme os quilometros percorridos:\n”); scanf(“%f ”, &kms); vlrTotal = litros * vlrLitro; vlrKm = vlrTotal / kms; printf(“\n\nValor total gasto = R$ %.2f ”, vlrTotal); printf(“\nValor gasto / km = R$ %.2f ”, vlrKm); } 50WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Caso você queira incrementar o algoritmo para determinar o consumo médio de um automóvel, como você desenvolveria o algoritmo anterior? 5.2 Estrutura Condicional A estrutura de condicional é um tipo de estrutura que realiza uma ação dependendo da condição (ou seleção) verdadeira ou falsa. Usamos palavras em inglês para expressar uma estrutura condicional com if (SE) e else (SENÃO ou DO CONTRÁRIO). 5.3 Estrutura Condicional - Simples Basicamente a condicional simples executa um conjunto de instruções se a condição for verdadeira, caso seja falsa o bloco de instruções não será executado. Figura 12 - Fluxograma da estrutura condicional simples. Fonte: o autor. 51WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Exemplo de uma estrutura condicional simples: #include <stdio.h> #include <stdlib.h> main() { // Declarar variáveis int idade; // Pedir ao usuário para escrever sua idade printf(“Digite sua idade: “); scanf(“%d”, &idade); // Comparar com a idade mínima if (idade >= 18) { printf(“Ja pode ser preso!”); } } Você já deve ter percebido que na estrutura condicional existe um bloco de instruções para a condição, delimitados por (“{“ e “}”). if (idade >= 18) { printf(“Já pode ser preso!”); } Todavia se você digitar a idade <18, o programa deverá ser finalizado, pois não existe nenhum bloco de instrução quando não for verdadeiro. Para isso, você deve estruturar uma condicional composta como pode ver na subseção seguinte. Entretanto existe uma forma de você criar mais uma condição para abranger outro grupo que seja verdadeira, com a condição (idade < 18). De acordo com o algoritmo a seguir: #include <stdio.h> #include <stdlib.h> main() { // Declarar variáveis int idade; // Pedir ao usuário para escrever sua idade printf(“Digite sua idade: “); scanf(“%d”, &idade); // Comparar com a idade mínima if (idade >= 18) { printf(“Ja pode ser preso!”); } if (idade < 18) { printf(“nao pode ser preso!”); } } 52WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA 5.4 Estrutura Condicional - Composta A estrutura condicional composta executa o bloco de instrução de condição verdadeira como de uma condição falsa, de acordo com o fluxograma na Figura 13. Figura 13 - Fluxograma de uma estrutura condicional composta. Fonte: o autor. 53WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Exemplo de aplicação de uma estrutura composta. // Solicitar salário e o valor da prestação de um empréstimo pretendido. // Se prestação for maior que 20% do salário, imprimir: “Empréstimo não // pode ser concedido”. Senão, imprimir: “Empréstimo pode ser concedido”. #include <stdio.h> main(void) { float salario, prestacao, percentual; printf(“Informe o salario: R$ “); scanf(“%f ”, &salario); printf(“Informe o valor da prestacao: R$ “); scanf(“%f ”, &prestacao); percentual = (prestacao / salario) * 100; printf(“\nA prestacao corresponde a %.2f%% do salario.”, percentual); if (percentual > 20.0) printf(“\nEmprestimo nao pode ser concedido.”); else printf(“\nEmprestimo pode ser concedido.”); return 0; } Como no bloco If, else também é delimitado por (“{“ e “}”), porém não precisa colocar uma expressão como por exemplo: else (percentual <= 20.0). Vamos ver outra aplicação? 54WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA #include <stdio.h> #include <stdlib.h> int main (void) { float n1, n2, n3,n4, media; printf(“Informe a 1a. nota:\n”); scanf(“%f ”, &n1); printf(“\nInforme a 2a. nota:\n”); scanf(“%f ”, &n2); printf(“\nInforme a 3a. nota:\n”); scanf(“%f ”, &n3); printf(“\nInforme a 4a. nota:\n”); scanf(“%f ”, &n4); media = (n1 + n2 + n3 +n4) / 4; printf(“\nMedia final = %.2f ”, media); if (media >= 7.0) printf(“ (aluno aprovado).”); else printf(“ (aluno reprovado).\n”); } 55WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Se quisermos implementar o algoritmo para mostrar a recuperação, seria dessa forma: #include <stdio.h> #include <stdlib.h> int main (void) { float n1, n2, n3,n4, media; printf(“Informe a 1a. nota:\n”); scanf(“%f ”, &n1); printf(“\nInforme a 2a. nota:\n”); scanf(“%f ”, &n2); printf(“\nInforme a 3a. nota:\n”); scanf(“%f ”, &n3); printf(“\nInforme a 4a. nota:\n”); scanf(“%f ”, &n4); media = (n1 + n2 + n3 +n4) / 4; printf(“\nMedia final = %.2f ”, media); if (media >= 7.0) printf(“ (aluno aprovado).”); else if ((media >= 5.0) && (media < 7.0)) printf(“(aluno em recuperacao).”); else printf(“ (aluno reprovado).\n”); } Nesse caso, utilizamos o else if, um recurso interessante para realizar múltiplas condições, no entanto, precisa utilizar um operador lógico (&&), o significado desse operador é (E). Para você entender melhor: else if ((media >= 5.0) E (media < 7.0)) printf(“ (aluno em recuperacao).”); Isto significa que o aluno ficará de recuperação com média maior ou igual a cinco e média abaixo de 7,0. Vamos a outro exemplo de aplicação da condição composta com else if. 56WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA #include <stdio.h> int main(void) { int idade; printf(“Informe a idade da pessoa:\n”); scanf(“%d”, &idade); printf(“\n%d = “, idade); if (idade < 0) printf(“Erro: idade invalida !!!.”); else if ((idade >= 0) && (idade <= 21)) printf(“fase de crescimento”); else if ((idade >= 22) && (idade <= 70)) printf(“ja esta marmanjo”); else printf(“Idoso.”); } Notamos nesse algoritmo que podemos utilizar mais de uma vez a função else if. Estrutura Condicional Switch/case A estrutura condicional switch/case tem uma peculiaridade diferente das estruturas if, else e else if. Podemos entender o comando switch/case como uma construção de múltiplas possibilidades de seleção e decisão (Figura 14). Essa é uma forma para reduzir a complexidade de vários if ou else. Vejamos o exemplo de um algoritmo, escreva esse algoritmo no programa DEV C++. 57WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Figura 14 - Fluxograma switch. Fonte: o autor. 58WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA #include <stdio.h> int main (void) { int valor; printf (“Informe o valor:\n”); scanf (“%d”, &valor); switch ( valor ) { case 1 : printf (“Mercurio\n”); break; case 2 : printf (“Venus\n”); break; case 3 : printf (“Terra\n”); break; case 4 : printf (“Marte\n”); break; case 5 : printf (“Jupiter\n”); break; case 6 : printf (“Saturno\n”); break; case 7 : printf (“Urano\n”); break; case 8 : printf (“Netuno\n”); break; default : printf (“Valor invalido!\n”); } } 59WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Vimos no algoritmo anterior algumas funções que não conhecíamos como a break e default: break (quebrar)→ forçar a saída do switch/case. default (ausência)→ Se digitar qualquer número que não esteja em uma case, a opção default irá atuar. 60WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 2 ENSINO A DISTÂNCIA Existe a possibilidade de desenvolver o mesmo algoritmo utilizando as funções else if? A resposta é sim, entretanto veja como ficou complexo nosso algoritmo a seguir: #include <stdio.h> int main (void ) { int valor; printf (“Digite um valor de 1 a 8: “); scanf(“%d”, &valor); if (valor == 1) printf (“Mercurio\n”); else if (valor == 2) printf (“Venus\n”); else if (valor == 3) printf (“Terra\n”); else if (valor == 4) printf (“Marte\n”); else if (valor == 5) printf (“Jupiter\n”); else if (valor == 6) printf (“Saturno\n”); else if (valor == 7) printf (“Urano\n”); else if (valor == 8) printf (“Netuno\n”); else printf (“Valor invalido!\n”); } Por fim, segue o link para ter todos os programas comentados desta unidade: https://drive.google.com/open?id=142LIdt3PJkuasKilqCZF-HIW684TSCpL 6161WWW.UNINGA.BR U N I D A D E 03 SUMÁRIO DA UNIDADE INTRODUÇÃO ............................................................................................................................................................ 63 1. OPERADORES DE ATRIBUIÇÃO ........................................................................................................................... 64 2. ESTRUTURAS DE REPETIÇÃO ............................................................................................................................ 66 2.1 REPETIÇÃO COM TERMINAÇÃO FORÇADA...................................................................................................... 67 2.2 ESTRUTURA DE REPETIÇÃO COM PÓS CONDIÇÃO ....................................................................................... 68 2.3 ESTRUTURA DE REPETIÇÃO CONTADA........................................................................................................... 70 2.4 DESENVOLVIMENTO DE UM ALGORITMO QUE GERE UMA SEQUÊNCIA DE FIBONACCI ..........................71 2.5 VETORES EM C .................................................................................................................................................. 72 3. APLICAÇÃO ........................................................................................................................................................... 75 4. VETORES MULTIDIMENSIONAIS ...................................................................................................................... 76 ESTRUTURA DE PROGRAMAÇÃO: REPETIÇÃO VETORES, MATRIZES E TIPOS DE PASSAGEM DE PARÂMETROS PROF. ME. RAFAEL BARBOSA ENSINO A DISTÂNCIA DISCIPLINA: ALGORITMOS E PROGRAMAÇÃO APLICADA 62WWW.UNINGA.BR 4.1 MATRIZES OU VETORES MULTIDIMENSIONAIS ............................................................................................ 80 5. TIPOS DE PASSAGEM DE PARÂMETROS ...........................................................................................................83 5.1 PONTEIROS ......................................................................................................................................................... 85 5.2 PASSAGEM DE FUNÇÃO .................................................................................................................................... 85 6. APLICAÇÃO ........................................................................................................................................................... 86 63WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA INTRODUÇÃO No capítulo anterior, aprendemos sobre estruturas de sequência e seleção. Sabemos que a estrutura de seleção nos permite especificar como o computador reagirá a determinados inputs. No entanto ainda há uma limitação no que podemos fazer na programação. Por exemplo, e se quisermos exibir números de 1 a 100? Claro que podemos fazer cem linhas de printf (), mas e se queremos repetir mil vezes? Teríamos que escrever dez mil declarações para alcançá- lo e é possível fazê-lo, mas não é uma conveniência e levaria muito tempo para ser concluída. Assim, a capacidade de especificar a repetição de instruções compostas é muito importante na programação. A repetição da execução de instruções é chamada loop. Looping em um programa é o processo de execução de série de instruções repetidamente em um determinado número de vezes. Iremos explorar alguns recursos interessantes da linguagem C a seguir. 64WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA 1. OPERADORES DE ATRIBUIÇÃO Existem muitos operadores de atribuição diferentes em C, o “=” não é o único operador de atribuição, os seguintes também estão disponíveis, na tabela 1. Tabela 1 - Operadores Aritméticos de Atribuição. Fonte: Freire (2015). Um tipo de acumulador é uma variável que acumula os valores, quando iniciado o programa (1 em 1). Vamos entender melhor essa função quando estudarmos estrutura de repetição. Já os contadores são um tipo de acumulador que aumenta ou diminuio valor. Veja como é feita a operação na tabela 2 a seguir. Operação Fluxograma Programa em C Incremento C ← C +1 C++ Decremento C ← C - 1 C-- Tabela 2 - Operadores de Incrementos e Decrementos. Fonte: o autor. Os operadores “auto-incremento” e “auto-decremento”, ++ e -- quando usando em uma expressão, depende se eles vêm antes ou depois da variável, de acordo com a tabela 2, depois veja o exemplo 1. De acordo com Pereira (2010), na forma prefixa, o valor da variável é modificado e depois usado; na forma posfixa, o valor da variável é usado e depois modificado. Assim por exemplo, se c vale 3, a operação d = ++c armazena 4 em d; enquanto a operação d = c++ armazena 3 em d. Mesmo assim ambos os casos, o valor final de c é 4. 65WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA Exemplo 1 - Diferença entre incremento e decremento: #include <stdio.h> int main( ) { int a=1, b=1; printf(“Valor inicial de a = %d\n”, a); printf(“Valor inicial de b = %d\n”, b); printf(“\nIncrementando: a++\n”); a++; printf(“Decrementando: b--\n”); b--; printf(“\nAgora a = %d\n”, a); printf(“Agora b = %d\n”,b); } Exemplo 2 - Diferença entre incremento prefixo e pósfixo #include <stdio.h> int main() { int a, b=1; printf(“b = %d\n”,b); printf(“a = b++\n”); a = b++; printf(“\nAgora: \na = %d\n”,a); printf(“b = %d\n”,b); printf(“\na = ++b\n”); a = ++b; printf(“\nAgora: a = %d”,a); } 66WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA 2. ESTRUTURAS DE REPETIÇÃO Estrutura While While permite a repetição de um conjunto de instruções de execução caso uma determinada expressão (condição) seja verdadeira. Quando a condição se torna falsa, a repetição termina quando a primeira instrução após a estrutura de repetição é executada. Observe que, como a condição é avaliada antes do comando ser executado, se for falsa o comando dentro da repetição não vai ser executado. Exemplo de utilização do While: #include <stdio.h> int main( ){ int total = 0, num; while( total < 100) { printf( “Total = %d\n”, total ); printf( “Entre com um número: “ ); scanf( “%d”, &num ); total += num; } printf( “Final total = %d\n”, total ); } Exemplo prático da utilização do While: // Um investidor aplicou R$ 1000,00 com rendimento de 1% ao mês. Quantos meses serão necessários // para que o capital investido ultrapasse a R$ 2000,00. #include <stdio.h> int main() { float capital = 1000.00; int ctMes = 0; while (capital <= 2000.00) { capital = capital + (capital * (1 / 1000.00)); ctMes = ctMes + 1; } printf(“Em %d meses o capital investido será de R$ %.2f ”, ctMes, capital); } 67WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA Como seria o fluxograma de típico do While? Figura 1 – Fluxograma de While. Fonte: o autor. 2.1 Repetição com Terminação Forçada Podemos utilizar o comando break para forçar o término de qualquer repetição. Pode ser útil em algumas aplicações, nem tanto em linguagem C, mas em outras linguagens sua aplicação é interessante. Veremos a seguir uma aplicação em C. 68WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA #include <stdio.h> int main () { int a = 10; while( a < 20 ) { printf(“valor: %d\n”, a); a++; if( a > 15) { break; } } return 0; } 2.2 Estrutura de repetição com pós condição Segundo Pereira (2010), a estrutura de repetição com pós condição serve para executar um comando, repetidamente, até que uma determinada condição se torne falsa. Isso é interessante em aplicações que garantam consistência de entrada de dados, além de implementar processos orientados por menus. Veja um exemplo de aplicação: 69WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA #include <stdio.h> int main () { int i; do { printf (“\n\nEscolha um time:\n\n”); printf (“\t(1)...Corinthians\n”); printf (“\t(2)...Palmeiras\n”); printf (“\t(3)...Internacional\n\n”); scanf(“%d”, &i); } while ((i<1)||(i>3)); switch (i) { case 1: printf (“\t\tMelhor time\n”); break; case 2: printf (“\t\ttime não é bom\n”); break; case 3: printf (“\t\ttime está na segunda divisao\n”); break; } return(0); } Como seria o fluxograma de uma estrutura de repetição com pós condição? 70WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA Figura 2 – Fluxograma de estrutura de repetição com pós condição. Fonte: o autor. 2.3 Estrutura de Repetição Contada Uma estrutura de repetição contada, segundo Damas (2008), serve para repetir a execução de um comando por um determinado número de vezes, para saber quando o total de repetições desejadas já foi atingido, ou seja, um for sempre está acompanhado de uma variável contadora que armazena quantas vezes o bloco de sentenças deve ser executado. Um exemplo da tabuada: 71WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA #include <stdio.h> int main(void) { int a, b; for (a = 1; a <= 10; a = a + 1) { for (b = 1; b <= 10; b = b + 1) printf(“%2d x %2d = %3d\n”, b, a, a * b); printf(“\n”); } Return 0; } Aplicação prática: A sequência de Fibonacci é uma série de números na qual um número é encontrado por somar os dois números antes dele. Começando com 0 e 1, a sequência passa a 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 e assim por diante. Escrito como regra, a expressão é xn = xn-1 + xn-2. 2.4 Desenvolvimento de um algoritmo que gere uma sequência de Fibonacci Figura 3 - Sequência de Fibonacci. Fonte: Domínio Público (2017). Um vídeo ilustrativo mostrando a sequência de Fibonacci. Acesse: <https://www.youtube.com/watch?v=2VuS8JOkr7s>. 72WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA #include <stdio.h> void main( ) { printf(“Série de Fibonacci\n”); printf(“==================\n”); int termo1 = 1, termo2 = 1, novoTermo; printf(“ 1o. termo = %d\n”, termo1); printf(“ 2o. termo = %d\n”, termo2); for (int i=3; i<=20; i++) { novoTermo = termo1 + termo2; printf(“%2do. termo = %d\n”, i, novoTermo); termo1 = termo2; termo2 = novoTermo; } printf(“==================\n”); } 2.5 Vetores em C De acordo com Pereira (2010), um vetor é um tipo de variável capaz de armazenar uma coleção de dados ao mesmo tempo. Ou seja, cada um dos dados armazenados num vetor é identificado por um número inteiro, por vezes denominado como índice. Para indicar uma variável do tipo vetor basta declará-la com o sufixo [n], n pode ser qualquer número inteiro positivo. Exemplo de aplicação de um vetor, para ler um conjunto de elementos 10 pessoas e determinar quantas pessoas são maiores de 18 anos: 73WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 3 ENSINO A DISTÂNCIA #include <stdio.h> int main (void) { int n = 10; // tamanho do vetor int idade[n]; // declarando o vetor para armazenar as idades de um grupo de “n” pessoas int i, ct18; // indice (ou posicao) e contador de pessoas com mais de 18 anos for (i=0; i<n; i++) { printf(“Informe a idade da %2da. pessoa de %d: “, (i+1), n); scanf(“%d”, &idade[i]); } ct18 = 0; for (i=0; i<n; i++) { // contando as idades superiores a 18 anos if (idade[i] > 18) ct18 = ct18 + 1; } printf(“\nQuantidade de pessoas com idade superior a 18 anos = %d.”, ct18); } A lógica desse programa é bem simples, o intuito é ler os números e guardar em posições dentro do vetor. Um vetor
Compartilhar