C para não Computeiros: uma introdução ao raciocínio...

145
Versão Preliminar C para não Computeiros: uma introdução ao raciocínio computacional Lásaro Camargos Paulo R. Coelho 12 de março de 2013

Transcript of C para não Computeiros: uma introdução ao raciocínio...

Vers

o Prel

imina

rC para no Computeiros: uma introduo ao

raciocnio computacional

Lsaro Camargos Paulo R. Coelho

12 de maro de 2013

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 . . . . . . . . . . . . . . . . . . . . . . 131.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 A Funo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.5 Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2 Compilao e Execuo 192.1 O processo de compilao . . . . . . . . . . . . . . . . . . . . . . . 192.2 A IDE Code::Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . 20

2.2.1 Criando um Projeto . . . . . . . . . . . . . . . . . . . . . . . 202.2.2 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.3 O Arquivo Executvel . . . . . . . . . . . . . . . . . . . . . . . . . . 222.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

3 Variveis, Entrada / Sada e Operadores 253.1 Declarao de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.1.1 Atribuio e Uso . . . . . . . . . . . . . . . . . . . . . . . . 263.1.2 Parmetros so Variveis . . . . . . . . . . . . . . . . . . . . 28

3.2 Entrada / Sada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.2.1 Impresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.2.2 Leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.3 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.1 Construes Especiais . . . . . . . . . . . . . . . . . . . . . 30

3

Vers

o Prel

imina

r

4 SUMRIO

3.3.2 Precedncia de Operadores . . . . . . . . . . . . . . . . . . . 313.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.4.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4 Variveis (II) 334.1 Escopo de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . 334.2 Faixas de Valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

5 Seleo Simples 375.1 Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . . . 395.2 if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.3 Funes e Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . 435.4 O Tipo Primitivo bool . . . . . . . . . . . . . . . . . . . . . . . . . 445.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

5.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.5.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.5.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

5.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

6 Seleo Simples (II) 476.1 if-else e Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . 476.2 Prioridade dos Operadores . . . . . . . . . . . . . . . . . . . . . . . 496.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

6.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

7 Switch 537.1 switch-case-default . . . . . . . . . . . . . . . . . . . . . . . . . 537.2 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

7.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

7.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

8 Repetio (I) 618.1 Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618.2 O comando while . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628.3 O comando do-while . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Vers

o Prel

imina

r

SUMRIO 5

8.4 Mais exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

8.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668.5.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

8.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.6.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.6.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.6.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678.6.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688.6.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

9 Repetio (II) 699.1 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.2 Mais Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719.3 Declaraes especiais . . . . . . . . . . . . . . . . . . . . . . . . . . 719.4 Alterando a repetio com o break e continue . . . . . . . . . . . . 729.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

9.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

10 Tipos de Dados e Suas Representaes 7510.1 Bit & Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

10.1.1 Base Binria . . . . . . . . . . . . . . . . . . . . . . . . . . 7510.1.2 Base Hexadecimal . . . . . . . . . . . . . . . . . . . . . . . 76

10.2 Converso entre bases numricas . . . . . . . . . . . . . . . . . . . . 7610.3 Tipos Numricos Inteiros . . . . . . . . . . . . . . . . . . . . . . . . 77

10.3.1 Nmeros Binrios Negativos . . . . . . . . . . . . . . . . . . 7710.4 Aritmtica Inteira Binria . . . . . . . . . . . . . . . . . . . . . . . . 79

10.4.1 Nmeros positivos . . . . . . . . . . . . . . . . . . . . . . . 8010.4.2 Nmeros em Complemento de 2 . . . . . . . . . . . . . . . . 8010.4.3 E a subtrao? . . . . . . . . . . . . . . . . . . . . . . . . . 81

10.5 Tipos Numricos Reais . . . . . . . . . . . . . . . . . . . . . . . . . 8110.6 Representao de caracteres . . . . . . . . . . . . . . . . . . . . . . 8110.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

10.7.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8210.7.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8210.7.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8210.7.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8310.7.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8410.7.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

10.8 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Vers

o Prel

imina

r

6 SUMRIO

10.8.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8410.8.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8410.8.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8510.8.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

11 Arranjos Unidimensionais 8711.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8711.2 Vetores de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . 88

11.2.1 Vetores de Caracteres como Strings . . . . . . . . . . . . . . 9011.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9111.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

12 Strings e Funes 9312.1 Funes para manipulao Strings . . . . . . . . . . . . . . . . . . . 9312.2 Funes com vetores como parmetros . . . . . . . . . . . . . . . . . 9412.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

12.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9612.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9612.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9612.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9612.3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9612.3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9612.3.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

13 Funes teis I 9713.1 Funes Matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . 9713.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

13.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9913.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

14 Arranjos Multidimensionais (I) 10114.1 Declarao e Iniciao . . . . . . . . . . . . . . . . . . . . . . . . . 101

14.1.1 Acesso aos elementos . . . . . . . . . . . . . . . . . . . . . 10214.2 Matrizes de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . 10214.3 Mais Dimenses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10314.4 Multiplicao de Matrizes . . . . . . . . . . . . . . . . . . . . . . . 10314.5 Exercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

14.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10414.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10414.5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

15 Arranjos Multidimensionais (II) 10715.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10715.2 Passagem de matriz como parmetro em funes . . . . . . . . . . . 10715.3 Matrizes Bidimensionais Como Unidimensionais e Vice-Versa . . . . 10815.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Vers

o Prel

imina

r

SUMRIO 7

15.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11015.4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

16 Ordenao de Arranjos 11116.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11116.2 Algoritmos de Ordenao . . . . . . . . . . . . . . . . . . . . . . . . 111

16.2.1 Algoritmo de Insero (Insertion Sort) . . . . . . . . . . . . . 11116.2.2 Algoritmo de Seleo (Selection Sort) . . . . . . . . . . . . . 11216.2.3 Algoritmo de Ordenao por Troca (Bubble Sort) . . . . . . . 113

16.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11416.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11416.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11416.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

II Intermedirio 115

17 Estruturas No-Homogneas 11717.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11717.2 Declarao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

17.2.1 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11817.3 Acesso aos Campos de Uma Estrutura . . . . . . . . . . . . . . . . . 11917.4 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11917.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

17.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12017.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

17.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

18 Referncias 12118.1 A memria um grande vetor . . . . . . . . . . . . . . . . . . . . . 12118.2 Variveis do Tipo Referncia . . . . . . . . . . . . . . . . . . . . . . 12118.3 Passagem de Referncias como Parmetros . . . . . . . . . . . . . . 12318.4 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

18.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12418.4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

19 Referncias II 12519.1 Ponteiros para Structs . . . . . . . . . . . . . . . . . . . . . . . . . . 12519.2 Arranjos e Ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . 126

19.2.1 Percorrendo vetores com ponteiros . . . . . . . . . . . . . . . 12719.3 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

19.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12819.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

Vers

o Prel

imina

r

8 SUMRIO

20 Alocao Dinmica 13120.1 Alocao Dinmica de Tipos Simples . . . . . . . . . . . . . . . . . 13120.2 Alocao Dinmica de Vetores . . . . . . . . . . . . . . . . . . . . . 13220.3 Liberao de memria . . . . . . . . . . . . . . . . . . . . . . . . . 13320.4 Alocao Dinmica de Estruturas . . . . . . . . . . . . . . . . . . . . 13320.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

20.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13420.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

20.6 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13420.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13420.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

21 Arquivos 13521.1 Arquivos de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

21.1.1 Abertura e Fechamendo de Arquivos . . . . . . . . . . . . . . 13521.1.2 Criao de Arquivos . . . . . . . . . . . . . . . . . . . . . . 13721.1.3 Cuidados com a Formatao dos Dados . . . . . . . . . . . . 138

21.2 Laboratrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13921.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13921.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

22 Navegao dentro do arquivo 14122.1 Posicionmento no arquivo . . . . . . . . . . . . . . . . . . . . . . . 14122.2 Arquivos formatados . . . . . . . . . . . . . . . . . . . . . . . . . . 142

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, pois na automatizao de tarefas por um computador, necessrio quebr-las em unidades mnimas, que sejam compreensveis pela mquina.Acontece que esta habilidade tambm til profissionais das mais diversas reas. Aesta 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 se beneficiar deste material como uma introduo aosestudos mais aprofundados 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, chamaremos C(++).

O material dividido em captulos correspondendo a aproximadamente uma aulade 100 minutos. So apresentadas mais lies do que provavelmente comporiam umcurso deste tipo dando, assim, opes para que os professores usando livro variem aestrutura de seus cursos.

Sugere-se que a primeira parte do livro, mais bsica, seja seguida na ntegra e naordem em que apresentada. A segunda parte contm 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.

Para montar a sequncia de instrues que resolvam determinado problema precisa-mos, antes de qualquer outra coisa, entender o problema e sermos capazes de resolv-lona mo. Uma vez que tenhamos uma soluo teremos o que chamamos de um algo-ritmo.

1.1 AlgoritmoUm 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 compu-tador ela ser. Para isto ocorra, isto , para que o computador entenda suas intrues,alm de detalhadas, eles precisam ser escritas em uma linguagem de programao.

1.2 Linguagem de ProgramaoDe acordo com a fontes altamente confiveis

A programming language is an artificial language designed to commu-nicate instructions to a machine, particularly a computer. Programming

13

http://en.wikipedia.org/wiki/Programming_language

Vers

o Prel

imina

r

14 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

languages can be used to create programs that control the behavior of amachine and/or to express algorithms precisely.

De forma simplificada, uma liguagem de programao um conjunto de palavras eregras para o uso destas palavras na descrio de algoritmos interpretveis por umcomputador.

Existem diversas linguagens de programao, tendo cada uma seus pontos fortes efracos. Neste curso, usaremos as linguagens C e C++, por razes que no discutiremosaqui.

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 diversos features como classes e stre-ams, comeou a ser desenvolvida na dcada de 70 e, como a linguagem C, tambmpassou por vrias reformas. Como resultado, hoje temos uma linguagem C++ padro-nizada que pode ser usada, alas com certa dificuldade, para se programar em vriossistemas operacionais de forma portvel. Alm disso, a linguagem C++ um superconjunto da linguagem C. Ou seja, todo e qualquer programa em C tambm um pro-grama em C++, mesmo que o oposto no seja verdade.

Uma vez que o objetivo deste curso introduzir o uso do racioccio computacional,no estudaremos todos os aspectos da linguagem C, mas somente aqueles essenciais.Alm disso, usaremos partes da linguagem C++ para simplificar o desenvolvimentodos nossos programas. Assim, nos referiremos linguagem usada como C(++), poisnem toda a C, e nem somente C, mas no chega a ser C++. Mas chega de ladainha;vamos ao nosso primeiro programa em linguagem C(++)!

1.3.1 Meu Primeiro ProgramaO algoritmo em linguagem C(++)1, 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:

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.

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 aqui.

1Usaremos tambm os termos programa e cdigo para nos referirmos a tais algoritmos.

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

Vers

o Prel

imina

r

1.3. A LINGUAGEM C(++) 15

programar no uma arte mas, sim, magia!!!

#include 2

using namespace std;4

int main()6 {

cout

Vers

o Prel

imina

r

16 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

1.3.3 Tipos Primitivos da Linguagem CO cdigo apresentado acima, como mencionado, tem a limitao de s calcular a reade retngulos cujos lados tenham tamanhos inteiros. Para corrigir esta deficincia, va-mos alter-lo para que aceite nmeros reais. Em computao, nmeros reais so tam-bm chamados de nmeros com pontos flutuantes e, em linguagem C, simplesmentede float. Sendo assim, podemos corrigir o programa simplesmente substituindo asocorrncias da palavra int por float.

float f(float a, float b)2 {

return a * b;4 }

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, no sero estudados por enquanto.

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 { e } esto alinhas e mais avanadas em relao s chaves.

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

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

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

* b e altura b. 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 }

Vers

o Prel

imina

r

1.4. A FUNO MAIN 17

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.

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 }

1.4 A Funo mainQue o computador uma mquina burra e executa somente o que voc manda voc jdeve ter entendido, mas como mand-lo executar algo? Em linguagem C, o computadorsempre comea a execuo de um programa pela funo main. Sendo assim, se vocquer dizer ao computador que calcule a rea de um retngulo, ento esta ordem deverpartir, de alguma forma, da funo main. Por exemplo, veja o cdigo abaixo.

#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

18 CAPTULO 1. O COMPUTADOR UMA MQUINA BURRA

26 }

Algumas observaes importantes sobre a funo main:

1. A funo main tem um resultado do tipo inteiro e seu resultado sempre 0(return 0;). Bom, nem sempre 0, mas por enquanto definiremos sempreassim.

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, 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 serverm, est pronto para ser executado no seu computador. Por que voce noexperimenta faz-lo? Para tal, crie um projeto do tipo Console Application, usando alinguagem C++.

1.5 ConclusoOs cdigos apresentados neste captulo, apesar de simples, ilustraram vrios pontosimportantes da programao em de computadores em geral e da linguagem C em espe-cfico. Estes pontos podem ser sumarizados assim:

Em C se pode definir funes que executem computaes bem definidas e espe-cficas.

C tem vrios tipos de dados, como int (nmeros inteiros) e float (nmerosreais).

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

1.6 Exerccios

1.6.1Escreva um funo que calcule a rea de um tringulo.

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

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. Relembrando, o arquivo com o cdigo do programa conhecido como c-digo fonte ou simplesmente fonte. Uma vez de posse do fonte, preciso submet-lo aum processos com vrios passos que gera, ao final, um arquivo executvel. O processocomo um todo conhecido como compilao, apesar de compilao ser apenas um dospassos do processo. Este processo descrito na prxima seo.

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. Se voc est perdido, no se preocupe.A funo da pr-compilao ficar mais clara mais adiante no curso.

Uma vez termina a pr-compilao, acontece a compilao do seu programa. Acompilao traduz o cdigo que voc escreveu para uma linguagem inteligvel ao com-putador, salvando-o em um arquivo chamado arquivo objeto. Por exemplo, a compila-o 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

19

Vers

o Prel

imina

r

20 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 pode 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 que gratuita e com verses para Windows, Linux e OSX. Entretanto, qualquer outra IDEou mesmo a compilao manual podem ser usados em substituio ao Code::Blocks.

2.2.1 Criando um ProjetoPara comear a programa 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. Emproject title escreva algo como aula6_1; em folder to create the project in, clique no

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

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

Vers

o Prel

imina

r

2.2. A IDE CODE::BLOCKS 21

botao com ... e escolha uma pasta para salvar o projeto; esta pode ser, por exemplo, apasta Meus Documentos ou uma pasta qualquer em um pen drive.2 Clique ento Nexte, na tela seguinte, clique em Finish.

Pronto, seu projeto foi criado. Mas e agora? Agora abra o arquivo main.cpp, queest na pasta sources, dando um clique duplo no nome do arquivo.

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

2.2.2 Depurao

Todo 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 fazercom 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, voc

2O importante aqui salvar o arquivo em um lugar em que voc possa voltar mais tarde para reler.

Vers

o Prel

imina

r

22 CAPTULO 2. COMPILAO E EXECUO

est no caminho certo. Agora, copie a toda a linha contendo a mensagem e cole-avrias vezes, substituindo o nome em cada linha. Seu programa deve ficar assim:

#include 2

using namespace std;4

int main()6 {

cout

Vers

o Prel

imina

r

2.4. EXERCCIOS 23

Code::Blocks. Nesta pasta voc encontrar um arquivo com extenso .exe; este oarquivo executvel que deveria enviar para seu amigo.

2.4 Exerccios

2.4.1Escreva o programa completo que calcula a rea de vrios retngulos do captulo ante-rior e execute-o.

2.4.2Altere seu programa para usar, alm da funo de clculo de rea de um quadrado, asfunes definidas nos exerccios do captulo anterior.

Vers

o Prel

imina

r

24 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 nossosprogramas. Essas informaes, tais como nome, nmero de matrcula, nota final, soarmazenadas em entidades chamadas variveis.

Uma varivel nada mais do que um pedao de memria, no qual se pode ler ougravar alguma informao, com um nome bonitinho associado. Damos um nome acertas partes da memria quando seu contedo ser acessado (lido e/ou escrito) comgrande frequncia durante a execuo do programa.

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.

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) logo depois da de-clarao da funo (aqueles blocos que vimos no Captulo 1). A declarao/criao deuma varivel tem, pelo menos, duas partes:

Nome: atravs do qual ela pode ser acessada e atualizada no seu programa;

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.

Existem algumas regrinhas bsicas para se nomear uma variveis:

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

o nome no pode comear com nmeros.

25

Vers

o Prel

imina

r

26 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

Quanto aos tipos usaremos, por enquanto, os seguintes tipos bsicos:

int: representando um nmero inteiro;

float: representando um nmero real, com casas decimais separadas por ponto (e.g.,3.1416); e

char: representando um caractere (letra, dgito, sinal de pontuao, etc).

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 a mudana dovalor da varivel. Esta operao executada pelo operador de atribuio =. Por exem-plo, 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 pode ser usada se tiver sido iniciada, o Cpermite que as variveis sejam iniciadas j em sua declarao. Por exemplo, o cdigoabaixo faz exatamente o que fazia o exemplo anterior, mas de forma mais compacta.

Vers

o Prel

imina

r

3.1. DECLARAO DE VARIVEIS 27

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

28 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

3.1.2 Parmetros so Variveis

Nos 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.

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;area = area_retangulo(2.0, 2.0);

11 cout

Vers

o Prel

imina

r

3.2. ENTRADA / SADA 29

Como pode ser observado no exemplo anterior, a palavra endl aparece algumasvezes. Sua funo a de pular uma linha na tela (endl a contrao end line).Sendo assim, o comando anterior teria a seguinte sada:

letra = a2 num = 2

3.2.2 LeituraDe forma semelhante ao cout, h tambm um comando para leitura denominado cin.Este comando permite ler valores digitados pelo usurio atualizando a(s) varivel(is)passada(s) para o cin por meio do conector >>.

A seguir temos um exemplo de entrada de dados:

char letra;2 int idade;

4 cout > letra >> idade;cout

Vers

o Prel

imina

r

30 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

3.3 OperadoresOs operadores so os mecanismos por meio dos quais os computadores realizam osclculos aritmticos e lgicos, atualizando valores das variveis e executando as tarefasa que se destinam.

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

r

3.4. EXERCCIOS 31

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

32 CAPTULO 3. VARIVEIS, ENTRADA / SADA E OPERADORES

3.4.3Escreva umao qu?o qu?

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

34 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 35

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

36 CAPTULO 4. VARIVEIS (II)

area_circulo.Observe tambm que a mesma varivel aread 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

38 CAPTULO 5. SELEO SIMPLES

cout > b;

cout > c;

22 cout

Vers

o Prel

imina

r

5.1. OPERADORES RELACIONAIS 39

42 cin >> c;

44 cout

Vers

o Prel

imina

r

40 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 }

28 return qtd;}

30

int main()

Vers

o Prel

imina

r

5.2. IF-ELSE 41

32 {float a, b, c;

34

cout b;40 cout > c;42

44 cout

Vers

o Prel

imina

r

42 CAPTULO 5. SELEO SIMPLES

37 if(d < 0){

39 cout

Vers

o Prel

imina

r

5.3. FUNES E PROCEDIMENTOS 43

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 com normais, o resultado dado pela instruo return; em procedimentos, que no tem resultado, returnno utilizado. Alm disso, procedimentos no podem ser usados em atribuies.

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

44 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 usa 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 tido, 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 Exerccios

5.5.1Muitas 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 {

2Pelo menos nos programas simples que faremos.

Vers

o Prel

imina

r

5.5. EXERCCIOS 45

if(ano % 100 == 0)10 {

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

46 CAPTULO 5. SELEO SIMPLES

funo main deve usar as funes escritas nos itens anteriores para clculo damdia e impresso dos nmeros.

5.5.3Escreva um programa que contenha

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 convertida paraa outra medida.

5.5.4Faa uma funo denominada ehPar que receba um nmero inteiro como argumentoe retorne verdadeiro se este nmero for par ou falso, caso contrrio. A funo maindeve ser o nmero e imprimir o valor retornado pela funo auxiliar.

5.5.5Elabore 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 os la-dos de um tringulo e retorna 0 caso os nmeros formem um tringulo equiltero,1 caso formem um tringulo issceles, ou 2 caso sejam os lados de um tringuloescaleno.

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 do captulo anterior.

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 }else if(sexo == 2) // feminino

20 {if(idade == 21)

22 {return true;

24 else{

26 return false;}

28 }else // sexo informado errado

47

Vers

o Prel

imina

r

48 CAPTULO 6. SELEO SIMPLES (II)

30 {return false;

32 }}

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

E &&OU ||

NO !

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 sexo4 * (1=Masculino, 2=Feminino) e idade passados como argumentos

Vers

o Prel

imina

r

6.2. PRIORIDADE DOS OPERADORES 49

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

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

8 {if((sexo == 1 && idade >=18) || (sexo == 2 && !(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. Negao (!)

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

4. Soma e subtrao;

5. Operadores relacionais (=)

6. Operadores relacionais (==, !=)

Vers

o Prel

imina

r

50 CAPTULO 6. SELEO SIMPLES (II)

7. OU-Exclusivo ()

8. E (&&)

9. OU (||)

10. 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

6.3.2Faa 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.

Vers

o Prel

imina

r

6.3. EXERCCIOS 51

6.3.3Faa uma funo que receba 3 nmeros reais (float) correspondentes aos lados de umtringulo e retorne true caso esse tringulo seja retngulo ou false caso no o seja.A funo principal deve ler os valores dos lados do tringulo e imprimir se ou noretngulo.

Exerccio que deixe bvio anecessidade do switch-caseExerccio que deixe bvio anecessidade do switch-case

Vers

o Prel

imina

r

52 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

54 CAPTULO 7. SWITCH

26 else if(mes == 4)cout

Vers

o Prel

imina

r

7.1. SWITCH-CASE-DEFAULT 55

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

56 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 57

break;40 case 7:

cout

Vers

o Prel

imina

r

58 CAPTULO 7. SWITCH

#include 4 using namespace std;

6 int menu(){

8 int opcao;cout

Vers

o Prel

imina

r

7.4. LABORATRIO 59

switch(opcao)60 {

case 1:62 cout

Vers

o Prel

imina

r

60 CAPTULO 7. SWITCH

Vers

o Prel

imina

rCaptulo 8Repetio (I)Existem situaes em que a repetio de um conjunto de comandos inevitvel. Emsituaes como esta, temos duas opes: ou copiamos e colamos todo o trecho quedesejamos repetir, fazendo os ajustes necessrios; ou utilizamos uma sada mais inte-ligente por meio de comandos especiais que permitem automatizar a repetio. Nestecaptulo veremos 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

62 CAPTULO 8. REPETIO (I)

26 cout

Vers

o Prel

imina

r

8.3. O COMANDO DO-WHILE 63

while (i

Vers

o Prel

imina

r

64 CAPTULO 8. REPETIO (I)

Em comparao ao comando while, a nica diferena existente o fato do teste dacondio ser feito aps a execuo do bloco de comandos que se deseja repetir. Umaimplicao disto que, em casos em que a condio falsa logo no primeiro teste, obloco de comandos executado com do-while, mas no executado com while. Istoaconteceria para a varivel i com valor inicial de 11, por exemplo.

8.4 Mais exemplosConsidere que deseja-se somar todos os nmeros pares entre 1 e 999. Ou fazemos umasoma com todos os valores em uma linha enorme, ou utlizamos o que apresendemossobre comandos de repetio. Utilizando o while, teramos:

...2 int n = 2, // primeiro par maior do que 1

soma = 0; // soma inicialmente zerada4 while (n < 999){

6 soma = soma + n;n += 2;

8 }cout

Vers

o Prel

imina

r

8.4. MAIS EXEMPLOS 65

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);...

Vers

o Prel

imina

r

66 CAPTULO 8. REPETIO (I)

8.5 ExercciosFaa os exerccios a seguir mo.

8.5.1Faa uma funo que recebe um nmero inteiro positivo e retorna o fatorial deste n-mero. A funo principal deve ler o nmero do qual se deseja calcular o fatorial eimprimir o resultado.

8.5.2Faa uma funo que recebe um nmero inteiro positivo e retorna true se o nmerofor primo ou false, caso contrrio. A funo principal (main) deve ler o nmero eimprimir o resultado.

8.5.3Modifique o programa anterior para imprimir todos os nmeros primos abaixo de doismilhes.

8.5.4Faa um programa que leia um nmero inteiro positivo e imprima esse nmero de trspra frente. A impresso deve ser feita pela funo auxiliar inverteNumero.

Vers

o Prel

imina

r

8.6. LABORATRIO 67

8.6 Laboratrio

8.6.1Implemente os exerccios acima no Code::Blocks.

8.6.2O exerccio 7.3.1 pedia que voc escrevesse uma funo que gerasse um menu na tela.A funo que voc escreveu tinha um problema: ela aceitava qualquer valor, mesmoalgum no correspondendo a nenhuma opo do menu.

Usando do-while, altere sua funo para que continue exibindo o menu e lendouma opo at que uma opo vlida seja digitada pelo usurio.

8.6.3Implemente uma funo chamada pot que receba dois nmeros reais base e expoentecomo parmetro e que calcule baseexpoente. A funo pot deve usar multiplicaessucessivas para calcular seu resultado (isto , proibido o uso da funo pow).

8.6.4Execute o seguinte programa em seu computador e observe o que acontece.

...2 int num = 10;do

4 {cout

Vers

o Prel

imina

r

68 CAPTULO 8. REPETIO (I)

8.6.6Faa um programa que gera um nmero inteiro aleatrio de 1 a 1000 em uma funo denominadageraNumero. Na funo principal, o usurio deve tentar acertar qual o nmero foi gerado. Acada tentativa o programa dever informar se o chute menor ou maior que o nmero gerado.O programa acaba quando o usurio acerta o nmero gerado. O programa deve informar emquantas tentativas o nmero foi descoberto.

8.6.7Escreva um programa que receba como entrada o valor do saque realizado pelo cliente de umbanco e retorne quantas notas de cada valor sero necessrias para atender ao saque com amenor quantidade de notas possvel. Sero utilizadas notas de 100, 50, 20, 10, 5, 2 e 1 re-ais. O clculo e impresso do resultado deve ser efetuado por uma funo auxiliar denominadaimprimeNotas.

Vers

o Prel

imina

rCaptulo 9Repetio (II)Voc deve ter percebido que no uso de do-while e while quase sempre seguimos os mesmospassos:

declarar uma varivel que sirva de controle para a iterao; iniciar a varivel de controle (e possivelmente outras); verificar a condio para iterao executar iterao executar incremento/decremento (mudana da varivel de controle)A linguagem C tem um comando iterao que agrega todos estes passos, chamado for.

9.1 forSua forma geral do comando for a seguinte:

for(DI; C; I)2 {

\\bloco de comandos a ser repetido4 }

O comando for tem trs partes em sua declarao, alm dos comandos a serem repetidos.

DI em DI variveis podem ser Declaradas e Iniciadas. Variveis j existentes tambmpodem ter seus valores ajustados em DI;

C C define a Condio necessria execuo do bloco de comandos. Enquanto acondio for verdadeira, o bloco ser executado.

I comandos de modificao de variveis, como Incremento e decremento, so colocadosdiretamente na declarao do for. O comando executado ao final de cada iterao.

A execuo do for segue os seguintes passos:

1. Iniciao (execuo de DI)

2. Avaliao (teste da condio em C)

69

Vers

o Prel

imina

r

70 CAPTULO 9. REPETIO (II)

3. Execuo do bloco de comandos

4. Incremento

5. De volta ao passo 2

Considere o exemplo do captulo anterior em que deseja-se somar todos os nmeros paresentre 1 e 999. O cdigo pode ser escrito, como vimos, usando while.

...2 int n = 2, // primeiro par maior do que 1

soma = 0; // soma inicialmente zerada4 while (n < 999){

6 soma = soma + n;n += 2;

8 }cout

Vers

o Prel

imina

r

9.2. MAIS EXEMPLOS 71

6 }cout maior) // atualizo o maior{

16 maior = n;}

18 }...

Observe que a primeira leitura aconteceu fora do for.

9.3 Declaraes especiaisEm certas situaes pode ser desejvel omitir partes da declarao do for. Por exemplo, se asvariveis de controle j tiverem sido iniciadas ou, simplesmente, se no existirem, ou se nohouver incremento a ser feito, ento estas partes da declarao podem ser deixadas em branco.Por exemplo,

int menu()2 {

int opcao = 0;4

for( ; opcao < 1 || opcao > 4 ; )6 {

cout

Vers

o Prel

imina

r

72 CAPTULO 9. REPETIO (II)

14 cin >> opcao;}

16 return opcao;}

Observe que embora neste exemplo tanto DI quanto I esto vazias, isso no necessrio. Isto, qualquer das partes da declarao podem estar vazias independentemente, inclusive a segundaparte.

9.4 Alterando a repetio com o break e continueCaso a segunda parte do comando esteja vazia, a repetio ser executada ad infinitum ou at queseja interrompida. A interrupo de uma iterao pode ser feita usando-se o comando break.Veja o exemplo anterior reescrito para usar tal comando.

int menu()2 {

int opcao;4

for(;;)6 {

cout

Vers

o Prel

imina

r

9.5. EXERCCIOS 73

Vers

o Prel

imina

r

74 CAPTULO 9. REPETIO (II)

Vers

o Prel

imina

rCaptulo 10Tipos de Dados e SuasRepresentaes

At agora temos trabalhado essencialmente com os tipos numricos, inteiros e reais, e boolea-nos. Para que possamos usar outros tipos, essencial que antes entendamos como os dados sorepresentados na memria do computador.

10.1 Bit & ByteComo dito anteriormente, a memria do computador pode ser entendida como uma grande pla-nilha eletrnica, podendo cada clula ser endereada (atribuda, lida, nomeada) individualmente.Na memria do computador no existem nmeros ou caracteres, mas vrias lampdas que po-dem estar ligadas ou desligadas. Ns humanos atribumos significado a tais estados como sendo0s e 1s. Cada posio da memria, que pode armazenar 0 ou 1, denominado um bit. Porserem mnimos, normalmente trabalhamos com conjuntos de 8 bits por vez, o que denominamosbytes.

10.1.1 Base BinriaOs bits de um byte podem assumir todas as combinaes de ligado e desligado (0 e 1). Dadoum contexto, cada combinao corresponde a um certo valor. Por exemplo, se estiver usando umbyte para representar nmeros inteiros, ento provavelmente a correspondncia na Tabela 10.1se aplica.

Talvez isso seja novidade para voc, mas voc representa nmeros na base decimal usando10 dgitos (de 0 a 9). Contudo, outras bases existem. Como os bits s possuem dois estados, natural na computao usar a base binria, que usa 2 dgitos (0 e 1). Os valores esquerda natabela podem ser entendidos como nmeros nesta base.1

Para conseguir converter nmeros de uma base para a outra, basta entender o que exatamentesignifica a representao de um nmero em uma base genrica X. Nesta base,ABCDX significaAX3+BX2+CX1+DX0. O nmero 123410, por exemplo, significa 1X3+2X2+3X1+4X0 = 11000+2100+310+41 que igual a, t d, 123410. Para um exemplo mais

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.

75

Vers

o Prel

imina

r

76 CAPTULO 10. TIPOS DE DADOS E SUAS REPRESENTAES

Tabela 10.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

. . .

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.

10.1.2 Base HexadecimalEmbora se possa usar qualquer base numrica, as que fazem mais sentido no mundo compu-tacional so as binria e hexadecimal. A base hexadecimal usa 16 dgitos em cada posiorepresentando valores de 0 a 15. Para isto, usa os valores de 0 a 9 iguais aos da base decimal etambm as letras de A a F representado os valores de 10 a 15. Por exemplo, o nmero 1A2F16equivale a 1 163 + 10 162 + 2 161 + 15 160 = 4096 + 2560 + 32 + 15 = 6703.

10.2 Converso entre bases numricasEnquanto ns trabalhamos com base decimal, o computador armazena informao e realiza ope-raes na base binria. Por isso, a todo momento ocorre a converso entre um decimal queinformamos como entrada em um programa, por exemplo, para a base binria (para efetuar oclculo), bem como da base binria (resultado do clculo) para a base decimal exibida na tela.

Converso de Binrio para DecimalA converso de binrio (e qualquer outra base) para decimal pode ser feita facilmente usando anotao da base genrica apresentada acima. Isto , para realizar a converso basta multiplicar ovalor de cada posio pelo seu peso (base elevada posio). Por exemplo, o nmero 11110112equivale a 126+125+124+123+022+121+120 = 64+32+16+8+0+2+1 = 12310.

Vers

o Prel

imina

r

10.3. TIPOS NUMRICOS INTEIROS 77

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

Por exemplo, considere a converso do nmero 169 para a base binria. O processo deconverso 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 a base hexade-cimal tem exatamente 16 dgitos, conclumos que possvel representar cada dgito hexadecimalcom 4 dgitos binrios. Sendo assim, a converso binrio/hexadecimal pode ser feita facilmentesubstituindo conjuntos de 4 bits binrios por um dgito hexadecimal e vice-versa.

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

10.3 Tipos Numricos InteirosNa linguagem C, os principais tipos, a quantidade de bits utilizada para sua representao e ointervalo de valores aceitos so resumidos na tabela a seguir: 2

Observe que o tipo caractere tambm armazenado internamente como um nmero inteirode 8 bits. Com 8 bits podemos representar 28 nmeros. Se considerarmos nmeros sem sinal(unsigned) teremos de 0 a 255; se considerarmos nmeros com sinal, teremos metade para po-sitivos e metade para negativos, ou seja, de -128 a 127. O mesmo raciocnio se aplica para osoutros tipos de dados da tabela.

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

10.3.1 Nmeros Binrios NegativosOs exemplos que vimos at agora de converso no contemplam nmeros negativos. Na basedecimal, o sinal de menos (-) antes do valor do nmero tem a finalidade de representar nmerosnegativos.

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

Vers

o Prel

imina

r

78 CAPTULO 10. TIPOS DE DADOS E SUAS REPRESENTAES

Tabela 10.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

10.4. ARITMTICA INTEIRA BINRIA 79

Tabela 10.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

Como a memria do computador armazena apenas 0s e 1s, uma possvel estratgia des-perdiar um dos bits do nmero para o sinal. Adota-se, por padro, o zero para representar umnmero positivo e o um para negativo. O bit do sinal armazenado na posio 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 (magnitude)representado da mesma forma que um nmero positivo e o bit mais significativo, que representao sinal, ser igual a um. A tabela a seguir mostra alguns exemplos de nmeros na base decimale na representao sinal-magnitude.

Tabela 10.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). Um pro-blema que aparece com esta representao o zero. Qual a representao correta, 00000000 ou10000000? E por que precisaramos de duas representaes?

A representao complemento de 2 utiliza uma maneira um pouco diferente de representarnmeros negativos. Para express-los devemos inverter cada bit do nmero positivo e somar 1ao resultado. Por exemplo, o nmero -15 representado em complemento de 2 com 5 bits como10001, ou seja, calcula-se o valor de +15 = 011112, e, em seguida invertemos e somamos 1:100002 + 12 = 100012. Se a representao usar 8 bits, ento 1510 = 000011112 e 1510 =111100012.

10.4 Aritmtica Inteira Binria

Aritmtica 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 e subtraes geralmenteso realizadas aos pares, da mesma forma que na base binria.

Vers

o Prel

imina

r

80 CAPTULO 10. TIPOS DE DADOS E SUAS REPRESENTAES

10.4.1 Nmeros positivosA adio de nmeros positivos muito simples. Para faz-la, basta somar os valores na mesmaposio, do menos significativo para o mais significativo. O vai-um funciona da mesma formacomo 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 uma soma podeocorrer de o resultado ultrapassar o maior valor permitido para aquela quantidade de bits, quandoisto ocorre, temos um overflow (derramamento). Considere a soma de 7 e 9, ambos com 4 bits.

1 1110111 +1001----

1 0000

Vers

o Prel

imina

r

10.5. TIPOS NUMRICOS REAIS 81

111(+7) 0111 +(+7) 0111

----1110

Vers

o Prel

imina

r

82 CAPTULO 10. TIPOS DE DADOS E SUAS REPRESENTAES

de caracteres como nmeros foi padronizada. Os principais padres existentes so: ASCII,EBCDIC e Unicode.

ASCIIASCII, ou American Standard Code for Information Interchange, o padro mais utilizado,presente em todos os nossos computadores pessoais. Trata-se de uma codificao de caracteresde oito bits baseada no alfabeto ingls.

A codificao define 256 caracteres (28). Desses, 33 no so imprimveis, como caracteresde controle atualmente no utilizveis para edio de texto, porm amplamente utilizados emdispositivos de comunicao, que afetam o processamento do texto. Exceto pelo caractere deespao, o restante composto por caracteres imprimveis.

A Figura 10.1 exibe a tabela ASCII.A linguagem C prov um atalho para que voc no tenha que recorrer tabela ASCII sempre

que precisar do valor de um caractere: para obter o valor de um caractere qualquer, basta coloc-lo entre aspas simples. Isto , para verificar se um caracter c uma letra maiscula, por exemplo,basta efetuar o teste if(c >= A&& c

Vers

o Prel

imina

r

10.7. EXERCCIOS 83

Figura 10.1: Tabela ASCII

4. 2C0416

5. 111012

10.7.4Escreva os nmeros a seguir nas representaes sinal-magnitude e complemento de 2 com 8 bits:

Vers

o Prel

imina

r

84 CAPTULO 10. TIPOS DE DADOS E SUAS REPRESENTAES

1. -19

2. +47

3. -29

4. -37

5. -105

10.7.5Realize as seguintes operaes aritmticas em complemento de 2 com nmeros de 8 bits:

1. 16 - 9

2. -45 - 7

3. -12 + 12

10.7.6Escreva seu nome na codificao ASCII.

10.8 LaboratrioAcompanhe as atividades a seguir:

10.8.1No laboratrio veremos como utilizar a tabela ASCII para imprimir caracteres. Execute o se-guinte programa e observe o que ser impresso. Atente para as atribuies!

#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

10.8. LABORATRIO 85

10.8.3Agora faa um programa que leia caracteres informados pelo usurio enquanto ele no pressionara tecla ESC. Para cada caractere informado pelo usurio, escreva o nmero correspondente natabela ASCII.

10.8.4Modifique o programa anterior para que solicite que o usurio entre com letras minsculas de aa z e imprima na tela, para cada letra, a maiscula correspondente.

Vers

o Prel

imina

r

86 CAPTULO 10. TIPOS DE DADOS E SUAS REPRESENTAES

Vers

o Prel

imina

rCaptulo 11Arranjos 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 valores e dividirpor 6.

Mas e se alterssemos o problema para que, em vez de 6, precisasse ler 10 nmeros? E 100?Ter muitas variveis distintas com a mesma finalidade no vivel por duas razes:

difcil de manter: e se voc precisar renomear uma varivel, ter que faz-lo em todas asvariveis;se precisar aumentar ou diminuir o nmero de variveis, ter que apagar/copiar e reno-mear.

evita reuso de cdigo: se uma mesma operao precisa ser aplicada a cada varivel, ficadifcil reusar o cdigo desta operao.

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

11.1 VetoresContinuando com nossa analogia da memria do computador com uma planilha eletrnica, umvetor uma varivel que nomeia diversas clulas contguas da memria do computador. Isto, de certa forma, enquanto uma varivel int corresponde a uma rea da memria que cabe 1inteiro, um vetor de 10 int uma varivel que cabe 10 inteiros.

A sintaxe para a declarao esttica de vetores bem simples (em captulos futuros veremoscomo 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;

87

Vers

o Prel

imina

r

88 CAPTULO 11. ARRANJOS UNIDIMENSIONAIS

tamanho a quantidade de clulas no vetor;O acesso a uma clula, para leitura ou atribuio, feito usando se o identificador seguido

pela posio a ser acessada, entre colchetes ([]). Por exemplo, x[3] = 0 atribui o valor 0 posio de ndice 3 do vetor x. Algo importante a ser observado aqui que a primeira posiode um vetor de tamanho n tem ndice 0 e a ltima tem ndice n 1.

O exemplo a seguir resolve o problema apresentado na seo anterior usando vetores.

#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

11.2. VETORES DE CARACTERES 89

#define TAMANHO 106

int main()8 {

char nome[TAMANHO];10

cout

Vers

o Prel

imina

r

90 CAPTULO 11. ARRANJOS UNIDIMENSIONAIS

29 }

11.2.1 Vetores de Caracteres como StringsUm vetor de caracteres essencialmente uma palavra ou uma frase. Assim, durante a leiturade um vetor de caracteres dificilmente sabe-se quantos caracteres sero digitados pelo usurio,por exemplo, quando deseja-se ler o nome de um indivduo. Por este motivo, a maioria das lin-guagem de programao fornece mtodos especiais de leitura, impresso e manipulao dessesvetores de caracteres, ou como chamaremos agora, strings.

Na linguagem C++, os comandos cout e cin permite imprimir e ler strings de maneiradireta:

#include2

using namespace std;4

#define TAMANHO 1006

int main()8 {

char nome[TAMANHO];10

cout

Vers

o Prel

imina

r

11.3. EXERCCIOS 91

14 cout

Vers

o Prel

imina

r

92 CAPTULO 11. ARRANJOS UNIDIMENSIONAIS

Escreva um programa que leia e imprima strings at que o usurio digite a palavra fim. Consi-dere que cada string no possui espaos.

Escreva um programa que leia e imprima strings at que o usurio digite a palavra fim. Asstrings podem conter espaos.

Vers

o Prel

imina

rCaptulo 12Strings e FunesNeste captulo veremos algumas funes muito usadas na manipulao de (strings) assim comodefinir suas prprias funes que recebem vetores como parmetros.

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

Para isso, a biblioteca string.h fornece algumas funes prontas, como pode ser visto natabela 12.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 12.1: Algumas funes para trabalhar com strings.

O exemplo a seguir mostra a utilizao destas funes:

#include2 #include

4 using namespace std;

6 int main(){

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

10 float f;

93

Vers

o Prel

imina

r

94 CAPTULO 12. STRINGS E FUNES

12 cout > str1;

14 cout > str2;

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

18 cout

Vers

o Prel

imina

r

12.2. FUNES COM VETORES COMO PARMETROS 95

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

Corpo da Funcao}

Por exemplo, veja como definir uma funo que transforme todos os caracteres de uma stringpara 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

96 CAPTULO 12. STRINGS E FUNES

12.3 Exerccios12.3.1O cdigo de Csar uma das mais simples e conhecidas tcnicas de criptografia. um tipode substituio na qual cada letra do texto substituda por outra, que se apresenta no alfabetoabaixo dela um nmero fixo de vezes. Por exemplo, com uma troca de trs posies, A seriasubstitudo por D, B se tornaria E, e assim por diante. Implemente um programa que faa usodesse Cdigo de Csar (3 posies),entre com uma string e retorne a string codificada.

String orig.: a ligeira raposa marrom saltou sobre o cachorro cansadoNova string : D OLJHLUD UDSRVD PDUURP VDOWRX VREUH R FDFKRUUR FDQVDGR

12.3.2Faa um programa que dado uma string, retorne 1 se ela for palndromo e 0 se ela no forpalndromo. Lembrando que:Um palndromo uma palavra que tenha a propriedade de poder serlida tanto da direita para a esquerda como da esquerda para a direita. Deve-se obrigatoriamenteutilizar uma string auxiliar e a funo strcmp para fazer a resoluo.

Ex: SUBI NO ONIBUSARARAANOTARAM A DATA DA MARATONA

12.3.3Faa um programa em que troque todas as ocorrncias de uma letra L1 pela letra L2 em umastring. A string e as letras L1 e L2 devem ser fornecidas pelo usurio.

12.3.4Altere os programas anteriores para que contenham funes que resolvam os problemas propos-tos.

12.3.5Faa um programa que leia 3 strings e as imprima em ordem alfabtica.

12.3.6Faa um programa com uma funo que receba um vetor de inteiros e um inteiro X, e que retornecomo resultado o maior inteiro do vetor que menor que o inteiro X.

12.3.7Usando a resposta do problema anterior, faa um programa com uma funo que receba doisvetores de inteiros, e que faa com que o segundo torne-se uma cpia do primeiro, ordenado deforma decrescente.

Vers

o Prel

imina

rCaptulo 13Funes teis I13.1 Funes MatemticasA biblioteca math.h fornece algumas funes aritmticas muito teis no desenvolvimento deprogramas. A Tabela 13.1 apresenta algumas destas funes.

Funo Descrio/Exemploabs valor absoluto do argumento. Ex: int x = abs(-9);sin seno do argumento (em radianos). Ex: double x = sin(3.14159);cos cosseno do argumento (em radianos). Ex: double x = cos(3.14159);tan tangente do argumento (em radianos). Ex: double x = tan(3.14159);asin arco cujo seno passado como argumento. Ex: double x = asin(1);acos arco cujo cosseno passado como argumento. Ex: double x = acos(1);atan arco cuja tangente passada como argumento. Ex: double x = atan(sqrt(2)/2);floor piso do valor passado como argumento. Ex: double x = floor(3.2); //=3ceil teto do valor passado como argumento. Ex: double x = floor(3.2); //=4round arredonda o argumento para o inteiro mais prximo. Ex: double x = round(9.9); //=10pow eleva o primeiro argumento ao expoente no segundo. Ex: double x = pow(2,3); //=8sqrt retorna a raiz quadrada do argumento. Ex: double x = sqrt(169); //=13log retorna logaritmo natural do argumento.log10 retorna log. do argumento na base 10.log2 retornar log d