Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORITMOS E PROGRAMAÇÃO APLICADA PROF. FÁBIO ATAIDE DE LIMA PROFA MA. CLAUDIA HEIDEMANN DE SANTANA Reitor: Prof. Me. Ricardo Benedito de Oliveira Pró-Reitoria Acadêmica Maria Albertina Ferreira do Nascimento Diretoria EAD: Prof.a Dra. Gisele Caroline Novakowski PRODUÇÃO DE MATERIAIS Diagramação: Edson Dias Vieira Thiago Bruno Peraro Revisão Textual: Fernando Sachetti Bomfim Marta Yumi Ando Simone Barbosa Produção Audiovisual: Adriano Vieira Marques Márcio Alexandre Júnior Lara Osmar da Conceição Calisto Gestão de Produção: Cristiane Alves © 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 INTRODUTÓRIA U N I D A D E SUMÁRIO DA UNIDADE INTRODUÇÃO ................................................................................................................................................................4 1 ORGANIZAÇÃO BÁSICA DE UM SISTEMA COMPUTACIONAL ..............................................................................5 1.1 EVOLUÇÃO DOS SISTEMAS COMPUTACIONAIS .................................................................................................5 1.2 COMPONENTES DE UM SISTEMA COMPUTACIONAL ....................................................................................... 7 1.2.1 HARDWARE .......................................................................................................................................................... 7 1.2.2 SOFTWARE ...........................................................................................................................................................9 1.3 SISTEMAS DE NUMERAÇÃO UTILIZADOS NOS SISTEMAS COMPUTACIONAIS ............................................ 11 1.3.1 SISTEMA DECIMAL ............................................................................................................................................. 12 1.3.2 SISTEMA BINÁRIO ............................................................................................................................................. 13 1.3.3 SISTEMAS OCTAL E HEXADECIMAL ................................................................................................................ 13 CONSIDERAÇÕES FINAIS ........................................................................................................................................... 15 ORGANIZAÇÃO BÁSICA DE UM SISTEMA COMPUTACIONAL PROFA MA. CLAUDIA HEIDEMANN DE SANTANA ENSINO A DISTÂNCIA DISCIPLINA: ALGORITMOS E PROGRAMAÇÃO APLICADA 4WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA INTRODUÇÃO Você está pronto(a) para iniciar seus estudos introdutórios sobre Algoritmos e Programação Aplicada? Especificamente nesta unidade introdutória, vamos trabalhar sobre a organização básica de um sistema computacional. Pronto(a) para o início da aprendizagem? Caro(a) aluno(a), esta unidade procura explicar algumas definições, conceitos e curiosidades sobre os Sistemas Computacionais e seus principais componentes. Você também aprenderá a categorizar as principais partes de um computador e as diferenças entre elas. Ao final desta unidade, você deve apresentar os seguintes aprendizados: • Reconhecer processamento de dados e sistemas de computação; • Identificar a evolução dos computadores; • Descrever a diferença entre hardware e software; • Conhecer sobre os Sistemas de Numeração utilizados nos sistemas digitais. Em um mundo cada vez mais digital, é necessário conhecer os termos básicos relacionados à informática. Seja qual for a sua área, a tecnologia e os sistemas digitais estão cada vez mais presentes no nosso dia a dia, no celular, na TV, no carro, no ar-condicionado e até mesmo no seu grill. 5WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA 1 ORGANIZAÇÃO BÁSICA DE UM SISTEMA COMPUTACIONAL “O software tornou-se o elemento-chave da evolução e produtos baseados em computador” (PRESSMAN, 1995). Um Sistema Computacional é um tipo especializado de sistema, que tem como finalidade processar e armazenar informações. O que torna os sistemas computacionais tão essenciais hoje? O que você está fazendo agora? Utilizando o computador, não é verdade? Mas o que está por trás deste monitor? O que torna possível você acessar este curso? No computador, existem componentes envolvidos no processo, vale dizer, o sistema computacional. Esse sistema possui dois componentes principais: o Software e o Hardware. Um sistema computacional refere-se ao conjunto de dispositivos eletrônicos (hardware) que processam informações através de um programa (software). Ele é uma combinação de hardware, software e inteligência humana. Vou explicar melhor os componentes de um Sistema Computacional: Hardware: é o equipamento físico, computadores e periféricos. Juntos, processam dados e informações e permitem sua visualização. Software: consiste nas instruções, conjunto de programas que permitem que o hardware processe os dados. São divididos em duas principais categorias: Sistema Operacional - controla e coordena o uso do hardware entre os vários programas de aplicação de vários usuários; e Programas de Aplicação - definem como os recursos do sistema serão utilizados pelos usuários (gerenciadores de bancos de dados, antivírus, editores de texto, planilhas eletrônicas etc.). Veremos mais adiante, com mais detalhes, sobre software e seus diferentes tipos. Para completar este sistema, temos ainda os usuários, que são os indivíduos que trabalham com o sistema ou utilizam a sua saída. São usuários e operadores de hardware e software. Assim, já temos os elementos para um sistema computacional, mas, no caso da pergunta inicial, que envolvia como você está tendo acesso a este curso, temos ainda: - Tecnologia de redes: sistema de ligação, que permite o compartilhamento de recursos entre computadores. - Tecnologia de dados: softwares e hardwares que comandam a organização dos dados em meios físicos de armazenagem. 1.1 Evolução dos Sistemas Computacionais Os sistemas computacionais evoluíram com o passar do tempo (assim como a tecnologia), passando da operacionalização das tarefas rotineiras à integração entre os diferentes sistemas, com recursos e usos diferenciados. Dos primeiros computadores à Internet: nesse vídeo, você verá sobre a evolução dos computadores, sua utilização, primeiros games, interfaces, surgimento da Internet no mundo e primeiras experiências no Brasil. Acesse-o em https://www.youtube.com/watch?v=Sx1Z_ MGwDS8&t=28s. https://www.youtube.com/watch?v=Sx1Z_MGwDS8&t=28s https://www.youtube.com/watch?v=Sx1Z_MGwDS8&t=28s 6WWW.UNINGA.BR AL GO RI TM OSE P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA Cronologicamente, a evolução dos sistemas computacionais se deu em cinco gerações, que são: computadores à válvula, computadores a transistor, circuitos integrados, circuitos VLSI e tecnologia ULSI (Ultra Large Scale Integration). O primeiro computador, segundo pesquisas, foi desenvolvido pelo engenheiro mecânico Charles Babbage, que inventou o primeiro equipamento considerado um computador mecânico, ainda no século XIX. Já na década de 1940, os computadores de uso geral, que usavam algoritmos simples para perfurar cartões, substituíram os computadores mecânicos, sendo o ENIAC (Electronic Numerical Integrator and Computer) o primeiro computador digital eletrônico programável e principal representante dessa primeira geração. Da segunda geração, marcada pelos transistores (e com eles a possibilidade de comercialização do computador), podemos destacar o UNIVAC ERA 1101, que foi o primeiro programa de computador armazenado nos EUA. Os transistores eram também mais rápidos que as válvulas e, portanto, eles também contribuíram para aumentar a velocidade computacional. Figura 1 - UNIVAC/ERA 1101: primeiro computador da história que rodava um programa da memória. Fonte: Dibble (2021). Portanto, os computadores da era dos transistores (ou da segunda geração) eram não só mais pequenos, mas também mais rápidos que os das válvulas eletrônicas. Com a terceira geração (no início da década de 1960, surgimento dos circuitos integrados (CHIP)), viu-se a diminuição do tamanho, maior capacidade de processamento e início da utilização dos computadores pessoais. Surgiram os softwares integrados, como processadores de texto, planilhas eletrônicas e outros. Figura 2 - Intel 8008, 1972 - primeiro microprocessador de 8 bits. Fonte: Wikiwand (2021). 7WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA Já a quarta geração, iniciada nos anos 1970, ficou conhecida pela grande massa de microcomputadores pessoais, com circuitos integrados VLSI – Very Large Scale Integration – e integração em escala muito alta. Em 1977, houve uma explosão no mercado de microcomputadores, sendo fabricados em escala comercial, e, a partir daí, a evolução foi sendo cada vez maior, até chegar aos micros atuais, os microprocessadores de ULSI (Ultra Large Scale of Integration), utilizados a partir de 1980. Nessa geração, começa a utilização das linguagens de altíssimo nível, orientadas para um problema. A quinta geração é baseada em hardware de processamento paralelo (que é uma forma de computação em que vários cálculos são realizados ao mesmo tempo) e na IA (Inteligência Artificial) do software. A inteligência artificial é um “novo” ramo da ciência da computação, que interpreta meios e métodos de fazer computadores pensar como seres humanos. Todas as linguagens de alto nível, robótica, desenvolvimento de sistemas especialistas e a era online, comunicação através da Internet, fazem parte desta geração. Figura 3 - Exemplo de um computador de quinta geração. Fonte: Gerações de Computadores (2021). Assim, vimos como os computadores vêm evoluindo e acompanhando os avanços nos campos da matemática, engenharia e eletrônica. Os computadores passaram por muitas mudanças e foram continuamente aprimorados ao longo do tempo. Continuam seguindo a tendência de miniaturização de seus componentes, tornando-se cada vez mais práticos para as tarefas diárias. 1.2 Componentes de um Sistema Computacional Um sistema de computação é composto por três (3) componentes principais: hardware, software e peopleware. O peopleware são todos os usuários, as pessoas que, de alguma forma, trabalham e/ou interagem com o computador, como digitadores, programadores, analistas ou simplesmente usuários finais. Veremos agora, mais detalhadamente, os componentes de hardware e software. 1.2.1 Hardware A parte física de um sistema computacional é o que chamamos de hardware. São todos os componentes de entrada e saída, componentes eletrônicos, circuitos integrados e placas. O “hardware” não se refere apenas aos computadores pessoais, mas também aos equipamentos embarcados em produtos que precisam de processamento computacional, como os dispositivos encontrados em equipamentos como micro-ondas, automóveis, máquinas, aparelho celular e outros. 8WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA Para esta disciplina, é interessante entender que os componentes de hardware são divididos em sistema central (composto pela CPU - Unidade Central de Processamento (ou processador) -, Memória Principal e as suas interconexões) e os periféricos (que podem ser de Entrada, Saída e/ou Armazenamento e as suas interconexões). De acordo com a arquitetura de von Neumann, a CPU (do inglês Central Processing Unit), que é Unidade Central de Processamento, armazena informações, controla as operações aritméticas e lógicas e efetua o processamento de entradas e saídas. Figura 4 - Tráfego das informações na CPU. Fonte: Adaptado de Manzano e Manzano (2009). A memória principal (ou memória primária) tem por finalidade o armazenamento de instruções e dados de programas que serão e/ou estão sendo executados pela CPU. É considerada como uma memória de trabalho, sendo organizada em células com tamanho fixo e igual, cada uma identificada por um número denominado endereço. A memória principal pode ser acessada por meio de duas operações: leitura (ler da memória significa requisitar à memória principal o conteúdo de uma determinada célula) e escrita (escrever na memória significa escrever uma informação em uma célula da MP). É classificada em dois grupos: - RAM (do inglês Random Access Memory – Memória de Acesso Aleatório) dinâmica ou estática - esta memória volátil retém as instruções e dados de programas que estão sendo executados, tornando o tempo de leitura e escrita bastante rápido. - ROM (do inglês Read Only Memory – Memória Somente de Leitura) - as informações são gravadas no momento da fabricação e não mais são alteradas. Contém basicamente informações necessárias para o funcionamento do computador, como rotinas que verificam se os meios físicos (hardware) estão aptos para o funcionamento. Outras versões de ROMs são PROM, EPROM, EEPROM ou EAPROM e memória flash. A memória cache é uma memória (RAM estática) volátil de alta velocidade, localizada entre a CPU e a memória principal, usada com a finalidade de acelerar o processamento, funcionando como um buffer da memória. As memórias secundárias são um tipo de memória não volátil de grande capacidade de armazenamento, usadas para guardar informações (instruções e dados de programas) que não são perdidas quando o computador for desligado. Como exemplos, podemos citar: disco rígido (HD) e mídias removíveis, como o CD-ROM, o DVD e o pendrive. 9WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA - Dispositivos de Entrada e Saída de Dados: No sistema computacional, todos os dispositivos que realizam as funções de receber e/ ou enviar as informações do usuário são considerados dispositivos de entrada e saída de dados. Esses dispositivos externos são conectados em um computador e podem ser classificados em três categorias: 1. Os que transmitem/recebem informações inteligíveis para o ser humano - são adequados para estabelecimento de comunicação com o usuário. É o caso das impressoras, monitores de vídeo, plotters, multimídia etc. 2. Os que transmitem/recebem informações inteligíveis apenas para a máquina - são adequados para comunicação máquina a máquina ou internamente a uma máquina. É o caso dos teclados, mouses, scanners, discos magnéticos, fitas magnéticas, discos óticos, sensores e atuadores em aplicação robótica. 3. Os quetransmitem/recebem de/para outros dispositivos remotamente instalados, tais como os modems e regeneradores digitais. 1.2.2 Software Já sabemos que vamos agora entender brevemente como os softwares são feitos. As etapas para a execução de uma tarefa, elaboradas e executadas passo a passo, constituem o que se chama programa, ou também chamadas de software. Cada um dos passos mencionados é uma diferente instrução, ou ordem de comando, dada ao hardware com o objetivo de realização de uma determinada tarefa e/ou ação (por exemplo: uma operação aritmética, uma transferência de informação). O programa (software) é o conjunto dessas instruções. Córdova et al. (2018) nos dizem que o computador é uma máquina que resolve problemas por meio da execução de instruções que são passadas a ele. Essas instruções são chamadas de programas de computador. O programa é um conjunto de instruções lógicas e finitas (também chamado de algoritmo), que executam uma tarefa específica. Um programa de computador é a formalização de um algoritmo, em linguagem inteligível pelo computador. Figura 5 - Fases do processamento de um software. Fonte: A autora. Assim, o computador precisa entender cada instrução de modo a executar corretamente a operação que se pretende. O usuário entende Português, sua linguagem de comunicação com outras pessoas. Os computadores têm uma linguagem própria, a linguagem binária. Nela, os caracteres inteligíveis são apenas zero (0) e um (1), presença ou ausência de corrente elétrica. Todo dado coletado pelos computadores, as instruções por eles executadas, bem como os resultados de um processamento são sempre constituídos de conjuntos ordenados de zeros e uns. 10WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA Como o computador não entende nossa linguagem, ela deve ser compilada. Esse processo de compilação, em termos gerais, consiste em transformar uma linguagem em outra, neste caso, as nossas instruções para a linguagem binária (0 e 1), que é a linguagem que o computador compreende. Isso é feito por um tipo de software/sistema chamado Linguagem de Programação. Assim, podemos entender que o conceito de software refere-se a todos os elementos de programação de um sistema de computação, isto é, a todos os programas, sejam eles de softwares de aplicação sejam softwares básicos. a) Software básico: são os programas que definem o padrão do equipamento, sendo necessários para o seu funcionamento. Os tipos de software básico são: sistema operacional, linguagens de programação, tradutores e utilitários. b) Software aplicativos: são programas para as mais variadas finalidades e situações, são utilizados pelos usuários para realizar trabalhos rotineiros. Exemplos: editores de texto, calculadoras, aplicativos para ouvir músicas, aplicativos para contabilidade e de recursos humanos. Vamos dar destaque a dois tipos de softwares, importantes para o nosso domínio de conhecimento na disciplina de Algoritmos e Programação Aplicada. São eles: Sistema Operacional: segundo Manzano e Manzano (2009), o sistema operacional (SO) é responsável pelo gerenciamento, funcionamento e execução de todos os programas e todos os periféricos do sistema computacional. Sem o SO, o computador não tem “vida”, é um software que se encontra na categoria dos programas de sistema. Ele é o mais importante entre todos, pois representa o papel de tradutor e intérprete entre a máquina e o homem (e vice-versa) e gerencia todos os periféricos e softwares, pois trabalha juntamente com a CPU. Entre os sistemas operacionais, citem-se: Microsoft Windows; OS/2; Unix; Mac/OS. Figura 6 - Posicionamento de um Sistema Operacional num Sistema Computacional. Fonte: A autora. Linguagens de Programação: é um conjunto de símbolos (vocabulário) e regras (gramática) que especificam como transmitir informações entre usuários e computador. As linguagens de programação estão divididas em: linguagem de máquina, linguagem de baixo nível e linguagem de alto nível. 11WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA A linguagem de máquina é baseada em código binário, em 0s e 1s. É utilizada diretamente pelo computador. A linguagem de baixo nível é uma simplificação da linguagem de máquina. Faz uso de códigos mnemônicos para expressar as instruções. Exemplo: Assembly. A linguagem de alto nível utiliza a combinação de um conjunto de símbolos de acordo com certas regras de sintaxe para expressar uma sequência de operações de máquina. É uma linguagem que não exige conhecimento do código binário. Exemplo: C, JAVA, Python. 1.3 Sistemas de Numeração Utilizados nos Sistemas Computacionais A história da matemática conta sobre a necessidade de contar do ser humano desde que ele deixou de ser nômade. A necessidade de contagem foi impulsionada por atividades de agricultura e pastoreio, pela representação da quantidade de cabeças em um rebanho, fases da Lua e estações do ano para o plantio etc. Dessa forma, a representação numérica foi ganhando forma por meio dos algarismos. O sistema de numeração é um conjunto de regras para a representação dos números. O sistema numérico decimal é o mais utilizado pela humanidade. Acredita-se que o número de dedos que o homem tem nas mãos foi um fato decisivo, nos primórdios, para a criação e disseminação desse sistema. Um sistema de numeração é definido principalmente pela BASE, que indica a quantidade de símbolos e o valor de cada símbolo. Exemplos: Sistema Decimal (base 10): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; Sistema Binário (base 2): 0, 1; Sistema Octal (base 8): 0, 1, 2, 3, 4, 5, 6, 7, 8; e Sistema Hexadecimal (base 16): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Com o advento da eletrônica digital e, principalmente, do computador, surgem outras necessidades, como a de representar os números utilizando a eletricidade. Como você já sabe, um computador funciona movido à energia elétrica. A ausência ou presença de energia (0v ou +5v) é representada por 0’s e 1’s, ou seja, o Sistema Binário. O matemático indiano Pingala apresentou a primeira descrição conhecida de um sistema numérico binário no século III a.C., representando os números de 1 a 8 com a sequência (usando símbolos modernos) 000, 001, 010, 011, 100, 101,110 e 111. Nesse contexto computacional, o computador opera valores utilizando a lógica binária que trabalha com o sistema binário que contém somente dois algarismos: 0 e 1. Para simplificar a codificação de instruções em nível de máquina, são utilizadas conversões para outros tipos de sistemas de numeração a fim de tornar a definição das instruções mais inteligível ao ser humano. Veja uma linha do tempo da história do software e das linguagens de programação. Acesse: https://www.computerhistory.org/timeline/ software-languages/. https://www.computerhistory.org/timeline/software-languages/ https://www.computerhistory.org/timeline/software-languages/ 12WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA Figura 7 - Representação dos dados. Fonte: A autora. Por fim, como a representação de números binários de alto valor torna os dígitos quase ilegíveis para nós, é comum utilizar o sistema hexadecimal para abreviá-los, pois cada dígito hexadecimal guarda 4 dígitos binários. A seguir, vamos detalhar alguns sistemas numéricos presentes na nossa vivência com os sistemas computacionais. 1.3.1 Sistema decimal É o nosso sistema mais familiar. Sua base numérica é de dez, ou seja, a quantidade de símbolos é 10. De zero a nove, utilizam-se dez algarismos diferentes para representar todos os números - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. É um sistema posicional, ou seja, a posição do algarismo no número modifica o seu valor. Ou seja, cada número em uma sequência de algarismos tem valor diferente, dependendode sua posição. Veja um exemplo: no número decimal 777, cada cinco tem um valor diferente. O primeiro vale sete centenas (700); o segundo, sete dezenas (70); e o terceiro, sete unidades (7). O valor final é fornecido por 777 = 700 + 70 + 7 = 7 * 102 + 7 * 101 + 7 * 100. Os pesos das posições são potências de dez, no caso do sistema decimal. Veremos em seguida os sistemas binário, octal e hexadecimal, que também são sistemas posicionais, mas, no sistema binário são potências de dois, no octal são potências de oito e no sistema hexadecimal são potências de 16. Você sabe o que é Código ASCII? O Código ASCII - American Standard Code for Information Interchange (Código Padrão Americano para o Intercâmbio de Informação) - é baseado no alfabeto romano, e sua função é padronizar a forma como os computadores representam letras, números, acentos, sinais diversos e alguns códigos de controle. Foi proposto por Robert W. Bemer, visando a padronizar os códigos. Assim, foi possível que computadores de diferentes fabricantes conseguissem entender os códigos. Ele é um padrão de codificação de letras e símbolos bastante antigo e usado até hoje. 13WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA 1.3.2 Sistema binário Representação binária ou de base 2, este sistema usa apenas dois símbolos básicos: o 0 e o 1. É um sistema de numeração posicional em que todas as quantidades se representam com base nos algarismos zero e um. Da mesma forma que no sistema decimal discutido antes, cada dígito pode ser representado pela sua potência ou peso. Palavras binárias com certas quantidades de dígitos podem adquirir nomes especiais, por exemplo, um dígito binário é chamado de BIT, proveniente das palavras inglesas BInary digiT. O bit, do inglês BInary digiT, é um símbolo ou elemento que pode representar dois estados possíveis, como uma luz que está ligada (1) ou desligada (0). Em computadores, o valor 0 é usualmente associado a alguma voltagem baixa, e o valor 1, a uma voltagem mais alta. No momento atual, um grande número de tecnologias tem convergido para o uso da representação binária, usando diferentes meios para a representação física do bit. 1.3.3 Sistemas octal e hexadecimal Até o momento, foi discutido que os computadores digitais usam o sistema de numeração binária (base 2) por sua facilidade em associar seus dois possíveis valores, 0 e 1, a fenômenos físicos que ocorrem internamente no computador. Outros sistemas numéricos utilizados na computação são os sistemas de numeração octal e hexadecimal, que compactam significativamente a representação de números binários, ou seja, a principal utilização para números hexadecimal e octal em computação é abreviar longas representações binárias. A Tabela 1 representa números binários longos e como eles podem ser expressos brevemente em sistemas de numeração com bases mais altas. Tabela 1 - Equivalentes decimais, binários, octais e hexadecimais. Número Decimal Representação Binária Representação Octal Representação Hexadecimal 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 16 100000 20 10 Fonte: A autora. 14WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA Um relacionamento importante que os sistemas de numeração octal (como o hexadecimal) têm com o binário é que as bases octal e hexadecimal são potências da base do sistema de numeração binário. Considere o número binário de 12 algarismos 100011010001. Para ver como o número binário é facilmente convertido em octal, divida o número binário de 12 dígitos em grupos de três bits consecutivos cada e escreva esses grupos sobre os dígitos correspondentes do número octal como a seguir, de acordo com o seu correspondente na Tabela 1. Binário 100 011 010 001 Otal 4 3 2 1 O mesmo tipo de relacionamento pode ser observado ao se converter de binário para hexadecimal. Divida o número binário de 12 algarismos em grupos de quatro bits consecutivos cada e escreva esses grupos sobre os dígitos correspondentes do número hexadecimal como a seguir: Binário 1000 1101 0001 Hexa 8 D 1 O sistema hexadecimal está vinculado aos sistemas computacionais, pois os computadores costumam utilizar o byte como unidade básica da memória, 1 byte = 8 bits e, então, um byte pode ser representado por 8 algarismos do sistema binário ou por 2 algarismos do sistema hexadecimal. Por exemplo: 1110 0110 [binário] = E6 [hexadecimal]. Para mais informações sobre os sistemas de numeração e suas conversões, ler o capítulo 4 do livro: CARVALHO, A. C. P. L. F.; LORENA, A. C. Introdução à Computação - Hardware, Software e Dados. LTC, 2016. O material está disponível em: https://integrada.minhabiblioteca.com.br/#/books/9788521633167/. https://integrada.minhabiblioteca.com.br/#/books/9788521633167/ 15WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE IN TR OD UT ÓR IA EDUCAÇÃO A DISTÂNCIA CONSIDERAÇÕES FINAIS Assim, finalizamos nossa unidade introdutória sobre sistemas computacionais, este tema tão importante quanto a como são organizados estes sistemas, para que você consiga aprofundar seus estudos sobre algoritmos e a programação propriamente dita, produzindo seus códigos e comandos (software) para o hardware executar as operações que você necessita automatizar. Esta é uma das intenções desta unidade introdutória: chamar a atenção para assuntos que vão além do “para que isto me servirá?”, que domina o senso-comum. Esta unidade de estudo trouxe a essência e os fundamentos dos sistemas computacionais. 1616WWW.UNINGA.BR U N I D A D E 01 SUMÁRIO DA UNIDADE INTRODUÇÃO ............................................................................................................................................................... 18 1 ALGORITMOS ............................................................................................................................................................ 19 1.1 DESCRIÇÃO NARRATIVA .......................................................................................................................................20 1.2 FLUXOGRAMA ........................................................................................................................................................ 21 1.3 PSEUDOCÓDIGO ....................................................................................................................................................22 2 PROGRAMAS E LINGUAGENS DE PROGRAMAÇÃO..............................................................................................23 2.1 COMPILADORES ....................................................................................................................................................24 2.2 INTERPRETADORES .............................................................................................................................................25 2.3 LINGUAGENS DE PROGRAMAÇÃO ......................................................................................................................25 2.4 LINGUAGEM C .......................................................................................................................................................26 3 TIPOS DE DADOS ..................................................................................................................................................... 31 3.1 TIPOS DE DADOS BÁSICOS .................................................................................................................................. 31 ALGORITMOS E ELEMENTOS BÁSICOS DE PROGRAMAÇÃO PROF. FÁBIO ATAIDE DE LIMA ENSINO A DISTÂNCIA DISCIPLINA: ALGORITMOSE PROGRAMAÇÃO APLICADA 17WWW.UNINGA.BR EDUCAÇÃO A DISTÂNCIA 3.2 ENUMERADORES ..................................................................................................................................................33 3.3 PONTEIROS ...........................................................................................................................................................33 4 CONSTANTES E VARIÁVEIS ....................................................................................................................................34 4.1 CONSTANTES .........................................................................................................................................................34 4.1.1 CONSTANTES LITERAIS .....................................................................................................................................35 4.1.2 CONSTANTES MANIFESTAS .............................................................................................................................35 4.2 VARIÁVEIS .............................................................................................................................................................36 5 EXPRESSÕES E OPERADORES ...............................................................................................................................37 5.1 EXPRESSÕES ARITMÉTICAS ...............................................................................................................................37 5.2 EXPRESSÕES RELACIONAIS ...............................................................................................................................38 5.3 EXPRESSÕES LÓGICAS ........................................................................................................................................39 5.4 PRECEDÊNCIA DE OPERADORES .......................................................................................................................40 5.5 CONVERSÕES DE TIPOS ...................................................................................................................................... 41 6 ENTRADA E SAÍDA DE DADOS ................................................................................................................................42 6.1 ENTRADA DE DADOS .............................................................................................................................................43 6.2 SAÍDA DE DADOS ..................................................................................................................................................46 CONSIDERAÇÕES FINAIS ...........................................................................................................................................50 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 EDUCAÇÃO A DISTÂNCIA INTRODUÇÃO Caro(a) aluno(a), seja bem-vindo(a) à disciplina de Algoritmos e Programação Aplicada. Nesta disciplina, serão apresentados os princípios básicos de lógica de programação e os principais comandos necessários para o desenvolvimento de algoritmos. A lógica está relacionada ao processo de raciocínio, à capacidade de ordenar os pensamentos e à busca de soluções através de ideias coerentes. Por exemplo, para pegar uma caneta que está dentro de uma caixa, deve-se primeiro abrir a caixa para depois pegar a caneta; não é possível atravessar a caixa sem abri-la. A utilização da lógica é fundamental para a criação de algoritmos, primeiro assunto abordado nesta unidade, onde descrevemos a sua definição e as suas formas de representação. Em seguida, é abordado o conceito de programa, seus componentes básicos e o fluxo de transformação de um código escrito a um programa executável. Prosseguimos abordando as linguagens de programação, ferramenta utilizada na codificação de programas, e introduzimos o aluno à linguagem C, adotada neste livro para o aprendizado da lógica de programação. Em seguida, já com base na linguagem C, apresentamos os tipos de dados existentes, a definição de constantes e variáveis, esta última um recurso importante para o armazenamento e a recuperação de informações da memória RAM. Prosseguimos abordando os tipos de operadores e as expressões que podem ser formadas para cálculos e processamentos diversos. Concluímos a unidade descrevendo os processos de como o usuário informa dados ao programa, e como o programa retorna esses dados em forma de resultados para o usuário. 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 EDUCAÇÃO A DISTÂNCIA 1 ALGORITMOS Segundo Manzano e Oliveira (2012), a palavra algoritmo pode ser empregada na matemática e na ciência da computação: O termo algoritmo, do ponto de vista computacional, pode ser entendido como regras formais, sequenciais e bem definidas a partir do entendimento lógico de um problema a ser resolvido por um programador com o objetivo de transformá-lo em um programa que seja possível de ser tratado e executado por um computador, em que dados de entrada são transformados em dados de saída (MANZANO; OLIVEIRA, 2012, p. 28). De acordo com o problema a ser resolvido, são vários os caminhos que podem ser utilizados para encontrar a sua solução. O algoritmo é um conjunto de passos que define um desses caminhos. Cada passo é chamado de instrução; assim, um algoritmo pode também ser definido como um conjunto de instruções (LOPES; GARCIA, 2002). O Quadro 1 a seguir apresenta dois exemplos de algoritmos para ir ao trabalho, desde o momento em que o indivíduo acorda até a chegada ao escritório. 1. Desligar o despertador 2. Ir para o banheiro 3. Lavar o rosto 4. Escovar os dentes 5. Tirar o pijama 6. Colocar uma roupa 7. Tomar café da manhã 8. Pegar o carro 9. Estacionar o carro 10. Entrar no escritório 1. Desligar o despertador 2. Ir para o banheiro 3. Escovar os dentes 4. Tomar banho 5. Colocar uma roupa 6. Se estiver chovendo, pegar guarda-chuva 7. Pegar ônibus 8. Descer do ônibus 9. Entrar no escritório Quadro 1 – Algoritmos de ida ao trabalho. Fonte: O autor. Os dois algoritmos do Quadro 1 resolvem o problema de “ida ao trabalho” de formas diferentes. Cada linha numerada representa uma instrução a ser executada e pode ser detalhada se necessário. Por exemplo, a instrução “escovar os dentes” poderia ser subdividida nos seguintes passos: • Pegar a pasta e a escova de dentes; • Aplicar a pasta de dentes na escova; • Molhar a escova com um pouco de água; • Escovar os dentes; • Enxaguar a boca; • Guardar a pasta e a escova de dentes. Qualquer outra instrução poderia ser igualmente detalhada, estruturando o algoritmo de forma lógica e organizada. Como a essência do algoritmo está em resolver um determinado problema em passos, podemos dizer que conhecemos diversos algoritmos de forma empírica, já que na realidade lidamos com vários tipos de “problemas” cotidianos que demandam uma solução. 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 EDUCAÇÃO A DISTÂNCIA Apesar de a lógica de programação ser considerada por alguns como um “dom” que já nasce com o afortunado, qualquer pessoa pode desenvolver sua própria lógica, por meio de muita prática e exercício. É como aprender a dirigir: a pessoa recebe os ensinamentos teóricos e práticos, mas somente com a experiência contínua de dirigir nas ruas é que ela irá adquirir prática e experiência. E nessa jornada de aprendizado, por quanto mais situações complexas e difíceis passamos, mais maduros e experientes ficamos. É normal que o aspirante a programador venha a se deparar com muitos erros e falhas durante o desenvolvimento de seus algoritmos (programas), mas são exatamente esses obstáculos que formarão uma lógica de programação robusta e consistente nele. De acordo com Ascencio e Campos (2012), existem três formas de representação de algoritmos:descrição narrativa, fluxograma e pseudocódigo. Detalhamos cada um desses tipos nas seções seguintes. 1.1 Descrição Narrativa A descrição narrativa consiste em escrever as instruções na linguagem natural, em sequência (ASCENCIO; CAMPOS, 2012). O Quadro 2 a seguir ilustra um algoritmo para somar dois números em descrição narrativa. 1. Obter dois números 2. Somar os dois números 3. Mostrar o resultado da soma Quadro 2 – Algoritmo no formato de descrição narrativa. Fonte: O autor. Segundo Ascencio e Campos (2012), a descrição narrativa possui a vantagem de ser de fácil aprendizado, uma vez que as instruções são escritas na língua natural. Por outro lado, como desvantagem ela é ambígua, ou seja, pode gerar diversas interpretações e isso dificulta a conversão do algoritmo em um programa. 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 EDUCAÇÃO A DISTÂNCIA 1.2 Fluxograma O fluxograma consiste em escrever as instruções do algoritmo utilizando os símbolos gráficos descritos no Quadro 3 a seguir (ASCENCIO; CAMPOS, 2012). Quadro 3 – Conjunto de símbolos utilizados do fluxograma. Fonte: Ascencio e Campos (2012). Na Figura 1 a seguir, temos a representação do algoritmo de somar dois números em forma de fluxograma. Figura 1 – Algoritmo no formato de fluxograma. Fonte: O autor. Segundo Ascencio e Campos (2012), a vantagem do fluxograma está nos símbolos gráficos, que são universais e podem ser interpretados independente do idioma. Como desvantagem, é necessário aprender a simbologia apresentada no Quadro 3; além disso, ele não apresenta muitos detalhes e, por isso, dificulta a conversão do algoritmo em um programa. 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 EDUCAÇÃO A DISTÂNCIA 1.3 Pseudocódigo O pseudocódigo, também conhecido como Portugol ou português estruturado, consiste em escrever as instruções com regras de sintaxe predefinidas, sendo uma linguagem restrita que descreve o significado dos termos utilizados (ASCENCIO; CAMPOS, 2012). O Quadro 4 a seguir ilustra o algoritmo de somar dois números representado em pseudocódigo. Algoritmo "soma" Var n1, n2, s: inteiro Inicio Leia(n1, n2) s <- n1 + n2 Escreva(s) FimAlgoritmo Quadro 4 – Algoritmo em forma de pseudocódigo. Fonte: O autor. Segundo Ascencio e Campos (2012), o pseudocódigo oferece a vantagem de ser muito próximo a uma linguagem de programação, tornando a conversão de um algoritmo em um programa quase que imediata. A desvantagem está na necessidade de ter que aprender as regras do pseudocódigo; muitas vezes isto leva diretamente ao estudo de uma linguagem de programação real, embora existam diversos programas no mercado voltados à execução de algoritmos escritos em pseudocódigo. Adotamos em nosso livro o aprendizado da lógica de programação tendo como base a linguagem C, abordada com detalhes na seção seguinte. 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 EDUCAÇÃO A DISTÂNCIA 2 PROGRAMAS E LINGUAGENS DE PROGRAMAÇÃO Programas de computador são, em sua essência, algoritmos que dizem ao computador os passos específicos para a solução de um problema e em que ordem eles devem ser executados (DEITEL, 2011). O computador, por sua vez, traduz as instruções dos programas em operações primitivas. O Quadro 5 a seguir apresenta estas operações, comuns não só aos computadores, mas a todos os demais aparelhos digitais eletrônicos. Operação Tipo de instrução Descrição Processamento de dados Aritmética e lógica Fornecem a capacidade computacional para processar dados numéricos e booleanos Armazenamento de dados Memória Move dados entre a memória e os registradores Movimentação de dados Entrada e saída Comandos para obtenção e apresentação de dados em dispositivos de E/S Controle Teste e desvio Testa o valor de uma palavra ou desvia a execução do programa para uma nova instrução Quadro 5 – Operações primitivas realizadas por computadores. Fonte: Tanenbaum (2013). O computador pode executar programas gerados por meio de duas ferramentas: o compilador e o interpretador. Elas são responsáveis por transformar as instruções escritas nos programas em linguagem compreensível pelo computador, e são detalhadas nas seções seguintes. 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 EDUCAÇÃO A DISTÂNCIA 2.1 Compiladores Segundo Sebesta (2011), compilação é o processo onde um programa escrito em uma linguagem de programação é traduzido para linguagem de máquina. O software responsável por esse processo é o compilador, que executa as seguintes tarefas: • Gera um código intermediário em linguagem de montagem, usado como base para a criação de um arquivo binário chamado código-objeto; • Resolve as chamadas de funções do sistema operacional ou de bibliotecas externas usadas no programa, por meio de uma ferramenta auxiliar chamada de ligador (linker) no processo conhecido como linkagem ou ligação; • Gera o código de máquina final, geralmente um arquivo executável ou uma biblioteca de funções que podem ser usadas para gerar outros programas. Este processo é ilustrado com detalhes na Figura 2 a seguir. Figura 2 – Processo de compilação. Fonte: Tucker e Noonan (2010). O compilador apresenta como vantagem o desempenho em tempo de execução, uma vez que o mapeamento para entradas e saída ocorre muito mais rapidamente. Por outro lado, tem a desvantagem de ter que repetir todo o processo de compilação cada vez que o código-fonte é alterado (TUCKER; NOONAN, 2010). 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 EDUCAÇÃO A DISTÂNCIA 2.2 Interpretadores A interpretação é caracterizada por efetuar as fases abordadas na compilação, linha por linha de instrução do programa. Assim, este é executado junto com as entradas diretamente por um programa denominado interpretador, que produz o resultado. Por essa razão, também não há arquivos intermediários, como código-objeto ou arquivo executável (SEBESTA, 2011). Em resumo, cada linha do programa é lida pelo interpretador, convertida e imediatamente executada antes que o comando seguinte seja lido. A Figura 3 a seguir ilustra esse processo. Figura 3 – Processo de interpretação. Fonte: Tucker e Noonan (2010). A qualidade da interação com o sistema pode ser melhor com um interpretador do que com um compilador, pois o primeiro executa o programa instrução por instrução. Já que o desenvolvimento de programas é interativo, trechos de programas podem ser testados na medida em que são escritos, oferecendo assim um melhor diagnóstico de erro (TUCKER; NOONAN, 2010). No entanto, isso acaba por tornar lento o processamento do programa interpretado se comparado ao programa compilado. Além dessa desvantagem, geralmente corre-se o risco de deixar o código-fonte do programa exposto ao usuário (MANZANO; OLIVEIRA, 2012). 2.3 Linguagens de Programação As linguagens de programação constituem um vocabulário acompanhado de um conjunto de regras gramaticais. Esse conjunto de comandos e regras permite a escrita de um programa que pode ser lido e compreendido por um ser humano com certa naturalidade e traduzido sem ambiguidade pelo próprio computador para a linguagem de máquina (TUCKER; NOONAN, 2010). As linguagens de programação geralmente são divididas em três tipos gerais, segundo Deitel (2011): • Linguagem de máquina, formada por uma sequência de números – em última instância, reduzidos a 0s e 1s. É a “linguagem natural” de um computador em particular, definida pelo projeto de hardware; 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 EDUCAÇÃO A DISTÂNCIA • Linguagens simbólicas ou de montagem, também conhecida como assembly. Sua finalidade é simplificar a escrita e a leitura da linguagem de máquina por meio de declarações que produzem instruções correspondentesde máquina; • Linguagens de alto nível, onde seu conjunto de regras e instruções é mais próximo da linguagem humana. Exemplos: Fortran, Basic, C, C++, C#, COBOL, Harbour, Pascal, Delphi, Pearl, Phyton, PHP, Java, Javascript, entre muitas outras. Adotamos em nossa disciplina a C como base para o aprendizado de lógica de programação; portanto, apresentamos essa linguagem na próxima seção e usamo-na para exemplificar os demais elementos de programação abordados neste livro. 2.4 Linguagem C A linguagem C foi originada de outras duas linguagens, segundo Schildt (1996): A linguagem C foi inventada primeiramente por Dennis Ritchie em um DEC PDP-11 que utilizava o sistema operacional UNIX. C é o resultado de um processo de desenvolvimento que começou com uma linguagem mais antiga, chamada BCPL, que ainda está em uso, em sua forma original, na Europa. BCPL foi desenvolvida por Martin Richards e influenciou uma linguagem chamada B, inventada por Ken Thompson. Na década de 1970, B levou ao desenvolvimento de C (SCHILDT, 1996, p. 3). Ainda de acordo com Schildt (1996), C é frequentemente classificada como linguagem de médio nível para computadores porque combina elementos de linguagem de alto nível com a funcionalidade da linguagem de montagem. Além disso, um programa escrito em C é portável, ou seja, pode ser executado em tipos diferentes de computadores com poucas adaptações. C é uma linguagem compilada e seus programas percorrem seis passos até que possam ser executados (DEITEL, 2011), ilustrados na Figura 4 a seguir. 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 EDUCAÇÃO A DISTÂNCIA Figura 4 – Ambiente típico de desenvolvimento em C. Fonte: Deitel (2011). 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 EDUCAÇÃO A DISTÂNCIA Devido ao paradigma procedural da linguagem, todo programa em C é estruturado em funções e dentro delas estão contidas as instruções a serem executadas. O Quadro 6 a seguir ilustra um esboço desta estrutura. tipo nome_da_função(parâmetros) { variáveis locais instruções } Quadro 6 – Estrutura de um programa em C. Fonte: O autor. Cada item é descrito da seguinte forma: • tipo: tipo de dado a ser retornado pela função; • parâmetros (opcional): lista de argumentos a serem passados para a função, devidamente tipados; • {}: delimitam o início e o final da função; • variáveis locais (opcional): declaração das variáveis locais a serem usadas, devidamente tipadas; • instruções: comandos a serem executados. Todo programa em C, após ser escrito, deve ser gravado no formato de arquivo texto – cujo nome deve ter a extensão .c – em um dispositivo de armazenamento secundário, como por exemplo um disco rígido ou um pendrive (DEITEL, 2011). Existem vários ambientes de desenvolvimento integrado (IDE) disponíveis para a linguagem C em vários sistemas operacionais. Deixamos o aluno à vontade para usar o de sua preferência. Para Windows, temos: Turbo C, DevC++, Code Blocks etc.; este último possui disponível um tutorial de como compilar seu primeiro programa. Linguagem C #02: Primeiro programa em C Disponível em: https://www.youtube.com/watch?v=VGC-XEj76xI . Acesso em: 9 set. 2020. 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 EDUCAÇÃO A DISTÂNCIA Vamos enfim ao nosso primeiro programa em C, o famigerado “Alô Mundo” – sugestão de nome de arquivo: AloMundo.c. O Quadro 7 a seguir ilustra como ficaria o código desse programa. #include <stdio.h> // Inclui o cabeçalho de funções de E/S /* Trecho do programa principal */ int main(void) { printf(“Alo, Mundo!”); // Imprime o texto na tela return 0; // Retorna o valor para o SO } Quadro 7 – Programa “Alô Mundo”. Fonte: O autor. Esse programa consiste em 6 linhas, já desconsiderando a linha em branco, mas pode ser reduzido ainda mais devido à flexibilidade de estruturar várias instruções em uma só linha. Vamos descrever o significado dos comandos linha por linha: • #include <stdio.h> – todo comando que inicia com # é uma diretiva de pré-processamento e é analisado na Fase 2 da Figura 4. #include permite que funções em um determinado cabeçalho-padrão sejam chamadas no programa. stdio.h contém o protótipo da função printf(), usada umas linhas adiante no programa do Quadro 7; • /* Trecho do programa principal */ – essa linha é um comentário e será ignorada pelo compilador. C oferece dois comandos para fazer comentários em programas: /* */, que permitem comentários em múltiplas linhas; e //, que pode ser usado no final de uma linha com instruções, e os comentários estendem-se até o final da linha. É uma boa prática fazer comentários nos programas, como forma de documentação e de guia para determinadas operações realizadas nele, com o objetivo de auxiliar em uma ocasional manutenção; • int main(void) – todo programa em C deve conter uma função denominada main(), toda em minúscula, pois é por meio dela que a execução é iniciada. Geralmente ela retorna um valor numérico para o sistema operacional, sendo que 0 indica sucesso de execução e outro número indica um erro a ser tratado externamente; por isso, definimos int como tipo de retorno. A palavra void entre os parênteses é usada para indicar que a função não receberá parâmetros. • printf(“Alo, Mundo!”); – essa função imprime dados no dispositivo de saída corrente, nesse caso, a tela do monitor. Uma lista de parâmetros pode ser passada para a função inclusive com a opção de formatar os dados a serem exibidos; • return 0; – esse comando retorna o valor especificado para a função chamadora. No caso da função main(), sempre retornaremos 0, indicando sucesso na execução. 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 EDUCAÇÃO A DISTÂNCIA Com exceção das diretivas de pré-processamento, os demais comandos – incluindo as chaves delimitadoras {} – podem ser agrupados em uma linha. O Quadro 8 a seguir ilustra algumas formas alternativas para codificar o programa “Alô Mundo”. int main(void) { printf(“Alo, Mundo!”); return 0; } int main(void) { printf(“Alo, Mundo!”); return 0; } int main(void) { printf("Alo, Mundo!"); return 0; } Quadro 8 – Variantes do programa “Alô Mundo”. Fonte: O autor. Todos os exemplos do Quadro 8 fazem exatamente a mesma coisa do programa do Quadro 7. A única diferença está na forma em que as instruções foram distribuídas. C é uma linguagem case-sensitive, isto é, faz distinção entre maiúscula e minúscula. Todas as palavras reservadas em C são minúsculas; a função main(), como já visto, deve ser declarada em minúscula; a variável valor é diferente de Valor ou VALOR, são três variáveis distintas; processa() é diferente de Processa() ou PROCESSSA(), são três funções distintas (SCHILDT, 1996). Além disso, todos os comandos são concluídos com um ponto-e-vírgula (;), também chamado de terminador de instruções. Exceções a esta regra são as declarações de funções e as diretivas de pré-processamento (DEITEL, 2011). 31WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 3 TIPOS DE DADOS Na linguagem C, existem cinco tipos de dados básicos e dois tipos de dados especiais, abordados nas seções seguintes. 3.1 Tipos de Dados Básicos Segundo Schildt (1996), os dados podem ser representados por cinco tipos básicos: • char: caractere; • int: inteiro; • float: ponto flutuante; • double: ponto flutuante de precisão dupla; • void: nulidade ou ausência de valor. Com exceção do void, os demais tipos podem ter sua capacidade ou faixa de valores alterada com o uso de modificadores. Existem quatro modificadores, segundo Schildt (1996): • unsigned: utilizado para declarar os tipos como sem sinal, duplicando assim a gama de valores que pode ser representado; • signed: declara tipos contendosinal; • short: reduz a capacidade de armazenamento; • long: aumenta a capacidade de armazenamento. 32WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA Na prática, signed e short são redundantes e pouco usados, pois a declaração padrão de tipos já considera, respectivamente, o sinal e a menor faixa de valores. O Quadro 9 a seguir apresenta os tipos de dados com e sem modificadores, seu tamanho e sua faixa de dados permitida. Tipo Faixa de valores Tamanho aproximado char -128 a 127 8 bits (1 byte) unsigned char 0 a 255 8 bits (1 byte) int -32.768 a 32.767 16 bits (2 bytes) short int -32.768 a 32.767 16 bits (2 bytes) unsigned int 0 a 65.535 16 bits (2 bytes) long int -2.147.483.648 a 2.147.489.647 32 bits (4 bytes) long -2.147.483.648 a 2.147.489.647 32 bits (4 bytes) unsigned long 0 a 4.294.967.295 32 bits (4 bytes) float 3.4 x 10-38 a 3.4 x 1038 32 bits (4 bytes) double 1.7 x 10-308 a 1.7 x 10308 64 bits (8 bytes) long double 3.4 x 10-49328 a 3.4 x 1049328 128 bits (16 bytes) Quadro 9 – Todos os tipos dados definidos pelo padrão ANSI. Fonte: adaptado de Schildt (1996). Alguns tipos de dados podem variar dependendo do hardware, do compilador e do sistema operacional. Por exemplo, o tipo int possui 4 bytes nos computadores mais atuais e, consequentente, a mesma faixa de valores de um long. Além dos cinco tipos de dados básicos e seus modificadores, a linguagem C possui dois tipos especiais de dados: enumeradores e ponteiros. Reparamos no Quadro 9 que o tipo char, embora seja para representar caracteres, também possui uma faixa de valores. Na verdade, esse tipo armazena o código numérico do caractere na tabela ASCII da máquina (DEITEL, 2011). Exemplos: • ‘z’ representa o código de z, que é 122; • ‘7’ representa o código no número 7, que é 55; • ‘\n’ representa o código do caractere de nova linha, que é 10. 33WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 3.2 Enumeradores De acordo com Deitel (2011, p. 340), “uma enumeração, introduzida pela palavra-chave enum, é um conjunto de constantes de enumeração inteiras, representadas por identificadores”. Os valores em uma enumeração iniciam em 0 e são incrementados por 1 a cada item da lista. Por exemplo: enum semana { DOM, SEG, TER, QUA, QUI, SEX, SAB }; cria uma lista com os dias da semana enumerados de 0 a 6. Para iniciar a lista com 1, basta atribui-lo no primeiro item, desta forma: enum semana { DOM = 1, SEG, TER, QUA, QUI, SEX, SAB }; Os demais itens serão incrementados com 1 automaticamente, fazendo com que SEG valha 2 e SAB valha 7. Depois de declarada, variáveis podem ser criadas usando a enumeração como tipo de dado e usando suas constantes como valores. 3.3 Ponteiros Basicamente, um ponteiro é tipo de dado que armazena um endereço de memória. Este endereço de memória, por sua vez, pode conter uma variável ou uma função carregada na memória (DEITEL, 2011). Depois de armazenado um endereço de memória no ponteiro, existe um operador em C que permite recuperar: • o seu valor, no caso do endereço conter uma variável; • o seu código para ser executado, no caso do endereço conter uma função. Ponteiros são um dos recursos que tornam a linguagem C mais poderosa em comparação a outras linguagens. Por outro lado, é um assunto complexo e que demanda muito entendimento e prática para poder ser aplicado com eficiência. Abordamos ponteiros neste livro porque são necessários na representação de cadeias de caracteres e na passagem de parâmetros por referência a funções. Portanto, esse tipo de dado é visto com mais detalhes na Unidade IV. 34WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 4 CONSTANTES E VARIÁVEIS Os tipos de dados apresentados na seção anterior podem ser representados em um programa por meio de constantes ou de variáveis. Segundo Schildt (1996, p. 19), “em C, nomes de variáveis, funções, rótulos e vários outros objetos definidos pelo usuário são chamados de identificadores”. Eles devem ser formados por letras, números ou o caracter sublinhado “_”, sendo que não pode ser iniciado com números e nem coincidir com as palavras reservadas da linguagem. O Quadro 10 a seguir mostra alguns exemplos de identificadores válidos e inválidos. Válidos Inválidos A 2ª (começa com número e possui caracter inválido: “ª”) a b@ (possui caracter inválido: “@”) Media media idade (possui espaço em branco) altura2 x*y (possui caracter inválido: “*”) media_idade #media (“#” é para diretivas de pré-processamento) x36 1anoComputacao (começa com número) NomeAluno break (palavra reservada da linguagem C) Quadro 10 – Identificadores válidos e inválidos. Fonte: O autor. Vale lembrar que, em C, A não é o mesmo que a: cada um é um identificador distinto. O Quadro 11 a seguir lista todas as palavras reservadas – ou palavras-chave – da linguagem, que são identificadas pelo compilador para traduzir suas instruções devidamente para a linguagem de máquina, e, por isso, não podem ser usadas como identificadores. auto do goto signed unsigned break double if sizeof void case else int static volatile char enum long struct while const extern register switch continue float return typedef default for short union Quadro 11 – Palavras-chave da linguagem C. Fonte: Deitel (2011). 4.1 Constantes De acordo com Manzano e Oliveira (2012, p. 46), “constante é tudo que é fixo, estável, inalterável, imutável, contínuo, incessante, invariável, de valor fixo e que é aplicado em diversos pontos de vista”. Xavier (2011, p. 37) complementa que “dentro do algoritmo, constantes são os valores que permanecem os mesmos do início ao fim”. Existem dois tipos de constantes em C: constantes literais e constantes manifestas. As constantes literais são a representação direta de cada dado, enquanto as constantes manifestas são esses mesmos dados atribuídos a um identificador por meio do comando const ou da diretiva #define (SCHILDT, 1996). 35WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 4.1.1 Constantes literais O tipo de dado char é representado literalmente de duas formas: • Com aspas simples para um caractere, por exemplo: ‘A’, ‘B’, ‘1’, ‘-’, ‘@’ etc.; • Com aspas duplas para dois ou mais caracteres, por exemplo: “Uningá”, “B+” etc. O tipo de dado int é representado literalmente por números inteiros sem o ponto decimal, por exemplo: 25, -481, 2020, 10022018 etc. Os tipos de dados float e double, por sua vez, são representados literalmente por números com o ponto decimal, por exemplo: 8.35, +16.789, 3.1415, -16.44, 0.222222 etc. 4.1.2 Constantes manifestas Segundo Deitel (2011), constantes manifestas criadas com a diretiva de pré-processamento #define são automaticamente substituídas pelo seu valor correspondente na fase de pré- compilação – vide Fase 2 da Figura 1. A sintaxe para a criação de uma constante com esta diretiva é: #define identificador valor. Constantes manifestas criadas com o comando const são na verdade variáveis que serão instruídas pelo compilador a serem armazenadas no espaço de memória ROM, onde seus valores não poderão ser modificados (SCHILDT, 1996). O Quadro 12 a seguir ilustra alguns exemplos de definição de constantes com #define e const. #define PI 3.1415 #define ANO 2020 #define IE "Uninga" const int TAMANHO = 10; const float FATOR = 1.25; Quadro 12 – Exemplos de criação de constantes. Fonte: O autor. Embora não seja uma regra, é costume nas linguagens de programação declarar constantes em maiúsculas, para diferenciar das variáveis que geralmente são criadas em letra minúscula. O importante em relação à linguagem C é lembrar que elas devem ser referenciadas exatamente da forma como foram criadas. Não existe um tipo de dado string em C, como normalmente ocorre em outras linguagens. Cadeias de caracteres sãona verdade um vetor de elementos do tipo char e possuem operadores e funções específicas para serem manipuladas (DEITEL, 2011). Strings são abordadas com mais detalhes na Unidade III. 36WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 4.2 Variáveis Um programa pode receber dados de entrada fornecidos pelo usuário ou efetuar cálculos complexos que requerem o armazenamento desses dados na memória para serem recuperados posteriormente e até mesmo serem modificados. As variáveis representam uma posição de memória com esse propósito. Além do valor armazenado, elas possuem nome e tipo (ASCENCIO; CAMPOS, 2012). Segundo Schildt (1996, p. 20), “[...] todas as variáveis em C devem ser declaradas antes de serem usadas”. A sintaxe para declarar uma variável é: tipo lista_de_variáveis; Onde o tipo pode ser qualquer um dos tipos de dados abordados, opcionalmente acompanhado de modificadores. O Quadro 13 a seguir ilustra alguns exemplos de declaração de variáveis. int quantidade; unsigned int populacao; float valor, desconto; double total; long double cod_barras; char sexo; char endereco[30]; Quadro 13 – Declaração de variáveis em C. Fonte: O autor. Para armazenar dados em variáveis, utilizamos o operador de atribuição (=). A sintaxe para tal finalidade é: identificador = expressão; Onde identificador é o nome da variável previamente declarada, e expressão, o valor de acordo com o tipo da variável. O Quadro 14 a seguir ilustra algumas atribuições de valores às variáveis declaradas no Quadro 13. quantidade = 12; populacao = 35000; valor = 35.60; desconto = 10; total = quantidade * valor; total = total – (total * desconto / 100); cod_barras = 7891237791212; sexo = 'F'; endereço = "Avenida Brasil, 2855"; Quadro 14 – Exemplos de atribuição. Fonte: O autor. Para atribuir o mesmo valor a várias variáveis de uma vez, utilizamos o recurso da atribuição múltipla. Por exemplo, x = y = z = 0; atribuirá o valor zero às variáveis x, y e z (SCHILDT, 1996). É possível também atribuir um valor no momento da declaração da variável. Por exemplo, int opcao = 1; fará com que a variável opcao possua o valor inicial de 1, podendo este ser alterado a qualquer momento no programa. Para isso, basta fazer uma nova atribuição e o novo valor substituirá o anterior na memória. Variáveis declaradas sem atribuição de valor são inicializadas com valores aleatórios, dependendo do compilador C; portanto, é importante sempre atribuir valores a elas. 37WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA Alguns exemplos do Quadro 14 utilizam cálculos aritméticos e as próprias variáveis criadas como parte da expressão a ser calculada. Abordamos os operadores disponíveis em C na seção seguinte. 5 EXPRESSÕES E OPERADORES Segundo Sebesta (2011, p. 342), “[...] expressões são os meios fundamentais de especificar computações em uma linguagem de programação”. São um conjunto de operadores e operandos que geram um resultado a ser utilizado no processamento de um programa. Existem três tipos de expressões em C: aritméticas, relacionais e lógicas. Detalhamos cada tipo nas seções seguintes, juntamente com os seus operadores. 5.1 Expressões Aritméticas Expressões aritméticas são aquelas em que o resultado consiste em um valor numérico. Portanto, podem ser utilizados em expressões desse tipo apenas operadores aritméticos, constantes numéricas e variáveis numéricas – do tipo int, float, double e derivados. O Quadro 15 a seguir apresenta os operadores aritméticos fornecidos pela linguagem C. Operação Operador Exemplo Soma + vencimento + 30 Subtração - elementos – 1 Multiplicação * quantidade * preco Divisão / soma_notas / 4 Resto da divisão % número % 2 Quadro 15 – Operadores aritméticos. Fonte: Adaptado de Deitel (2011). Esses operadores seguem a regra de precedência da matemática. Portanto, em uma expressão contendo vários operadores, são calculadas primeiramente as multiplicações, divisões e o resto; em seguida, são calculadas as somas e subtrações. Parênteses podem ser usados para alterar essa ordem. De acordo com Deitel (2011, p. 64), “C oferece vários operadores de atribuição que abreviam as expressões de atribuição. Por exemplo, a instrução c = c + 3; pode ser abreviada com o operador de atribuição com adição += para c += 3;”. Existe um operador de atribuição para cada operador aritmético da linguagem C, conforme apresentado no Quadro 16 a seguir. Operador Exemplo Equivalente a += x += y; x = x + y; -= x -= y; x = x - y; *= x *= y; x = x * y; /= x /= y; x = x / y; %= x %= y; x = x % y; Quadro 16 – Operadores de atribuição. Fonte: Adaptado de Deitel (2011). 38WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA C também oferece os operadores de incremento (++) e decremento (--), que somam ou subtraem 1, respectivamente, do seu operando. Eles são unários e podem ser usados como prefixo ou sufixo da variável a ser alterada; contudo, possuem comportamento diferente, segundo Schildt (1996): • Se precederem a variável, alteram-na antes de usá-la na expressão; • Se estiverem após a variável, usam seu valor atual na expressão antes de alterá-la. O Quadro 17 a seguir ilustra alguns exemplos dos operadores de atribuição, incremento e decremento. int v1, v2, v3; v1 = 10; v2 = 5; v1 += v2; // v1 = 15 v3 = ++v1 + v2; // v3 = 16 (incrementou v1 antes) v3 = v1 + v2++; // v3 = 16 (incrementou v2 depois) v1 -= 7; // v1 = 9 v2 *= 3; // v2 = 18 v3 /= 4; // v3 = 4 Quadro 17 – Operadores de atribuição, incremento e decremento. Fonte: O autor. 5.2 Expressões Relacionais As expressões relacionais referem-se à comparação entre dois valores de um tipo básico; a isso chamamos de condição, e o seu resultado consiste em um valor lógico verdadeiro ou falso. Segundo Deitel (2011, p. 32), “[...] em C, uma condição pode ser, realmente, qualquer expressão que resulte em um valor zero (falsa) ou diferente de zero (verdadeira)”. O Quadro 18 a seguir apresenta os operadores relacionais da linguagem C. Operador Símbolo Exemplo Igual == a == 1 Diferente != a != b Maior que > a > 5 Menor que < b < 12 Maior ou igual a >= a >= 6 Menor ou igual a <= b <= 7 Quadro 18 – Operadores relacionais. Fonte: Adaptado de Deitel (2011). 39WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA Todos esses operadores possuem a mesma precedência, sendo avaliados da esquerda para a direita; parênteses podem ser usados para alterar a ordem. Diversos exemplos com operadores relacionais são apresentados na Unidade II, onde abordamos as estruturas de seleção e repetição. 5.3 Expressões Lógicas As expressões lógicas permitem que duas ou mais comparações possam ser combinadas em uma única avaliação, fazendo com que o seu resultado também seja verdadeiro ou falso. Para isso, C oferece três operadores, apresentados no Quadro 19 a seguir. Operador Símbolo Descrição Conjunção && Resulta em um valor verdadeiro somente quando todas as expressões são verdadeiras Disjunção || Resulta em um valor verdadeiro quando pelo menos uma das expressões é verdadeira Negação ! Inverte o valor de uma expressão: se for verdadeira, torna-se falsa; e se for falsa, torna-se verdadeira Quadro 19 – Operadores lógicos. Fonte: Adaptado de Schildt (1996). Se todos esses operadores forem usados em uma única expressão, a ordem de precedência é: 4. ! – negação, também chamado de NÃO lógico ou NOT; 5. && – conjunção, também chamado de E lógico ou AND; 6. || – disjunção, também chamado de OU lógico ou OR; Assim como nas outras expressões, parênteses podem ser usados para alterar essa ordem. O Quadro 20 a seguir traz alguns exemplos. char letra = 'J'; int ok = 1, valor = 10, r; r = ok || valor != 10; // Resulta: 1 (verdadeiro)r = ok && valor != 10; // Resulta: 0 (falso) r = ok || valor == 3 || letra == 'A'; // Resulta: 1 (verdadeiro) r = valor == 10 && !ok; // Resulta: 0 (falso) r = valor == 2 && ok || letra == 'J'; // Resulta: 1 (verdadeiro) r = valor == 2 && (ok || letra == 'J'); // Resulta: 0 (falso) Quadro 20 – Exemplos usando operadores lógicos. Fonte: O autor. 40WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 5.4 Precedência de Operadores Em uma expressão, como já visto, podemos ter mais de um operador envolvido. Em situações que há um único operador, a avaliação da expressão é realizada de forma direta. Quando há mais de um operador, porém, é necessária a avaliação da expressão passo a passo, ou seja, um operador por vez. Nesse caso, a precedência de operadores é determinada por parênteses ou pelo Quadro 21 a seguir, onde apresentamos os operadores abordados até o momento e a forma como os seus operandos são associados. Quadro 21 – Precedência de operadores de diversos tipos. Fonte: Adaptado de Schildt (1996). O operador de condição ternária é explicado na unidade seguinte, junto com as estruturas de seleção; e o operador de expressão de função, na Unidade IV, junto com as sub-rotinas. 41WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 5.5 Conversões de Tipos Quando constantes e variáveis de tipos diferentes estão envolvidas em uma expressão, o compilador deve convertê-las em um mesmo tipo para poder resolver a expressão com os valores normalizados; isto se chama promoção de tipo e é feito operação por operação em uma expressão seguindo esta ordem do menor para o maior tipo: char → int → long → float → double → long double (SCHILDT, 1996). A Figura 5 a seguir ilustra alguns exemplos de conversões implícitas, aquelas que o compilador realiza automaticamente resolvendo a expressão de acordo com o maior operando em uma operação. Figura 5 – Exemplo de conversões implícitas. Fonte: Schildt (1996). É possível também realizar conversões explícitas, conhecidas como casts, onde passamos o tipo final desejado entre parênteses à esquerda do operando, seja uma constante ou uma expressão. Sua sintaxe geral é: (tipo) operando (SCHILDT, 1996). Por exemplo, para garantir que a expressão x / 2 resulte em um valor com decimais, podemos usar: (float)x / 2. Mesmo que x seja um inteiro, será convertido em ponto flutuante e terá predominância sobre o segundo operando 2, que é um inteiro. Casts são muito utilizados na manipulação avançada de ponteiros e estruturas definidas pelo usuário. 42WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 6 ENTRADA E SAÍDA DE DADOS A maior parte dos programas é estruturada para receber dados de entrada do usuário, que serão processados de alguma forma e depois serão apresentados os resultados na forma de informações. Esse ciclo, ilustrado na Figura 6 a seguir, pode-se repetir quantas vezes forem necessárias dentro de um programa para solucionar um determinado problema. Figura 6 – Estrutura do fluxo padrão de um programa. Fonte: O autor. Conforme ilustrado no Quadro 5 desta unidade, a entrada e a saída de dados estão entre as operações primitivas que o computador realiza. Toda linguagem de programação deve prover recursos para que o usuário possa: • informar dados usando um dispositivo de entrada – teclado, mouse, scanner etc. • visualizar os resultados depois de processados em um dispositivo de saída –monitor, impressora, projetor etc. As principais funções fornecidas pela linguagem C com esta finalidade são: scanf(), para entrada de dados; e printf(), para saída de dados. Abordamos essas funções com detalhes nas seções seguintes. 43WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA 6.1 Entrada de Dados A função scanf() lê dados fornecidos pelo usuário e os armazena em variáveis. Segundo Deitel (2011), sua sintaxe é a seguinte: scanf( string-de-controle-de-formato, outros-argumentos ); Onde string-de-controle-de-formato descreve os formatos da entrada, e outros- argumentos são ponteiros para as variáveis em que a entrada será armazenada. Cada especificador de formato inserido na string deve vir acompanhado de um ponteiro para a variável onde o valor será armazenado, e na devida ordem em que foram especificados. 44WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA O Quadro 22 a seguir apresenta os especificadores de formato disponíveis. Eles devem ser precedidos na string com o caracter “%”. Tipo de dado Especificador de conversão Descrição Argumento correspondente Inteiro d Lê um inteiro decimal com sinal opcional Ponteiro para um int i Lê um inteiro decimal, octal ou hexadecimal com sinal opcional Ponteiro para um int o Lê um inteiro octal Ponteiro para um unsigned int u Lê um inteiro decimal sem sinal Ponteiro para um unsigned int x ou X Lê um inteiro hexadecimal sem sinal Ponteiro para um unsigned int h ou l Colocados antes de qualquer um dos especificadores de conversão de inteiros para indicar que um inteiro short ou um inteiro long deve ser inserido. N/A Ponto flutuante e, E, f, g ou G Lê um valor de ponto flutuante Ponteiro para um float l ou L Colocados antes de qualquer um dos especificadores de conversão de ponto flutuante para indicar que um valor double ou um long double deve ser inserido Ponteiro para uma variável double ou uma variável long double Caracteres e strings c Lê um caractere Ponteiro para um char s Lê uma string Ponteiro para um vetor do tipo char com tamanho suficiente para guardar a string e um caractere nulo (‘\0’) de término, automaticamente acrescentado [caracteres de varredura] Varre uma string em busca de um conjunto de caracteres que estão armazenados em um vetor N/A Diversos p Lê um endereço de memória Ponteiro para a variável de ponteiro que armazenará o endereço n Armazena o número de caracteres inseridos até esse ponto da chamada a scanf() Ponteiro para um int % Salta o sinal de porcentagem (%) na entrada N/A Quadro 22 – Especificadores de conversão. Fonte: Deitel (2011). 45WWW.UNINGA.BR AL GO RI TM OS E P RO GR AM AÇ ÃO A PL IC AD A | U NI DA DE 1 EDUCAÇÃO A DISTÂNCIA Para usar a função scanf() em um programa, devemos incluir o arquivo de cabeçalho padrão stdio.h, conforme explicado na seção 2.4 desta unidade. O Quadro 23 a seguir apresenta um programa completo que ilustra diversos exemplos de entrada de dados usando scanf(). #include <stdio.h> int main(void) { char nome[30], nota; float altura; int dia, mes, ano; printf(“Digite o seu nome: “); scanf(“%s”, nome); printf(“Digite a altura: “); scanf(“%f”, &altura); printf(“Nascimento (DD/MM/AAAA): “); scanf(“%d/%d/%d”, &dia, &mes, &ano); printf(“Digite a nota (A-E): “); fflush(stdin); // Para prevenir o bug de não editar scanf(“%c”, ¬a); return 0; } Quadro 23 – Exemplos de entrada de dados. Fonte: O autor. O endereço de memória de cada variável deve ser passado como parâmetro para a função scanf(), para que o valor digitado possa ser armazenado nela. Para isso, utilizamos o operador &; a única exceção no exemplo do Quadro 23 é a variável nome, que é um vetor de 30 elementos do tipo char – abordamos strings com detalhes na Unidade III. No caso da data de nascimento, temos três especificadores %d para a entrada respectiva do dia, mês e ano; por isso temos os endereços destas variáveis sendo passados na mesma ordem em que aparecem na string de entrada. Para concluir, a instrução fflush(stdin); será colocada antes de cada entrada caractere ou string, para prevenir um possível bug no buffer de entrada desses tipos de dados, dependendo do compilador
Compartilhar