C(++) para não Computeiros: uma introdução ao raciocínio ...anilton/APC...

155
Versão Preliminar C(++) para não Computeiros: uma introdução ao raciocínio computacional Lásaro Camargos Paulo R. Coelho Anilton Joaquim 25 de junho de 2014

Transcript of C(++) para não Computeiros: uma introdução ao raciocínio ...anilton/APC...

Vers

o Prel

imina

rC(++) para no Computeiros: uma introduo ao

raciocnio computacional

Lsaro Camargos Paulo R. Coelho Anilton Joaquim

25 de junho de 2014

Vers

o Prel

imina

r

2

Vers

o Prel

imina

rSumrioI Bsico 11

1 O computador uma mquina burra 131.1 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2 Linguagem de Programao . . . . . . . . . . . . . . . . . . . . . . 141.3 A linguagem C(++) . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.3.1 Meu Primeiro Programa . . . . . . . . . . . . . . . . . . . . 141.3.2 rea de um Retngulo . . . . . . . . . . . . . . . . . . . . . 151.3.3 Tipos Primitivos da Linguagem C . . . . . . . . . . . . . . . 161.3.4 Organizao do Cdigo . . . . . . . . . . . . . . . . . . . . . 16

1.4 Sada de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.5 A Funo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.6 Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2 Compilao e Execuo 232.1 O processo de compilao . . . . . . . . . . . . . . . . . . . . . . . 232.2 A IDE Code::Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.2.1 Criando um Projeto . . . . . . . . . . . . . . . . . . . . . . . 242.2.2 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.3 O Arquivo Executvel . . . . . . . . . . . . . . . . . . . . . . . . . . 272.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3 Variveis, Entrada / Sada e Operadores 293.1 Declarao de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.1.1 Atribuio e Uso . . . . . . . . . . . . . . . . . . . . . . . . 303.1.2 Parmetros so Variveis . . . . . . . . . . . . . . . . . . . . 32

3.2 Entrada / Sada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.2.1 Leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.2.2 Impresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.3 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3

Vers

o Prel

imina

r

4 SUMRIO

4 Variveis (II) 374.1 Escopo de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.2 Faixas de Valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

5 Seleo Simples 415.1 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . 435.2 if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.3 Funes e Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . 475.4 O Tipo Primitivo bool . . . . . . . . . . . . . . . . . . . . . . . . . 485.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

6 Seleo Simples (II) 516.1 if-else e Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . 516.2 Prioridade dos Operadores . . . . . . . . . . . . . . . . . . . . . . . 536.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

7 Switch 577.1 switch-case-default . . . . . . . . . . . . . . . . . . . . . . . . . 577.2 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

8 Repetio (I) 658.1 Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658.2 O comando while . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.3 O comando do-while . . . . . . . . . . . . . . . . . . . . . . . . . . 678.4 Mais exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

8.4.1 Operadores de incremento e outras construes especiais . . . 698.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

9 Repetio (II) 759.1 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759.2 Mais Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779.3 Declaraes especiais . . . . . . . . . . . . . . . . . . . . . . . . . . 779.4 Alterando a repetio com o break e continue . . . . . . . . . . . . 789.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

10 Arranjos Unidimensionais 8110.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8110.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8410.3 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Vers

o Prel

imina

r

SUMRIO 5

11 Caracteres, Vetores de Caracteres e Strings 8511.1 Representao de caracteres . . . . . . . . . . . . . . . . . . . . . . 8511.2 Vetores de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . 8611.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8811.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8911.5 Vetores de Caracteres como Strings . . . . . . . . . . . . . . . . . . 9011.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9111.7 Funes para manipulao Strings . . . . . . . . . . . . . . . . . . . 9111.8 Funes com vetores como parmetros . . . . . . . . . . . . . . . . . 9211.9 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

12 Bits, bytes e bases numricas 9512.1 Bit & Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

12.1.1 Base Binria . . . . . . . . . . . . . . . . . . . . . . . . . . 9512.1.2 Base Hexadecimal . . . . . . . . . . . . . . . . . . . . . . . 96

12.2 Converso entre bases numricas . . . . . . . . . . . . . . . . . . . . 9612.3 Tipos Numricos Inteiros . . . . . . . . . . . . . . . . . . . . . . . . 97

12.3.1 Nmeros Binrios Negativos . . . . . . . . . . . . . . . . . . 9912.4 Aritmtica Inteira Binria . . . . . . . . . . . . . . . . . . . . . . . . 100

12.4.1 Nmeros positivos . . . . . . . . . . . . . . . . . . . . . . . 10012.4.2 Nmeros em Complemento de 2 . . . . . . . . . . . . . . . . 10012.4.3 E a subtrao? . . . . . . . . . . . . . . . . . . . . . . . . . 101

12.5 Tipos Numricos Reais . . . . . . . . . . . . . . . . . . . . . . . . . 10112.6 Exerccios e laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . 102

12.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10212.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10212.6.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10212.6.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10312.6.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10312.6.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

13 Funes teis I 10513.1 Funes Matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.2 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

14 Arranjos Multidimensionais 10914.1 Declarao e Iniciao . . . . . . . . . . . . . . . . . . . . . . . . . 109

14.1.1 Acesso aos elementos . . . . . . . . . . . . . . . . . . . . . 11014.2 Mais Dimenses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11014.3 Multiplicao de Matrizes . . . . . . . . . . . . . . . . . . . . . . . 11114.4 Passagem de matriz como parmetro em funes . . . . . . . . . . . 11214.5 Matrizes de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 11314.6 Exercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

Vers

o Prel

imina

r

6 SUMRIO

15 Ordenao de Arranjos 11515.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11515.2 Algoritmos de Ordenao . . . . . . . . . . . . . . . . . . . . . . . . 115

15.2.1 Algoritmo de Insero (Insertion Sort) . . . . . . . . . . . . . 11515.2.2 Algoritmo de Seleo (Selection Sort) . . . . . . . . . . . . . 11615.2.3 Algoritmo de Ordenao por Troca (Bubble Sort) . . . . . . . 117

15.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11815.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11815.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11915.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

II Intermedirio 121

16 Estruturas No-Homogneas 12316.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12316.2 Declarao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

16.2.1 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12416.3 Acesso aos Campos de Uma Estrutura . . . . . . . . . . . . . . . . . 12516.4 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12516.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

16.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12616.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

16.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12716.7 Estruturas e funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 12716.8 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

17 Referncias 13117.1 A memria um grande vetor . . . . . . . . . . . . . . . . . . . . . 13117.2 Variveis do Tipo Referncia . . . . . . . . . . . . . . . . . . . . . . 13217.3 Passagem de Referncias como Parmetros . . . . . . . . . . . . . . 13317.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

18 Referncias II 13518.1 Ponteiros para Structs . . . . . . . . . . . . . . . . . . . . . . . . . . 13518.2 Arranjos e Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . 137

18.2.1 Percorrendo vetores com ponteiros . . . . . . . . . . . . . . . 13718.3 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

19 Alocao Dinmica 14119.1 Alocao Dinmica de Tipos Simples . . . . . . . . . . . . . . . . . 14119.2 Alocao Dinmica de Vetores . . . . . . . . . . . . . . . . . . . . . 14219.3 Liberao de memria . . . . . . . . . . . . . . . . . . . . . . . . . 14319.4 Alocao Dinmica de Estruturas . . . . . . . . . . . . . . . . . . . . 14319.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

19.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Vers

o Prel

imina

r

SUMRIO 7

19.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14419.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

19.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14419.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

20 Arquivos 14520.1 Arquivos de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

20.1.1 Abertura e Fechamendo de Arquivos . . . . . . . . . . . . . . 14620.1.2 Criao de Arquivos . . . . . . . . . . . . . . . . . . . . . . 14720.1.3 Cuidados com a Formatao dos Dados . . . . . . . . . . . . 148

20.2 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

21 Navegao dentro do arquivo 15121.1 Posicionamento no arquivo . . . . . . . . . . . . . . . . . . . . . . . 15121.2 Arquivos formatados . . . . . . . . . . . . . . . . . . . . . . . . . . 15221.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

21.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Vers

o Prel

imina

r

8 SUMRIO

Vers

o Prel

imina

rIntroduoA habilidade de olhar para um problema complexo e extrair do mesmo um conjuntode problemas mais simples e, portanto, mais facilmente resolvveis, essencial aosprofissionais da computao. Isto por qu na automatizao de tarefas por um com-putador, necessrio quebr-las em unidades mnimas, que sejam compreensveis pelamquina. Acontece que esta habilidade tambm til profissionais das mais diversasreas, da construo civil de foguetes, da medicina psicologia, e todas as reas daengenharia. A esta habilidade, chamamos de raciocnio computacional.

Este material uma tentativa de organizar um curso de raciocnio computacional,via aprendizado de tcnicas bsicas de programao. Nosso pblico alvo so os estu-dantes cujo tpico principal de estudo no a Cincia da Computao ou reas afins,embora estes tambm possam us-lo como uma introduo aos estudos mais aprofun-dados que faro.

Este tipo de curso tradicional nos estudos de engenharia e mesmo outras reas e,provavelmente por razes histricas, dado usando-se como ferramenta a linguagemde programao C. Aqui usaremos C, mas no toda ela e no somente ela. Em vezdisso, usaremos parte da linguagem C, extendida com partes da linguagem C++. Aesta combinao particular, chamaremos C(++).

O material dividido em captulos correspondendo a aproximadamente uma aulade 100 minutos. So X lies, provavelmente mais do que comporiam um curso deste total?total?tipo dando, assim, opes para que os professores usando livro variem a estrutura deseus cursos.

Sugere-se que a primeira parte do livro, mais bsica, seja seguida na ntegra e naordem em que apresentada. A segunda parte contem tpicos mais (mas no completa-mente) independentes. A terceira parte apresenta tpicos mais avanados, que poderoser usadas em turmas com melhor rendimento.

Cada captulo iniciado com uma motivao para o tpico apresentado, seguido desees com a teoria e exemplos. O captulo termina, ento, com exerccios propostos eproblemas para serem resolvidos em laboratrio.

9

Vers

o Prel

imina

r

10 SUMRIO

Vers

o Prel

imina

rParte I

Bsico

11

Vers

o Prel

imina

r

Vers

o Prel

imina

rCaptulo 1O computador uma mquinaburra

Computadores so mquinas burras que no fazem nada alm de seguir instrues.Sendo assim, eles precisam de instrues precisas e detalhadas sobre o que fazer. Agoraque est ciente deste fato, voc est pronto para entender que quando o programa nofizer o que voc quer, por que voc lhe deu instruo errada.

Para que no cometamos erros (ou pelo menos para minimiz-los), ao montara sequncia de instrues que resolvem determinado problema precisamos, antes dequalquer outra coisa, entender o problema e sermos capazes de resolv-lo na mo.Uma vez que tenhamos uma soluo teremos o que chamamos de um algoritmo1.

1.1 Algoritmo

Um algoritmo nada mais que um conjunto de instrues para se resolver um pro-blema. Por exemplo, para se destrancar uma porta temos o seguinte algoritmo:

Coloque a chave na fechadura

Gire a chave

claro que este algoritmo est em um nvel de abstrao muito alto e que poderiaser muito mais detalhado. Por exemplo, no h por qu destrancar a porta se ela j es-tiver destrancada e no h como destranc-la se no estiver de posse da chave. Quantomais detalhada sua sequncia de passos, mais prximo de algo inteligvel ao computa-dor ela ser. Para que isto ocorra, isto , para que o computador entenda suas intrues,alm de detalhadas, eles precisam ser escritas em uma linguagem de programao.

1http://www.merriam-webster.com/dictionary/algorithm

13

http://www.merriam-webster.com/dictionary/algorithm

Vers

o Prel

imina

r

14 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

1.2 Linguagem de Programao

De acordo com fontes altamente confiveis2

Uma linguagem de programao uma linguagem artificial projetada paracomunicar instrues a uma mquina, particularmente computadores. Lin-guagens de programao podem ser usadas para criar programas que con-trolam o comportamento da mquina e expressar algoritmos de forma pre-cisa (no ambgua).

De forma simplificada, uma liguagem de programao um conjunto de palavras e re-gras sobre como us-las na descrio de algoritmos interpretveis por um computador.

Existem diversas 3 linguagens de programao, tendo cada uma seus pontos fortese fracos; neste curso, usaremos as linguagens C e C++.

1.3 A linguagem C(++)

A primeira encarnao da linguagem de programao C foi desenvolvida no fim dadcada de 60, tendo sido extendida, melhorada e padronizada vrias vezes depois. Alinguagem C++, que extende a linguagem C com diversas funcionalidades como orien-tao a objetos, comeou a ser desenvolvida na dcada de 70 e, como a linguagem C,tambm passou por vrias reformas. Como resultado, hoje temos uma linguagem C++padronizada que pode ser usada, mesmo que com certa dificuldade, para se programarem vrios sistemas operacionais de forma portvel. Alm disso, a linguagem C++ um super conjunto da linguagem C. Ou seja, todo e qualquer programa em C tambm um programa em C++, mesmo que o oposto no seja verdade.

Como j mencionado, neste curso usaremos primariamente a linguagem C. Con-tudo, uma vez que o objetivo deste curso introduzir o uso do racioccio computacionale no aprofundar no uso de determinada linguagem, estudaremos somente os aspectosda linguagem C. Alm disso, usaremos partes da linguagem C++ para simplificar odesenvolvimento dos nossos programas. Assim, nos referiremos linguagem usadacomo C(++), pois nem toda a C, e nem somente C, mas no chega a ser C++. Maschega de ladainha; vamos ao nosso primeiro programa em linguagem C(++)!

1.3.1 Meu Primeiro Programa

O algoritmo em linguagem C(++) 4, abaixo, descreve para o computador os passosnecessrios para se escrever a mensagem Ol Mundo! na tela do computador. Nose preocupe com os detalhes de como isso feito agora, mas foque-se nos seguintesaspectos:

2http://en.wikipedia.org/wiki/Programming_language3Uma listagem no completa mas ainda assim impressionante pode ser encontrada em http://en.

wikipedia.org/wiki/Categorical_list_of_programming_languages4Usaremos tambm os termos programa e cdigo para nos referirmos a tais algoritmos.

http://en.wikipedia.org/wiki/C_(programming_language)http://en.wikipedia.org/wiki/Programming_languagehttp://en.wikipedia.org/wiki/Categorical_list_of_programming_languageshttp://en.wikipedia.org/wiki/Categorical_list_of_programming_languages

Vers

o Prel

imina

r

1.3. A LINGUAGEM C(++) 15

existem vrias formas de se dizer Ol Mundo!, por exemplo se pode saltarantes de faz-lo, agaixar, ou fechar os olhos. Todas estas formas so corretas,embora algumas possam lhe causar certo constrangimento quando em pblico.

um cdigo de computador deve ser entendido, alm de pelos computadores, tam-bm por humanos. Sendo assim, imprescindvel que voc mantenha o cdigoorganizado.

usar acentos em um programa fonte de dores de cabea; melhor simplesmenteignor-los em nosso curso.

#include 2

using namespace std;4

int main()6 {

cout

Vers

o Prel

imina

r

16 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

tambm define que o resultado da funo ser um nmero inteiro ao preceder o nomeda funo (f) pela palavra int. Isto quer dizer que voc no pode usar esta funopara calcular a rea de retngulos cujos lados no sejam inteiros. Mas no se preocupe,corrigiremos esta deficincia daqui a pouco.

As linhas 2 e 4 definem o corpo da funo, isto , quais outras linhas so partes dafuno f. Toda funo na linguagem C precisa ter definido seu comeo e fim usando {e }, respectivamente.

A linha 3 do cdigo onde o clculo da rea efetivamente executado: a*b. Almdisso, esta linha define tambm qual o resultado da funo ao preceder o resultadoda multiplicao por return. Como a multiplicao de dois nmeros inteiros s poderesultar em um nmero inteiro, o resultado da funo tambm inteiro, est justificadoo tipo da funo ser int.

1.3.3 Tipos Primitivos da Linguagem CO Cdigo 1.2, como mencionado, tem a limitao de s calcular a rea de retnguloscujos lados tenham tamanhos inteiros. Para corrigir esta deficincia, vamos alter-lopara que aceite nmeros reais. Em computao, nmeros reais so tambm chama-dos de nmeros com pontos flutuantes e, em linguagem C, simplesmente de float.Sendo assim, podemos corrigir o programa simplesmente substituindo as ocorrnciasda palavra int por float, resultando no Cdigo 1.3

float f(float a, float b)2 {

return a * b;4 }

Cdigo 1.3: rea de retngulo com dimenses reais.

Pronto, a funo agora recebe dois parmetros do tipo float e retorna um resul-tado tambm deste tipo. Juntamente com outros tipos que sero vistos adiante no curso,int e float so chamados de tipos de dados primitivos da linguagem. Isto sugere,obviamente, que h tambm tipos no primitivos, e nada poderia ser mais verdade.Estes tipos, contudo, s sero vistos bem mais adiante no curso, no Captulo ?.Adicionar refernciaAdicionar referncia

1.3.4 Organizao do Cdigo possvel facilmente perceber um padro nos exemplos de cdigo apresentados atagora:

A linha definindo a funo seguida por uma linha contendo apenas um { que alinhado com o incio da linha acima.

A ltima linha da funo contm apenas um }, alinhado com o { do incio dafuno.

Todas as linhas entre o { inicial e o } final esto alinhas e mais avanadas emrelao s chaves.

Vers

o Prel

imina

r

1.4. SADA DE DADOS 17

Esta organizao do cdigo serve para facilitar a leitura do cdigo, uma vez que tornaextremamente bvio onde a funo comea e termina. Esta tcnica chamada inden-tao.

Algo que faltou nestes exemplos e que tambm serve ao propsito de facilitar oentendimento do cdigo so os chamados comentrios. O exemplo no Cdigo 1.4mostra como a funo f poderia ser comentada.

/*2 * A funcao a seguir calcula a area de um retangulo de base

* b e altura a. Os parametros e resultado da funcao sao do4 * tipo float.

*/6 float f(float a, float b){

8 //Calcula e retorna a area do retangulo.return a * b;

10 }

Cdigo 1.4: rea do retngulo, com comentrios.

Observe que h dois tipos de comentrios no cdigo. O primeiro comea com \*e termina com *\ e o segundo comea com \\ e termina no final da linha. Todosos comentrios servem somente ao programador e so completamente ignorados pelocomputador. Os comentrios podem ser poderosos aliados na hora de procurar porerros no seu cdigo, uma vez que permitem desabilitar trechos do mesmo.

Finalmente, muito importante nomear suas funes e parmetros com nomes in-tuitivos. Seguindo esta orientao, escreveremos a ltima verso de nossa funo.

/*2 * A funcao a seguir calcula a area de um retangulo de base

* base e altura altura. Os parametros e resultado da funcao4 * sao do tipo float.

*/6 float area_retangulo(float altura, float base){

8 //Calcula e retorna a area do retangulo.return altura * base;

10 }

Cdigo 1.5: rea do retngulo, com comentrios e nomes intuitivos.

1.4 Sada de DadosEm computao, diz-se que um programa est executando a sada de dados quandoenvia para fora do programa tais dados. Exemplos comuns de sada de dados so aescrita em arquivo, o envio de mensagens na rede ou, o mais comum, a exibio dedados na tela.

Em nossos programas, a sada de dados efetuada mais comumente ser para a telado computador. Este tipo de sada, por ser to comum, chamada de a sada padrodo C(++), ou simplesmente C out. Para enviar dados para a sada do C(++), usamos a

Vers

o Prel

imina

r

18 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

expresso cout

Vers

o Prel

imina

r

1.5. A FUNO MAIN 19

sen(1)0

Voc ver vrios exemplos de usos do cout na prxima seo.

1.5 A Funo mainQue o computador uma mquina burra e executa somente o que voc manda vocj deve ter entendido, mas como mand-lo executar algo? Em linguagem C(++), ocomputador sempre comea a execuo de um cdigo pela funo main, a funoprincipal. Sendo assim, se voc quer dizer ao computador que calcule a rea de umretngulo, ento esta ordem dever partir, de alguma forma, da funo main.

Para um exemplo,veja o seguinte cdigo.

#include 2

using namespace std;4

/*6 * A funcao a seguir calcula a area de um retangulo de base

* base e altura altura. Os parametros e resultado da funcao8 * sao do tipo float.

*/10 float area_retangulo(float altura, float base)

{12 //Calcula e retorna a area do retangulo.

return altura * base;14 }

16 int main(){

18 //Calculemos a area de alguns retangulos.cout

Vers

o Prel

imina

r

20 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

3. Finalmente, a funo area_retangulo aparece antes da fuo main no pro-grama. Isto deve ser verdade para todas as funes do seu programa. Isto ocorrepor qu, antes de executar a funo main, o computador precisa aprender sobrea existncia das outras funes.

O cdigo como est, includindo as duas linhas iniciais que ainda no sabem paraque servem, pronto para ser executado no seu computador. No prximo captuloveremos exatamente como fazer isso. At l, executemos o cdigo na mo:

O programa comea a executar pela funo main; somente o que est no corpodesta funo executado.

Na linha 18 no h o que executar, pois s um comentrio.

Na linha 19, como vimos no Cdigo 1.1, est se dizendo para o computador es-crever algo na tela. Este algo o resultado da aplicao da funo area_retanguloaos parmetros 3.3 e 2.0.6. Para que se conhea este resultado, o programa

executa a funo area_retangulo.

A linha 13 calcula a rea do retngulo, que ento retornado para a linha 19.

Na linha 19, a chamada da funo substituda pelo resultado, e o nmero 6.6 escrito na tela do computador. Na sequncia, escrito tambm endl, que fazcom que o computador salte para a prxima linha da tela do computador.

Na linha 20 o procedimento todo repetido, agora escrevendo o valor 4.0 na tela.

Na linha 23 tambm se repete o procedimento, mas agora passando como par-metro para a funo os valores inteiros 4 e 2. Como todo nmero inteiro tambm um nmero real, a funo novamente executada e o valor 8.0 impresso natela.

1.6 ConclusoOs cdigos apresentados neste captulo, apesar de simples, ilustraram vrios pontos im-portantes da programao de computadores em geral e da linguagem C em especfico.Estes pontos podem ser sumarizados assim:

Em C(++) pode-se definir funes que executem computaes bem definidas eespecficas.

C(++) tem vrios tipos de dados, como int (nmeros inteiros) e float (nme-ros reais).

importante manter o cdigo organizado, comentado e indentado. Isso facilitaseu entendimento e manuteno.

6Observe o uso de . como separador de casas decimais.

Vers

o Prel

imina

r

1.7. EXERCCIOS 21

1.7 ExercciosExerccio 1.1 Escreva um funo que calcule a rea de um crculo. Observe que alinguagem C baseada na lngua inglesa, na qual se separa casas decimais por . eno por ,. Logo, igual 3.14 e no 3,14.

Exerccio 1.2 Escreva uma funo que calcule a rea de um tringulo.

Vers

o Prel

imina

r

22 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

Vers

o Prel

imina

rCaptulo 2Compilao e ExecuoPara colocarmos nossos algoritmos em execuo, o primeiro passo escrev-los, usandoum editor de textos qualquer que salve arquivos em texto puro, como o notepad, vim,gedit, etc. A este arquivo com o cdigo chamaremos cdigo fonte ou simplesmentefonte. Uma vez de posse do fonte, preciso submet-lo a um processos com vriospassos que gera, ao final, um arquivo executvel ou o que chamamos, comumente, deprograma. O processo como um todo, descrito na seo seguinte, conhecido comocompilao, apesar de compilao ser apenas um dos passos do processo.

2.1 O processo de compilaoA sequncia de passos que compem a compilao a seguinte:

Cdigo Fonte Pr-processador Fonte Expandido Compilador ArquivoObjeto Ligador Executvel

De forma simplificada, a pr-compilao um passo que modifica o cdigo fontesubstituindo certas palavras chave encontradas ao longo do texto por suas definies.Por exemplo, pode-se definir que, no programa, toda vez que o pr-processador encon-trar a palavra PI, ele a substituir por 3.141649. A utilidade da pr-compilao ficarmais clara mais adiante no curso.

Uma vez terminada a pr-compilao, acontece a compilao do seu programa.A compilao traduz o cdigo que voc escreveu para uma linguagem inteligvel aocomputador, salvando-o em um arquivo chamado arquivo objeto. Por exemplo, a com-pilao transformaria o cdigo Ol Mundo! escrito acima em algo como

...CALL write(0x1,0x400623,0xe)GIO fd 1 "Ol Mundo!"RET...

Aps a compilao vem a linkedio, o passo que junta o seu arquivo objeto aoutros arquivos objetos interessantes, como por exemplo um que contenha cdigo de

23

Vers

o Prel

imina

r

24 CAPTULO 2. COMPILAO E EXECUO

funes matemticas, manipulao de arquivos, ou interao grfica com o usurio.1

2.2 A IDE Code::BlocksEmbora a edio de um programa possa ser feita em praticamente qualquer editor detextos, h certos editores que so mais adequados a esta tarefa. Tais editores fazem,dentre outras, a colorizao das palavras de seu cdigo de forma a ajud-lo a detectarerros e tentam alinhar automaticamente as linhas do seu cdigo. A inteno desteseditores aumenentar sua produtividade como programador. Outros editores vo aindamais longe e lhe permitem fazer todo o processo de compilao com um simples clickdo mouse ou apertar de uma tecla. Estes editores mais completos so conhecidos comoIntegrated Development Environment, ou simplesmente IDE.

No decorrer deste curso consideraremos que o aluno estar usando a IDE Code::Blocks,que gratuita e com verses para Windows, Linux e OSX. Entretanto, qualquer outraIDE ou mesmo a compilao manual podem ser usados em substituio ao Code::Blocks.

2.2.1 Criando um ProjetoPara comear a programar no Code::Blocks, precisamos criar um projeto. Este projetoconter seu cdigo fonte e, no caso de uma programao mais avanada, arquivos deimagens, definies de personalizao do processo de compilao, etc. Para criar umprojeto no Code::Blocks, clique em File e, em seguida, New, Project.

Na tela que se apresenta, voc deve escolher o tipo de projeto a ser criado. No seperca nos tipos; escolha Console Application e ento clique em Go.

Na tela seguinte voc dever escolher a linguagem de programao usada; escolhaC++ e clique em Next para passar para a tela onde dever nomear o seu projeto. Em

1Embora a explicao dada aqui no seja estritamente correta, ela prxima o suficiente da realidadepara o escopo deste curso.

http://www.Code::Blocks.org

Vers

o Prel

imina

r

2.2. A IDE CODE::BLOCKS 25

project title escreva algo como teste1; em folder to create the project in, clique nobotao com . . . e escolha uma pasta para salvar o projeto; esta pode ser, por exemplo,a pasta Meus Documentos ou uma pasta qualquer em um pen drive.2. Clique entoNext e, na tela seguinte, clique em Finish.

Pronto, seu projeto foi criado. Agora abra o arquivo main.cpp, que est na pastasources, dando um clique duplo no nome do arquivo. Observe que o Code::Blockscriou automaticamente um programa bsico.

Finalmente, clique em build e ento em build and run. Parabns, voc acaba deexecutar seu primeiro programa.

2.2.2 DepuraoTodo programa de tamanho considervel, e mesmo aqueles de tamanho diminuto, pos-suiro, ao menos em suas verses iniciais, erros. Por razes histricas, nos referimosa estes erros por bugs. Uma das formas de achar os bugs do seu programa fazer Referncia para o uso de

bugReferncia para o uso debug2O importante aqui salvar o arquivo em um lugar em que voc possa voltar mais tarde para reler.

Vers

o Prel

imina

r

26 CAPTULO 2. COMPILAO E EXECUO

com que o computador execute seu programa passo a passo, isto , linha a linha, eacompanhar esta execuo verificando se o programa faz o que voc espera.

Para experimentarmos a depurao, processo pelo qual removemos bugs, modifi-que a mensagem "Hello world!"do seu programa para "Ol !"e executenovamente o programa (build and run). Se o programa executou normalmente, vocest no caminho certo. Agora, copie toda a linha contendo a mensagem e cole-a v-rias vezes, substituindo o nome em cada linha. Seu programa deve ficar como noCdigo 2.1

#include 2

using namespace std;4

int main()6 {

cout

Vers

o Prel

imina

r

2.3. O ARQUIVO EXECUTVEL 27

2.3 O Arquivo ExecutvelAgora que voc j escreveu programas super interessantes, os compilou e executou,imagine como faria para enviar tais programas a um amigo que no tenha qualquerinteresse ou aptido em programao. A soluo simples: mandaremos a este amigoo arquivo executvel do programa. Para faz-lo, abra a pasta na qual salvou seu projetoCode::Blocks. Nesta pasta voc encontrar um arquivo com extenso .exe; este oarquivo executvel que deveria enviar para seu amigo. Quando seu amigo executar esteprograma, ver exatamente a mesma coisa que voc viu quando o fez. Alm de sermuito til, este procedimento tambm uma tima forma de se compartilhar vrus decomputador.

2.4 ExercciosExerccio 2.1 Escreva o programa completo que calcula a rea de vrios retngulosdo captulo anterior e execute-o.

Exerccio 2.2 Altere seu programa para usar, alm da funo de clculo de rea deum quadrado, as funes definidas nos exerccios do captulo anterior.

Vers

o Prel

imina

r

28 CAPTULO 2. COMPILAO E EXECUO

Vers

o Prel

imina

rCaptulo 3Variveis, Entrada / Sada eOperadores

A todo momento precisamos representar informao do mundo a nossa volta em nos-sos programas. Essas informaes, tais como nome, nmero de matrcula, nota final,temperatura, idade e outras tantas so armazenadas em entidades chamadas variveis.

Uma varivel nada mais do que um pedao de memria, no qual se pode ler ouescrever alguma informao. A estes pedaos de memria podemos dar nomes que nosajude a lembrar o que exatamente est escrito ali. Por exemplo, se uma varivel guardaa idade de algum, um bom nome seria idade, enquanto que rataplam ou var13provavelmente sero pssimas escolhas.

As alteraes em uma varivel resultam da interao com o usurio, isto , quandoo usurio informa valores para as mesmas em uma operao de leitura, ou da avaliaode expresses lgico-aritmticas (o tipo de clculo nos quais o computador especia-lizado).

Neste captulo veremos como criar nossas primeiras variveis e como alterar seusvalores por meio da leitura direta do teclado e da utilizao de operadores.

3.1 Declarao de VariveisNa linguagem C, toda varivel deve ser declarada (isto , criada) no incio do corpo dafuno que a contem. A declarao de uma varivel tem pelo menos duas partes:

Nome: usado para referenciar a varivel quando se precisa ler ou escrever a mesma;

Tipo: para que o computador saiba como tratar a informao, ele precisa saber de quetipo ela , ou seja, se um nmero, ou uma palavra, ou uma caractere, etc; e,

Algumas regras simples devem ser seguinda na hora de se nomear uma varivel:

o nome s pode conter os caracteres [a-z], [A-Z], [0-9] e o _; e,

o nome no pode comear com nmeros.

29

Vers

o Prel

imina

r

30 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

Quanto aos tipos usaremos, por enquanto, os seguintes:

int representando um nmero inteiro, como por exemplo 3, 4 e -78;

float: representando um nmero real, com casas decimais separadas por ponto, comopor exemplo 3.1416 e -1.2; e

char: representando um caractere (letra, dgito, sinal de pontuao) como por exemplo5, a, Z, ., e -.

So exemplos de declaraes de variveis vlidas:

1 int nota1, nota2;float media;

3 char _caractere;

So exemplos de declaraes invlidas:

1 int 1nota, 2nota;float #media;

3 char nome completo;

3.1.1 Atribuio e UsoComo j dito, uma varivel um pedao da memria do computador no qual se podeescrever e ler dados. Em vez de escrever, contudo, no mundo da computaousamos a expresso atribuir um valor a uma varivel para significar a mudana do valorda varivel. Esta operao executada pelo operador de atribuio =. Por exemplo,o seguinte cdigo declara trs variveis numricas, duas inteiras e uma real, e, emseguida, lhes atribui os valores 0, 10 e 10.0.

1 int inteiro1, inteiro2;float real;

3

inteiro1 = 0;5 inteiro2 = 10;real = 10.0;

A memria do computador sempre tem algum dado, tenha ele sido colocado porvoc ou no, seja ele relevante ou no. Logo, para se usar o contedo de uma varivel, necessrio ter certeza de que a mesma contm um valor que faa sentido. Isto ,algo que tenha sido atribudo pelo seu programa quela varivel, via uma operaode leitura, via uma computao qualquer, ou via uma atribuio como a do exemploanterior.

Denominamos a primeira atribuio de um valor a uma varivel de iniciao (ouinicializao). E j que qualquer varivel s deve ser usada se tiver sido iniciada, o

Vers

o Prel

imina

r

3.1. DECLARAO DE VARIVEIS 31

C(++) permite que as variveis sejam iniciadas j em sua declarao. Por exemplo,o cdigo abaixo faz exatamente o que fazia o exemplo anterior, mas de forma maiscompacta.

int inteiro1 = 0,2 inteiro2 = 10;float real = 10.0;

Observe que se pode iniciar vrias variveis do mesmo tipo, declaradas na mesmalinha, com valores distintos. Neste caso, note quebra de linha entre as declaraes deinteiro1 e inteiro2; ela somente esttica, mas ajuda a separar a declarao einiciao das vrias variveis.

Agora que voc viu como declarar e iniciar uma varivel vem a parte fcil: us-la.Veja como no seguinte exemplo.

1 #include

3 using namespace std;

5 float area_circulo(float raio){

7 float PI = 3.14,area;

9 area = PI * raio * raio;return area;

11 }

13 char proxima_letra(char c1){

15 char c2;c2 = c1 + 1;

17 return c2;}

19

int main() {21 int r1;

float r2;23 char _c;

_c = a;25 cout

Vers

o Prel

imina

r

32 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

do contedo da varivel PI por raio, ao quadrado. Na linha 10, o resultado da funo o contedo da varivel area.

3.1.2 Parmetros so VariveisNos exemplos de programas dos captulos anteriores, voc viu como o contedo de umaparmetro definido e usado. Por exemplo, os dois parmetros da funo area_retangulo,reproduzida abaixo, so declarados dizendo-se de que tipo eles so e quais so seus no-mes. Em seguida, no corpo da funo, os parmetros so usados no clculo da reasimplesmente multiplicando-se o nome de um pelo nome do outro; os valores dosparmetros so aqueles passados na chamada da funo.

float area_retangulo(float altura, float base)2 {

//Calcula e retorna a area do retangulo.4 return altura * base;}

6

int main()8 {

float area;10 area = area_retangulo(2.0, 2.0);

cout >.

A seguir temos um exemplo de entrada de dados:

Vers

o Prel

imina

r

3.2. ENTRADA / SADA 33

char letra;2 int idade;

4 cout > letra >> idade;cout

Vers

o Prel

imina

r

34 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

18 area = area_retangulo(b, a);cout

Vers

o Prel

imina

r

3.3. OPERADORES 35

O volume do cubo eh: 15.625O volume do cubo eh: ---------15.625O volume do cubo eh: ---------15.625--------------O volume do cubo eh: -----------------------15.625O volume do cubo eh: ---------15.625

O comando setfill permite definir o caractere que ser usado para preencher os es-paos restantes, de acordo com a largura definida com setw

Para formatao de nmeros reais (float e double), o exemplo a seguir mostraalguns comandos para formatao:

#include 2 #include

4 using namespace std;

6 float volume_cubo(float aresta){

8 return aresta*aresta*aresta;}

10

int main()12 {

float a, v;14 cout a;16 v = volume_cubo(a);

cout

Vers

o Prel

imina

r

36 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

Os operadores matemticos so os mais utilizados na maioria dos programas quesero desenvolvidos. Os principais operadores aritmticos so: +,, , / e o %, in-dicando, respectivamente, as operaes de soma, subtrao, multiplicao, diviso eresto da diviso.

Considere o exemplo a seguir:

#include2

using namespace std;4

int main()6 {

int n, dobro_de_n;8 cout > n;10 dobro_de_n = 2*n;

cout

Vers

o Prel

imina

rCaptulo 4Variveis (II)4.1 Escopo de VariveisNo captulo anterior estudamos como declarar e utilizar variveis em nossos progra-mas. Fizemos, por exemplo, um programa como o seguinte, que pede ao usurio queentre com as medidas da base e altura de um retngulo e ento imprime na tela docomputador a rea deste retngulo.

1 float area_retangulo(float altura, float base){

3 //Calcula e retorna a area do retangulo.return altura * base;

5 }

7 int main(){

9 float area,b,

11 a;cout a;

15 cout b;

17

area = area_retangulo(b, a);19 cout

Vers

o Prel

imina

r

38 CAPTULO 4. VARIVEIS (II)

Para descobrir as respostas a estas perguntas, faa o seguinte experimento:

digite o programa tal qual acima em seu computador e execute-o.

modifique somente a funo main do seu programa para que fique assim1 int main(){

3 float area,base,

5 altura;cout altura;

9 cout base;

11

area = area_retangulo(base, altura);13 cout

Vers

o Prel

imina

r

4.1. ESCOPO DE VARIVEIS 39

escopo presente possvel em C o escopo global. Uma varivel tem escopo globalse for definida fora de qualquer funo. Uma variel com escopo global poder seracessada de (quase) qualquer parte do seu cdigo. Para um exemplo de varivel deescopo global, veja o cdigo a seguir.

1 float PI = 3.1416;

3 float resposta = 0;

5 float area_retangulo(float altura, float base){

7 //Calcula e retorna a area do retangulo.resposta = base * altura;

9 return resposta;}

11

float area_circulo(float raio)13 {

//Calcula e retorna a area do circulo.15 resposta = PI * raio * raio;

return resposta;17 }

19 int main(){

21 float area,base,

23 altura,raio;

25

cout altura;

29 cout base;

31

area = area_retangulo(base, altura);33 cout

Vers

o Prel

imina

r

40 CAPTULO 4. VARIVEIS (II)

area_circulo.Observe tambm que a mesma varivel area foi utilizada mais de uma vez. Isto

comum em programao pois, com a quantidade limitada de recursos, pode no fazersentido criar uma varivel para cada novo uso. Observe que a varivel respostafoi alterada dentro das duas funes de clculo de rea e que estas mudanas foramvisveis funo main.

Verifique de forma experimental (copiando e executando) que o programa acimafunciona como esperado.

4.2 Faixas de ValoresVoc j aprendeu que variveis so espaos (clulas) da memria do computador parao qual damos nomes. Estes espaos, por serem limitados, podem armazenar uma quan-tidade limitada de valores. Pense, por exemplo, em quais os nmeros, positivos enegativos, se pode representar com trs dgitos: 99,98, . . . , 0, 1, 2, . . . , 998, 999.

Tentemos descobrir qual a faixa de valores que cabem em uma varivel int.Escreva um programa que declare uma varivel do tipo int, inicie esta varivel comum nmero (digamos, 10000), e imprima este nmero na tela do computador. Veja queo nmero impresso na tela como deveria: 10000.

Agora altere seu programa para que imprima 20000 e execute-o. Refaa este passo(adicionando 10000 a cada passo) at que a impresso fuja do que voc esperava. Nesteponto, trabalhe com incrementos menores at determinar qual o maior nmero que impresso como esperado. Fepita o processo para identificar qual o menor nmero quecabe em um int. Quais so estes valores?

Finalmente, tente identificar a faixa de valores que cabem em um float. Dica: osincrementos iniciais deveriam ser na faixa de milhes e no dezenas de milhares.

4.3 ExercciosColocarColocar

4.4 LaboratrioColocarColocar

Vers

o Prel

imina

rCaptulo 5Seleo SimplesNossos programas at agora foram extremamente simples, contendo apenas algumaspequenas funes alm da main. Isto acontece em parte por qu nossos programas soapenas sequncias diretas de comandos, sem execuo condicional. Isto , at agorano aprendemos a dizer para o computador Se for assim, ento faa assado! Seno,faa cozido!. Esta deficincia ser corrigida neste captulo.

Como exemplo de programao mais interessante, implementemos uma funo quecalcule as raizes de uma equao de segundo grau. Para faz-lo, relembremos a frmulade Bhaskara:

x = b

2a , sendo = b

2 4ac.Comecemos ento definindo uma funo para o clculo do .

1 float delta(float a, float b, float c){

3 return b*b - 4*a*c;}

Para testar o clculo do precisamos da funo main, juntamente com o restantedo esqueleto de programa aprendido at agora.

#include 2

using namespace std;4

float delta(float a, float b, float c)6 {

return b*b - 4*a*c;8 }

10 int main(){

12 float a, b, c;

14 cout

Vers

o Prel

imina

r

42 CAPTULO 5. SELEO SIMPLES

cout > b;

cout > c;

22 cout

Vers

o Prel

imina

r

5.1. OPERADORES RELACIONAIS 43

42 cin >> c;

44 cout

Vers

o Prel

imina

r

44 CAPTULO 5. SELEO SIMPLES

Melhorou, mas ainda no pode ser executado pelo computador. Vamos ento ao se.

5.2 if-elseEm C, testes simples (tudo o que voc realmente precisa) podem ser feitos com a es-trutura if, que tem uma das seguintes sintaxes:

if( expresso lgica ) bloco de comandos 1

if( expresso lgica ) bloco de comandos 1 else bloco de comandos 2

Uma expresso lgica uma expresso cuja avaliao resulte em verdadeiro oufalso como, por exemplo, as expresses que usam os operadores relacionais apenasapresentados.

Um bloco de comandos ou uma instruo ou um conjunto de instrues dentro de{ }.

Quando a expresso lgica avaliada, se seu resultado for verdadeiro, ento o blocode comandos 1 ser executado. Se o resultado for falso, o bloco de comandos 1 noser executado e o bloco 2, se existir, ser executado em seu lugar.

Observe que o segundo bloco pode ser, por sua vez, outro if. Por exemplo, nossoprograma pode ser reescrito assim:

#include 2

using namespace std;4

float delta(float a, float b, float c)6 {

return b*b - 4*a*c;8 }

10 int raizes(float a, float b, float c){

12 float d = delta(a,b,c);int qtd;

14

if(d < 0)16 {

qtd = 0;18 }

else if(d == 0)20 {

qtd = 1;22 }

else24 {

qtd = 2;26 }

Vers

o Prel

imina

r

5.2. IF-ELSE 45

28 return qtd;}

30

int main()32 {

float a, b, c;34

cout b;40 cout > c;42

44 cout

Vers

o Prel

imina

r

46 CAPTULO 5. SELEO SIMPLES

33 {float d = delta(a,b,c);

35 int qtd;

37 if(d < 0){

39 cout

Vers

o Prel

imina

r

5.3. FUNES E PROCEDIMENTOS 47

5.3 Funes e ProcedimentosA funo imprime_raizes, definida na seo anterior, tem por objetivo imprimirna tela as raizes da equao de segundo grau, se existirem. Esta funo no tem, pelanossa definio, o objetivo de calcular a quantidade de razes (que era o objetivo dafuno raizes). Em imprime_raizes no faz sentido, ento, a funo ter umresultado. Funes sem resultado so denominadas procedimentos e, em C, so decla-radas como qualquer outra funo, apenas com uma particularidade: o tipo do resultado void. Antes de vermos alguns exemplos, precisamos ver a sintaxe de funes em ge-ral, que estivemos usando nas sees e captulos anteriores mas no havamos definidoformalmente.

tipo_resultadoidentificador_funo(tipo_parmetro 1 identificador_do_parmetro 1, . . . ) bloco_de_comandos

tipo_resultado o tipo do valor que a funo est calculando.

identificador_funo o nome usado para invocar a funo.

tipo_parmetro 1 tipo do primeiro parmetro da funo.

identificador_parmetro 1 identificador do primeiro parmetro da funo.

. . . tipo e identificador dos demais parmetros.

bloco_de_comandos instrues que compem o corpo da funo.

Como mencionado, procedimentos so funes sem um resultado e, em C, sodeclarados como tendo resultado do tipo void. Em funes normais, o resultado dado pela instruo return; em procedimentos, que no tem resultado, returnno utilizado. Alm disso, o resultado de procedimentos no podem ser usados ematribuies.

Alm de funes sem resultado, C permite a definio de funes sem parmetros.Um exemplo deste tipo de funo seria uma que lesse algum dado do usurio.

1 int ler_idade(){

3 int id;cout

Vers

o Prel

imina

r

48 CAPTULO 5. SELEO SIMPLES

1. A funo main tem um resultado do tipo inteiro e seu resultado sempre 0(return 0; )2.

2. Funo main como um highlander: s pode haver uma! Isto , cada programas pode conter a definio de uma funo com este nome.

3. Finalmente, todas as funes devem ser declaradas antes da serem usadas, poisquando o computador tenta execut-la, j deve saber de sua existncia.

5.4 O Tipo Primitivo boolComo vimos neste captulo, o if avalia uma expresso lgica para decidir-se por exe-cutar ou no um bloco de comandos. Expresses lgicas, como tambm j visto, soaquelas que so avaliadas em verdadeiro ou falso. Na linguagem C(++), quaisquernmeros inteiros podem tambm ser avaliados como verdadeiro ou falso, seguindo aseguinte regra:

0 corresponde a falso.

qualquer outro nmero corresponde a verdadeiro.

Em C++, tambm possvel utilizar os valores true e false, que correspondem,respectivamente, a 1 e 0. Estes dois valores compem o conjuntos dos booleanos, oumelhor, o tipo primitivo bool. Isto , true e false esto para bool assim como -100,10, 12, . . . esto para int.

5.5 ExercciosExerccio 5.1 Muitas pessoas acreditam que um ano bissexto se for mltiplo de 4.Contudo, a regra um pouco mais complexa do que esta:

Um ano bissexto se for mltiplo de 4 mas no de 100, ou

se for mltiplo de 100, ento for mltiplo de 400.

Escreva um programa que leia um ano, chame uma funo para calcular se o ano bissexto e imprima sim ou no de acordo.

#include 2

using namespace std;4

bool bissexto(int ano)6 {

if(ano % 4 == 0)8 {

if(ano % 100 == 0)10 {

2Pelo menos nos programas simples que faremos.

Vers

o Prel

imina

r

5.5. EXERCCIOS 49

if (ano % 400 == 0)12 {

return true;14 }

else16 {

return false;18 }

}20 else

{22 return true;

}24 }

else26 {

return false;28 }

}30

int main()32 {

int ano;34

cout > ano;

38 cout

Vers

o Prel

imina

r

50 CAPTULO 5. SELEO SIMPLES

1. Uma funo celsius_fahrenheit que receba uma temperatura em grauscelsius e converta para fahrenheit.

2. Uma funo fahrenheit_celsius que receba uma temperatura em fahre-nheit e converta para graus celsius.

3. Funo main que leia uma temperatura do teclado, pergunte ao usurio se atemperatura em celsius ou fahrenheit, e imprima a temperatura convertidapara a outra medida.

Exerccio 5.4 Faa uma funo denominada ehPar que receba um nmero inteirocomo argumento e retorne verdadeiro se este nmero for par ou falso, caso contrrio.A funo main deve ler o nmero e imprimir o valor retornado pela funo auxiliar.

Exerccio 5.5 Elabore um programa com as seguinte descrio:

Uma funo que retorna verdadeiro se trs nmeros reais recebidos como argu-mentos formam um tringulo ou falso, caso contrrio.

Uma funo que recebe trs nmeros reais como argumento representado oslados de um tringulo e retorna 0 caso os nmeros formem um tringulo equi-ltero, 1 caso formem um tringulo issceles, ou 2 caso sejam os lados de umtringulo escaleno.

Por fim, a funo main deve ler os 3 nmeros que representam os lados, e casoformem um tringulo, imprimir se o tringulo formado equilatero, issceles ouescaleno.

5.6 LaboratrioRefaa no computador os exerccios propostos acima.

Vers

o Prel

imina

rCaptulo 6Seleo Simples (II)Uma vez apresentado a estrutura condicional if-else, veremos agora como realizar tes-tes mais complexos utilizando operadores lgicos.

6.1 if-else e Operadores LgicosAt o ponto atual fizemos apenas testes simples dentro da condio dos nossos if, porexemplo:

...2 /*

* esta funcao retorna verdadeiro se a pessoa de sexo4 * (1=Masculino, 2=Feminino) e idade passados como argumentos

* for maior que idade ou falso, caso contrario6 */bool ehMaior(int sexo, int idade)

8 {if(sexo == 1) // masculino

10 {if(idade >= 18)

12 {return true;

14 }else

16 {return false;

18 }}

20 else if(sexo == 2) // feminino{

22 if(idade >= 21){

24 return true;else

26 {return false;

28 }}

51

Vers

o Prel

imina

r

52 CAPTULO 6. SELEO SIMPLES (II)

30 else // sexo informado errado{

32 return false;}

34 }

Observe que na funo ehMaior temos if aninhados, ou seja, if dentro de if.Isto porque um pessoa deve ser do sexo masculino E possuir idade maior ou igual a 18anos para ser considerada maior de idade. OU ainda, ela pode ser do sexo feminino Epossuir idade igual ou maior a 21 anos.

Quando esta situao ocorre, as condies podem ser combinadas em um nico ifutilizando-se operadores lgicos. Os operadores lgicos que usaremos so o E, o OUe a NO (negao).

Na linguagem C, eles so representados pelos smbolos a seguir:

Tabela 6.1: Operadores lgicos e seus smbolos na linguagem C.Operador Lgico Smbolo Smbolo novo1

E && andOU || or

NO ! not

Os operadores lgicos podem ser resumidos nas tabelas a seguir:

Tabela 6.2: NO lgico.A !AV FF V

Tabela 6.3: E lgico.A B A && BV V VV F FF V FF F F

Voltando ao nosso exemplo, a funo anterior pode ser reescrita da seguinte forma:

...2 /*

* esta funcao retorna verdadeiro se a pessoa de sexo

Vers

o Prel

imina

r

6.2. PRIORIDADE DOS OPERADORES 53

Tabela 6.4: OU lgico.A B A || BV V VV F VF V VF F F

4 * (1=Masculino, 2=Feminino) e idade passados como argumentos

* for maior de idade ou falso, caso contrario6 */bool ehMaior(int sexo, int idade)

8 {if((sexo == 1 && idade >=18) || (sexo == 2 && not(idade < 21))

10 {return true;

12 }else // sexo errado ou idade errada

14 {return false;

16 }}

Perceba que em apenas um if colocamos a condio completa, ou seja, se sexoigual a 1 E idade maior ou igual a 18 OU sexo igual a 2 e idade NO menor do que 21ento maior de idade.

6.2 Prioridade dos OperadoresQuando mais de um operador lgico aparece em uma expresso, a precedncia pode serexpressa da seguinte maneira: primeiro o NO, depois o E, por ltimo o OU. Quandohouver parnteses, primeiro avalia-se o que estiver dentro dos mesmos.

Em diversas expresses e testes, diversos operadores dos vrios tipos podem apa-recer. A avaliao dessa expresso deve obedecer seguinte ordem de prioridade emrelao aos operadores:

1. Parnteses, incremento e decremento (++, --)

2. not (!)

3. Multiplicao, diviso e mdulo (o que aparecer primeiro);

4. Soma e subtrao;

5. Operadores relacionais (=)

6. Operadores relacionais (==, !=)

Vers

o Prel

imina

r

54 CAPTULO 6. SELEO SIMPLES (II)

7. and (&&)

8. or (||)

9. Atribuio (=, +=, -=, *=, /=, %=)

Embora os operadores lgicos faam sentido somente para operandos bool, im-portante relembrar que, para o computador, verdadeiro e falso so apenas formas deinterpretar nmeros na memria. Na linguagem C, qualquer nmero diferente de 0 tratado como true e 0 tratado como false. Sendo assim, possvel aplicar opera-dores lgicos tambm nmeros. Contudo, sempre que requisitado a representar ovalor true como nmero, o computador usar o valor 1, o que faz com que nem todasas computaes tenham resultados bvios. Por exemplo, o cdigo cout 5 - 2 || V

pow(2,4)!= 4 + 2 || 2 + 3 * 5/3%5 < 0

!1+1

!2+1

!0+1

Exerccio 6.2 Faa um programa que:

1. contenha uma funo que retorna verdadeiro se um nmero for divisvel por 3ou 5, mas no simultaneamente pelos dois, e;

2. na funo principal sejam lidos dois nmeros inteiros, que devero ser passadospara a funo criada, tendo seu resultado impresso.

Exerccio 6.3 Faa uma funo que receba 3 nmeros reais (float) correspondentesaos lados de um tringulo e retorne true caso esse tringulo seja retngulo ou falsecaso no o seja. A funo principal deve ler os valores dos lados do tringulo, veri-ficar se realmente formam um tringulo e imprimir "sim"se ou "no", caso no sejatringulo retngulo; se no formar um tringulo, imprimir "no forma".

Vers

o Prel

imina

r

6.4. LABORATRIO 55

6.4 LaboratrioLaboratrio 6.1 Escreva um programa que implemente uma calculadora com as qua-tro operaes +,-,* e /.

Sua calculadora deve ler um nmero real X, seguido de um inteiro representandoum dos operadores definidos (1 para -, 2 para +, 3 para * e 4 para /), seguido de outronmero real Y.

Finalmente, seu programa deve escrever o resultado da operao desejada.

Revisado at aquiRevisado at aqui

Vers

o Prel

imina

r

56 CAPTULO 6. SELEO SIMPLES (II)

Vers

o Prel

imina

rCaptulo 7SwitchEm diversas situaes em programao, necessrio testar se uma determinada vari-vel tem um dentre diversos possveis valores. Nesta situao, embora seja possvel usarvrios if, outra soluo nos dada em linguagem C: o uso de switch.

7.1 switch-case-defaultConsidere o problema de transformar o ms de uma representao numrica de umadata em sua representao textual. Isto , transformar, por exemplo, 25/12/2012 em25 de Dezembro de 2012. Uma possvel soluo para este problema, em C(++), oseguinte.

#include 2

using namespace std;4

int main()6 {

int dia, mes, ano;8

cout

Vers

o Prel

imina

r

58 CAPTULO 7. SWITCH

26 else if(mes == 4)cout

Vers

o Prel

imina

r

7.1. SWITCH-CASE-DEFAULT 59

bloco_comandosN: bloco de comandos a ser executado caso a varivel tenhavalor igual a valorN

default: um valor especial, que sempre casa com o valor da varivel

bloco_comandos_default: bloco de comandos a ser executado caso a varivelcase com default.

Usando switch-case-default, o exemplo acima pode ser reescrito assim.

#include 2

using namespace std;4

int main()6 {

int dia, mes, ano;8

cout

Vers

o Prel

imina

r

60 CAPTULO 7. SWITCH

Execute este cdigo e digite, por exemplo, a data 1/1/2012 para ver que ele fun-ciona quase corretamente. O problema, voc deve ter observado, que alm deimprimir o nome do ms correto, o programa imprime tambm o nome de todos os me-ses subsequentes e o valor default. Isso ocorre por que, na verdade, o switch comeaa executar o bloco correspondente ao case com o valor da varivel mas, a partir da,executa todos os blocos a no ser que seja instrudo a fazer diferente, o que feito viaa instruo break.

7.2 breakA instruo break diz ao computador que pare de executar o switch no ponto em que invocada.1 Sendo assim, podemos reescrever o programa mais uma vez para obterexatamente o comportamento da verso usando if.

#include 2

using namespace std;4

int main()6 {

int dia, mes, ano;8

cout

Vers

o Prel

imina

r

7.3. EXERCCIOS 61

break;40 case 7:

cout

Vers

o Prel

imina

r

62 CAPTULO 7. SWITCH

4 using namespace std;

6 int menu(){

8 int opcao;cout

Vers

o Prel

imina

r

7.4. LABORATRIO 63

60 {case 1:

62 cout

Vers

o Prel

imina

r

64 CAPTULO 7. SWITCH

Vers

o Prel

imina

rCaptulo 8Repetio (I)Em certas situaes necessria a repetio de um conjunto de comandos. Em situa-es como esta, temos duas opes: ou copiamos e colamos todo o trecho que deseja-mos repetir, fazendo os ajustes necessrios; ou utilizamos uma sada mais inteligentepor meio de comandos especiais que permitem automatizar a repetio. Neste captuloveremos o comando de repetio while e alguns exemplos de seu uso.

8.1 MotivaoSuponha de voc deseja fazer um programa para ler duas notas, calcular e imprimir amdia de dez alunos da disciplina. A maneira menos prtica de fazer isso seria:

...2 float nota1, nota2, media;cout nota1 >> nota2;media = (nota1 + nota2) / 2;

6 cout

Vers

o Prel

imina

r

66 CAPTULO 8. REPETIO (I)

26 cout

Vers

o Prel

imina

r

8.3. O COMANDO DO-WHILE 67

6 {cout

Vers

o Prel

imina

r

68 CAPTULO 8. REPETIO (I)

media = (nota1 + nota2) / 2;6 cout

Vers

o Prel

imina

r

8.4. MAIS EXEMPLOS 69

18 }}

20 i = i + 1;}

22 while (i < 10);...

Neste exemplo temos uma situao especial em que, no primeiro caso (i = 0), omaior valor o nico valor lido. A partir do segundo nmero, se o nmero lido formaior do que o valor armazenado na varivel maior, esta ser atualizada.

Em outro exemplo, imagine que queira ler nmeros at que leia um nmero maiorque 100. Neste caso, o seguinte programa resolveria nosso problema.

...2 int num;do

4 {cout > num;}

8 while (! num > 100);...

Neste exemplo utilizamos do-while pois necessrio ler pelo menos um nmero.Reescreva o cdigo utilizando while e veja como fica, necessariamente, mais com-plexo.

8.4.1 Operadores de incremento e outras construes especiais

Nos exemplos apresentados, a varivel contadora foi manipulada em todas as repeti-es de uma forma bem comum, sendo incrementada de 1 em 1 ou de 2 em 2. Repeti-es tem esta caracterstica, embora as operaes aplicadas aos contadores no sejamsempre simples incrementos e decrementos. Com a finalidade de agilizar o desenvol-vimento e simplificar algumas operaes aritmticas mais comuns, a linguagem C(++)permite algumas construes especiais envolvendo operadores. Considere o seguintetrecho de cdigo:

int a, b;2 ...a = a + b;

4 b = b * 2;a = a / 7;

Observe que nas trs atribuies (indicadas pelo sinal de igualdade), as variveisque so atualizadas tambm aparecem como primeiro elemento da operao aritmtica esquerda. Nestas situaes, podemos reescrever as atribuies assim:

Vers

o Prel

imina

r

70 CAPTULO 8. REPETIO (I)

1 int a, b;...

3 a += b;b *= 2;

5 a /= 7;

As operaes de incremento (aumento de uma unidade) e o decremento (diminui-o de uma unidade) de uma varivel so muito comuns em programao. Sendo assim,a linguagem C define dois operadores para as mesmas: ++ e --, respectivamente. Vejao exemplo.

1 int a = 0;a = a + 1;

3 cout

Vers

o Prel

imina

r

8.5. EXERCCIOS 71

8.5 ExercciosExerccio 8.1 Diga o que ser escrito na tela durante a execuo do seguinte trechode cdigo:

int a, b = 0, c = 0;2 a = ++b + ++c;cout

Vers

o Prel

imina

r

72 CAPTULO 8. REPETIO (I)

8.6 LaboratrioLaboratrio 8.1 Implemente os exerccios acima no Code::Blocks.

Laboratrio 8.2 Escreva uma funo que receba dois parmetros inteiros, x e y, x 4 ; )6 {

cout

Vers

o Prel

imina

r

9.5. EXERCCIOS 79

Outra forma de se alterar o fluxo via o comando continue, que faz com quea o restante do bloco de comandos seja ignorado e, conseqentemente, incremento econdio sejam reavaliados. Por exemplo, reescrevendo o cdigo acima para o usar ocontinue.

int menu()2 {

int opcao;4

for(;;)6 {

cout

Vers

o Prel

imina

r

80 CAPTULO 9. REPETIO (II)

Por exemplo, se sua funo for invocada com X igual 4 e Y igual 3, o resultado deveriaser o seguinte

12 11 109 8 76 5 43 2 1

Vers

o Prel

imina

rCaptulo 10Arranjos UnidimensionaisTente resolver o seguinte problema:

1. ler um conjunto de 6 nmeros inteiros

2. calcular sua mdia

3. imprimir todos os nmeros maiores que a mdia na tela do computador

Fcil, certo? Basta declarar 6 variveis do tipo int, ler seus valores, somar seus valorese dividir por 6, calculando a mdia. Finalmente, basta escolher aquelas variveis comnmeros maiores que a mdia e imprim-las.

Mas e se alterssemos o problema para que, em vez de 6, precisasse ler 10 nmeros,ou 100? Ainda assim se poderia usar o mesmo algoritmo, com 10 ou 100 variveis emvez de 6. Mas ter muitas variveis distintas com a mesma finalidade no vivel porduas razes:

difcil de manter: se voc precisar renomear uma varivel, ter que faz-lo emtodas as variveis;se precisar aumentar ou diminuir o nmero de variveis, ter que apagar/copiare renomear.

evita reuso de cdigo: se uma mesma operao precisa ser aplicada a cada vari-vel, o mesmo cdigo deve ser reescrito para cada varivel, dificultado o reuso decdigo.

A soluo para esta situao o uso de vetores (ou variveis indexadas, ou arranjo,ou array).

10.1 VetoresContinuando com nossa analogia da memria do computador como uma planilha ele-trnica, um vetor uma varivel que nomeia diversas clulas contguas da memria do

81

Vers

o Prel

imina

r

82 CAPTULO 10. ARRANJOS UNIDIMENSIONAIS

computador. Isto , de certa forma, enquanto uma varivel int corresponde a uma reada memria que cabe 1 inteiro, um vetor de 10 int uma varivel que cabe 10 inteiros.

A sintaxe para a declarao esttica de vetores bem simples (em captulos futurosveremos como declarar vetores dinmicos, isto , que podem variar seus tamanhos).

tipo identificador[tamanho];

Onde

tipo o tipo do dado a ser armazenado em cada posio do vetor;

identificador o nome do vetor;

tamanho a quantidade de clulas no vetor;

O acesso a uma clula, para leitura ou atribuio, feito usando-se o identificadorseguido pela posio a ser acessada, entre colchetes ([]). Por exemplo, x[3] = 0atribui o valor 0 posio de ndice 3 do vetor x. Algo importante a ser observadoaqui que a primeira posio de um vetor de tamanho n tem ndice 0 e a ltima temndice n 1.

O exemplo a seguir resolve o problema apresentado na seo anterior usando veto-res.

#include2

using namespace std;4

#define TAMANHO 106

int main()8 {

int num[TAMANHO];10 int soma = 0;

int media;12

for(int i = 0; i < TAMANHO; i++)14 {

cout

Vers

o Prel

imina

r

10.1. VETORES 83

Observe a definio e o uso da palavra TAMANHO no programa. Uma vez definidoque TAMANHO tem o valor 10, o computador substituir toda ocorrncia desta palavra noprograma pelo valor correspondente, antes da compilao.

Uma variao interessante do problema calcula a mdia apenas de nmeros positi-vos e a entrada de um nmero negativo serve para finalizar o fim da entrada. O cdigoseguinte resolve o problema.

#include2

using namespace std;4

#define TAMANHO 1006

int main()8 {

int num[TAMANHO];10 int soma = 0;

int media;12 int contador = 0;

14 for(int i = 0; i < TAMANHO; i++){

16 cout = 0)20 {

soma += num[i];22 contador++;

}24 else

{26 break;

}28 }

30 media = soma/contador;

32 cout

Vers

o Prel

imina

r

84 CAPTULO 10. ARRANJOS UNIDIMENSIONAIS

10.2 ExercciosExerccio 10.1 Escreva um programa que leia 10 nmeros e imprima o menor e omaior entre eles (no necessrio usar vetores aqui).

Exerccio 10.2 Escreva um programa que leia 10 nmeros e calcule e imprima a m-dia e desvio padro dos mesmos. Lembre-se que o desvio padro definido como araiz quadrada dos quadrados das diferenas dos valores para a mdia dos valores.

Exerccio 10.3 Escreva um programa que leia 11 nmeros reais e imprima os valoresdos 10 primeiros multiplicados pelo 11-simo. Por exemplo, se os valores digitadosforam 1, 2, 3 ,4 ,5 ,6, 7, 8, 9, 10 e 1.1, ento seu programa deve imprimir 1.1, 2.2, 3.3,4.4, 5.5, 6.6, 7.7, 8.8, 9.9 e 11.0.

10.3 LaboratrioLaboratrio 10.1 Escreva um programa que leia um nmero inteiro n e ento leia nnmeros reais. Em seguida, seu programa deve imprimir a mdia e desvio padro dosnmeros lidos. Seu programa deve ignorar nmeros negativos.

Laboratrio 10.2 Escreva um programa que leia n nmeros reais e imprima seus va-lores na tela. Em seguida, leia mais um nmero real x e imprima o valor dos n nmerosmultiplicados x.

Laboratrio 10.3 Escreva um programa que leia n booleanos e imprima seus valoresna tela. Em seguida, imprima todos os booleanos invertidos, na linha seguinte.

Vers

o Prel

imina

rCaptulo 11Caracteres, Vetores deCaracteres e Strings

11.1 Representao de caracteres

Alm dos tipos de dados numricos com os quais temos trabalhado at agora, outrotipo de dado muito importante no desenvolvimento de programas de computador, otipo caractere. Estes tipos so a base para representao de informao textual como,por exemplo, a frase "eu amo programar em C"?

Variveis com caracteres, em C(++), so declarados com sendo do tipo char, e sualeitura e escrita ocorre como para qualquer outro tipo de dados. Por exemplo,

#include2

using namespace std;4

int main()6 {

char letra;8

cout > letra;

cout

Vers

o Prel

imina

r

86 CAPTULO 11. CARACTERES, VETORES DE CARACTERES E STRINGS

11.2 Vetores de CaracteresVetores podem conter dados de quaisquer tipos. Isto , voc pode declarar vetoresde nmeros reais ou inteiros, booleanos, e at tipos definidos por voc, uma vez queaprenda como definir novos tipos. Um outro tipo interessante o caractere, ou sim-plesmente char. Por exemplo, vamos definir um programa que leia um vetor de 10caracteres e depois os escreva de volta tela.

#include2

using namespace std;4

#define TAMANHO 106

int main()8 {

char nome[TAMANHO];10

cout

Vers

o Prel

imina

r

11.2. VETORES DE CARACTERES 87

14 do{

16 cin >> nome[i];i++;

18 }while( i < TAMANHO && nome[i-1] != .);

20 cout

Vers

o Prel

imina

r

88 CAPTULO 11. CARACTERES, VETORES DE CARACTERES E STRINGS

Figura 11.1: Tabela ASCII

11.3 ExercciosExerccio 11.1 Escreva um programa que leia 10 caracteres e os imprima na ordeminversa quela em que foram digitados.

Exerccio 11.2 Escreva um programa que leia 10 caracteres e os imprima na ordeminversa quela em que foram digitados, trocando maisculas por minsculas e vice-

Vers

o Prel

imina

r

11.4. LABORATRIO 89

versa.

Exerccio 11.3 Escreva seu nome na codificao ASCII.

11.4 LaboratrioLaboratrio 11.1 Escreva um programa que leia 100 caracteres ou at que # sejadigitado e os imprima na ordem inversa quela em que foram digitados.

Laboratrio 11.2 Escreva um programa que leia e imprima strings at que o usuriodigite a palavra fim. Considere que cada string no possui espaos.

Laboratrio 11.3 Escreva um programa que leia e imprima strings at que o usuriodigite a palavra fim. As strings podem conter espaos.

Laboratrio 11.4 Acompanhe as atividades a seguir:Execute o seguinte programa e observe o que ser impresso. Atente para as atri-

buies!

#include2

using namespace std;4

int main()6 {

int a;8 char c;

for(a = 65; a < 91; a++)10 {

c = a;12 cout

Vers

o Prel

imina

r

90 CAPTULO 11. CARACTERES, VETORES DE CARACTERES E STRINGS

11.5 Vetores de Caracteres como StringsUm vetor de caracteres essencialmente uma palavra ou uma frase. Assim, durante aleitura de um vetor de caracteres dificilmente sabe-se quantos caracteres sero digitadospelo usurio, por exemplo, quando deseja-se ler o nome de um indivduo. Por estemotivo, a maioria das linguagem de programao fornece mtodos especiais de leitura,impresso e manipulao desses vetores de caracteres, ou como chamaremos agora,strings.

Na linguagem C++, os comandos cout e cin permitem imprimir e ler strings demaneira direta:

#include2

using namespace std;4

#define TAMANHO 1006

int main()8 {

char nome[TAMANHO];10

cout

Vers

o Prel

imina

r

11.6. LABORATRIO 91

16 return 0;}

Por ltimo, importante entender que para marcar no vetor de caracteres at ondefoi feita a leitura a linguagem C adiciona o caractere especial \0 aps o ltimo ca-ractere digitado pelo usurio. Desta forma, quando se deseja percorrer uma string,diferentemente de um vetor nmero, define-se como condio de parada a posio emque se encontra o \0 e no o fim do vetor.

11.6 LaboratrioLaboratrio 11.8 Faa um programa que leia uma string e calcule e imprima o ta-manho desta string em uma funo auxiliar.

Laboratrio 11.9 Faa um programa que leia uma string e verifique se a string lida uma palndrome. A verificao deve ser feita em uma funo auxiliar, que deveretornar true em caso afirmativo ou false caso contrrio.

Laboratrio 11.10 Faa um programa que leia uma string e a imprima de trs parafrente, trocando as vogais pelo caractere *.

Laboratrio 11.11 Faa um programa que leia duas strings e concatene a segundana primeira, separadas por um espao em branco. A concatenao deve ser feita emuma funo auxiliar.

11.7 Funes para manipulao StringsQuando trabalhamos com strings muito comum a realizao de algumas tarefas comodescobrir o tamanho da palavra digitada pelo usurio, comparar duas palavras parasaber a ordem, ou ainda, concatenar duas palavras em uma nica.

Para isso, a biblioteca string.h fornece algumas funes prontas, como podeser visto na tabela 11.1

Funo Descriostrlen retorna o tamanho (em caracteres) da palavra passada como argumento.strcpy copia o contedo da segunda string para a primeira.strcat concatena o texto da segunda string na primeira.strcmp compara duas strings (vide exemplo a seguir).stricmp compara duas strings sem diferenciar maisculas e minsculas.atoi converte uma string para o inteiro correspondente.atof converte uma string para o nmero real correspondente.

Tabela 11.1: Algumas funes para trabalhar com strings.

O exemplo a seguir mostra a utilizao destas funes:

Vers

o Prel

imina

r

92 CAPTULO 11. CARACTERES, VETORES DE CARACTERES E STRINGS

#include2 #include

4 using namespace std;

6 int main(){

8 char str1[50], str2[50];int i;

10 float f;

12 cout > str1;

14 cout > str2;

16 strcat(str1, ); //junto espaco com str1strcat(str1, str2);

18 cout

Vers

o Prel

imina

r

11.8. FUNES COM VETORES COMO PARMETROS 93

A declarao de parmetros segue uma sintaxe parecida, no qual o tamanho dovetor no aparece

tipo identificador[]

Isto ocorre por que, para que a funo seja genrica e opere em qualquer vetor passado,o parmetro no pode ser especificado em cdigo. Assim, a declarao de uma funoque recebe um vetor como parmetro segue a seguinte receita:

tipo identificadorDaFuncao(tipo identificador1[], int tamanho1, ...){

Corpo da Funcao}

Por exemplo, veja como definir uma funo que transforme todos os caracteres deuma string para letras mausculas.

#include2 #include

4 using namespace std;

6 void maiusculas(char str[], int tam){

8 for(int i = 0; i < tam && i < strlen(str); i++)if(str[i] >= a && str[i] str;18

maiusculas(str, 50)20

cout

Vers

o Prel

imina

r

94 CAPTULO 11. CARACTERES, VETORES DE CARACTERES E STRINGS

5 int maior(int v[], int tam){

7 int maior = -1;for(int i = 0; i < tam ; i++)

9 if(v[i] > maior)maior = v[i];

11

return maior;13 }

11.9 LaboratrioLaboratrio 11.12 Faa um programa que dado uma string, retorne 1 se ela for pa-lndromo e 0 se ela no for palndromo. Lembrando que um palndromo uma palavraque tenha a propriedade de poder ser lida tanto da direita para a esquerda como daesquerda para a direita. Deve-se obrigatoriamente utilizar uma string auxiliar e afuno strcmp para fazer a resoluo.

Ex: SUBI NO ONIBUSARARAANOTARAM A DATA DA MARATONA

Laboratrio 11.13 Faa um programa que troque todas as ocorrncias de uma letraL1 pela letra L2 em uma string. A string e as letras L1 e L2 devem ser fornecidas pelousurio.

Laboratrio 11.14 Faa um programa que leia 3 strings e as imprima em ordem al-fabtica.

Laboratrio 11.15 Faa um programa com uma funo que receba um vetor de intei-ros e um inteiro X, e que retorne como resultado o maior inteiro do vetor que menorque o inteiro X.

Laboratrio 11.16 Usando a resposta do problema anterior, faa um programa comuma funo que receba dois vetores de inteiros, e que faa com que o segundo torne-seuma cpia do primeiro, ordenado de forma decrescente.

Vers

o Prel

imina

rCaptulo 12Bits, bytes e bases numricasAt agora temos trabalhado essencialmente com os tipos numricos, inteiros e reais,e booleanos. Para que possamos usar outros tipos, essencial que antes entendamoscomo os dados so representados na memria do computador.

12.1 Bit & ByteComo dito anteriormente, a memria do computador pode ser entendida como umagrande planilha eletrnica, podendo cada clula ser endereada (atribuda, lida, nome-ada) individualmente. Na memria do computador no existem nmeros ou caracteres,mas vrias lampdas que podem estar ligadas ou desligadas. Ns humanos atribu-mos significado a tais estados como sendo 0s e 1s. Cada posio da memria, quepode armazenar 0 ou 1, denominado um bit. Por serem mnimos, normalmente tra-balhamos com conjuntos de 8 bits por vez, o que denominamos bytes.

12.1.1 Base BinriaOs bits de um byte podem assumir todas as combinaes de ligado e desligado (0 e1). Dado um contexto, cada combinao corresponde a um certo valor. Por exemplo,se estiver usando um byte para representar nmeros inteiros, ento provavelmente acorrespondncia na Tabela 12.1 se aplica.

Talvez isso seja novidade para voc, mas voc representa nmeros na base decimalusando 10 dgitos (de 0 a 9). Contudo, outras bases existem. Como os bits s possuemdois estados, natural na computao usar a base binria, que usa 2 dgitos (0 e 1). Osvalores esquerda na tabela podem ser entendidos como nmeros nesta base.1

Para conseguir converter nmeros de uma base para a outra, basta entender o queexatamente significa a representao de um nmero em uma base genrica X. Nestabase, ABCDX significa AX3 +B X2 +C X1 +D X0. O nmero 123410, porexemplo, significa 1X3+2X2+3X1+4X0 = 11000+2100+310+41 que

1sempre que no for colocada a base, considera-se a base 10, mais natural aos seres de vida baseada emcarbono do nosso planeta, A.K.A., voc.

95

Vers

o Prel

imina

r

96 CAPTULO 12. BITS, BYTES E BASES NUMRICAS

Tabela 12.1: Exemplos de valores em binrio e decimal correspondente.bits Nmero

00000000 000000001 100000010 200000011 300000100 400000101 500000110 600000111 700001000 800001001 900001010 10

. . .11111101 25311111110 25411111111 25500000000 0

. . .

igual a, t d, 123410. Para um exemplo mais interessante, o nmero 101010102 =127+026+125+024+123+022+121+020 = 128+0+32+8+2 = 170.

Observe que, pela tabela, o maior nmero que se pode representar com 8 bits 111111112 = 25510. Via de regra, com X bits pode se representar 2X na base binria,de 0 a 2X 1.

12.1.2 Base Hexadecimal

Embora se possa usar qualquer base numrica, as que fazem mais sentido no mundocomputacional so as binria e hexadecimal. A base hexadecimal usa 16 dgitos emcada posio representando valores de 0 a 15. Para isto, usa os valores de 0 a 9 iguaisaos da base decimal e tambm as letras de A a F representado os valores de 10 a 15.Por exemplo, o nmero 1A2F16 equivale a 1 163 + 10 162 + 2 161 + 15 160 =4096 + 2560 + 32 + 15 = 6703.

12.2 Converso entre bases numricas

Enquanto ns trabalhamos com base decimal, o computador armazena informao erealiza operaes na base binria. Por isso, a todo momento ocorre a converso entreum decimal que informamos como entrada em um programa, por exemplo, para a basebinria (para efetuar o clculo), bem como da base binria (resultado do clculo) paraa base decimal exibida na tela.

Vers

o Prel

imina

r

12.3. TIPOS NUMRICOS INTEIROS 97

Converso de Binrio para DecimalA converso de binrio (e qualquer outra base) para decimal pode ser feita facilmenteusando a notao da base genrica apresentada acima. Isto , para realizar a conversobasta multiplicar o valor de cada posio pelo seu peso (base elevada posio). Porexemplo, o nmero 11110112 equivale a 1 26 + 1 25 + 1 24 + 1 23 + 0 22 +1 21 + 1 20 = 64 + 32 + 16 + 8 + 0 + 2 + 1 = 12310.

Converso de Decimal para BinrioA converso de decimal para binrio feita realizando-se divises sucessivas pela basede interesse (2, no nosso caso) at que o resultado seja zero. Os restos das divises, naordem inversa, correspondem ao nmero convertido.

Por exemplo, considere a converso do nmero 169 para a base binria. O processode converso o seguinte:169/2 = 84, Resto = 184/2 = 42, Resto = 042/2 = 21, Resto = 021/2 = 10, Resto = 110/2 = 5, Resto = 05/2 = 2, Resto = 12/2 = 1, Resto = 01/2 = 0, Resto = 1O nmero binrio equivalente , portanto, 101010012.

Converso entre Binrio e HexadecimalSabendo-se que com 4 bits possvel representar at 16 nmeros (de 0 a 15) e que abase hexadecimal tem exatamente 16 dgitos, conclumos que possvel representarcada dgito hexadecimal com 4 dgitos binrios. Sendo assim, a converso binrio/he-xadecimal pode ser feita facilmente substituindo conjuntos de 4 bits binrios por umdgito hexadecimal e vice-versa.

Por exemplo, para convertermos 111010102 convertemos 11102 para E16 e 10102para A16, obtendo o nmero EA16. Na direo inversa, para convertermos o nmero7B16 para binrio convertemos 716 para 01112 e B16 para 10112, obtendo o nmero011110112.

12.3 Tipos Numricos InteirosNa linguagem C, os principais tipos, a quantidade de bits utilizada para sua represen-tao e o intervalo de valores aceitos so resumidos na tabela a seguir: 2

Observe que o tipo caractere tambm armazenado internamente como um nmerointeiro de 8 bits. Com 8 bits podemos representar 28 nmeros. Se considerarmosnmeros sem sinal (unsigned) teremos de 0 a 255; se considerarmos nmeros com

2A quantidade de bits pode variar de acordo com o compilador e a arquitetura do sistema

Vers

o Prel

imina

r

98 CAPTULO 12. BITS, BYTES E BASES NUMRICAS

Tabela 12.2: Exemplos de valores em binrio, decimal e hexadecimal correspondentes.Binrio Decimal Hexadecimal

00000000 0 000000001 1 100000010 2 200000011 3 300000100 4 400000101 5 500000110 6 600000111 7 700001000 8 800001001 9 900001010 10 A00001011 11 B00001100 12 C00001101 13 D00001110 14 E00001111 15 F00010000 16 10

. . .11111101 253 FD11111110 254 FE11111111 255 FF00000000 0 0

. . .

Vers

o Prel

imina

r

12.3. TIPOS NUMRICOS INTEIROS 99

Tabela 12.3: Intervalo de representao dos tipos numricos inteiros.Tipo Quantidade de Bits Intervalochar 8 -128 a 127unsigned char 8 0 a 255int 16 -32.768 a 32.767unsigned int 16 0 a 65.535long 32 -2.147.483.648 a 2.147.483.647unsignet long 32 0 a 4.294.967.295

sinal, teremos metade para positivos e metade para negativos, ou seja, de -128 a 127.O mesmo raciocnio se aplica para os outros tipos de dados da tabela.

A partir desta tabela podemos observar a importncia da escolha adequada do tipocorreto de acordo com sua aplicao. Se utilizarmos um inteiro para somarmos 20.000e 50.000, por exemplo, o resultado ser inesperado, uma vez que o maior valor que uminteiro aceita 32.767. Quando isto ocorre, dizemos que houve um overflow.

12.3.1 Nmeros Binrios NegativosOs exemplos que vimos at agora de converso no contemplam nmeros negativos.Na base decimal, o sinal de menos (-) antes do valor do nmero tem a finalidade derepresentar nmeros negativos.

Como a memria do computador armazena apenas 0s e 1s, uma possvel estratgia desperdiar um dos bits do nmero para o sinal. Adota-se, por padro, o zero pararepresentar um nmero positivo e o um para negativo. O bit do sinal armazenado naposio mais esquerda.

Para representar o valor de um nmero negativo h duas principais abordagens:sinal-magnitude e complemento de 2.

Na representao sinal-magnitude, o nmero negativo tem seu valor absoluto (mag-nitude) representado da mesma forma que um nmero positivo e o bit mais significa-tivo, que representa o sinal, ser igual a um. A tabela a seguir mostra alguns exemplosde nmeros na base decimal e na representao sinal-magnitude.

Tabela 12.4: Exemplos de valores na representao sinal-magnitude.Decimal Binrio Sinal-Magnitude

+20 00010100-20 10010100

+115 01110011-115 11110011

Com 8 bits, temos, ento nmeros de 111111112 a 011111112 (-127 a +127). Umproblema que aparece com esta representao o zero. Qual a representao correta,00000000 ou 10000000? E por que precisaramos de duas representaes?

A representao complemento de 2 utiliza uma maneira um pouco diferente derepresentar nmeros negativos. Para express-los devemos inverter cada bit do nmero

Vers

o Prel

imina

r

100 CAPTULO 12. BITS, BYTES E BASES NUMRICAS

positivo e somar 1 ao resultado. Por exemplo, o nmero -15 representado em com-plemento de 2 com 5 bits como 10001, ou seja, calcula-se o valor de +15 = 011112, e,em seguida invertemos e somamos 1: 100002 + 12 = 100012. Se a representao usar8 bits, ento 1510 = 000011112 e 1510 = 111100012.

12.4 Aritmtica Inteira BinriaAritmtica binria to simples como 1 + 1 = 10. Srio, assim que se faz: 0 + 0 =0, 0 + 1 = 1 + 0 = 1, 1 + 1 = 102. Logo, em sistemas computacionais as somas esubtraes geralmente so realizadas aos pares, da mesma forma que na base binria.

12.4.1 Nmeros positivosA adio de nmeros positivos muito simples. Para faz-la, basta somar os valores namesma posio, do menos significativo para o mais significativo. O vai-um funcionada mesma forma como fazemos na base decimal. Por exemplo, para somarmos 5 e 9,fazemos:

10101 +1001----1110

Como a quantidade de bits para determinado tipo de dados limitado, durante umasoma pode ocorrer de o resultado ultrapassar o maior valor permitido para aquela quan-tidade de bits, quando isto ocorre, temos um overflow (derramamento). Considere asoma de 7 e 9, ambos com 4 bits.

1 1110111 +1001----

1 0000

Vers

o Prel

imina

r

12.5. TIPOS NUMRICOS REAIS 101

(+5) 0101----

1 0011

Vers

o Prel

imina

r

102 CAPTULO 12. BITS, BYTES E BASES NUMRICAS

Antes que voc saia dizendo por a que o ideal usar tais nmeros pois podemosrepresentar nmeros to grandes como 111111112 = 15 1015, que muito mais queos 216 1 da notao binria convencional, pense em como representaria o nmero16110, j que a maior mantissa representvel 1,5. Alm disso, como representar1,1111, j que s dispomos de 4 dgitos na mantissa?

Alm disso, se representaes de nmeros reais pecam em sua preciso, tambmpecam na velocidade de processamento. A aritmtica de nmeros binrios muitomais simples que a de nmeros reais (ou de ponto flutuante, como costumamos dizerna computao). Para manipular nmeros reais, computadores normalmente precisamde componentes dedicados a este fim e que tem alto tempo de execuo.

Para saber mais sobre representaes de nmeros em pontos flutuantes visite a URLhttp://en.wikipedia.org/wiki/Floating_point

12.6 Exerccios e laboratrio

12.6.1

Quantos nmeros se pode representar, na base binria, com 1, 8, 16, 32 e 64 bits?

12.6.2

Escreva os seguintes nmeros nas bases binria e hexadecimal:

1. 16

2. 45

3. 129

4.