Documente Academic
Documente Profesional
Documente Cultură
PREFCIO
Bem-vindo disciplina de Introduo Cincia da Computao do curso de Tecnologia em Sistemas de Informao da UDESC. Neste novo mundo, para muitos que aqui ingressaram, eis que aqui est uma das disciplinas mais complexas da primeira fase, principalmente por se tratar de algo fora do convencional, lecionado em salas de aula normais. Esta diferena d-se justamente por se tratar da disciplina-base do curso, pois aqui que vocs aprendero a programar, ou seja, todo o contedo adquirido nesta disciplina os acompanhar para o resto de suas vidas, caso vocs permaneam na rea de programao. Um auxlio, tanto para ns professores, que podemos dinamizar as aulas e cumprir o contedo dentro do prazo estipulado com uma maior gama de exemplos e aulas prticas, como para vocs alunos, que tem em mos um resumo do contedo, com exemplos e vrios exerccios para serem feitos. Exerccios estes que so a chave para o sucesso do acadmico no curso, pois so mais de 130 exerccios de lgica, alm dos exerccios avaliativos e exerccios extras que no se encontram neste material que so aplicados durante o semestre. Mas mesmo com a apostila e fazendo todos os exerccios, o acadmico somente ter o seu diferencial caso ele pesquise na rede, em livros, em apostilas e faa algo mais, no somente o que lhe foi pedido, o que lhe foi mandado, pois assim ele ser apenas mais um dentre vrios acadmicos que se formam a cada semestre. Enfim, o sucesso depende de cada um, de seu esforo e sua vontade, no somente aqui na universidade, mas em todas as reas da vida.
SUMRIO
PREFCIO ......................................................................................................................................................... 2 UNIDADE 1 - INICIAO AOS COMPUTADORES ..................................................................................... 6 1.1 - HISTRICO DA COMPUTAO ....................................................................................................... 6 1.1.1 - Fatos e Personagens Histricos ....................................................................................................... 6 1.1.2 - Evoluo da Eletrnica.................................................................................................................... 7 1.1.3 - Geraes de Computadores ............................................................................................................. 8 1.2 - APRESENTAO DE UM MODELO DE COMPUTADOR .............................................................. 9 1.2.1 - Introduo ....................................................................................................................................... 9 1.2.2 - Definio e Origem do termo Informtica....................................................................................... 9 1.2.3 - Elementos e Conceitos Fundamentais ............................................................................................. 9 1.2.4 - Hardware ....................................................................................................................................... 10 1.2.5 - Software ........................................................................................................................................ 10 1.3 - UNIDADES BSICAS DO COMPUTADOR DIGITAL ................................................................... 11 1.4 - UNIDADE CENTRAL DE PROCESSAMENTO ............................................................................... 11 1.4.1 - Unidade de Controle (UC) ............................................................................................................ 12 1.4.2 - Unidade Lgico-Aritmtica (ULA) ............................................................................................... 12 1.5 - MEMRIA PRIMRIA E SECUNDRIA ........................................................................................ 12 1.5.1 - Memria Primria (ou Principal) .................................................................................................. 12 1.5.2 - Memria Secundria (ou Auxiliar) ................................................................................................ 13 1.6 - PERIFRICOS OU MEIOS DE ENTRADA E SADA ...................................................................... 13 1.6.1 - Dispositivos de Entrada ................................................................................................................. 14 1.6.2 - Dispositivos de Sada .................................................................................................................... 14 1.7 - NOES DE SISTEMA OPERACIONAL......................................................................................... 14 1.8 - NOES BSICAS DE REDE LOCAL ............................................................................................ 15 UNIDADE 2 - INTRODUO PROGRAMAO .................................................................................... 17 2.1 - CONCEITO DE ALGORITMO .......................................................................................................... 17 2.2 - APRESENTAO DE UMA LINGUAGEM HIPOTTICA............................................................. 17 2.2.1 - Descrio Narrativa ....................................................................................................................... 17 2.2.2 - Fluxograma Convencional............................................................................................................. 18 2.2.3 - Pseudocdigo ................................................................................................................................ 20 2.3 - SOLUO DE PROBLEMAS ATRAVS DO COMPUTADOR HIPOTTICO ............................. 21 2.4 - ERROS ................................................................................................................................................. 21 UNIDADE 3 - FERRAMENTAS DE PROGRAMAO............................................................................... 24 3.1 - EDITOR ............................................................................................................................................... 24 3.2 - INTERPRETADOR ............................................................................................................................. 24 3.3 - COMPILADOR ................................................................................................................................... 24 3.4 - LINK EDIO .................................................................................................................................... 25 3.5 - DEPURADOR DE PROGRAMA ........................................................................................................ 25 3.6 - AMBIENTE INTEGRADO ................................................................................................................. 26 3.7 - BIBLIOTECAS .................................................................................................................................... 26 UNIDADE 4 - INTRODUO LINGUAGEM DE PROGRAMAO ..................................................... 28 4.1 - TIPOS DE DADOS PRIMITIVOS ...................................................................................................... 28 4.1.1 - Dados Numricos Inteiros ............................................................................................................. 28 4.1.2 - Dados Numricos Reais ................................................................................................................ 28 4.1.3 - Dados Literais ............................................................................................................................... 29 4.1.5 - Conceito e Utilidade de Variveis ................................................................................................. 30 4.1.6 - Definio de Variveis em Algoritmos ......................................................................................... 31 4.1.7 - Expresses ..................................................................................................................................... 33 4.2 - OPERADORES ARITMTICOS ........................................................................................................ 33 4.2.1 - OPERADORES ARITMTICOS ................................................................................................. 34 4.3 - OPERADORES LGICOS.................................................................................................................. 35 4.4 - OPERADORES RELACIONAIS ........................................................................................................ 35
3
UNIDADE 5 - ESTRUTURAS DE CONTROLE............................................................................................ 39 5.1 - ESTRUTURAS SEQNCIAIS ......................................................................................................... 39 5.1.1 - Instrues Primitivas ..................................................................................................................... 40 5.1.2 - Instruo Primitiva de Atribuio ................................................................................................. 40 5.1.3 - Instruo Primitiva de Sada de Dados .......................................................................................... 42 5.1.4 - Instruo Primitiva de Entrada de Dados ...................................................................................... 43 5.2 - ESTRUTURAS DE SELEO ........................................................................................................... 46 5.2.1 Estruturas de Deciso do Tipo Se .................................................................................................... 47 5.2.2 - Estruturas de Deciso do Tipo Escolha ......................................................................................... 49 5.3 - ESTRUTURAS DE REPETIO ....................................................................................................... 51 5.3.1 ESTRUTURA PARA ...................................................................................................................... 51 5.3.1 ESTRUTURA ENQUANTO .......................................................................................................... 52 5.3.3 ESTRUTURA FAA-ENQUANTO ............................................................................................... 53 5.3.4 Exerccios ........................................................................................................................................ 55 UNIDADE 6 VARIVEIS INDEXADAS.................................................................................................... 60 6.1 - Introduo ............................................................................................................................................ 60 6.2 - Operaes Bsicas com Variveis Indexadas ....................................................................................... 60 6.2.1 - Atribuio ...................................................................................................................................... 61 6.2.2 - Leitura ........................................................................................................................................... 61 6.2.3 - Escrita............................................................................................................................................ 62 6.3 - Matrizes Unidimensionais (Vetores) .................................................................................................... 63 6.3.1 Mtodos de Pesquisa Seqencial .................................................................................................. 66 6.3.2 Mtodo de Pesquisa Binria ......................................................................................................... 67 6.3.3 Mtodo da Bolha de Classificao ............................................................................................... 68 6.3.4 Exerccios ........................................................................................................................................ 70 6.4 Matrizes Multidimesionais (Matrizes) ................................................................................................. 74 6.4.1 - Introduo ..................................................................................................................................... 74 6.4.2 - Declarando a Matriz ...................................................................................................................... 74 6.4.3 - Inserindo valores em uma matriz................................................................................................... 75 6.4.4 - Clculo do Tamanho ..................................................................................................................... 76 6.4.4 - Exerccios ...................................................................................................................................... 77 UNIDADE 7 STRINGS E CARACTERES .................................................................................................. 80 7.1 Definio ................................................................................................................................................ 80 7.1.1 Observaes Importantes ................................................................................................................. 80 7.2 Funes para Manipulao de Strings .................................................................................................... 80 7.2.1 Get String (gets) .............................................................................................................................. 81 7.2.2 String Copy (strcpy) ........................................................................................................................ 81 7.2.3 String Concatenate (strcat) .............................................................................................................. 82 7.2.4 String Length (strlen) ....................................................................................................................... 82 7.2.5 String Compare (strcmp) ................................................................................................................. 83 7.3 Funes para Manipulao de Caracteres ............................................................................................... 84 7.3.1 Funo tolower ................................................................................................................................ 85 7.3.2 Funo toupper ................................................................................................................................ 85 7.3.3 Outras Funes ................................................................................................................................ 85 7.4 Limpeza do Buffer do Teclado ............................................................................................................... 85 UNIDADE 8 - FUNES ............................................................................................................................... 88 8.1 - Introduo ............................................................................................................................................ 88 8.2 - Funcionamento ..................................................................................................................................... 88 8.2.1 Porque usar funes? ....................................................................................................................... 88 8.2.2 Erros Comuns de Programao ....................................................................................................... 90 8.2.3 Exerccios: ....................................................................................................................................... 90 8.3 DEFINIO DE FUNES ................................................................................................................. 92 8.3.1 CHAMANDO FUNES............................................................................................................... 92 8.3.2 REGRAS DE ESCOPO ................................................................................................................... 92 8.3.3 CLASSES DE ARMAZENAMENTO ............................................................................................ 92
4
8.5 RECURSIVIDADE ............................................................................................................................ 96 8.6 Exerccios ............................................................................................................................................... 97 UNIDADE 9 O PR-PROCESSADOR ........................................................................................................ 99 9.1 Definio ................................................................................................................................................ 99 9.2.2 Diretiva #define ............................................................................................................................. 100 ANEXO I Operadores ............................................................................................................................. 103 ANEXO II Expresses............................................................................................................................. 104 Expresses que podem ser abreviadas .................................................................................................... 104 Modeladores ........................................................................................................................................... 104 ANEXO III As Instrues Break e Continue ........................................................................................... 106 A Instruo Break ................................................................................................................................... 106 A instruo Continue .............................................................................................................................. 106 ANEXO IV TABELA ASCII .................................................................................................................. 108 ANEXO V Tipos de Dados e Valores Mximos Permitidos ................................................................... 114
Poucos anos depois, 1672, o matemtico alemo Gottfried Wilhelm von Leibnitz (l646-1716) aprimorou a mquina de Pascal, obtendo a calculadora universal, que somava, subtraa, multiplicava, dividia e extraa a raiz quadrada.
J no sculo XIX, em, 1801, Joseph Marie Jackuard (l752 - 1834) construiu um tear automtico com entrada de dados atravs de cartes perfurados para controlar a confeco dos tecidos e seus desenhos. Podemos consider-lo a primeira mquina mecnica programada. No ano de 1822, Charles Babbage (l792-1871), matemtico ingls e professor da Universidade de Cambridge, projetou a sua Mquina de Diferenas, um dispositivo mecnico baseado em rodas dentadas, para a avaliao de funes e obteno de tabelas. Devido s deficincias tecnolgicas da poca, essa mquina no chegou a ser fabricada. Em 1833, Babbage projetou a sua Mquina Analtica ou Diferencial, semelhante ao computador atual, pois dispunha de programa, memria, unidade de controle e perifricos de entrada e sada. A idia da sua construo surgiu da necessidade de se realizar automaticamente tabelas de logaritmos e funes trigonomtricas. Essa mquina - pelos mesmos motivos da sua antecessora, a Mquina de Diferenas - no chegou a ser construda. Devido a esse projeto, Babbage considerado o Pai da informtica. Em 1854, George Boole, matemtico ingls, desenvolveu a teoria da lgebra de Boole, que permitiu a seus sucessores a representao de circuitos de comutao e o desenvolvimento da chamada Teoria dos Circuitos Lgicos. Em 1937, Howard H. Aiken, da Universidade de Harvard, desenvolve a idia de Babbage junto com cientistas do seu departamento e engenheiros da IBM. Como resultado desse desenvolvimento, construram o primeiro computador eletromecnico baseado em rels e engrenagens, denominado Calculadora Automtica de Seqncia Controlada (Automatic Sequence Controlled Calculator - ASCC), que recebeu o nome de MARK-I. O MARK-1 acabou de ser construdo em 1944 e possua unidades de entrada, memria principal e unidade aritmtica de controle e de sada. Utilizava como entrada cartes e fitas perfuradas, tinha 17 metros de comprimento por 2 metros de altura, pesava cerca de 70 toneladas, era constitudo de 700.000 peas mveis e sua fiao alcanava os 800.000 metros. Somava dois nmeros em menos de um segundo e os multiplicava em seis segundos. Em 1940, John W. Mauchly e J. Presper Eckert Jr., junto com cientistas da Universidade da Pensylvania, construram na Escola Moore de Engenharia Eltrica, o primeiro computador eletrnico, denominado ENIAC (Electronic Numerical Integrator and Calculator), que entrou em funcionamento em 1945. Foi um projeto do Exrcito dos Estados Unidos para o clculo da trajetria de projteis atravs de tabelas. Em 1951, Mauchly constri o primeiro computador da srie a ser posto venda, o UNIVAC-I (Computador Automtico Universal), que utilizava fitas magnticas. Em 1952, so construdos os computares MANIAC-I, MANIAC-II e o UNIVAC-H (este ltimo com memria de ncleos de ferrite) e com eles acaba a pr-histria da Informtica.
Anos depois, comeou a miniaturizao com a construo dos circuitos integrados que consistiam em tratamentos fsico-qumicos sobre uma pelcula de silcio, permitindo configurar diferentes circuitos de portas lgicas. Com esse elemento teve incio a cincia do projeto lgico de circuitos com baixa escala de integrao ou SSI (Short Scale Integration) que permitia introduzir em cada circuito em mdia de 10 portas lgicas. Surgiu a integrao em escala mdia ou MSI (Medium Scale Integration) na qual passaram a integrar-se numa nica pastilha de circuito integrado entre 100 e 1.000 portas lgicas. Anos mais tarde, conseguiu-se introduzir num mesmo circuito entre 1.000 e 10.000 portas, com o que se passou integrao em grande escala ou LSI (Long Scale Integration). Quando foram ultrapassadas as 10.000 portas por circuito, passou-se altssima escala de integrao ou VLSI (Very Long Scale Integration). Em 1971 apareceu o microprocessador, com o que se conseguiu implementar toda a CPU de um computador num nico elemento integrado.
Entre as principais funes da informtica destacam-se: desenvolvimento de novas mquinas; desenvolvimento de novos mtodos de trabalho; construo de aplicaes automticas; melhoria de mtodos e aplicaes existentes.
O computador uma mquina composta de elementos fsicos do tipo eletrnico, capaz de realizar uma grande variedade de trabalhos com alta velocidade e preciso, desde que receba as instrues adequadas. Ao conjunto de ordens dadas a um computador para a realizao de um determinado processo d-se o nome de programa. Ao conjunto de um ou vrios programas que realizam determinado trabalho completo d-se o nome de aplicao informtica. A informao o elemento a ser tratado e definida como tudo aquilo que permite adquirir qualquer tipo de conhecimento e portanto, existir informao sempre que se der a conhecer algo que at ento se desconhecia.
1.2.4 - Hardware
O hardware representa a parte fsica de um sistema informtico, ou seja, todos os elementos que o compem.
Tudo que voc ver e tocar no computador hardware, ou seja, teclado, monitor, impressora, etc.
Memria Auxiliar
CPU
Memria Central
1.2.5 - Software
Para que um computador funcione necessrio de programas. Estes programas so chamados de softwares. Software o conjunto de instrues, organizadas em um ou mais arquivos, que manda o computador executar tarefas que solucionam determinados problemas. Os softwares so compostos de elementos lgicos que direcionam a ao do hardware. Os softwares so classificados em: bsico, aplicativos, linguagens e utilitrios.
10
Software bsico (sistema): so programas que administram, operam e mantm o funcionamento do computador, ao mesmo tempo em que nos auxiliam a us-lo. Dentre os softwares bsicos destaca-se o sistema operacional, cujo conjunto de programas tem a finalidade de tornar o computador operacional, isto , so os programas que gerenciam os recursos da mquina e executam tarefas definidas, tais como: gravar dados, apagar, etc..., servindo de ligao entre o computador e o usurio, criando ambiente necessrio dentro do qual os softwares e aplicativos so executados. Exemplo: DOS, Windows 95, OS/2, Unix, etc. Software de aplicao: qualquer programa que nos possibilite tirar proveito do computador, como o Word um processador de textos, planilhas eletrnicas, editores grficos, gerenciadores de banco de dados, jogos, etc. Utilitrios: so programas que tem a finalidade de dar apoio a operao do computador. Executa rotinas para tarefas realizadas freqentemente como: compactao/descompactao de arquivos, deteco e eliminao de vrus, entre outros. Linguagens de programao: as linguagens surgiram da necessidade de comunicao entre o homem e o computador. a forma que possibilita o homem a desenvolver aplicaes, por exemplo: folha de pagamento, sistema contbil, sistemas acadmicos, etc. As linguagens so os meios de implementao desses programas. Exemplo: Pascal, C++, Cobol, Visual Basic, etc.
A CPU o crebro do computador e nesta unidade que ocorrem as decises, clculos, etc.
Suas partes principais so as seguintes: O Processador: Que por sua vez composto de: Unidade de controle (UC). Unidade Lgica e Aritmtica (ULA).
11
A Memria Principal: A unidade central de processamento tambm incorpora um certo nmero de registros rpidos (pequenas unidades de memria) de finalidade especial, que so utilizados internamente.
12
Os discos magnticos so reutilizveis, uma vez que a informao pode ser apagada ou gravada quantas vezes for necessrio.
Os discos magnticos so circulares, divididos em trilhas e setores. Divide-se em: Discos Flexveis (ou Disquetes): Possuem um orifcio central que serve para encaix-lo em um mecanismo de rotao e um pequeno orifcio de controle que serve de ndice para referenciar o comeo da trilha. Possuem trs tamanhos e so medidos em polegadas, de acordo com seu tamanho: 8, 5 e 3 . As operaes de leitura e gravao feito por meio de um acionador de discos flexveis chamado driver.Dentre as vantagens podemos citar: Portabilidade que nos permite utilizar a mesma massa de dados em vrios computadores; O custo dos discos flexveis relativamente baixo. Discos Rgidos (ou Winchester): Estes discos so acoplados no interior do computador. Tem como principais vantagens: a grande capacidade de armazenamento; maior velocidade de acesso se comparados com os discos flexveis.
Podemos distinguir trs categorias de perifricos: Dispositivos de Entrada Dispositivos de Sada Dispositivos de Entrada/Sada
14
A mais evidente funo do sistema operacional servir como interface com o hardware. Isso, porm, no tudo que ele faz. Os recursos bsicos do computador consistem no hardware, software e os dados. Todos esses recursos so gerenciados pelos sistemas operacionais modernos, especialmente na mquina de grande porte.
Software
Sistema Operacional
Dados
Hardware
Figura: Em muitos computadores, o sistema operacional um gerenciador de recursos, alocando o hardware, o software e os dados. O sistema operacional a interface bsica entre o usurio e o computador. Por isto, a medida que a utilizao de um computador exige uma maior complexidade, torna-se mais importante um certo conhecimento mnimo do sistema operacional.
Rede Local uma interligao de vrios equipamentos que compartilham recursos entre s.
Geralmente uma rede local serve uma rea geograficamente limitada, isto , um ambiente de trabalho, em edifcio, um campus universitrio, uma fbrica, etc. As distncias podem variar de metros at alguns poucos quilmetros. A velocidade de transmisso da ordem de milhes de bits (binary digit) por segundo, em contrastes com a rede de longa distncia que transportam dados a uma velocidade que varia de centenas de bits por segundo a milhares de bits por segundo. A maioria dos produtos existentes na rea utiliza uma forma simples de interligao fsica entre os equipamentos e talvez esta seja uma das caractersticas mais atrativas das redes locais, uma vez que o sonho
15
de todo gerente de rede ter a facilidade de conectar novos equipamentos sem ter que ligar novos cabos e sem ter que implementar novos protocolos e procedimentos. Estas caractersticas, no entanto, no so suficientes para garantir o sucesso de uma rede local. Para o usurio final, muito importante ter um mecanismo de transmisso de informao eficiente sem que haja a necessidade de conhecer os detalhes tcnicos para efetuar a ligao com a rede. Uma rede local pode ser descrita atravs das seguintes caractersticas: estar completamente contida dentro de uma rea geogrfica limitada; equipamentos so interconectados de forma independentes; proporciona alto grau de interconexo entre os equipamentos da rede; usada para transmisso de informao geralmente na forma digital; a interface com a rede feita atravs de equipamentos e meios de transmisso relativamente baratos; possvel a comunicao entre dois equipamentos quaisquer da rede. Uma das aplicaes bsicas de rede local o compartilhamento de recursos, isto , o compartilhamento de um perifrico mais caro, tal como disco ou impressora entre diversos micros. EXERCCIOS 1. 2. 3. 4. 5. 6. 7. 8. 9. Faa uma sntese atravs de uma tabela da evoluo do computador. Repita e exerccio anterior para representar as geraes dos computadores. Conceitue informtica e relacione algumas atividades de sua vida em que ela faz parte. Conceitue computador, programa, aplicao informtica e informao. Conceitue hardware e elabore seu esquema bsico. Conceitue software e relacione suas aplicaes. Relacione as unidades bsicas de um computador. Conceitue CPU e suas subdivises (UC e ULA). Conceitue memria, memria principal e memria secundria.
10. Sobre memria secundria os discos magnticos so, hoje em dia, os mais utilizados. Defina discos magnticos e as vantagens de cada um. 11. O que so perifricos? Exemplifique. 12. Conceitue sistema operacional e faa um esquema sobre o mesmo. 13. Conceitue rede local e a vantagem de utilizao da mesma.
16
especificao da seqncia ordenada de passos que deve ser seguida para a realizao de uma tarefa, garantindo a sua repetibilidade, d-se o nome de algoritmo.
Ao contrrio do que se pode pensar, o conceito de algoritmo no foi criado para satisfazer s necessidades da computao. Pelo contrrio, a programao de computadores apenas um dos campos de aplicao dos algoritmos. Na verdade, h inmeros casos que podem exemplificar o uso (involuntrio ou no) de algoritmos para a padronizao do exerccio de tarefas rotineiras. Para que um computador possa desempenhar uma tarefa necessrio que esta seja detalhada passo a passo, numa forma compreensvel pela mquina, utilizando aquilo que se chama de programa. Neste sentido, um programa de computador nada mais que um algoritmo escrito numa forma compreensvel pelo computador.
17
Nesta forma de representao os algoritmos so expressos diretamente em linguagem natural. exemplo, tm-se os algoritmos seguintes:
Como
Receita de bolo: Misture os ingredientes Unte a forma com manteiga Despeje a mistura na forma Se houver coco ralado ento despeje sobre a mistura Leve a forma ao forno Enquanto no corar deixe a forma no forno Retire do forno Deixe esfriar
Troca de um pneu furado: Afrouxar ligeiramente as porcas Suspender o carro Retirar as porcas e o pneu Colocar o pneu reserva Apertar as porcas Abaixar o carro Dar o aperto final nas porcas
Clculo da mdia de um aluno: Obter as notas da primeira e da segunda provas Calcular a mdia aritmtica entre as duas Se a mdia for maior que 7, o aluno foi aprovado, seno ele foi reprovado
Esta representao pouco usada na prtica porque o uso da linguagem natural muitas vezes d oportunidade a ms interpretaes, ambigidades e imprecises. Por exemplo, a instruo "afrouxar ligeiramente as porcas" no algoritmo da troca de pneus est sujeita a interpretaes diferentes por pessoas distintas. Uma instruo mais precisa seria: 'afrouxar a porca, girando-a de 30o no sentido anti-horrio.
18
H vrios padres que definem as formas geomtricas das figuras que devem ser usadas para representar cada um dos diversos tipos de instrues; contudo, nenhum deles se sobressai com relao aos demais no que diz respeito aceitao por parte dos usurios. Uma notao simplificada de fluxogramas a seguinte:
= deciso
De modo geral, um fluxograma se resume a um nico smbolo inicial, por onde a execuo do algoritmo comea, e um ou mais smbolos finais, que so pontos onde a execuo do algoritmo se encerra. Partindo do smbolo inicial, h sempre um nico caminho orientado a ser seguido, representando a existncia de uma nica seqncia de execuo das instrues. Isto pode ser melhor visualizado pelo fato de que, apesar de vrios caminhos poderem convergir para uma mesma figura do diagrama, h sempre um nico caminho saindo desta. Excees a esta regra so os smbolos finais, dos quais no h nenhum fluxo saindo, e os smbolos de deciso, de onde pode haver mais de um caminho de sada (usualmente dois caminhos), representando uma bifurcao no fluxo.
A figura abaixo mostra a representao do algoritmo de clculo da mdia de um aluno sob a forma de um fluxograma.
19
INCIO
N1, N2
Mdia > 7
.V.
"Aprovado"
.F.
"Reprovado"
FIM
2.2.3 - Pseudocdigo
Esta forma de representao de algoritmos rica em detalhes, como a definio dos tipos das variveis usadas no algoritmo e, por assemelhar-se bastante forma em que os programas so escritos, encontra muita aceitao. Na verdade, esta representao suficientemente geral para permitir que a traduo de um algoritmo nela representado para uma linguagem de programao especfica seja praticamente direta. A forma geral da representao de um algoritmo na forma de pseudocdigo a seguinte: Bibliotecas <declarao_de_variveis> //Variveis globais <subalgoritmos> Nome-do-algoritmo() Incio <declarao_de_variveis> //Variveis Locais <corpo_do_algoritmo> Fim. onde: Bibliotecas so funes escritas pelos fabricantes do compilador e j esto pr-compiladas.
20
<Nome_do_algoritmo> um nome simblico dado ao algoritmo com a finalidade de distingui-lo dos demais. <declarao-de-variveis> consiste em uma poro opcional onde so declaradas as variveis globais usadas no algoritmo principal e, eventualmente, nos subalgoritmos com variveis locais. <subalgoritmos> consiste de uma poro opcional do pseudocdigo onde so definidos os subalgoritmos (veremos adiante). Incio e Fim so respectivamente as palavras que delimitam o incio e o trmino do conjunto de instrues do corpo do algoritmo.
2.4 - ERROS
Quando se fala em erro em um algoritmo ou programa porque as instrues no esto numa seqncia correta ou ainda, por tratar de informaes que no existam ou que existam mas no so do tipo correto. Os erros so ocorrncias comuns que voc dever permanentemente estar preocupado, no s pela sua ocorrncia mas, tambm, pela resoluo da mesma. Os tipos de erros mais comuns que ocorrem num programa so, geralmente, erros de sintaxe e erros de lgica. Analisaremos esses tipos atravs do exemplo anterior. Mdia() Real Nl, N2, Mdia; Mdia (N1 + N2) / 2; Leia (%R, &N1); Leia (%R, n2); Se (Mdia < 7) Ento Escreva ("Aprovado"); Seno Escreva ("Reprovado"); Fim Perceba que algumas instrues foram alteradas para simular erros, vamos relacion-los: As linhas 3, 4 e 5 esto invertidas no se pode calcular a mdia sem antes saber quais so as notas.
21
Na linha 4 o primeiro argumento a string de controle de formato , indicando que o dado deve ser um Real, deve se encontrar entre aspas duplas. Na linha 5 temos uma instruo onde o programa pede informaes que sero armazenadas em variveis. Perceba que a varivel n2 no existe. Este tipo de erro bastante comum. O correto seria N2, pois a linguagem C dita como case sensitive, ou seja, ela diferencia maisculas e minsculas. Alm disto o segundo argumento de Leia comea com um e-comercial (&, ampersand, em ingls) chamado em C de operador de endereo. Na linha 6, onde acontece uma comparao lgica, o programa escrever aprovado se a mdia for menor que 7. Na realidade a instruo dever ser mdia > 7, ou seja, se a expresso for verdadeira ento o programa escrever aprovado, caso contrrio (se a mdia for <= 7 ento o programa escrever reprovado. EXERCCIOS: 1. 2. 3. 4. O que algoritmo? Qual a diferena entre algoritmo e programa? Quais so as formas de representao de algoritmos? Descreva-as. Elabore um algoritmo na forma narrativa para descrever os processos desde quando voc acorda at o momento de ir trabalhar ou estudar. Elabore um algoritmo (em todas as representaes) para somar dois nmeros. Descreva o significado de Erros em um programa ou algoritmo. Exemplifique a ocorrncia de um erro do algoritmo anterior. Uma pessoa precisa trocar o pneu furado de um carro. Quais as aes necessrias para realizar essa tarefa e em qual seqncia? Qual a seqncia para se obter a resposta da operao matemtica 5 multiplicado por 6 mais 2, dividido por 3 em uma calculadora simples? Qual a seqncia de aes para se abrir uma porta?
5. 6.
7.
8.
9.
10. Complete os termos faltantes da seqncia: 1, 1, 2, 3, 5, 8, 13, ......, ......, ...... 11. Criar um algoritmo para colocar um carro em movimento. 12. Imagine que uma pessoa decida ir de txi a uma reunio de negcios. Monte um algoritmo com a seqncia de aes para que ela chegue ao prdio onde vai ocorrer a reunio. a) Entrar no prdio da reunio. b) Sair do txi. c) Acenar para que o txi pare. d) Perguntar o preo da corrida. e) Informar o destino ao motorista f) Esperar o txi. g) Pagar a corrida. h) Entrar no txi 13. Monte um algoritmo com a seqncia de aes para fazer uma vitamina com um mamo, uma banana, uma ma, um pouco de leite e acar.
22
14. Monte um algoritmo com as aes para encontrar o nome de Joo Ferreira Neto em uma lista telefnica. 15. Monte um algoritmo com as aes para retirar U$ 100,00 de um caixa automtico de banco. 16. Monte um algoritmo com as aes para fazer uma macarronada com molho de tomate (em lata).
23
3.1 - EDITOR
Um programa de computador nada mais do que um grupo de comandos logicamente dispostos para executarem um determinada tarefa. Esses comandos so gravados em um arquivo-texto que processado ao comando do usurio e passa ento a executar cada um dos comandos que l esto gravados.
3.2 - INTERPRETADOR
O interpretador considerado um tradutor que gera cdigo-objeto. A partir de um programa-fonte, escrito em linguagem de alto nvel, o interpretador, no momento da execuo do programa, traduz cada instruo e a executa em seguida. A maior desvantagem da utilizao de interpretadores o tempo gasto na traduo das instrues de um programa toda vez que este for executado, j que no existe a gerao de um cdigo executvel. A vantagem permitir a implementao de tipos de dados dinmicos, ou seja, que podem mudar de tipo durante a execuo do programa, aumentando, assim, sua flexibilidade. Algumas linguagens tipicamente interpretadas so o Basic, dbase e APL.
3.3 - COMPILADOR
O compilador o utilitrio responsvel por gerar, a partir de um programa escrito em uma linguagem de alto nvel, um programa em linguagem de mquina no executvel (mdulo-objeto).
Compilador
Mdulo-objeto
As linguagens de alto nvel, corno Pascal, Fortran, Cobol, no tm nenhuma relao direta com a mquina, ficando essa preocupao exclusivamente com o compilador. Os programadores de alto nvel tm, apenas, que se preocupar com o desenvolvimento de suas aplicaes, no tendo que se envolver com detalhes sobre a arquitetura do processador. Assim, os programas-fonte podem ser transportados entre computadores de diversos fabricantes, desde que existam regras de definio para a linguagem. Isso permite o desenvolvimento de aplicaes independentes do equipamento.
O compilador converte um programa escrito em linguagem de alto nvel para um programa escrito em linguagem objeto (mdulo objeto).
24
Um compilador um utilitrio que opera de modo integrado aos componentes do sistema de programao disponveis, sob a superviso do sistema operacional. Podemos visualizar, ento, o compilador como uma interface entre o sistema operacional e o usurio, de maneira que possvel acessar diversos servios do sistema sem a necessidade da utilizao de linguagem de controle ou de outros utilitrios.
Mdulo-objeto
Mdulo-objeto
Linker
Programa Executvel
Mdulo-objeto
Para resolver todas as referncias a smbolos, o linker tambm pode pesquisar em bibliotecas do sistema ou do prprio usurio. Bibliotecas so arquivos que contm diversos mdulos-objeto e/ou definies de smbolos. Outra funo importante do linker determinar uma regio de memria na qual o programa ser carregado para ser executado. Esta operao denominada relocao. Em sistemas operacionais antigos, a relocao era realizada somente uma vez, na etapa de linkedio. Todos os endereos simblicos do programa so traduzidos para endereos fsicos (binding), e o programa executvel gerado, podendo ser carregado a partir de uma posio prefixada na memria (cdigo absoluto). Nesse tipo de relocao, o programa poder ser carregado, apenas, a partir de uma nica posio na memria.
25
implementar pontos de parada dentro do programa (breakpoint), de forma que, durante a execuo, o programa pare nesses pontos; especificar que, toda vez que o contedo de uma varivel for modificado, o programa envie uma mensagem (watchpoint).
3.7 - BIBLIOTECAS
Durante o desenvolvimento de programas, suas verses codificadas podem ser mantidas numa biblioteca de declaraes-fonte. O ponto principal compreender como as coisas acontecem. Tendo-se o conhecimento dos conceitos subjacentes, relativamente fcil entender como criar ou obter acesso s bibliotecas em quase todos os sistemas.
Bibliotecas so um conjunto de sub-rotinas (programas ou funes) que podem ser utilizados em qualquer programa.
O uso de bibliotecas dependem da linguagem. O FORTRAN, por exemplo, suporta algumas sub-rotinas cientficas. O programador que quiser usar uma dessas sub-rotinas cientficas deve especificar com clareza ao linkage editor onde a biblioteca de sub-rotinas pode ser encontrada. EXERCCIOS: 1. 2. 3. 4. Para que serve um editor? O que , e como funciona um interpretador? O que , e como funciona um compilador? O que um linker e quais suas funes?
26
5. 6.
O que um depurador de programas e quais so seus recursos ? O que so bibliotecas e qual a sua principal vantagem?
27
O objetivo deste captulo justamente o de classificar os dados de acordo com o tipo de informao contida neles. A classificao apresentada no se aplica a nenhuma linguagem de programao especfica; pelo contrrio, ela sintetiza os padres utilizados na maioria das linguagens. Tornando ao aspecto computacional, os dados numricos representveis num computador so divididos em apenas duas classes: os inteiros e os reais.
Observe que h uma diferena entre '0', que um dado do tipo inteiro, e '0.' (ou '0.0') que um dado do tipo real. Portanto, a simples existncia do ponto decimal serve para diferenciar um dado numrico do tipo inteiro de um do tipo real.
28
Note que, por exemplo, 1.2 representa um dado do tipo literal de comprimento 3, diferindo de 1.2 que um dado do tipo real. 4.1.4 - Dados Lgicos Na linguagem C no existem dados lgicos, pois nesta linguagem, qualquer valor diferente de 0 considerado verdadeiro. Portanto, este tpico consta apenas a carter de informao, pois os dados que aqui se encontram (neste tpico) , baseiam-se na linguagem Pascal. A existncia deste tipo de dado , de certo modo, um reflexo da maneira como os computadores funcionam. Muitas vezes, estes tipos de dados so chamados de booleanos, devido significativa contribuio de BOOLE rea da lgica matemtica. O tipo de dados lgico usado para representar dois nicos valores lgicos possveis: verdadeiro e falso. comum encontrar-se em outras referncias outros tipos de pares de valores lgicos como sim/no, 1/0, true/false. Nos algoritmos apresentados neste texto os valores lgicos sero delimitados pelo caractere ponto(.). Exemplo: .V. - valor lgico verdadeiro .F. - valor lgico falso
29
Exerccio Proposto
1.
Classifique os dados especificados abaixo de acordo com seu tipo, assinalando com I os dados do tipo inteiro, com R os reais, com L os literais, com B os lgicos (booleanos), e com N aqueles para os quais no possvel definir a priori um tipo de dado. ( ( ( ( ( ( ( ( )0 )1 ) 0.0 ) 0. ) -1 ) -32 ) +36 ) +32. ( ( ( ( ( ( ( ( ) -0.0001 ) +0.05 ) +3257 ) a ) +3257 ) +3257. ) -0.0 ) .F. ( ( ( ( ( ( ( ( ) -0.0 ) .V. ) V ) abc )F ) 22 ) V ) .F.
2.
Identifique de que tipo so as constantes a seguir: a) 435867 b) RODOLFO c) 8725 d) 0.213 e) .F. f) .V. g) Limo h) 23/12/03 i) 0.5 j) 304958 k) 123456 Indique o(s) tipo(s) de constante(s) que pode(m) ser utilizado(s) para representar: a) o nome de um pas; b) o Registro Geral (RG) de identificao de uma pessoa; c) o CNPJ de uma empresa; d) se uma pessoa ou no maior de idade (tem mais de 18 anos); e) a idade de uma pessoa; f) o endereo de uma pessoa.
3.
30
Adotaremos neste texto as seguintes regras: - um nome de varivel deve necessariamente comear com uma letra; - um nome de varivel no deve conter nenhum smbolo especial, exceto o underline(_). Exemplos: SALRIO 1ANO ANO1 A CASA SAL/HORA SAL_HORA _DESCONTO -correto -errado (no comeou com uma letra) -correto -errado (contm o caractere branco) -errado (contm o caractere /) -correto -errado (no comeou com uma letra)
Obviamente interessante adotar nomes de variveis relacionados s funes que sero exercidas pelas mesmas dentro de um programa. Exemplificando, para guardar o salrio de um funcionrio de uma empresa num programa de processamento de, folha de pagamento, seria interessante utilizar uma varivel chamada SALARIO. Outro atributo caracterstico de uma varivel o tipo de dado que ela pode armazenar. Este atributo define a natureza das informaes contidas na varivel. Por ltimo, h o atributo informao, que nada mais do que a informao til contida na varivel. Uma vez definidos, os atributos nome e tipo de dado de uma varivel no podem ser alterados e assim permanecem durante toda a sua existncia, desde que o programa que a utiliza no seja modificado. Por outro lado, o atributo informao est constantemente sujeito a mudanas, de acordo com o fluxo de execuo do programa. Por exemplo, se definirmos que uma determinada varivel chamada SALRIO e destinada a guardar nmeros reais, possvel que seu contedo seja, num dado instante, igual a 1.500,00 e posteriormente modificado para 3.152,19, de acordo com o programa executado. Em resumo, o conceito de varivel foi criado para facilitar a vida dos programadores, permitindo acessar informaes na memria dos computadores por meio de um nome, em vez do endereo de uma clula de memria.
numa mesma linha podero ser definidas uma ou mais variveis do mesmo tipo; Para tal, deve-se separar os nomes das mesmas por vrgulas; variveis de tipos diferentes devem ser declaradas em linhas diferentes; somente os 31 primeiros caracteres do nome da varivel so reconhecidos.
31
A forma de utilizao deste comando ficar mais clara quando da utilizao da representao de algoritmos em linguagem estruturada (pseudocdigo). Esta conveno vlida para a representao de algoritmos na forma de pseudocdigo. Em termos de fluxograma, no usual adotar-se qualquer forma de definio de variveis. Exemplo de definio de variveis: Literal Inteiro Real NOME[10]; IDADE; SALRIO, DESCONTO;
No exemplo acima foram declaradas quatro variveis: - a varivel NOME, capaz de armazenar dados literais de comprimento 10 (dez caracteres); - a varivel IDADE, capaz de armazenar um nmero inteiro; - as variveis SALARIO e DESCONTO, capazes de armazenar um nmero real; Exerccios Propostos 1. Na lista seguinte, assinale com V os nomes de variveis vlidos e com I os invlidos. ( ( ( ( ( ( 2. ) abc ) 123a )_ ) Al23 ) al23 ) AB CDE ( ( ( ( ( ( ) 3abc ) a?B ) Aa ) _1 ) _al23 ) etc... ( ( ( ( ( ( )a ) acdl )1 ) AOl23 ) b3l2 ) guarda-chuva
Declare as variveis para o algoritmo de cadastramento de alunos, cujos dados so: nome, sexo, endereo, cidade, estado, CEP, telefone, data de nascimento, RG, nome do pai, nome da me e grau de escolaridade. Utilize pseudocdigo para representar as declaraes. Verifique se os identificadores a seguir so vlidos. Se no forem, explique por qu. a. NOME-DO-ALUNO b. $ c. DINHEIRO d. DATA/DE/NASCIMENTO e. NOME2 f. 2APESSOA g. MAIOR_DE_IDADE? h. NOME_DA_PESSOA i. END j. %JUROS k. M239083 Declare as variveis para os algoritmos dos cadastros a seguir. a. Passagens areas b. Fitas de vdeo de uma locadora c. Livros de uma biblioteca d. Carros de uma concessionria e. CDs de uma coleo de msica f. Disciplinas de uma escola g. Clientes de uma loja h. Roupas de uma loja
32
3.
4.
4.1.7 - Expresses
O conceito de expresso em termos computacionais est intimamente ligado ao conceito de expresso (ou frmula) matemtica, onde um conjunto de variveis e constantes numricas relacionam-se por meio de operadores aritmticos compondo urna frmula que, uma vez avaliada, resulta num valor.
H
Figura: Tringulo de base (B) e altura (H). Por exemplo, a frmula de clculo da rea do tringulo da Figura dada por: REA = 0.5 x B x H Esta frmula utiliza trs variveis: B e H, que contm as dimenses do tringulo, e REA, onde guardado o valor calculado (resultado da avaliao da expresso). H, tambm, uma constante (0.5) e o operador de multiplicao (x), que aparece duas vezes na expresso. O conceito de expresso aplicado computao assume uma conotao mais ampla: uma expresso uma combinao de variveis, constantes e operadores, e que, uma vez avaliada, resulta num valor. Expresso uma combinao de variveis, constantes e operadores.
Outra classificao dos operadores feita considerando-se o tipo de dado de seus operandos e do valor resultante de sua avaliao. Segundo esta classificao, os operadores dividem-se em aritmticos, lgicos e relacionais. Esta diviso est diretamente relacionada com o tipo de expresso onde aparecem os operadores. Um caso especial o dos operadores relacionais, que permitem comparar pares de operandos de tipos de dados iguais, resultando sempre num valor lgico. Mais adiante sero apresentados formalmente os operadores dos diversos tipos acima relacionados.
33
Operador + * / + -
Prioridade 3 3 2 2 1 1
A prioridade entre operadores define a ordem em que os mesmos devem ser avaliados dentro de uma mesma expresso. Este assunto ser tratado com maior profundidade numa seo posterior. O caractere (*) adotado na maioria das linguagens de programao para representar a operao de multiplicao, ao invs do caractere (x), devido possibilidade da ocorrncia do mesmo no nome de variveis. Pela mesma razo, o smbolo (**) adotado para representar a operao de exponenciao. Algumas linguagens de programao adotam o smbolo (^) (circunflexo) para esta finalidade, mas isto pouco freqente. As variveis usadas em expresses aritmticas podem somente ser do tipo inteiro ou real. Se ao menos uma das variveis da expresso aritmtica for do tipo real, ento o valor resultante da avaliao da expresso necessariamente do tipo real. Nos exemplos seguintes, assumiremos que: - A, B e C so variveis do tipo inteiro; - X, Y e Z so variveis do tipo real. Exemplos: 1) A+B*C 2) A+B+Y 3) A/B 4) X/Y - expresso de resultado inteiro - expresso de resultado real - expresso de resultado inteiro - expresso de resultado real
O leitor deve estranhar o fato de no terceiro exemplo ser apresentada uma expresso onde se dividem dois nmeros inteiros e se obtm como resultado um valor inteiro. Obviamente, o resultado da diviso entre dois nmeros inteiros no necessariamente inteiro. Na verdade, a operao representada no terceiro item a diviso inteira, onde o resto da diviso desprezado.
34
Prioridade 3 2 1
Para exemplificar o uso de operadores lgicos, a Tabela abaixo apresenta duas variveis lgicas A e B. Uma vez que cada varivel lgica possui somente dois valores possveis, ento h exatamente quatro combinaes para estes valores, razo pela qual a tabela tem quatro linhas. As diversas colunas contm os resultados das operaes lgicas sobre as combinaes possveis dos valores das variveis A e B.
Operador == !=
35
Exemplo: sejam A e B variveis lgicas, X e Y variveis reais, e R, S e T variveis literais, com os respectivos valores: A=.V., B =.F., X = 2.5, Y = 5.0, R = JOS, S = JOO e T =JOOZINHO A tabela seguinte contm algumas expresses lgicas contendo estas variveis: Expresso A. OU. B A .E. B .NO. A X=Y X = (Y/2) R=S S=T R!=S R>S S>T ((A.OU.B).OU.(X>Y).OU.(S>T)) Resultado .V. .F. .F. .F. .V. .F. .F. .V. .F. .F. .V.
Algumas Normas para utilizao de operadores nas expresses Expresses que apresentam apenas um nico operador podem ser avaliadas diretamente. No entanto, medida que as mesmas vo-se tornando mais complexas com o aparecimento de mais de um operando numa mesma expresso, necessria a avaliao da mesma passo a passo, tomando um operador por vez. A seqncia destes passos definida de acordo com o formato geral da expresso, considerando-se a prioridade (precedncia) de avaliao de seus operadores e a existncia ou no de parnteses na mesma. As seguintes regras so essenciais para a correta avaliao de expresses: 1. Deve-se observar a prioridade dos operadores, conforme mostrado nas Tabelas: operadores de menor prioridade devem ser avaliados primeiro. Se houver empate com relao precedncia, ento a avaliao se faz considerando-se a expresso da esquerda para a direita. Os parnteses usados em expresses tm o poder de roubar a prioridade dos demais operadores, forando a avaliao da subexpresso em seu interior. Entre os quatro grupos de operadores existentes, a saber, aritmtico, lgico, literal e relacional, h uma certa prioridade de avaliao: os aritmticos e literais devem ser avaliados primeiro; a seguir, so avaliadas as subexpresses com operadores relacionais e, por ltimo, os operadores lgicos so avaliados.
2. 3.
36
Expresses Literais Expresses literais so aquelas cujo resultado da avaliao um valor literal. Este tipo de expresso bem menos freqente que os anteriores. Os tipos de operadores existentes variam de uma linguagem de programao para outra, no havendo uma padronizao. Para que o assunto no passe em branco, considere-se como exemplo a operao de concatenao de strings: toma-se duas strings e acrescenta-se (concatena-se) a segunda delas ao final da primeira. Em algumas linguagens esta operao representada Pelo smbolo (operador) (+). Por exemplo, a concatenao das strings REFRIGERA e DOR representada por REFRIGERA + DOR e o resultado de sua avaliao REFRIGERADOR. Exemplos: suponha que X, Y e Z so variveis reais, e A e B variveis lgicas, com os respectivos valores: X = 2.0, Y = 3.0, Z = 0.5, A = .V. e B = .F. Considere as seguintes expresses e indique o resultado de suas avaliaes: 1) X * Y - Z 2) X * (Y - Z) 3) X + Y * Z 4) X + (Y * Z) 5) (X + Y) * Z 6) B .E. A .OU. X != Y/2 7) B .E. (A .OU. X != Y/2) Exerccios Propostos 1. Dada a declarao de variveis Inteiro Real Literal A, B, C; X, Y, Z; NOME[20], RUA[20]; = = = = = = =
Classifique as expresses seguintes de acordo com o tipo de dado do resultado de sua avaliao, em I (inteiro), R (real), L (literal) ou N (quando no for possvel defini-lo): ( ( ( ( ( )A + B + C )A + B + Z )NOME + RUA )X + Y / Z )A + Z / A ( ( ( ( ( )A > B )A > Y )X + Z / A )A + X / Z )A + B / C
2. Sendo: A = B = C = .V. e D = .F. a) (A E B) b) (A E B) OU (C) c) (A E B) E B d) (A E B) E (B OU C) e) (A E B) E (B OU D) f) (A E B) E ((A OU B) E (D OU A) E (D E A)) 3. O mesmo que o n 2 sendo, A = B = .F. a) b) c) e C = D = .V. d)
e)
f)
37
4.
B = C = .V. d)
e)
f)
5.
Sendo A = B = C = .V. e D = .F. a) !(A E B) b) (A E B) OU (!C) c) !(A OU D) E (B) d) (A OU B) E (!D) e) (A OU B) E (!(B E D)) f) ((A E B) E C) E (!(A OU B) E (!D OU A) E (D E !A)) O mesmo que o n 5 sendo, A = B = .F. a) b) c) O mesmo que o n 5 sendo, A = D = .F. a) b) c) Sendo A = 20, B = 30, C = .V. e D = .F. a) (A = = B) OU (C E D) b) (A = = B) E (C E D) c) (!(A = = B)) OU (C E D) d) (!(A = = B)) OU (!C E D) e) (A > =B) f) (A = = B) g) (A < B) h) (A < = B) E (C E D) i) (A ! = B) e C = D = .V. d) C = B = .V. d)
6.
e)
f)
7.
e)
f)
8.
38
Uma estrutura seqencial aquela em que os comandos vo sendo executados numa seqncia prestabelecida, um aps o outro.
<Comando 1>
(a)
<Comando 2>
<Comando 3>
( b ) <Comando 1>; <Comando 2>; <Comando 3>; Figura: Trecho seqencial de um algoritmo: ( a ) fluxograma; ( b ) pseudoc6digo.
Para aprimorar nossos conhecimentos afim de montarmos algoritmos estruturados logicamente, aprofundaremos nos conceitos de instrues primitivas e suas derivadas, ou seja, sabermos o que significa e como se faz cada instruo. Tais conceitos sero de fundamental importncia para elaborao de nossos futuros programas.
39
Daqui em diante, todos os comandos novos sero apresentados por meio de sua sintaxe e sua semntica, isto , a forma como devem ser escritos e a(s) ao(es) que executam.
Sua sintaxe :
<nome_de_varivel>
<expresso>
O modo de funcionamento (semntica) de uma atribuio consiste : 1. 2. na avaliao da expresso, e no armazenamento do valor resultante na posio de memria correspondente varivel que aparece esquerda do comando.
40
A expresso presente no comando de atribuio pode ser de qualquer tipo de varivel. Uma implicao bastante sria, para qual a ateno deve ser dirigida, a necessidade da compatibilidade entre o tipo de dado resultante da avaliao da expresso e o tipo de dado da varivel, no sentido em que esta deve ser capaz de armazenar o resultado da expresso. Mais explicitamente, se uma expresso resulta num valor lgico, ento a varivel deve ser tambm do tipo lgico. O mesmo acontece no caso de dados literais e reais. Uma exceo o caso em que a varivel do tipo real e a expresso resulta num valor inteiro. Nesta situao, o resultado (dado do tipo inteiro) convertido para o tipo real e posteriormente armazenado na varivel. A Figura abaixo mostra um exemplo de algoritmo onde algumas atribuies so feitas: os valores 5.0 e 10 so atribudos s variveis PREO_UNIT e QUANT, respectivamente; posteriormente, o resultado do produto entre as duas anteriores armazenado em PREO_TOT.
Incio
Preo_Unit
5.0
Quant
10
Fim
PREO_UNIT 5.0; QUANT 10; PREO_TOT PREO-UNIT * QUANT; } Figura : Exemplo de aplicao de comandos de atribuio: (a) fluxograma; (b) pseudocdigo.
41
As instrues primitivas de sada de dados so o meio pelo qual informaes contidas na memria dos computadores so colocadas nos dispositivos de sada, para que o usurio possa apreci-las.
H duas sintaxes possveis para esta instruo: Escreva (%<tipo_varivel>, <varivel>); ou Escreva (%<tipo_varivel_1> %<tipo_varivel_2>, <varivel_1>, <varivel_2>); estar na ordem em que aparecerem no comando de sada. ou Escreva (<literal>);
as variveis precisam
Repare que a representao no fluxograma dispensa o uso da palavra reservada Escreva, uma vez que a mesma j est embutida na forma geomtrica da figura. A semntica da instruo primitiva de sada de dados muito simples: os argumentos do comando so enviados para o dispositivo de sada. No caso de uma lista de variveis, o contedo de cada uma delas pesquisado na posio de memria correspondente varivel e depois enviado para o dispositivo de sada. No caso de argumentos do tipo string, estes so enviados diretamente ao referido dispositivo. H, ainda, a possibilidade de se misturar nomes de variveis com literais na lista de um mesmo comando. O efeito obtido bastante til e interessante: a lista lida da esquerda para a direita e cada elemento da mesma tratado separadamente; se um nome de varivel for encontrado, ento a informao da mesma pega da memria e colocada no dispositivo de sada; no caso de um literal, o mesmo escrito diretamente no dispositivo de sada.
Incio
Preo_Unit, Quant
Preo_Tot
Fim
(a)
42
(b) EXEMPLO2() { Real PREO_UNIT, PREO_TOT; Inteiro QUANT; Leia (%R, &PREO_UNIT); Leia (%I, &QUANT); PREO_TOT PREO-UNIT * QUANT; Escreva (O preo total %.2R, PREO_TOT); }
Figura : Exemplo de aplicao de comandos de entrada, atribuio e sada de dados: (a) fluxograma; (b) pseudocdigo. 5.1.3.1 Constantes de Barra Invertida O C utiliza, para facilitar a tarefa de programar, vrios cdigos chamados cdigos de barra invertida. Estes so caracteres que podem ser usados como qualquer outro. A lista completa dos cdigos de barra invertida dada a seguir. Cdigo \b \f \n \r \t \ \ \0 \\ \v \a \N \xN Significado Retrocesso (back) Alimentao de formulrio (form feed) Nova linha (new line) Retorno de carro (carriage return) Tabulao horizontal (tab) Aspas Apstrofo Nulo (0 em decimal) Barra Invertida Tabulao Vertical Sinal sonoro (beep) Constante octal (N o valor da constante) Constante hexadecimal (N o valor da constante)
Sua sintaxe :
A funo Leia recebe a entrada do dispositivo padro, que normalmente o teclado. Esta funo tem dois argumentos:
43
O primeiro argumento, a string de controle de formato, indica o tipo de dado que deve ser fornecido pelo usurio. Nesse contexto, o % considerado por Leia (e por Escreva) um caractere de escape (como o \) e a combinao %<tipo_varivel> uma seqncia de escape. O segundo argumento de Leia comea com um e-comercial (&, ampersand, em ingls) chamado em C de operador de endereo seguido do nome da varivel. O e-comercial, quando combinado com o nome da varivel, diz ao Leia o local na memria onde a varivel est armazenada. O computador ento armazena o valor informado pelo usurio naquele local.
Da mesma forma que Escreva, daqui em diante Leia ser tratada como uma palavra-reservada e no mais poder ser usada como nome de varivel em algoritmos. A figura anterior mostra como uma instruo de entrada de dados representada em fluxogramas. Esta representao dispensa o uso da palavra-reservada Leia, pelo fato da mesma j estar de certo modo embutida na forma geomtrica da figura. A semntica da instruo de entrada (ou leitura) de dados , de certa forma, inversa da instruo de escrita: os dados so fornecidos ao computador por meio de um dispositivo de entrada e armazenados nas posies de memria das variveis cujos nomes aparecem na lista_de_variveis.
Obs.: Perceba que aps os comandos tem-se um ; (ponto e vrgula) significando o fim do comando. Desta forma, pode-se escrever mais de um comando na mesma linha. Ex.: printf(Entre com o valor: ); scanf(X); Exerccio Resolvido 1. Escreva um algoritmo (fluxograma e pseudocdigo) para calcular a mdia entre dois nmeros quaisquer. Soluo:A idia principal do algoritmo est centrada na expresso matemtica utilizada no clculo da mdia (M) entre dois nmeros, N1 e N2, dada por: M = (N1 + N2) / 2 Para que o valor de M possa ser calculado pelo algoritmo, necessrio que os valores de N1 e N2 tenham sido fornecidos ao mesmo com antecedncia. Portanto, a primeira etapa do algoritmo consiste da obteno (leitura) dos valores de N1 e N2 e armazenamento dos mesmos em posies distintas de memria (variveis). Na seqncia, o valor da mdia deve ser calculado por meio de uma expresso apropriada e atribudo a uma terceira varivel (M). Por fim, deve-se relatar ao usurio o valor calculado por meio de uma instruo primitiva de sada de dados. O fluxograma do algoritmo descrito mostrado a seguir. Note que ele est enriquecido com instrues para informar sua finalidade, os dados que devem ser fornecidos ao usurio e o significado do valor calculado. A transformao do fluxograma em pseudocdigo exige a disponibilidade de algumas informaes adicionais concernentes ao tipo das variveis utilizadas. Como o algoritmo opera apenas com dados numricos, certamente as variveis utilizadas sero do tipo inteiro ou real. Como se deseja calcular a mdia entre dois nmeros quaisquer, ento as variveis N1 e N2 devem ser capazes de armazenar nmeros com ou sem parte fracionria e, portanto, necessrio que estas sejam do tipo real. Como o valor mdio entre dois nmeros reais um nmero que pode ou no ter parte fracionria, ento a varivel M tambm deve ser do tipo real.
44
Incio
N1
N2
(N1+N2)/2
Fim
De posse dessa informao, pode-se escrever o pseudocdigo do algoritmo em questo, a partir de seu fluxograma.
45
Media() { Real N1, N2, M; Escreva (Algoritmo para calcular a mdia entre dois nmeros); Escreva (Digite o primeiro nmero: ); Leia (%R, &N1); Escreva (Digite o segundo nmero: ); Leia (%R, &N2); M (N1 + N2) / 2; Escreva (O valor da mdia : %R, M); }
Exerccios Propostos Escreva um algoritmo para calcular o valor de y como funo de x, segundo a funo y(x) = 3x + 2, num domnio real. 2. Escreva um algoritmo para calcular o consumo mdio de um automvel (medido em Km/l), dado que so conhecidos a distncia total percorrida e o volume de combustvel consumido para percorr-la (medido em litros). 3. Para as instrues propostas a seguir, expresse um algoritmo que pode ser usado em sua soluo na forma de um fluxograma e pseudocdigo. Ao final da execuo do trecho abaixo, quais os valores de A, B e C? A A B C C A 1; B B+1; B-1; A+3; B-3; C+1; 2; C 1; 1.
A=_______ 4.
B=________
C=_________
O que ser mostrado no vdeo durante a execuo deste trecho de programa? x 1; z 2; a x + z; b x - z; escreva(Valor de A: %R, a); escreva(Valor de A-1: %R, a-1);
A classificao das estruturas de deciso feita de acordo com o nmero de condies que devem ser testadas para que se decida qual o caminho a ser seguido. Segundo esta classificao, tm-se dois tipos de estruturas de deciso:
46
(a)
Um comando composto um conjunto de zero ou mais comandos (ou instrues) simples, como atribuies e instrues primitivas de entrada ou sada de dados, ou alguma das construes que ainda sero apresentadas neste captulo.
.V.
<Condio>
.F.
(b) Figura: Sintaxe da estrutura de deciso Se-Ento-Seno-Fim_se: A semntica desta construo a seguinte: a condio avaliada. Se o resultado for verdadeiro, ento o comando_composto_l executado. Ao trmino de sua execuo o fluxo do algoritmo prossegue pela instruo seguinte construo, ou seja, o primeiro comando aps o Fim_se. Nos casos em que a condio
47
avaliada como falsa, o comando_composto_2 executado e, ao trmino do mesmo, o fluxo de execuo prossegue pela primeira instruo seguinte ao Fim_se. H casos particulares e muito comuns desta construo, onde o comando composto 2 um conjunto vazio de instrues. Neste caso, a poro relativa ao Seno pode ser omitida, resumindo a sintaxe da construo forma mostrada na Figura seguinte. Se (<condio>) { <Comando_composto_l>; }
.V.
<Condio>
Figura: Sintaxe da estrutura de deciso Se-Ento-Fim_se A semntica desta construo a seguinte: no caso da condio ser verdadeira, o comando_composto_l executado e, aps seu trmino, o fluxo de execuo prossegue pela prxima instruo aps o Fim_se. Quando a condio falsa, o fluxo de execuo prossegue normalmente pela primeira instruo aps o Fim_se. A Figura seguinte exemplifica o uso da construo Se-Ento-Seno-Fim_se num algoritmo para determinar se uma pessoa maior ou menor de idade. Exemplo() { Inteiro IDADE; Leia (%I,&IDADE); Se (IDADE >= 18) Escreva ("Maior de idade"); Seno Escreva ("Menor de idade"); }
48
Incio
Idade
.V.
Idade>=18
.F.
"Maior de idade"
"Menor de idade"
Fim
Figura: Exemplo de aplicao da estrutura de deciso Se-Ento-Seno-Fim_se. Estruturas Se/Seno aninhadas verificam vrios casos inserindo umas estruturas Se/Seno em outras. Por exemplo, a instruo em pseudocdigo a seguir imprimir A para graus de exame maiores ou iguais a 90, B para graus maiores que ou iguais a 80, C para graus maiores que ou iguais a 70, D para graus maiores que ou iguais a 60 e F para todos os outros graus. Se (grau >= 90) Escreva (A); Seno Se (grau >= 80) Escreva (B); Seno Se (grau >= 70) Escreva (C); Seno Se (grau >= 60) Escreva (D); Seno Escreva (F); Observao: A estrutura se seleo Se deve conter apenas uma instruo em seu corpo. Para incluir vrias instrues no corpo de um Se, coloque o conjunto de instrues entre chaves ( { e } ). Um conjunto de instrues dentro de um par de chaves chamado uma instruo composta.
49
Este tipo de estrutura uma generalizao da estrutura Se, onde somente uma condio era avaliada e dois caminhos podiam ser seguidos. Na estrutura de deciso do tipo Escolha pode haver uma ou mais condies a serem testadas e um comando composto diferente associado a cada uma destas.
As estruturas de deciso permitem escolher qual o caminho a ser seguido num algoritmo em funo de uma ou mais condies.
.V.
.V.
.F.
.V.
Escolha (<varivel>) { Caso <Valor_1> : <Comando_composto_1>; Pare; Caso <Valor_2> : <Comando_composto_2>; Pare; ..... Caso <Valor_N > : <Comando_composto_N>; Pare; Seno <Comando_composto_S>; } Figura: Sintaxe usada para a condio Escolha. Seu funcionamento o seguinte: ao entrar-se numa construo do tipo Escolha, a Condio_l testada: se for verdadeira, o comando_composto_l executado e, aps seu trmino, o fluxo de execuo prossegue pela primeira instruo aps o final da construo (Fim escolha); se a condio_l for falsa, a condio_2 testada: se esta for verdadeira, o comando_composto_2 executado e, ao seu trmino, a execuo prossegue normalmente pela instruo seguinte ao Fim_escolha ( } ). O mesmo raciocnio estendido a todas as
50
condies da construo. No caso em que todas as condies so avaliadas como falsas, o comando_composto_S (correspondente ao Seno da construo) executado. Um exemplo de aplicao desta construo mostrado a seguir, baseado num algoritmo que verifica se o usurio digitou o nmero 0, 1, 2 ou outro valor. Exemplo() { Inteiro NMERO; Leia (%I,&NMERO); Escolha (NMERO) { Caso 0 : Escreva (Opo escolhida 0); Pare; Caso 1 : Escreva (Opo escolhida 1); Pare; Caso 2 : Escreva (Opo escolhida 2); Pare; Seno Escreva (Opo invlida); } } Um caso particular desta construo aquele em que o comando_composto_S no contm nenhuma instruo. Isto ocorre nas situaes em que no se deseja efetuar nenhuma ao quando todas as condies testadas so falsas. Assim, pode-se dispensar o uso do Seno na construo, corno acontece tambm na construo Se.
51
Exemplo() { Inteiro contador; Para(contador = 1; contador <= 10; contador contador+1) { Escreva(%d, contador); } } O programa funcionada da seguinte maneira. Quando a estrutura Para comea a ser executada, a varivel de controle contador inicializada com o valor 1. A seguir, a seguir a condio de continuio do lao contador <= 10 examinada. Como o valor inicial de contador 1, a condio satisfeita, portanto a instruo Escreva imprime o valor de contador, ou seja, 1. A varivel de controle contador ento incrementada pela expresso contador contador + 1 e o lao comea novamente com seu teste de continuao. Como a varivel de controle agora 2, o valor final no excedido, e o programa realiza a instruo Escreva mais uma vez. O processo continua at que a varivel de controle contador seja incrementada at o seu valor final de 11 isso faz com que o teste de continuao do lao no seja verdadeiro e a repetio termine. O programa continua com a primeira instruo depois da estrutura Para.
Onde <Comando_Composto> um comando vazio, um comando simples ou um bloco de comandos. A condio pode ser qualquer expresso, e verdadeiro qualquer valor no-zero.
52
O lao se repete quando a condio for verdadeira. Quando a condio for falsa, o controle do programa passa para a linha aps o Fim_Enquanto ( } ). Como os laos Para, os laos Enquanto verificam a condio de teste no incio do lao, o que significa que o cdigo do lao pode no ser executado. Isso elimina a necessidade de se efetuar um teste condicional antes do lao. Cuidados: - Como os valores em ponto flutuante (Reais) podem ser valores aproximados, controlar a contagem de laos com variveis de ponto flutuante pode resultar em valores impreciso de contadores e exames incorretos da condio de terminao. - Uma vez dentro do corpo do lao, a execuo somente abandonar o mesmo quando a condio for falsa. O usurio deste tipo de construo deve estar atento necessidade de que em algum momento a condio dever ser avaliada como falsa. Caso contrrio, o programa permanecer indefinidamente no interior do lao, o que conhecido como lao ou looping infinito.
53
Faa Escreva (1. X = A + B); Escreva (2. X = A - B); Escreva (3. X = A * B); Escreva (4. X = A / B); Escreva (Opo (1 4): ); Leia(%I,&Op); Enquanto ((Op < 1) .OU. (Op > 4)) Se (Op = 1) { X = A + B; Escreva (X = %I, A + B); } Seno Se (Op = 2) { X = A - B; Escreva (X = %I, A - B); } Seno Se (Op = 3) { X = A * B; Escreva (X = %I, A * B); } Seno { X = A / B; Escreva (X = %I, A / B); } } } }
Exemplo de fluxograma de modo que seja possvel o clculo do salrio reajustado de um nmero indeterminado de funcionrios segundo tal critrio de reajuste. Na soluo importante notar que: a primeira ao tomada pelo algoritmo a leitura do valor do salrio do primeiro funcionrio, que ocorre antes mesmo de se entrar no lao principal do algoritmo. Dessa forma evita-se que o algoritmo entre no corpo do lao condicional se o primeiro valor de SALRIO j for menor ou igual a zero; a condio utilizada no teste da condio de continuidade do lao SALRIO 0.0, de modo que, quando um valor menor ou igual a zero for especificado para SALARIO, a condio ser avaliada como .F. e o lao ser abandonado; corpo do lao consiste no clculo do salrio reajustado propriamente dito, da escrita do valor calculado e da leitura do valor do salrio do prximo funcionrio, com base no qual o lao atuar na prxima iterao. na estrutura Se, se no utilizasse o Seno sal_reaj salario, e se a condio do Se fosse falsa, seria mostrado o salrio reajustado do funcionrio anterior.
54
Incio
"Salrio = "
Salrio
Salario>0.0
.F.
Fim
.V. Salrio Salrio < 5000 .F. "Salrio = " Sal_reaj Salrio "Salrio Reaj. =", Sal_reaj .V. Sal_reaj 1.3 * Salrio
5.3.4 Exerccios
1. Diga se cada uma das afirmaes seguintes verdadeira ou falsa. Se for falsa, explique por qu. a) Quando a funo Escreva chamada, ela sempre comea a imprimir no incio de uma nova linha. b) Os comentrios fazem com que o computador imprima na tela o texto situado entre /* e */ quando o programa executado. c) A seqncia de escape \n, quando usada em uma string de controle de formato de Escreva, faz com que o cursor se posicione no incio da prxima linha na tela. d) Todas as variveis devem ser declaradas antes de serem usadas. e) Todas as variveis devem receber a atribuio de um tipo ao serem declaradas.
55
f)
g) As declaraes podem aparecer em qualquer lugar do corpo de uma funo. h) Todos os argumentos aps a string de controle de formato em uma funo Escreva devem ser precedidos por um e-comercial (&). i) j) 2. O operador resto (%) s pode ser usado com operadores inteiros. Os operadores aritmticos *, /, % e - possuem o mesmo nvel de procedncia.
Escreva uma nica instruo ou linha em C que realize cada um dos pedidos seguintes: a) Imprima a mensagem Entre com dois nmeros.
b) Atribua o produto das variveis b e c varivel a. c) Informe que o programa realiza um exemplo de clculo de folha de pagamento (use um texto que ajude a documentar o programa).
d) Fornea ao programa trs valores inteiros digitados no teclado e coloque esses valores nas variveis inteiras a, b e c. 3. Elabore um programa em que o usurio digita um caracter. Se esse caracter for * deve surgir uma mensagem Voc digitou o caracter *, caso contrrio surgir uma outra Digitou o caracter <caracter que o usurio digitou>. Elabore um programa em que o usurio digita um caracter. Se esse caracter for N ou n deve surgir a mensagem Escolheu a opo NO, caso contrrio surgir uma outra Escolheu outra opo. Elabore um programa que informe se um nmero inserido pelo usurio par ou mpar. Elabore um programa que ordene por ordem crescente dois nmeros inseridos pelo usurio (diferentes). Elabore um programa que ordene por ordem decrescente trs nmeros inseridos pelo usurio (diferentes). Elabore um programa que pea ao usurio para fornecer dois nmeros inteiros, obtenha-os do usurio e imprima o maior deles seguido das palavras maior. Se os nmeros forem iguais, imprima a mensagem Estes nmeros ao iguais. Elabore um programa que receba trs nmeros inteiros diferentes digitados no teclado e imprima a soma, a mdia, o produto, o menor e o maior desses nmeros.
4.
5. 6. 7. 8.
9.
10. Escreva um programa que leia cinco nmeros inteiros e ento determine e imprima o maior e o menor inteiro do grupo. 11. Escreva um programa que leia dois inteiros e ento determine e imprima se o primeiro mltiplo do segundo. 12. Escreva um algoritmo para determinar se um nmero maior, menor ou igual a 0 (zero) utilizando a estrutura de seleo IF. 13. Faa um algoritmo que leia o nome do aluno e suas duas notas. A partir das informaes lidas: - calcule e mostre a mdia do aluno;
56
- verifique qual ser o conceito atribudo ao aluno: - se a mdia for menor que 5: E - se a mdia for maior ou igual que 5 e menor que 6: D - se a mdia for maior ou igual que 6 e menor que 7: C - se a mdia for maior ou igual que 7 e menor que 9: B - se a mdia for maior ou igual que 9 e menor ou igual a 10: A Faa um algoritmo usando a estrutura Escolha e outro usando Se. 14. Faa a questo anterior para n alunos. Considere que o algoritmo repita at que o nome do aluno seja igual a FIM. 15. Faa um algoritmo para gerar os 10 primeiros termos da seqncia de Fibonacci: Obs. A partir do 3o termo soma-se os dois anteriores. 1, l, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 16. Escreva um algoritmo para calcular o reajuste salarial de uma empresa que possui 100 funcionrios, de acordo com os seguintes critrios: - os funcionrios com salrio inferior a 10.000,00 devem ter um reajuste de 55%; - os funcionrios com salrio entre 10.000,00 (inclusive) e 25.000,00 (exclusive) devem ter um reajuste de 30%; e - os funcionrios com salrio superior a 25.000,00 devem ter um reajuste de 20%. 17. Faa um algoritmo para gerar os nmeros pares entre 20 e 50. Faa outro algoritmo utilizando a estrutura Para. 18. Uma empresa com 30 funcionrios decide presentear seus funcionrios com um bnus de Natal, cujo valor definido do seguinte modo: - os funcionrios do sexo masculino com tempo de casa superior a 15 anos tero direito a um bnus de 20% de seu salrio; - as funcionrias com tempo de casa superior a 10 anos tero direito a um bnus de 25% de seu salrio; e - os demais funcionrios tero direito a um bnus de 5.000,00. Elabore um algoritmo para calcular o valor do bnus concedido a cada funcionrio e o impacto de tal atitude no oramento da empresa (ou seja, o montante total dos bnus concedidos). 19. Faa um programa que leia 10 nmeros e obtenha: - a soma dos nmeros; - a mdia dos nmeros; - o maior nmero; e - o menor nmero. 20. Faa um algoritmo que solicite 2 nmeros e uma operao matemtica elementar. 21. Fazer um algoritmo onde dados 30 nmeros, imprima a mdia destes nmeros. Verifique se todos so positivos. 22. Fazer um algoritmo onde Dada a idade, dizer se adulto, jovem ou velho. 23. Fazer um algoritmo para identificar o maior nmero dentre 3 nmeros informados pelo usurio. 24. Faa um algoritmo onde, dados 2 nmeros, apresente-os ordenados. 25. Calcular a idade mdia de uma turma de alunos onde no conhecido a priori o nmero de alunos. Neste exemplo utilizaremos FLAG que indicar o trmino do nmero de alunos. Assumiremos que esta FLAG um nmero negativo.
57
26. Fazer um algoritmo para determinar o nmero de pessoas do sexo feminino de uma turma de alunos, onde para sexo=1 Feminino e sexo=2 masculino. A FLAG de finalizao 1. Imprima ao final o nmero de pessoas do sexo feminino. 27. Leia um nmero indeterminado de linhas contendo cada uma a idade de um indivduo. A ltima linha, que no entrar nos clculos, contm o valor da idade igual a zero. Calcule e escreva a idade mdia deste grupo de indivduos. 28. Supondo que a populao de um pas A seja da ordem de 90.000.000 de habitantes com uma taxa anual de crescimento de 3% e que a populao de um pas B seja, aproximadamente, de 200.000.000 de habitantes com uma taxa anual de crescimento de 1.5%, fazer um programa que calcule e escreva o nmero de anos necessrios para que a populao do pas A ultrapasse ou se iguale populao do pas B, mantidas essas taxas de crescimento. 29. Tem-se um conjunto de dados contendo a altura e o sexo (masculino=1, feminino=2) de N pessoas. Fazer um programa que calcule e escreva: - a maior e a menor altura do grupo; - a mdia de altura das mulheres; - o nmero de homens; - % de mulheres. Adotar como FLAG altura < 0. 30. Uma pesquisa sobre algumas caractersticas fsicas da populao de uma determinada regio coletou os seguintes dados, referentes a cada habitante, para serem analisados: - sexo (masculino, feminino); - cor dos olhos (azuis, verdes, castanhos); - cor dos cabelos (louros, castanhos, pretos); - idade em anos. Para cada habitante, foi perfurado um carto com esses dados, e o ltimo carto, que no corresponde a ningum, conter o valor da idade igual a 1. Fazer um programa que determine e escreva: - a maior idade dos habitantes; - porcentagem de indivduos do sexo feminino cuja idade est entre 18 e 35 anos, inclusive, e que tenham olhos verdes e cabelos louros. 31. Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Pra isto, mandou digitar uma linha para cada mercadoria com o nome, preo de compra e preo de venda das mesmas. Fazer um programa que: Determine e escreva quantas mercadorias proporcionam: Lucro < 10% 10% Lucro 20% Lucro > 20% Determine e escreva o valor total de compra e de venda de todas as mercadorias assim como o lucro total. Observao: Adotar um flag adequado. 32. A UDESC deseja fazer um levantamento a respeito de seu concurso vestibular. Para cada curso, fornecido o seguinte conjunto de valores: - cdigo do curso; - nmero de vagas; - nmero de candidatos do sexo masculino; - nmero de candidatos do sexo feminino. O ltimo conjunto, para indicar fim de dados, contm o cdigo do curso igual a zero. Fazer um programa que:
58
calcule e escreva, para cada curso, o nmero de candidatos por vaga e a porcentagem de candidatos do sexo feminino (escreva tambm o cdigo correspondente do curso); determine o maior nmero de candidatos por vagas e escreva esse nmero juntamente com o cdigo do curso correspondente (supor que no haja empate); calcule e escreva o total de candidatos.
33. Escreva um programa que leia uma string, conte quantos caracteres desta string so iguais a a e substitua os que forem iguais a por b. O programa deve imprimir o nmero de caracteres modificados e a string modificada. 34. Faa um programa que inverta uma string: leia a string com gets e armazene-a invertida numa outra string. Use a estrutura Para-Faa para percorrer a string at o seu final.
59
6.1 - Introduo
Existem diversas situaes na rea de processamento de dados que existe a necessidade de se armazenar um grande conjunto de dados na memria RAM do computador. Muitas dessas situaes os dados esto relacionados. Por Exemplo: 1. 2. Ler todos os nomes dos alunos da turma de ICC e ordena-los alfabeticamente. Ler todas as notas dos alunos desta turma e classifica-los imprimindo os que tiveram mdia acima de sete. 3. Etc. Nestes casos invivel utilizarmos uma varivel para cada aluno ou nota, sendo assim, as linguagens de programao incluem um mecanismo chamado varivel indexada que permite realizar este armazenamento com uma nica varivel. O termo indexada provm da maneira como esta individualizao feita: por meio de ndices. Variveis indexadas so denominadas matrizes que se dividem em duas partes: Matrizes Unidimensionais : tambm chamadas vetores (um nico ndice usado); Matrizes Multidimensionais : duas ou mais dimenses (possui dois ou mais ndices).
60
6.2.1 - Atribuio
No caso de variveis indexadas, alm do nome da varivel deve-se necessariamente fornecer tambm o(s) ndice(s) da componente do conjunto onde ser armazenado o resultado da avaliao da expresso. Naturalmente, tambm possvel usar conjuntos no meio de expresses, como se faz com variveis simples, desde que seja especificado o elemento do conjunto que servir como operando. Exemplos: NUMEROS[2] SALARIOS[3] NOMES[10] MATRIZ[5][8] 10; 100.00; JOO; - 3.6;
6.2.2 - Leitura
A leitura de um conjunto feita passo a passo, um componente por vez, usando a mesma sintaxe da instruo primitiva de entrada de dados (Leia nome_varivel). Mais uma vez, alm do nome do conjunto, deve ser explicitada a posio do componente lido. Exemplo: Exemplo_622() { Inteiro Numeros[10], i; Para (i 0; i < 10; i i + 1) { Escreva(%I - Nmero: , i+1); Leia (%I,&Numeros[ i ]); } } Uma observao importante a ser feita o uso da construo Para-Faa a fim de efetuar a operao de leitura dez vezes, em cada uma delas lendo um determinado componente do vetor. De fato, o uso desta construo muito comum quando se opera com conjuntos, devido necessidade de se realizar uma mesma operao com os diversos componentes dos mesmos. Na verdade, so raras as situaes em que se deseja operar isoladamente com um nico componente do conjunto.
61
6.2.3 - Escrita
A escrita de um conjunto obedece mesma sintaxe da instruo primitiva de sada de dados (<Escreva nome_varivel>). Mais uma vez, convm lembrar que, alm do nome do conjunto, deve-se tambm especificar por meio de seu(s) ndice(s) qual(is) o(s) componente(s) do vetor a ser(em) escrito(s). Exemplo 01: Exemplo_623() { Inteiro Numeros[10], i; Para (i 0; i < 10; i i + 1) { Escreva(%I - Nmero: , i+1); Leia (%I,&Numeros[ i ]); Escreva (%I,Numeros[ i ]); } } Exemplo 02: Exemplo_624() { Real Numeros[10], Soma; Inteiro i; Para (i 0; i < 10; i i + 1) { Escreva(%I - Nmero: , i+1); Leia (%I,&Numeros[ i ]); Soma Soma + Nmeros[i]; } Escreva (Soma = %R, Soma); }
62
Matrizes unidimensionais so, essencialmente, listas de informaes do mesmo tipo, que so armazenadas em posies contguas da memria em uma ordem de ndice.
Obs.: Um detalhe importantssimo da linguagem C no tratamento destas variveis que o ndice de acesso a um dos valores de uma varivel com N elementos vai de 0 (zero) at (N 1), diferente da maioria das outras linguagens que vo de 1 a N. Em funo deste range de variao muito comum as linhas de programa com Para_Faa com ndices que variam de 0, enquanto for menor que o tamanho N. Exemplo 01: Ler trs nmeros inteiros, achar a mdia e imprimir os nmeros maiores que a mdia. Soluo Tradicional: Algoritmo <Programa_Imprime> Incio Inteiro A1, A2, A3; Real Media; Ler A1; Ler A2; Ler A3; Media (A1 + A2 + A3) / 3; Se (A1 > Media) ento Escreva A1; Fim_Se Se (A2 > Media) ento Escreva A2; Fim_Se Se (A3 > Media) ento Escreva A3; Fim_Se Fim Modelo de Memria A1 5 A2 7 A3 8 Media 6.6
Exemplo 02: Algoritmo <Programa_10> Incio Real X1, X2, X3, ..., X10, Media; Ler X1; Ler X2; Ler X3; : : Ler X10; Media (X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10) / 10; Escreve Media; Escreve X1; Escreve X2; : : Escreve X10; Fim O uso de variveis indexadas nos d a possibilidade de combinar o nome de uma varivel com um ndice numrico. O nome da varivel associado com o valor numrico est relacionado a uma posio de memria.
Exemplo: Varivel Real Aux[10] significa que na memria foi reservado 10 posies e se pode ler e atribuir 10 valores a esta varivel que so diferenciados por seus ndices. 1a Entrada de Dados Aux[0] = 1; Aux[1] = 5; Aux[2] = 3; : : Aux[9] = 45; 2a Entrada de Dados (Mudana de Valores) Aux[0] = 15; Aux[1] = 25; Aux[9] = 2;
64
Um vetor definido da seguinte forma: <tipo varivel> <nome_varivel>[N de itens]; Exemplos: Inteiro X[5]; Real R[3];
Modelo de Memria X[0] ? X[1] ? X[2] ? X[3] ? X[4] ? R[0] ? R[1] ? R[2] ?
Vantagens:
- Com nica definio de varivel pode-se armazenar vrios valores na memria do computador; - O acesso pode ser feito diretamente ou atravs de um ndice; - Facilidade de adicionar grandes quantidades de valores na memria; - Simplificao do cdigo para leitura e escrita de valores.
Exemplos: R[0] = 5; R[2] = 9; Ou Para (i 0; i < 5; i i + 1) Faa X[ i ] 10; Fim_Para // Ao final todos os elementos de X[0 5] esto com valores 10. Modelo de Memria X[0] 10 X[1] 10 X[2] 10 X[3] 10 X[4] 10 R[0] 5 R[1] ? R[2] 9
Para (i 0; i < 3; i i + 1) Faa Ler R[ i ]; Fim Para Modelo de Memria ao final do Para-Faa R[0] 5 R[1] 7 R[2] 8 i + 1) Faa
65
Algoritmo <Imprime_vetor> Inicio Inteiro A[100], i; Real Media, Soma; Soma 0; Para (i 0; i < 100; i i + 1) Faa Ler A[ i ]; Soma Soma + A[ i ]; Fim_Para; Media Soma / 100; Para (i 0; i 100; i i + 1) Faa Se (A[ i ] > Media) ento Escreva A[ i ]; Fim_se Fim_Para Fim
Exemplo: Ler um nome e verificar se o mesmo se encontra num vetor de 100 nomes utilizando a pesquisa seqencial.
Algoritmo <Pesq_Seq> Inicio Literal Valor[30], Nomes [100][30]; Inteiro i, Achou; Para (i 0; i < 100; i i + 1) faa Escreva (Nome: ); Leia Nomes[ i ]; Fim_Para
66
Escreva(Nome a ser pesquisado: ); Leia Valor; i 0; Achou 0; Enquanto (i < 100 .E. !Achou) faa Se (Nomes[ i ] = Valor) ento Achou 1; Seno i i + 1; Fim_Se Fim_Enquanto Se (Achou) ento Escreva (O nome %L foi encontrado, Valor); Seno Escreva(O nome %L no foi encontrado, Valor); Fim_se Fim
Exemplo: Algoritmo<Pesq_Bin> Incio Literal Valor[30], Nomes[100][30]; Inteiro Meio, Alto, Baixo, Achou; Para (i 0; i < 100; i i + 1) faa Escreva (Nome: ); Leia Nomes[ i ]; Fim_Para Escreva(Nome a ser pesquisado: ); Leia Valor; Achou 0; Baixo 0; Alto 99;
67
Enquanto (Baixo <= Alto .E. !Achou) Faa Meio (Baixo + Alto) / 2; Se (Valor < Nomes[Meio]) ento Alto Meio 1; Seno Se (Valor > Nomes[Meio]) ento Baixo Meio + 1; Seno Achou 1; Fim_Se Fim_se Fim_Enquanto Se (Achou) ento Escreva (O nome %L foi encontrado, Valor); Seno Escreva(O nome %L no foi encontrado, Valor); Fim_se Fim
O mtodo de pesquisa binria tem a desvantagem de exigir que o vetor seja previamente ordenado para seu correto funcionamento, o que no acontece no caso da pesquisa seqencial. Por outro lado, o mtodo da pesquisa binria em mdia mais rpido que o mtodo de pesquisa seqencial.
68
Exemplo: Classificao de um vetor de dez elementos reais em ordem crescente. Algoritmo<Bolha> Incio Real Numeros[10], aux; Inteiro i, j; Para (i 0; i < 10; i i + 1) faa Escreva (Nmero: ); Leia Numeros[ i ]; Fim_Para j 9; Enquanto (j > 0) faa Para (i 0; i < j; i i + 1) faa Se (Numeros[ i ] > Numeros[i + 1]) ento Aux Numeros[ i ]; Numeros[ i ] Numeros [i + 1]; Numeros[i + 1] Aux; Fim_se Fim_Para j j 1; Fim_Enquanto Escreva (Vetor Ordenado: ); Para (i 0; i < 10; i i + 1) faa Escreva (%R, Numeros[ i ]); Fim_Para Fim
69
6.3.4 Exerccios
6.3.4.1 Faa um algoritmo para ler, somar e imprimir 10 valores (utilizar 3 estruturas Para). 6.3.4.2 Escreva um novo algoritmo usando no mximo duas estruturas Para-Faa. 6.3.4.3 Faa um algoritmo para ler n valores. Aps todos os elementos lidos calcular a soma, a mdia e ao final imprimir os valores, ou seja, quando o usurio entrar com o valor 0 (zero = Flag). 6.3.4.4 Dado um vetor com 10 elementos (lidos do teclado), verifique se o valor 25 pertence a este conjunto de dados. Se pertencer imprima a posio do vetor em que est armazenada. 6.3.4.5 Dado o vetor inteiro [100]: a) preenche-lo com valor -1; b) preenche-lo com o valor 2, 4, 6, 8, ..., 200; c) preenche-lo com o valor 1, 2, 3, 5, 8, 13, ... 6.3.4.6 Ler o nome e idade de 25 alunos. Calcular a mdia e imprimir o nome e idade dos alunos com idade inferior a mdia. 6.3.4.7 Faa um algoritmo para ler um conjunto de dados inteiros at que seja encontrado um valor negativo ou igual a zero. Aps a insero de todos os valores, calcule a soma e a mdia dos valores lidos (exceto o ltimo) e ao final imprima todos os valores. 6.3.4.8 Dados os vetores abaixo: A=
0 1 2 3 4 5 6 7
8
0
7
1
6
2
5
3
4
4
3
5
2
6
1
7
B=
Fazer um algoritmo para somar os dois vetores e armazenar o resultado em um vetor C. 6.3.4.9 Elabore um algoritmo que leia N nmeros reais (N < = 1000) e imprima-os em ordem inversa. 6.3.4.10 A UDESC SBS promoveu um vestibular onde se inscreveram 1.000 alunos. Para cada aluno dado o cdigo e suas respostas (10). Tambm fornecido um gabarito com as respostas corretas (10 questes A, B, C, D). Faa um programa para ler o gabarito, o nome e as respostas de cada candidato a partir do gabarito, calcule a nota de cada um e armazene este valor. Imprima ao final os cdigos aprovados com mdia superior a 5.0. 6.3.4.11 Ler 30 nmeros inteiros e armazena-los em um vetor. Conte o nmero de valores que so iguais a trs e imprima a posio do vetor em que esto armazenados. 6.3.4.12 Ler para um conjunto de alunos o nome, cdigo, nota e freqncia. a) Imprima um relatrio com os alunos aprovados com nota maior ou igual a sete; b) Imprima um relatrio com os alunos reprovados por falta (freqncia menor que 75%); c) Imprima um relatrio dos alunos reprovados por nota. Estas opes de relatrio devem ser atravs de um menu de opes. 6.3.4.13 Ler duas variveis unidimensionais A e B, contando, cada uma, 25 elementos inteiros. Intercale os elementos destes dois conjuntos formando uma nova varivel de 50 elementos.
70
A=
...
24
100
0
200
1
500
2
300
3
250
4
15
5
...
...
351
24
B=
1
0
2
1
3
2
4
3
5
4
6
...
...
49
8
49
C=
100
200
500
...
351
6.3.4.14 Dado um vetor com 20 posies com valores inteiros lidos do teclado, verificar se o ltimo valor armazenado (Vetor[19]) est repetido entre as posies 0 ... 18 do mesmo vetor. Se estiver, quantas vezes? 6.3.4.15 Ler o nome e o salrio de n funcionrios e armazena-los em vetores. Ao final da leitura, imprimir o nome e o salrio de todos os funcionrios. 6.3.4.16 Idntico ao anterior, sendo que foi concedido um aumento de 30% para todos os funcionrios. 6.3.4.17 Faa um algoritmo para ler o nmero de matrculas e a idade de 10 alunos. Calcule e imprima a mdia e a soma de idades. Ao final, imprima o nmero de matrcula e a idade de cada aluno. 6.3.4.18 Faa um algoritmo para ler as fichas de um conjunto de N funcionrios. O valor N digitado pelo operador do programa. As fichas contm os seguintes dados: - Nome; - Idade; - Salrio. Calcular um novo salrio para os funcionrios com salrio inferior a R$ 500,00 com um aumento de 20%. Ao final imprima o nome, idade, e salrio de todos os funcionrios. 6.3.4.19 Faa um algoritmo para ler o nmero de matrcula e a idade de N alunos. Calcule e imprima a mdia e a soma das idades. Tambm imprima o nmero de matrcula do aluno que possuir maior idade, bem como sua idade. Ao final, imprima o nmero de matrculas e a idade de todos os alunos. Relatrios: 1 Nome dos alunos por ordem crescente de idade; 2 Por ordem crescente de idade. 6.3.4.20 Faa um algoritmo para ler N valores (onde N lido do teclado) para cada conjunto de dados lido o nmero do empregado, o salrio, a idade e o sexo (0 para feminino e 1 para masculino). Calcule ao final da leitura dos dados: - A soma dos salrios; - Aumento de 10% para todos. Imprima: - A soma dos salrios; - A mdia dos salrios; - O nmero, novo salrio, idade e o sexo para cada funcionrio; - O maior e o menor salrio com o nmero do funcionrio que o recebe. 6.3.4.21 Um professor tem uma turma de 20 alunos e deseja calcular e imprimir a nota de cada aluno seguido da mdia da turma. Aluno 1 = 10 Mdia da Turma = 10.0 Aluno 2 = 5 Mdia da Turma = 7.5 Faa um algoritmo para o problema acima, usando as estruturas Enquanto-Faa e Para-Faa. 6.3.4.22 Faa um algoritmo para calcular o nmero de alunos que tiraram nota acima da mdia da turma. As notas sero fornecidas via teclado e a turma tem 10 alunos.
71
6.3.4.23 Fazer um algoritmo para calcular o nmero de alunos que tiraram nota acima da nota mdia da turma. Imprimir o nmero de matrcula e anota destes alunos. As notas e os nmeros so fornecidos via teclado e a turma tem 40 alunos. 6.3.4.24 Um conjunto de dados com os dias do ano e a temperatura mdia do dia fornecida. Elabore um algoritmo que calcule e escreva: - A menor temperatura ocorrida no ano; - A maior temperatura ocorrida no ano; - A temperatura mdia anual; - O nmero de dias em que a temperatura foi inferior mdia anual, tambm imprima o dia (1 ... 365) e a mdia de temperatura do dia. 6.3.4.25 Desenvolver um programa para ler do teclado um conjunto de fichas de funcionrios de uma empresa chamada Casa Velha. Cada ficha tem as informaes de idade, salrio e nome. A flag para trmino das fichas o salrio = 0. Ao final da leitura das fichas, o programa deve apresentar um menu de relatrios com os seguintes itens: 1 Imprimir o nome de todos os funcionrios; 2 Imprimir o nome e o salrio de todos os funcionrios; 3 Imprimir o nome, o salrio e o novo salrio considerado um aumento de 30% para todos; 4 Imprimir o nome e o salrio das pessoas que possuem o maior e o menor salrio; 5 Imprimir o nome da pessoa mais jovem e a posio que ela ocupa no vetor; 6 Fim. Obs.: o programa deve continuar a apresentar o menu na tela aps cada relatrio, sendo que o programa deve finalizar somente aps se teclar a opo 6. 6.3.4.26 Faa um algoritmo para ler a idade de 6 alunos de uma estrutura e imprimir as idades em ordem crescente. 6.3.4.27 Escrever um algoritmo para ler uma varivel unidimensional A de 25 elementos e inverter estes elementos armazenando-a num vetor B. A=
0 1 2 3 4 ... 23 24
10
0
20
1
30
...
40
20
50
21
...
22
80
23
90
24
B=
90
80
...
50
40
30
20
10
6.3.4.28 Ler 50 valores inteiros, multiplicar todos os valores por uma constante lida do teclado. Imprimir a posio de todos os valores que so iguais a 20 e os que tem valor negativo. 6.3.4.29 Ler um conjunto de valores inteiros de 10 posies e armazenar em um vetor. Ordena-los em forma crescente. 6.3.4.30 Idem ao anterior mas em ordem decrescente. 6.3.4.31 Escrever um algoritmo que faa reserva de passagens areas de uma companhia. Alm da leitura do nmero dos vos e da quantidade de lugares disponveis, ler vrios pedidos de reserva, constitudos do nmero da carteira de identidade do cliente e do nmero do vo desejado. Para cada cliente, verificar se h disponibilidade no vo desejado. Em caso afirmativo, imprimir o nmero da identidade do cliente e o nmero do vo, atualizando o nmero de lugares disponveis. Caso contrrio, avisar ao cliente da inexistncia de lugares. Indicando o fim dos pedidos de reserva, existe um passageiro cujo nmero da carteira de identidade 99999. Considerar fixo e igual a 37 o nmero de vos da companhia.
72
6.3.4.32 So lidos dois vetores: O 1 com a descrio das mercadorias e o 2 com a quantidade de mercadorias existentes. A seguir, so lidos os pedidos dos clientes que contm o cdigo do cliente, o nome do produto e a quantidade de produtos. O nmero de mercadorias disponveis igual a 100. O cdigo do cliente que finaliza os produtos igual a 0. Fazer um algoritmo para: - Ser lido e listado o estoque inicial; - Seja verificado, para cada pedido, se ele pode ser integralmente atendido; Em caso negativo, seja impresso o cdigo do cliente e a mensagem: No temos a mercadoria em estoque suficiente; - Seja atualizado o estoque aps cada pedido; - Seja listado o estoque final. 6.3.4.33 Faa um algoritmo para ler 50 valores inteiros. Faa um menu de opes e execute o programa de acordo com a opo escolhida. 1 Soma e impresso de todos os valores; 2 Produto de todos os valores; 3 Impresso dos valores ordenados por ordem decrescente; 4 Fim. Obs.: O menu deve ser apresentado at que seja digitado como opo de escolha o valor 4 (Fim). 6.3.4.34 Construir um algoritmo que, dado um vetor A de 20 elementos, calcule: S = (A0 A19)2 + (A1 A18)2 + ... + (A9 A10)2 6.3.4.35 A UDESC SBS deseja saber se existem alunos cursando, simultaneamente, as disciplinas de ICC e CDI. Existem disponveis, na unidade de entrada, os nmeros de matrcula dos alunos de ICC (no mximo 100 alunos) e de CDI (no mximo 140 alunos). Cada conjunto dos nmeros de matrcula dos alunos de uma disciplina tem a matrcula fictcia 999999 no final. Formular um algoritmo que imprima o nmero de matrcula dos alunos que esto cursando estas disciplinas simultaneamente. Trata-se, ento, de verificao da ocorrncia de um elemento de um conjunto em outro conjunto. Assim, aps a leitura dos dados, estaro montadas as seguintes variveis compostas unidimensionais ICC e CDI, contendo, respectivamente, os nmeros de matrcula dos alunos que esto cursando estas duas disciplinas. 6.3.4.36 Fazer um algoritmo para corrigir provas de mltipla escolha. Cada prova tem 10 questes e cada questo vale 1 ponto. O primeiro conjunto de dados a ser lido ser o gabarito para a correo da prova. Os outros dados sero, os nmeros dos alunos e suas respectivas respostas, e o ltimo nmero, do aluno fictcio, ser 9999. O algoritmo dever calcular e imprimir: a) para cada aluno, o seu nmero e a sua nota; b) a porcentagem de aprovao, sabendo-se que anota mnima de aprovao 7; c) a nota que teve maior freqncia absoluta, ou seja, a nota que apareceu maior nmero de vezes (supondo a inexistncia de empates).
73
6.4.1 - Introduo
O recurso de se colocarem vrias constantes em uma s varivel no exclusivo do vetor; a matriz uma varivel que tambm apresenta essa caracterstica. A forma mais simples de matriz multidimensional a matriz bidimensional uma matriz de matrizes unidimensionais.
Matriz A Colunas
0 1 2 3 4
Linhas
A Tem dimenso 5 x 5
Uma matriz s pode armazenar constantes de um nico tipo. conveniente prestar bastante ateno declarao, pois muitas linguagens de computador usam vrgulas para separar as dimenses da matriz; C, em contraste, coloca cada dimenso no seu prprio conjunto de colchetes. Definio: <tipo varivel> <nome_varivel> <[Dim 1][Dim 2]>; onde Dim1 e Dim 2 so as dimenses da matriz (linha x coluna). Exemplo: Inteiro A[5][5]; //uma matriz inteira com 5 linhas e 5 colunas.
Matrizes bidimensionais so armazenadas em uma matriz linha-coluna, onde o primeiro ndice indica a linha, e o segundo, a coluna.
74
Isso significa que o ndice mais a direita varia mais rapidamente do que o mais esquerda quando acessamos os elementos da matriz na ordem em que eles esto realmente armazenados na memria.
5 10
10 Linhas 20
Exemplo (inserindo constantes - zerando uma matriz): Algoritmo<Zera_Matriz> Inicio Inteiro A[5][5], i, j; Para (i 0; i < 5; i i + 1) faa Para (j 0; j < 5; j j + 1) faa A[i][j] 0; Fim_Para Fim_Para Fim num [t] [i]
0 0 1 2 3 4 1 2 3 4
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Exemplo (inserindo constantes): Algoritmo<um_a_doze> Inicio Inteiro num[3][4], t, i; Para (t 0; t < 3; t t + 1) faa Para (i 0; i < 4; i i + 1) faa num[t][i] (t * 4) + i + 1; Fim_Para Fim_Para //agora escreva-os... Para (t 0; t < 3; t t + 1) faa Para (i 0; i < 4; i i + 1) faa Escreva (%I, num[t][i]); Fim_Para Escreva(\n); //troca de linha Fim_Para Fim
0 1 2
0 1 5 9
1 2 6 10
2 3 7 11
3 4 8 12
Algoritmo<leitura_e_escrita> Inicio Inteiro mat[4][4], i, j; Para (i 0; i < 4; i i + 1) faa Para (j 0; j < 4; j j + 1) faa Leia mat[i][j]; //Leia (%I, mat[i][j]); Fim_Para Fim_Para //agora escreva-os... Para (i 0; i < 4; i i + 1) faa Para (j 0; j < 4; j j + 1) faa Escreva (%I, num[i][j]); Fim_Para Escreva(\n); //troca de linha Fim_Para Fim
76
6.4.4 - Exerccios
OBS.: Em todas as questes onde constar um nmero mximo a ser inserido, indica que esta varivel DEVE ser validada. Ex.: M < = 50 - onde no pode ser inserido um valor maior que 50.
a) Quantos elementos fazem parte do conjunto? b) Qual o contedo do elemento identificado por A[4][5]? c) Qual o contedo de X aps a execuo do comando X = A[3][2] + A[4][1]? d) O que aconteceria caso fosse referenciado o elemento A[5][2] no algoritmo? e) Somar os elementos da quarta coluna (A[0][3] + A[1][3] + A[2][3] + A[3][3] + A[4][3]) - mediante algoritmo; f) Somar os elementos da terceira linha (A[2][0] + A[2][1] + A[2][2] + A[2][3] + A[2][4] + A[2][5]) mediante algoritmo; 6.4.4.2 - Dada a varivel bidimensional B de 100 linhas por 200 colunas, escrever o trecho de programa que calcula o somatrio dos elementos da 40 coluna. 6.4.4.3 - Com a mesma varivel composta do exerccio anterior, escrever o trecho de programa que calcula o somatrio dos elementos da 30 linha. 6.4.4.4 - Faa o programa para preencher os elementos de uma matriz (5 x 3) com o valor 6. Imprimir a matriz. 6.4.4.5 - Faa um programa para ler uma matriz (3 x 4) e multiplique os elementos pares por 3 (trs) e os elementos mpares por 2 (dois). Imprimir a matriz resultado. 6.4.4.6 - Faa o programa para preencher os elementos de uma matriz quadrada (6 x 6) com o valor 0 quando o valor da linha igual ao valor da coluna, e com 1 para os demais elementos. Imprimir a matriz. 6.4.4.7 - Faa um programa para ler uma matriz de dimenses (M x N) e copiar os elementos para uma outra matriz trocando a seqncia de leitura na Segunda Matriz. Exemplo: A 4 6 2 6 3 8 1 7 B 7 1 8 3 6 2 6 4
6.4.4.8 - Fazer um programa para ler as variveis compostas A e B e fazer a soma dos elementos gerando a varivel composta C; portanto, nada mais do que a soma de matrizes o conjunto C = A + B; 6.4.4.9 - Fazer um programa que:
77
a)
b)
Leia as duas variveis compostas bidimensionais de dimenso M x N (M < 20, N < = 30). O valor de M e N esto perfurados no primeiro carto. Os cartes seguintes contm as linhas de cada uma das variveis. Calcule e imprima a soma dessas variveis.
6.4.4.10 - Fazer um programa que: Leia uma matriz A, de dimenso M x N (M < = 20, N < = 50). Os valores de M e N esto a) perfurados no primeiro carto. Os cartes seguintes contm cada um dos elementos de uma linha da matriz; b) Determine a matriz transposta de A; c) Imprima a matriz A e a sua transposta. A 9 32 16 11 34 17 Transposta de A 9 16 34 32 11 17
6.4.4.11 - Fazer um programa que: Leia uma matriz inteira A de M x N, onde os elementos de cada linha esto perfurados em um a) carto (M < = 20, N < = 10); b) Imprima a matriz lida; c) Calcule e imprima uma matriz modificada B (M x N + 1), sendo que os elementos da (N + 1)sima coluna so formados com o produto dos elementos da mesma linha. Exemplo: A 2 4 3 5 B 2 4 3 5 6 20
6.4.4.12 - Uma biblioteca possui oito departamentos. Cada departamento contm 40 estantes capazes de conter cada uma, 150 livros. Supondo que o livro padro tenha 200 pginas de 35 linhas por 60 colunas de caracteres, declarar uma varivel composta capaz de conter todos os caracteres presentes nos livros da biblioteca. 6.4.4.13 - Um grupo de pessoas respondeu a um questionrio composto de 10 perguntas. Cada pergunta contm cinco opes ou respostas possveis, codificadas de 1 a 5. Cada pergunta respondida com a escolha de apenas uma opo dentre as cinco possveis. As respostas de cada pessoa foram perfuradas em cartes, cada carto contendo o nome da pessoa e as 10 respostas dadas. O ltimo carto, utilizado como flag, contm o nome da pessoa igual a VAZIO. Fazer um programa para ler e imprimir os dados lidos e calcular e imprimir o nmero de pessoas que responderam a cada uma das cinco opes de cada pergunta. 6.4.4.14 - Fazer um programa que leia e imprima uma varivel composta bidimensional cujo contedo a populao dos 10 (dez) municpios mais populosos de cada um dos 25 estados brasileiros. 0 0 ... 24 1 ... 9 Populao [i][j] Populao do j-simo municpio do i-simo estado
Determinar e imprimir o nmero do municpio mais populoso e o nmero do estado a que pertence. Considerando que a primeira coluna contm sempre a populao da capital do estado, calcular a mdia da populao das capitais dos 25 estados. 6.4.4.15 - Fazer um programa que: a) Leia uma matriz quadrada real A, de dimenso M x M (M < = 20). O valor de M est perfurado no primeiro carto. Os cartes seguintes contm cada um, os elementos de uma linha da matriz;
78
b) c)
Verifique se a matriz simtrica, ou seja, se A[i][j] = A[j][i] para i, j < = M; Imprima a palavra SIMTRICA, se a matriz A for de simetria, e NO SIMTRICA, caso contrrio.
6.4.4.16 - A varivel composta X, de N linhas por 4 colunas, contm informao sobre alunos da universidade. Os elementos da primeira, segunda, terceira e quarta colunas so respectivamente, o nmero de matrcula, sexo (0 ou 1), nmero do curso e a mdia geral do curso. Fazer um programa que: a) Leia o nmero N de alunos (N < = 2000); b) Leia as informaes sobre os alunos; c) Determine e imprima o nmero da matrcula do aluno de sexo 1, curso 153 que obteve a melhor mdia. Supor a inexistncia de empate. 6.4.4.17 - Fazer um programa que efetue um produto matricial. Seja (M x N) e B (N x M) as matrizes fatores, sendo M < = 40 e N < = 70. Devero ser impressas as matrizes A, B e a matriz produto obtida. 6.4.4.18 - A tabela dada, a seguir, contm vrios itens que estocados em vrios armazns de uma companhia. fornecido, tambm, o custo de cada um dos produtos armazenados.
Produto 1 (unid.) Armazm 1 Armazm 2 Armazm 3 Custo (R$) Produto 2 (unid.) Produto 3 (unid.)
Fazer um programa que: a) Leia o estoque inicial; b) Determine e imprima quantos itens esto armazenados em cada armazns; c) Qual o armazm que possui a maior quantidade de produto 2 armazenado. d) O custo total de cada produto em cada armazm; estoque em cada armazm; cada produto em todos os armazns. 6.4.4.19 - Ler uma matriz e imprimir os elementos da diagonal principal. 6.4.4.20 - Leia uma matriz M x N (M < = 10 e N < = 20), e em seguida ordene-a em ordem crescente. Ao final, imprima esta matriz, ordenada. 6.4.4.21 - Ler uma matriz e somar o valor de uma constante, lida do teclado, matriz triangular superior. Imprimir a matriz resultante. 6.4.4.22 - Calcular o produto de uma matriz A x B. Obs.: Verifique as dimenses. 6.4.4.23 - Ler uma matriz A[10][10], somar os elementos de cada uma das linhas e armazenar em um vetor V[10]. Imprimir a matriz A, o vetor V e a soma dos elementos do vetor. Obs.: Realizar toda a impresso ao final. 6.4.4.24 - Ler uma matriz A e calcular a soma dos elementos da diagonal principal. 6.4.4.25 - Fazer um programa que: a) Leia duas matrizes quadradas A e B com M < = 10; b) Apresente um menu ao usurio que possibilite a escolhas das seguintes opes: soma (em uma matriz C), multiplicao (em uma matriz C) e ordenao (da matriz A); c) Realize a opo desejada pelo usurio e imprima.
79
7.1 Definio
Os caracteres so peas fundamentais dos programas-fonte. Cada programa composto de uma seqncia de caracteres que ao serem agrupados de uma forma significativa so interpretados pelo computador como uma srie de instrues usadas para realizar uma tarefa. Um programa pode conter constantes de caracteres. Uma constante de caractere um valor inteiro representado como um caractere entre aspas simples. O valor da constante de caracteres o valor inteiro do caractere no conjunto de caracteres do equipamento. Por exemplo, z representa o valor inteiro do z, e \n representa o valor inteiro de uma nova linha. Uma string uma srie de caracteres tratada como uma unidade simples. Uma string pode incluir letras, dgitos e vrios caracteres especiais como +, -, *, /, $ e outros. Ou seja, strings so vetores de caracteres. Devemos apenas ficar atentos para o fato de que as strings tm o seu ltimo elemento como um '\0' (nulo). A declarao geral para uma string : char nome_da_string [tamanho];
Logo, as strings devem ser igualadas elemento a elemento. Quando vamos fazer programas que tratam de string muitas vezes podemos fazer bom proveito do fato de que uma string termina com '\0' (isto , o nmero inteiro 0). Veja, por exemplo, o programa abaixo que serve para igualar duas strings (isto , copia os caracteres de uma string para o vetor da outra): #include <stdio.h> void main () { int cont; char str1[100],str2[100]; .... /* Aqui o programa le str1 que sera copiada para str2 */
80
.... }
A condio no loop Para acima baseada no fato de que a string que est sendo copiada termina em '\0'. Quando o elemento encontrado em str1[count] o '\0', o valor retornado para o teste condicional falso (nulo). Desta forma a expresso que vinha sendo verdadeira (no zero) continuamente, torna-se falsa.
strcpy (str2,str1); /* Copia str1 em str2 */ strcpy (str3,"Voce digitou a string "); /* Copia "Voce digitou a string" em str3 */ printf ("\n\n%s%s",str3,str2); }
A sua forma geral : strlwr(string); A funo strlwr() converte a string apontada por str em letras minsculas. Ela retorna str.
84
85
printf("\nEntre com uma palavra(maximo 8 caracteres) <ENTER>: "); do{ i++, palavra[i]=getchar(); }while ((palavra[i] != 10)&&(i<7)); palavra[i+1] = '\0'; printf("\nA palavra digitada foi %s",palavra); printf("\nEntre com um numero <ENTER>: "); scanf("%d",&numero); printf("\nO numero digitado foi %d",numero); } Caso haja a insero de uma palavra com mais de 8 caracteres, que o tamanho mximo de palavra, o texto digitado a mais ficar guardado no buffer do teclado e conseqentemente ser utilizado para atribuir um valor a numero no comando scanf() logo em seguida, gerando um erro. Para que este erro no ocorra, necessria a utilizao do comando fflush(stdin) para que seja feita esta limpeza. Com o trmino normal do programa ou quando os buffers esto cheios, os mesmos so automaticamente esvaziados, porm, no programa anterior, precisamos realizar esta operao antes do comando de leitura de numero. Ento inserimos a linha fflush(stdin); antes da linha de leitura. Explanao do comando: Inicialmente necessrio entender o conceito de Streams: O sistema de arquivos de C projetado para trabalhar com uma ampla variedade de dispositivos, incluindo terminais, acionadores de disco e acionadores de fita. Embora cada um dos dispositivos seja muito diferente, o sistema de arquivo com buffer transforma-os em um dispositivo lgico chamado de stream. Todas as streams comportam-se de forma semelhante. Pelo fato de as streams serem amplamente independentes do dispositivo, a mesma funo pode escrever em um arquivo em disco ou em algum outro dispositivo, como o console. As Streams Padro Sempre que um programa em C comea a execuo, trs streams so abertas automaticamente. Elas so a entrada padro (stdin), a sada padro (stdout) e a sada padro de erro (stderr). Normalmente, essas streams referem-se ao console, mas podem ser redirecionadas pelo sistema operacional para algum outro dispositivo em ambientes que suportam redirecionamentos de E/S. Em geral, stdin utilizada para ler do console e stdout e stderr , para escrever no console. Tenha em mente que stdin, stdout e stderr no so variveis no sentido normal e no podem receber nenhum valor. Alm disso, da mesma maneira que so criados automaticamente no incio do seu programa, os ponteiros so fechados automaticamente no final; voc no deve tentar fecha-los. O comando fflush Biblioteca: stdio.h Tipo: int flush(FILE *stream); Se stream aponta para um arquivo de entrada, o contedo do buffer de entrada esvaziado. Caso a stream seja associada a um arquivo aberto para escrita, uma chamada a fflush() escreve fisicamente no arquivo o contedo do buffer de sada. Nos dois casos o arquivo continua aberto. Exemplo Corrigido: include <stdio.h> void main(){
86
int numero; char palavra[9]; int i=-1; printf("\nEntre com uma palavra(maximo 8 caracteres) <ENTER>: "); do{ i++, palavra[i]=getchar(); }while ((palavra[i] != 10)&&(i<7)); palavra[i+1] = '\0'; fflush(stdin); printf("\nA palavra digitada foi %s",palavra); printf("\nEntre com um numero <ENTER>: "); scanf("%d",&numero); printf("\nO numero digitado foi %d",numero); }
87
UNIDADE 8 - FUNES
8.1 - Introduo
A maioria dos programas de computador que resolvem problemas do mundo real muito maior do que os algoritmos que vimos at agora. A experincia tem mostrado que a melhor maneira de desenvolver e manter um programa grande constru-lo a partir de pequenas partes ou mdulos, sendo cada uma delas mas fcil de manipular do que o programa original. Os mdulos em C so chamados funes. Geralmente, os programas em C so escritos combinando novas funes que o programador escreve com funes prontas disponveis na biblioteca padro do C (C standard library).
8.2 - Funcionamento
O programador pode escrever funes para definir tarefas especficas e que podem ser utilizadas em muitos locais dos programas. Algumas vezes elas so chamadas funes definidas pelo programador. As instrues reais que definem a funo so escritas apenas uma vez e so escondidas das outras funes. As funes so ativadas (chamadas ou invocadas) por uma chamada de funo. A chamada de funo especifica o nome da funo e fornece informaes (como argumentos) de que a referida funo necessita para realizar a tarefa designada.
FUNES Conjunto de comandos agrupados em um bloco que recebe um nome e atravs deste pode ser ativado.
Melhor maneira de desenvolver e manter um programa grande constru-lo a partir de pequenas partes ou mdulos. Os mdulos em C so chamados de funes. As funes permitem ao programador modularizar um programa. Todas as variveis declaradas em definies de funes so variveis locais. Varivel local: Uma varivel local tem validade apenas dentro do bloco onde declarada, isto significa que podem ser apenas acessadas e modificadas dentro de um bloco. O espao de memria alocado para esta varivel criado quando a execuo do bloco iniciada e destrudo quando encerrado, assim variveis de mesmo nome mas declaradas em blocos distintos, so para todos os efeitos, variveis distintas. Variveis Globais: dita global, se for declarada fora do bloco de uma funo. Uma varivel global tem validade no escopo (por escopo de uma varivel entende-se o bloco de cdigo onde esta varivel vlida) de todas as funes, isto , pode ser acessada e modificada por qualquer funo. O espao de memria alocado para esta varivel criado no momento de sua declarao e destrudo apenas quando o programa encerrado.
88
Para que os blocos do programa no fiquem grandes demais e, por conseqncia, mais difceis de entender; Para facilitar a leitura do programa-fonte. Para separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada.
Exemplo: Achar o maior entre dois valores reais digitados pelo usurio: Corpo da funo antes do programa principal (SEM PROTOTIPAO) #include <conio.h> #include <stdio.h> float max(float a, float b){ if(a > b){ return(a); }else{ return(b); } }
// funcao max()
void main(){ // programa principal float num1,num2,m; clrscr(); puts("*** Valor maximo de dois reais ***"); puts("Digite dois numeros:"); scanf("%f %f",&num1,&num2); m = max(num1,num2); // chamada da funcao printf("O maior valor e': %f",m); getch(); } Corpo da funo depois do programa principal (COM PROTOTIPAO) #include <conio.h> #include <stdio.h> void main(){ // programa principal float max(float,float); // prototipo da funcao max() float num1, num2; clrscr(); puts("*** Valor maximo de dois reais ***"); puts("Digite dois numeros"); scanf("%f %f",&num1,&num2); printf("O maior valor e': %f",max(num1,num2)); // chamada a funcao getch(); } float max(float a, float b){ // funcao max() if(a > b){ return(a); }else{ return(b); } }
89
8.2.3 Exerccios:
1. Escreva uma algoritmo utilizando funoque retorne o menor nmero entre trs nmeros de ponto flutuante.
90
2.
Escreva um programa que determine e imprima todos os nmeros perfeitos entre 1 e 10.000, mediante utilizao de funo. Imprima os fatores de cada nmero encontrado para confirmar que ele realmente perfeito.
Sugesto: Escreva uma funo perfeito que determine se o parmetro numero um nmero perfeito.
3.
Mostre o valor de x aps a execuo de cada uma das seguintes instrues: a) x = fabs(7.5) b) x = floor(7.5) c) x = fabs(0.0) d) x = ceil(0.0) e) x = fabs(-6.4) f) x = ceil(-6.4) g) x = ceil(-fabs(-8+floor(-5.5))) Escreva um programa que leia vrios nmeros e use a instruo a seguir para arredondar cada um desses nmeros para o inteiro mais prximo. Para cada nmero processado, imprima o nmero original e o nmero arredondado. y = floor (x + .5);
4.
Sugesto: Os computadores esto desempenhando um papel cada vez maior em educao. Escreva um programa que ajudar os alunos da escola do primeiro grau a aprender a multiplicar. Use rand para produzir dois inteiros positivos de um dgito. O programa deve ento imprimir uma pergunta do tipo Quanto 6 vezes 7?. O aluno deve digitar a resposta. Seu programa deve imprimir Muito Bem! e fazer outra pergunta de multiplicao. Se a resposta estiver errada, o programa deve imprimir No. Tente novamente, por favor. e ento deixar que o aluno fique tentando acertar a mesma pergunta repetidamente at por fim conseguir. Modifique o programa anterior de forma que sejam impressos vrios comentrios para cada resposta correta e incorreta, como se segue: - Comentrios para uma resposta correta: - Muito Bem! - Excelente! - Bom Trabalho! - Certo. Continue assim! Comentrios para uma resposta incorreta - No. Tente novamente, por favor. - Errado. Tente mais uma vez. - No desista! - No. Continue tentando.
Modifique o programa anterior para que ele calcule a porcentagem de resposta corretas.
91
92
As quatro classes de armazenamento dos identificadores podem ser divididas em dois tempos de armazenamento: Tempo de Armazenamento Automtico e Tempo de Armazenamento Esttico. - Tempo de Armazenamento Automtico: So criadas quando o bloco no qual so declaradas acionado. Elas existem enquanto o bloco estiver ativo e so destrudas quando o bloco deixado para trs. Palavras-chave: auto e register. - Auto: As variveis locais possuem tempo de armazenamento automtico por default, portanto a palavra-chave auto raramente usada. - Register: Pode ser colocado antes de uma declarao de varivel automtica para indicar ao compilador que a varivel seja conservada em um dos registradores de hardware de alta velocidade do computador. Freqentemente usado com contadores ou para clculo de totais. - Tempo de Armazenamento Esttico: Existem desde o instante em que o programa comeou a ser executado. Entretanto, muito embora as variveis e os nomes das funes existam quando o programa comea a ser executado, isso no significa que esses identificadores podem ser usados em todo o programa. Palavras-chave: extern e static. - Extern: Variveis globais e nomes das funes so pertencentes desta classe por default. - Static: As variveis locais declaradas com static so conhecidas apenas na funo na qual so definidas, mas, diferentemente das variveis automticas, as variveis locais static conservam seus valores quando a funo encerrada. Na prxima vez em que a funo for chamada, a varivel local static conservar o valor que tinha quando a funo foi executada pela ltima vez.
93
Nome_vetor[ ] o nome do vetor. Declara-se um NDICE VAZIO para indicar que estamos recebendo um vetor. Ateno: Ao contrrio de variveis comuns, o contedo de um vetor PODE SER MODIFICADO pela funo chamada, como visto anteriormente. Isto ocorre porque a passagem de matrizes para funes feita de modo especial dito passagem por referncia ou endereo.
void main() { int a[N] = {0, 1, 2, 3, 4}; //inicializao do vetor printf("\nVetor Original: \n\n"); imprime_vetor(a); //chama a funo para a impresso do vetor, passando ele como argumento
94
modifica_vetor(a); //chama a funo para modificar os elementos do vetor printf("\nValores modificados do vetor: \n\n"); imprime_vetor(a); //imprime os elementos agora modificados printf("\n\nO valor de a[3] %d\n", a[3]); modifica_elemento(a[3]); // modifica um elemento isolado do vetor, porm este passado por valor printf("\n\nO valor de a[3] %d\n", a[3]); /*imprime o elemento no modificado, pois foi feita uma passagem por valor, que faz uma cpia deste valor e atribu a varivel e que tida como local na funo modifica_elemento*/ } void imprime_vetor(int b[]) //recebe um vetor inteiro b { for(int i=0; i<N; i++) printf("%3d ", b[i]); //imprime cada elemento isolado printf("\n"); } void modifica_vetor(int b[]) //recebe um vetor inteiro b { for(int i=0; i<N; i++) b[i] *= 2; //modifica cada elemento multiplicando ele mesmo por 2 } void modifica_elemento(int e) //recebe uma cpia do elemento passado como argumento para a funo. { printf("\n\nValor em Modifica_Elemento %d", e*=2); //tenta modificar o elemento }
95
8.5 RECURSIVIDADE
Definio Recurso o processo pelo qual uma funo chama a si mesma repetidamente um nmero finito de vezes. Funo Recursiva uma funo que chama a si mesma, ou diretamente ou indiretamente por meio de outra funo. Caractersticas Os mtodos recursivos para soluo de problemas possuem vrios elementos em comum. Uma funo recursiva chamada para resolver o problema. Na realidade, a funo s sabe resolver o(s) caso(s) mais simples, ou o(s) chamado(s) caso(s) bsico(s). Se a funo for chamada em um problema mais complexo, ela divide o problema em duas partes tericas: - um aparte que a funo sabe resolver; - e outra que ela no sabe. Funcionamento
96
Para tornar vivel a recurso, a segunda parte deve ser parecida com o problema original, mas ser uma verso um pouco mais simples ou menor do que ele. Por esse novo problema ser parecido com o problema original, a funo chama (lana) uma cpia de si mesma para lidar com o problema menor. A etapa de recurso executada enquanto a chamada original para a funo ainda no tiver sido concluda. Ela pode levar a outras chamadas recursivas, medida que a funo continuar a dividir cada problema em duas partes conceituais. Desvantagens A maioria das funes recursivas no minimiza significativamente o tamanho do cdigo nem melhora a utilizao da memria. Alm disso, as verses recursivas da maioria das rotinas podem ser executadas um pouco mais lentamente que suas equivalentes iterativas devido s repetidas chamadas funo (seqncia de overhead). Isso pode custar caro tanto em tempo de processador como em espao de memria. Vantagens A principal vantagem das funes recursivas que voc pode usa-las para criar verses mais claras e simples de vrios algoritmos. Observaes Aos escrever funes recursivas, voc deve ter um comando if em algum lugar para forar a funo a retornar sem que a chamada recursiva seja executada. Se voc no o fizer, a funo nunca retornar quando chamada. Recurso x Iterao RECURSO ITERAO Usa estrutura de seleo Usa estrutura de repetio Obtm repetio por intermdio de chamadas Usa explicitamente uma estrutura de repetio repetidas de funes Termina quando um caso bsico reconhecido Termina quando uma condio de continuao do loop se torna falsa Permanece produzindo verses mais simples do Permanece modificando um contador at que ele problema original at chegar no caso bsico assuma um valor que faa a condio de continuao do loop se tornar falsa Ocorre um loop infinito se a etapa de recurso no Ocorre um loop infinito se o teste de continuao do reduzir gradualmente o problema de forma que ele loop nunca se tornar falso convirja para o caso bsico
8.6 Exerccios
1 Crie um funo float round(float r) que faa o arredondamento de nmeros reais: Por exemplo: 5 = round(5.4), 7 = round(6.5). 2 Crie uma funo int sim_nao(void) que espera o usurio pressionar as teclas [s] ou [n] retornando 1 ou 0 respectivamente. Se o usurio pressionar qualquer outra tecla um som (de advertncia) de 50 Hz por 250 ms emitido.
97
3. Faa uma funo que determine se trs nmeros a, b, c formam um tringulo ou no. A funo deve ter a seguinte declarao int tringulo(float a, float b, float c) onde o valor de retorno tem o seguinte significado: 0: no forma tringulo, 1: tringulo qualquer, 2: tringulo issceles, 3: tringulo equiltero. 4. Faa uma funo que determine se um determinado numero primo ou no. A funo deve ter a seguinte declarao int primo(int N) onde N o valor a ser testado. A funo deve retornar 1 se N primo e 0 caso contrrio. 5. Transforme o programa do fibonacci em uma funo int fib(int n) que retorna o nsimo numero de Fibonacci. 6. O maior divisor comum dos inteiros positivos a e b, que abreviamos como mdc(a, b), o maior nmero m tal que m divisor tanto de a quanto de b. Por exemplo: 4 = mdc(20,16), 7 = mdc(21,7). O valor de m pode ser calculado com o seguinte algoritmo recursivo, de Euclides: se a > b ento mdc(a, b) igual a b se resto(a, b) 0 mdc(b, resto(a, b)) caso contrrio. Faa uma funo recursiva para o clculo do mximo divisor comum de dois nmeros. 7. Caso j no tenha feito assim, transforme a funo iterativa do exerccio 5 em uma funo recursiva.
98
UNIDADE 9 O PR-PROCESSADOR
Neste tpico sero apresentadas as explanaes de apenas algumas diretivas, por serem muito utilizadas no decorrer do semestre e por estarem presentes no escopo da disciplina de ICC.
9.1 Definio
Voc pode incluir diversas instrues do compilador no cdigo-fonte de um programa em C. Elas so chamadas de diretivas do pr-processador e, embora no seja realmente parte da linguagem de programao C, expandem o escopo do ambiente de programao em C. O pr-processamento ocorre antes de um programa ser compilado, ou seja, isto quer dizer que as diretivas de compilao so comandos que no so compilados. Portanto, o pr-processador modifica o programa fonte, entregando para o compilador um programa modificado. Algumas aes possveis so: incluso de outros arquivos no arquivo que est sendo compilado, definio de constantes simblicas e macros, compilao condicional do cdigo do programa e execuo condicional das diretivas do pr-processador. Todas as diretivas do pr-processador comeam com #, e somente os caracteres de espao em branco podem aparecer antes de uma diretiva de pr-processador em uma linha. Alm disso, cada diretiva do pr-processador deve estar na sua prpria linha.
No h ponto-e-vrgula aps a diretiva de compilao. Esta uma caracterstica importante de todas as diretivas de compilao e no somente da diretiva #include.
9.2 Diretivas
Como definido pelo padro C ANSI, o pr-processador de C contm as seguintes diretivas: #if #ifdef #ifndef #else #elif #endif #include #define #undef #line #error #pragma
99
A maioria dos programadores tipicamente usa chaves angulares para incluir os arquivos de cabealho padro. O uso de aspas reservado geralmente para a incluso de arquivos do projeto. No entanto, no existe nenhuma regra que exija este uso.
Substituio de macro simplesmente a transposio de sua string associada. Portanto, se voc quisesse definir uma mensagem de erro padro, poderia escrever algo como isto: #define MSG_E erro padro na entrada\n printf(MSG_E); O compilador substituir a string erro padro na entrada\n quando o identificador MSG_E for encontrado. Para o compilador, o comando com o printf() aparecer, na realidade, como printf(erro padro na entrada\n); Nenhuma substituio de texto ocorre se o identificador est dentro de uma string entre aspas. Por exemplo,
100
#define XYZ isso um teste printf(XYZ); no escreve isso um teste, mas XYZ. Se a string for maior que uma linha, voc pode continu-la na prxima colocando uma barra invertida no final da linha, como mostrado aqui: #define STRING_LONGA isso uma string muito longa\ que usada como um exemplo Os programadores C geralmente usam letras maisculas para identificadores definidos. Essa conveno ajuda qualquer um que esteja lendo o programa a saber de relance que uma substituio de macro ir ocorrer. Alm disso, melhor colocar todos os #defines no incio do arquivo ou em um arquivo de cabealho separado em lugar de espalha-los pelo programa. Substituio de macro usada mais freqentemente para definir nomes para nmero mgicos que aparecem em um programa. Por exemplo, voc pode ter um programa que defina uma matriz e tenha diversas rotinas que acessam essa matriz. Em lugar de fixar o tamanho da matriz com uma constante, voc poderia definir um tamanho e usar esse nome sempre que o tamanho da matriz for necessrio. Dessa forma, voc s precisa fazer uma alterao e recompilar para alterar o tamanho da matriz. Por exemplo, #define TAMANHO_MAX 100 /* ... */ float vetor[TAMANHO_MAX]; /* ... */ for (i=0; i<TAMANHO_MAX; i++) printf(%f, vetor[i]); Como TAMANHO_MAX define o tamanho da varivel vetor, se o tamanho desta precisar ser modificado no futuro, voc s precisa modificar a definio de TAMANHO_MAX. Todas as referncias subseqentes a ela sero automaticamente atualizadas quando voc recompilar seu programa. 9.2.2.3 Definindo Macros Semelhantes a Funes A diretiva #define possui outro recurso poderoso: o nome da macro pode ter argumentos. Cada vez que o nome da macro encontrado, os argumentos usados na sua definio so substitudos pelos argumentos reais encontrados no programa. As macros podem ser definidas com ou sem argumentos. Uma macro sem argumentos processadas como uma constante simblica. Considere a seguinte definio de macro com um argumento para calcular a rea de um crculo: #define AREA_CIRCULO(x) ( PI * (x) * (x) ) Sempre que AREA_CIRCULO(x) aparecer no arquivo, o valor de x substitui x no texto de substituio, a constante simblica PI substituda por seu valor (definido anteriormente) e a macro expandida no programa. Por exemplo, a instruo area = AREA_CIRCULO(4); expandida em
101
area = ( 3.14159 * (4) * (4) ); Como a expresso consiste apenas em constantes, durante a compilao, o valor da expresso calculado e atribudo varivel area. Os parnteses em torno de cada x no texto de substituio impem a ordem adequada de clculo quando o argumento da macro for uma expresso. Por exemplo, a instruo area = AREA_CIRCULO(c + 2); expandida em area = ( 3.14159 * (c + 2) * (c + 2) ); que calculada corretamente porque os parnteses impem a ordem adequada de clculo. Se os parnteses fossem omitidos, a expanso da macro seria area = 3.14159 * c + 2 * c + 2; que calculada erradamente como area = ( 3.14159 * c ) + (2 * c) + 2; devido a regra de precedncia de operadores. Para efetuar este clculo poderia ter sido definida uma funo, porm o overhead de uma chamada de funo. As vantagens da macro AREA_CIRCULO so que as macros inserem cdigo diretamente no programa evitando o overhead das funes e o programa permanece legvel porque o clculo de AREA_CIRCULO definido separadamente e recebe um nome significativo. Uma desvantagem que seu argumento calculado duas vezes. A seguir est uma definio de macro com 2 argumentos para a rea de um retngulo: #define AREA_RETANGULO(x, y) ( (x) * (y) ) Sempre que AREA_RETANGULO(x, y) aparecer no programa, os valores de x e y so substitudos no texto de substituio da macro e a macro expandida no lugar de seu nome. Por exemplo a instruo areaRet = AREA_RETANGULO(a + 4, b + 7); expandida em areaRet = ( (a + 4) * (b + 7) ); O valor da expresso calculado e atribudo a varivel areaRet.
102
ANEXO I Operadores
Os operadores de incremento e decremento so unrios que alteram a varivel sobre a qual esto aplicados. O que eles faze incrementar ou decrementar a varivel sobre a qual esto aplicados, de 1.
Ento: x++; x--; So equivalentes a: x = x + 1; x = x 1;
Estes operadores podem ser pr-fixados ou ps-fixados. A diferena que quando so pr-fixados eles incrementam e retornam o valor da varivel j incrementada. Quando so ps-fixados eles retornam o valor da varivel sem o incremento e depois incrementam a varivel.
x++ ++x x---x Exemplo: Incrementa() { Inteiro x, b; x = 1; b = x++; Escreva(x = %I, b = %I\n, x, b); } x = 2, b = 1 _ incrementa, devolvendo o valor NO atualizado incrementa devolvendo o valor atualizado decrementa devolvendo o valor NO atualizado decrementa devolvendo o valor atualizado
Teremos, no final y = 23 e x = 24
Teremos, no final y = 24 e x = 24
103
ANEXO II Expresses
Expresses que podem ser abreviadas
O C admite as seguintes equivalncias, que podem ser usadas para simplificar expresses ou facilitar o entendimento de um programa:
Expresso Original x = x + k; x = x k; x = x * k; x = x/k; x = x%k; Etc Expresso equivalente x+=k; x=k; x*=k; x/=k; x%=k;
Modeladores
Um modelador aplicado a uma expresso. Ele fora a mesma a ser de um tipo especificado. A sua forma geral : (tipo) expresso Exemplo: Modelador() { Inteiro num; Real f; num = 10; f = (Real)num/7; Escreva(%R, f); } Exerccios: 1. Considere as expresses que se seguem e transforme-as em expresses lineares para poderem ser compreendidas pelo compilador C. Se no se tivesse usado o modelador neste exemplo,o C faria uma diviso inteira entre 10 e 7. O resultado seria 1 (um) e este depois seria convertido para Real, mas continuaria a ser 1.0. Com o modelador tem-se o resultado correto.
1 b + + c2 c a) a = b 2+d c r
4+ r c2 1 b) b = a * + + 3 a 2 + t c
Notas: - A funo sqrt() devolve a raiz quadrada de um nmero passado como parmetro. - A funo pow() devolve o valor de um dado nmero elevada a um dado expoente, ambos passados como parmetro. Ex.: pox(x, 2) = x2
104
2. Diga o resultado das variveis depois da seguinte seqncia de operaes: a) Inteiro x, y, z; x = y = 10; z = ++x; x = -x; y++; x = x + y (z--); x y z
3. A expresso lgica (-5 || 0) && (3 > = 2) && (1 != 0) || (3 < 0) : a) Verdadeira b) Falsa c) Invlida, pois sua sintaxe est errada d) Nem verdadeira, nem falsa e) Nenhuma das opes anteriores
105
A Instruo Break
A instruo break quando executada em uma estrutura de repetio (Para-Faa, Enquanto-Faa e FaaEnquanto) faz com que acontea a sada imediata daquela estrutura. J no caso da estrutura Escolha, esta instruo quebra a execuo deste comando (switch). A execuo do programa continua com a primeira instruo depois da estrutura que est sendo interrompida. Os usos comuns da instruo break so para sair prematuramente de um loop, ou para saltar sobre o restante de uma estrutura Escolha (switch). Exemplo: 1 2 3 4 Inst_break() { Inteiro x; Para(x = 1; x< = 10; x++){ Se (x = = 5) ento break; Escreva (%I, x); } Escreva (\nSaiu do loop em x = = %I\n, x); }
Saiu do loop em x = = 5
A instruo Continue
O comando continue pode ser visto como sendo o oposto do break e s funciona dentro de uma estrutura de repetio (Para-Faa, Enquanto-Faa ou Faa-Enquanto). Este comando ignora (salta sobre) as instrues restantes no corpo daquela estrutura e realiza a prxima iterao do loop. em estruturas Enquanto-Faa e Faa-Enquanto, o teste de continuao do loop realizado imediatamente aps a instruo continue ser executada. Na estrutura Para-Faa, a expresso de incremento executada e depois o teste de continuao do loop realizado. Na estrutura Enquanto-Faa, caso a expresso de incremento encontre-se aps o comando continue, a mesma no executada antes de a condio do loop ser testada e o Enquanto-Faa no executado da mesma maneira que o Para-Faa.
Exemplo: Inst_Continue() { Inteiro x; Para(x = 1; x < = 10; x++){ Se (x = = 5) ento continue; Escreva(%I, x); 1 2 3 4 6 7 8 9 10
106
} }
Exerccios 1. Sendo num uma varivel inteira, o que imprime o trecho de cdigo a seguir? num = 1; Escolha(num){ Caso 1: Escreva(O nmero 1); Caso 2: Escreva(O nmero 2); Default: Escreva(O nmero diferente de 1 e 2); } 2. Os dois blocos de cdigo a seguir produzem o mesmo resultado? Faa o mapa de memria. a) b) Para(i = 0; i < 3; i++){ Para(j = 0; j < 3; j++) Escreva(i + j = %I\n, i+j); } Para(i = 0, j =0; i <3; i++){ Para( ; j < 3; j++) Escreva(i + j = %I\n, i+j); }
3. Qual a sada produzida pelo fragmento de cdigo a seguir: Inteiro x; Para(x = 35; x > 0; x/=3) Escreva(%I, x); 4. Os fragmentos de cdigo a seguir so equivalentes entre si? Faa o mapa de memria. b) Inteiro x = 10; Enquanto (--x > 9) Escreva(%I, x); Inteiro x = 10; Faa{ Escreva(%I, x); }Enquanto(--x > 9);
a)
107
As tabelas mostradas neste apndice representam os 256 cdigos usados nos computadores da famlia IBM. Esta tabela refere-se ao American Standard Code for Information Interchange (cdigo padro americano para troca de informaes), que um conjunto de nmeros representando caracteres ou instrues de controle, usados para troca de informaes entre computadores entre si, entre perifricos (teclado, monitor, impressora) e outros dispositivos. Estes cdigos tem tamanho de 1 byte com valores de 00h a FFh (0 a 255 decimal). Podemos dividir estes cdigos em trs conjuntos: controle, padro e estendido.
Os primeiros 32 cdigos de 00h at 1Fh (0 a 31 decimal), formam o conjunto de controle ASCII. Estes cdigos so usados para controlar dispositivos, por exemplo uma impressora ou o monitor de vdeo. O cdigo 0Ch (form feed) recebido por ima impressora gera um avano de uma pgina. O cdigo 0Dh (carriage return) enviado pelo teclado quando a tecla ENTER pressionada. Embora exista um padro, alguns poucos dispositivos tratam diferentemente estes cdigos e necessrio consultar o manual para saber exatamente como o equipamento lida com o cdigo. Em alguns casos o cdigo tambm pode representar um caracter imprimvel. Por exemplo o cdigo 01h representa o caracter (happy face).
Os 96 cdigos seguintes de 20h a 7Fh (32 a 127 decimal) formam o conjunto padro ASCII. Todos os computadores lidam da mesma forma com estes cdigos. Eles representam os caracteres usados na manipulao de textos: cdigos-fonte, documentos, mensagens de correio eletrnico, etc. So constitudos das letras do alfabeto latino (minsculo e maisculo) e alguns smbolos usuais.
Os restantes 128 cdigos de 80h at FFh (128 a 255 decimal) formam o conjunto estendido ASCII. Estes cdigos tambm representam caracteres imprimveis porem cada fabricante decide como e quais smbolos usar. Nesta parte do cdigo esto definidos os caracteres especiais: , , , ...
Vale ressaltar que o caractere resultante a partir de sua insero mediante a tecla Alt + valor decimal, poder variar de acordo com o tipo de fonte utilizado.
108
Dec.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Hex.
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
Controle
(Null) (Start of Heading) (Start of Text) (End of Text)
(End of Transmision) (Enquiry) (Acknowledge) (Bell) (Backspace) (Horizontal Tab) (Line Feed) (Vertical Tab) (Form Feed) (Carriage Return) (Shift Out) (Shift In) (Data Link Escape) (Device control 1) (Device control 2) (Device control 3) (Device control 4) (Negative Acknowledge) (Synchronous Idle) (End Transmission Block) (Cancel) (End of Media) (Substitute) (Escape) (File Separator) (Group Separator) (Record Separator) (Unit Separator)
109
Caracter
<espao>
Dec.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
Hex.
20h 21h 22h 23h 24h 25h 26h 27h 28h 29h 2Ah 2Bh 2Ch 2Dh 2Eh 2Fh 30h 31h 32h 33h 34h 35h 36h 37h 38h 39h 3Ah 3Bh 3Ch 3Dh 3Eh 3Fh 40h 41h 42h 43h
Caracter D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g
Dec.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
Hex.
44h 45h 46h 47h 48h 49h 4Ah 4Bh 4Ch 4Dh 4Eh 4Fh 50h 51h 52h 53h 54h 55h 56h 57h 58h 59h 5Ah 5Bh 5Ch 5Dh 5Eh 5Fh 60h 61h 62h 63h 64h 65h 66h 67h
Caracter h i j k l m n o p q r s t u v w x y z { | } ~
<delete>
Dec.
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
Hex.
68h 69h 6Ah 6Bh 6Ch 6Dh 6Eh 6Fh 70h 71h 72h 73h 74h 75h 76h 77h 78h 79h 7Ah 7Bh 7Ch 7Dh 7Eh 7Fh 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh
110
Caracter
Dec.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
Hex.
8Ch 8Dh 8Eh 8Fh 90h 91h 92h 93h 94h 95h 96h 97h 98h 99h 9Ah 9Bh 9Ch 9Dh 9Eh 9Fh A0h A1h A2h A3h A4h A5h A6h A7h A8h A9h AAh ABh ACh ADh AEh AFh B0h
Caracter
Dec.
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
Hex.
B1h B2h B3h B4h B5h B6h B7h B8h B9h BAh BBh BCh BDh BEh BFh C0h C1h C2h C3h C4h C5h C6h C7h C8h C9h CAh CBh CCh CDh CEh CFh DOh D1h D2h D3h D4h D5h
Caracter
Dec.
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
Hex.
D6h D7h D8h D9h DAh DBh DCh DDh DEh DFh E0h E1h E2h E3h E4h E5h E6h E7h E8h E9h EAh EBh ECh EDh EEh EFh F0h F1h F2h F3h F4h F5h F6h F7h F8h F9h FAh
111
Caracter
Dec.
251 252 253 254 255
Hex.
FBh FCh FDh FEh FFh
112
Entre os caracteres da tabela ASCII estendidos os mais teis esto, talvez, os caracteres de desenho de quadro em linhas simples e duplas: os caracteres de B3h at DAh (179 a 218 decimal). Como a visualizao deste conjunto difcil, o desenho abaixo pode auxiliar nesta tarefa:
196 194 218 179 195 192 197 193 217 200 180 191 201 186 204
209 213 198 212 216 207 190 211 184 181 214 199
Tipo char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double
Num de Bits 8 8 8 16 16 16 16 16 16 32 32 32 32 64 80
Intervalo Incio -128 0 -128 -32.768 0 -32.768 -32.768 0 -32.768 -2.147.483.648 -2.147.483.648 0 3,4E-38 1,7E-308 3,4E-4932 Fim 127 255 127 32.767 65.535 32.767 32.767 65.535 32.767 2.147.483.647 2.147.483.647 4.294.967.295 3,4E+38 1,7E+308 3,4E+4932
O tipo long double o tipo de ponto flutuante com maior preciso. importante observar que os intervalos de ponto flutuante, na tabela acima, esto indicados em faixa de expoente, mas os nmeros podem assumir valores tanto positivos quanto negativos.