Baixe o app para aproveitar ainda mais
Prévia do material em texto
Apostila GCC101 - Algoritmo e Estrutura de Dados Lucas Nunes Barbosa 21/08/2013 1 Contents 1 Introduc¸a˜o 5 1.1 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.1 O que e´ um Algoritmo. . . . . . . . . . . . . . . . . . . . . . 5 1.1.2 Descric¸a˜o Narrativa . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.3 Fluxograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.4 Diagrama de Chapin . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.5 Pseudoco´digo ou Portugol . . . . . . . . . . . . . . . . . . . . 7 1.2 Linguagem de Programac¸a˜o . . . . . . . . . . . . . . . . . . . . . . . 8 1.2.1 O que e´ uma linguagem de programac¸a˜o? . . . . . . . . . . . 8 1.2.2 Para que servem as linguagens de programac¸a˜o? . . . . . . . 8 1.2.3 Porque programar em C++? . . . . . . . . . . . . . . . . . . 8 2 Introduc¸a˜o a Linguagem C++ 9 2.1 Estrutura do Programa . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.1 Hello World! (Passo a Passo) . . . . . . . . . . . . . . . . . . 9 2.2 Palavras reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3 Varia´veis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.3 Tipos de varia´veis . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.5 Expresso˜es e Operadores . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.5.1 Tipos de Expresso˜es . . . . . . . . . . . . . . . . . . . . . . . 12 2.5.2 Operadores Aritme´ticos . . . . . . . . . . . . . . . . . . . . . 13 2.5.3 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . 13 2.5.4 Operadores Lo´gicos . . . . . . . . . . . . . . . . . . . . . . . 13 2.6 Bibliotecas padra˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.6.1 <iostream> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.6.2 <cmath> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6.3 <string> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6.4 <cstdlib> e <ctime> . . . . . . . . . . . . . . . . . . . . . . 14 2.6.5 <fstream> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3 Comando de Entrada e Sa´ıda de Dados 15 3.1 Sa´ıda de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2 Entrada de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.3 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4 Estruturas Condicionais 15 4.1 Comandos IF e ELSE . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.1.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.1.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.1.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.2 Comando SWITCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.2.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.2.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.2.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2 5 Estruturas de Repetic¸a˜o 19 5.1 Comando WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.1.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.1.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.1.3 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.2 Comando DO-WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.2.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.2.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.2.3 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.3 Comando FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.3.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.3.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.3.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 6 Arranjos 23 6.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6.1.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6.1.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6.1.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.2 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.2.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.2.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.2.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 7 Func¸a˜o randoˆmica 26 7.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 7.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 7.3 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 8 Me´todos de Ordenac¸a˜o 27 8.1 Bubble Sort (“Bolha”) . . . . . . . . . . . . . . . . . . . . . . . . . . 27 8.1.1 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 8.1.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 8.2 Selection Sort (“Selec¸a˜o”) . . . . . . . . . . . . . . . . . . . . . . . . 29 8.2.1 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.2.2 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.3 Insertion Sort (“Inserc¸a˜o”) . . . . . . . . . . . . . . . . . . . . . . . . 30 8.3.1 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 8.3.2 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 9 Me´todos de Busca 31 9.1 Busca Sequencial (Linear) . . . . . . . . . . . . . . . . . . . . . . . . 31 9.1.1 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 9.1.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 9.2 Busca Bina´ria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 9.2.1 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 9.2.2 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 10 Registro 34 10.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 10.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 10.3 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3 11 Modularizac¸a˜o 35 11.1 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 11.2 Porque usar func¸o˜es? . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 11.3 Varia´vel Global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 11.4 Paraˆmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 11.5 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 12 Arquivo 38 12.1 Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 12.2 Descric¸a˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 12.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4 1 Introduc¸a˜o 1.1 Algoritmo 1.1.1 O que e´ um Algoritmo. Embora as vezes na˜o percebemos, utilizamos algoritmos no nosso dia a dia e na˜o sabemos. Para a execuc¸a˜o de alguma tarefa ou mesmo resolver algum problema, muitas vezes inconscientemente executamos algoritmos.Mas o que e´ Algoritmo? E´ simplesmente uma “receita” para executarmos uma tarefa ou resolver algum problema e como toda receita, um algoritmo tambe´m deve ser finito. Se seguirmos uma receita de bolo corretamente, conseguiremos fazer o bolo. A computac¸a˜o utiliza muito esse recurso, se voceˆ pretende aprender pro- gramac¸a˜o, obviamente deve saber o que e´ algoritmo. Embora esta definic¸a˜o seja correta, podemos definir algoritmo, de uma maneira mais formal e completa da seguinte forma: Algoritmo e´ uma sequencia lo´gica, finita e definida de instruc¸o˜es que devem ser seguidas para resolver um problema ou executar uma tarefa. Um algoritmo deve sempre possuir pelo menos um resultado, normalmente chamado de sa´ıda e satisfazer a propriedade da efetividade, isto e´, todas as operac¸o˜es especificadas no algoritmo devem ser suficientemente ba´sicas para que possam ser executadas de maneira exata e num tempo finito. Para se ter um algoritmo e´ necessa´rio: 1. Que se tenha um numero finito de passos. 2. Que cada passo esteja precisamente definido, sem possiveis ambiguidades. 3. Que existam zero ou mais entradas tomadas de conjuntos bem definidos. 4. Que existam uma ou mais sa´ıdas. 5. Que exista uma condic¸a˜o de fim sempre atingida para quaisquer entradas e num tempo finito. Para que um computador possa desempenhar uma tarefa e´ necessa´rio que esta seja detalhada passo a passo, numa forma compreens´ıvel pela ma´quina, utilizando aquilo que se chama de programa. Neste sentido, um programa de computador nada mais e´ que um algoritmo escrito numa forma compreens´ıvel pelo computador. As principais formas de representac¸a˜o de algoritmos sa˜o: • a Descric¸a˜o Narrativa; • o Fluxograma; • o Diagrama de Chapin; • o Pseudoco´digo, ou Linguagem Estruturada. 5 1.1.2 Descric¸a˜o Narrativa A descric¸a˜o narrativa utiliza a linguagem natural para representar cada passo de um algoritmo. Utilizando essa te´cnica, o algoritmo para ca´lculo da me´dia de um aluno seria representado da seguinte forma: • Obter as notas da primeira e da segunda prova. • Calcular a me´dia aritme´tica entre as duas notas. • Se a nota for maior ou igual a sete, o aluno foi aprovado, sena˜o reprovado. Esta representac¸a˜o e´ pouco utilizada na pra´tica, porque o uso de linguagem natural da´ oportunidade a ma´s interpretac¸o˜es, ambiguidades e impreciso˜es. 1.1.3 Fluxograma E´ uma representac¸a˜o gra´fica de algoritmos onde formas geome´tricas diferentes im- plicam ac¸o˜es (instruc¸o˜es, comandos) distintas. Tal propriedade facilita o entendi- mento das ideias contidas nos algoritmos. Nota-se que os fluxogramas preocupam-se com detalhes de n´ıvel f´ısico da implementac¸a˜o do algoritmo. Por exemplo, figuras geome´tricas diferentes sa˜o adotadas para representar operac¸o˜es de sa´ıda de dados realizadas em dispositivos distintos, como uma unidade de armazenamento de dados ou um monitor de v´ıdeo. Figure 1: Algoritmo que imprime a me´dia de dois nu´meros 6 1.1.4 Diagrama de Chapin O nome dessa representac¸a˜o de algoritmo vem de seu criador, Ned Chapin e sua func¸a˜o e´ substituir o fluxograma por um diagrama que apresenta uma visa˜o hiera´rquica e estruturada da lo´gica de programa. Esse tipo de representac¸a˜o e´ vantajosa para problemas que tem um ponto de entrada e um ponto de sa´ıda e sa˜o compostas pelas estruturas ba´sicas de controle de sequeˆncia, selec¸a˜o e repartic¸a˜o. Enquanto e´ dif´ıcil mostrar o embutimento e a recursividade com o fluxograma tradicional, torna-se mais simples mostra-lo com o diagrama de Chapin. Figure 2: Algoritmo que verifica qual despesa e´ maior (de Elisa ou de Sofia) e apresenta quanto uma deve para a outra 1.1.5 Pseudoco´digo ou Portugol Esta forma de representac¸a˜o de algoritmos e´ bastante rica em detalhes e, por assemelhar-se bastante a` forma em que programas sa˜o escritos, encontra muita aceitac¸a˜o. Na verdade, esta representac¸a˜o e´ suficientemente geral para permitir uma traduc¸a˜o praticamente direta de um algoritmo nela representado para uma linguagem de pro- gramac¸a˜o espec´ıfica. 7 Algoritmo que leˆ dois nu´meros escolhidos pelo usua´rio e escreve o resuldado. 1 Algoritmo le numeros 2 i n t e i r o n1 , n2 , soma ; 3 4 i n i c i o 5 e s c r eva ” ent re com o 1 numero” ; 6 l e i a n1 ; 7 8 e s c r eva ” ent re com o 2 numero” ; 9 l e i a n2 ; 10 11 soma = n1 + n2 ; 12 13 e s c r eva ”a soma dos numeros va l e : ” , soma ; 14 f im 1.2 Linguagem de Programac¸a˜o 1.2.1 O que e´ uma linguagem de programac¸a˜o? Uma linguagem de programac¸a˜o e´ um me´todo padronizado para expressar instruc¸o˜es para um computador, ou seja, e´ um conjunto de regras sinta´ticas e semaˆnticas usadas para definir um programa de computador. Uma linguagem permite que o progra- mador especifique precisamente sobre quais dados um computador vai atuar, como estes dados sera˜o armazenados ou transmitidos e quais ac¸o˜es devem ser tomadas sob va´rias circunstaˆncias. 1.2.2 Para que servem as linguagens de programac¸a˜o? Voceˆ ja´ deve ter ouvido falar em algo como “o computador e´ burro”, o computador so´ e´ capaz de entender Sim e Na˜o (para ser mais especifico, 1 e 0 ) e efetuar uma sequeˆncia de passos programados via hardware (ma´quina), pra resumir isso, todas as instruc¸o˜es dadas a um computador sa˜o sequeˆncias nume´ricas compostas por 0 e 1 (Ex: 01101100). Ja´ imaginou o trabalho que da´ escrever um programa inteiro usando instruc¸o˜es compostas por combinac¸o˜es de 0 e 1? E´ pra isso que existem as linguagens de programac¸a˜o, para facilitar a comunicac¸a˜o entre programador e hardware, o pro- gramador escreve instruc¸o˜es em uma linguagem bem pro´xima da que as pessoas usam pra se comunicar, depois um segundo programa traduz o que o programador escreveu para sequencias compostas por 0 e 1 (Compiladores1) ou interpreta as instruc¸o˜es escritas pelo programador e as executa (Interpretador). 1.2.3 Porque programar em C++? DEFINIC¸A˜O TALES 1Compilador: e´ um programa de computador (ou um grupo de programas) que, a partir de um co´digo fonte escrito em uma linguagem compilada, cria um programa semanticamente equivalente, pore´m escrito em outra linguagem co´digo objeto (ou “linguagem de ma´quina”) 8 2 Introduc¸a˜o a Linguagem C++ 2.1 Estrutura do Programa • Um programa em C++ e´ composto por um conjunto de Func¸o˜es. A func¸a˜o pela qual o programa comec¸a a ser executado chama-se main. • Apo´s cada comando em C++ deve-se colocar um ; (ponto e v´ırgula). • Um programa em C++ deve ser Indentado2 para que possa ser lido com mais facilidade. 2.1.1 Hello World! (Passo a Passo) E´ comum, no aprendizado de uma linguagem de programac¸a˜o, que seu primeiro pro- grama fac¸a com que o computador exiba “Hello World!”. Em C++ este primeiro programa ja´ introduz muitos conceitos sobre a linguagem. Veja o co´digo do nosso primeiro programa: 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 cout << ” He l lo World ! ” << endl ; 6 r e turn 0 ; 7 } #include <iostream> • O s´ımbolo # indica que a pro´xima palavra e´ um comando para o compilador, na˜o para o processamento. • include e´ um comando para o compilador incluir uma Biblioteca de func¸o˜es no programa. • A Biblioteca iostream, possui va´rias func¸o˜es de fluxo de entrada e sa´ıda dados. Na maioria das vezes, como entrada padra˜o temos o teclado e como sa´ıda temos o monitor. using namespace std; • namespaces sa˜o espac¸os de nomes dentro do co´digo, eles funcionam, entre outras coisas, como um meio de evitar duplicac¸a˜o de nomes dentro de um projeto extenso, que geralmente contam com inu´meros arquivos. • O C++ usa os namespaces para organizar os diferentes nomes usados nos programas. Cada nome usado na Biblioteca “standard iostream” faz parte do “namespace” chamado de std.• O objeto de sa´ıda padra˜o, cout, esta´ definido dentro do “namespace std”, ele e´ um objeto da classe “ostream” “output stream”, para acessa´-lo temos que referencia´-lo como “std::cout”. Para evitar que tenhamos que informar “std::” todas as vezes que precisarmos usar os recursos deste “namespace”, podemos informar que estamos usando-o dentro do arquivo atual, conforme vemos na linha declarada no in´ıcio deste to´pico. 2Na maioria das linguagens, a indentac¸a˜o tem um papel meramente este´tico, tornando a leitura do co´digo fonte muito mais fa´cil, pore´m e´ obrigato´ria em outras. Python, Occam e Haskell, por exemplo, utilizam-se desse recurso tornando desnecessa´rio o uso identificadores de blocos, tais como chaves ou as palavras ”begin” e ”end”. 9 Co´digo sem “namespaces” 1 #inc lude <iostream> 2 i n t main ( ) 3 { 4 std : : cout << ” He l lo World ! ” << std : : endl ; 5 r e turn 0 ; 6 } int main() {} • Como na linguagem C, a func¸a˜o principal de entrada do programa a partir do sistema operacional e´ a func¸a˜omain. Por isso mesmo ela e´ obrigato´ria em qualquer programa. Se na˜o existisse uma “main function”, na˜o haveria entrada para que o sistema iniciasse o programa. • Todas as func¸o˜es sa˜o declaradas e usadas com o operador ( ), assim e´ que o compilador reconhece que estas sa˜o func¸o˜es. A ideia de ter func¸o˜es e´ permitir o encapsulamento de uma ideia ou operac¸a˜o, dar um nome a isso e depois chamar essa operac¸a˜o de va´rias partes do programa simplesmente usando o seu nome. As func¸o˜es declaradas como membros de uma classe de objetos podem ser chamadas de me´todos. • Do ponto de vista funcional, um co´digo dentro de uma func¸a˜o executa operac¸o˜es em outra parte do programa, que na˜o e´ aquela de onde foi chamada, por este motivo as mesmas contam com um mecanismo de passagem de dados, ao declarar uma func¸a˜o indicamos quais os dados que entram e o que ela deve fornecer a quem lhe chamou. • Pode-se dizer que, tal qual uma func¸a˜o matema´tica, a func¸a˜o em C/C++ podera´ ser substitu´ıda, depois de sua execuc¸a˜o, pelo valor que ela retorna, este valor sera´ especificado antes do nome da func¸a˜o na declarac¸a˜o da mesma, conforme vemos no in´ıcio deste to´pico. Obs: O int significa que a func¸a˜o vai retornar um inteiro. Existem outros tipos de dados como, por exemplo, os seguintes: • int que e´ a abreviatura de inteiro; • char que e´ a abreviatura de caractere; • float que e´ a abreviatura de ”floating point number”, ou seja, uma repre- sentac¸a˜o para nu´mero real. cout << ”Hello World!” << endl; • A palavra cout vem de Console3 OUT (sa´ıda do console), onde geralmente temos a sa´ıda no monitor. O cout e´ seguido do operador << e da frase que se quer informar entre aspas: ”Hello World!”, intuitivamente, isso nos leva a ideia de que a sequeˆncia de caracteres sera´ levada ao cout. return 0; • Este comando termina o programa, o estudaremos melhor no cap´ıtulo sobre func¸o˜es e retornos. 3Console: E´ a unidade que permite que um operador se comunique com um sistema de com- putador, o console consiste de um dispositivo de entrada como um teclado, e um dispositivo de sa´ıda como o monitor. 10 2.2 Palavras reservadas Para uma assimilac¸a˜o inicial as palavras chaves em C++ sa˜o apresentadas abaixo: asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef union unsigned virtual void volative while Esta se´rie na˜o apenas servira´ para a plataforma Linux ou Unix, mas voceˆ podera´ aplicar os conhecimentos aqui adquiridos em plataformas como Windows da Mi- crosoft e Mac da Apple. Inicialmente na˜o poderia deixar de colocar nesta introduc¸a˜o, alguns pontos cru- ciais para se programar em C++. Um destes pontos como boa pra´tica sempre mantenha o co´digo limpo, identado e de forma apresenta´vel. 2.3 Varia´veis 2.3.1 Sintaxe 1 <t i po da va r i ave l> <nome>; 2.3.2 Descric¸a˜o Varia´veis sa˜o enderec¸os de me´moria na qual podemos atribuir ou mudar o valor. Todas as varia´veis utilizadas em C++ devem ser definidas antes de serem uti- lizadas. Isto se faz necessa´rio para permitir que o compilador fac¸a a alocac¸a˜o4 da memo´ria. 2.3.3 Tipos de varia´veis • Todas as varia´veis em C++ tem um tipo. • Cada tipo define os valores que a varia´vel pode armazenar. • Cada tipo ocupa uma certa quantidade de nemo´ria. Tipo Comenta´rio int Valores inteiros de: -2147483648 a 2147483647. float Valores “reais” de: 1.2e-308 a 3.4e-38. double Valores “reias” (dupla precisa˜o do float) de: 2.2e-308 a 3.4e-38. char Permite armazenar 256 caracteres. bool Armazena valores true (1, verdadeiro) ou false (0, falso). void E´ o tipo “vazio”, na˜o retorna nenhum valor. 4Alocac¸a˜o: Enderec¸ar uma varia´vel para um local reservado na memo´ria. 11 2.4 Constantes 2.4.1 Sintaxe 1 #d e f i n e <nome> <tamanho> 2.4.2 Descric¸a˜o Apesar de serem antoˆnimos no diciona´rio, computacionalmente o conceito de varia´veis e constantes e´ similar. Assim como uma varia´vel, uma constante deve ter um nome e um tipo. A diferenc¸a e´ que o valor armazenado pela constante e´ fixo, sendo, em geral, definido no in´ıcio do programa. 2.5 Expresso˜es e Operadores 2.5.1 Tipos de Expresso˜es Em computac¸a˜o, o conceito de expressa˜o esta´ intimamente ligado ao conceito de fo´rmula matema´tica, no qual varia´veis e constantes nume´ricas se relacionam atrave´s de operadores e produzem um resultado. Entretando, as operac¸o˜es e, consequente- mente, as expresso˜es na˜o envolvem apenas aritme´tica, mas tambe´m lo´gica e mani- pulac¸a˜o de caracteres, havendo, portanto, treˆs tipos de expresso˜es: 1. Aritme´ticas: o resultado da avaliac¸a˜o de uma expressa˜o aritme´tica e´ do tipo nume´rico (inteiro ou real). Nesse tipo de expresso˜es e´ permitido apenas o uso de operadores aritme´ticos, varia´veis nume´ricas e pareˆnteses, que servem para alterar a precedeˆncia dos operadores. 2. Lo´gicas: sa˜o aquelas cujo resultado da avaliac¸a˜o e´ um valor lo´gico (ver- dadeiro ou falso), que e´ representado por 1 e 0. Nestas expresso˜es sa˜o usados operadores lo´gicos e relacionais, que podem ser combinados com operadores aritme´ticos. 3. Literais: expresso˜es literais envolvem operac¸a˜o com cadeias alfanume´ricas. A u´nica expressa˜o literal existente e´ a que envolve a operac¸a˜o de concatenac¸a˜o (operac¸a˜o de unir o conteu´do de duas strings5). 5String : Em C++ sa˜o tratados como vetores de tamanho determinado que podem armazenar qualquer caracter. Diferentemente de declarar apenas uma varia´vel do tipo char (que armazena apenas um caracter) a string e´ uma cadeia de caracteres, ou seja, pode guardar quantos caracteres no´s determinarmos. 12 2.5.2 Operadores Aritme´ticos Operador Exemplo Comenta´rio = x = y O conteu´do da varia´vel Y e´ atribuido a` varia´vel X.. + x + y Soma o conteu´do de X e de Y. - x - y Subtra´i o conteu´do de Y do conteu´do de X. * x * y Multiplica o conteu´do de Y do conteu´do de X. / x / y Obte´m o quociente da divisa˜o de X por Y. % x % y Obte´m o resto da divisa˜o de X por Y. += x += y Equivale a X = X + Y. -= x -= y Equivale a X = X - Y. *= x *= y Equivale a X = X * Y. /= x /= y Equivale a X = X / Y. ++ x++ Equivale a X = X + 1. ++ y = ++x Equivale a X = X + 1 e depois Y = X. ++ y = x++ Equivale a Y = X e depois X = X + 1. −− x−− Equivale a X = X - 1. −− y = −−x Equivale a X = X - 1 e depois Y = X. −− y = x−− Equivale a Y = X e depois X = X - 1. 2.5.3 Operadores Relacionais Operador Exemplo Comenta´rio == x == y O conteu´do de X e´ igual ao conteu´do de Y. != x != y O conteu´do de X e´ diferente do conteu´do de Y. <= x <= y O conteu´do de X e´ menorou igual ao conteu´do de Y. >= x >= y O conteu´do de X e´ maior ou igual ao conteu´do de Y. < x < y O conteu´do de X e´ menor ao conteu´do de Y. > x > y O conteu´do de X e´ maior ao conteu´do de Y. 2.5.4 Operadores Lo´gicos Operador Exemplo Comenta´rio ! !x Negac¸a˜o do conteu´do de X. || x || y O conteu´do de X OU o conteu´do de Y. && x && y O conteu´do de X E o conteu´do de Y. 2.6 Bibliotecas padra˜o 2.6.1 <iostream> iostream (i de input + o de output + stream), que suporta, entre va´rias funciona- lidades, o objeto cin para ler da ”standard input” (que e´ usualmente o teclado) e o objeto cout para ”standard output” (que usualmente e´ o monitor). 13 2.6.2 <cmath> cmath e´ uma biblioteca pro´pria para ca´lculos matema´ticos um pouco mais com- plexos, podemos encontrar facilmente func¸o˜es para calcular poteˆncias, ra´ız quadrada, func¸o˜es trigonome´tricas para ca´lculos que envolvem seno, cosseno e tangente, ale´m de constantes para nu´meros irracionais como, por exemplo, PI. Operador Exemplo Comenta´rio ceil ceil(x) Arredonda um nu´mero real para cima. sin sin(x) Calcula o seno de X (X deve ser representado em radianos). cos cos(x) Calcula o cosseno de X (X deve ser representado em radi- anos). tan tan(x) Calcula a tangente de X (X deve estar representado em radianos). exp exp(x) Obte´m o logaritmo natural elevado a poteˆncia X. abs abs(x) Obte´m o valor absoluto de X. floor floor(x) Arredonda um nu´mero real para baixo. Por exemplo, floor(3.2) vale 3. log log(x) Obte´m o logaritmo natural de X. log10 log10(x) Obte´m o logaritmo de base 10 de X. modf z = modf(X,&Y) Decompo˜e o nu´mero real armazenando em X em duas partes: Y recebe a parte fraciona´ria e Z, a parte inteira do nu´mero. pow pow(X,Y) Calcula a poteˆncia de X elevado a Y. sqrt sqrt(x) Calcula a raiz quadrada de X. M PI M PI Retorna o valor de PI (pi). 2.6.3 <string> string serve para manipulac¸a˜o de cadeias de caracteres, ou seja, uma sequeˆncia de caracteres. 2.6.4 <cstdlib> e <ctime> Usamos cstdlib e ctime para func¸a˜o srand(). cstdlib habilita o uso da func¸a˜o, enquanto ctime permite o uso da func¸a˜o time(num) normalmente usada como paraˆmetro da func¸a˜o srand() para dar a ideia de ramdoˆmico (rand(time(NULL)). 2.6.5 <fstream> fstream e´ um manipulador de fluxos de dados de arquivos de computador, per- mitindo ler (objeto ifstream) e escrever (objeto ofstream) em arquivos. 14 3 Comando de Entrada e Sa´ıda de Dados 3.1 Sa´ıda de Dados O comando de sa´ıda padra˜o (cout) e´ o meio pelo qual informac¸o˜es contidas na memo´ria dos computadores sa˜o colocadas nos dispositivos de sa´ıda, normalmente no monitor 3.2 Entrada de Dados O comando de entrada padra˜o (cin) e´ o meio pelo qual as informac¸o˜es dos usua´rios sa˜o transferidas para a memo´ria dos computadores, para que possam ser usadas nos programas. 3.3 Exemplo Algoritmo que recebe dois nu´meros inteiros (digitados pelo usua´rio), soma-os e envia para o dispositivo de sa´ıda (no caso o monitor) o resultado 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 i n t soma , a , b ; 6 7 cout << ” Dig i t e o pr ime i ro num: ” ; 8 c in >> a ; 9 10 cout << ” Dig i t e o segundo num: ” ; 11 c in >> b ; 12 13 soma = a + b ; 14 15 cout << ”O va lo r da soma e : ” << soma << endl ; 16 17 r e turn 0 ; 18 } • int declara varia´veis do tipo inteiro. • cin recebe o valor das varia´veis digitado pelo usua´rio. • cout imprime na tela as instruc¸o˜es e o valor da soma. • endl e´ o comando de quebra de linha, funciona como apertar a tecla “ENTER” do teclado. 4 Estruturas Condicionais Neste tipo de estruturas, o fluxo de instruc¸o˜es a ser seguido e´ escolhido em func¸a˜o do resultado da avaliac¸a˜o de uma ou mais condic¸o˜es. Uma condic¸a˜o e´ uma expressa˜o lo´gica . A classificac¸a˜o das estruturas condicionais e´ feita de acordo com o nu´mero de condic¸o˜es que devem ser testadas para que se decida qual o caminho a ser seguido. Os algoritmos puramente sequenciais podem ser usados na soluc¸a˜o de um nu´mero de problemas, pore´m existem problemas que exigem o uso de alternativas de acordo com as do mesmo. 15 Nestes algoritmos, as situac¸o˜es sa˜o resolvidas atrave´s de passos cuja execuc¸a˜o e´ subordinada a uma condic¸a˜o. Assim, o algoritmo contera´ passos que sa˜o executados somente se determinadas condic¸o˜es forem observadas. Um algoritmo em que se tem a execuc¸a˜o de determinados passos subordinada a uma condic¸a˜o e´ denominado algoritmo com selec¸a˜o. 4.1 Comandos IF e ELSE 4.1.1 Sintaxe 1 i f (<condicao>) 2 { 3 (<bloco de comandos>) ; 4 } 5 6 e l s e 7 { 8 (<bloco de comandos>) ; 9 } 4.1.2 Descric¸a˜o O comando if avalia se a condic¸a˜o e´ verdadeira ou falsa (“Se” em portugueˆs), se a condic¸a˜o for verdadeira o programa executara a sequeˆncia de comando propostos pelo if, se for falsa o programa executara´ a sequeˆncia de comandos propostos pelo else (“Sena˜o” em portugueˆs). 4.1.3 Exemplos Algoritmo que verifica a nota do aluno e mostra se ele foi APROVADO ou RE- PROVADO. 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 f l o a t nota ; 6 7 cout << ” Dig i t e sua nota : ” ; 8 c in >> nota ; 9 10 i f ( nota < 60 ) { 11 cout << ”Reprovado” << endl ; 12 } 13 14 e l s e { 15 cout << ”Aprovado” << endl ; 16 } 17 18 r e turn 0 ; 19 } Observamos que a condic¸a˜o ser verificada esta entre pareˆnteses “(nota < 60)” e que o else na˜o possui condic¸a˜o, justamente por ser executado somente se a condic¸a˜o no if for falsa. Outra observac¸a˜o esta´ no fato do uso de chaves “{}” apo´s os co- mandos if e else, mas na˜o sa˜o obrigato´rias neste caso, pois ha´ apenas 1 comando sendo executado apo´s a estrutura condinal. 16 A seguir teremos outro exemplo de programa usando os comandos if e else, mas desta vez sem o uso de chaves e mais de uma condic¸a˜o. Algoritmo que verifica o sala´rio do funciona´rio e aponta o reajuste correto 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 f l o a t s a l a r i o ; 6 7 cout << ” Dig i t e seu s a l a r i o : ” ; 8 c in >> s a l a r i o ; 9 10 i f ( s a l a r i o < 800 ) 11 s a l a r i o ∗= 1 . 2 ; 12 13 e l s e i f ( s a l a r i o < 1600) 14 s a l a r i o ∗= 1 . 1 5 ; 15 16 e l s e i f ( s a l a r i o < 2400) 17 s a l a r i o ∗= 1 . 1 0 ; 18 19 e l s e 20 s a l a r i o ∗= 1 . 0 5 ; 21 22 cout << ”Seu novo s a l a r i o s e ra : ” << s a l a r i o << endl ; 23 24 r e turn 0 ; 25 } 4.2 Comando SWITCH 4.2.1 Sintaxe 1 switch (<opcao>) 2 { 3 case <opcao>: 4 (<bloco de comandos>) ; 5 break ; 6 } 4.2.2 Descric¸a˜o O comando switch funciona quase da mesma forma do comando if, mas seu uso e´ mais indicado quando se quer dar ao usua´rio a escolha de opc¸o˜es. As “opc¸o˜es” podem ser do tipo int (inteiro) ou do tipo char (caractere), como podemos ver nos exemplos a seguir: 17 4.2.3 Exemplos Algoritmo recebe o raio e calcula o comprimento, a a´rea e o volume de uma esfera 1 #inc lude <iostream> 2 #inc lude <cmath> 3 us ing namespace std ; 4 i n t main ( ) 5 { 6 f l o a t r a i o ; 7 cout << ” Dig i t e o va l o r do r a i o : ” ; 8 c in >> r a i o ; 9 10 i n t opcao ; 11 cout << ”O que de s e j a que s e j a ca l cu l ado ?” << endl ; 12 cout << ”\ t1 . Comprimento\n\ t2 . Area\n\ t3 . Volume\n” ; 13 14 c in >> opcao ; 15 16 f l o a t comprimento , area , volume ; 17 18 switch ( opcao ) 19 { 20 case 1 : 21 comprimento = 2∗M PI∗ r a i o ; 22 cout << ”O comprimento va l e : ” << comprimento << endl ; 23 break ; 24 25 case 2 : 26 area = M PI∗( pow( ra io , 2 ) ) ; 27 cout << ”A area va l e : ” << area << endl ; 28 break ; 29 30 case 3 : 31 volume = ( 4∗M PI∗(pow( ra io , 3 ) ) ) ; 32 cout << ”O volume val e : ” << volume << endl ; 33 break ; 34 } 35 36 r e turn 0 ; 37 } • \n possui a mesma func¸a˜o de endl, mas pode ser usado no meio de uma string (texto). • \t teˆm a func¸a˜o de inserir o espac¸o de tabulac¸a˜o, tendo a mesma func¸a˜o da tecla “TAB” do teclado. • M PI e´ a constante matema´tica que representa o nu´mero PI (pi), esta cons- tante pertence a biblioteca cmath. Neste programa temos treˆs opc¸o˜es, cada uma com um nu´mero espec´ıfico para que o comando seja executado. Se o usua´rio digitar 1, o comprimento da esfera sera´ calculado e mostrado na tela, se o usua´rio digitar 2, a a´rea sera´ calculada e se digitar 3, o volume sera´ calculado. Os comandos selecionados e executados pelo switch esta˜o entre os comandos case e break (todo case deve ter um break), o nu´mero que segue o comando case sera´ dado pela opc¸a˜o digitada pelo usua´rio, se o nu´mero for este, os comandos que sera˜o executados estara˜o entre este case e break. 18 Algoritmo que fornece ao usua´rio a escolha de pagamento a vista ou a prazo, mostrando ao usua´rio o total da compra e o juros. 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 f l o a t va l o r ; 6 char opcao ; 7 8 cout << ” Dig i t e o va l o r da compra : ” ; 9 c in >> va lo r ; 10 11 cout << ”A compra s e ra f e i t a a v i s t a (V) ou a prazo (P) : ” ; 12 c in >> opcao ; 13 14 switch ( opcao ) 15 { 16 case ’V ’ : 17 cout << ”Nao ha j u r o s em compra a v i s t a ! ” << endl ; 18 cout << ”O va lo r a s e r pago : ” << va lo r << endl ; 19 break ; 20 21 case ’P ’ : 22 i f ( va l o r < 800 ) 23 { 24 cout << ”O j u r o s s e ra de 10%” << endl ; 25 cout << ”O va lo r a s e r pago : ” << va lo r ∗1 .1 << endl ; 26 } 27 28 e l s e 29 { 30 cout << ”O j u r o s s e ra de 5%” << endl ; 31 cout << ”O va lo r a s e r pago : ” << va lo r ∗1 .05 << endl ; 32 } 33 break ; 34 } 35 36 r e turn 0 ; 37 } Neste caso o “opc¸a˜o” do switch e´ do tipo char e deve estar entre aspas simples (‘x’ ). 5 Estruturas de Repetic¸a˜o Sa˜o muito comuns as situac¸o˜es em que se deseja repetir um determinado trecho de um programa um certo nu´mero de vezes. As estruturas de repetic¸a˜o sa˜o muitas vezes chamandas de lac¸os ou tambe´m de loops. A classificac¸a˜o das estruturas de repetic¸a˜o e´ feito de acordo com o conhecimento pre´vio do nu´mero de vezes que o conjunto de comandos sera´ executado. Assim os lac¸os se dividem em: • Lac¸os Contados: quando se conhece previamente quantas vezes o comando composto no interior da construc¸a˜o sera´ executado. Em C++, normalmente se usa o comando for para este tipo de lac¸o, mas tambe´m pode ser usado do e while 19 • Lac¸os Condicionais: quando na˜o se conhece de antema˜o o nu´mero de vezes que o conjunto de comandos no interior do lac¸o sera´ repetido, pelo fato do mesmo estar amarrado a uma condic¸a˜o sujeita a` modificac¸a˜o pelas instruc¸o˜es do interior do lac¸o. Em C++, neste tipo de lac¸o apenas podemos usar os comandos do e while. 5.1 Comando WHILE 5.1.1 Sintaxe 1 whi le (<condicao>) 2 { 3 (<bloco de comandos>) ; 4 } 5.1.2 Descric¸a˜o 1. Testa a condic¸a˜o; 2. Se a condic¸a˜o for falsa, enta˜o pula todos os comandos do bloco subordinado ao while e passa a executar os comandos apo´s o bloco do while. 3. Se a condic¸a˜o for verdadeira enta˜o, executa o bloco de comandos subordi- nado ao while. 4. Apo´s executar o u´ltimo comando do bloco do while volta ao passo 1. O comando while deve ser usado sempre que: • Na˜o soubermos exatamente quantas vezes o lac¸o deve ser repetido. • O teste deva ser feito antes de iniciar a execuc¸a˜o de um bloco de comandos. • Houver casos em que o lac¸o na˜o deva ser repetido nenhuma vez. 5.1.3 Exemplo Algoritmo que soma N nu´meros, quando o nu´mero -1 for digitado a execuc¸a˜o e´ encerrada, se ele for o primeiro nu´mero digitado o bloco subordinado ao comando while na˜o sera´ executado, apresentando o resultado 0. 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 f l o a t n , soma = 0 ; 6 7 c in >> n ; 8 9 whi le (n != −1) 10 { 11 soma += n ; 12 c in >> n ; 13 } 14 15 cout << soma << endl ; 16 17 r e turn 0 ; 18 } 20 5.2 Comando DO-WHILE 5.2.1 Sintaxe 1 do 2 { 3 (<bloco de comandos>) ; 4 } whi le (<condicao>) ; 5.2.2 Descric¸a˜o 1. Executa os comandos dentro do bloco do-while. 2. Testa a condic¸a˜o. 3. Se a condic¸a˜o for falsa, enta˜o executa o comando que esta´ logo apo´s o bloco subordinado ao do-while. 4. Se a condic¸a˜o for verdadeira, enta˜o volta ao passo 1. O comando do-while deve ser usado sempre que: • Na˜o soubermos exatamente quantas vezes o lac¸o deve ser repetido. • O teste deva ser feito antes de iniciar a execuc¸a˜o de um bloco de comandos. • Houver casos em que o lac¸o deva ser executado pelo menos uma vez. 5.2.3 Exemplo Algoritmo que verifica se o nu´mero digitado e´ par ou ı´mpar. Sempre que o usua´rio digitar algum nu´mero negativo, o programa repetira´ a pergunta “Digite um nu´mero positivo:” (criado pelo lac¸o do-while). 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 i n t n ; 6 7 do 8 { 9 cout << ” Dig i t e um numero p o s i t i v o : ” ; 10 c in >> n ; 11 } whi le ( n < 0 ) ; 12 13 i f ( n%2 == 0 ) 14 cout << n << ” e um numero par ! ” << endl ; 15 16 e l s e 17 cout << n << ” e um numero impar ! ” << endl ; 18 19 r e turn 0 ; 20 } 21 5.3 Comando FOR 5.3.1 Sintaxe 1 f o r ( < i n i c i a l i z a c a o > ; <condicao> ; <incremento> ) 2 { 3 (<bloco de comandos>) ; 4 } 5.3.2 Descric¸a˜o 1. Executa os comandos de inicializac¸a˜o. 2. Testa a condic¸a˜o. 3. Se a condic¸a˜o for falsa enta˜o executa o comando que esta´ logo apo´s o bloco subordinado ao for. 4. Se condic¸a˜o for verdadeira enta˜o executa os comandos que esta˜o subordinados ao for. 5. Executa os comandos de incremento/decremento. 6. Volta ao passo 2. O comando for deve ser usado sempre que: • Soubermos exatamente quantas vezes o lac¸o deve ser repetido. • O teste deva ser feito antes da execuc¸a˜o de um bloco de comandos. • Houver casos em que o lac¸o na˜o deva ser repetido nenhuma vez. 5.3.3 Exemplos Algoritmo que calcula e mostra o nu´mero N na sequeˆncia de Fibonnaci 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 i n t n ; 6 c in >> n ; 7 8 i n t n1 = 0 , n2 = 1 , f i b ; 9 10 i f (n == 1) 11 f i b = n1 ; 12 13 i f (n == 2) 14 f i b = n2 ; 15 16 f o r ( i n t i = 3 ; i <= n ; i++ ) 17 { 18 f i b = n1+n2 ; 19 n1 = n2 ; 20 n2 = f i b ; 21 } 22 23 cout << f i b << endl ; 24 25 r e turn 0 ; 26 } 22 Debora Sousa Nota Estrutura de Repetiçãonullnull1) Número definido de repetiçõesnullPara i <= valor inicial até valor final façanull[passo n]nullInicionullComandosnullFimnullnull Algoritmo que calcula N! 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 i n t n ; 6 c in >> n ; 7 8 i n t f a t = 1 ; 9 10 f o r ( i n t i = 1 ; i <= n ; i++ ) 11 f a t ∗= i ; 12 13 cout << f a t << endl ; 14 15 r e turn 0 ; 16 } 6 Arranjos Arranjos sa˜o agregados homogeˆneos, ou seja, sa˜o um conjunto de elementos que compartilham o mesmo tipo e possuem acesso aos elementos atrave´s de ı´ndices nume´ricos inteiros e positivos. Os arranjos podem possuir n dimenso˜es, veremos nesta apostila apenas arranjos unidimensionais (conhecidos como vetores) e arranjos bidimencionais (conhecidos como matrizes). 6.1 Vetores 6.1.1 Sintaxe 1 <t i po da va r i ave l> <nome> [<tamanho> ] ; 6.1.2 Descric¸a˜o Uma vetor (arranjo unidimensional), e´ um conjunto u´nico de dados alocados sequeˆncialmente na memo´ria de mesmo t´ıpo. Em C++, o ı´ndice dos vetor comec¸a em 0 (zero). Os valores aplicados aos itens do vetorpodem ser repetidos ou na˜o, ac¸a˜o a qual ira´ depender totalmente das necessidades da aplicac¸a˜o. Um vetor que contenha cinco elementos, podemos acessar o primeiro elemento atrave´z do ı´ndice 0 (zero) e o u´ltimo atraves do ı´ndice 4. 23 6.1.3 Exemplos Algoritmo que encontra a posic¸a˜o no vetor que possui o maior valor e imprime este valor para o usua´rio. 1 #inc lude <iostream> 2 #d e f i n e TAM 10 3 us ing namespace std ; 4 i n t main ( ) 5 { 6 i n t pMaior = 0 ; 7 f l o a t vet [TAM] ; 8 9 f o r ( i n t i = 0 ; i < TAM ; i++ ) 10 c in >> vet [ i ] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 i f ( vet [ pMaior ] < vet [ i ] ) 14 pMaior = i ; 15 16 cout << vet [ pMaior ] << endl ; 17 18 r e turn 0 ; 19 } Algoritmo que recebe uma palavra de 10 letras e imprime esta palavra ao contra´rio. 1 #inc lude <iostream> 2 #d e f i n e MAX 10 3 us ing namespace std ; 4 i n t main ( ) 5 { 6 char pa lavra [MAX] ; 7 8 f o r ( i n t i = 0 ; i < MAX ; i++ ) 9 c in >> palavra [ i ] ; 10 11 f o r ( i n t i = MAX−1 ; i >= 0 ; i−− ) 12 cout << palavra [ i ] ; 13 cout << endl ; 14 15 r e turn 0 ; 16 } 6.2 Matrizes 6.2.1 Sintaxe 1 <t i po da va r i ave l> <nome> [< l inha >] [<coluna > ] ; 6.2.2 Descric¸a˜o Uma matriz (arranjo bidimencional), como o pro´prio nome diz, nada mais e´ do que um arranjo com dois seguimentos de dados em memo´ria, que podem ser acessados por uma dupla de ı´ndices que identifica o valor em um item na matriz . A declarac¸a˜o da matriz e´ efetuada com dois colchetes, que informam a quanti- dade de elementos6 que a matriz podera´ conter, podendo ser atribuido valores aos itens em sua declarac¸a˜o inicial ou, atribuir valores durante a demanda do processa- mento da aplicac¸a˜o de acordo com as necessidades do algoritmo. 6A quantidade de elementos da matriz sera´ igual a NxM, sendo N e M os valores entre os colchetes da matriz (“linha” e “coluna”). 24 6.2.3 Exemplos Algoritmo que recebe uma matriz 3x3, acha o maior valor da linha e soma com os demais valores. 1 #inc lude <iostream> 2 #d e f i n e MAX 3 3 us ing namespace std ; 4 i n t main ( ) 5 { 6 i n t mat [MAX] [MAX] ; 7 i n t lMaior [MAX] , cMaior [MAX] ; 8 9 f o r ( i n t i = 0 ; i < MAX ; i++ ) 10 { 11 f o r ( i n t j = 0 ; j < MAX ; j++ ) 12 c in >> mat [ i ] [ j ] ; 13 lMaior [ i ] = 0 ; 14 cMaior [ i ] = 0 ; 15 } 16 17 f o r ( i n t i = 0 ; i < MAX ; i++ ) 18 f o r ( i n t j = 0 ; j < MAX ; j++ ) 19 i f ( mat [ lMaior [ i ] ] [ cMaior [ i ] ] < mat [ i ] [ j ] ) 20 { 21 lMaior [ i ] = i ; 22 cMaior [ i ] = j ; 23 } 24 25 f o r ( i n t i = 0 ; i < MAX ; i++ ) 26 { 27 f o r ( i n t j = 0 ; j < MAX ; j++ ) 28 { 29 mat [ i ] [ j ] += mat [ lMaior [ i ] ] [ cMaior [ i ] ] ; 30 cout << mat [ i ] [ j ] << ”\ t ” ; 31 } 32 cout << endl ; 33 } 34 35 r e turn 0 ; 36 } Algoritmo que recebe uma matriz NxM e imprime seus valores na ordem in- versa. 1 #inc lude <iostream> 2 us ing namespace std ; 3 i n t main ( ) 4 { 5 i n t m, n ; 6 7 c in >> m; 8 c in >> n ; 9 10 i n t mat [m] [ n ] ; 11 12 f o r ( i n t i = 0 ; i < m ; i++ ) 13 f o r ( i n t j = 0 ; j < n ; j++ ) 14 c in >> mat [ i ] [ j ] ; 15 16 f o r ( i n t i = m−1 ; i >= 0 ; i−− ) 17 { 18 f o r ( i n t j = n−1 ; j >= 0 ; j−− ) 19 cout << mat [ i ] [ j ] << ”\ t ” ; 20 cout << endl ; 21 } 22 } 25 7 Func¸a˜o randoˆmica 7.1 Sintaxe 1 srand (<seed>) ; 2 3 i n t vetor [<pos icao >] = rand ( ) % <l im i tante> + < i n i c i o >; 7.2 Descric¸a˜o A func¸a˜o rand() (func¸a˜o nativa da biblioteca <cstdlib>) gera uma sequeˆncia de valores que se repete igual a si pro´pria sempre que o programa e´ executado. Isto, porque, a seed7 da sequeˆncia e´ sempre a mesma. Para que produza-se uma sequeˆncia diferente e´ necessa´rio, mudar a seed usando a func¸a˜o srand(), cujo argumento inteiro (sem sinal) e´ a nova semente e que na˜o retorna nenhum valor. Se pretende uma sequeˆncia diferente, sempre que o programa e´ executado, e o utilizador na˜o seja obrigado a introduzir a semente, podemos usar uma func¸a˜o time(NULL) (func¸a˜o nativa da biblioteca <ctime>), que retorna o valor do relo´gio do computador em segundos. 7.3 Exemplo 1 #inc lude <iostream> 2 #inc lude <ctime> 3 #inc lude <c s t d l i b> 4 5 #d e f i n e TAM 10 6 7 us ing namespace std ; 8 9 i n t main ( ) 10 { 11 srand ( time (NULL) ) ; 12 13 i n t vet [TAM] ; 14 15 f o r ( i n t i = 0 ; i < TAM ; i++ ) 16 vet [ i ] = rand ( ) %100+1; 17 18 f o r ( i n t i = 0 ; i < TAM ; i++ ) 19 cout << vet [ i ] << ”\ t ” ; 20 } 7seed e´ o nu´mero usado pela func¸a˜o srand() para gerar uma sequeˆncia “aleato´ria” de nu´meros inteiros 26 8 Me´todos de Ordenac¸a˜o 8.1 Bubble Sort (“Bolha”) 8.1.1 Descric¸a˜o O bubble sort, ou ordenac¸a˜o por flutuac¸a˜o (literalmente por “bolha”), e´ um al- goritmo de ordenac¸a˜o dos mais simples. A ideia e´ percorrer o vetor ou a matriz diversas vezes, a cada passagem fazendo “flutuar” para o topo o maior elemento da sequeˆncia. Essa movimentac¸a˜o lembra a forma como as bolhas em um tanque de a´gua procuram seu pro´prio n´ıvel, e disso vem o nome do algoritmo. O algoritmo compara os elementos subsequentes, se este for maior (para uma ordenc¸a˜o crescente) que o anterior ocorre a troca, sena˜o, o algoritmo continua a percorrer o vetor ou matriz. Apo´s percorrer todo o arranjo verifica-se se ocorreu alguma troca, se sim, continua executando as trocas ate´ o arranjo ser ordenado, sena˜o, encerra a execuc¸a˜o. 8.1.2 Exemplos Algoritmo de ordenac¸a˜o, me´todo Bubble Sort em vetor de tamanho 100. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 i n t i t e r a c o e s = 0 ; 8 srand (10) ; 9 10 i n t vet [TAM] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 vet [ i ] = rand ( )%TAM+1; 14 15 //INICIO 16 bool t rocou ; 17 i n t aux ; 18 19 do 20 { 21 t rocou = f a l s e ; 22 23 f o r ( i n t i = 0 ; i < TAM−1 ; i++ ) 24 { 25 i t e r a c o e s ++; 26 27 i f ( vet [ i ] > vet [ i +1] ) 28 { 29 aux = vet [ i ] ; 30 vet [ i ] = vet [ i +1] ; 31 vet [ i +1] = aux ; 32 t rocou = true ; 33 } 34 } 35 } whi le ( t rocou ) ; 36 //FIM 37 38 f o r ( i n t i = 0 ; i < TAM ; i++ ) 39 cout << vet [ i ] << ”\ t ” ; 40 cout << endl ; 41 42 cout << ”O numero de i t e r a c o e s f o i : ” << i t e r a c o e s << endl ; 27 43 44 r e turn 0 ; 45 } Algoritmo de ordenac¸a˜o, me´todo Bubble Sort em uma matriz 5x5. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 5 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 srand (10) ; 8 9 i n t mat [TAM] [TAM] ; 10 11 f o r ( i n t i = 0 ; i < TAM ; i++ ) 12 f o r ( i n t j = 0 ; j < TAM ; j++ ) 13 mat [ i ] [ j ] = rand ( ) %100+1; 14 15 //INICIO 16 bool t rocou ; 17 i n t aux ; 18 19 do 20 { 21 t rocou = f a l s e ; 22 23 f o r ( i n t i = 0 ; i < TAM ; i++ ) 24 f o r ( i n t j = 0 ; j < TAM−1 ; j++ ) 25 { 26 i f ( mat [ i ] [ j ] > mat [ i ] [ j +1] ) 27 { 28 aux = mat [ i ] [ j ] ; 29 mat [ i ] [ j ] = mat [ i ] [ j +1] ; 30 mat [ i ] [ j +1] = aux ; 31 t rocou = true ; 32 } 33 } 34 35 f o r ( i n t i = 0 ; i < TAM−1 ; i++ ) 36 i f ( mat [ i ] [TAM−1] > mat [ i + 1 ] [ 0 ] ) 37 { 38 aux = mat [ i ] [TAM−1] ; 39 mat [ i ] [TAM−1] = mat [ i + 1 ] [ 0 ] ; 40 mat [ i + 1 ] [ 0 ] = aux ; 41 t rocou = true ; 42 } 43 } whi le ( t rocou ) ; 44 //FIM 45 46 f o r ( i n t i = 0 ; i < TAM ; i++ ) 47 { 48 f o r ( i n t j = 0 ; j < TAM ; j++ ) 49 cout << mat [ i ] [ j ] << ”\ t ” ; 50 cout << endl ; 51 } 52 53 r e turn 0 ; 54 } 28 8.2 Selection Sort (“Selec¸a˜o”) 8.2.1 Descric¸a˜o O selection sort, ou ordenac¸a˜o por selec¸a˜o, e´ um algoritmo de ordenac¸a˜o baseadoem se passar sempre o menor valor do arranjo para a primeira posic¸a˜o (ou o maior dependendo da ordem requerida), depois o de segundo menor valor para a segunda posic¸a˜o, e assim e´ feito sucessivamente com os elementos restantes. 8.2.2 Exemplo Algoritmo de ordenac¸a˜o, me´todo Selection Sort em vetor de tamanho 100. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 i n t i t e r a c o e s = 0 ; 8 srand (10) ; 9 10 i n t vet [TAM] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 vet [ i ] = rand ( )%TAM+1; 14 15 //INICIO 16 i n t pMenor , aux ; 17 18 f o r ( i n t i = 0 ; i < TAM−1 ; i++ ) 19 { 20 pMenor = i ; 21 22 f o r ( i n t j = i+1 ; j < TAM ; j++ ) 23 { 24 i t e r a c o e s ++; 25 i f ( vet [ pMenor ] > vet [ j ] ) 26 pMenor = j ; 27 } 28 29 i f ( pMenor != i ) 30 { 31 aux = vet [ pMenor ] ; 32 vet [ pMenor ] = vet [ i ] ; 33 vet [ i ] = aux ; 34 } 35 } 36 //FIM 37 38 f o r ( i n t i = 0 ; i < TAM ; i++ ) 39 cout << vet [ i ] << ”\ t ” ; 40 cout << endl ; 41 42 cout << ”O numero de i t e r a c o e s f o i : ” << i t e r a c o e s << endl ; 43 44 r e turn 0 ; 45 } 29 8.3 Insertion Sort (“Inserc¸a˜o”) 8.3.1 Descric¸a˜o Insertion sort, ou ordenac¸a˜o por inserc¸a˜o, e´ um simples algoritmo de ordenac¸a˜o, eficiente quando aplicado a um pequeno nu´mero de elementos. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e a` medida que avanc¸a vai deixando os elementos mais a` esquerda ordenados. O algoritmo de inserc¸a˜o funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o poˆquer. 8.3.2 Exemplo Algoritmo de ordenac¸a˜o, me´todo Insertion Sort em vetor de tamanho 100. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 i n t i t e r a c o e s = 0 ; 8 srand (10) ; 9 10 i n t vet [TAM] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 vet [ i ] = rand ( )%TAM+1; 14 15 //INICIO 16 i n t aux ; 17 18 f o r ( i n t i = 1 ; i < TAM ; i++ ) 19 { 20 whi le ( ( i != 0) && ( vet [ i ] < vet [ i −1]) ) 21 { 22 i t e r a c o e s ++; 23 24 aux = vet [ i ] ; 25 vet [ i ] = vet [ i −1] ; 26 vet [ i −1] = aux ; 27 i−−; 28 } 29 } 30 //FIM 31 32 f o r ( i n t i = 0 ; i < TAM ; i++ ) 33 cout << vet [ i ] << ”\ t ” ; 34 cout << endl ; 35 36 cout << ”O numero de i t e r a c o e s do metodo f o i : ” << i t e r a c o e s << endl ; 37 38 r e turn 0 ; 39 } 30 9 Me´todos de Busca 9.1 Busca Sequencial (Linear) 9.1.1 Descric¸a˜o Costuma-se usar o termo busca linear (ou busca sequeˆncial) para expressar um tipo de pesquisa em arranjos de modo sequencial (elemento por elemento), de modo que a func¸a˜o do tempo em relac¸a˜o ao nu´mero de elementos e´ linear, ou seja, cresce proporcionalmente. Num vetor ordenado, essa na˜o e´ a pesquisa mais eficiente, a busca (ou pesquisa) bina´ria e´ a mais eficiente. 9.1.2 Exemplos Algoritmo que faz uma busca em vetor de tamanho 100 desordenado. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 i n t i t e r a c o e s = 0 ; 8 srand (10) ; 9 10 i n t vet [TAM] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 { 14 vet [ i ] = rand ( )%TAM+1; 15 cout << vet [ i ] << ”\ t ” ; 16 } 17 cout << endl ; 18 19 //INICIO 20 i n t busca ; 21 c in >> busca ; 22 23 i n t pos i cao = −1; 24 25 f o r ( i n t i = 0 ; i < TAM ; i++ ) 26 { 27 i t e r a c o e s ++; 28 i f ( vet [ i ] == busca ) 29 pos i cao = i ; 30 } 31 //FIM 32 33 cout << ”A pos i cao do vetor buscado e : ” << pos i cao << endl ; 34 cout << ”O numero de i t e r a c o e s f o i : ” << i t e r a c o e s << endl ; 35 36 r e turn 0 ; 37 } 31 Algoritmo que faz uma busca em vetor de tamanho 100 ordenado. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 i n t i t e r a c o e s = 0 ; 8 srand (10) ; 9 10 i n t vet [TAM] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 vet [ i ] = rand ( )%TAM+1; 14 15 bool t rocou ; 16 i n t aux ; 17 18 do 19 { 20 t rocou = f a l s e ; 21 22 f o r ( i n t i = 0 ; i < TAM−1 ; i++ ) 23 { 24 i f ( vet [ i ] > vet [ i +1] ) 25 { 26 aux = vet [ i ] ; 27 vet [ i ] = vet [ i +1] ; 28 vet [ i +1] = aux ; 29 t rocou = true ; 30 } 31 } 32 } whi le ( t rocou ) ; 33 34 f o r ( i n t i = 0 ; i < TAM ; i++ ) 35 cout << vet [ i ] << ”\ t ” ; 36 cout << endl ; 37 38 //INICIO 39 i n t busca ; 40 c in >> busca ; 41 42 i n t pos i cao = −1, i = 0 ; 43 44 whi le ( pos i cao == −1 && vet [ i ] <= busca ) 45 { 46 i t e r a c o e s ++; 47 48 i f ( busca == vet [ i ] ) 49 pos i cao = i ; 50 e l s e 51 i ++; 52 } 53 //FIM 54 55 cout << ”A pos i cao do vetor buscado e : ” << pos i cao << endl ; 56 cout << ”O numero de i t e r a c o e s f o i : ” << i t e r a c o e s << endl ; 57 58 r e turn 0 ; 59 } 32 9.2 Busca Bina´ria 9.2.1 Descric¸a˜o A pesquisa ou busca bina´ria e´ um algoritmo de busca em vetores que segue o paradigma de divisa˜o e conquista. Ela parte do pressuposto de que o vetor esta´ ordenado e realiza sucessivas diviso˜es do espac¸o de busca comparando o elemento buscado (chave) com o elemento no meio do vetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso. Caso contra´rio, se o elemento do meio vier antes do elemento buscado, enta˜o a busca continua na metade posterior do vetor. E finalmente, se o elemento do meio vier depois da chave, a busca continua na metade anterior do vetor. 9.2.2 Exemplo Algoritmo que faz uma busca bina´ria em vetor de tamanho 100, desta vez o vetor deve estar ordenado. 1 #inc lude <iostream> 2 #inc lude <c s t d l i b> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 i n t main ( ) 6 { 7 i n t i t e r a c o e s = 0 ; 8 srand (10) ; 9 10 i n t vet [TAM] ; 11 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 vet [ i ] = rand ( )%TAM+1; 14 15 i n t pMenor , aux ; 16 17 f o r ( i n t i = 0 ; i < TAM−1 ; i++ ) 18 { 19 pMenor = i ; 20 21 f o r ( i n t j = i+1 ; j < TAM ; j++ ) 22 { 23 i f ( vet [ pMenor ] > vet [ j ] ) 24 pMenor = j ; 25 } 26 27 i f ( pMenor != i ) 28 { 29 aux = vet [ pMenor ] ; 30 vet [ pMenor ] = vet [ i ] ; 31 vet [ i ] = aux ; 32 } 33 } 34 35 f o r ( i n t i = 0 ; i < TAM ; i++ ) 36 cout << vet [ i ] << ”\ t ” ; 37 cout << endl ; 38 39 //INICIO 40 i n t busca ; 41 c in >> busca ; 42 43 i n t i n i c i o = 0 ; 44 i n t f im = TAM−1; 45 i n t meio ; 46 i n t pos i cao = −1; 47 33 48 do 49 { 50 i t e r a c o e s ++; 51 52 meio = ( i n i c i o+fim ) /2 ; 53 54 i f ( busca == vet [ meio ] ) 55 pos i cao = meio ; 56 57 e l s e i f ( busca > vet [ meio ] ) 58 i n i c i o = meio+1; 59 60 e l s e 61 f im = meio−1; 62 } whi le ( pos i cao < 0 && i n i c i o <= fim ) ; 63 //FIM 64 65 cout << ”A pos i cao do vetor buscado e : ” << pos i cao << endl ; 66 cout << ”O numero de i t e r a c o e s f o i : ” << i t e r a c o e s << endl ; 67 68 r e turn 0 ; 69 } 10 Registro 10.1 Sintaxe 1 typede f s t r u c t 2 { 3 <dec l a racao de v a r i a e i s >; 4 } <nome de r e g i s t r o >; 10.2 Descric¸a˜o O registro consiste em criar apenas um dado que conte´m va´rios membros, que nada mais sa˜o do que outras varia´veis. De uma forma mais simples, e´ como se uma varia´vel tivesse outras varia´veis dentro dela. A vantagem em se usar registro e´ que podemos agrupar de forma organizada va´rios tipos de dados diferentes, por exemplo, dentro de uma estrutura de dados podemos ter juntos tanto um tipo float, um int, um char e um double. As varia´veis que ficamdentro do registro sa˜o chamadas de membros. 34 10.3 Exemplo Algoritmo que recebe o nome, nu´mero de matr´ıcula e o CRA de 5 alunos. Verifica quem foi aprovado e imprime em ordem crescente, pelo CRA, o nome e o nu´mero de matr´ıcula dos alunos aprovados. 1 #inc lude <iostream> 2 #inc lude <s t r i ng> 3 #d e f i n e MAX 5 4 us ing namespace std ; 5 6 typede f s t r u c t 7 { 8 s t r i n g nome ; 9 i n t matr i cu la ; 10 f l o a t CRA; 11 } Reg i s t ro ; 12 13 i n t main ( ) 14 { 15 Reg i s t ro Aluno [MAX] ; 16 17 f o r ( i n t i = 0 ; i < MAX ; i++ ) 18 { 19 c in >> Aluno [ i ] . nome ; 20 c in >> Aluno [ i ] . matr i cu la ; 21 c in >> Aluno [ i ] .CRA; 22 } 23 24 Reg i s t ro Aux ; 25 i n t pMenor ; 26 27 f o r ( i n t i = 0 ; i < MAX−1 ; i++ ) 28 { 29 pMenor = i ; 30 f o r ( i n t j = i ; j < MAX ; j++ ) 31 i f ( Aluno [ pMenor ] .CRA > Aluno [ j ] .CRA ) 32 pMenor = j ; 33 34 i f ( pMenor != i ) 35 { 36 Aux = Aluno [ pMenor ] ; 37 Aluno [ pMenor ] = Aluno [ i ] ; 38 Aluno [ i ] = Aux ; 39 } 40 } 41 42 f o r ( i n t i = 0 ; i < MAX ; i++ ) 43 i f ( Aluno [ i ] .CRA >= 60 ) 44 cout << Aluno [ i ] . nome << ”\ t ” << Aluno [ i ] . matr i cu la << endl ; 45 46 r e turn 0 ; 47 } 11 Modularizac¸a˜o 11.1 Descric¸a˜o Conjunto de comandos agrupados em um bloco que recebe um nome e atrave´s deste pode ser ativado. 35 11.2 Porque usar func¸o˜es? 1. Permite o reaproveitamento de co´digo ja´ constru´ıdo (por voceˆ ou por outros programadores). 2. Evita que um trecho de co´digo que seja repetido va´rias vezes dentro de um mesmo programa. 3. Permite a alterac¸a˜o de um trecho de co´digo de uma forma mais ra´pida. Com o uso de uma func¸a˜o e´ preciso alterar apenas dentro da func¸a˜o que se deseja. 4. Os blocos do programa na˜o ficam grandes demais e, por consequ¨eˆncia, mais dif´ıceis de entender. 5. Facilita a leitura do programa-fonte de uma forma mais fa´cil. 6. Separa o programa em partes (blocos) que possam ser logicamente compreen- didos de forma isolada. 11.3 Varia´vel Global Uma varia´vel global e´ uma varia´vel acess´ıvel em todos os escopos8 de um programa de computador. O mecanismo de interac¸a˜o com varia´veis globais e´ chamada ambi- ente global. Em contraste o ambiente local e´ um mecanismo no qual as varia´veis sa˜o locais e sem memo´ria compartilhada. O uso de varia´veis globais e´ geralmente considerado inadequado pois seu conteu´do pode ser potencialmente modificado de qualquer local, e qualquer parte de um co´digo pode depender dela. 11.4 Paraˆmetros A fim de tornar mais amplo o uso de uma func¸a˜o, a linguagem C permite o uso de paraˆmetros. Este paraˆmetros possibilitam que se definida sobre quais dados a func¸a˜o deve operar. Para definir os paraˆmetros de uma func¸a˜o o programador deve explicita´-los como se estive declarando uma varia´vel, entre os pareˆnteses do cabec¸alho da func¸a˜o. 8Escopo: e´ o local onde a varia´vel declarada e´ va´lida, normalmente dentro do bloco de coman- dos. No caso da vari global que e´ declarada fora de qualquer bloco, ela sera´ va´lida em qualquer func¸a˜o abaixo dela. 36 11.5 Exemplo Algoritmo que preenche um vetor de N posic¸o˜es e faz uma busca de um elemento. 1 #inc lude <iostream> 2 us ing namespace std ; 3 4 i n t Receber ( ) 5 { 6 i n t va l o r ; 7 8 c in >> va lo r ; 9 10 r e turn va lo r ; 11 } 12 13 void Preencher ( i n t vet [ ] , i n t n ) 14 { 15 f o r ( i n t i = 0 ; i < n ; i++ ) 16 vet [ i ] = Receber ( ) ; 17 } 18 19 void Imprimir ( i n t vet [ ] , i n t n ) 20 { 21 f o r ( i n t i = 0 ; i < n ; i++ ) 22 cout << vet [ i ] << ”\ t ” ; 23 cout << endl ; 24 } 25 26 i n t Busca ( i n t vet [ ] , i n t n ) 27 { 28 i n t busca = Receber ( ) ; 29 i n t pos = −1; 30 31 f o r ( i n t i = 0 ; i < n ; i++ ) 32 i f ( busca == vet [ i ] ) 33 pos = i ; 34 35 r e turn pos ; 36 } 37 38 void Resultado ( i n t r e s ) 39 { 40 cout << r e s << endl ; 41 } 42 43 i n t main ( ) 44 { 45 i n t n = Receber ( ) ; 46 47 i n t vet [ n ] ; 48 49 Preencher ( vet , n ) ; 50 51 Imprimir ( vet , n ) ; 52 53 Resultado ( Busca ( vet , n ) ) ; 54 55 r e turn 0 ; 56 } Neste programa temos 5 func¸o˜es externas, todas controladas pela func¸a˜o int main. 37 int Receber e int Busca. • As duas func¸o˜es sa˜o do tipo int, portanto, elas retornam um valor inteiro. Quando a estas func¸o˜es sa˜o chamadas por outra func¸a˜o elas “adquirem” o valor retornado e podem ser usadas como uma “varia´vel”. • A func¸a˜o Receber, declara a varia´vel valor e recebe o nu´mero digitado pelo usua´rio e retorna o valor. Este valor e´ utilizado pelas func¸o˜es Preencher, Busca e main. • A func¸a˜o Busca, recebe o vetor e seu tamanho como paraˆmetros, faz a busca do elemento no vetor e retorna a posic¸a˜o deste elemento. void Preencher, void Imprimir e void Resultado. • As treˆs func¸o˜es sa˜o do tipo void, portanto, na˜o retornam nenhum valor. Sendo assim, estas func¸o˜es devem ter algum tipo de ac¸a˜o, sena˜o na˜o teriam nenhuma utilidade. • A func¸a˜o Preencher, como o nome ja´ diz, preenche o vetor de n posic¸o˜es. • As func¸o˜es Imprimir e Resultado, apresentam os valores para o usua´rio. int main. • A func¸a˜o main e´ a principal func¸a˜o de um programa, ela controla quais func¸o˜es sera˜o executadas. 12 Arquivo 12.1 Sintaxe 1 #inc lude <fstream> 2 3 i f s t r e a m <nome da var i ave l >; 4 5 ofstream <nome da var i ave l >; 12.2 Descric¸a˜o Ja´ vimos como podemos receber e enviar dados para usua´rio atrave´s do teclado e da tela, agora veremos tambe´m como ler e gravar dados em arquivos, o que e´ alia´s muito importante ou ate´ essencial em muitas aplicac¸o˜es. Assim como as func¸o˜es de entrada/sa´ıda padra˜o (teclado e tela), precisamos de uma biblioteca para usa-las (biblioteca fstream). Temos o comando ifstream (seria como o cin), este comando abre um arquivo, le os dados contidos nele e salva nas varia´veis usadas pelo programa. Temos tambe´m o comando ofstream (seria como o cout), este comando cria um arquivo e salva os dados contidos nas varia´veis do programa neste arquivo. 38 12.3 Exemplos Algoritmo que cria e salva um vetor de 100 posic¸o˜es ordenado em um arquivo. 1 #inc lude <iostream> 2 #inc lude <fstream> 3 #inc lude <c s t d l i b> 4 #inc lude <ctime> 5 #d e f i n e TAM 100 6 us ing namespace std ; 7 8 i n t vet [TAM] ; 9 10 void Preencher ( ) 11 { 12 f o r ( i n t i = 0 ; i < TAM ; i++ ) 13 vet [ i ] = rand ( )%TAM+1; 14 } 15 16 bool Troca ( i n t a , i n t b ) 17 { 18 i n t aux ; 19 aux = vet [ a ] ; 20 vet [ a ] = vet [ b ] ; 21 vet [ b ] = aux ; 22 23 r e turn t rue ; 24 } 25 26 void BubbleSort ( ) 27 { 28 bool t rocou ; 29 30 do 31 { 32 t rocou = f a l s e ; 33 34 f o r ( i n t i = 0 ; i < TAM−1 ; i++ ) 35 i f ( vet [ i ] > vet [ i +1] ) 36 t rocou = Troca ( i , i+1 ) ; 37 } whi le ( t rocou ) ; 38 } 39 40 void SalvarArquivo ( ) 41 { 42 ofstream Criador ; 43 44 Criador . open ( ” entrada . txt ” ) ; 45 46 i f ( Criador ) 47 { 48 f o r ( i n t i = 0 ; i < TAM ; i++ ) 49 Criador << vet [ i ] << ”\ t ” ; 50 Criador . c l o s e ( ) ; 51 } 52 53 e l s e 54 cout << ”Erro ao c r i a r o arquivo ! ” << endl ; 55 } 56 57 i n t main ( ) 58 { 59 srand ( time (NULL) ) ; 60 Preencher ( ) ; 61 BubbleSort ( ) ; 62 SalvarArquivo ( ) ; 63 r e turn 0 ; 64 } 39 int vet[TAM]. • Declarando a varia´vel vet acima de todas as func¸o˜es ela se torna global, ou seja, todas as func¸o˜es podem utiliza-la e modifica-la. • Neste programa, vet foi declarada como global, pois todas as func¸o˜es a utilizam e para evitar de usa´-la sempre como paraˆmetro. bool Troca. • A func¸a˜o retorna o valor verdadeiro ou falso. Ela executa a troca utilizadanas func¸o˜es de ordenac¸a˜o, em programas de maiores estas func¸o˜es podem ser usadas va´rias vezes, para evitar de escrever muitas vezes a mesma linha de comando, usa-se a func¸a˜o externa. • Tente sempre dividir o seu programa no maior nu´mero de func¸o˜es poss´ıvel, pois ajuda na legibilidade do seu co´digo. void SalvarArquivo. • A func¸a˜o e´ do tipo void pois na˜o retorna nenhum valor. • Ela cria um arquivo chamado de “entrada.txt”, verifica se o arquivo foi criado. • Se o arquivo foi criado com sucesso, ela salva o vetor ordenado neste arquivo e depois o fecha. • Se na˜o foi poss´ıvel criar o arquivo, ela apresenta a mensagem de erro. Algoritmo que le o arquivo “entrada.txt” criado anteriormente e faz uma busca bina´ria. 1 #inc lude <fstream> 2 #inc lude <iostream> 3 #d e f i n e TAM 100 4 us ing namespace std ; 5 6 i n t vet [TAM] ; 7 8 void LerArquivo ( ) 9 { 10 i f s t r e a m L e i t o r ; 11 12 L e i t o r . open ( ” entrada . txt ” ) ; 13 14 i f ( L e i t o r ) 15 { 16 f o r ( i n t i = 0 ; i < TAM ; i++ ) 17 L e i t o r >> vet [ i ] ; 18 19 L e i t o r . c l o s e ( ) ; 20 } 21 22 e l s e 23 cout << ”Arquivo nao e x i s t e ! ! ! ” << endl ; 24 } 25 26 i n t Busca ( ) 27 { 28 i n t busca ; 29 30 c in >> busca ; 31 32 r e turn busca ; 40 33 } 34 35 i n t BuscaBinaria ( i n t busca ) 36 { 37 i n t pos = −1; 38 39 i n t i n i = 0 ; 40 i n t f im = TAM−1; 41 i n t meio ; 42 43 do 44 { 45 meio = ( i n i+fim ) /2 ; 46 47 i f ( vet [ meio ] < busca ) 48 i n i = meio+1; 49 50 e l s e i f ( vet [ meio ] > busca ) 51 f im = meio−1; 52 53 e l s e 54 pos = meio ; 55 } whi le ( ( pos < 0) && ( i n i <= fim ) ) ; 56 57 r e turn pos ; 58 } 59 60 void Resposta ( i n t r e spo s t a ) 61 { 62 cout << r e spo s ta << endl ; 63 } 64 65 i n t main ( ) 66 { 67 LerArquivo ( ) ; 68 69 Resposta ( BuscaBinaria ( Busca ( ) ) ) ; 70 } 41
Compartilhar