You are on page 1of 86

Algoritmos Computacionais com aplicaoes em C c Bacharelado em Sistemas de Informaao c Engenharia Mecatrnica o IF Sudeste MG Filippe jabour

27 de fevereiro de 2012 http://www.jabour.com.br


Este material pode ser usado livremente, copiado ou distribu do, desde que citada a autoria.
A Feito no L TEX em ambiente Linux.

Sumrio a

Lista de Algoritmos/Programas

vii

Lista de guras

Lista de tabelas

xi

1 Conceitos Iniciais 1.1 1.2 1.3 1.4 1.5 Referncias e bibliograa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Algoritmos e a linguagem C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Varivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Tipos de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Conceitos iniciais: aplicaes em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co 1.5.1 1.5.2 1.5.3 1.6 O conceito de funo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca A funo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Primeiros exemplos de programas em C . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 1 1 2 3 3 3 4 4 6 6 7 7 7 7

Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 Mdia aritmtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e Mdia ponderada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Aumento de salrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Salrio base com graticao e impostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . a ca Operaes com um nmero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co u

ii

1.6.6 1.6.7 1.6.8 1.6.9

Preo do carro, impostos e lucro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c Clculo de salrio a a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7 8 8 8 8

Saldo da conta aps emisso de cheques . . . . . . . . . . . . . . . . . . . . . . . . . . . . o a Consumo de rao de gatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca

1.6.10 Medida da escada enconstada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 O comando if-else (se-seno) a 2.1 2.2 Descrio e exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca

9 9

if-else: aplicaes em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 co 2.2.1 2.2.2 A funo scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 ca Uso do se-seno (if-else) em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 a

2.3

Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 Adivinhar um nmero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 u Vericar se um nmero par ou u e mpar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Achar o maior de 3 nmeros u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 . . . . . . . . . . . . . . . . . . . . . 16

Vericar se um nmero positivo, negativo ou nulo u e

Equao do segundo grau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 ca Soma nmeros e escolhe uma operao com base no resultado da soma . . . . . . . . . . . 16 u ca Verica se emprstimo pode ser concedido . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 e

3 Switch-case (escolha-caso) 3.1 3.2 3.3

17

Descrio e exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 ca switch-case: aplicaes em C co . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3.1 3.3.2 3.3.3 Peso nos planetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Questo de mltipla escolha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 a u Calculadora simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

iii

4 For (para) 4.1 4.2 4.3

22

Descrio e exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 ca for: aplicaes em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 co Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.3.8 Adivinhar um nmero com n tentativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 u Menu de opes e um for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 co Progresso aritmtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 a e Sequncia de Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 e Par de nmeros com soma denida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 u Soma de alguns nmeros digitados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 u Achar os divisores de um nmero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 u Imprimir somente acima da diagonal principal . . . . . . . . . . . . . . . . . . . . . . . . 28

5 while e do-while (enquanto e faa-enquanto) c 5.1 5.2 5.3

29

Descrio e exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 ca while e do-while: aplicaes em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 co Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 Adivinhar no at o usurio acertar ou desistir . . . . . . . . . . . . . . . . . . . . . . . . . 33 e a Preo de passagem area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 c e L no s e exibe o maior, o menor e a quantidade . . . . . . . . . . . . . . . . . . . . . . . . 33 e Menu para somar ou multiplicar no s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Achar o nmero de mltiplos em um intervalo u u . . . . . . . . . . . . . . . . . . . . . . . . 34

6 String, vetor e matriz 6.1 6.2

35

Vetor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 6.2.1 Funes de manipulao de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 co ca

iv

strlen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 strcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 strcat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 strcmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.3 Matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 6.3.1 6.4 Matrizes de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.4.7 6.4.8 6.4.9 Calcular a mdia dos elementos de um vetor . . . . . . . . . . . . . . . . . . . . . . . . . . 44 e Gerar vetor soma e produto a partir de 2 vetores originais . . . . . . . . . . . . . . . . . . 44 Imprimir vetor de trs pra frente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 a Concatenar 2 vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Achar maior e menor elementos do vetor e somar seus elementos . . . . . . . . . . . . . . 44 Confere senha digitada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Imprimir uma string de trs para frente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 a L e imprime strings e nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 e u Soma de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6.4.10 Soma dos elementos da diagonal principal . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 6.4.11 Menu e matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

7 Funes co 7.1 7.2 7.3

47

Funoes em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 c Regras de escopo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 7.3.1 7.3.2 7.3.3 Calculadora usando funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 co Equao do segundo grau usando funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 ca co Criao de um vetor aleatrio usando funo . . . . . . . . . . . . . . . . . . . . . . . . . 51 ca o ca

7.3.4 7.3.5 7.3.6 7.3.7

Concatenao de 2 vetores ordenados em um 3o tambm ordenado . . . . . . . . . . . . . 51 ca e Achar o maior, menor, mdia, soma e produto dos elementos do vetor, usando funes . . 52 e co Produto de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Ordenao de vetor ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

8 struct (Estrutura) 8.1 8.2 8.3 8.4

53

struct : conceitos iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Acessando os elementos (campos) da estrutura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Vetores de estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Exerc cios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 8.4.1 Cadastro de produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

9 Soluo dos Exerc ca cios 9.1 9.2 9.3 9.4 9.5 9.6 9.7

56

Respostas dos exerc cios do Cap tulo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Respostas dos exerc cios do Cap tulo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Respostas dos exerc cios do Cap tulo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Respostas dos exerc cios do Cap tulo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Respostas dos exerc cios do Cap tulo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Respostas dos exerc cios do Cap tulo 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Respostas dos exerc cios do Cap tulo 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Referncias Bibliogrcas e a

75

vi

Lista de Algoritmos/Programas
1.1 1.2 1.3 1.4 1.5 1.6 1.7 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Algoritmo para somar 2 nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u Algoritmo c/ declarao de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca Programa vazio com include e main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 4 4 5 6 6 9

Programa que cria e imprime uma varivel inteira a

Programa que soma dois nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u Programa que multiplica dois nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . u Clculo da rea do tringulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a a a O comando se . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Uso do comando se . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 O comando se-seno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 a Uso do comando se-seno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 a Uso do comando se-seno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 a se-seno aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 a Um exemplo simples com scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Um if simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 if-else simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.10 if-else com aninhamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.11 if-else com aninhamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1 O comando escolha-caso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

vii

3.2 3.3 3.4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 5.1 5.2 5.3 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.1 7.2 9.1 9.2

Exemplo simples com escolha-caso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Clculo do peso em outros planetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 a O comando switch-case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Um exemplo simples com o lao para . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 c Imprimir os nmeros pares de 0 a 1000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 u para com decremento da varivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 a Algoritmo 4.3 implementado em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Imprimir os mpares de 30 a 100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 variveis mudando a cada iterao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 a ca Um for dentro do outro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Um exemplo simples com o lao enquanto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 c Um exemplo simples com o lao faa-enquanto . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 c c Uso do while combinado com um menu de opes . . . . . . . . . . . . . . . . . . . . . . . . . . 31 co O primeiro exemplo com vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Varivel como a ndice do vetor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Um exemplo simples de string e gets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 A funo strlen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 ca A funo strcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 ca A funo strcat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 ca A funo strcmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 ca Um exemplo simples com matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 L e exibe um texto com vrias linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 e a Programa com a funo calculaMedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 ca Passando uma matriz como argumento da funo . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 ca Resposta do exerc 1.6.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 cio Resposta do exerc 2.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 cio

viii

9.3 9.4 9.5 9.6 9.7 9.8 9.9

Resposta do exerc 2.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 cio Resposta do exerc 2.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 cio Resposta do exerc 2.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 cio Resposta do exerc 2.3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 cio Resposta do exerc 2.3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 cio Resposta do exerc 2.3.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 cio Resposta do exerc 3.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 cio

9.10 Resposta do exerc 3.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 cio 9.11 Resposta do exerc 3.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 cio 9.12 Resposta do exerc 4.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 cio 9.13 Resposta do exerc 4.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 cio 9.14 Resposta do exerc 4.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 cio 9.15 Resposta do exerc 4.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 cio 9.16 Resposta do exerc 4.3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 cio 9.17 Resposta do exerc 4.3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 cio 9.18 Resposta do exerc 4.3.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 cio 9.19 Resposta do exerc 4.3.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 cio 9.20 Resposta do exerc 5.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 cio 9.21 Resposta do exerc 6.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 cio 9.22 Resposta do exerc 7.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 cio 9.23 Resposta do exerc 7.3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 cio 9.24 Resposta do exerc 7.3.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 cio

ix

Lista de Figuras
1.1 O ciclo de desenvolvimento, compilao e execuo de um programa em C . . . . . . . . . . . . . ca ca 2

Lista de Tabelas
2.1 2.2 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 o

3.1

Gravidades relativas em outros planetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

4.1

Sa do programa 4.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 da

5.1

Preo de passagens areas por regio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 c e a

xi

Cap tulo 1

Conceitos Iniciais
1.1 Referncias e bibliograa e

Esta apostila usou como referncia e bibliograa as seguintes obras, s e tios e materiais: C - Completo e Total [3], Introduo ` programao - 500 algoritmos resolvidos [1], Turbo C: guia do usurio [2]. ca a ca a

1.2

Algoritmos e a linguagem C

Algoritmo uma sequncia nita de passos com o objetivo de solucionar um problema. e e Dado um problema ou tarefa qualquer, voc pode propor uma lista de aes sequencias que, se executadas, e co resolvero o problema ou executaro a tarefa. a a Se estivermos tratando de computao, estes passos devero ser apropriados para a execuo em um comca a ca putador. Para ser executado em um computador, seu algoritmo precisa ser traduzido (ou reescrito) em uma linguagem de programaao. Nesta apostila utilizaremos a linguagem C. c Uma vez escrito o programa em C, o mesmo precisa se traduzido para a linguagem do computador para ser executado. Esta traduo se chama compilao (Figura 1.1). ca ca A cada modicao do programa inicial, chamado de programa fonte ou cdigo fonte, a compilao deve ser ca o ca refeita para gerar um novo programa executvel que reita as modicaes feitas. a co Vejamos um exemplo no algoritmo 1.1 Algoritmo/Programa 1.1: Algoritmo para somar 2 nmeros u

1.3 Varivel a

Editor de textos OU Ambiente de desenvolvimento Integrado (IDE) Programa em C: MeuPrograma.c Compilador: gcc MeuPrograma.c , por exemplo Programa executvel: MeuPrograma.o ou MeuPrograma.exe , por exemplo a O programa chamado (executado) e Figura 1.1: O ciclo de desenvolvimento, compilao e execuo de um programa em C ca ca
i n c i o A = 10; B = 23; C = A + B; Mostrar o v a l o r de C ; fim

1 2 3 4 5 6

A e B so chamadas variveis, como na matemtica, e recebem valores numricos (10 e 23, respectivamente). a a a e A e B so somadas e o resultado gravado (armazenado) em outra varivel chamada C. Por m, o resultado a e a da soma mostrado ou exibido para uma pessoa (ou usurio) qualquer. e a Em geral, um programa de computador tem uma entrada, ou dados de entrada, executa uma computao ca (faz alguma coisa com estes dados) e exibe uma sa da. No exemplo do algoritmo 1.1, podemos adaptar os comandos A = 10; e B = 23; como a entrada de dados. C = A + B; a computao em si (executar uma soma, no caso). Por m, o enunciado Mostrar o valor de e ca C; a sa do programa (mostrar ao usurio o valor da soma, no caso, 33). e da a

1.3

Varivel a

Computadores executam operaes matemticas e comparaes de valores no processador (CPU). Os valores co a co usados nas operaes matemticas e nas comparaes cam armazenados (gravados) na memria principal. Para co a co o saber o que est aonde, a memria dividida em clulas e estas clulas possuem endereos (como o nmero da a o e e e c u sua casa). Uma varivel o nome dado a um endereo de memria ou, em outras palavras, uma varivel um endereo a e c o a e c de memria. o Como vimos no algoritmo 1.1, variveis podem receber valores (A = 10, B = 23). Este comando chamado a e

1.4 Tipos de variveis a atribuio de valores. ca

1.4

Tipos de variveis a

As variveis podem ser de diversos tipos. Um deles o tipo numrico. Variveis numricas podem ser, por a e e a e exemplo, do tipo inteiro (int) (3 , 0 , 4 , 8) ou do tipo real (oat) (3.14 , 5.67 , 9 , 4 , 0). Vejamos o algoritmo 1.1 com a declaraao expl c cita do tipo das variveis (algoritmo 1.2) a Algoritmo/Programa 1.2: Algoritmo c/ declarao de tipos ca
1 2 3 4 5 6 7 8 9

i n c i o int x ; int y ; i n t soma ; x = 8; y = 25; soma = x + y ; i m p r i m i r ( soma ) ; fim

1.5

Conceitos iniciais: aplicaoes em C c

Uma vez feito o algoritmo, voc pode optar por test-lo em um computador. Para isto, ele deve ser reescrito e a em uma linguagem de programao. Dizemos que o algoritmo ser implementado nesta linguagem. Como dito ca a na Seo 1.2, usaremos a linguagem C. ca

1.5.1

O conceito de funo ca

Uma funo um trecho de cdigo (um programa) j pronto que pode ser utilizado dentro do seu programa. ca e o a Para usar uma funo pronta, basta escrever o nome dela no seu cdigo. Dizemos que estamos chamando a ca o funo. ca Para usar estas funes j prontas, precisamos avisar ao C (mais especicamente avisar ao compilador co a C) que esta funo ser usada. Isto feito incluindo bibliotecas ao programa. Bibliotecas so conjuntos de ca a e a funes prontas. co O comando em C para fazer isto : e #include <nome da biblioteca> Nos nossos primeiros programas, usaremos apenas a biblioteca bsica de entrada e sa chamada stdio.h. a da

1.5 Conceitos iniciais: aplicaes em C co Deste modo, todos os programas comearo com a incluso desta biblioteca: c a a #include <stdio.h>

1.5.2

A funo main ca

Todo programa precisa ter um ponto de partida. Um ponto a partir do qual ele ser iniciado. Em outras a palavras, a primeira instruo a ser executada. No caso do C, o programa comea pela funo principal, ca c ca chamada funo main. ca A forma de cham-la a seguinte: a e int main() Em seguida, abre-se uma chave ( { ) para indicar o in do bloco e no m da funo main esta chave cio ca e fechada ( } ) para indicar o m do bloco (ou o m da funo). ca Algoritmo/Programa 1.3: Programa vazio com include e main
1 2 3 4 5 6

#include <s t d i o . h>

i n t main ( ) { . . . . . . }

1.5.3

Primeiros exemplos de programas em C

Vamos ento ao primeiro programa em C, o programa 1.4: a Algoritmo/Programa 1.4: Programa que cria e imprime uma varivel inteira a
1 2 3 4 5 6 7 8

#include <s t d i o . h>

i n t main ( ) { int a ; a = 10; p r i n t f ( " O valor de a : % d " , a ) ; e system ( " pause " ) ; }

O Programa 1.4 comea com a declarao (linha 4) e inicializao (atribuio de um valor) ` varivel a c ca ca ca a a (linha 5). Em seguida, chamada a funo printf que corresponde ao imprimir do algoritmo. e ca A funo printf imprime um texto xo (entre aspas duplas ( )). No caso, o texto O valor de a :. O ca e e printf pode imprimir ainda valores de variveis (depois da v a rgula), no caso o valor de a. O %d informa que

1.5 Conceitos iniciais: aplicaes em C co

a uma varivel do tipo inteiro. Alm disso, o valor da varivel a ser colocado no mesmo local da frase onde e a e a a se encontra o %d. Por m, a funo system chamada com o argumento pause (linha 7), usada no Windows, faz com que ca o programa pare a execuo e pea que qualquer tecla seja digitada. Serve para que a janela de execuo do ca c ca programa no se feche e o usurio possa ver o resultado nal (ou a sa a a da) do programa. Este comando no ser a a mais inclu nos exemplos e respostas dos exerc do cios. Fica a critrio de cada um o seu uso, quando necessrio. e a E poss vel inserir comentrios ao longo de um programa. So textos que voc escreve para explicar o a a e funcionamento e documentar o desenvolvimento do programa. Eles no tem nenhuma inuncia sobre a a e execuo do programa. Para um comentrio de uma linha, basta iniciar com //. Pode-se usar // no m da ca a linha para que, a partir da exista um comentrio. Comentrios maiores, comeam com /* e terminam com , a a c */, podendo ter vrias linhas. a // Comenta linha

/* Comenta todo um trecho */ E recomendvel que nomes de variveis representem o signicado das mesmas. Use raizUm em lugar de r; a a notaDoAluno em lugar de n; etc. Insira tantos comentrios quantos julgar necessrios. a a O Programa 1.5 traz algumas novidades com relao ao 1.4. As 3 variveis so declaradas todas na mesma ca a a linha (9), feita uma soma e 3 valores so impressos pela funo printf (13). e a ca Algoritmo/Programa 1.5: Programa que soma dois nmeros u
1 2 3 4 5 6 7 8 9 10 11 12 13 14

/ Programa d e s e n v o l v i d o p e l o Prof . Jabour em mar o de 2 0 1 1 . c O programa soma d o i s n meros , e x i b e a soma e u o r e s u l t a d o /

#include <s t d i o . h>

i n t main ( ) { int a , b , c ; a = 10; b = 32; c = a + b; // e x e c u c a o do c l c u l o a // i m p r e s s a o do r e s u l t a d o // d e c l a r a c a o de v a r i v e i s a

p r i n t f ( "\n%d + %d = %d\n" , a , b , c ) ; }

Os operadores aritmticos so relacionados a seguir: e a

1.6 Exerc cios Propostos + Adio ca Subtrao ca Multiplicao ca / Diviso a

O Programa 1.6 declara 3 nmeros reais (oat). Dois deles recebem valores (so inicializados) e o terceiro u a recebe o produto dos 2 primeiros (*). A mscara %f informa que o nmero a ser impresso real e o .1 faz a u e com que o nmero seja impresso com uma casa decimal. u O comando \n faz pular uma linha. E como um enter. Chamamos de quebra de linha. Algoritmo/Programa 1.6: Programa que multiplica dois nmeros u
1 2 3 4 5 6 7 8 9

#include <s t d i o . h>

i n t main ( ) { f l o a t k , l , m; k = 8.4; l = 4.5; m = k l; p r i n t f ( " \ n %.1 f x %.1 f = %.1 f \ n " , k , l ,m) ; }

Mais um exemplo (Programa 1.7). Fazer um programa que calcule a rea do tringulo (dadas a base e a a a altura). Algoritmo/Programa 1.7: Clculo da rea do tringulo a a a
1 2 3 4 5 6 7 8 9

#include <s t d i o . h>

i n t main ( ) { float b , h , area ; b = 10; h = 3.5; area = b h / 2; p r i n t f ( " \ nbase = % f ; altura = % f ; area = %6.3 f \ n " , b , h , a r e a ) ; }

1.6
1.6.1

Exerc cios Propostos


Mdia aritmtica e e

Faa um programa que receba trs notas, calcule e mostre a mdia aritmtica entre elas. c e e e

1.6 Exerc cios Propostos

1.6.2

Mdia ponderada e

Faa um programa que receba trs notas e seus respectivos pesos, calcule e mostre a mdia ponderada dessas c e e notas.

1.6.3

Aumento de salrio a

Faa um programa que receba o salrio de um funcionrio e o percentual de aumento, calcule e mostre o c a a valor do aumento e o novo salrio. a

1.6.4

Salrio base com graticao e impostos a ca

Faa um programa que receba o salrio-base de um funcionrio, calcule e mostre o salrio a receber, sabendoc a a a se que esse funcionrio tem graticao de 5% sobre o salrio-base e paga imposto de 7% sobre salrio-base. a ca a a

1.6.5

Operaes com um n mero co u

Faa um programa que receba um nmero positivo e maior que zero, calcule e mostre: c u

1. O nmero digitado ao quadrado; u 2. O nmero digitado ao cubo; u 3. A metade do nmero digitado; u 4. O sucessor do nmero digitado. u

1.6.6

Preo do carro, impostos e lucro c

O custo ao consumidor de um carro novo a soma do preo de fbrica com o percentual de lucro do e c a distribuidor e dos impostos aplicados ao preo de fbrica. Faa um programa que receba o preo de fbrica de c a c c a um ve culo, o percentual de lucro do distribuidor e o percentual de impostos. Calcule e mostre:

O valor correspondente ao lucro do distribuidor; O valor correspondente aos impostos; O preo nal do ve c culo.

1.6 Exerc cios Propostos

1.6.7

Clculo de salrio a a

Faa um programa que receba o nmero de horas trabalhadas e o valor do salrio m c u a nimo. Calcule e mostre o salrio a receber seguindo as regras abaixo: a

A hora trabalhada vale a metade do salrio m a nimo; O salrio bruto equivale ao nmero de horas trabalhadas multiplicado pelo valor da hora trabalhada; a u o imposto equivale a 3% do salrio bruto; a O salrio a receber equivale ao salrio bruto menos o imposto. a a

1.6.8

Saldo da conta aps emisso de cheques o a

Um trabalhador recebeu seu salrio e o depositou em sua conta corrente bancria. Esse trabalhador emitiu a a dois cheques e agora deseja saber seu saldo atual. Sabe-se que cada operao bancria de retirada paga CPMF ca a de 0, 38% e o saldo inicial da conta est zerado. Faa um programa que receba o valor do salrio e dos dois a c a cheques emitidos e calcule o saldo atual.

1.6.9

Consumo de rao de gatos ca

Pedro comprou um saco de rao com peso em quilos. Pedro possui dois gatos para os quais fornece a ca quantidade de rao em gramas. Faa um programa que receba o peso do saco de rao e a quantidade de rao ca c ca ca fornecida para cada gato. Calcule e mostre quanto restar de rao no saco aps cinco dias. a ca o

1.6.10

Medida da escada enconstada

Faa um programa que receba a medida do ngulo formado por uma escada apoiada no cho e encostada c a a na parede (ngulo entre a escada e o cho) e a altura da parede onde est a ponta da escada. Calcule e mostre a a a a medida desta escada. Resposta: programa 9.1.

Cap tulo 2

O comando if-else (se-seno) a


2.1 Descrio e exemplos ca

E comum termos que tomar decises ao longo do algoritmo. Imagine que, se um valor for positivo, uma o ao ser tomada. Se ele for zero ou positivo, outra ao necessria. Este tipo de deciso representado pelo ca a ca e a a e comando se. Vamos ver como a sintaxe do se (Algoritmo 2.1): e Algoritmo/Programa 2.1: O comando se
1 2 3 4 5 6

se ( condio ) { ca comando 1 ; comando 2 ; . . . comando n ; }

A condio entre parnteses (depois do se) avaliada. Se o resultado por verdadeiro, o programa executa ca e e o bloco de instrues entre chaves, que vem em seguida (comando 1, comando 2, etc., comando n). Se for falso, co o programa simplesmente pula este bloco e continua a execuo aps o fechamento da chave correspondente. ca o Assim, se a condio for (a < 30), por exemplo, caso o valor de a seja 23, o resultado ser verdadeiro ca a e os comandos dentro do se sero executados. Dizemos que o programa entrou no se. Se a valer 234, por a exemplo, a condio ser falsa e o programa pular o bloco entre chaves depois do se. Dizemos que o programa ca a a no entrou no se. a Resumindo, condio assume um valor lgico (verdadeiro ou falso). Se for verdadeiro, executa-se o ca o interior das chaves do se for falso, no. a

2.1 Descrio e exemplos ca A Tabela 2.1 mostra os operadores relacionais e a Tabela 2.2 os operadores lgicos. o Operador > < >= <= == != Signicado maior menor maior ou igual menor ou igual igual diferente (no igual) a

10

Tabela 2.1: Operadores relacionais

Operador && || !

Signicado e ou negao (no) ca a

Tabela 2.2: Operadores lgicos o

Exemplo: Fazer um algoritmo que l um valor inteiro e imprime o valor caso ele seja maior que 10. e Soluo (Algoritmo 2.2) ca Algoritmo/Programa 2.2: Uso do comando se
1 2 3 4 5 6 7

i n c i o int v a l o r ; ler ( valor ) ; s e ( v a l o r > 10 ) { imprima ( v a l o r ) } fim

A forma geral do comando se, incorpora tambm um seno. Deste modo, a condio avaliada. Se for e a ca e verdadeira, procede-se como descrito acima. Se for falsa, o bloco aps o seno executado. Veja a estrutura o a e no Algoritmo 2.3: Algoritmo/Programa 2.3: O comando se-seno a
1 2 3 4 5 6 7

se ( condio ) { ca comando 1 ; comando 2 ; . . . comando n ; } senao {

2.1 Descrio e exemplos ca

11

8 9 10 11 12

comando n+1; comando n+2; . . . comando n+ m; }

Exemplo (Algoritmo 2.4): Fazer um algoritmo que receba a idade de uma pessoa e informe se ela maior e ou menor de idade. Algoritmo/Programa 2.4: Uso do comando se-seno a
1 2 3 4 5 6 7 8 9 10

i n c i o int idade ; l e r ( idade ) ; s e ( i d a d e >= 1 8 ) { imprima ( " maior de idade " ) ; E } senao { imprima ( " menor de idade " ) ; E } fim

Outro exemplo (Algoritmo 2.5): Faa um algoritmo que leia o salrio base do empregado e o seu total de c a vendas. Em seguida calculado o salrio nal do empregado. O empregado que vendeu mais de R$ 1000 recebe e a um bnus de 20% em seu salrio nal, calculado sobre o salrio base. O total de vendas no se incorpora ao o a a a salrio nal, sendo usado apenas como critrio de distribuio do bnus. a e ca o Algoritmo/Programa 2.5: Uso do comando se-seno a
1 2 3 4 5 6 7 8 9 10 11 12

i n c i o f l o a t s a l a r i o B a s e , s a l a r i o F i n a l , vendas ; ler ( salarioBase ) ; l e r ( vendas ) ; s e ( vendas > 1 0 0 0 ) { salarioFinal = salarioBase 1.2; } senao { salarioFinal = salarioBase ; } imprima ( s a l a r i o F i n a l ) ; fim

E poss que, dentro de um bloco do se e/ou do blocoseno, tenhmos outro ou outros se-seno. E o vel a a a que chamamos de aninhamento de se. Vejamos atravs de um exemplo, no Algoritmo 2.6. e Considere o critrio de aprovao no IF Sudeste MG. Quando o aluno possui menos de 75% de frequncia, e ca e ele est reprovado, independente da nota. Possuindo frequncia suciente, so 3 as possibilidades. Nota igual a e a

2.2 if-else: aplicaes em C co

12

ou superior a 60 aprova o aluno. Nota entre 40 (inclusive) e 59 o coloca em prova nal e nota menor que 40 o reprova. A dupla reprovao (frequncia menor que 75% e nota menor que 40) registrada como reprovao ca e e ca por infrequncia). Faa o algoritmo que leia nota e frequncia e informe o resultado nal do aluno. e c e Algoritmo/Programa 2.6: se-seno aninhados a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

i n c i o f l o a t nota , f r e q u e n c i a ; l e r ( nota ) ; ler ( frequencia ) ; s e ( f r e q u e n c i a < 75 ) { imprima ( " reprovado por infrequ^ ncia " ) ; e } senao { s e ( nota >= 60 ) { imprima ( " aprovado " ) ; } senao { s e ( nota >= 40 ) { imprima ( " prova final " ) ; } senao { imprima ( " reprovado por nota " ) ; } } } fim

Material desenvolvido por Filippe Jabour - http://www.jabour.com.br.

2.2
2.2.1

if-else: aplicaoes em C c
A funo scanf ca

Para ler caracteres a partir do teclado usamos a funo scanf. Ela necessita da mscara aos mesmos moldes ca a da printf. Outro argumento passado ` funo o endereo da varivel que receber o que foi digitado. a ca e c a a Exemplos: scanf(%d,&var) recebe uma varivel inteira (%d) digitada via teclado e grava o valor digitado no a endereo (&) da varivel var. Assim, se voc digitar 34 e teclar enter, a varivel var passar a ter o valor 34. c a e a a

2.2 if-else: aplicaes em C co

13

2.2.2

Uso do se-seno (if-else) em C a

Primeiro vamor a um exemplo muito simples, apenas com o uso do scanf (Programa 2.7). Algoritmo/Programa 2.7: Um exemplo simples com scanf
1 2 3 4 5 6 7 8

# include <s t d i o . h>

i n t main ( ) { int a ; p r i n t f ( " \ nDigite um valor para a : " ) ; s c a n f ( " % d " ,&a ) ; // n e s t a l i n h a , o v a l o r d i g i t a d o g r a v a d o no e n d e r e c o de a e

p r i n t f ( " \ nVoc^ digitou : % d \ n " , a ) ; e }

Agora, no Programa 2.8, o scanf com um if simples. Algoritmo/Programa 2.8: Um if simples


1 2 3 4 5 6 7 8 9 10

#include <s t d i o . h>

i n t main ( ) { int a ; p r i n t f ( " \ nDigite um n mero : " ) ; u s c a n f ( " % d " ,&a ) ; i f ( a >10) { p r i n t f ( " \ n % d e maior que 10.\ n " , a ) ; } }

Programa 2.9, com if-else. Algoritmo/Programa 2.9: if-else simples


1 2 3 4 5 6 7 8 9 10 11 12 13

#include <s t d i o . h>

i n t main ( ) { int a ; p r i n t f ( " \ nDigite um n mero : " ) ; u s c a n f ( " % d " ,&a ) ; i f ( a >10) { p r i n t f ( " \ n % d e maior que 10.\ n " , a ) ; } else { p r i n t f ( " \ n % d e menor ou igual a 10.\ n " , a ) ; } }

2.2 if-else: aplicaes em C co

14

Exemplo (Programa 2.10): Leia a idade da pessoa e direcione para uma la de idoso quando for maior que 60 anos; informe que no pode entrar quando for menor de 18 anos e direcione para a la comum quando for a maior de idade e menor que 60 anos. Algoritmo/Programa 2.10: if-else com aninhamento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

#include <s t d i o . h>

i n t main ( ) { int idade ; p r i n t f ( " \ nDigite a idade : " ) ; s c a n f ( " % d " ,& i d a d e ) ; i f ( i d a d e >= 60 ) { // o b s e r v e o uso de maior ou i g u a l

p r i n t f ( " \ nDirija - se ` fila preferencial .\ n " ) ; a } else { i f ( i d a d e >= 1 8 ) { / Como estamos no e l s e de i d a d e >= 6 0 , a i d a d e j a < 6 0 . Entrando n e s t e i f , e l a e tambm maior de i d a d e . Logo : e e / p r i n t f ( " \ nDirija - se ` fila comum .\ n " ) ; a } else { p r i n t f ( " \ nEntrada proibida .\ n " ) ; } } }

Veja no Programa 2.11 a implementao em C do Algoritmo 2.6. ca Algoritmo/Programa 2.11: if-else com aninhamento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

#include <s t d i o . h>

i n t main ( ) { f l o a t nota , f r e q u e n c i a ; p r i n t f ( " \ nNota : " ) ; s c a n f ( " % f " ,& nota ) ; p r i n t f ( " \ nFrequ^ ncia : " ) ; e s c a n f ( " % f " ,& f r e q u e n c i a ) ; i f ( f r e q u e n c i a < 75 ) { p r i n t f ( " \ nReprovado por infrequ^ ncia .\ n " ) ; e } else { i f ( nota >= 60 ) { p r i n t f ( " \ nAprovado \ n " ) ; } else {

2.3 Exerc cios Propostos

15

17 18 19 20 21 22 23 24 25

i f ( nota >= 40 ) { p r i n t f ( " \ nProva final .\ n " ) ; } else { p r i n t f ( " \ nReprovado por nota .\ n " ) ; } } } }

2.3
2.3.1

Exerc cios Propostos


Adivinhar um n mero u

Faa um programa que gere um nmero aleatrio de 0 a 9, receba um palpite via teclado e informe se o c u o palpite certo ou errado. e Dicas:

u ca A linha srand ( time(NULL) ); faz com que o nmero gerado varie a cada execuo do programa. u o ca a A linha numeroGerado = rand(); gera um nmero aleatrio (funo rand()) e atribui este valor ` varivel numeroGerado. a O operador % chamado operador mdulo ou resto da diviso. Assim, x = y % 10; atribui ` e o a a varivel x o resto da diviso de y por 10. Ou seja, se y = 23, x receber o valor 3. a a a O nmero gerado com a funo rand() grande. Se aplicarmos o aperador mdulo deste nmero grande u ca e o u por 10, por exemplo, teremos sempre o resto da diviso por 10, o que ser um nmero de zero a 9. a a u Teste de igualdade em C feito com == e no apenas com um =. e a

a Resposta: programa 9.2. No olhe a resposta antes de tentar vrias vezes, antes de discutir com os colegas, a procurar o professor, o monitor, etc.

2.3.2

Vericar se um n mero par ou u e mpar

Faa um programa que receba um nmero via teclado e verique se este nmero par ou c u u e mpar. Resposta: programa 9.3.

2.3 Exerc cios Propostos

16

2.3.3

Achar o maior de 3 n meros u

Faa um programa que receba 3 nmeros via teclado e imprima o maior deles. c u Resposta: programa 9.4.

2.3.4

Vericar se um n mero positivo, negativo ou nulo u e

Ler um nmero e informar se ele positivo, negativo ou nulo. u e Resposta: programa 9.5.

2.3.5

Equao do segundo grau ca

Faa um programa que receba os 3 coecientes e encontre a(s) ra c z(es) reais da equao do segundo grau. ca No aceite o coeciente de x2 igual a zero. a Resposta: programa 9.6.

2.3.6

Soma n meros e escolhe uma operao com base no resultado da soma u ca

Faa um programa que recebe dois nmeros e efetua a adio. Caso o valor somado seja maior que 20, c u ca este dever ser apresentado somando-se a ele 8; caso o valor somado seja menor ou igual a 20, este dever ser a a apresentado subtraindo-se 5. Resposta: programa 9.7.

2.3.7

Verica se emprstimo pode ser concedido e

Uma empresa abriu uma linha de crdito para os funcionrios. O valor da prestao no pode ultrapassar e a ca a 30% do salrio. Faa um programa que receba o salrio, o valor do emprstimo e o nmero de prestaes e a c a e u co informe se o emprstimo pode ser concedido. Nenhum dos valores informados pode ser zero ou negativo. e Resposta: programa 9.8.

Cap tulo 3

Switch-case (escolha-caso)
3.1 Descrio e exemplos ca

O comando if-else permite uma deciso que direcione o uxo de execuo do algoritmo em dois caminhos a ca diferentes. O programa segue para o if ou para o else. Existe um comando que tem mltiplos caminhos poss u veis. Trata-se do comando escolha-caso. Existem algumas opes poss co veis e o programa executa uma delas, de acordo com uma comparao de igualdade feita. ca A estrutura do escolha-caso dada no algoritmo 3.1. e Algoritmo/Programa 3.1: O comando escolha-caso
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

escolha ( variavel ) { caso valor 1 : comando 1 ; comando 2 ; . . . comando n pare ; caso valor 2 : comando n +1; comando n +2; . . . comando n+k pare ; caso valor 3 : comando n+k +1; comando n+k +2; . . . comando n+k+ m pare ;

3.1 Descrio e exemplos ca

18

20 21 22 23 24 25 26 27

. . . . . . default : comando n+k+ +y +1; m m comando n+k+ +y +2; . . . comando n+k+ +y+x ; m }

O valor da varivel entre parnteses, ` frente da palavra escolha, comparado a cada valor i ` frente de a e a e a cada caso. Ao ser encontrado um valor igual (apenas a igualdade testada), a sequncia de comandos a e e seguir executada at o comando pare. e e Vamos ao primeiro exemplo (algoritmo 3.2): Algoritmo/Programa 3.2: Exemplo simples com escolha-caso
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

i n c i o int x ;

e s c r e v a ( " Digite um n mero " ) ; u ler (x) ;

escolha (x) { caso 1: imprima ( " Voc^ digitou 1 " ) ; e pare ; caso 2: imprima ( " Voc^ digitou 2 " ) ; e pare ; caso 3: imprima ( " Voc^ digitou 3 " ) ; e pare ; default : imprima ( " Voc^ n~ o digitou 1 , nem 2 , nem 3 " ) ; e a } fim

O funcionamento o seguinte: o valor da varivel x comparado a cada uma das constantes de cada caso e a e (valores ` frente da palavra caso) (1, 2 ou 3, neste exemplo). Se for igual, o bloco de comando aps os dois a o pontos (:) executado at o comando pare. Se no for igual a nenhuma das opes, o bloco correspondente ` e e a co a opo default executado. ca e Como mencionado, a escolha poder ser feita apenas com nmeros inteiros ou caracteres (uma letra, por a u exemplo) e o teste de cada caso (case) s testa a igualdade (no testa >, <, >=, etc, como pode ocorrer no se o a (if )).

3.1 Descrio e exemplos ca

19

Vamos a um exerc cio: escrever um algoritmo que leia um peso na Terra e o nmero de um planeta e u imprima o valor deste peso no planeta escolhido. A relao de planetas dada na Tabela 3.1, juntamente com ca e os valores das gravidades relativas ` da Terra. a Nmero u 1 2 3 4 5 6 7 Gravidade relativa 0.376 0.903 0.380 2.340 1.160 1.150 1.190 Planeta Mercrio u Vnus e Marte Jpiter u Saturno Urano Netuno

Tabela 3.1: Gravidades relativas em outros planetas

A seguir a soluo, no algoritmo 3.3. ca Algoritmo/Programa 3.3: Clculo do peso em outros planetas a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

i n c i o int p l a n e t a E s c o l h i d o ; f l o a t pesoNaTerra , g r a v i d a d e R e l a t i v a , pes oN oPl an et a ;

e s c r e v a ( " Planetas " ) ; e s c r e v a ( " 1 - Merc rio " ) ; u e s c r e v a ( " 2 - V^ nus " ) ; e e s c r e v a ( " 3 - Marte " ) ; e s c r e v a ( " 4 - J piter " ) ; u e s c r e v a ( " 5 - Saturno " ) ; e s c r e v a ( " 6 - Urano " ) ; e s c r e v a ( " 7 - Netuno " ) ; e s c r e v a ( " Digite o n mero do planeta escolhido : " ) ; u l e r ( planetaEscolhido ) ;

e s c r e v a ( " Informe seu peso na Terra : " ) ; l e r ( pesoNaTerra ) ;

escolha ( planetaEscolhido ) { caso 1: gravidadeRelativa = 0.376; pare ; caso 2: gravidadeRelativa = 0.903; pare ; caso 3: gravidadeRelativa = 0.380;

3.2 switch-case: aplicaes em C co

20

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

pare ; caso 4: gravidadeRelativa = 2.340; pare ; caso 5: gravidadeRelativa = 1.160; pare ; caso 6: gravidadeRelativa = 1.150; pare ; caso 7: gravidadeRelativa = 1.190; pare ; default : gravidadeRelativa = 0; }

s e ( g r a v i d a d e R e l a t i v a != 0 ) { pe so NoP la ne ta = pesoNaTerra g r a v i d a d e R e l a t i v a ; e s c r e v a ( " Seu peso no planeta escolhido " , pes oN oPl an et a ) ; e } senao { e s c r e v a ( " Erro na escolha do planeta . " ) ; }

fim

Em C, o comando escolha-caso corresponde ao switch-case e o pare corresponde ao break.

3.2

switch-case: aplicaoes em C c

A sintaxe da estrutura switch-case em C est no trecho de programa 3.4. a Algoritmo/Programa 3.4: O comando switch-case
1 2 3 4 5 6 7 8 9 10 11

switch ( v a r i v e l ) { a case v a l o r 1 : comando 1 ; comando 2 ; . . . comando n break ; case v a l o r 2 : comando n +1; comando n +2; . . .

3.3 Exerc cios Propostos

21

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

comando n+k break ; case v a l o r 3 : comando n+k +1; comando n+k +2; . . . comando n+k+ m break ; . . . . . . default : comando n+k+ +y +1; m m comando n+k+ +y +2; . . . comando n+k+ +y+x ; m }

3.3
3.3.1

Exerc cios Propostos


Peso nos planetas

Implementar em C o algoritmo 3.3. Resposta: programa 9.9.

3.3.2

Questo de m ltipla escolha a u

Fazer um programa que mostre uma questo de mltipla escolha com 5 opes (letras a, b, c, d, e e). a u co Sabendo a resposta certa, receber a opo do usurio e informar a letra que o usurio marcou e se a resposta ca a a est certa ou errada. Usar o tipo char para armazenar a varivel de teste do switch. Ela pode ser lida do a a teclado com scanf e a mscara %c ou com a funo getchar() (opcao = getchar()). Na comparao do a ca ca case, deve-se colocar o valor a ser comparado entre aspas simples: case a:, por exemplo. Resposta: programa 9.10.

3.3.3

Calculadora simples

Fazer um programa que l dois nmeros, l a operao desejada ( + - * / ), faz a operao pedida e mostra e u e ca ca o resultado. A operao escolhida deve ser armazenada em uma varivel do tipo char. ca a Resposta: programa 9.11.

Cap tulo 4

For (para)
4.1 Descrio e exemplos ca

E comum termos um trecho de cdigo (conjunto de instrues) que precise ser repetido vrias vezes (execuo co a tado vrias vezes), at que uma condio seja satisfeita (ou at que uma condio deixe de ser satisfeita). Uma a e ca e ca das formas disto ser feito atravs da estrutura para (for em C). Material desenvolvido por Filippe Jabour - http://www.jabour.com.br. e e A forma geral do comando para (chamado de lao) a seguinte: c e para ( inicializao ; condio ; incremento ) { ca ca comando 1; comando 2; . . . comando n; }

A inicializao geralmente uma atribuio, ou seja, uma varivel recebe um valor inicial. Esta varivel ca e ca a a e chamada varivel de controle do lao. A condio um teste lgico que verica se o lao ser executado. a c ca e o c a E sempre testada no in e, somente se for verdadeira, o interior do lao executado. O incremento dene cio c e como a varivel de controle do lao varia cada vez que o lao repetido. a c c e Vejamos um exemplo no algoritmo 4.1. Algoritmo/Programa 4.1: Um exemplo simples com o lao para c
1 2 3 4

i n c i o int i ;

para ( i = 0 ; i < 100 ; i = i + 1 ) {

4.1 Descrio e exemplos ca

23

5 6 7 8

imprima ( i ) ; }

fim

A varivel i recebe inicialmente o valor 0. O teste lgico (condio de permanncia) i < 100 feito a o ca e e e retorna verdadeiro. Deste modo, o lao executado e o valor 0 impresso. Ao nal do lao, a varivel i c e e c a e incrementada em uma unidade e passa a valer 1 (i = i + 1). A condio continua verdadeira pois 1 < 100. ca Assim, o lao executado novamente e o valor 1 impresso. Isto se repete at que i assuma o valor 100. Com c e e e i = 100, a condio se torna falsa e o lao abandonado (o algoritmo passa para a prxima instruo aps a ca c e o ca o chave de fechamento do bloco). Em resumo, o algoritmo imprime todos os nmeros inteiros de 0 a 99 (inclusive). u Um exerc cio: Faa um algoritmo para imprimir os nmeros pares maiores que zero e menores que 1000. c u Soluo no algoritmo 4.2. ca Algoritmo/Programa 4.2: Imprimir os nmeros pares de 0 a 1000 u
1 2 3 4 5 6 7 8

i n c i o i n t par ;

para ( par = 2 ; par < 1000 ; par = par + 2 ) { imprima ( par ) ; }

fim

Vamos agora analisar o algoritmo 4.3: Algoritmo/Programa 4.3: para com decremento da varivel a
1 2 3 4 5 6 7 8 9

i n c i o int x , y ; float z ;

para ( x = 100 ; x != 65 ; x = x 5 ) { z = x x; e s c r e v a ( " O quadrado de % d % f " , x , z ) ; e } fim

Inicialmente, as variveis so declaradas, como sempre. x a varivel de controle do lao para e inicializada a a e a c e com o valor 100. O primeiro teste atendido (d verdadeiro j que x = 65). Deste modo, o algoritmo entra no e a a para, calcula o quadrado de x (x x) e guarda o resultado na varivel z. Em seguida, os valores de x e z so a a impressos e termina o lao. Neste momento, x decrementado em 5 unidades e passa a valer 95. A condio c e ca de permanncia continua sendo atendida e o lao executado novamente. Isto ocorre at que x assuma o valor e c e e

4.2 for: aplicaes em C co 65. Neste momento x = 65 se torna falso e o lao abandonado. c e

24

O algoritmo 4.3 implementado em C encontra-se no programa 4.4 e a sa (resultado) do programa na da Tabela 4.1. Algoritmo/Programa 4.4: Algoritmo 4.3 implementado em C
1 2 3 4 5 6 7 8 9 10 11

#include <s t d i o . h>

i n t main ( ) { int x , y ; float z ;

f o r ( x = 100 ; x != 65 ; x = x 5 ) { z = x x; p r i n t f ( " \ nO quadrado de % d %.0 f " , x , z ) ; e } }

O quadrado de 100 10000 e O quadrado de 95 9025 e O quadrado de 90 8100 e O quadrado de 85 7225 e O quadrado de 80 6400 e O quadrado de 75 5625 e O quadrado de 70 4900 e Tabela 4.1: Sa do programa 4.4 da

Considere o trecho de programa abaixo: x = 10; para ( y = 10 ; y != x ; y = y + 1) { printf(\n y = %d,y); }

Observe que o interior do lao nunca ser executado. Como x = y, o teste x = y j dar falso da primeira c a a a vez.

4.2

for: aplicaoes em C c

A sintaxe do for:

4.2 for: aplicaes em C co

25

for ( inicializao ; condio ; incremento ) { ca ca comando 1; comando 2; . . . comando n; }

Observao: comum o uso de y + + no lugar de y = y + 1. Da mesma forma, x a mesma coisa que ca e e x = x 1. Vamos a um exemplo: imprimir os nmeros u mpares existentes entre 30 e 100. A soluo est no proca a grama 4.5: Algoritmo/Programa 4.5: Imprimir os mpares de 30 a 100
1 2 3 4 5 6 7 8 9 10 11 12

#include <s t d i o . h>

i n t main ( ) { i n t impar ;

p r i n t f ( " \ n mpares entre 30 e 100: " ) ; I

f o r ( impar = 31 ; impar < 100 ; impar = impar + 2 ) { p r i n t f ( " %d , " , impar ) ; } p r i n t f ( "\n" ) ; }

Bastou identicar que o primeiro mpar era o 31, inicializar a varivel de controle com este valor e rodar o a for de 2 em 2, at o limite de 100. e Em C, x = x + 2 a mesma coisa que x += 2; y = y 5 a mesma coisa que y = 5; z = z 8 a mesma e e e coisa que z = 8; k = k/9 a mesma coisa que k /= 9; e assim por diante. e Na opo incremento, a terceira do comando for, podemos ter operaes com mais de uma varivel. ca co a Observe no programa 4.6 que as trs variveis i, x e y so modicadas a cada rodada do lao (cada rodada do e a a c for tambm chamada de iterao). e e ca Algoritmo/Programa 4.6: 3 variveis mudando a cada iterao a ca
1 2 3 4 5 6

#include <s t d i o . h>

i n t main ( ) {

int i , x = 2 , y = 2 0 ;

4.2 for: aplicaes em C co

26

7 8

f o r ( i = 1 ; i < 10 ; i ++, x = 2 , y = 1 ) { p r i n t f ( "\n i = %d \t x = %d \t y = %d " , i , x , y ) ; ( tabulaao ) c // \ t c o r r e p o n d e a um TAB

9 10 11 12 13

p r i n t f ( "\n" ) ;

Podemos ter aninhamento de laos for, ou seja, um for dentro do outro. Veja o programa 4.7: c Algoritmo/Programa 4.7: Um for dentro do outro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

#include <s t d i o . h>

i n t main ( ) {

int i , j ;

p r i n t f ( " \ n Impress~ o de (i , j ) \ n " ) ; a

f o r ( i = 0 ; i < 10 ; i++ ) { p r i n t f ( "\n" ) ; f o r ( j = 0 ; j < 10 ; j++ ) p r i n t f ( " \ t (% d , % d ) " , i , j ) ; }

p r i n t f ( "\n\n" ) ;

A sa em v da deo ser a seguinte: a (0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 0) (1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (1, 7) (1, 8) (1, 9) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (2, 5) (2, 6) (2, 7) (2, 8) (2, 9) (3, 0) (3, 1) (3, 2) (3, 3) (3, 4) (3, 5) (3, 6) (3, 7) (3, 8) (3, 9) (4, 0) (4, 1) (4, 2) (4, 3) (4, 4) (4, 5) (4, 6) (4, 7) (4, 8) (4, 9) (5, 0) (5, 1) (5, 2) (5, 3) (5, 4) (5, 5) (5, 6) (5, 7) (5, 8) (5, 9) (6, 0) (6, 1) (6, 2) (6, 3) (6, 4) (6, 5) (6, 6) (6, 7) (6, 8) (6, 9) (7, 0) (7, 1) (7, 2) (7, 3) (7, 4) (7, 5) (7, 6) (7, 7) (7, 8) (7, 9) (8, 0) (8, 1) (8, 2) (8, 3) (8, 4) (8, 5) (8, 6) (8, 7) (8, 8) (8, 9) (9, 0) (9, 1) (9, 2) (9, 3) (9, 4) (9, 5) (9, 6) (9, 7) (9, 8) (9, 9)

4.3 Exerc cios Propostos

27

4.3
4.3.1

Exerc cios Propostos


Adivinhar um n mero com n tentativas u

Modique o exerc 2.3.1 de modo que o usurio informe quantas tentativas de adivinhao quer fazer. O cio a ca programa permite ento que ele tente este nmero de vezes informado ou acaba caso ele acerte antes. a u Obs.: O comando break interrompe o lao for. c Resposta: programa 9.12.

4.3.2

Menu de opoes e um for c

Fazer um algoritmo que tenha um menu que permita ao usurio escolher 5 opes de exibio de potncias. a co ca e As opes permitem escolher as potncias de 2, 3, 5, 10 ou 15. De acordo com a opo escolhida, o programa co e ca exibir todas as potncias do nmero escolhido que sejam menores que 10000. a e u Resposta: programa 9.13.

4.3.3

Progresso aritmtica a e

Considere uma progresso aritmtica (PA). Faa um programa que receba o termo inicial a1 , a razo r e o a e c a ` nmero de termos a serem gerados. Em seguida, a PA impressa, com 10 termos por linha. A medida que a u e PA vai sendo gerada, a soma dos termos calculada (vai sendo acumulada). Ao nal, esta soma impressa e e e e feita uma vericao de acerto atravs da frmula da soma dos termos da PA dada pela expreso 4.1. ca e o a

Sn = Resposta: programa 9.14.

n (a1 + an ) 2

(4.1)

4.3.4

Sequncia de Fibonacci e

Faa um programa que receba um nmero n e gere os n primeiros nmeros da sequncia de Fibonacci c u u e denida na frmula 4.2. o

0, se n = 0; F (n) = 1, se n = 1; F (n 1) + F (n 2) outros casos.

(4.2)

4.3 Exerc cios Propostos Resposta: programa 9.15.

28

4.3.5

Par de n meros com soma denida u

Faa um programa que leia um valor inteiro no negativo e imprima todos os pares de nmeros inteiros no c a u a negativos cuja soma seja igual a este nmero. Considere que o par x, y diferente de y, x e deve ser impresso u e duas vezes. Dica que pode ser uma usada em uma soluo: a inicializao do for (primeira opo entre parnteses), ca ca ca e pode conter mais de uma varivel. Por exemplo: for ( x = 0, y = 100; etc. . . ). a Resposta: programa 9.16.

4.3.6

Soma de alguns n meros digitados u

Faa um programa que receba 10 nmeros via teclado e imprima a soma dos nmeros cujos quadrados sejam c u u menores que 225. Resposta: programa 9.17.

4.3.7

Achar os divisores de um n mero u

Ler um nmero e imprimir todos os seus divisores. u Resposta: programa 9.18.

4.3.8

Imprimir somente acima da diagonal principal

Considere a sa do programa 4.7 como uma matriz. Modique este programa para que apenas a diagonal da principal e os dados acima dela sejam impressos. Resposta: programa 9.19.

Cap tulo 5

while e do-while (enquanto e faa-enquanto) c


5.1 Descrio e exemplos ca

Neste cap tulo vamos estudar dois outros comandos de repetio. O primeiro deles o enquanto e sua ca e forma geral a seguinte: e enquanto ( condio ) { ca comando 1; comando 2; . . . comando n; }

A condio um teste lgico que verica se o lao ser executado. E sempre testada no in e, somente ca e o c a cio se for verdadeira, o interior do lao executado. Cada vez que o enquanto executado, ao se atingir o m c e e do lao (}), a execuo volta ao in (enquanto ( condio ) {), a condio testada novamente. Se for c ca cio ca ca e verdadeira, o lao executado novamente, se for falsa, a execuo segue para a prxima instruo aps o lao. c e ca o ca o c O algoritmo 5.1 apresenta um primeiro exemplo. Algoritmo/Programa 5.1: Um exemplo simples com o lao enquanto c
1 2 3 4

i n c i o

i n t par = 2 ;

5.1 Descrio e exemplos ca

30

5 6 7 8 9 10

enquanto ( par <= 1000 ) { e s c r e v a ( par ) ; par = par + 2 ; }

fim

A varivel par recebe inicialmente o valor 2. O teste lgico (condio de permanncia) par 1000 a o ca e e feito e retorna verdadeiro. Deste modo, o lao executado e o valor 2 impresso. Ao nal do lao, a varivel c e e c a par incrementada em duas unidades e passa a valer 4 (par = par + 2). A condio continua verdadeira pois e ca 4 1000. Assim, o lao executado novamente e o valor 4 impresso. Isto se repete at que par assuma o c e e e valor 1002. Com par = 1002, a condio se torna falsa e o lao abandonado (o algoritmo passa para a prxima ca c e o instruo aps a chave de fechamento do bloco). Em resumo, o algoritmo imprime todos os nmeros pares de ca o u 2 (inclusive) a 1000 (inclusive). O outro comando o faa-enquanto. Ele semelhante ao enquanto, mas o teste lgico (condio) e c e o ca e feito no m do bloco. Sua forma geral a seguinte: e faa { c comando 1; comando 2; . . . comando n; } enquanto ( condio ); ca

Observe que a condio ca depois das chaves de fechamento do bloco, que o bloco executado pelo menos ca e uma vez e que se usa o ponto e v rgula ao nal da condio. ca Vejamos ento, no Algoritmo 5.2, como ca o Algoritmo 5.1 (pares de 2 a 1000) desenvolvido com o faaa c enquanto: Algoritmo/Programa 5.2: Um exemplo simples com o lao faa-enquanto c c
1 2 3 4 5 6 7 8 9 10

inicio

i n t par = 2 ;

faa { c e s c r e v a ( par ) ; par = par + 2 ; } enquanto ( par <= 1 0 0 0 ) ;

fim

5.2 while e do-while: aplicaes em C co

31

Observe que o 2 impresso inicialmente sem que qualquer condio seja testada (entra do lao sempre). e ca c Aps a impresso do 2, o valor da varivel par incrementado em duas unidades e o teste feito (4 1000 ?). o a a e e Este teste retorna verdadeiro at par valer 1000. Neste momento, 1000 1000 ainda retorna verdadeiro, o e lao executado, o valor 1000 impresso e par passa a valer 1002. Como 1002 1000 retorna falso, o lao c e e c e abandonado e o uxo de execuo segue para a prxima instruo aps o faa-enquanto. ca o ca o c

5.2

while e do-while: aplicaoes em C c

Em C, o enquanto substitu por while e o faa-enquanto po do-while. Veja a sintaxe: e do c while ( condio ) { ca comando 1; comando 2; . . . comando n; }

do { comando 1; comando 2; . . . comando n; } while ( condio ); ca

Como nos comandos anteriores, podemos ter aninhamento, com while dentro de while, do-while dentro de do-while, while dentro do switch, do-while dentro do for, etc, etc, etc. Podemos usar while ou do-while para repetir um menu at que o usurio escolha sair. Veja no exemplo 5.3. e a Algoritmo/Programa 5.3: Uso do while combinado com um menu de opes co
1 2 3 4 5 6 7 8 9 10 11

#include <s t d i o . h>

i n t main ( ) {

i n t opcaoDoMenu = 0 ;

while ( opcaoDoMenu != 5 ) {

p r i n t f ( " \ n Op ~ es " ) ; co p r i n t f ( " \ n 1 - Faz isso " ) ; p r i n t f ( " \ n 2 - Faz aquilo " ) ;

5.2 while e do-while: aplicaes em C co

32

12 13 14 15 16 17 18 19 20 21 22

p r i n t f ( " \ n 3 - Calcula alguma coisa " ) ; p r i n t f ( " \ n 4 - Mostra aquele resultado " ) ; p r i n t f ( " \ n 5 - Sai do programa \ n -> " ) ; s c a n f ( " % d " , &opcaoDoMenu ) ;

switch ( opcaoDoMenu ) {

case 1 : p r i n t f ( " \ nVoc^ escolheu a op ~ o 1. " ) ; e ca p r i n t f ( " \ nA op ~ o se refere a \" Fazer isso \". " ) ; ca p r i n t f ( " \ nAqui entraria o c digo que faria o que se deseja .\ n \ o n" ) ;

23 24 25 26 27 28

break ;

case 2 : p r i n t f ( " \ nVoc^ escolheu a op ~ o 2. " ) ; e ca p r i n t f ( " \ nA op ~ o se refere a \" Fazer aquilo \". " ) ; ca p r i n t f ( " \ nAqui entraria o c digo que faria o que se deseja .\ n \ o n" ) ;

29 30 31 32 33 34

break ;

case 3 : p r i n t f ( " \ nVoc^ escolheu a op ~ o 3. " ) ; e ca p r i n t f ( " \ nA op ~ o se refere a \" Calcular alguma coisa \". " ) ; ca p r i n t f ( " \ nAqui entraria o c digo que faria o que se deseja .\ n \ o n" ) ;

35 36 37 38 39 40

break ;

case 4 : p r i n t f ( " \ nVoc^ escolheu a op ~ o 4. " ) ; e ca p r i n t f ( " \ nA op ~ o se refere a \" Mostrar aquele resultado \". " ) ; ca p r i n t f ( " \ nAqui entraria o c digo que faria o que se deseja .\ n \ o n" ) ;

41 42 43 44 45 46 47 48 49 50 51 52 53 54

break ;

case 5 : p r i n t f ( " \ nVoc^ escolheu a op ~ o 5. " ) ; e ca p r i n t f ( " \ nA op ~ o se refere a \" Sair do programa \".\ n \ n " ) ; ca break ;

default : p r i n t f ( " \ nVoc^ escolheu uma op a o inv lida .\ n \ n " ) ; e c~ a

} }

5.3 Exerc cios Propostos

33

Material desenvolvido por Filippe Jabour - http://www.jabour.com.br.

5.3
5.3.1

Exerc cios Propostos


Adivinhar no at o usurio acertar ou desistir e a

Modique os exerc cios 2.3.1 e 4.3.1 de modo que o usurio possa tentar adivinhar o nmero quantas vezes a u desejar, tendo a opo de abandonar o programa quando quiser. Aumente agora o intervalo de nmeros gerados ca u para [0, 99]. Resposta: programa 9.20.

5.3.2

Preo de passagem area c e

Fazer um programa com o seguinte menu:

1. Informa preo da passagem c 2. Informa quantos preos j foram informados c a 3. Informa total em R$ j informados a 4. Sai do programa.

Para a opo 1, o programa recebe o destino e se viagem s de ida ou de ida e volta e informa o preo, ca e o c segundo a tabela abaixo: Destino Regio Norte a Regio Nordeste a Regio Centro-oeste a Regio Sul a Preo ida c R$ 500 R$ 350 R$ 350 R$ 300 Preo ida e volta c R$ 900 R$ 650 R$ 600 R$ 550

Tabela 5.1: Preo de passagens areas por regio c e a

5.3.3

L no s e exibe o maior, o menor e a quantidade e

Fazer um programa que leia n nmeros e imprima, no nal, o maior deles, o menor deles e quantos nmeros u u foram digitados. A opo para terminar de informar nmeros deve ser -999. ca u

5.3 Exerc cios Propostos

34

5.3.4

Menu para somar ou multiplicar no s

Fazer um programa com o seguinte menu:

a. Soma vrios nmeros a u b. Multiplica vrios nmeros a u c. Sai do programa

Cada opo do menu faz o que o nome sugere. ca

5.3.5

Achar o n mero de m ltiplos em um intervalo u u

Fazer um programa que leia X e N e informe quantos mltiplos de X existem entre 1 e N . Use while ou u do-while e no use diviso. a a Exemplo: Se X = 8 e N = 30, a sa do programa ser 3. Pois existem 3 mltiplos de 8 entre 1 e 30 (8, da a u 16 e 24).

Cap tulo 6

String, vetor e matriz


6.1 Vetor

Variveis armazenam um valor de um determinado tipo. Por exemplo, uma varivel do tipo int pode a a armazenar um valor do tipo inteiro (int). Por exemplo: int a; declara a varivel a. Esta varivel pode assumir o valor 10 ou 5 ou 8, etc. a a Um vetor (ou array), pode armazenar vrios valores de um determinado tipo. E como ter vrios valores a a do mesmo tipo colocados um do lado da outro e todos acessados pela varivel de mesmo nome. a Para acessar cada um destes valores, usamos um ndice numrico que determina qual deles queremos e manipular. A sintaxe a seguinte: e tipo nome[tamanho]; Por exemplo: int notas[5]; Neste exemplo queremos armazenar 5 valores do tipo int na varivel notas. a Em C, vetores comeam na posio 0. Os elementos do vetor ocupam localizaes adjacentes na memria. c ca co o Deste modo, para o exemplo acima, teremos as seguintes posies vlidas para o vetor notas: co a notas[0], notas[1], notas[2], notas[3], notas[4].

6.1 Vetor Vejamos o primeiro exemplo no programa 6.1. Algoritmo/Programa 6.1: O primeiro exemplo com vetores
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

36

#include <s t d i o . h>

i n t main ( ) {

int x ;

int vetorTeste [ 5 ] ;

vetorTeste [ 0 ] = 34; v e t o r T e s t e [ 1 ] = 3; vetorTeste [ 2 ] = 0; vetorTeste [ 3 ] = 6; v e t o r T e s t e [ 4 ] = 8;

p r i n t f ( " Elementos do vetor : " ) ; p r i n t f ( " \ nElemento da posi ~ o 0 do vetor = % d " , v e t o r T e s t e [ 0 ] ) ; ca p r i n t f ( " \ nElemento da posi ~ o 1 do vetor = % d " , v e t o r T e s t e [ 1 ] ) ; ca p r i n t f ( " \ nElemento da posi ~ o 2 do vetor = % d " , v e t o r T e s t e [ 2 ] ) ; ca p r i n t f ( " \ nElemento da posi ~ o 3 do vetor = % d " , v e t o r T e s t e [ 3 ] ) ; ca p r i n t f ( " \ nElemento da posi ~ o 4 do vetor = % d \ n " , v e t o r T e s t e [ 4 ] ) ; ca

x = vetorTeste [ 3 ] vetorTeste [ 4 ] ; p r i n t f ( " \ nElemento 3 multiplicado pelo elemento 4 = % d \ n " , x ) ;

v e t o r T e s t e [ 0 ] = 2 ; p r i n t f ( " \ nElemento da posi ~ o 0 multiplicado por 2 = % d \ n " , v e t o r T e s t e [ 0 ] ) ; ca

p r i n t f ( " \ nDigite um novo valor para o elemento 4: " ) ; s c a n f ( " % d " ,& v e t o r T e s t e [ 4 ] ) ; p r i n t f ( " \ nNovo valor do elemento da posi ~ o 4 do vetor = % d \ n \ n " , v e t o r T e s t e [ 4 ] ) ; ca

Importante: C no verica se o programa est acessando uma posio vlida do vetor. Se voc acessar uma a a ca a e posio alm do m do vetor, erros em tempo de execuo podem ocorrer. Veja abaixo um trecho de cdigo ca e ca o que pode provocar erros imprevis veis: int vetorDois[10]; int x; vetorDois[11] = 32; x = vetorDois[13];

Podemos ter variveis usadas como a ndice do vetor. Vejamos o programa 6.2:

6.2 String Algoritmo/Programa 6.2: Varivel como a ndice do vetor


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

37

#include <s t d i o . h>

i n t main ( ) {

int i ;

// tem que s e r do t i p o i n t e i r o

int vetor [ 1 0 ] ;

// d e c l a r a um v e t o r de i n t e i r o s

// I n s e r e o quadrado dos n meros de 0 a 9 em cada p o s i c o do v e t o r u a f o r ( i = 0 ; i < 10 ; i ++ ) { vetor [ i ] = i i ; }

// E x i b e o c o n t e u d o do v e t o r f o r ( i = 0 ; i < 10 ; i ++ ) { p r i n t f ( "\n%d" , vetor [ i ] ) ; }

p r i n t f ( "\n" ) ;

O ndice (nmero entre colchetes), tem que ser do tipo int. u

6.2

String

Uma string uma cadeia ou sequncia de caracteres. As strings so usadas para armazenar nomes, palavras e e a e frases. Em C, uma string consiste em um vetor de caracteres (char) terminada em zero. Mais especicamente, terminada com \0. Por essa razo, voc deve declarar o vetor de caracteres com uma posio a mais do que a e ca a maior string que voc quer que ele possa armazenar. Por exemplo, se voc quer que o vetor armazene uma e e string de at 10 posies, declare da seguinte maneira: e co char palavra[11]; A melhor maneira de ler uma string via teclado com a funo gets(): e ca gets(nome do vetor); Por exemplo: gets(palavra);

6.2 String Veja um exemplo simples no programa 6.3: Algoritmo/Programa 6.3: Um exemplo simples de string e gets()
1 2 3 4 5 6 7 8 9 10 11 12 13

38

#include <s t d i o . h>

i n t main ( ) {

char f r a s e [ 8 0 ] ;

p r i n t f ( " Digite uma frase : " ) ;

gets ( frase ) ;

p r i n t f ( " Voc^ digitou % s \ n " , f r a s e ) ; e

A funo gets() ler os caracteres digitados at que voc tecle ENTER. No feita nenhuma vericao ca a e e a e ca se o que voc digitou cabe no vetor declarado. No programa 6.3, se voc digitar uma string com mais de 79 e e caracteres, os ultimos caracteres invadiro espaos de memria de outras variveis. a c o a

6.2.1

Funes de manipulao de strings co ca

Existem algumas funes prontas para a manipulao de strings. Vamos descrev-las e apresentar alguns co ca e exemplos. Estas funes esto da biblioteca string.h, sendo necessrio inserir #include <string.h> no co a a cabealho do programa. c

strlen() Sintaxe: strlen(s) (onde s uma string). e Esta funo retorna (devolve) um nmero inteiro que corresponde ao comprimento (tamanho ou nmero de ca u u caracteres) da string s. Como ela retorna um valor, comum fazermos uma varivel inteira receber o resultado da funo. e a ca Veja o exemplo no programa 6.4. Algoritmo/Programa 6.4: A funo strlen() ca
1 2 3 4 5

#include <s t d i o . h> #include < s t r i n g . h>

i n t main ( ) {

6.2 String

39

6 7 8 9 10 11 12 13 14 15 16 17 18

i n t tamanho ;

char s [ 3 0 ] ;

p r i n t f ( " \ nDigite o conte do da string : " ) ; u

gets ( s ) ;

tamanho = s t r l e n ( s ) ;

p r i n t f ( " \ nA string \ t % s \ ttem % d caracteres .\ n " , s , tamanho ) ;

Observe que, como a funo strlen() retorna um valor inteiro, ao fazermos tamanho = strlen(s); , este ca valor atribu ` varivel tamanho. e do a a

strcpy() Sintaxe: strcpy(s1, s2) (onde s1 e s2 so strings). a Esta funo copia o contedo da string s2 para a string s1. Certique-se que s2 s1. ca u Veja o exemplo no programa 6.5. Algoritmo/Programa 6.5: A funo strcpy() ca
1 2 3 4 5 6 7 8 9 10 11 12

#include <s t d i o . h> #include < s t r i n g . h>

i n t main ( ) {

char t e s t e [ 5 0 ] ;

s t r c p y ( t e s t e , " Texto a ser inserido na string teste " ) ;

p r i n t f ( "\n %s \n" , t e s t e ) ;

strcat() Sintaxe: strcat(s1, s2) (onde s1 e s2 so strings). a Esta funo anexa s2 ao nal de s1. s2 ca inalterada. Dizemos que foi feita a concatenao das strings s1 ca ca e s2

6.2 String O programa 6.6 apresenta um exemplo. Algoritmo/Programa 6.6: A funo strcat() ca
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

40

#include <s t d i o . h> #include < s t r i n g . h>

i n t main ( ) {

char p r i m e i r a S t r i n g [ 5 0 ] , s e g u n d a S t r i n g [ 5 0 ] ;

p r i n t f ( " \ nDigite a primeira string .\ n " ) ; gets ( primeiraString ) ; p r i n t f ( " \ nDigite a segunda string .\ n " ) ; gets ( segundaString ) ;

p r i n t f ( " \ n \ nAntes da concatena a o : " ) ; c~

p r i n t f ( " \ nPrimeira : % s " , p r i m e i r a S t r i n g ) ; p r i n t f ( " \ nSegunda : % s " , s e g u n d a S t r i n g ) ;

s t r c a t ( primeiraString , segundaString ) ;

p r i n t f ( " \ n \ nDepois da concatena ~ o : " ) ; ca

p r i n t f ( " \ nPrimeira : % s " , p r i m e i r a S t r i n g ) ; p r i n t f ( " \ nSegunda : % s \ n \ n " , s e g u n d a S t r i n g ) ;

strcmp() Sintaxe: strcmp(s1, s2) (onde s1 e s2 so strings). a Esta funao compara as strings s1 e s2. Ela retorna 0 se s1 = = s2; retorna um nmero positivo se s1 c u for lexicogracamente maior que s2 e retorna um nmero negativo se s1 < s2. u Algoritmo/Programa 6.7: A funo strcmp() ca
1 2 3 4 5 6 7 8 9

#include <s t d i o . h> #include < s t r i n g . h>

i n t main ( ) {

int r e s u l t a d o ;

char s 1 [ 1 0 ] , s 2 [ 1 0 ] ; s t r c p y ( s1 , " aaa " ) ;

6.3 Matriz

41

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

s t r c p y ( s2 , " aaa " ) ; r e s u l t a d o = strcmp ( s1 , s 2 ) ; p r i n t f ( " \ nResultado = % d " , r e s u l t a d o ) ;

s t r c p y ( s1 , " aaa " ) ; s t r c p y ( s2 , " bbb " ) ; r e s u l t a d o = strcmp ( s1 , s 2 ) ; p r i n t f ( " \ nResultado = % d " , r e s u l t a d o ) ;

s t r c p y ( s1 , " bbb " ) ; s t r c p y ( s2 , " aaa " ) ; r e s u l t a d o = strcmp ( s1 , s 2 ) ; p r i n t f ( " \ nResultado = % d \ n " , r e s u l t a d o ) ;

s t r c p y ( s1 , " aaaa " ) ; s t r c p y ( s2 , " aaa " ) ; r e s u l t a d o = strcmp ( s1 , s 2 ) ; p r i n t f ( " \ nResultado = % d \ n " , r e s u l t a d o ) ;

6.3

Matriz

Matrizes so vetores com mais dimenses. Em outras palavras, podemos ver um vetor como uma matriz a o com uma linha e n colunas. Uma matriz bidimensional possui i linhas e j colunas. C permite matrizes com mais dimenses: 3, 4, . . . (multidimensionais). o No momento, vamos abordar apenas as matrizes bidimensionais. A sintaxe a seguinte: e tipo nome[dimenso 1] [dimenso 2]; a a Por exemplo: int matriz[10][20]; declara uma matriz de inteiros com 10 linhas e 20 colunas. Outros exemplos: int matrizA[5][5]; : a varivel chama-se matrizA, seus elementos so do tipo int e sua dimenso de 5 a a a e linhas e 5 colunas. matrizA[2][2] = 34; : a atribuio de valores normal, como se faz com qualquer varivel ou vetor. ca e a oat M[4][6] : a varivel chama-se M, seus elementos so do tipo oat e sua dimenso de 4 linhas e 6 a a a e

6.3 Matriz colunas.

42

M[2][3] refere-se ao elemento da terceira linha e quarta coluna da matriz M. Como nos vetores, a contagem comea de zero. c M[i][j] = 3.456; : podemos usar variveis como a ndices da matriz. De um modo geral, temos tipo nome da varivel[no de linhas][no de colunas]. a Vejamos um exemplo no programa 6.8. Algoritmo/Programa 6.8: Um exemplo simples com matriz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

#include <s t d i o . h>

i n t main ( ) {

int i , j , matriz [ 3 ] [ 4 ] ;

p r i n t f ( " \ n Digite os elementos da matriz \ n " ) ;

f o r ( i = 0 ; i < 3 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { s c a n f ( " % d " ,& m a t r i z [ i ] [ j ] ) ; } }

f o r ( i = 0 ; i < 3 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { p r i n t f ( " matriz [% d ][% d ] = % d \ t " , i , j , m a t r i z [ i ] [ j ] ) ; } p r i n t f ( "\n" ) ; } }

6.3.1

Matrizes de strings

Para criar uma matriz de strings, usa-se uma matriz bidimensional de caracteres (char), na qual o ndice da esquerda (linhas) determina o nmero de strings e o u ndice da direita (colunas) especica o comprimento mximo de cada string. a Por exemplo, char matriz str[30][81]; declara uma matriz de 30 strings, sendo que cada string pode ter, no mximo, 81 caracteres (80 caracteres + o terminador \0). a Para acessar uma determinada string, basta especicar o ndice da linha (primeiro ndice). A linha abaixo, por exemplo, l a terceira string da matriz str: e

6.3 Matriz gets(matriz str[2]); Ela equivalente a gets(matriz str[2][0]);. e Vamos a um exemplo que l vrias linhas de texto. e a Algoritmo/Programa 6.9: L e exibe um texto com vrias linhas e a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

43

#include <s t d i o . h>

i n t main ( ) {

int i , j ; char t e x t o [ 1 0 0 ] [ 8 0 ] ;

p r i n t f ( " ------------------------------------------------------------------------" ) ; p r i n t f ( " \ n Digite o texto e uma linha em branco para encerrar \ n " ) ; p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ n " ) ;

f o r ( i = 0 ; i < 100 ; i++ ) {

gets ( texto [ i ] ) ;

i f ( t e x t o [ i ] [ 0 ] == \0 ) break ; }

p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ n " ) ;

f o r ( i = 0 ; i < 100 ; i++ ) {

i f ( t e x t o [ i ] [ 0 ] == \0 ) break ;

p r i n t f ( "%s\n" , texto [ i ] ) ;

p r i n t f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ n " ) ;

O primeiro for recebe (l) vrias linhas digitadas com a funo gets(). Quando uma linha em branco e a ca e digitada, ela ter apenas uma string vazia, a condio do if ser verdadeira e o for ser interrompido com o a ca a a comando break. Em seguida, todas as strings (linhas do texto) so impressas at atingirmos a linha vazia (texto[i][0] == a e \0).

6.4 Exerc cios Propostos

44

6.4
6.4.1

Exerc cios Propostos


Calcular a mdia dos elementos de um vetor e

Faa um programa que receba via teclado 8 notas de uma turma. Depois de lidas todas as notas, calcule e c imprima a mdia da turma. As notas devem ser armazenadas em um vetor de reais (oat). e Resposta: programa 9.21.

6.4.2

Gerar vetor soma e produto a partir de 2 vetores originais

Ler 2 vetores de inteiros com 11 elementos cada um. Em seguida, gerar um vetor soma onde cada elemento corresponda a soma dos dois elementos correspondentes dos vetores lidos. Gerar outro vetor produto cujos ` elementos correspondam ao produto dos elementos de mesma posio dos vetores lidos. Exibir os 4 vetores na ca tela.

6.4.3

Imprimir vetor de trs pra frente a

Ler um vetor com 8 elementos do tipo oat e imprimir seus elementos de trs pra frente (do ultimo ao a primeiro).

6.4.4

Concatenar 2 vetores

Ler 2 vetores com 7 elementos do tipo inteiro cada um e concaten-los em um terceiro vetor. a

6.4.5

Achar maior e menor elementos do vetor e somar seus elementos

Fazer um programa que receba 15 valores inteiros e os grave em um vetor. Depois desta etapa, percorra o vetor e identique o maior e o menor elemento do vetor. Informe os valores e a posio que eles ocupam no ca vetor. Depois desta etapa, some os elementos do vetor e exiba o valor desta soma.

6.4.6

Confere senha digitada

Fazer um programa que leia a senha do usurio e informe se a senha est correta ou incorreta. Considere a a que a senha correta est gravada no cdigo fonte do programa. a o

6.4 Exerc cios Propostos

45

6.4.7

Imprimir uma string de trs para frente a

Fazer um programa que leia uma string e a imprima de trs pra frente. a Exemplo: Digitado: ifsudestemg Impresso: gmetsedus

6.4.8

L e imprime strings e n meros e u

Faa um programa que receba o nome do aluno, o nome da disciplina, o nmero de faltas (inteiro) e a nota c u na disciplina (real). Em seguida, o programa imprime os dados lidos.

6.4.9

Soma de matrizes

Fazer um programa que preencha automaticamente uma matriz 3X3 com 0, 1, 2, 3, 4, . . .. Em seguida, o programa recebe, via teclado, os elementos de outra matriz 3X3. Por m, o programa calcula e exibe a matriz soma das duas primeiras matrizes.

6.4.10

Soma dos elementos da diagonal principal

Fazer um programa que leia os elementos de uma matriz 4X4. Em seguida, o programa calcula e exibe a soma dos elementos da diagonal principal.

6.4.11

Menu e matriz

Fazer um programa c/ seguinte menu:

1. Inserir notas 2. Exibir nota do aluno 3. Modica nota 4. Mdia do aluno e 5. Mdia da turma na disciplina e 6. Mdia geral da turma e

6.4 Exerc cios Propostos 7. Exibir todas as notas 8. Sair

46

A turma tem 5 alunos e cada aluno tem 3 disciplinas. As notas devem ser inseridas em uma matriz 5X3. Considere que as opes 2, 3, 4, 5, 6 e 7 s podem ser executadas se a opo 1 j tiver sido executada. co o ca a Considere que a opo 1 s pode ser executada uma vez. ca o A opo 2 pede o nmero do aluno e exibe suas notas. ca u A opo 3 pede o nmero do aluno e da disciplina, l a nova nota e substitui a antiga pela nova. ca u e A opo 4 pede o nmero do aluno, calcula e exibe sua mdia. ca u e A opo 5 pede o nmero da discplina, calcula e exibe a mdia da turma na disciplina. ca u e
Material desenvolvido por Filippe Jabour - http://www.jabour.com.br.

Cap tulo 7

Funes co
7.1 Funes em C co

Funes so trechos de cdigo que podem ser referenciados por um nome. Quando o nome de uma funo co a o ca aparece no cdigo, dizemos que a funo foi chamada. Quando uma funo chamada, ela faz alguma o ca ca e coisa e pode retornar (devolver) valores (resultado). Quando a funo no est pronta em uma biblioteca, ela precisa ser criada (implementada). ca a a Forma geral: tipo que retorna nome da funo ca (lista de parmetros) { a

cdigo da funo o ca }

Exemplo: oat calculaMedia (oat a, oat b) {

cdigo da funo o ca return(resultado); }

A funo se chama calculaMedia. Ela retorna (devolve) um valor real (oat). Ela recebe dois argumentos ca do tipo oat (a e b). Aps calcular a mdia, o comando return(resultado); responsvel por retornar a mdia o e e a e calculada para o programa que chamou a funo. ca A seguir o primeiro exemplo.

7.1 Funes em C co Algoritmo/Programa 7.1: Programa com a funo calculaMedia ca


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

48

#include <s t d i o . h>

float calculaMedia ( float , float ) ;

i n t main ( ) {

f l o a t a , b , m;

p r i n t f ( " \ nDigite o primeiro n mero : " ) ; u s c a n f ( " % f " , &a ) ; p r i n t f ( " \ nDigite o segundo n mero : " ) ; u s c a n f ( " % f " , &b ) ;

m = calculaMedia (a , b) ;

p r i n t f ( " \ nA m dia entre %.2 f e %.2 f e %.2 f \ n " , a , b ,m) ; e

f l o a t c a l c u l a M e d i a ( f l o a t argA , f l o a t argB ) { float mediaCalculada ;

m e d i a C a l c u l a d a = ( argA + argB ) / 2 ;

return ( m e d i a C a l c u l a d a ) ;

Vamos analisar o cdigo. o Observe que o programa contm duas funes, a funo main e a funo calculaMedia. A execuo e co ca ca ca comea pela funo main. c ca Na linha 14, a varivel m recebe o resultado da funo calculaMedia. Neste instante, a execuo do a ca ca programa salta para a funo calculaMedia e ela comea a ser executada. Veja que na chamada da ca c funo, dois argumentos foram passados, as variveis a e b. Estes argumentos so recebidos na funo atravs ca a a ca e das variveis argA e argB. A mdia ento calculada e devolvida (retornada) atravs do comando return. a e e a e O comando return encerra a execuo de qualquer funo. Assim, neste instante, a execuo volta para a ca ca ca funo main, o resultado retornado (a mdia entre os argumentos passados) atribu ` varivel m e o ca e e da a a programa continua a sua execuo. ca Por m a explicao da linha 3. Durante a traduo do programa para a linguagem do computador ca ca (compilao), o tradutor (compilador) ir deparar com o nome da funo calculaMedia. Se no houvesse ca a ca a a linha 3, funo no seria reconhecida e ocorreria um erro de compilao. Deste modo, a linha 3 serve para ca a ca

7.1 Funes em C co

49

apresentar ao compilador a funo calculaMedia, ou seja, diz ao compilador que esta funo existe, o tipo ca ca de valor que ela retorna e os argumentos que recebe. Chamamos esta linha de prottipo da funo. o ca Outra opo escrever a funo implementada antes da funo main. ca e ca ca Uma funao pode ser chamada (usada) vrias vezes. Como aplicao deste conceito, faa o seguinte: no c a ca c programa 7.1, declare outras duas variveis c e d, leia c e d com a funo scanf, calcule e exiba a mdia entre a ca e c e d usando novamente a funo calculaMedia. ca Veja outra possibilidade do uso de funes: co x = ( calculaMedia(a,b) + calculaMedia(c,d) ) / 2; Observe que o resultado da funo inserido diretamente em uma expresso e o valor retornado usado ca e a e para um novo clculo. a Um vetor ou matriz podem ser passados como argumentos para funes. Por ainda no termos estudado co a ponteiros em C, ser apresentada apenas uma forma de faz-lo. Ela consiste em passar apenas o nome do a e vetor (ou matriz) na chamada da funo e em declarar, na construo da funo, um vetor ou matriz igual ao ca ca ca argumento que ser passado na chamada. Vejamos o exemplo do programa 7.2. a Algoritmo/Programa 7.2: Passando uma matriz como argumento da funo ca
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <s t d i o . h>

void imprimeMatriz ( f l o a t a r g M a t r i z [ 4 ] [ 4 ] ) ;

i n t main ( ) {

float matriz [ 4 ] [ 4 ] ;

int i , j ;

p r i n t f ( " \ nDigite os elementos da matriz \ n " ) ; f o r ( i = 0 ; i < 4 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { s c a n f ( " % f " ,& m a t r i z [ i ] [ j ] ) ; } }

imprimeMatriz ( m a t r i z ) ;

void imprimeMatriz ( f l o a t a r g M a t r i z [ 4 ] [ 4 ] ) {

int i , j ;

7.2 Regras de escopo

50

26 27 28 29 30 31 32 33

p r i n t f ( " \ nImpress~ o da matriz \ n " ) ; a f o r ( i = 0 ; i < 4 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { p r i n t f ( " %.1 f \ t " , a r g M a t r i z [ i ] [ j ] ) ; } p r i n t f ( "\n" ) ; } }

7.2

Regras de escopo

Variveis declaradas dentro de uma funao so chamadas variveis locais, ou seja, elas s podem ser usadas a c a a o dentro da funo. Em outras palavras, elas s existem dentro da funo. Isto serve tambm para qualquer ca o ca e bloco de cdigo delimitado por chaves ({. . .}). Neste caso, dizemos que o escopo destas variveis est limitado o a a a ` funo dentro da qual elas foram declaradas. ca Quando o programa executado, uma varivel local criada quando a execuo do bloco iniciada ({) e e a e ca e destru quando a execuo do bloco encerrada (}). da ca e No trecho a seguir, cada varivel x s existe dentro de cada uma das funes. Uma no interfere na outra. a o co a Ambas podem ser chamar x ou poderiam ter nomes diferentes. ... int funcaoUm(int a){ int x; x = a * a; return(x); } ... int funcaoDois(int m){ int x; x = m * m * m; return(x); }

Ao contrrio das variveis locais, as variveis globais so conhecidas em todo o programa e podem ser a a a a usadas por qualquer parte do cdigo. Sua visibilidade total. Uma varivel global criada atravs de uma o e a e e declarao feita fora de qualquer funo (inclusive, fora da prpria funo main). ca ca o ca

7.3 Exerc cios Propostos

51

7.3
7.3.1

Exerc cios Propostos


Calculadora usando funoes c

Fazer um programa que execute at que o usurio decida encerrar. Na execuo, o programa recebe 2 e a ca nmeros, o usurio escolhe a operao desejada ( + - * / ) e o programa efetua a operao desejada. Use u a ca ca chamadas de funes para executar as operaes. No permita diviso por zero. co co a a

7.3.2

Equao do segundo grau usando funoes ca c

Refaa o exerc 2.3.5 usando funes. As seguintes funes devem ser criadas e usadas: c cio co co oat calculaDelta(oat, oat, oat) : recebe os coecientes da equao e retorna o valor de delta. ca oat calculaRaizUm(oat, oat, oat) : recebe os coecientes a e b da equao, recebe o valor de delta ca e retorna o valor de uma das ra zes da equao. ca oat calculaRaizDois(oat, oat, oat) : recebe os coecientes a e b da equao, recebe o valor de ca delta e retorna o valor da outra raiz da equao. ca

7.3.3

Criao de um vetor aleatrio usando funo ca o ca

Fazer um programa que gere e imprima um vetor com 20 nmeros inteiros. Estes nmeros devem ser u u aleatrios e gerados por uma funo int geraInt(int limiteSuperior). Esta funo gera aleatoriamente um o ca ca nmero inteiro entre 0 e limiteSuperior. u

7.3.4

Concatenao de 2 vetores ordenados em um 3o tambm ordenado ca e

Fazer um programa que gere aleatoriamente dois vetores com 20 nmeros inteiros em ordem crescente. Em u seguida, gerado um terceiro vetor com os 40 elementos dos dois primeiros, tambm em ordem crescente. e e Exemplo: vetorUm = {1, 4, 8, 8, 10} vetorDois = {0, 1, 5, 9, 11} vetorResultado = {0, 1, 1, 4, 5, 8, 8, 9, 10, 11} Uma forma de gerar o vetor j ordenado usar a funo geraInt do exerc 7.3.3 e sempre somar o nmero a e ca cio u gerado ao valor anterior. Assim, o elemento i + 1 ser igual ao elemento i + geraInt(...). O limite superior a

7.3 Exerc cios Propostos usado na funo geraInt() no ser respeitado nestes vetores gerados, mas no se preocupe com este fato. ca a a a

52

A sugesto que o programa v percorrendo os dois vetores simultaneamente (mas no sincronizadamente) a e a a e v transferindo valores para o vetorResultado de forma a manter a ordenao. a ca Resposta: programa 9.22.

7.3.5

Achar o maior, menor, mdia, soma e produto dos elementos do vetor, e usando funes co

Faa um programa com um menu contendo as seguintes opes: gera vetor; exibe vetor; acha maior; acha c co menor; calcula mdia dos elementos; calcula soma dos elementos; calcula produto dos elementos; sai do proe grama. Considere que o vetor em questo tem 15 elementos reais. a Implemente cada opo do menu atravs da chamada de uma funo espec ca e ca ca.

7.3.6

Produto de matrizes

Faa um programa que gere duas matrizes, uma 4X6 e outra 6X4, calcule e exiba o produto delas. c Obs.: neste momento, sugiro no usar funes (exceto a funo geraInt()). a co ca Resposta: programa 9.23.

7.3.7

Ordenao de vetor ca

Faa um programa que gere um vetor de nmeros inteiros aleatrios e faa a ordenao dos valores em ordem c u o c ca crescente. Resposta: programa 9.24.
Material desenvolvido por Filippe Jabour - http://www.jabour.com.br.

Cap tulo 8

struct (Estrutura)
8.1 struct : conceitos iniciais

Em C, uma estrutura uma coleo de variveis agrupadas dentro de outra varivel. Imagine que voc e ca a a e precisa gravar vrios dados de um cliente (codigo, nome, endereo, telefone, CPF, e-mail, limite de crdito). a c e E interessante que voc crie uma estrutura (struct) e, dentro dela, crie variveis para cada um dos campos e a (cdigo, nome, endereo, . . .). o c No exemplo dado acima, a estrutura seria a seguinte: struct TipoCliente { int codigo; char nome[50]; char endereco[100]; char telefone[12]; char CPF[11]; char eMail[40]; oat limiteDeCredito; };

Observe que dentro da estrutura temos vrias variveis de tipos primitivos (int, vetores de char e oat). a a Veja que o enunciado termina com ponto e v rgula ( ; ). Na verdade, no exemplo acima, ainda no foi criada a varivel em si. O que foi feito foi a denio (criao) a a ca ca de um novo tipo chamado TipoCliente que contm todos aqueles campos. e Para se declarar uma varivel efetivamente, preciso um enunciado como o que mostramos a seguir: a e

8.1 struct : conceitos iniciais struct TipoCliente cliente; A sim, passamos a ter uma varivel chamada cliente que do tipo TipoCliente. a e Voc pode inclusive declarar mais de uma varivel deste tipo: e a struct TipoCliente cliente, clienteEspecial, clienteInativo; A declarao das variveis pode ser feita junto com a criao do tipo. No caso acima ter ca a ca amos: struct TipoCliente { int codigo; char nome[50]; char endereco[100]; char telefone[12]; char CPF[11]; char eMail[40]; oat limiteDeCredito; } cliente, clienteEspecial, clienteInativo;

54

Se voc precisar de apenas uma varivel do tipo criado, no precisa incluir o seu nome. Veja o exemplo e a a adaptado a este caso: struct { int codigo; char nome[50]; char endereco[100]; char telefone[12]; char CPF[11]; char eMail[40]; oat limiteDeCredito; } cliente;

Temos, ento, como forma geral da denio de uma estrutura, esta mostrada a seguir: a ca struct NomeDoNovoTipo { tipo nomeDaVarivel; a tipo nomeDaVarivel; a ... tipo nomeDaVarivel; a } variavelUm, variavelDois, . . . , variavelN;

8.2 Acessando os elementos (campos) da estrutura

55

8.2

Acessando os elementos (campos) da estrutura

O acesso a um campo da estrutura se d atravs do nome da varivel, um ponto e o nome do a e a campo. Nos exemplos acima, ter amos: cliente.codigo = 123; clienteEspecial.limiteDeCredito = 1200.50; gets(clienteInativo.nome); De um modo geral: nomeDaVarivelDoTipoEstrutura.nomeDoCampo a

8.3

Vetores de estruturas

Depois de declarado o tipo da estrutura, basta declarar o vetor com a quantidade de elementos desejada. Ainda com relao ao exemplo da seo 8.1, veja como seria a criao de um vetor para armazenar at 100 ca ca ca e clientes: struct TipoCliente bancoDeClientes[100]; Para acessar um campo de um cliente em especial, combine os conceitos j estudados de vetores com os a conceitos aqui apresentados: Por exemplo, o cdigo do trigsimo cliente acessado atravs do enunciado a seguir: o e e e bancoDeClientes[29].codigo

8.4
8.4.1

Exerc cios Propostos


Cadastro de produtos

Faa um programa que permita cadastrar, consultar e modicar uma base de 15 produtos. Cada produto c contm os seguintes atributos: cdigo, nome, preo, quantidade em estoque. e o c
Material desenvolvido por Filippe Jabour - http://www.jabour.com.br.

Cap tulo 9

Soluo dos Exerc ca cios


9.1 Respostas dos exerc cios do Cap tulo 1
Algoritmo/Programa 9.1: Resposta do exerc 1.6.10 cio
1 2 3 4 5 6 7 8 9 10 11 12 13

#include <s t d i o . h> #include < s t d l i b . h> #include <math . h> i n t main ( ) { f l o a t x , y , r , e ; // xa n g u l o ; ymedida da p a r e d e ; rr a d i a n o s e medida da e s c a d a p r i n t f ( " O angulo eh : " ) ; s c a n f ( " % f " , &x ) ; p r i n t f ( " A medida da parede eh : " ) ; s c a n f ( " % f " ,&y ) ; r=x ( 3 . 1 4 / 1 8 0 ) ; e=y/ s i n ( r ) ; p r i n t f ( " A medida da escada eh : %.1 f \ n " , e ) ; }

9.2

Respostas dos exerc cios do Cap tulo 2


Algoritmo/Programa 9.2: Resposta do exerc 2.3.1 cio

1 2 3 4 5 6 7

#include <s t d i o . h>

i n t main ( ) { i n t numeroGerado , p a l p i t e ;

s r a n d ( time (NULL) ) ;

// f a z n mero g e r a d o v a r i a r a cada e x e c u c o do programa u a

9.2 Respostas dos exerc cios do Cap tulo 2

57

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

numeroGerado = rand ( ) ;

// g e r a um n mero a l e a t o r i o u

// T i r e o c o m e n t a r i o da l i n h a a b a i x o para v e r o n mero a n t e s de t e n t a r u // p r i n t f (\ nNmero g e r a d o : %d , numeroGerado ) ; u

numeroGerado = numeroGerado % 1 0 ; // T i r e o c o m e n t a r i o da l i n h a a b a i x o para v e r o n mero r e d u z i d o a n t e s de t e n t a r u // p r i n t f (\ nResto da d i v i s a o do n mero g e r a d o por 1 0 : %d , numeroGerado ) ; u

p r i n t f ( " \ nSeu palpite : " ) ; s c a n f ( " % d " ,& p a l p i t e ) ;

i f ( p a l p i t e == numeroGerado ) { p r i n t f ( " \ nAcertou !!!\ n " ) ; } else { p r i n t f ( " \ nErrou ...\ n " ) ; }

Algoritmo/Programa 9.3: Resposta do exerc 2.3.2 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

#include <s t d i o . h>

i n t main ( ) { i n t numeroDigitado ;

p r i n t f ( " \ nDigite um n mero : " ) ; u s c a n f ( " % d " ,& numeroDigitado ) ;

p r i n t f ( " \ n % d e " , numeroDigitado ) ; i f ( numeroDigitado % 2 == 0 ) { p r i n t f ( " par .\ n " ) ; } else { p r i n t f ( " mpar .\ n " ) ; }

Algoritmo/Programa 9.4: Resposta do exerc 2.3.3 cio


1 2 3 4 5 6

#include <s t d i o . h>

i n t main ( ) { i n t numeroUm , numeroDois , numeroTres ; i n t maior ;

9.2 Respostas dos exerc cios do Cap tulo 2

58

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

p r i n t f ( " \ nDigite 3 n meros separados por espa o e tecle ENTER : " ) ; u c s c a n f ( " % d % d % d " ,&numeroUm , &numeroDois , &numeroTres ) ;

i f ( numeroUm > numeroDois ) { i f ( numeroUm > numeroTres ) maior = numeroUm ; else maior = numeroTres ; } else { i f ( numeroDois > numeroTres ) maior = numeroDois ; else maior = numeroTres ; } // s uma l i n h a d e n t r o do i f d i s p e n s a as c h a v e s o

p r i n t f ( " \ nO maior entre %d , % d e % d % d \ n " , numeroUm , numeroDois , numeroTres , maior ) ; e

Algoritmo/Programa 9.5: Resposta do exerc 2.3.4 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

#include <s t d i o . h>

i n t main ( ) { i n t numero ;

p r i n t f ( " \ nDigite um n mero : " ) ; u s c a n f ( " % d " ,&numero ) ;

p r i n t f ( " \ n % d e " , numero ) ; i f ( numero > 0 ) { p r i n t f ( " positivo \ n " ) ; } else { i f ( numero < 0 ) p r i n t f ( " negativo \ n " ) ; else p r i n t f ( " nulo \ n " ) ; } }

Algoritmo/Programa 9.6: Resposta do exerc 2.3.5 cio


1 2 3 4

#include <s t d i o . h> #include <math . h>

//No Linux , c o m p i l e com g c c lm para c a r r e g a r a b i b l i o t e c a matem tica com a f u n c a o s q r t a

9.2 Respostas dos exerc cios do Cap tulo 2

59

5 6 7 8 9 10 11 12 13 14 15 16

//O programa r e q u e r a j u s t e s quando a > 0 e b = c = 0 .

i n t main ( ) { float a , b , c ; f l o a t d e l t a , raizUm , r a i z D o i s ;

p r i n t f ( " \ nSeja a equa ~ o do segundo grau na forma : a x2 + b x + c = 0 \ n " ) ; ca p r i n t f ( " Digite os coeficientes a , b e c : " ) ; p r i n t f ( " \ na = " ) ; s c a n f ( " % f " ,&a ) ; i f ( a == 0 ) { p r i n t f ( " \ nO coeficiente \" a \" n~ o pode ser nulo .\ nO programa ser encerrado .\ n a a ") ;

17 18 19 20 21 22 23 24 25 26 27

return ( 0 ) ; } p r i n t f ( " \ nb = " ) ; s c a n f ( " % f " ,&b ) ; p r i n t f ( " \ nc = " ) ; s c a n f ( " % f " ,& c ) ;

// r e t u r n e n c e r r a uma f u n c o . No c a s o da main , e n c e r r a o programa . a

d e l t a = pow ( b , 2 ) 4 a c ;

if ( delta < 0 ) p r i n t f ( " \ nDelta negativo , a equa a o \"%.1 f x2 + (%.1 f ) x + (%.1 f ) \" n~ o tem c~ a ra zes reais .\ n " , a , b , c ) ;

28 29 30 31

else { i f ( d e l t a == 0 ) { raizUm = r a i z D o i s = (1 b ) / ( 2 a ) ; p r i n t f ( " \ nDelta = 0 , a equa ~ o \"%.1 f x2 + (%.1 f ) x + (%.1 f ) \" tem uma ca raiz que vale % f .\ n " , a , b , c , raizUm ) ;

32 33 34 35 36

} else { raizUm = (( 1 b ) + s q r t ( d e l t a ) ) / ( 2 a ) ; r a i z D o i s = (( 1 b ) s q r t ( d e l t a ) ) / ( 2 a ) ; p r i n t f ( " \ nA equa a o \"%.1 f x2 + (%.1 f ) x + (%.1 f ) \" tem duas ra zes c~ reais : % f e % f \ n " , a , b , c , raizUm , r a i z D o i s ) ;

37 38 39

} } }

Algoritmo/Programa 9.7: Resposta do exerc 2.3.6 cio


1 2 3 4 5 6

#include <s t d i o . h>

i n t main ( ) { i n t numeroUm , numeroDois , soma , r e s u l t a d o F i n a l ;

p r i n t f ( " \ nDigite dois n meros separados por espa o : " ) ; u c

9.2 Respostas dos exerc cios do Cap tulo 2

60

7 8 9 10 11 12 13 14 15 16 17

s c a n f ( " % d % d " ,&numeroUm,& numeroDois ) ;

soma = numeroUm + numeroDois ;

i f ( soma > 20 ) r e s u l t a d o F i n a l = soma + 8 ; else r e s u l t a d o F i n a l = soma 5 ;

p r i n t f ( " \ nResultado final : % d \ n " , r e s u l t a d o F i n a l ) ; }

Algoritmo/Programa 9.8: Resposta do exerc 2.3.7 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

#include <s t d i o . h>

i n t main ( ) { f l o a t s a l a r i o , valorDoEmprestimo , v a l o r D a P r e s t a c a o ; i n t numeroDePrestacoes ;

p r i n t f ( " \ nSal rio : " ) ; a s c a n f ( " % f " ,& s a l a r i o ) ;

p r i n t f ( " Valor do empr stimo : " ) ; e s c a n f ( " % f " ,& valorDoEmprestimo ) ;

p r i n t f ( " N mero de prestacoes : " ) ; u s c a n f ( " % d " ,& numeroDePrestacoes ) ;

i f ( s a l a r i o <= 0 | valorDoEmprestimo <=0 | numeroDePrestacoes <=0 ) { p r i n t f ( " \ nNenhum dos valores pode ser nulo ou negativo .\ nPrograma ser a encerrado .\ n " ) ;

18 19 20 21 22 23

return ( 0 ) ; }

v a l o r D a P r e s t a c a o = valorDoEmprestimo / ( f l o a t ) numeroDePrestacoes ;

// O uso de 0 . 3 f a b a i x o e s p e c i f i c a um f l o a t . Se u s a r apenas 0 . 3 , t r a t a d o como d o u b l e e e f a l h a na compara a o do > c

24 25 26 27 28

i f ( valorDaPrestacao > s a l a r i o 0.3 f ) p r i n t f ( " \ n Empr stimo n~ o autorizado .\ n " ) ; e a else p r i n t f ( " \ n Empr stimo autorizado .\ n " ) ; e }

9.3 Respostas dos exerc cios do Cap tulo 3

61

9.3

Respostas dos exerc cios do Cap tulo 3


Algoritmo/Programa 9.9: Resposta do exerc 3.3.1 cio

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

#include <s t d i o . h>

i n t main ( ) { int p l a n e t a E s c o l h i d o ; f l o a t pesoNaTerra , g r a v i d a d e R e l a t i v a , pes oN oPl an et a ;

p r i n t f ( " \ nPlanetas " ) ; p r i n t f ( " \ n1 - Merc rio " ) ; u p r i n t f ( " \ n2 - V^ nus " ) ; e p r i n t f ( " \ n3 - Marte " ) ; p r i n t f ( " \ n4 - J piter " ) ; u p r i n t f ( " \ n5 - Saturno " ) ; p r i n t f ( " \ n6 - Urano " ) ; p r i n t f ( " \ n7 - Netuno \ n " ) ; p r i n t f ( " \ nDigite o n mero do planeta escolhido : " ) ; u s c a n f ( " % d " ,& p l a n e t a E s c o l h i d o ) ;

p r i n t f ( " \ n \ nInforme seu peso na Terra : " ) ; s c a n f ( " % f " ,& pesoNaTerra ) ;

switch ( p l a n e t a E s c o l h i d o ) { case 1 : gravidadeRelativa = 0.376; break ; case 2 : gravidadeRelativa = 0.903; break ; case 3 : gravidadeRelativa = 0.380; break ; case 4 : gravidadeRelativa = 2.340; break ; case 5 : gravidadeRelativa = 1.160; break ; case 6 : gravidadeRelativa = 1.150; break ; case 7 : gravidadeRelativa = 1.190; break ; default : gravidadeRelativa = 0;

9.3 Respostas dos exerc cios do Cap tulo 3

62

45 46 47 48 49 50 51 52 53 54 55

i f ( g r a v i d a d e R e l a t i v a != 0 ) { pe so NoP la net a = pesoNaTerra g r a v i d a d e R e l a t i v a ; p r i n t f ( " \ n \ nSeu peso no planeta escolhido %.3 f \ n \ n " , pes oN oPl an eta ) ; e } else { p r i n t f ( " \ n \ nErro na escolha do planeta . " ) ; }

Algoritmo/Programa 9.10: Resposta do exerc 3.3.2 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

#include <s t d i o . h>

i n t main ( ) { char opcao ;

p r i n t f ( " \ nQual a raiz quadrada de 49?\ n " ) ; p r i n t f ( " \ n \ ta ) 4\ n \ tb ) 7\ n \ tc ) 9\ n \ td ) 6\ n \ te ) Nenhuma das respostas anteriores \ n " ) ;

p r i n t f ( " \ n \ tSua op ~ o : " ) ; ca opcao = g e t c h a r ( ) ;

switch ( opcao ) { case a : p r i n t f ( " \ n \ tVoc^ marcou letra \" a \" e errou .\ n \ n " ) ; e break ; case b : p r i n t f ( " \ n \ tVoc^ marcou letra \" b \" e acertou .\ n \ n " ) ; e break ; case c : p r i n t f ( " \ n \ tVoc^ marcou letra \" c \" e errou .\ n \ n " ) ; e break ; case d : p r i n t f ( " \ n \ tVoc^ marcou letra \" d \" e errou .\ n \ n " ) ; e break ; case e : p r i n t f ( " \ n \ tVoc^ marcou letra \" e \" e errou .\ n \ n " ) ; e break ; default : p r i n t f ( " \ n \ tOp a o inv lida .\ n \ n " ) ; c~ a } }

Algoritmo/Programa 9.11: Resposta do exerc 3.3.3 cio

9.4 Respostas dos exerc cios do Cap tulo 4

63

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

#include <s t d i o . h>

i n t main ( ) { f l o a t operandoUm , o p e r a n d o D o i s ; char o p e r a d o r ;

p r i n t f ( " \ nDigite o primeiro n mero : " ) ; u s c a n f ( " % f " ,&operandoUm ) ;

p r i n t f ( " \ nDigite o segundo n mero : " ) ; u s c a n f ( " % f " ,& o p e r a n d o D o i s ) ;

p r i n t f ( " \ nDigite a opera a o (+ - * /) : " ) ; c~

getchar () ; operador = getchar ( ) ;

switch ( o p e r a d o r ) { case + : p r i n t f ( " \ nResultado = %.2 f \ n " , operandoUm+o p e r a n d o D o i s ) ; break ; case - : p r i n t f ( " \ nResultado = %.2 f \ n " , operandoUmo p e r a n d o D o i s ) ; break ; case * : p r i n t f ( " \ nResultado = %.2 f \ n " , operandoUm o p e r a n d o D o i s ) ; break ; case / : p r i n t f ( " \ nResultado = %.2 f \ n " , operandoUm/ o p e r a n d o D o i s ) ; break ; default : p r i n t f ( " \ nOpera a o desconhecida .\ n " ) ; c~ } }

9.4

Respostas dos exerc cios do Cap tulo 4


Algoritmo/Programa 9.12: Resposta do exerc 4.3.1 cio

1 2 3 4 5 6 7

#include <s t d i o . h>

i n t main ( ) { i n t numeroGerado , p a l p i t e , numeroDeTentativas = 1 , i ;

s r a n d ( time (NULL) ) ;

9.4 Respostas dos exerc cios do Cap tulo 4

64

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

numeroGerado = rand ( ) ;

numeroGerado = numeroGerado % 1 0 ;

p r i n t f ( " Quantas tentativas quer fazer ? " ) ; s c a n f ( " % d " , &numeroDeTentativas ) ;

f o r ( i = 1 ; i <= numeroDeTentativas ; i++ ) {

p r i n t f ( " \ nTentativa n mero % d .\ n \ tSeu palpite : " , i ) ; u s c a n f ( " % d " ,& p a l p i t e ) ;

i f ( p a l p i t e == numeroGerado ) { p r i n t f ( " \ nAcertou !!!\ n " ) ; break ; } else { p r i n t f ( " \ nErrou ...\ n " ) ; } } } // I n t e r r o m p e a e x e c u c a o do f o r

Algoritmo/Programa 9.13: Resposta do exerc 4.3.2 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#include <s t d i o . h>

i n t main ( ) {

i n t opcao , base , p o t e n c i a ;

p r i n t f ( "\n\n p r i n t f ( "\n p r i n t f ( "\n p r i n t f ( "\n p r i n t f ( "\n p r i n t f ( "\n p r i n t f ( "\n

*** Menu *** " ) ; 2 - Pot^ ncias de e 3 - Pot^ ncias de e 5 - Pot^ ncias de e 2. " ) ; 3. " ) ; 5. " ) ;

10 - Pot^ ncias de 10. " ) ; e 15 - Pot^ ncias de 15. " ) ; e Sua op ~ o : " ) ; ca

s c a n f ( " % d " , &opcao ) ;

switch ( opcao ) { case 2 : base = 2 ; break ; case 3 : base = 3 ; break ; case 5 : base = 5 ;

9.4 Respostas dos exerc cios do Cap tulo 4

65

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

break ; case 1 0 : base = 10; break ; case 1 5 : base = 15; break ; default : base = 10000; }

i f ( b a s e != 10000 ) { p r i n t f ( " \ n Pot^ ncias de % d menores que 10000: " , b a s e ) ; e f o r ( p o t e n c i a = b a s e ; p o t e n c i a < 10000 ; p o t e n c i a = b a s e ) p r i n t f ( "%d " , potencia ) ; p r i n t f ( "\n\n" ) ; } //um s comando d i s p e n s a as c h a v e s do f o r o

Algoritmo/Programa 9.14: Resposta do exerc 4.3.3 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

#include <s t d i o . h>

i n t main ( ) {

i n t i , a1 , r , n , a i , somaDosTermos = 0 , somaDosTermosPelaFormula ;

p r i n t f ( " \ n a1 = " ) ; s c a n f ( " % d " ,& a1 ) ;

p r i n t f ( "\n r = " ) ; s c a n f ( " % d " ,& r ) ;

p r i n t f ( " \ n N mero de termos . n = " ) ; u s c a n f ( " % d " ,&n ) ;

a i = a1 ;

f o r ( i = 1 ; i <= n ; i++ ) { i f ( ( i 1) % 10 == 0 ) p r i n t f ( "\n" ) ; p r i n t f ( "\t%d" , a i ) ; somaDosTermos += a i ; a i += r ; }

a i = r ;

// s a i do f o r j a com o pr ximo termo da PA o

9.4 Respostas dos exerc cios do Cap tulo 4

66

27 28 29 30 31 32 33 34

p r i n t f ( " \ n Soma dos termos acumulada = % d " , somaDosTermos ) ;

somaDosTermosPelaFormula = n ( a1 + a i ) / 2 ;

p r i n t f ( " \ n Soma dos termos calculada = % d \ n \ n " , somaDosTermosPelaFormula ) ;

Algoritmo/Programa 9.15: Resposta do exerc 4.3.4 cio


1 2 3 4 5 6 7 8 9 10 11

#include <s t d i o . h>

i n t main ( ) {

i n t i , n , t e r m o i m e n o s 2 = 0 , t e r m o i m e n o s 1 = 1 , termo ;

p r i n t f ( "\n n = " ) ; s c a n f ( " % d " , &n ) ;

if ( n > 1 ) { p r i n t f ( " \ n Sequ^ ncia dos % d primeiros n meros da sequ^ ncia de Fibonacci .\ n " , n ) e u e ;

12 13 14 15 16 17 18 19 20 21 22 23 24

printf ("

%d

%d" , termo i menos 2 , termo i menos 1 ) ;

f o r ( i = 3 ; i <= n ; i++ ) { termo = t e r m o i m e n o s 1 + t e r m o i m e n o s 2 ; printf (" % d " , termo ) ;

termo i menos 2 = termo i menos 1 ; t e r m o i m e n o s 1 = termo ; i f ( i %15 == 0 ) p r i n t f ( "\n" ) ; } p r i n t f ( "\n\n" ) ; }

Algoritmo/Programa 9.16: Resposta do exerc 4.3.5 cio


1 2 3 4 5 6 7 8 9 10

#include <s t d i o . h>

i n t main ( ) { i n t i , j , numero ; p r i n t f ( " \ n n mero ( >= 0 ) = " ) ; u s c a n f ( " % d " , &numero ) ; i f ( numero >= 0 ) { p r i n t f ( " \ n Pares de n meros cuja soma igual a % d .\ n " , numero ) ; u e f o r ( i = 0 , j = numero ; i <= numero ; i ++, j ) { p r i n t f ( " \ t % d + % d = % d \ n " , i , j , numero ) ;

9.4 Respostas dos exerc cios do Cap tulo 4

67

11 12 13 14

} p r i n t f ( "\n\n" ) ; } }

Algoritmo/Programa 9.17: Resposta do exerc 4.3.6 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

#include <s t d i o . h>

i n t main ( ) {

i n t numero , soma = 0 , i ;

f o r ( i = 1 ; i <= 10 ; i++ ) {

p r i n t f ( " ( rodada %d , faltam % d ) . s c a n f ( " % d " , &numero ) ;

Digite um n mero : " , i , 10 i ) ; u

i f ( numero numero < 225 ) { soma += numero ; } }

p r i n t f ( " \ nSoma dos n meros cujos quadrados s~ o menores que 225: % d \ n \ n " , soma ) ; u a

Algoritmo/Programa 9.18: Resposta do exerc 4.3.7 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

#include <s t d i o . h>

i n t main ( ) {

i n t numero , i ;

p r i n t f ( " \ n Digite um n mero : " ) ; u s c a n f ( " % d " , &numero ) ;

p r i n t f ( " \ n Divisores de % d : " , numero ) ;

f o r ( i = 1 ; i <= numero / 2 ; i++ ) {

i f ( numero % i == 0 ) { p r i n t f ( "%d } } ", i);

p r i n t f ( "%d

" , numero ) ;

9.4 Respostas dos exerc cios do Cap tulo 4

68

20 21 22 23

p r i n t f ( "\n\n" ) ;

Algoritmo/Programa 9.19: Resposta do exerc 4.3.8 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

#include <s t d i o . h>

i n t main ( ) {

int i , j , k ;

p r i n t f ( " \ n Impress~ o de (i , j ) \ n " ) ; a

p r i n t f ( " Usando a solu ~ o 1:\ n \ n " ) ; ca f o r ( i = 0 ; i < 10 ; i++ ) { p r i n t f ( "\n" ) ; f o r ( j = 0 ; j < 10 ; j++ ) { i f ( j >= i ) { p r i n t f ( " \ t (% d , % d ) " , i , j ) ; } else { / imprime e s p a c o s em branco , quando o n mero n o , impresso , u a e para manter a t e l a formatada / p r i n t f ( "\t } } } ") ;

p r i n t f ( " \ n \ nUsando a solu ~ o 2:\ n \ n " ) ; ca f o r ( i = 0 ; i < 10 ; i++ ) { p r i n t f ( "\n" ) ; //O f o r a b a i x o para manter a t e l a formatada e f o r ( k = 0 ; k < i ; k++ ) p r i n t f ( "\t" ) ; f o r ( j = i ; j < 10 ; j++ ) { p r i n t f ( " \ t (% d , % d ) " , i , j ) ; } }

p r i n t f ( "\n\n" ) ;

9.5 Respostas dos exerc cios do Cap tulo 5

69

9.5

Respostas dos exerc cios do Cap tulo 5


Algoritmo/Programa 9.20: Resposta do exerc 5.3.1 cio

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

#include <s t d i o . h>

i n t main ( ) {

i n t numeroGerado , p a l p i t e = 0 ;

s r a n d ( time (NULL) ) ;

numeroGerado = rand ( ) ;

numeroGerado = numeroGerado % 1 0 0 ;

while ( p a l p i t e != 1 ) {

p r i n t f ( " \ n Digite seu palpite : " ) ; s c a n f ( " % d " ,& p a l p i t e ) ;

i f ( p a l p i t e == numeroGerado ) { p r i n t f ( " \ nAcertou !!!\ n " ) ; break ; } else { i f ( p a l p i t e != 1 ) p r i n t f ( " \ nErrou ...\ n " ) ; } } } // I n t e r r o m p e a e x e c u c a o do w h i l e

9.6

Respostas dos exerc cios do Cap tulo 6


Algoritmo/Programa 9.21: Resposta do exerc 6.4.1 cio

1 2 3 4 5 6 7 8 9 10

#include <s t d i o . h>

i n t main ( ) {

int i ;

f l o a t somaDasNotas = 0 , mediaDaTurma ;

float notas [ 8 ] ;

9.7 Respostas dos exerc cios do Cap tulo 7

70

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

//L n o t a s e p r i n t f ( " \ nDigite as notas da turma :\ n " ) ; f o r ( i = 0 ; i < 8 ; i ++ ) { s c a n f ( " % f " ,& n o t a s [ i ] ) ; }

//Soma n o t a s f o r ( i = 0 ; i < 8 ; i ++ ) { somaDasNotas += n o t a s [ i ] ; }

// C a l c u l a e e x i b e a m dia e mediaDaTurma = somaDasNotas / 8 ; p r i n t f ( " \ nM dia da turma = %.2 f \ n " , mediaDaTurma ) ; e

9.7

Respostas dos exerc cios do Cap tulo 7


Algoritmo/Programa 9.22: Resposta do exerc 7.3.4 cio

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

#include <s t d i o . h>

int g e r a I n t ( int l i m i t e S u p e r i o r ) { i n t numeroGerado = rand ( ) ; numeroGerado %= l i m i t e S u p e r i o r ; return ( numeroGerado ) ; }

i n t main ( ) {

int vet1 [ 2 0 ] , vet2 [ 2 0 ] , vet3 [ 4 0 ] , i , j , k ;

s r a n d ( time (NULL) ) ;

vet1 [ 0 ] = geraInt (100) ; f o r ( i = 1 ; i < 20 ; i++ ) { v e t 1 [ i ] = v e t 1 [ i 1] + g e r a I n t ( 1 0 0 ) ; }

vet2 [ 0 ] = geraInt (100) ; f o r ( i = 1 ; i < 20 ; i++ ) { v e t 2 [ i ] = v e t 2 [ i 1] + g e r a I n t ( 1 0 0 ) ; }

p r i n t f ( " \ n \ n Vetor 1

") ;

9.7 Respostas dos exerc cios do Cap tulo 7

71

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

f o r ( i = 0 ; i < 20 ; i++ ) { p r i n t f ( "%d " , vet1 [ i ] ) ; }

p r i n t f ( " \ n \ n Vetor 2

") ;

f o r ( i = 0 ; i < 20 ; i++ ) { p r i n t f ( "%d " , vet2 [ i ] ) ; }

i =0; j =0; f o r ( k = 0 ; k < 40 ; k++ ) { i f ( i ==20) { vet3 [ k ] = vet2 [ j ] ; j ++; continue ; } i f ( j ==20) { vet3 [ k ] = vet1 [ i ] ; i ++; continue ; } // V o l t a ao t o p o do f o r

i f ( vet1 [ i ] < vet2 [ j ] ) { vet3 [ k ] = vet1 [ i ] ; i ++; } else { vet3 [ k ] = vet2 [ j ] ; j ++; } }

p r i n t f ( " \ n \ n Vetor 3

") ;

f o r ( i = 0 ; i < 40 ; i++ ) { p r i n t f ( "%d " , vet3 [ i ] ) ; } p r i n t f ( "\n\n" ) ; }

Algoritmo/Programa 9.23: Resposta do exerc 7.3.6 cio


1 2 3 4 5

#include <s t d i o . h>

int g e r a I n t ( int ) ; void imprimeMatriz ( int , int , i n t ) ; i n t m u l t i p l i c a M a t r i z e s ( int , i n t ) ;

9.7 Respostas dos exerc cios do Cap tulo 7

72

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

i n t main ( ) {

s r a n d ( time (NULL) ) ;

i n t matrizUm [ 4 ] [ 6 ] , m a t r i z D o i s [ 6 ] [ 4 ] , m a t r i z P r o d u t o [ 4 ] [ 4 ] ;

int i , j , k ;

// Gera o da matrizUm ca f o r ( i = 0 ; i < 4 ; i++ ) { f o r ( j = 0 ; j < 6 ; j++ ) { matrizUm [ i ] [ j ] = g e r a I n t ( 1 0 ) ; } }

p r i n t f ( " \ n \ nMatriz Um \ n " ) ; f o r ( i = 0 ; i < 4 ; i++ ) { f o r ( j = 0 ; j < 6 ; j++ ) { p r i n t f ( " % d \ t " , matrizUm [ i ] [ j ] ) ; } p r i n t f ( "\n" ) ; }

// Gera o da m a t r i z D o i s ca f o r ( i = 0 ; i < 6 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { matrizDois [ i ] [ j ] = geraInt (10) ; } }

p r i n t f ( " \ n \ nMatriz Dois \ n " ) ; f o r ( i = 0 ; i < 6 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { p r i n t f ( "%d\t" , matrizDois [ i ] [ j ] ) ; } p r i n t f ( "\n" ) ; }

// C l c u l o da m a t r i z P r o d u t o a f o r ( i = 0 ; i < 4 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { matrizProduto [ i ] [ j ] = 0 ; f o r ( k = 0 ; k < 6 ; k++ ) { m a t r i z P r o d u t o [ i ] [ j ] += matrizUm [ i ] [ k ] m a t r i z D o i s [ k ] [ j ] ; } } }

9.7 Respostas dos exerc cios do Cap tulo 7

73

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

p r i n t f ( " \ n \ nMatriz Produto \ n " ) ; f o r ( i = 0 ; i < 4 ; i++ ) { f o r ( j = 0 ; j < 4 ; j++ ) { p r i n t f ( "%d\t" , matrizProduto [ i ] [ j ] ) ; } p r i n t f ( "\n" ) ; }

int g e r a I n t ( int l i m i t e S u p e r i o r ) { int intGerado ; i n t G e r a d o = rand ( ) ; intGerado = intGerado % l i m i t e S u p e r i o r ; return ( i n t G e r a d o ) ; }

Algoritmo/Programa 9.24: Resposta do exerc 7.3.7 cio


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

#include <s t d i o . h>

int quantidade ( ) { int quantidadeDeValores ; p u t s ( " Entre com a quantidade de numeros que deseja ordenar : " ) ; s c a n f ( " % d " ,& q u a n t i d a d e D e V a l o r e s ) ; return ( q u a n t i d a d e D e V a l o r e s ) ; }

int g e r a I n t ( int l i m i t e S u p e r i o r ) { i n t numeroGerado = rand ( ) ; numeroGerado %= l i m i t e S u p e r i o r ; return ( numeroGerado ) ; }

void imprime ( i n t argNUmeros [ ] , i n t argQ ) { int i ; f o r ( i = 0 ; i < argQ ; i++ ) p r i n t f ( " % d " , argNUmeros [ i ] ) ; }

i n t main ( ) { i n t i , j , q , temp ; q = q u a n t i d a d e ( ) ; // q u a n t i d a d e de numeros do v e t o r

i f ( q <= 0 ) { p r i n t f ( " \ nERRO : quantidade negativa ou nula .\ n " ) ;

9.7 Respostas dos exerc cios do Cap tulo 7

74

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

return ( 0 ) ; }

i n t numeros [ q ] ;

s r a n d ( time (NULL) ) ;

// Gera v e t o r f o r ( i = 0 ; i < q ; i ++) numeros [ i ] = g e r a I n t ( 1 0 0 ) ;

p r i n t f ( " \ nVetor gerado :\ n " ) ; imprime ( numeros , q ) ; p r i n t f ( "\n" ) ;

// Ordena v e t o r em ordem c r e s c e n t e f o r ( j = q1 ; j > 0 ; j ) { f o r ( i = 0 ; i < j ; i ++) { i f ( numeros [ i ] > numeros [ i +1]) { temp = numeros [ i ] ; numeros [ i ] = numeros [ i + 1 ] ; numeros [ i +1] = temp ; } } }

p r i n t f ( " \ nVetor ordenado :\ n " ) ; imprime ( numeros , q ) ; p r i n t f ( "\n" ) ;

Referncias Bibliogrcas e a
[1] Anita Lopes and Guto Garcia. Introduo ` programao - 500 algoritmos resolvidos. Elsevier, Rio de ca a ca Janeiro, 1. edition, 2002. [2] Herbert Schildt. Turbo C: guia do usurio. McGraw-Hill, So Paulo, 2. edition, 1988. a a [3] Herbert Schildt. C, completo e total. Pearson Makron Books, So Paulo, 3. edition, 1997. a

You might also like