Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem e Técnica de Programação Linguagem e Técnica de Programação copyright © uVa 2019 Nenhuma parte desta publicação pode ser reproduzida por qualquer meio sem a prévia autorização desta instituição. Texto de acordo com as normas do Novo Acordo Ortográfico da Língua Portuguesa. auToria do conTeúdo Claudio Fico Fonseca reVisão Marcia Glenadel Isis Batista Theo Cavalcanti Lydianna Lima ProjeTo gráfico UVA diagramação UVA F676 Fonseca, Claudio Fico Linguagem e técnica de programação [livro eletrônico] / Claudio Fico Fonseca. – Rio de Janeiro: UVA, 2020. 1.66 MB : PDF. ISBN 978-65-5700-033-5. 1. Linguagem de programação (Computadores). 2. Computador – linguagem de programação. 3. C (Linguagem de programação de computador). 4. Algorítmos. 5. Algorítmos computacionais. I. Universidade Veiga de Almeida. II. Título. CDD – 005.13 Bibliotecária Katia Cavalheiro CRB 7 - 4826. Ficha Catalográfica elaborada pela Biblioteca Central da UVA. sumário apresentação autor 6 7 construção de fluxograma e português estruturado 31 • Construção de fluxogramas • Português estruturado • Estruturas de controle e repetição Unidade 2 8 • Como resolver problemas algorítmicos • Cálculo proposicional • Introdução à álgebra de Boole Lógica proposicional e linguagem proposicional Unidade 1 sumário Vetores, matrizes e manipulação de arquivos 91 • Vetores (arrays) • Matrizes • Arquivos Unidade 4 53 • Comandos e operadores em C • Estruturas de controle e repetição em C • Convertendo português estruturado para Linguagem C entender os conceitos e aplicações da Linguagem c Unidade 3 6 A disciplina Linguagem e Técnica de Programação visa o entendimento do conceito de estruturas lógicas e sequenciais voltadas para o desenvolvimento de aplicações em em- presas, jogos e sistemas operacionais. Por ser uma linguagem de uso atual compartilha- da em grandes softwares, estudaremos, nesta unidade, a tecnologia Linguagem C, que consiste em um conjunto ordenado de ações que permite o fortalecimento e o engran- decimento do negócio no mercado globalizado, além da execução de um determinado programa atendendo a uma ou mais necessidades. Trabalharemos, também, a questão da identificação de possíveis erros de lógica de pro- gramação e como esses erros podem ser tratados. Nesse processo, não apenas desen- volveremos o uso de estruturas de decisão que auxiliam na verificação de entrada de dados como também faremos uso dessas estruturas de decisão para a verificação de uma série de condições para atender a demandas específicas. Veremos, ainda, o uso da estrutura de repetição — estrutura que permite a execução de uma ou mais rotinas de forma repetitiva até que uma determinada condição seja findada. aPresenTação 7 cLaudio fico fonseca Graduado em Informática, Especialização em Marketing, MBA em Gestão Empresarial, MBA em Gerenciamento de Projetos, mestre em Educação e doutor em Gestão Educa- cional. Exerce, na Universidade Veiga de Almeida – UVA, os cargos de diretor de Desen- volvimento Institucional, coordenador do Curso de Sistemas da Informação – Presencial e EAD, coordenador do Curso de Análise e Desenvolvimento de Sistemas – EAD, coorde- nador do Curso de Gestão da Tecnologia da Informação – EAD, coordenador do Núcleo de Certificação Profissional e Internacional, coordenador do MBA em Gestão Estratégica de TI. Exerceu os cargos de diretor da Escola de Tecnologia da Informação e Inovação das Faculdades Integradas de Jacarepaguá – FIJ, de diretor de Pós-Graduação e Ex- tensão e consultor de Tecnologia da Informação na Master Educacional, de pró-reitor acadêmico e diretor de Tecnologia do Grupo Educacional Anglo-Americano, de vice-reitor adjunto, diretor de Certificação Profissional e gerente de TI do Centro Universitário da Cidade do Rio de Janeiro – UniverCidade. Atua como conselheiro de Educação e Novas Tecnologias, é membro da Associação Brasileira de Educação – ABE, membro titular do Conselho Ibero Americano, avaliador institucional e de cursos da área de Informática e cursos superiores de Tecnologia do Ministério da Educação/Inep, avaliador de cursos do Guia do Estudante e perito de Tecnologia da Informação da Justiça do Trabalho. auTor c. Lattes http://lattes.cnpq.br/6387003742232768 Lógica proposicional e linguagem proposicional UNIDADE 1 9 Conhecer os fundamentos da programação estruturada, o histórico da linguagem de pro- gramação, as bibliotecas pertinentes à Linguagem C, os tipos de dados e a estrutura da linguagem. Toda essa fundamentação irá proporcionar um conhecimento mais abran- gente do raciocínio lógico, além de condições de conhecimento de uma linguagem de programação que irá permitir o desenvolvimento de soluções que implicarão a resolução de problemas no dia a dia de uma empresa. inTrodução Nesta unidade você será capaz de: • Apresentar os conceitos fundamentais usados na construção de algoritmos. Desenvolver no aluno a capacidade lógica de construir algoritmos para resolu- ção de problemas de forma planejada e estruturada. Possibilitar a codificação de programas de baixa e média complexidade, usando uma linguagem de progra- mação. Reconhecer a importância do planejamento e dos testes na resolução de problemas computacionais. objeTiVo 10 como resolver problemas algorítmicos A lógica de programação é uma técnica que desenvolve algoritmos para atingir um con- junto de objetivos com base em regras: 1. Pautadas na lógica matemática e em outras teorias clássicas oriundas da Ciên- cia da Computação. 2. Adequadas para a linguagem de programação escolhida pelo programador para a construção do seu software. No contexto da Matemática, entendemos o algoritmo como a represen- tação de um conjunto de processos e de símbolos para que determinado cálculo possa ser efetuado. Um algoritmo não representa, obrigatoriamente, um programa para um computador, e sim as etapas e os passos importantes para que determinada tarefa seja realizada. A sua implementação pode ser feita por: • Um computador. • Um ser humano. • Outro tipo de autômato. É fato que existem diferentes algoritmos rodando no nosso universo e esses poderão executar a mesma atividade utilizando um conjunto de instruções com mais ou menos tempo, espaço ou esforço do que os outros. A diferença constada estará sempre na complexidade computacional aplicada, cuja relação algorítmica está relacionada às es- truturas de dados adequadas ao algoritmo. O que é um algoritmo? Um algoritmo nada mais é do que uma sequência não ambígua de instruções que é executada até que determinada condição seja atendida. Em outras pala- vras, são sequências lógicas ordenadas. saiba mais 11 Lógica proposicional Nas questões pertinentes à lógica e à matemática, temos a lógica proposicional. A lógica proposicional, também conhecida como álgebra das proposições, é um siste- ma formal no qual as fórmulas representam proposições que podem ser constituídas por meio da combinação de proposições atômicas que usam conectivos lógicos e um sistema de regras de derivação. Um cálculo sempre será apresentado como um sistema formal que de- termina um conjunto de expressões sintáticas. Também podemos constatar que a lógica proposicional é tida como um subconjunto distinto dessas expressões sintáticas — é um conjunto de regras formais que busca de- terminara relação binária específica que se pretende interpretar como a equivalência lógica no contexto apresentado de uma ou mais expressões sintáticas. Quando há a percepção de que o sistema formal tem um propósito para ser um sistema lógico, as expressões estabelecidas devem ser, imediatamente, interpretadas como as- serções matemáticas. As regras existentes, naturalmente conhecidas como regras de inferência, em geral se- rão preservadoras da verdade. Nesse modelo tratado, as regras poderão ser usadas para derivar as fórmulas representando as asserções verdadeiras. O conceito de algoritmo foi criado em 1936, durante a Segunda Guerra Mundial, pelo matemático britâ- nico Alan Turing. Após esse evento, Turing ficou co- nhecido como o pai da Ciência da Computação. Para saber mais sobre essa história, indicamos o filme O jogo da imitação. dica 12 O conjunto estabelecido de axiomas poderá ser: • Vazio. • Conjunto finito não vazio. • Conjunto finito enumerável. • Axiomas esquemáticos. A gramática formal define repetidamente as expressões e as fórmulas bem formadas da linguagem proposta. Dessa forma, pode-se apresentar a semântica para definir: Verdade Valorações Interpretações Afinal, o que é uma proposição? Uma proposição é uma sentença declarativa, seja ela determinada de forma afirmativa ou negativa, na qual poderemos atribuir um valor lógico: • Verdadeiro – V. • Falso – F. Vamos ver alguns exemplos? i. Sentença declarativa afirmativa verdadeira “A cidade de Brasília é a capital do Brasil.” Temos uma sentença declarativa expressa totalmente de forma afirmativa. Nesse caso, podemos também atribuir um valor lógico. Uma vez que a sentença é verdadeira, natu- ralmente o seu valor lógico será V. ii. Sentença declarativa negativa verdadeira “O Chile não é um país pertencente ao continente europeu.” Temos uma sentença declarativa expressa na forma negativa. Contudo, podemos atri- buir a ela um valor lógico V, pois se trata de uma sentença verdadeira. 13 iii. Sentença declarativa afirmativa falsa “6+6 = 10” Apesar de ser uma sentença declarativa expressa na forma afirmativa, atribuímos a ela um valor lógico F, visto que a sentença é falsa. iv. Quantificadores “Y - 3 = 5” Essa sentença não pode ser considerada uma proposição, pois não sabemos o conteúdo atribuído para a variável Y, ou seja, não podemos atribuir um valor lógico V ou F. Para transformamos a sentença em uma proposição, basta usarmos os quantificado- res. Vejamos: Para todo Y, Y pertencente aos Z (números inteiros), Y - 3 = 5. Isso é uma proposição, pois agora podemos atribuir à sentença um valor lógico. Contu- do, sabemos que é falsa, uma vez que apenas o número 8 torna a sentença verdadeira. v. sentenças que não são proposições Sentenças Exemplos interrogativas Qual é o seu nome? imperativas Venha logo aqui. exclamativas Ufa! abertas x > 3 poemas ----- Vamos conhecer, agora, os princípios que regem as proposições e sua representação. 14 i. Princípio da identidade Uma proposição tida como verdadeira somente será verdadeira. E uma propo- sição falsa é, apenas, falsa. ii. Princípio do terceiro excluído Proposição que ou é verdadeira ou falsa, não existindo uma terceira possibili- dade de acontecimentos. iii. Princípio da não contradição Proposição que não pode ser verdadeira nem falsa de forma simultânea. As proposições sempre serão representadas por letras minúsculas – geralmente x, r, w e g. Assim, temos que em “Brasil tem como capital a cidade de Brasília”: • A sentença pode ser representada por j. • O seu valor lógico pode ser representado por Val(j) = V. Uma proposição também tem a prerrogativa de ser expressada por símbolos. importante 15 Linguagem proposicional O alfabeto é tido como um conjunto de símbolos que compõe uma linguagem e é cons- tituído por: • Símbolos proposicionais atômicos V = {p1, p2, p3, ...} • Conectivos lógicos ¬, , . • Pontuação (, ). As palavras da linguagem são constituídas como as sequências finitas de símbolos to- mados desse alfabeto “V U { ¬, , , (, ) }”, chamadas de fórmulas. Exemplo: (p1 p7) p100 é uma fórmula e ())p5 é outra fórmula. Usamos a metalinguagem que se caracteriza pelo emprego das letras gregas para cons- truir a fórmula. Tais símbolos são indexados com os números naturais. Faremos a repre- sentação da metalinguagem, símbolos atômicos, por meio de algumas letras encontra- das no final do alfabeto da nossa língua portuguesa, por exemplo: p, q, r, s, t, u, v, x, z. Conheça o significado de cada um desses símbolos. ( ¬ ) Não. ( ) Disjunção. ( ) Conjunção. ( ) Implicação. ( ) Bi-implicação. saiba mais Sempre que necessitarmos de muitos símbolos atômicos, utilizaremos os sím- bolos formais (elementos de V ) ou as letras finais do alfabeto da língua portu- guesa indexadas com números naturais. importante 16 Uma fórmula bem formada (FBF) é uma expressão que pode ser construída aplicando- se um número finito de vezes às regras: 1. (F1) Símbolos atômicos são FBF, chamadas fórmulas atômicas. 2. (F2) Se α é FBF, então (¬α) é FBF. 3. (F3) Se α e β são FBFs, então (α β) é FBF e (α β) é FBF. 4. (F4) Não existem outras FBFs, além das explicitadas pelo uso das regras (F1), (F2) e (F3). Para a última regra tratada não há a existência de outras FBFs, além das já obtidas pelo respectivo uso das regras estabelecidas em (F1), (F2) e (F3), que nos garante que todas as FBFs poderão ser construídas passo a passo pela existência das regras anteriores. p será estabelecido como o menor conjunto , e é caracterizado pelas sequências de símbolos do nosso alfabeto que irão satisfazer as propriedades a seguir: (X é um conjun- to de fórmulas que satisfaz as duas propriedades então X p): 1. p1, p2, ... . 2.se α, β , então (α β), (α β), (¬α) 17 cálculo proposicional O Cálculo Proposicional Clássico – CPC consis- te em um modelo de sistema simbólico de lógi- ca clássica. Todos os demais sistemas de lógica clássica têm um determinado princípio: • Bivalência: cada fórmula recebe apenas um de dois valores distintos e absolutos, denominados verdadeiro ou falso. • Não contradição: apresentada a devida fórmula e sua negação, uma delas será tida como falsa. • Terceiro excluído: apresentada a devida fórmula e sua negação, uma delas será tida como verdadeira. • Identidade: se uma fórmula é verdadeira, então, consequentemente, essa fórmula será verdadeira. A linguagem para um cálculo proposicional consiste em um: • Conjunto de símbolos primitivos, definidos por fórmulas atômicas, proposições atômicas ou variáveis. • Conjunto de operadores, interpretados como operadores lógicos ou conectivos lógicos. Existem diversas formulações distintas, todas mais ou menos equivalentes, mas que diferirão em alguns detalhes: • Linguagem, que é uma coleção particular de símbolos primitivos e operadores. • Conjunto de axiomas ou fórmulas distinguidas. • Conjuntos existentes de regras de inferência. abstração e aplicações Por mais fácil que possa ser a construção de um cálculo abstrato formal que não tenha uso prático de forma imediata e que não apresente, naquele momento, nenhuma apli- cação óbvia, o nome cálculo já indica que esse sistema formal tem sua origem para a utilidade de seus membros pró-tópicos no cálculo prático. 18 Assim, seja qual for, o cálculo matemático é criado com: • A intenção de demonstrar certo domínio de objetos formais. • O objetivo final de permitir a facilitação das computações e inferências que preci- sam ser realizadas sobre essa representação. O cálculo formal para qualquer apontamento de estudo é criado por um processo de abstração gradual. Tido como um refinamento de todas as suas etapas, o cálculo formal é uma análise por tentativa e erro a partir de um conjunto de sistemas notacionais infor- mais prévios, no qual cada um dos conjuntos de sistemas notacionais informais irá tratar do mesmo conjunto de objetos, apenas em parte ou de um pontobem mais específico. descrição genérica de um cálculo proposicional A lógica proposicional tem por objetivo criar a modelagem para o raciocínio humano, tendo como início as frases declarativas (proposições). Dessa forma, antes de se desenvolver o próprio cálculo, é importante que seja dada a ideia da sua necessidade e dos objetivos formais que se pretende de- monstrar com as fórmulas do cálculo. importante Para que possamos entender melhor o que é uma proposição, considere a frase: 1 mais 1 é igual a 10 ou 1 + 1 = 10 (representatividade simbólica). Nesse caso, a proposição é uma asserção declarativa. Assim, podemos crer que a proposição afirma ou nega o fato e tem um valor de verdade estabelecido, que poderá ser verdadeiro ou falso. exemplo 19 Portanto, teremos um sistema de numeração de base 2. Verificamos que a proposição anterior “1 mais 1 é igual a 10 ou 1 + 1 = 10” seria verdadeira, enquanto para o sistema decimal a proposição seria falsa. Tabelas de Verdade Seja uma linguagem que contenha as proposições A, B e C. Nesse contexto, o que podemos dizer sobre proposição? a. Princípio da bivalência Segundo o princípio de bivalência, a proposição ou é verdadeira ou é falsa. A V F Que alternativas podemos esperar acerca das proposições A e B? • Ambas são verdadeiras. • A primeira é verdadeira e a segunda é falsa. Observe a afirmativa “Hoje é um dia frio”. Nesse caso, o valor de verdade vai depender da existência de vários fatores: • O local que está sendo abordado. • Os respectivos meios e instrumentos de medidas e de comparação — prin- cipalmente de quem está realizando o processo avaliativo. Assim, o valor verdade de uma proposição não será um conceito absoluto, mas dependerá de um contexto interpretativo. exemplo 20 • A primeira é falsa e a segunda é verdadeira. • Ambas são falsas. A B V V V F F V F F Assim, o cenário para uma tabela A, B e C é: A B C V V V V V F V F F V F V F V V F V F F F V F F F b. Negação A negação tem como propósito mostrar o valor inverso da fórmula negada. A ¬A V F F V c. Conjunção A conjunção estabelecida entre duas fórmulas só será verdadeira quando ambas forem verdadeiras. A B A B V V V V F F F V F F F F 21 d. Disjunção A disjunção estabelecida entre duas fórmulas só será verdadeira quando ao menos uma delas for verdadeira. A B A B V V V V F V F V V F F F e. Implicação A implicação estabelecida entre duas fórmulas só será falsa se a da esquerda for verda- deira e da direita for falsa. A B A B V V V V F F F V V F F V f. Bi-implicação A bi-implicação estabelecida entre duas fórmulas será verdadeira quando ambas forem verdadeiras ou ambas forem falsas. A B A B V V V V F F F V F F F V 22 outros conectivos Antes de encerrarmos o Tópico 2, vamos conhecer alguns conectivos diferenciados, como a adaga de Quine, a disjunção exclusiva e o traço de Sheffer. a. Adaga de Quine A B será verdadeiro somente se ambos, A e B, forem falsos. Isso caracteriza a negação da disjunção. A B A B A B V V V F V F V F F V V F F F F V b. Disjunção exclusiva A disjunção exclusiva estabelecida entre duas fórmulas será verdadeira somente se apenas uma delas se caracterizar como verdadeira. Isso caracteriza a negação da bi-implicação. A B A B A B V V V F V F F V F V F V F F V F c. Traço de Sheffer A | B só será falsa se ambos, A e B, forem verdadeiros. Isso caracteriza a negação da conjunção. A B A B A B V V V F V F F V F V F V F F F V 23 introdução à álgebra de boole No ano de 1854, o matemático britânico George Boo- le introduziu o formalismo que, até hoje, é utilizado para o tratamento sistemático da lógica e possui a de- nominação de álgebra booleana. A álgebra booleana tem a característica de ser um conjunto de operadores e de axiomas que, em seu contexto, são assumidos verdadeiros sem necessida- de de prova. No ano de 1938, o matemático estadunidense Claude Shannon realizou demonstrações para que propriedades de circuitos elétricos de chaveamento pudessem ser representa- das por uma álgebra booleana com dois valores. O uso foi diferente da álgebra ordinária dos reais, cujas variáveis podiam assumir valores no intervalo (-¥ + ¥). Na álgebra booleana, com a existência de dois valores, cada variável pode assumir um entre dois valores possíveis: • V ou F (verdadeiro ou falso). • H and L (high and low). • 0 ou 1. Para um melhor entendimento do trabalho a ser realizado, adotaremos a notação com valores 0 e 1 – utilizada na eletrônica digital. As variáveis caracterizadas como booleanas só podem assumir um número finito de valores. observação 24 Como o número de valores que cada variável pode assumir é finito, o número de estados que uma função booleana poderá assumir também será finito. Isso quer dizer que pode- mos descrever completamente as funções booleanas utilizando tabelas definidas. Com base nisso, uma tabela que descreva uma função booleana receberá o nome de tabela-verdade. Serão representadas na tabela-verdade todas as combinações possíveis de valores que as variáveis de entrada poderão assumir e os correspondentes valores da função que poderão ser retornados (saídas). operações básicas As funções booleanas poderão ter sua representatividade com base nessas opera- ções básicas: • Operação “OU”. • Operação “E”. • Complementação. a. Operação “OU” (adição lógica) Resultante de 1 se pelo menos uma das variáveis atribuídas na entrada valer 1. Como uma variável booleana pode valer 0 ou valer 1, e o resultado de uma operação qualquer poderá ser visto como uma variável booleana, basta que haja uma definição de quando a operação vale 1. De forma automática, a operação resultará no valor 0 nos demais casos. Assim, pode- mos dizer que a operação “OU” tem o resultado 0 apenas quando todas as variáveis de entrada valerem 0. Um símbolo utilizado para a representatividade da operação “OU” é “+” (sinal de mais), tal como o símbolo da adição algébrica. 25 Possibilidades para as combinações entre dois valores booleanos e os respectivos resultados para a operação “OU”: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 1 A operação “OU” só poderá ser definida caso haja, pelo menos, duas variáveis envolvidas. O operador “+” (OU) é tido como binário (dois valores). Nas equações existentes, não se costuma apresentar todas as possibilidades de valores. Adotamos, apenas, uma letra para determinar uma variável booleana. Com isso, já se sabe que a variável pode assumir o valor 0 ou o valor 1. O desenvolvimento da equação A + B pode ser representado utilizando a seguinte tabela-verdade: A B A + B 0 0 0 0 1 1 1 0 1 1 1 1 Da mesma forma podemos demonstrar o comportamento da equação A + B + C por meio de uma tabela-verdade. Como na equação há somente o símbolo “+”, denota-se que a operação “OU” será com três variáveis. Não será possível realizar a operação somente com uma variável. observação 26 Podemos aplicar diretamente a definição da operação “OU”: o resultado obtido será 1 se pelo menos uma das variáveis de entrada tiver o valor 1. A B C A + B + C 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 b. Operação “E” (multiplicação lógica) A operação “E” terá o valor 0 se pelo menos uma das variáveis de entrada tiver o valor 0. Assim, concluímos que o resultado da operação “E” valerá 1 se, e somente se, todas as entradas de valores tiverem o valor 1. O símbolo utilizado para a operação “E” é o “×”. Contudo, outra notação também utilizada é “Ù”. Possibilidades de combinações entre dois valores booleanos (e os respectivos resul- tados) para a operação “E”. 0 × 0 = 0 0 × 1 = 0 1 × 0 = 0 1 × 1 = 1 Como vimos na operação “OU”, a operação “E” só poderá ser definida com, pelo menos, duas variáveis. O operador “×” (E) também precisa ser binário. 27 O comportamento da equação A × B será escrito na tabela-verdade da seguinte forma: A B A x B 0 0 0 0 1 0 1 0 0 1 1 1 Podemosdefinir o resultado da equação A × B × C utilizando a definição da operação “E”: o resultado atribuído será 0 se pelo menos uma das variáveis de entrada tiver o valor 0. A B C A x B x C 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 c. Complementação (negação ou inversão) Operação cujo resultado obtido é o valor complementar ao que a variável irá apresentar. Devido ao fato de que uma variável booleana poderá assumir um valor entre dois valores, o valor complementar será sempre: • 1, se a variável tiver o valor 0. • 0, se a variável tiver o valor 1. Os símbolos a serem utilizados para a representação da operação de “Complementa- ção” sobre uma variável booleana A são A, ~A e A’ (entende-se que o A é negado). 0 = 1 1 = 0 28 Diferentemente das operações “OU” e “E”, a “Complementação” só poderá ser definida sobre uma única variável ou sobre o resultado de uma expressão. O operador “Complementação” é conhecido como unário. Tabela-verdade para A: A A 0 1 1 0 Para ampliar o seu conhecimento veja o material complementar da Unidade 1 disponível na midiateca. midiaTeca Uma empresa que demanda a construção de um algoritmo para a resolução de um problema irá se deparar com uma série de definições a serem tomadas. Consequentemente, isso fará parte da construção do algoritmo. A informação passada para a construção do algoritmo influenciará a forma como esse algo- ritmo seguirá as etapas para que suas demandas sejam atendidas. Tal situação implica a criação de uma tabela-verdade para a verificação das opções e das oportunidades. A tabela-verdade irá demonstrar os caminhos a serem seguidos para que o algoritmo atenda, na íntegra, às demandas exigidas. na PráTica 29 resumo da unidade 1 Nesta unidade você estudou toda a importância de se trabalhar com atenção para que não haja problemas referentes ao processo de criação de um programa pelo uso de lógi- ca proposicional, tabela-verdade e álgebra booleana. Todo esse contexto de estrutura de cálculo e de raciocínio lógico com base nos cálculos proposicionais possibilita uma estruturação do raciocínio lógico, uma vez que o condicio- na a uma série de aplicações. Destacamos a importância do uso dos valores 0 e 1, pois ambos estão conectados com todo o propósito dos números binários que tangenciam o cenário da Tecnologia da In- formação. A aplicação da tabela-verdade contemporiza a aplicação estruturada para tomadas de decisões, bem como a aplicação de cálculos proposicionais nas tomadas de decisões. Nesta unidade destacam-se os conceitos fundamentais de como se resolver problemas com relação a erros nos programas, além da aplicação de cálculo proposicional e da aplicação da tabela-verdade. Essas questões validam a im- portância da estruturação do raciocínio lógico na construção de aplicações e também sua importância para a tomada de decisão na construção bem defini- da de um algoritmo. conceiTo 30 referências ASCENCIO, A. F. G.; CAMPOS, E. A. V. de C. Fundamentos da programação de compu- tadores: algoritmos, PASCAL, C/C++ (padrão ANSI) e JAVA. 3. ed. São Paulo: Pearson Education do Brasil, 2012. Biblioteca Virtual. HETEM JUNIOR, A.; BARBIERE FILHO, P. Fundamentos de Informática: lógica para com- putação. Rio de Janeiro: Grupo GEN – LTC, 2013. Minha Biblioteca. Construção de fluxograma e português estruturado UNIDADE 2 32 Nesta unidade vamos conhecer os fundamentos e os tipos de fluxograma existentes, bem como a dinâmica de suas aplicabilidades. Veremos uma forma de programação com base no pseudocódigo — mais conhecido, no Brasil, como Portugol. Também abor- daremos a questão das estruturas de controle e de repetição e suas respectivas formas de utilização. inTrodução Nesta unidade vamos será capaz de: • Compreender a importância da utilização dos fluxogramas e do português es- truturado para o desenvolvimento do raciocínio lógico. objeTiVo 33 construção de fluxogramas introdução ao fluxograma O fluxograma é uma ferramenta utilizada para representar, de forma gráfica, a necessi- dade de um algoritmo, isto é, demonstra a sequência lógica e com coerência do fluxo de dados. Composto por um grupo de figuras geométricas simples — conhecidas como diagrama de bloco —, o fluxograma é também utilizado de várias outras formas. Os principais aspectos dessa forma de utilização do fluxograma são: • Manter a padronização com relação à representação dos métodos e dos procedi- mentos administrativos. Além de representar graficamente um algoritmo, o fluxograma também pode ser utilizado em empresas para demonstrar os vários processos de entrada, processamento e saída de uma determinada produção ou de um respectivo projeto. exemplo 34 • Promover maior rapidez para a descrição dos métodos administrativos. • Permitir que haja facilidade na leitura e no entendimento. • Permitir que haja facilidade na localização e na identificação dos aspectos mais importantes do que se pretende. • Gerar uma maior flexibilidade e um melhor grau de análise dos processos. Por ser um tipo de diagrama, o fluxograma pode ser entendido como uma representação esquemática de um determinado processo. É constituído por uma representação gráfica que ilustra de forma descomplicada uma sequência de execução dos elementos que o compõem. É possível entender, de maneira prática, como a documentação das etapas necessárias para a execução de um processo qualquer acontece. diagrama de bloco É uma ferramenta de larga escala que é muito empregada na representação gráfica para o uso do fluxograma, isto é, demonstra o que cada símbolo geométrico significa e sua utilização no fluxo, bem como sua função. simbologia Observe, a seguir, o significado de cada símbolo e qual sua função dentro do padrão ANSI Simbologia de fluxogramas Padrão ANSI - American National Standards Institute Símbolo Significado Símbolo Significado Operação Armazenagem Movimento/Transporte Sentido de fluxo Ponto de decisão Conexão Inspeção Limites (início, pare, fim) Documento impresso 1- Utilizado quando o fluxograma não cabe em uma única página Espera 35 Forma de declaração de variável no fluxograma O contorno do retângulo é tracejado e, em seu interior, colo- ca-se a declaração da variável. diagrama de chapin O Diagrama de Chapin — também conhecido como Diagrama de Nassi-Shneiderman — foi criado por Ned Chapin e: • Representa a substituição do fluxograma tradicional por um diagrama. • Trabalha com a programação estruturada. • Permite a visualização do fluxo lógico do algoritmo. N1: inteiro Observe, a seguir, um fluxograma para conversão de grau Fahrenheit para grau Celsius. exemplo Início Fim Celsius = 5/9 * (Fahrenheit - 32) Celsius Fahrenheit 36 Vantagens e desvantagens das formas de representação gráfica Figuras utilizadas no Diagrama de Chapin Diagrama de Chapin (Nassin-Shneiderman) Início, fim, processamento (leitura, escrita, atribuição). expressão V F Decisão (if). expressão comandos executados Repetição com teste no início (while, for). expressão comandos executados Repetição com teste no final (do... while ou repeat... util). Maior clareza no fluxo de execução das instruções. Controle de sequência, de seleção e de repartição. Linguagem de visualização bem simples.V A N TA G EN S D ES VA N TA G EN SRequer um conhecimento de convenções gráficas. Maior trabalho em função de seus desenhos mais complexos. Maior dificuldade para realizar correções. 37 Fluxograma de Chapin para cálculo de média. exemplo Média > = 7 Sim Não Média (N1 + N2)/2 Leia N1, N2 Início Fim Escreva “aprovado” Escreva “reprovado” 38 Português estruturado algoritmo A capacidade de pensar de maneira lógica e ordenada é um dos grandes diferenciais para podermos entender como resolver problemas do cotidiano ou problemas impostos pelas demandas das empresas, principalmente no que tange à área da computação. Compreender o conceito de algoritmo é algo de extrema importância.Para que haja um processo de facilitação neste início de demanda, podemos nos utilizar do pseudocódigo, que é um conjunto de instruções escrito em português denominado “Portugol”. Nessa escrita de instruções, você terá contato com detalhes como entrada e saída de dados, bem como com o processamento propriamente dito. A lógica de programação é a capacidade que todo e qualquer programador precisa ter para sanar os problemas e demandas que aparecem no dia a dia de suas atividades. 39 Descrito como uma sequência lógica de ações com o objetivo de resolver um determina- do problema, o algoritmo vai além do âmbito da programação. Tipos de algoritmo O pseudocódigo O pseudocódigo irá utilizar uma linguagem de programação estruturada que se asseme- lhará, na forma, a um programa escrito em uma linguagem de programação. Português estruturado A descrição narrativa utiliza uma linguagem natural que especifica todas as etapas para a realização de tarefas determinadas. Dividir um problema em partes menores é uma etapa essencial da lógica de programação que precisa ser considerada quando somos submetidos a um desafio. É nesse momento que temos contato com o conceito do algoritmo. importante Imagine uma pessoa “mascando um chiclete de menta”. Vamos ver como se dá o pseudocódigo? 1. pegar o chiclete na embalagem 2. retirar o papel do chiclete 3. colocar o chiclete na boca 4. mascar o chiclete 5. jogar o papel na lata de lixo 6. jogar o chiclete no lixo após perder o gosto exemplo 40 Pseudocódigo A representação de um ou mais algoritmos é realizada de diversas formas. Para que hou- vesse uma aproximação um pouco maior dos dois conceitos, foi criado o pseudocódigo — como exemplo de pseudocódigo, no Brasil, temos o Portugol. Vejamos os comandos do pseudocódigo: • escreva (“ “) – Comando utilizado para exibir uma mensagem na tela. • leia () – Comando usado para ler valores digitados pelo usuário via teclado. • – Comando de atribuição de informação para uma variável. • Inicio – Palavra utilizada para iniciar o programa principal. • Fim – Palavra utilizada para finalizar o algoritmo. • Var – Palavra utilizada para declarar as variáveis do programa. • Algoritmo – Palavra utilizada para indicar o início do programa. São consideradas boas práticas na escrita do pseudocódigo: • Utilizar um verbo no infinitivo por frase. • Fazer frases curtas e simples. • Ser bem objetivo. • Usar palavras sem duplo sentido. • Usar indentação e linhas em branco. O objetivo é um só: desenvolver um código-fonte que se aproxime, o máximo possível, do que será visto em algumas linguagens de programação, como C, C# ou Java. Por meio da utilização do Portugol, nosso algoritmo da soma de dois números será de- monstrado a seguir. Nesta linguagem de programação, é importante destacar que temos outro modelo, conhecido como regiões — nesse código, temos uma região de variáveis e outra de processamento de informações. Esse conceito sempre deve ser considerado no processo de desenvolvimento de sistema. 01 inicio 02 inteiro x, y, resultado 03 ler (x) 04 ler (y) 05 resultado x 8 y 06 escrever (resultado) 07 fim 41 Vamos entender o que significa cada uma dessas linhas? Linha 01 Indicação do início do algoritmo em Portugol. Linha 02 Local para a definição de variáveis. As variáveis inteiras “x” e “y” serão utilizadas para armazenar os valores digitados pelo usuário, enquanto a variável “resultado” irá receber a soma deles. Linhas 03 e 04 Lerão os valores digitados pelo usuário e os guardarão nas variáveis “x” e “y”. No Portugol, as ações serão sempre defi- nidas por verbos no infinitivo. Linha 05 Utilizamos o operador de atribuição “ ”. Esse operador atribui a operação de soma das variáveis “x” e “y” à variável “re- sultado”. Esta é a fase de processamento dos da- dos de entrada. Linha 06 Para finalizar o algoritmo, temos a amos- tragem dos dados para o usuário. Nesse caso, utilizamos o verbo “Escrever” para exibir essa ação. Linha 07 Indicação do fim do algoritmo em Portugol. O verbo ler serve para indicar a leitura das informações do usuário — entrada dos dados. O verbo escrever exibe o resultado final para o usuário — saída de dados. observação 42 Vamos, agora, fazer uma análise de um algoritmo desenvolvido para encontrar a solução da soma entre dois números. 1 algoritmo “somavalores” 2 var 3 num1, num2, somat: real 4 5 inicio 6 7 escrever (“digite o primeiro número “) 8 ler (num1) 9 escrever (“digite o segundo número “) 10 ler (num2) 11 somat num1 + num2; 12 escrever (“Primeiro número eh: “, num1) 13 escrever (“Segundo número eh: “, num2) 14 escrever (“Soma: “, somat) 15 16 fimalgoritmo Vejamos o que quer dizer cada uma dessas linhas. Linha 1 – Utilizamos a palavra-chave algoritmo para começar o nosso algoritmo. Obser- ve que, em seguida, temos um nome entre as aspas duplas: nome_do_algoritmo. Linha 2 – Utilizamos a palavra-chave var para demonstrar que, naquele espaço, deve- mos declarar as respectivas variáveis que serão usadas no programa. Linha 3 – As variáveis são declaradas com seus respectivos identificadores e tipos. Primeiro, vem o nome (identificador) da variável e, após os dois pontos, o tipo da variável. num1 e num2 são os dois números; somat é a variável que armazenará o resultado da operação aritmética a ser realizada. Linha 5 – Utilizamos a palavra-chave inicio para indicar que, a partir daquele ponto, te- mos o início do programa principal. Linha 7 – Utilizamos o comando escrever para que seja exibido um texto na tela do usuário. É solicitado que o usuário digite um número. 43 Linha 8 – Utilizamos o comando ler para que o valor digitado pelo usuário, via teclado, seja armazenado na variável correspondente. O valor será atribuído para a variável num1. Linha 9 – Utilizamos o comando escrever para que seja exibido um texto na tela do usuário. É solicitado que o usuário digite o segundo número. Linha 10 – Utilizamos o comando ler para que o valor digitado pelo usuário, via teclado, seja armazenado na variável correspondente. O valor será atribuído para a variável num2. Linha 11 – Momento no qual a operação aritmética é realizada. É utilizado o comando para que o resultado seja atribuído à variável somat. Linhas 12, 13 e 14 – Utilizamos o comando escrever. Contudo, observe que há algo diferente em relação às linhas 7 e 9. Estamos exibindo na tela, junto com o texto que que- remos, os valores das variáveis. Isso é feito usando a vírgula e pondo, após ela, a variável que queremos que seja exibida na tela. Linha 16 – Utilizamos a palavra-chave fimalgoritmo para finalizar o programa principal e sua execução. Essa palavra-chave força a saída do programa, fechando a janela e libe- rando o espaço de memória que estava reservado para as variáveis. 44 estruturas de controle e repetição estruturas de decisão Comandos de decisão (ou desvios) são utilizados para a construção de algoritmos que não são totalmente sequenciais — com as instruções de desvio, é possível fazer com que o algoritmo proceda de uma outra forma, seguindo outros caminhos conforme as deci- sões lógicas tomadas em virtude dos dados ou dos resultados anteriores. As estruturas de decisão que veremos hoje são: SE ... ENTÃO ... SENÃO ... FIM SE SE alguma coisa for verdadeira ENTÃO executar este bloco de comandos SENÃO executar este outro bloco de comandos FIM SE • SE ... ENTÃO ... FIM SE SE alguma coisa for verdadeira ENTÃO executar este bloco de comandos FIM SE 45 Em uma estrutura de controle, também podemos trabalhar com a opção de ter uma es- trutura de menu de opções. Quando uma opção for selecionada, automaticamente, os códigos referentes a essa opção serão executados em ordem sequencial. 1. Construa um algoritmo para ler dois valores inteiros e escreva qual é o maior valor entre eles. ALGORITMO “checarvalores” VAR VALOR1, VALOR2 INÍCIO: Inteiro INICIO Ler VALOR1 Ler VALOR2 SE VALOR1 > VALOR2ENTÃO Escrever ‘O primeiro é maior’ SE NÃO Escrever ‘O segundo é maior’ FIM SE FIMALGORITMO 2. Construir um determinado algoritmo para ler um valor real. Caso o va- lor seja maior do que zero, escreva-o e finalize o programa. Caso contrário, apenas finalize o programa. ALGORITMO “valorreal” VAR VALOR INÍCIO: real INICIO Ler VALOR SE VALOR > 0 ENTÃO Escrever ‘O valor é ’ VALOR FIM SE FIMALGORITMO exemplo 46 estrutura de repetição A necessidade de implantação de um loop (repetição) com número de iterações predefi- nido é denominada de estrutura de repetição. escolha y caso 0: Ler (x) sen(x) caso 1: Ler (x) cos(x) caso 2: Ler (x) tg(x) caso contrário: Ler (x) x = x + 1 fim escolha exemplo Um algoritmo que realiza a soma dos números de 1 a 20 terá um número de iterações predefinido (20), ou seja, irá executar 20 vezes. O loop (repetição) poderá ser implementado com qualquer estrutura de repeti- ção (enquanto e repita-até), mas, para isso, é importante que haja a utilização de um contador — variável de controle utilizada para contar quantas iterações foram executadas. exemplo 47 Estrutura de repetição com o “enquanto” Enquanto <condição> repetir <ações> 1. A referida <condição> é testada. Caso seja verdadeira, então executar <ações> e, em seguida, testar novamente a opção lógica. Este ciclo irá se repetir até que, em algum teste, a opção lógica resulte em um cenário falso. 2. Nesta estrutura, temos uma condição que determina se devemos continuar a repetir as ações quando o resultado for verdadeiro ou parar de repetir quando o resultado for falso. 3. É preciso garantir que o dado atrelado à condição tenha o seu valor sempre alterado por alguma das ações repetidas, caso contrário, não teremos um resultado falso no teste e, assim, a repetição permanecerá em um infinito ciclo loop. A estrutura de repetição para tem implementado um contador implícito. Sua forma estrutural: PARA <variável_de_contagem> DE <valor_de_inicio> ATE <valor_fim> [PASSO <valor_de_incremento>] FAÇA <instruções que serão executadas repetidamente até que a <variável_de_conta- gem> atinja o valor_fim> FIM-PARA ALGORITMO “maiorvalor” VAR maior, num: inteiro INICIO maior = 0 (o maior por enquanto é o menor valor) num = 1 Enquanto (num <> 0) repetir Ler num (aqui o valor de num muda, é a entrada do usuário) Se (num > maior) então maior = num Escrever maior (isto só executa quando o ciclo parar) FIMALGORITMO exemplo 48 O passo utilizado para o incremento é opcional. Esse recurso irá servir para definir qual valor o incremento do contador utilizará: de 1 em 1 (padrão), de 2 em 2, de 3 em 3 etc. Esta estrutura de repetição irá realizar o incremento de um determinado contador de forma implícita. A forma de inicialização de uma variável contadora é feita implicitamente, com o <va- lor_de_inicio> informado da declaração da estrutura PARA. A condição para executar a iteração é que o valor da variável_de_contagem não tenha atingido o <valor_fim>. E ao final de cada iteração, o valor da variável_de_contagem é incrementado em 1 (ou o valor declarado como PASSO ou <valor_de_incremento>). algoritmo “Fatorial” var num, fat, cont: inteiro inicio Escrever (“Digite o número para calcular o fatorial: “) Ler (num) fat = 1 cont = 1 ENQUANTO cont <= num FACA fatorial = fat * cont cont = cont + 1 FIMENQUANTO Escrever (“O fatorial de “, num, “ é : “, fat) fimalgoritmo exemplo 49 Perceba que foi necessário incrementar o contador de forma explícita (linha 16). Com a colocação da estrutura de repetição PARA, isso não é necessário. Vejamos, agora, o mesmo algoritmo implementado com o comando PARA. algoritmo “Fatorial” var num, fat, cont: inteiro inicio Escrever (“Digite o número para calcular o fatorial: “) Ler (num) fat = 1 PARA contador DE 1 ATE numero FACA fat = fat * cont FIMPARA Escrever (“O fatorial de “, num, “ é : “, fat) fimalgoritmo exemplo Para ampliar o seu conhecimento veja o material complementar da Unidade 2 disponível na midiateca. midiaTeca 50 Uma escola precisa que seus alunos desenvolvam um pseudocódigo para que seja calculado o somatório de duas notas. ALGORITMO “somanotas” VAR nota1, nota2, tot: real INICIO escrever “Digite a primeira nota” ler nota1 escrever “Digite a segunda nota” ler nota2 tot nota1 + nota2 escrever “A soma eh: ” escrever tot FIMALGORITMO na PráTica 51 resumo da unidade 2 Nesta unidade você estudou o uso dos respectivos fluxogramas para poder iniciar o pro- cesso de construção de um algoritmo. Contemplamos também a questão do uso do pseudocódigo para a realização de um ou mais programas sem a utilização efetiva de uma linguagem de programação, além de termos relativos às estruturas de controle e de repetição para a ampliação dos códigos. Fluxogramas, pseudocódigos, estruturas de controle e repetição. conceiTo 52 referências GUEDES, S. Lógica de programação algorítmica. São Paulo: Pearson Education do Bra- sil, 2015. Biblioteca Virtual. MENDES, F. V. Programação avançada em C++. São Paulo: Pearson Education do Brasil, 2006. Biblioteca Virtual. SZWARCFITER, J. L.; MARKEZON, L. Estruturas de dados e seus algoritmos. 3. ed. Rio de Janeiro: Gen - LTC, 2013. Minha Biblioteca. Entender os conceitos e aplicações da Linguagem C UNIDADE 3 54 Nesta unidade vamos conhecer os fundamentos do ambiente de programação em lin- guagem e entender como se dá a criação de uma determinada variável e seus tipos, veri- ficando o elo entre o trabalho com os respectivos tipos de dados utilizados nas variáveis e as operações aritméticas. Abordaremos como realizar a conversão de um pseudocódi- go em uma aplicação na Linguagem C com foco diferenciado na estrutura de repetição, permitindo a execução simultânea de um ou mais códigos até que uma ou mais condi- ções findem. inTrodução Nesta unidade você será capaz de: • Entender os conceitos e aplicações da Linguagem C. objeTiVo 55 comandos e operadores em c A linguagem de programação em C foi desenvolvida em um centro de pesquisas da empresa estaduni- dense Bell Laboratories, pelo professor Dennis Rit- chie, no ano de1972. Sua primeira utilização de grande importância foi a reescrita do sistema operacional UNIX, que, até en- tão, tinha o seu código-fonte escrito em assembly. A linguagem de programação em C é uma linguagem ampla, sendo direcionada para a programação estruturada. Contudo, é mais utilizada para analisadores léxicos, desenvol- vimento de compiladores, editores de texto, bancos de dados etc. sintaxes da Linguagem c As sintaxes existentes na Linguagem C são constituídas por regras muito bem detalha- das para que o processo de compilação seja exitoso e tudo aquilo que foi escrito possa ser plenamente identificado e redunde em um programa executável que atenda ao obje- tivo proposto. Essas regras são muito bem relacionadas com os seguintes propósitos: • Tipos. • Declarações. • Funções. • Expressões. A estrutura de um programa em Linguagem C é composta por: • Diretiva de compilação e biblioteca. • Definição de tipos de dados. • Protótipos de funções. • Funções. • Comentários. 56 a. Diretiva de compilação A diretiva de compilação deve ser iniciada com a palavra #include, sendo seguida de uma determinada biblioteca. b. Tipos e declarações Os tipos definem as respectivas propriedades dos dados manipulados em um programa. As declarações expressam as referidas partes do programa: • Dando significado a um identificador. • Permitindo a alocação de memória. • Definindo um conteúdo inicial. • Definindo as funções. c. Funções e expressões As funções especificam as ações que determinado programa irá executar. As determinações, as alterações de valores e as chamadas funções de I/O (input/output) serão definidas nas expressões. As funções são entidades operacionais básicasque têm um determinado propósito que, por sua vez, é a integração de uma ou mais funções, em que cada qual irá executar a sua atividade. #include <stdio.h> Diretiva de compilação utilizada para que haja um entendimento do que foi es- crito no programa. Caso contrário, o desenvolvedor poderia escrever qualquer palavra para ser executada. exemplo 57 Existem funções básicas que estão definidas na biblioteca stdio.h da linguagem de pro- gramação C, a saber: • Função printf() – Exibe informações na tela para o usuário. • Função scanf() – O usuário poderá fazer entrada de dados via teclado. O programador também poderá definir algumas novas funções em seus programas, como: • Rotinas para cálculos. • Leitura de arquivos textos. • Impressão. O programa desenvolvido na Linguagem C, obrigatoriamente, terá o seu início com a exe- cução da chamada função main() – função principal. d. Comentários Os comentários que o desenvolvedor precisar criar no programa para explicar ou definir algo que julgue importante serão colocados entre “/* e */”, não sendo considerados no processo de compilação. Cada instrução do programa em Linguagem C deverá ser encerrada com “;” (ponto e vír- gula) — que é parte obrigatória da maioria dos comandos. O “;” determina que a instrução terminará neste momento. É obrigatória a existência da função main() no programa principal. observação 58 identificadores São nomes utilizados para se fazer uma referência a variáveis, funções, rótulos, labels e vários outros objetos que podem ser definidos pelo programador. É necessário que o primeiro caractere definido seja uma letra ou um sublinhado. A Linguagem C trabalha como formato de “case sensitive” — as letras minúsculas dife- rem das letras maiúsculas, o que pode causar problemas no processo de complicação do programa. main() /* função obrigatória */ { printf(“Bom dia!”); /* função para exibir informação na tela */ printf(“Seja bem-vindo!”); } exemplo Os 32 primeiros caracteres de um identificador são de grande relevância. observação int x; /* é diferente de int X;*/ Ao realizarmos a declaração de uma variável denominada “valor”, ela será dife- rente de “Valor”, “VALOR” ou “VaLor”. Isso também se aplica para comandos e funções. exemplo 59 Variáveis utilizadas na Linguagem C A variável sempre terá determinado local na memória do computador para que determi- nado dado seja armazenado. Funciona como se fosse uma caixa guardando determinado dado que: • Pode ser acessado em um momento do programa. • Pode ser utilizado para a realização de um cálculo. Toda variável precisa ter um identificador, ou seja, um nome que a identifique dentro do programa, pois por meio desse nome é que o programador poderá fazer uso dela em suas instruções. Além da necessidade de ter um nome, a variável também precisará da identificação de um tipo de dado. O tipo de dado atribuído a uma variável determina o que ela é capaz de armazenar em termos de dados. Variáveis e constantes Variáveis e constantes são os elementos básicos que um programa pode manipular em tempo de execução. Variáveis Pequenos espaços criados para alocar dados na memória de um computador — esses dados podem ser modificados durante a execução de um programa. Constantes Pequenos espaços alocados na memória do computador para armazenar infor- mações que NÃO serão modificadas no decorrer da execução do programa. Nomes das variáveis Existem algumas regras básicas para regular a nomenclatura das variáveis. • O nome só poderá ter letras e dígitos. • O caractere “_” pode ser usado, pois é tido como uma letra. • O primeiro caractere precisa, necessariamente, ser uma letra. • As letras minúsculas e maiúsculas são caracteres diferentes. 60 É fundamental que a escolha dos nomes das variáveis tenha um significado e indique sua finalidade — como valor, soma, total, nome ou raio. Variáveis locais e globais A variável local é declarada dentro da estrutura de uma função específica, podendo ser a função main() ou outra função criada. Palavras reservadas oriundas da Linguagem C não podem, em hipótese algu- ma, ser usadas no nome das variáveis a serem criadas. São palavras reservadas da Linguagem C: auto / break / case / char / const / continue / default / do / double / else / extern / for / float / short / struct / union / unsigned / void / while. importante Somente pode ser utilizada em tempo de execução por aquela função que rece- beu a declaração e por nenhuma outra. observação Variável local #include <stdio.h> main () { int a; // variável declarada como LOCAL (está após a função main()) a = 3; } exemplo 61 A variável global é declarada após a diretiva de compilação “#include <stdio.h” e será usada em todas as funções que fazem parte do programa. Vejamos também um exemplo de declaração de variáveis constantes: Variável global #include <stdio.h> int a; // variável declarada como GLOBAL (está antes da função main()) main () { a = 3; } exemplo #include <stdio.h> #define icms 0.18; //declaração da constante main() { float preco_produto, valor_icms; // declaração variável local preco_produto = 50; valor_icms = preco_produto * icms; printf(“Valor de imposto a ser pago: R$ %f”, valor_icms); } exemplo 62 Tipos de dados Os dados poderão assumir cinco tipos básicos na linguagem de programação C, a saber: • char. • int. • float. • double. • void. Conheça a definição de cada um deles. char (caractere) O valor armazenado é um caractere. Cabe ressaltar que um valor numérico, quando armazenado em um caractere, perde o seu poder de realização de cálculo. A placa de um veículo é um bom exem- plo: “TGL8F92”. int (número inteiro) Tipo de dado utilizado para a representa- ção de informações numéricas dentro do programa. float Número em ponto flutuante de precisão simples caracterizado, normalmente, como número real. É utilizado para trabalhar com valores em moedas (R$ 567,89), notas de uma prova (9,6) etc. double Número em ponto flutuante de precisão dupla utilizado para trabalhar com valo- res decimais que demandam um número maior de armazenamento de informa- ções. Exemplo: R$ 1.000.000.000,00. Void Tipo de dado utilizado para denotar que um resultado, quando não tiver um tipo de dado definido, terá seu valor ligado ao void. Aplicações desse propósito criam um tipo vazio que poderá, posteriormente, ser modificado ao longo da execução do programa para um dos outros tipos (char, int, float ou double). 63 operadores Vejamos, agora, alguns tipos de operadores. 1. Operadores relacionais Operadores relacionais = atribuição != Diferente > maior < menor <= menor igual >= maior igual == igual % resto da divisão entre números inteiros 2. Operadores lógicos Operadores lógicos && and (e) || or (ou) ! not (não) 3. Operadores aritméticos Aritmético Operação Prioridade + Adição 5 – Subtração 5 % Resto da divisão 4 * Multiplicação 3 / Divisão 3 64 4. Operadores e expressões As expressões combinam operandos e operadores para produzir um único resultado. 5. Operadores de atribuição ( = ) O valor da expressão da direita é atribuído à variável da esquerda. 6. Operadores aritméticos ( * , / , % , + , - ) declarando variáveis Vejamos como uma variável deve ser declarada em um programa de Linguagem C. É preciso definir: • O tipo de dado. • Atrelado ao tipo de dado, o nome da variável a ser utilizado. a + b * c – d exemplo soma = a + b; a = b = c = d = 10; exemplo a = 3 + 2 * (b = 7/2); b = 7 / 2 e a = 3 + 2 * b printf (“%d”, -3 + 4 * 5 – 6) 11 exemplo 65 É possível que, na mesma linha de instrução, seja colocada mais de uma variável — des- de que todas sejam do mesmo tipo. #include <stdio.h> main() { int val; double salario; int num, soma, total; } atribuição de valores às variáveis Agora, vamos entender como uma variável recebe um valor fixo dentro da função principal. A variável dias, que tem o tipo de dado int, recebe em tempo deexecução o valor 30. #include <stdio.h> main() { int dias; dias = 30; } Porém, como uma variável recebe um valor fixo dentro da função principal? A variável num — que tem o tipo de dado int — recebe em tempo de execução o valor 28 no mesmo momento em que é declarada. Já a variável cep recebe o valor 22786021 após ter sido declarada. #include <stdio.h> main() { int num = 28, cep; cep = 22786021; } 66 função de saída a. Função printf() Com base na função printf(), a qual está contida também no arquivo stdio.h, poderemos exibir informações na tela do computador. Sintaxe printf (“Expressao”); ou printf (“Expressao” , lista de argumentos); printf (“Volta ao Mundo!”); exemplo Expressão Mensagens que serão exibidas. Lista de argumentos Pode conter identificadores de variáveis, expressões aritméticas ou lógicas e valo- res constantes. b. Impressão de tipos de dados e caracteres especiais Código Tipo Elemento Armazenado %c char Um único caractere. %s char Uma cadeia de caracteres. %d ou %i int Um inteiro. %f flout Um número em ponto flutuante. %lf double Ponto flutuante com dupla precisão. 67 Código Ação \n Leva o cursor para a próxima linha. \t Executa uma tabulação. \b Executa um retrocesso. \f Leva o cursor para a próxima página. \a Emite um sinal sonoro (beep). \” Exibe o caractere ". \\ Exibe o caractere \. %% Exibe o caractere %. Para cada impressão de tipo de dados, deve haver uma variável na função printf(). observação #include <stdio.h> main() { int dias; dias = 30; printf (“Volta ao Mundo em %d dias”, dias); } #include <stdio.h> main() { int num, cep; num = 28; cep = 22786021; printf (“A casa de número %d tem o CEP %d”, num, cep); } exemplo 68 funções de entrada de dados a. Função scanf() Complemento da função printf(), a função scanf() permite a leitura de dados formatados da entrada padrão (via teclado) realizado pelo usuário do sistema. A lista de argumentos utilizada na função scanf() deverá consistir nos endereços das variáveis armazenados na memória do computador. A Linguagem C oferece um operador de endereço de memória que é referenciado pelo símbolo &. O operador de endereço & é usado para fazer o endereçamento de memória da infor- mação armazenada na variável — quando a informação for necessária para utilização, a Linguagem C já saberá em qual endereço buscá-la. Sintaxe scanf (“impressão de tipo de dado”, &variavel); O símbolo & deverá ser usado sempre que a função scanf() for utilizada. O seu uso é obrigatório quando formos tratar com as variáveis do tipo char, int e float. observação 69 b. Função gets() Permite a entrada de dados via teclado para o caso de o usuário ter necessidade de es- crever uma frase e utilizar espaço entre as palavras. Sintaxe gets (variavel); int val; scanf (“%d”, &val); %d indicativo do tipo, neste caso, do tipo inteiro & operador utilizado para obter o endereço de memória da variável val variável que receberá a informação via teclado exemplo #include <stdio.h> main () { char nome[30]; gets (nome); } exemplo A função gets() não funciona para variável do tipo char que não tenha quanti- dade de caractere. observação 70 conversão de tipo de dados É comum que precisemos converter um determinado tipo de dado. Assim, é preciso con- verter o valor que está na variável. A conversão é realizada colocando-se o tipo desejado antes do valor que queremos converter. Trabalhando com strings a. Função strcmp A função que devemos utilizar para comparar o conteúdo de uma string é a função str- cmp(), que está definida na biblioteca string.h. #include <stdio.h> main() { float var1 = 0; int var2 = 10; var1 = float (var2); // realiza a conversão do valor inteiro para float printf (“\nO Valor com decimal eh: %f”, var1); int var3 = 0; float var4 = 0; var4 = 15.33; var3 = int (var4); // realiza a conversão do valor float para inteiro printf (“\nO Valor Inteiro eh: %d”, var3); } exemplo 71 Sintaxe strcmp (variavel_1, variavel_2); ou strcmp (variavel, “informação”) Verifica-se se a variavel_1 e variavel_2 são variáveis do tipo char que devem ser comparadas. A função strcmp() irá proceder com o retorno do valor zero, um ou menos um: • Quando os conteúdos comparados forem iguais, a função retorna 0. • Quando os conteúdos comparados forem diferentes, a função retorna um ou menos um. A função strcmp() irá comparar se os conteúdos são iguais, e não se têm o mesmo tamanho. observação Exemplo 1 #include <stdio.h> #include <string.h> main() { char palavra[7]; printf (“Digite a palavra: ”); scanf (“%s”, &palavra); if (strcmp (palavra, “pequeno”) == 0) printf(“informação correta!”); else printf(“informação incompatível!”); } exemplo 72 b. Função strlen A função strlen() retorna o tamanho da string fornecida, ou seja, a quantidade numérica de caracteres daquela informação digitada. O terminador nulo “\0” não é contado. Isso quer dizer que o comprimento do vetor da string deve ser um a mais que o inteiro retor- nado por strlen(). Para o uso da função, é preciso que a biblioteca <string.h> seja declarada. Sintaxe strlen (variavel); Exemplo 2 #include <stdio.h> #include <string.h> main() { char palavra_I[7], palavra_II[7]; printf (“Digite a primeira palavra: ”); scanf (“%s”, &palavra_I); printf (“Digite a segunda palavra: ”); scanf (“%s”, &palavra_II); if (strcmp (palavra_I, palavra_II) == 0) printf(“informação correta!”); else printf(“informação incompatível!”); } 73 c. Função strcpy Esta função é utilizada quando há a necessidade de inserir uma informação na variável do tipo char — só funciona para variável do tipo char. Para o uso da função, é preciso que a biblioteca <string.h> seja declarada. Sintaxe strcpy (str1, “informação”); #include <stdio.h> #include <string.h> main () { int tam; char nome[50]; printf (“Entre com um nome: “); gets (nome); tam = strlen (nome); printf (“\nO nome digitado tem tamanho %d”, tam); } exemplo #include <stdio.h> #include <string.h> main() { char str1[40], str2[10]; strcpy (str1, “TESTE”); // copia para a variável str1 o conteúdo TESTE printf (“A palavra eh: %s”, str1); } exemplo 74 estruturas de controle e repetição em c a. if() Nesta estrutura de decisão, uma única condição (expressão lógica) será avaliada: • Caso o resultado oriundo dessa avaliação seja verdadeiro (V), então um determina- do conjunto de instruções (comandos compostos) será executado. • Caso contrário, ou seja, quando o resultado da avaliação for falso (F), nada será executado, e o fluxo de execução seguirá para o primeiro comando após a finaliza- ção da estrutura. Sintaxe if (<condição>) // caso a expressão verificada retorne verdadeiro { <comando>; <comando>; <comando>; } 75 b. if() else Nessa estrutura de decisão, uma única condição (expressão lógica) é plenamente avaliada: • Se o resultado dessa avaliação for verdadeiro (V), então um determinado conjunto de instruções (comandos compostos) será executado. • Caso contrário, ou seja, quando o resultado da avaliação for falso (F), um comando diferente será executado. Após a execução de uma das partes (verdadeira ou falsa), o fluxo de execução seguirá para o primeiro comando após o fim da estrutura. Sintaxe if (<condição>) // caso a expressão verificada retorne verdadeiro { <comando>; <comando>; <comando>; } else // caso a expressão verificada retorne falso { <comando>; <comando>; } c. if() else if() Estrutura utilizada para a aplicação de mais de uma estrutura de decisão. É comum que o desenvolvedor tenha que verificar mais de uma condição dada à deman- da surgida. Para isso, ele aplica a estrutura do else if em vez de, após o else, inserir na linha seguinte o comando if, que pertence à estrutura do else. Isso daria mais trabalho e poderia também atrapalhar o desenvolvedor na hora de fazer uma determinada revisão em seu código. 76 Sintaxe if (<condição>) // caso a expressão verificadaretorne verdadeiro { <comando>; <comando>; } else if (<condição>) // caso a expressão verificada retorne falso, o desenvolve- dor também poderá fazer uma nova condição com o uso do else if. { <comando>; <comando>; } d. encadeamento de if() ou if() aninhados Permite ao desenvolvedor utilizar uma estrutura if para tratar uma situação e, dentro dessa estrutura já estabelecida, inserir uma nova estrutura de if para obter diversas res- postas possíveis e atender à demanda. É muito comum o desenvolvedor se deparar com esse tipo de situação no desenvolvimento de aplicações. 77 #include <stdio.h> main() { int idade = 0; printf (“Informe sua idade: “); scanf (“%d”, &idade); if (idade < 18) { if (idade < 15) printf (“Infantil.”); else printf (“Adolescente”); } else if (idade < 66) printf (“Adulto”); else printf (“Idoso”); } exemplo Se houver mais de uma linha de instrução que pertença ao if ou ao else, será fundamental que haja a abertura e o fechamento das chaves “{}”. Caso con- trário, apenas a primeira linha de instrução estará ligada ao if ou ao else. A segunda linha estará fora dessa estrutura de decisão e será executada inde- pendentemente da referida estrutura de decisão, causando um erro de lógica no programa. importante 78 Vejamos, a seguir, um exemplo de encadeamento de if(). Programação correta #include <stdio.h> int main () { int num; printf (“Digite um numero: “); scanf (“%d”, &num); if (num > 10) { printf (“\nO numero e maior que 10”); printf (“\nObrigado por digitar um numero valido!”); } return(0); } Programação com erro #include <stdio.h> int main () { int num; printf (“Digite um numero: “); scanf (“%d”, &num); if (num > 10) printf (“\nO numero e maior que 10”); printf (“\nObrigado por digitar um numero valido!”); // mesmo es- tando posicionado dentro do if o printf acima não pertence ao if. Será executa- do independentemente de a variável num ser ou não maior que 10. return(0); } exemplo 79 e. comando while O comando while faz com que uma ou mais instruções existentes dentro da estrutura de repetição (simbolizada pela abertura e pelo fechamento das chaves) sejam executadas por diversas vezes até que a condição estabelecida não seja mais satisfatória. Em outras palavras, essa estrutura é executada enquanto a condição estabelecida não atinge o seu cenário estabelecido. Ou seja, faz a verificação da condição antes que o laço seja executado. Enquanto for verdadeira a condição, o conjunto de códigos se repete com um determina- do propósito a ser alcançado. Sintaxe while (condição) { <comando>; <comando>; } Exemplo 1 main() { int i; i = 0; while (i<=5) // (i <=5) é a condição. Quantas vezes a estrutura irá repetir. { printf(“Número %d\n”, i); i++; // contador. A cada passagem, o i é incrementado com mais 1. } } exemplo 80 Exemplo 2 #include<stdio.h> main() { int i; i = 3; while (i > 0) // (i > 0) é a condição. Quantas vezes a estrutura irá repetir. { printf(“Número %d\n”, i); i--; // contador. A cada passagem o i é decrementado com menos 1. Ou seja, o valor retroage. } } Exemplo 3 #include <stdio.h> main() { int i, x; i = 0; x = 1; while ((i<=5) || (x < 3)) { printf(“Valor de i eh: %d\n”, i); printf(“Valor de x eh: %d\n”, x); i++; x++; } } No exemplo acima, a primeira condição que atingir seu valor fará com que a estrutura de repetição pare de executar. observação 81 f. comando for O comando for pode ser visto em todas as linguagens procedurais de programação. Ele trabalha com uma condição na sua estrutura, que é uma expressão de relação que testa a variável de controle do loop contra alguma informação ou valor para definir quan- do a estrutura de execução das instruções terminará. O incremento definirá a forma como a variável de controle do laço (loop) será modificada cada vez que o computador repetir o laço. Sintaxe for (inicialização; condição; incremento) { <comando>; <comando>; <comando>; } main () { int i, idade; for (i=0; i<=5; i++) // controla a inicialização, a condição e o incremento. { printf (“ Digite uma idade”); scanf (“%d”, &idade); printf (“A idade digitada foi %d \n”); } } exemplo 82 Veja a seguir a diferença entre o comando while e o comando for: #include <stdio.h> main () { int i, idade; i = 0; while (i<=3) { printf (“Digite uma idade”); scanf (“%d”, &idade); i++; } } #include <stdio.h> main () { int i, idade; for (i=0; i<=3; i++) { printf (“Digite uma idade”); scanf (“%d”, &idade); } } 83 convertendo português estruturado para Linguagem c É muito comum que, no início do proces- so de aprendizagem da programação, seja utilizado o pseudocódigo para re- presentar a demanda estabelecida. Isso se dá pelo fato de podermos trabalhar com uma linguagem escrita em nossa língua nativa: o português. Com o amadurecimento no aprendizado da linguagem de programação C, ganhamos confiança e, assim, podemos realizar a criação do código diretamente na própria lingua- gem, deixando de lado o pseudocódigo. Tabela de conversão do pseudocódigo para a Linguagem C PSEUDOCÓDIGO LINGUAGEM C inicoalgoritmo main() inteiro, real, caractere Int, float, char leia () printf() escreva (" ") scanf() = se ... entao ... senao ... fim se If else Enquanto (condição) repetir While (condição) para <variável contadora> de <valor inicial> ate <valor final> [passo <valor de incremento>] faça for( inicialização do contador; condição; incremento do contador) Vejamos, a seguir, algumas programações. 84 1. Fazer um pseudocódigo para atribuir valores às variáveis declaradas inicioalgoritmo var n: inteiro x: real y : caractere inicio n 10 x 3,8 n “s” fimalgoritmo Programa construído na Linguagem C #include <stdio.h> int main() { int n; float x; char y; n = 10; x = 3.8; n = ‘s’; return 0; } 2. Fazer um pseudocódigo para verificar se o valor digitado é maior do que 10. inicioalgoritmo var n: inteiro inicio escrever (“Digite um numero”) ler (n) se (n > 10) então escrever (“Numero digitado maior que 10”) senão escrever (“Numero digitado menor que 10”) fimalgoritmo Programa construído na Linguagem C #include <stdio.h> int main() { int n; printf(“Digite um numero: ”); scanf(“%d”, &n); if (n > 10) printf(“Numero maior que 10”); else printf(“Numero menor que 10”); return 0; } 85 3. Fazer um pseudocódigo para criar um programa de uma calculadora utilizando as quatro operações básicas. inicoalgoritmo var n1, n2, n3: real operaçao: inteiro Inicio escreval (“digite os valores dos tres operadores”) leia(n1,n2,n3) escreval(“menu”) escreval(“1-subtraçao”) escreval(“2-soma”) escreval(“3-multiplicaçao”) escreval(“4-divisao”) escreval(“5-resto da divisao”) escreval(“6-coeficiente da divisao”) escreval() escreval(“escolha uma opçao”) leia(opção) escolha(opção) caso1: escreval (“a subtraçao é:”,(n1-n2-n3)) caso2: escreval (“a soma é:”,(n1+n2+n3)) caso3: escreval (“a soma é:”,(n1*n2+*n3)) caso4: se((n1==0) e (n2!=0) e (n3!=0) então escreval (“ a divisao do primeiro operando pelo segundo é”,n1/n2) escreval (“ a divisao do segundo operando pelo terceiro é”,n2/n3) escreval (“ a divisao do primeiro operando pelo terceiro é”,n1/n3) escreval (“ a divisao do terceiro operando pelo segundo é”,n3/n2) caso5: escreval(“o resto da divisao é:”,n1 mod n2) caso6: escreval(“o quociente da divisao é”,n1 div n2) fim_escolha fim_algoritmo 86 Programa construído na Linguagem C #include <stdio.h> int main() { float n1, n2, n3; int opcao; printf(“digite os valores dos tres operadores “); scanf(“%f%f%f”,&n1,&n2,&n3); printf(“menu\n”); printf(“1-subtracao\n”);printf(“2-soma\n”); printf(“3-multiplicacao\n”); printf(“4-divisao\n”); printf(“5-resto da divisao\n”); printf(“6-coeficiente da divisao\n”); printf(“escolha uma opcao “); scanf(“%d”,&opcao); switch(opcao){ case 1: printf(“a subtraçao eh: %.2f\n”,(n1 - n2 - n3)); break; case 2: printf (“a soma eh: %.2f\n”,(n1 + n2 + n3)); break; case 3: printf(“a multiplicacao eh: %.2f\n”,(n1 * n2 * n3)); break; case 4: if((n1==0) && (n2!=0) && (n3!=0)) { printf(“ a divisao do primeiro operando pelo segundo eh %.2f\n”,n1/n2); printf(“ a divisao do segundo operando pelo terceiro eh %.2f\n”,n2/n3); printf(“ a divisao do primeiro operando pelo terceiro eh %.2f\n”,n1/n3); printf(“ a divisao do terceiro operando pelo segundo eh %.2f\n”,n3/n2); } break; case 5: printf(“o resto da divisao eh: %.2f\n”,(int)n1 % (int)n2); break; case 6: printf(“o quaciente da divisao eh %.2f\n”,n1/n2); break; return 0; } 87 4. Fazer um programa utilizando o pseudocódigo para que o usuário possa digitar cinco vezes um número que possa ser somado — para isso, faz-se necessário o uso de uma estrutura de repetição. InicioAlgoritmo Variaveis numero: inteiro soma, i : inteiro Inicio para i de 1 ate 5 faca escreval (“Digite um número”); leia(numeros[i]); soma soma + numeros[i]; fimpara FimAlgoritmo Programa escrito na Linguagem C #include <stdio.h> main() { int números, soma, i; for(i = 0; i < 5; i++) { printf(“Digite um numero : “); scanf(“%d”, &numeros[i]); soma = soma + numeros[i]; } printf(“\nMedia : %d \n\n”, soma); } Para ampliar o seu conhecimento veja o material complementar da Unidade 3 disponível na midiateca. midiaTeca 88 Uma empresa ligada à área de economia demanda a construção de um algorit- mo que demonstre todos os números ímpares de 1 até 100. #include <stdio.h> int main() { int count = 1; while (count <= 100) { if(count%2 != 0) printf(“%d “, count); count++; } } na PráTica 89 resumo da unidade 3 Nesta unidade você conheceu, na íntegra, a linguagem de programação C e aprendeu como utilizar toda a sua estrutura para o processo de compilação. Vimos, também, como transformar um pseudocódigo em um real programa na Linguagem C para atender aos objetivos estabelecidos da demanda de um usuário. Íntegra do entendimento da Linguagem C e suas respectivas aplicações. conceiTo 90 referências GUEDES, S. Lógica de Programação Algorítmica. São Paulo: Pearson Education do Bra- sil, 2015. Biblioteca Virtual. MENDES, F. V. Programação Avançada em C++. São Paulo: Pearson Education do Brasil, 2006. Biblioteca Virtual. SZWARCFITER, J. L.; MARKEZON, L. Estruturas de dados e seus algoritmos. 3. ed. Rio de Janeiro: Grupo GEN; LTC, 2013. Minha Biblioteca. Vetores, matrizes e manipulação de arquivos UNIDADE 4 92 Conhecer os fundamentos para uma efetiva manipulação de informações com vetores e matrizes em Linguagem C e entender como a utilização e a manipulação das tratativas com o uso de um arquivo em Linguagem C para o manuseio e a leitura de informações são necessidades fundamentais em demandas mercadológicas. inTrodução Nesta unidade você será capaz de: • Construir estruturas com ordenação lógica com o emprego de estruturas com uso de índices e acesso a arquivos. objeTiVo 93 Vetores (arrays) Nas mais variadas situações para o desenvolvimento de um programa em Linguagem C, teremos os tipos básicos de da- dos (int, float, char) que atenderão à demanda do programa sem a necessidade de criação de um vetor ou matriz. No entanto, quando temos a necessidade de armazenar infor- mações e, ao mesmo tempo, ter acesso a esse referencial, é necessária a criação de vetor ou matriz, isso porque o vetor e a matriz armazenam dentro de uma mesma estrutura as informações necessárias para acesso a um determinado denominador. É obrigatório que o vetor possua um tipo de dado, um nome e uma quantidade de po- sições a serem ocupadas. Uma vez que se define o tipo do vetor, apenas informações daquele tipo poderão ser armazenadas. Para isso, é fundamental entender para qual fim se destina o vetor. Sintaxe: tipo_primitivo identificador[qtde_elementos]; Exemplo de vetor com tipo int: int dados[6]; Vetor com seis elementos do tipo int. Os índices do vetor vão de 0 a 5. dados Nome do vetor. Como exemplo, podemos utilizar um aluno que possua três notas. O nome do vetor seria aluno, e, para cada nota, seria uma posição do vetor. Assim, teríamos float nota[3], em que float é o tipo de informação que será armazena, nota é o nome do vetor e [3] é a quantidade de posições do vetor. exemplo 94 índices 0 1 2 3 4 5 dados 12 37 49 21 67 30 Os valores 12, 37, 49, 21, 67 e 30 se referem ao conteúdo do vetor “dados”. Informações no vetor: dados[2]: nessa posição do vetor temos o valor 49. dados[5]: nessa posição do vetor temos o valor 30. Exemplo: int val; val = dados[0]; A variável “val” recebe o conteúdo de valor 12, pois dados[0] carrega o valor 12 no vetor. Exemplo de um vetor com tipo char: char vet[6]; Vetor com seis elementos do tipo char. Os índices vão de 0 a 5. vet Nome do vetor. índices 0 1 2 3 4 5 vet A L V A R O Os valores A, L, V, A, R e O referem-se ao conteúdo do vetor de nome “vet”. Para vetores do tipo char, apenas é armazenado um caractere por posição. observação 95 Informações no vetor: dados[1]: nessa posição do vetor temos o valor L. dados[3]: nessa posição do vetor temos o valor A. declarando e inicializando vetores Exemplo 1: É possível declarar e inicializar um vetor com um tamanho constante, como a seguir: int numeros[5] = {10, 20, 30, 40, 50}; char palavra[9] = {‘c’, ‘a’, ‘d’, ‘e’, ‘i’, ‘r’, ‘a’}; Exemplo 2: Iniciando apenas alguns elementos do vetor: int valores[5] = {2,4,6}; será equivalente a int valores[5] = {2,4,6,0,0}; Isso ocorre porque apenas alguns itens do vetor foram inicializados. Nesse caso, quando o número de itens inicializados é menor que o número total de itens do vetor, os itens não inicializados são automaticamente zerados. Exemplo 3: Inicializando um vetor sem especificar a quantidade de elementos. int valores[] = {3,5,7}; Exemplo de um programa com uso de vetor: #include<stdio.h> main() { float notas[5] = {7, 8, 9.5, 9.9, 5.2}; // declarando e inicializando o vetor notas. printf (“Exibindo os Valores do Vetor \n\n”); printf (“notas[0] = %.1f\n”, notas[0]); printf (“notas[1] = %.1f\n”, notas[1]); printf (“notas[2] = %.1f\n”, notas[2]); printf (“notas[3] = %.1f\n”, notas[3]); printf (“notas[4] = %.1f\n”, notas[4]); } 96 Explicação do código Para fazer referência a uma determinada posição do vetor, devemos utilizar o nome do array e seu respectivo índice. Por exemplo: notas[0] faz referência ao elemento armazenado no vetor notas posição (índice) zero. Para exibir esse elemento na tela, usamos: printf(“notas[0] = %.1f\n”, notas[0]); inserindo dados no vetor com o comando while Exemplo: main() { int vet[4]; int i; i = 0; while (i<=3) // rotina para preencher o vetor. { printf(“Digite o numero: \n”); scanf(“%d”, &vet[i]); i++; } i = 0; while (i<=3) // rotina para exibir o conteúdo do vetor. { printf(“Numero %d\n”, vet[i]); i++; } } 97 inicializando vetor • Inicializando o vetor com lixo nas posições a serem ocupadas: #include <stdio.h> int main() { int lixo[10]; // não inicializou o vetor com zero. O programa levará lixo para dentro do vetor. int indice = 0; while(indice < 10) { printf(“Lixo na posicao %d: %d\n”, indice, lixo[indice]);
Compartilhar