• Home
  • Chat IA
  • Guru IA
  • Tutores
  • Central de ajuda
Home
Chat IA
Guru IA
Tutores

·

Engenharia de Produção ·

Introdução à Lógica e Programação

Envie sua pergunta para a IA e receba a resposta na hora

Recomendado para você

Lógica de Programação - Trabalho N2 - Cálculo de Salário e Verificação de Números

3

Lógica de Programação - Trabalho N2 - Cálculo de Salário e Verificação de Números

Introdução à Lógica e Programação

UNIFEI

Função de Salvamento de Lista de Compras em CSV

1

Função de Salvamento de Lista de Compras em CSV

Introdução à Lógica e Programação

UNIFEI

Código para Gerenciamento de Listas de Compras

1

Código para Gerenciamento de Listas de Compras

Introdução à Lógica e Programação

UNIFEI

Gerenciador de Lista de Compras via Linha de Comando - Interface e Funcoes

1

Gerenciador de Lista de Compras via Linha de Comando - Interface e Funcoes

Introdução à Lógica e Programação

UNIFEI

Listagem de Itens com Descrição e Quantidade

1

Listagem de Itens com Descrição e Quantidade

Introdução à Lógica e Programação

UNIFEI

Prova Pratica 1 Fundamentos Logica Programacao UNIFEI Itabira

2

Prova Pratica 1 Fundamentos Logica Programacao UNIFEI Itabira

Introdução à Lógica e Programação

UNIFEI

Funções para Gerenciamento de Lista de Compras

1

Funções para Gerenciamento de Lista de Compras

Introdução à Lógica e Programação

UNIFEI

Código do Aplicativo CompraFácil

1

Código do Aplicativo CompraFácil

Introdução à Lógica e Programação

UNIFEI

Leitura de Listas de Compras em CSV com Python

1

Leitura de Listas de Compras em CSV com Python

Introdução à Lógica e Programação

UNIFEI

Tutorial CodeBlocks - Compilação de Classes C++

3

Tutorial CodeBlocks - Compilação de Classes C++

Introdução à Lógica e Programação

UNIFEI

Texto de pré-visualização

Aprendendo Logica de Programacao com a Linguagem C Prof Claudia Akemi Izeki UNIFEI Campus Itabira 27 de Marco de 2022 Sumario 1 Introducao a Linguagem C 1 11 Logica de Programacao 1 12 Algoritmo e Programa 1 13 Linguagem de Programacao e Compilador 3 14 Ambiente de Programacao CodeBlocks 4 141 Criando um Arquivo CC 4 142 Criando um Projeto 6 15 Estrutura Basica de um Programa em C usando o CodeBlocks 6 16 Primeiro Programa 8 17 Instrucoes de Programa 8 18 Comandos Iniciais 9 181 cout Comando de SaıdaEscrita 9 182 cin Comando de EntradaLeitura 9 183 systempause 0 10 184 Caracter que imita a tecla ENTER 10 19 Uso de Comentarios 10 110 Teste de Mesa 11 2 Variaveis e Tipos de Dados 13 21 Declaracao de Variaveis 13 22 Regras para Nomes de Variaveis 13 23 Tipos de Dados de Variaveis ou simplesmente Tipos de Dados 14 24 Exemplo 15 241 Analise e Implementacao 15 i 242 Verificacao do Programa 17 25 Declaracao de Valores Constantes 17 3 Operadores 19 31 Operador de Atribuicao 19 32 Operadores Aritmeticos 19 321 Precedˆencia de Operadores Aritmeticos 20 33 Operadores de Incremento e de Decremento 21 34 Operadores Aritmeticos de Atribuicao 22 35 Operadores Relacionais 23 351 Precedˆencia dos operadores aritmeticos juntamente com os relacionais 24 36 Operadores Logicos 25 361 E Logico 26 362 OU Logico 27 363 N AO Logico 28 364 Mais Exemplos de E e OU Logicos 29 365 Precedˆencia dos Operadores Logicos 30 37 Precedˆencia entre os Operadores Aritmeticos Relacionais e Logicos 31 4 Estruturas Condicionais 33 41 Estrutura Condicional Simples if 34 42 Estrutura Condicional Composta if else 36 43 Encadeamento de Estruturas Condicionais Compostas 39 44 Estruturas Condicionais Aninhadas 43 45 Alternativa de Estrutura Condicional Composta switch 44 5 Funcoes 52 51 Escopo de Variaveis 54 52 Prototipo de Funcao 55 53 Chamada de Funcao 55 54 Definicao de Funcao 56 55 Retorno de Funcao 56 ii 56 Funcoes com Passagem de Parˆametro 59 561 Passagem de Parˆametro por Valor 59 562 Passagem de Parˆametro por Referˆencia 59 6 Estruturas Condicionais com Funcoes 62 61 Pseudocodigo 62 62 Variaveis 63 63 Entrada de Dados 63 64 Validade das Datas 64 65 Verificacao da Maior Data 65 66 Juntando Tudo 67 7 Estruturas de Repeticao 70 71 O Laco do while 72 711 Exemplo Usando o Laco do while 72 712 Outro Exemplo Usando o Laco do while 75 72 O Laco while 75 721 Exemplo Usando o Laco while 76 722 Outro Exemplo Usando o Laco while 78 73 O Laco for 80 731 Exemplo Usando o Laco for 81 732 Outro Exemplo Usando o Laco for 82 74 Estruturas de Repeticao com Funcoes 84 741 O Problema 84 742 O Pseudocodigo 84 743 O Programa 85 8 Vetores 89 81 Definicao de Vetor 90 82 Declaracao de Vetor 91 83 Acesso a um Elemento do Vetor 91 84 Um Exemplo de Programa Utilizando um Vetor 91 85 Funcoes Passando Vetor como Parˆametro 93 iii 9 Strings 96 91 Definicao de String 96 92 Declaracao de String 96 93 Alguns ComandosFuncoes com Strings 97 94 Um Exemplo Utilizando String 97 95 Outro Exemplo utilizando String 99 96 Strings como Parˆametros em Funcoes 100 10 Matrizes 101 101 Definicao de Matriz 101 102 Declaracao de Matriz 101 103 Acesso a Elemento de Matriz 101 104 Um Exemplo Utilizando Matriz 102 105 Funcoes Passando Matriz como Parˆametro 104 11 Registros 106 111 Definicao de Registros 106 112 Forma Geral de um Tipo de Dado Registro 106 113 Declaracao de uma Variavel do Tipo de Dado Registro 107 114 Acesso a Membros de um Registro 107 115 VetoresMatrizes como Membros de um Registro 108 116 Funcoes Passando um Registro Simples como Parˆametro 108 117 Funcoes Passando um Vetor de Registro como Parˆametro 110 118 Funcoes que Retornam um Registro 111 119 Inicializacao de Variaveis do Tipo Registro 112 1110Atribuicoes entre Registros 112 1111Registros Aninhados 112 Referˆencias Bibliograficas 114 A Erros Comuns na Programacao Usando o Ambiente CodeBlocks 115 A1 Erros Comuns na Compilacao 115 A2 Erros Comuns de Logica 117 iv B Boas Praticas de Programacao 119 C Revisao de Conceitos Matematicos Muito Utilizados 127 v Lista de Exemplos 21 C Declaracao de uma variavel do tipo inteiro 13 22 C Declaracao de mais de uma variavel do tipo inteiro 13 31 C Um caso de uso do operador maior ou igual que 23 32 C Precedˆencia do operador aritmetico sobre o relacional 24 33 C Um caso de uso do operador logico E 26 34 C Outro caso de uso do operador logico E 27 35 C Um caso de uso do operador logico OU 28 36 C Outro caso de uso do operador logico OU 28 37 C Um caso de uso do operador logico NAO 29 38 C Um exemplo do emprego da precedˆencia dos operadores logicos 30 39 C Um exemplo analogo ao anterior Exemplo 38 mas com o uso INCORRETO dos operadores logicos 31 310 C Um caso de uso da precedˆencia de operadores aritmeticos relacionais e logicos 32 41 C Trecho de codigo que utiliza a condicional simples sem chaves 34 42 C Trecho de codigo que utiliza a condicional simples com chaves 35 43 C Trecho de codigo que utiliza sequencialmente varias condicionais simples sem chaves 35 44 C Programa que faz a divisao de dois numeros inteiros passados pelo usuario 38 45 C Programa que representa uma calculadora de 4 operacoes matematicas 41 46 C Programa correspondente ao anterior Exemplo 45 mas perceba que nao foram inseridas algumas chaves pois uma estrutura if else e considerada como um unico comando 46 47 C Programa correspondente ao anterior Exemplo 46 mas perceba que a palavrachave if a partir do segundo if foi colocada na mesma linha do else colocandose o par de chaves e do corpo do else na mesma linha imaginaria vertical do i do primeiro if 47 48 C Programa que dada uma media de 00 a 100 verifica seu conceito A 8 0 10 0 B 7 0 8 0 C 6 0 7 0 D 5 0 6 0 e E 0 0 5 0 48 49 C Programa que coloca 3 valores inteiros em ordem crescente 49 410 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch 50 411 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch com alguns casos sem break 51 51 C Programa que chama varias funcoes matematicas definidas na biblioteca cmath 53 81 C Exemplo de vetor de numeros reais com cinco posicoes 91 82 C Alguns acessos de elementos do vetor notas 91 101 C Alguns acessos de elementos da matriz mat 102 vi Lista de Tabelas 11 Teste de mesa do primeiro programa comentado apresentado em Listing 16 Su ponha que os valores entrados pelo usuario para as variaveis num1 e num2 sejam respectivamente 12 e 7 12 21 Alguns tipos de dados em C 15 22 Teste de mesa do programa apresentado em Listing 21 Suponha que o usuario tenha entrado com o valor 553 para o preco de produto 17 31 C Operadores aritmeticos 19 32 C Precedˆencia dos operadores aritmeticos 20 33 C Exemplos de operadores aritmeticos de atribuicao 23 34 C Operadores relacionais op1 e op2 sao operandos 23 35 Tabelaverdade do E logico 26 36 Tabelaverdade do OU logico 27 37 Tabelaverdade do NAO logico 29 38 C Precedˆencia entre os operadores logicos 30 39 C Precedˆencia entre os operadores aritmeticos relacionais e logicos 32 41 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 0 38 42 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 4 39 43 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a 42 44 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a 42 51 Teste de mesa para o programa apresentado em Listing 51 com tam igual a 1 para facilitar o teste de mesa 55 52 Teste de mesa com valores 15 e 67 para as variaveis n1 e n2 para o programa de Listing 52 58 53 Teste de mesa com valores 9 e 7 para as variaveis a e b 61 71 Teste de mesa para o programa de area de triˆangulos 74 72 Teste de mesa para o programa da tabuada do 4 que utiliza while 77 73 Tabela de iteracoes correspondente ao programa da tabuada do 4 apresentado em Listing 77 78 74 Teste de mesa do programa apresentado em Listing 78 com uma unica entrada zero 79 75 Teste de mesa do programa apresentado em Listing 78 com as entradas 12 20 18 e 0 80 76 Tabela de iteracoes correspondente ao programa de Listing 78 com o teste corres pondente ao da Tabela 75 80 77 Teste de mesa para o programa da tabuada do 4 utilizando o laco for 82 78 Tabela de iteracoes correspondente ao programa da media de 10 idades apresentado em Listing 713 83 vii 81 Teste de mesa para o programa de media de notas de cinco alunos usando um vetor Suponha que os valores a serem inseridos no vetor sao na ordem 65 40 90 60 e 85 92 91 Vetor mes apos a leitura da string Abril 98 92 Vetor abrev antes da abreviacao 98 93 Vetor abrev apos a abreviacao 98 94 Vetor cid1 apos a entrada da string Araraquara 100 95 Vetor cid2 apos a entrada da string Boa Vista 100 96 Vetor cid2 apos as substituicoes 100 viii Listings 11 Pseudocodigo correspondente ao fluxograma da Figura 11 3 12 C Programa correspondente ao Pseudocodigo de Listing 11 3 13 C Programa cujo objetivo e imprimir Hello World na tela 5 14 Estrutura basica de um programa em C usando o CodeBlocks 7 15 C Primeiro programa somacpp 8 16 C Programa da soma comentado 10 21 C Resolucao do problema de reajuste de preco de um produto 16 22 C Exemplo de declaracao e uso de constante para representar o valor de pi 18 41 C Forma geral da estrutura condicional simples sem chaves 34 42 C Forma geral da estrutura condicional simples com chaves 35 43 C Forma geral da estrutura condicional composta sem chaves 37 44 C Forma geral da estrutura condicional composta com chaves 37 45 C Forma geral da estrutura condicional switch 44 51 C Programa que apresenta prototipo chamada a funcao desenha linha e sua definicao de funcao Apresenta tambem variaveis locais e globais 54 52 C Programa que possui a definicao da funcao verifica maior que retorna o maior de dois numeros inteiros 57 53 Programa que mostra o uso de passagem de parˆametro por referˆencia 60 61 C Declaracao de variaveis que representam as datas 63 62 C Funcao que realiza a entrada de uma data dia mes e ano com parˆametros passados por referˆencia 63 63 C Chamada a funcao entradaData 63 64 C Funcao validaData 65 65 C Funcao verificaMaiorData 66 66 C Programa que verifica qual data de duas e a maior Tambem valida as datas 67 ix 71 C Forma geral do laco do while 72 72 C Programa que calcula a area de um triˆangulo 72 73 C Programa que calcula a area de um triˆangulo enquanto o usuario desejar 73 74 C Programa que repete um menu de opcoes ate que o usuario digite 0 para sair 75 75 C Forma geral do laco while com apenas uma unica instrucao no corpo do laco 76 76 C Forma geral do laco while com mais de uma instrucao no corpo do laco Verifique o uso obrigatorio das chaves 76 77 C Programa da tabuada do 4 utilizando o laco while 76 78 C Programa que calcula a media de idades de uma quantidade nao determinada de pessoas 78 79 C Forma geral do laco for com apenas uma unica instrucao no corpo do laco 80 710 C Forma geral do laco for com mais de uma instrucao no corpo do laco 81 711 C Resolucao da tabuada do 4 usando o laco for 81 712 C Como o laco while pode substituir o laco for 82 713 C Programa que calcula a media de idades de 10 pessoas utilizando o laco for 83 714 C 85 81 C Programa que calcula a media de notas de cinco alunos utilizandose uma variavel para cada nota 89 82 C Programa que calcula a media de notas de cinco alunos utilizandose apenas uma variavel para armazenar a nota de todos os alunos uma por vez 90 83 C Programa que calcula a media de cinco alunos utilizando um vetor 92 84 C Programa modularizado com funcoes 94 91 C Programa em que o desenvolvedor monta uma string caracter a caracter 97 92 C Programa que ilustra a manipulacao de algumas funcoes da biblioteca cstring 99 101 C Programa que manipula matriz numerica 103 102 C Programa modularizado com matrizes 104 111 C Programa que manipula registro simples como parˆametro em funcao 109 112 C Programa que manipula vetor de registro como parˆametro em funcao 110 113 C Programa que possui uma funcao que retorna um registro 111 114 C Programa que mostra a inicializacao de variaveis do tipo registro 112 115 C Programa que mostra a atribuicao entre registros 112 116 C Programa que mostra o uso de registros aninhados 113 x A1 Definicao de funcao INCORRETA 116 B1 somacpp 119 B2 Programa sem indentacao na funcao main INCORRETO 120 B3 Programa com indentacao na funcao main CORRETO 121 B4 Corpo de uma estrutura if sem indentacao INCORRETO 122 B5 Corpo de uma estrutura if com indentacao CORRETO 122 B6 Corpo de uma estrutura while sem indentacao INCORRETO 123 B7 Corpo de uma estrutura while com indentacao CORRETO 123 B8 Corpo de uma estrutura for sem indentacao INCORRETO 123 B9 Corpo de uma estrutura for com indentacao CORRETO 123 B10 Corpo de uma estrutura dowhile sem indentacao INCORRETO 123 B11 Corpo de uma estrutura dowhile com indentacao CORRETO 124 B12 Programa sem indentacao INCORRETO 124 B13 Programa com indentacao CORRETO 125 xi Licenca e uso da obra Este material tratase de uma obra derivada de varias outras obras existentes a respeito da area de Logica e Linguagem de Programacao O mesmo e utilizado em disciplinas ministradas pela autora Este material foi produzido usando o formatador de textos LATEXversao MikTEX2a no sistema opera cional Microsoft Windows com o editor TEXnicCenterb O autor disponibiliza a obra no formato PDF e os arquivosfonte compactados em um arquivo ZIP Qualquer mudanca ou uso deste material deve ser informado ao autor pelo email cizekihotmailcom aO compilador MikTEXpode ser obtido no endereco httpwwwmiktexorg bO editor de texto LATEXTEXnicCenter pode ser obtido no endereco httpwwwtoolscenterorg xii CAPITULO 1 Introducao a Linguagem C 11 Logica de Programacao Podese pensar em logica como a arte de bem pensar ou a ordem correta do pensamento No diaadia utilizase logica para organizar os pensamentos como 1 A gaveta esta fechada O grampeador esta dentro da gaveta Assim devese abrir a gaveta para pegar o grampeador ou ainda 2 Luciane e mais velha que Claudia Claudia e mais velha que Marcos Portanto Luciane e mais velha que Marcos Ja a logica na programacao envolve o uso correto do raciocınio objetivando o desenvolvimento de tecnicas que cooperem para a producao de solucoes logicamente validas e coerentes resolvendo com qualidade os problemas que se deseja programar Da mesma forma que um mesmo raciocınio pode ser representado em diversos idiomas a logica de programacao independe da linguagem utilizada sendo portanto empregado o uso de algoritmos 12 Algoritmo e Programa Para resolver um problema computacional utilizase algoritmo que e uma sequˆencia finita de passos para atingir um objetivo bem definido No diaadia algoritmos sao utilizados constante mente em situacoes como trocar pneu de um carro fazer uma omelete buscar as criancas na escola etc 1 Na elaboracao de um algoritmo devem ser especificados passos claros e precisos que partindo de um estado inicial apos um perıodo de tempo finito produzem um estado final previsıvel e bem definido A descricao de um algoritmo pode ser realizada atraves de pseudocodigo linguagem seme lhante a natural com algumas regras comuns as linguagens de programacao ou de fluxogramas representados por desenhos A implementacao de um algoritmo e chamado de programa ou seja a codificacao de um algoritmo em alguma linguagem de programacao Segundo Ascencio Campos 2007 as etapas para o desenvolvimento de um programa sao 1 Analise estudase o enunciado do problema para definir os dados de entrada o processamento e os dados da saıda 2 Algoritmo para descrever o algoritmo podese utilizar descricao narrativa fluxograma ou pseudocodigo 3 Codificacao o algoritmo e transformado em codigos da linguagem de programacao escolhida para trabalhar que no nosso caso e a linguagem C Nao menos importante esta a etapa de Testes na qual e verificada a corretude do programa ou seja comparase a resposta obtida com a resposta esperada Seja o seguinte problema pedir ao usuario sua idade e verificar se ele e maior ou menor de idade O fluxograma o pseudocodigo e o programa correspondentes a solucao desse problema sao apresentados na Figura 11 Listing 11 e Listing 12 respectivamente Nao se preocupe se nao entender essas partes detalhadamente E necessario que vocˆe apenas verifique a forma de cada uma delas Figura 11 Representacao em fluxograma da solucao do problema de verificar se uma pessoa e maior ou menor de idade 2 Listing 11 Pseudocodigo correspondente ao fluxograma da Figura 11 1 INICIO 2 VARIAVEIS idade 3 4 idade entrada de dados TECLADO 5 se idade 18 entao 6 imprimir MONITOR Maiordeidade 7 caso contrario 8 imprimir MONITOR Menordeidade 9 FIM Listing 12 C Programa correspondente ao Pseudocodigo de Listing 11 1 include iostream 2 include cstdlib 3 using namespace std 4 5 int main 6 7 int idade 8 9 cout Entrecomsuaidade 10 cin idade 11 12 i f idade 18 13 cout Maiordeidade 14 else 15 cout Menordeidade 16 17 system pause 18 19 return 0 20 13 Linguagem de Programacao e Compilador Da mesma forma que nos seres humanos precisamos de uma linguagem para nos comunicar uma linguagem de programacao serve de comunicacao entre o indivıduo que deseja resolver um determinado problema e o computador escolhido para ajudalo na solucao Entretanto o computador entende apenas a linguagem de maquina dita de mais baixo nıvel que consiste de sequˆencias de zeros e uns Assim programar em uma linguagem de mais baixo nıvel e mais difıcil e trabalhoso para o programador Atualmente as linguagens de programacao mais utilizadas sao aquelas ditas de alto nıvel consideradas mais proximas da linguagem humana sendo portanto mais faceis que linguagens de baixo nıvel C e um exemplo de linguagem de alto nıvel Todavia linguagem de alto nıvel nao e a linguagem que o computador entende Assim o programador deve usar um compilador para converter o programa feito em linguagem de alto nıvel 3 para codigo em linguagem de maquina Caso existam erros de sintaxe no programa a conversao nao e realizada 14 Ambiente de Programacao CodeBlocks CodeBlocks e um ambiente de desenvolvimento integrado IDE Integrated Development En vironment gratis para a linguagem CC Com ele podese editar um programa compilalo e executalo Um programa e uma sequˆencia de instrucoes codificadas em uma linguagem de programacao que para ser executado precisa estar armazenado na memoria do computador O CodeBlocks e multiplataforma operacional ou seja a mesma versao funciona em sistemas operacionais Linux Mac e Windows Consequentemente todos os projetos criados no CodeBlocks funcionam em diferentes sistemas operacionais Visite o site do CodeBlocks httpwwwcodeblocksorgdownloads e baixe a versao binaria binary release para seu sistema operacional preferido Recomendase baixar a versao que vem com o compilador Por exemplo para Windows na versao 2003 do Codeblocks recomenda se baixar o arquivo codeblocks2003mingwsetupexe O CodeBlocks permite duas formas de criar programas em CC 1 Criando um arquivo CC 2 Criando um projeto 141 Criando um Arquivo CC A primeira e a forma mais simples de comecar a programar em linguagem CC Para criar um programa inicial realize os seguintes passos 1 Clique na opcao do menu File escolha New depois selecione File 2 Na janela aberta escolha o ıcone CC Source 3 Clique no botao Next 4 Na janela aberta escolha a opcao C e clique no botao Next 5 Depois clique no botao trˆes pontinhos para selecionar a pasta onde sera criado o arquivo 6 Escolhida a pasta dˆe um nome ao arquivo Por exemplo olamundocpp 7 Clique no botao Salvar 8 Clique no botao Finish 9 Para testar o seu arquivo digite o codigo de Listing 13 pag 5 sem copiar a numeracao Dica e melhor digitar o codigo em vez de utilizar CTRLC CTRLV Compile e execute seu programa indo no menu Build Build and Run ou simplesmente acionando a tecla F9 Se houver erros na compilacao serao apresentadas a linha e a descricao do possıvel 4 erro conforme mostrado na Figura 12 pag 5 Caso a janela de erros nao esteja visıvel va em View Logs Caso nao haja erros na compilacao o compilador gerara um arquivo executavel e o programa sera executado automaticamente conforme Figura 13 pag 5 Listing 13 C Programa cujo objetivo e imprimir Hello World na tela 1 include iostream 2 using namespace std 3 4 int main 5 6 cout HelloWorld endl 7 return 0 8 Figura 12 Apresentacao de erros na aba Build messages Verifique que ha indicacao do numero da linha do erro e sua mensagem a fim de que possa corrigilo Neste caso faltou pontoevırgula ao final da linha 6 Fonte captura de tela Figura 13 Tela de execucao do programa hellocpp Fonte captura de tela 5 142 Criando um Projeto Um projeto no CodeBlocks consiste em criar uma pasta contendo um ou mais arquivos escritos na linguagem CC E uma boa pratica de programacao para organizar seus programas Para criar um novo projeto siga os passos 1 Clique na opcao do menu File escolha New depois selecione Project 2 Escolha o tipo do projeto Console Application e clique em Go 3 Clique em Next 4 Escolha a opcao C e clique no botao Next 5 Digite o tıtulo do projeto exemplo Hello e escolha a pasta folder onde sera criado o projeto Clique em Next 6 Selecione o compilador GNU GCC Compiler geralmente ja estara selecionado e clique em Finish 7 Pronto Seu projeto foi criado com um arquivo chamado maincpp Na aba Projects da janela Management estara o seu projeto Clique no ıcone correspondente a pasta denominada Sources e clique duplamente no arquivo maincpp que tera um conteudo semelhante ao codigo CC da Figura 14 a seguir Para compilar e executar seu projeto tecle F9 Caso haja erros na compilacao serao apresentadas mensagens na janela Build messages como na Figura 12 apresentada anteriormente Caso a janela de erros nao esteja visıvel va em View Logs Caso nao tenha ocorrido erros sera apresentada uma janela como na Figura 13 tambem apresentada anteriormente 15 Estrutura Basica de um Programa em C usando o CodeBlocks Um programa C consiste na definicao de uma ou mais funcoes Na Figura 15 a seguir e apresentada a forma geral de definicao de funcao que possui um tipo de dado de retorno ou simplesmente tipo da funcao um nome acompanhado de parˆenteses e dentro deles a declaracao de parˆametros se houver A seguir devese inserir uma chave de abertura de bloco escrever as instrucoes no corpo da funcao e terminar com uma chave de fechamento de bloco Todo programa C deve possuir uma funcao chamada main do inglˆes principal Listing 14 a seguir na qual a execucao se inicia com a chave de abertura e apos executar as instrucoes contidas no corpo da funcao termina quando e encontrada a chave de fechamento Verifique que no inıcio do programa ha a inclusao de biblioteca que e um arquivo necessario para a execucao de comandos utilizados no decorrer do programa Devese incluir cada biblioteca com o comando includenomeDeBiblioteca 6 Figura 14 Projeto chamado Hello com um arquivo maincpp com conteudo padrao Fonte captura de tela Figura 15 C Forma geral de definicao de funcao Listing 14 Estrutura basica de um programa em C usando o CodeBlocks include nomeDeBiblioteca using namespace std int main instrucao1 instrucao2 instrucaon return 0 7 16 Primeiro Programa Em Listing 15 e apresentado um exemplo de programa cuja finalidade e calcular e imprimir a soma de dois numeros inteiros passados pelo usuario Listing 15 C Primeiro programa somacpp 1 include iostream 2 include cstdlib 3 using namespace std 4 5 int main 6 7 int num1 num2 soma 8 9 cout Somadedoisnumeros 10 11 cout Entrecomoprimeironumero 12 cin num1 13 14 cout Entrecomosegundonumero 15 cin num2 16 17 soma num1 num2 18 19 cout Asomae 20 cout soma 21 22 system pause0 23 24 return 0 25 Podese digitar o codigo e salvalo com o nome somacpp sem as aspas O sufixo cpp indica programafonte em C plus plus do inglˆes C mais mais O programa possui apenas uma definicao de funcao a main O nome de uma funcao pode ser qualquer um com excecao da main reservado para a funcao que inicia a execucao do programa Se um programa for constituıdo de uma unica definicao de funcao esta sera main O programa termina quando for encerrada a execucao dessa funcao A funcao main do programa apresentado e do tipo int que indica que a funcao possui valor de retorno inteiro no caso o zero Esse valor zero indica que a execucao do programa foi normal repare na Figura 13 a mensagem Process returned 0 0x0 em contraste quando ocorre interrupcao anormal do programa um exemplo e a divisao por zero 17 Instrucoes de Programa Geralmente as instrucoes C terminam em um pontoevırgula O primeiro programa Listing 15 possui varias instrucoes e sao executadas na ordem em que sao escritas 8 i A execucao do programa se inicia pela funcao main A chave de abertura na linha 6 indica o inıcio da funcao main ii Na linha 7 sao declaradas trˆes variaveis do tipo inteiro int iiii Na linha 9 o comando cout seguido de imprime na tela tudo o que esta entre aspa dupla ou seja a frase Soma de dois numeros iv Na linha 11 e impressa uma frase que pede ao usuario um numero inteiro v Na linha 12 o comando cin seguido de e do nome da variavel num1 espera o usuario entrar com algum dado que e colocado na variavel indicada vi As instrucoes das linhas 14 e 15 seguem a mesma explicacao das linhas 11 e 12 vii Na linha 17 e realizada a soma com os valores passados pelo usuario nas variaveis num1 e num2 atribuindo o resultado a variavel soma viii Na linha 19 e impressa a frase A soma e ix Na linha 20 e impresso o valor que esta na variavel soma Perceba que neste caso nao foi utilizada aspas foi apenas escrito o nome da variavel Caso se utilizasse as aspas seria impressa a palavra soma e nao o valor que esta na variavel soma x A chamada a funcao system com parˆametro pause 0 faz com que se espere a digitacao de alguma tecla para continuar a execucao do programa ou seja faz com que o usuario consiga visualizar o resultado na tela xi A instrucao na linha 24 retorna 0 ao sistema operacional indicando que ele foi executado e terminado corretamente Quando um programa e terminado antes da hora ele retorna um valor qualquer ao sistema indicando erro durante a execucao xii A chave na linha 25 denota o fim da funcao main ou seja o fim da execucao do programa 18 Comandos Iniciais 181 cout Comando de SaıdaEscrita cout pronunciase C out saıda esta associado a saıda padrao geralmente o vıdeo O operador conecta a mensagem a ser impressa a cout As definicoes e declaracoes necessarias para seu uso estao contidas na biblioteca iostream que tambem contem os elementos necessarios para a execucao de operacoes de leitura e impressao IO InputOutput 182 cin Comando de EntradaLeitura cin pronunciase C in entrada manipula toda a entrada do teclado por meio do operador que conecta a entrada de dados a variavel que a contera As definicoes necessarias ao uso de cin e estao na biblioteca iostream 9 183 systempause 0 A chamada a funcao system com parˆametro pause 0 faz com que se espere a digitacao de alguma tecla para continuar a execucao do programa Pode ser utilizada para o usuario conseguir visualizar o resultado na tela quando se executa o programa clicando diretamente no arquivo executavel exe Caso a funcao nao seja chamada o usuario nao conseguira ver a saıda pois a janela e fechada Caso se escreva apenas systempause e impressa na tela a mensagem Pressione qualquer tecla para continuar Devese incluir a biblioteca cstdlib 184 Caracter que imita a tecla ENTER Alem da tecla ENTER varios outros caracteres nao podem ser digitados do teclado para dentro do programa Esses caracteres que nao podem ser obtidos diretamente do teclado sao codificados em C por meio da combinacao do sinal barra invertida com outros caracteres Para imitar a tecla ENTER use o caracter 19 Uso de Comentarios Comentarios sao textos que podem ser inseridos em programas com o objetivo de documentalo Os comentarios nao sao analisados pelo compilador Os comentarios podem ocupar uma ou varias linhas podendo ser utilizados de duas formas 1 A regiao de comentarios e aberta pelos sımbolos e e encerrada automaticamente ao final da linha 2 A regiao de comentarios e aberta com os sımbolos e e encerrada com os sımbolos Em Listing 16 e apresentado o primeiro programa utilizando as duas formas de comentarios Listing 16 C Programa da soma comentado 1 2 P r o g r a m a d o r C l a u d i a A I z e k i 3 D a t a 7 1 2 2 0 0 5 4 D e s c r i c a o P r o g r a m a q u e c a l c u l a a s o m a d e d o i s n u m e r o s i n t e i r o s 5 p a s s a d o s p e l o u s u a r i o 6 7 I n c l u s a o d e b i b l i o t e c a s 8 include iostream P a r a u s o d e c i n e c o u t 9 include cstdlib P a r a u s o d a f u n c a o s y s t e m 10 using namespace std 11 12 F u n c a o p r i n c i p a l 13 int main 14 15 D e c l a r a c a o d e v a r i a v e i s 16 int num1 num2 soma 17 10 18 I m p r i m e o o b j e t i v o d o p r o g r a m a a o u s u a r i o 19 cout Somadedoisnumeros 20 21 P e d e um n u m e r o a o u s u a r i o 22 cout Entrecomoprimeironumero 23 cin num1 O q u e o u s u a r i o d i g i t a r e i n s e r i d o em num1 24 25 P e d e a o u s u a r i o o u t r o n u m e r o 26 cout Entrecomosegundonumero 27 cin num2 O q u e o u s u a r i o d i g i t a r e i n s e r i d o em num2 28 29 C a l c u l a a s o m a 30 soma num1 num2 31 32 I m p r i m e a s o m a 33 cout Asomae 34 cout soma 35 36 E s p e r a o p r e s s i o n a m e n t o d e a l g u m a t e c l a Com i s s o o 37 u s u a r i o c o n s e g u e v i s u a l i z a r o r e s u l t a d o 38 system pause0 39 40 return 0 41 110 Teste de Mesa Um recurso muito utilizado para verificar erros de logica em um algoritmo e a simulacao ou teste de mesa Segundo Salvetti e Barbosa 1998 a partir de dados escolhidos com resposta co nhecida simulase a execucao do algoritmo e comparase a resposta obtida com a resposta esperada Se nao houver coincidˆencia esta detectado um erro embora a recıproca nao seja verdadeira Saber escolher os dados para os testes e de muita importˆancia na simulacao Assim devese escolher amostras de dados de forma que provoquem a execucao de todas as instrucoes presentes no algoritmo testando todas as diferentes possibilidades de saıda Para realizar o teste de mesa sao listadas todas as variaveis utilizadas no algoritmo e registrados todos os valores assumidos pelas variaveis na ordem em que ocorrem Para localizar facilmente a variavel que foi definida ou alterada em um dado momento e con veniente identificar com um numero cada uma das instrucoes contidas no algoritmo Na Tabela 11 e apresentado um teste de mesa do primeiro programa Listing 16 pag 10 Verifique que o sımbolo indica a ordem de execucao das instrucoes indica o numero da instrucao sendo executada o sublinhado indica valor definido ou modificado o pontilhado indica impressao e a saıda e alguma impressao com o comando cout 11 Tabela 11 Teste de mesa do primeiro programa comentado apresentado em Listing 16 Suponha que os valores entrados pelo usuario para as variaveis num1 e num2 sejam respectivamente 12 e 7 Variaveis Saıda num1 num2 soma 1 16 lixo lixo lixo 2 19 lixo lixo lixo Soma de dois numeros 3 22 lixo lixo lixo Entre com o primeiro numero 4 23 12 lixo lixo 5 26 12 lixo lixo Entre com o segundo numero 6 27 12 7 lixo 7 30 12 7 19 8 33 12 7 19 A soma e 9 34 12 7 19 19 10 38 12 7 19 Espera o pressionamento de alguma tecla 12 CAPITULO 2 Variaveis e Tipos de Dados Variaveis sao os aspectos fundamentais de qualquer linguagem de computador Segundo Mizrahi 1994 uma variavel em C e um espaco de memoria reservado para armazenar um certo tipo de dado e possui um nome para referenciar seu conteudo Uma variavel pode conter a cada tempo valores diferentes Na Secao 16 pagina 8 foi apresentado um programa com trˆes variaveis do tipo inteiro num1 num2 e soma utilizadas para armazenar respectivamente as entradas do usuario e o resultado da adicao 21 Declaracao de Variaveis Antes de comecar a armazenar dados em uma variavel devese declarala escrevendo seu tipo seguido por um ou mais espacos um nome e um pontoevırgula No Exemplo 21 e declarada uma variavel num para armazenar um valor inteiro Exemplo 21 C Declaracao de uma variavel do tipo inteiro int num Podese criar mais de uma variavel do mesmo tipo em uma instrucao escrevendose o tipo e entao os nomes das variaveis separados por vırgulas e um pontoevırgula no final No Exemplo 22 sao declaradas trˆes variaveis do tipo inteiro num1 num2 e soma Exemplo 22 C Declaracao de mais de uma variavel do tipo inteiro int num1 num2 soma E boa pratica de programacao utilizar nomes significativos para variaveis tornandoas faceis de entender o que facilita a manutencao do programa 22 Regras para Nomes de Variaveis O nome de uma variavel e utilizado para sua identificacao e posterior uso em um programa Assim e necessario estabelecer algumas regras de utilizacao 13 1 O primeiro caracter do nome da variavel deve ser sempre uma letra ou o caracter subli nhado 2 Os demais caracteres podem ser letras numeros e o caracter 3 Nomes de variaveis nao podem ser iguais as palavras reservadas da linguagem como por exemplo int float if e else 4 A linguagem C distingue as letras maiusculas e minusculas ou seja e case sensitive Por exemplo ABC e abc sao diferenciadas pela linguagem 23 Tipos de Dados de Variaveis ou simplesmente Tipos de Dados O tipo de uma variavel informa a quantidade de memoria em bytes que a variavel ocupara e a forma como um valor devera ser armazenado e interpretado A classificacao dos tipos de dados pode ser vista na Figura 21 onde temse os tipos numerico logico e literal O tipo de dados numerico e classificado em inteiro e real Ja o tipo literal e classificado em caracter e string Figura 21 Tipos de dados primitivos 1 Tipos de dados numericos inteiros sao dados numericos positivos e negativos incluindo o zero Nao podem ser fracionarios e sao representados pelo tipo int Exemplos i idades de pessoas podem ser consideradas do tipo inteiro como 18 25 e 68 ii alturas em centımetros sao do tipo inteiro como 154 176 e 200 iii quantidade de filhos tambem e inteira como 0 2 e 7 2 Tipos de dados numericos reais sao dados numericos positivos e negativos incluindo o zero Podem ser fracionarios e sao representados pelos tipos float e double Por exemplo saldos de contas de banco sao do tipo real como 12045 00 e 34598 alturas de pessoas em metros sao do tipo real como 154 176 e 20 temperatura em graus Celsius tambem sao como 365 372 e 400 3 Tipos de dados literal relacionado a um unico caracter ou a uma sequˆencia de caracteres E representado pelo tipo char Exemplos de caracteres letras numeros sinais de pontuacao e caracteres especiais Uma sequˆencia de caracteres e chamada de string Para diferenciar um caracter de uma string usase apostrofo para o primeiro e aspa para o segundo Exemplo s e um caracter Hello World e uma string 14 4 Tipos de dados logicos ou booleanos sao dados que representam dois possıveis valores verdadeiro true ou falso false Exemplo Na pergunta O ano X e bissexto a resposta pode ser true ou false dependendo de X Na Tabela 21 sao apresentados alguns tipos de dados em C Podese considerar que os 6 primeiros tipos sao os basicos da linguagem os demais utilizam os modificadores unsigned long e short O modificador unsigned significa que se pode armazenar somente numeros positivos incluindo o zero O modificador short normalmente se refere a um inteiro de 2 bytes e o long mais frequentemente a um inteiro de 4 bytes mas nenhum desses e certo A linguagem exige apenas que um short seja mais curto ou igual a um inteiro e que um inteiro seja mais curto ou igual a um long Para saber quantos bytes um determinado tipo possui utilize a funcao sizeoftipo exemplo sizeofint retornara a quantidade de bytes de um int e sizeofshort int retornara a quantidade de bytes de um short int Tabela 21 Alguns tipos de dados em C Tipo Tamanho Valores aproximados int 4 bytes 2147483648 a 2147483647 char 1 byte 256 valores de caracteres float 4 bytes 34e38 a 34e38 double 8 bytes 17e308 a 17e308 void 0 Nenhum valor bool 1 2 valores 1 true 0 false unsigned int 4 bytes 0 a 4294967295 short int 2 bytes 32768 a 32767 unsigned short int 2 bytes 0 a 65535 long int 4 bytes 2147483648 a 2147483647 unsigned long int 4 bytes 0 a 4294967295 24 Exemplo Um produto sofrera um aumento de 10 Escreva um programa que peca ao usuario o preco de um produto calcule e mostre em reaisR qual sera o valor do aumento e o valor reajustado do produto 241 Analise e Implementacao Para resolver esse e outros problemas devese ter em mente os seguintes passos 1 Quais sao as entradas do programa geralmente sao pedidas ao usuario mas tambem podem vir de outras fontes como um banco de dados ou um arquivo 2 Qual e o processamento o que se deve fazer com essas entradas verificar calcular modificar etc 3 Quais sao as saıdas 15 Neste exemplo a entrada do programa e o preco de um produto no enunciado do exercıcio peca ao usuario o preco de um produto De que tipo ele e para se fazer a declaracao Preco e um numero real assim utilizase o tipo float O que se deve fazer com a entrada Calcular o aumento de 10 e o preco reajustado no enunciado calcule qual sera o valor do aumento e o valor reajustado do produto Como fazer isso Podese empregar a regra de trˆes prod 100 21 aum 10 22 aum 100 prod 10 23 aum prod 10 100 24 aum prod 0 10 25 Assim podese chegar a Equacao 24 aum prod10100 ou simplesmente a Equacao 25 aum 010 prod Perceba que na Equacao 25 foi utilizado o ponto no lugar da vırgula em 010 Assim toda vez que for escrever um numero com casas decimais na linguagem C nao use vırgula use o ponto Tendose o valor do aumento e so somalo com o valor do produto para encontrar o preco reajustado Os nomes de variaveis utilizadas para armazenar esses valores foram respectivamente aum prod e prod reaj Por ultimo e so imprimir o que se pede no exercıcio no enunciado mostre qual sera o valor do aumento e o valor reajustado do produto Analise como esse problema foi solucionado no programa apresentado em Listing 21 a seguir Listing 21 C Resolucao do problema de reajuste de preco de um produto 1 include iostream 2 include cstdlib 3 using namespace std 4 5 int main 6 7 float prod aum prod reaj 8 9 cout Entrecomovalordoproduto 10 cin prod 11 12 aum prod 0 1 0 13 14 prod reaj prod aum 16 15 16 cout Valordoaumento aum 17 cout Valordoprodutoreajustado prod reaj 18 19 system pause0 20 21 return 0 22 242 Verificacao do Programa A execucao do programa apresentado anteriormente em Listing 21 segue os seguintes passos mas pode ser observada no teste de mesa da Tabela 22 a seguir Suponha que o usuario tenha entrado com o valor 553 para o preco do produto i Linha 7 quando ocorre a declaracao de variaveis na funcao main elas estao com valor de lixo ou seja estao com algum valor que estao naquelas posicoes de memoria ii Linha 9 imprime na tela Entre com o valor do produto iii Linha 10 o usuario deve entrar com algum valor por exemplo 553 Novamente atentese que o usuario devera entrar com o ponto ao inves da vırgula iv Linha 12 calculase o aumento onde aum ficara com o valor 553 Como ha uma atribuicao o produto substitui o valor de lixo que existia anteriormente em aum v Linha 14 calculase o valor do preco reajustado inserindoo na variavel prod reaj que armazenara o valor 6083 vi Linhas 16 e 17 a seguir sao impressos os valores contidos nas variaveis aum e prod reaj Tabela 22 Teste de mesa do programa apresentado em Listing 21 Suponha que o usuario tenha entrado com o valor 553 para o preco de produto Variaveis Saıda prod aum prod reaj 1 7 lixo lixo lixo 2 9 lixo lixo lixo Entre com o valor do produto 3 10 553 lixo lixo 4 12 553 553 lixo 5 14 553 553 6083 6 16 553 553 6083 Valor do aumento 553 7 17 553 553 6083 Valor do produto reajustado 6083 8 19 553 553 6083 Espera pressionamento de alguma tecla 25 Declaracao de Valores Constantes A palavrachave const e utilizada para declarar valores constantes Ela assegura que a variavel associada nao sera alterada em todo o programa Em Listing 22 a seguir e apresentado um exemplo 17 A sintaxe de declaracao de valores constantes e const tipoDaConstante nomeDaConstante valor Verifique que na linha 9 foi declarado o valor 3141592 para PI Assim podese utilizala em varias partes do programa como nas linhas 17 e 19 Como PI e uma constante nao se pode modificala no decorrer do programa Uma alternativa para a declaracao dessa constante e utilizar uma constante predefinida da linguagem que e M PI mas devese incluir a biblioteca cmath Listing 22 C Exemplo de declaracao e uso de constante para representar o valor de pi 1 D e s c r i c a o d o p r o g r a m a C a l c u l a a a r e a d e um c ı r c u l o e o p e r ı m e t r o 2 d e s u a c i r c u n f e r ˆe n c i a 3 include iostream 4 include cstdlib 5 using namespace std 6 7 int main 8 9 const float PI 3141592 10 float area raio 11 12 cout Calculodaareadeumcırculoedoperımetro 13 desuacircunferencia 14 cout Porfavorentrecomoraio 15 cin raio 16 17 area PI raio raio 18 19 comp 2 PI raio 20 21 cout Aareadocırculoe area 22 cout Ocomprimentodesuacircunferenciae comp 23 24 system pause0 25 26 return 0 27 18 CAPITULO 3 Operadores 31 Operador de Atribuicao Em C o sinal de igual nao tem a interpretacao dada em matematica Representa a atribuicao da expressao a sua direita a variavel a sua esquerda Por exemplo x 0 atribui o valor zero a variavel de nome x A acao e executada da direita para a esquerda Lˆese x recebe o valor zero Mesmo em expressoes mais complexas como em delta bb4ac primeiro e realizado calculo da expressao a direita do operador de atribuicao para depois atribuir o resultado a variavel delta 32 Operadores Aritmeticos C oferece 5 operadores aritmeticos binarios que operam sobre dois operandos e um opera dor aritmetico unario que opera sobre um operando apresentados na Tabela 31 Tabela 31 C Operadores aritmeticos Binarios Soma Subtracao Multiplicacao Divisao Modulo Unario Menos unario Os operadores de soma subtracao multiplicacao e o unario nao tˆem segredo funcionam como vocˆes ja viram no Ensino Medio Atencao especial deve ser dada aos operadores de divisao e modulo 19 Quando se usa o operador de divisao o quociente de operandos inteiros sera obrigatoria mente um inteiro Em C um numero que possui o ponto em sua representacao e considerado real e aquele que nao o possui e considerado inteiro Exemplo 40 e um valor real e 4 e um valor inteiro A seguir sao apresentados exemplos do uso do operador de divisao com operandos inteiros resultando em quociente obrigatoriamente inteiro 206 3 45 0 75 1 Agora quando pelo menos um dos operandos e um valor real o quociente tambem e real Exemplos 2006 3333 aqui 200 e um valor real e 6 um valor inteiro 450 08 4 e um valor inteiro e 50 um valor real 7050 14 70 e 50 sao valores reais Ja o operador modulo opera somente com operandos inteiros e da como resultado o resto da divisao do inteiro a sua esquerda pelo inteiro a sua direita Por exemplo 17 5 possui o valor 2 pois quando se divide 17 por 5 resta o valor 2 O operador menos unario e usado somente para indicar a troca do sinal algebrico do valor Tambem pode ser pensado como o operador que multiplica seu operando por 1 Por exemplo x 8 x x Depois destas duas instrucoes o conteudo de x sera 8 321 Precedˆencia de Operadores Aritmeticos A precedˆencia dos operadores aritmeticos e apresentada na Tabela 32 Os operadores que possuem a mesma prioridade devem ser executados da esquerda para a direita na expressao em que aparecem Para alterar a prioridade da tabela devese utilizar parˆenteses mais internos Tabela 32 C Precedˆencia dos operadores aritmeticos Prioridade Operadores 1a parˆenteses mais internos 2a 3a 20 Exemplos 1 Suponha que se deseje calcular o valor final de uma compra de acordo com a formula a seguir Os valores dos produtos e do desconto sao respectivamente 2350 1400 500 e 200 Como existem apenas os operadores de soma e de subtracéo que possuem a mesma precedéncia a execucao comecara da esquerda para a direita valorfinalcompra valorprodutol valorproduto2 valorproduto3 desconto valorfinalcompra 2350 1400 500 200 ae 3750 valorfinalcompra 3750 500 200 S SS 4250 valorfinalcompra 4250 200 S 4050 valorfinalcompra 4050 2 Sejam 1 6 e 8 os valores de a 5 e c respectivamente Na formula de delta existem os operadores de subtracao e de multiplicacao este ultimo tendo precedéncia sobre o primeiro Assim a ultima operacao a ser realizada é a subtracaéo sendo que todas as multiplicagoes sao resolvidas da esquerda para a direita delta bx b4aC delta 6 64 18 S eS 36 delta 36 4 18 YY 4 delta 36 4 8 NY 32 delta 4 3 Seja a seguinte férmula que calcula a nota que um aluno devera tirar no exame EF onde Ma é a média anual Suponha que Ma seja 40 Verifique que os operadores com maior precedéncia sao o da multiplicacao e o da diviséo Note ainda que ha parénteses o que indica que o que esta em seu interior deve ser resolvido primeiro E 506 Ma4 E 50 6 40 4 240 E 50 240 4 SSE 260 E 2604 Sa 65 E65 33 Operadores de Incremento e de Decremento O operador de incremento é um operador unario que adiciona 1 a4 varidvel operando O operador de incremento pode ser usado de duas formas préfixado quando aparece antes do nome da varidvel e pésfixado quando aparece em seguida ao nome da variavel 21 A instrucao x x 1 adiciona 1 ao valor de x e e equivalente a x prefixado que e equivalente a x posfixado A diferenca entre as operacoes executadas pelo operador prefixado e posfixado aparece em instrucoes que fazem mais do que somente incrementar a variavel operando Por exemplo n 5 x n cout Ovalordene n cout Ovalordexe x A saıda sera O valor de n e 6 O valor de x e 6 O operador de incremento prefixado incrementa a variavel operando antes de executar a instrucao em que ele aparece Desta forma n tera seu valor incrementado de 1 antes de ser atribuıdo a x Observe agora o proximo exemplo n 5 x n cout Ovalordene n cout Ovalordexe x A saıda sera O valor de n e 6 O valor de x e 5 O operador de incremento posfixado incrementa a variavel operando logo apos a instrucao em que ele aparece Desta forma n e atribuıdo a x e depois seu valor e incrementado de 1 Quando o operador de incremento aparece sozinho em uma instrucao nao faz diferenca o uso prefixado ou posfixado A sintaxe e o modo de uso do operador de decremento prefixado e posfixado e idˆentica a do operador de incremento exceto porque a variavel e decrementada de 1 34 Operadores Aritmeticos de Atribuicao Esses operadores sao binarios e combinam as operacoes aritmeticas com a atribuicao O operando da esquerda e sempre o nome de uma variavel e o da direita uma expressao qualquer A 22 operacao consiste em atribuir um novo valor a variavel que dependera do operador e da expressao a direita Como regra geral se x e uma variavel exp uma expressao e op um operador aritmetico entao x op exp equivale a x x op exp As expressoes com estes operadores sao mais compactas e normalmente muito usadas em C Na Tabela 34 sao apresentados alguns exemplos desses operadores Tabela 33 C Exemplos de operadores aritmeticos de atribuicao i 2 equivale a i i 2 x y 1 equivale a x x y1 t 25 equivale a t t 25 p 5 equivale a p p 5 d 3 equivale a d d 3 35 Operadores Relacionais Operadores relacionais sao utilizados para fazer comparacoes conforme apresentados na Tabela 34 sempre necessitando de dois operandos Tabela 34 C Operadores relacionais op1 e op2 sao operandos Operador relacional com os operandos Significado op1 op2 op1 e igual a op2 op1 op2 op1 e diferente de op2 op1 op2 op1 e maior que op2 op1 op2 op1 e menor que op2 op1 op2 op1 e maior ou igual que op2 op1 op2 op1 e menor ou igual que op2 Uma atencao especial Exemplo 31 e dada quanto ao uso dos operadores maior ou igual que e menor ou igual que Exemplo 31 C Um caso de uso do operador maior ou igual que Suponha que seja de interesse verificar se a media final Mf e no mınimo 7 0 Isso significa que Mf deve ser igual ou maior que 7 0 Sejam trˆes situacoes com os seguintes valores para Mf 70 85 e 68 Mf 70 70 70 Verdadeiro Mf 70 85 70 Verdadeiro Mf 70 68 70 Falso 23 351 Precedˆencia dos operadores aritmeticos juntamente com os relacionais Os operadores aritmeticos tˆem precedˆencia sobre os operadores relacionais No Exemplo 32 e verificado se n e um numero par Exemplo 32 C Precedˆencia do operador aritmetico sobre o relacional Suponha duas situacoes em que os valores para n sejam 13 e 8 Desejase checar se n e um numero par Verifique que primeiro e feito o calculo do resto e depois a checagem de igualdade n 2 0 13 2 0 1 0 Falso n 2 0 8 2 0 0 0 Verdadeiro 24 36 Operadores Logicos Operadores logicos tambem fazem comparacoes A diferenca entre comparacoes logicas e rela cionais esta na forma como os operadores avaliam seus operandos Operandos de operadores logicos sao avaliados como logicos falso ou verdadeiro e nao como numericos C oferece trˆes operadores logicos significa E logico significa OU logico significa NAO logico 25 361 E Logico Se e1 e e2 sao duas expressoes entao e1 e2 resulta verdadeiro somente se e1 e e2 forem verdadeiras Em qualquer outra situacao resulta falso Verifique a tabelaverdade1 do E logico na Tabela 35 e os Exemplos 33 e 34 observando a precedˆencia dos operadores relacionais sobre os logicos Tabela 35 Tabelaverdade do E logico Expressao logica e1 e2 Resultado V V V V F F F V F F F F Exemplo 33 C Um caso de uso do operador logico E Suponha que se deseje verificar se a nota de um aluno e no mınimo 70 mas abaixo de 80 A expressao logica devera ser nota 70 nota 80 Para nota com valor 8 0 nota 70 nota 80 80 70 80 80 V F F Para nota com valor 7 0 nota 70 nota 80 70 70 70 80 V V V Para nota com valor 6 5 nota 70 nota 80 65 70 65 80 F V F 1Segundo Forbellone e Eberspacher 2005 tabelaverdade e o conjunto de todas as possibilidades combinatorias entre os valores de diversas variaveis logicas as quais se encontram em apenas duas situacoes V ou F em um conjunto de operadores logicos 26 Exemplo 34 C Outro caso de uso do operador logico E Suponha que se deseje verificar se o usuario e do sexo feminino e a data 8 de marco A expressao logica devera ser sexo f dia 8 mes 3 Para sexo com valor f dia igual a 8 e mes igual a 3 sexo f dia 8 mes 3 f f 8 8 3 3 V V V V V V Para sexo com valor m dia igual a 8 e mes igual a 3 sexo f dia 8 mes 3 m f 8 8 3 3 F V V F V F 362 OU Logico Se e1 e e2 sao duas expressoes entao e1 e2 resulta falso somente se e1 e e2 forem falsas Em qualquer outra situacao resulta verdadeiro Verifique a tabelaverdade do OU logico na Tabela 36 e os Exemplos 35 e 36 Observe novamente a precedˆencia dos operadores relacionais sobre os logicos Tabela 36 Tabelaverdade do OU logico Expressao logica e1 e2 Resultado V V V V F V F V V F F F 27 Exemplo 35 C Um caso de uso do operador logico OU Suponha que se deseje verificar se sexo e valido Sexos validos sao f de feminino e m de masculino A expressao logica devera ser sexo f sexo m Para sexo com valor f sexo f sexo m f f f m V F V Para sexo com valor m sexo f sexo m m f m m F V V Para sexo com valor p sexo f sexo m p f p m F F F Exemplo 36 C Outro caso de uso do operador logico OU Suponha que se deseje verificar se um caracter e f ou F A expressao logica devera ser caracter f caracter F Para caracter com valor f caracter f caracter F f f f F V F V Para caracter com valor F caracter f caracter F F f F F F V V Para caracter com valor s caracter f caracter F s f s F F F F 363 NAO Logico Sendo e1 uma expressao logica e1 resulta verdadeiro somente se e1 for falsa e viceversa Verifique a tabelaverdade do N AO logico na Tabela 37 e o Exemplo 37 28 Tabela 37 Tabelaverdade do NAO logico Expressao logica e1 Resultado V F F V Exemplo 37 C Um caso de uso do operador logico NAO Suponha que seja de interesse saber se o nome de uma pessoa nao foi encontrado em uma lista telefˆonica Suponha tambem que exista uma variavel chamada achou que possa ter os valores 0 ou 1 o primeiro indicando que nao encontrou o nome da pessoa e o segundo indicando que o encontrou A expressao logica devera ser achou Para achou com valor 0 achou 0 V Para achou com valor 1 achou 1 F 364 Mais Exemplos de E e OU Logicos Como exemplos mais elucidativos dos operadores E e OU podese citar 1 Se tiver febre e dor no corpo vou ao medico Quando vou ao medico Observase na tabelaverdade do E que vou ao medico quando os termos tiver febre e tiver dor no corpo forem simultaneamente verdade 2 Se tiver febre ou dor no corpo vou ao medico Quando vou ao medico Observase na tabelaverdade do OU logico que as possibilidades de vou ao medico se tornam maiores pois sera verdadeiro em trˆes situacoes somente ter febre somente ter dor no corpo e ter febre e dor no corpo 29 365 Precedˆencia dos Operadores Logicos A precedˆencia dos operadores logicos e apresentada na Tabela 38 Observe os Exemplos 38 e 39 O primeiro apresenta o uso correto da precedˆencia e e segundo nao Tabela 38 C Precedˆencia entre os operadores logicos Prioridade Operadores 1a NAO 2a E 3a OU Exemplo 38 C Um exemplo do emprego da precedˆencia dos operadores logicos Suponha que se deseje verificar se uma pessoa e do sexo feminino mas para isso o usuario pode digitar f ou F Tambem e necessario que a data seja 8 de marco A expressao logica devera ser sexo f sexo F dia 8 mes 3 Para sexo com valor f dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 f f f F 8 8 3 3 V F V V V V V V V V Para sexo com valor F dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 F f F F 8 8 3 3 F V V V V V V V V V Para sexo com valor p dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 p f p F 8 8 3 3 F F V V F V V F V F Para sexo com valor f dia igual a 9 e mes igual a 3 sexo f sexo F dia 8 mes 3 f f f F 9 8 3 3 V F F V V F V F V F 30 Exemplo 39 C Um exemplo analogo ao anterior Exemplo 38 mas com o uso INCORRETO dos operadores logicos Suponha que se deseje verificar se uma pessoa e do sexo feminino mas para isso o usuario pode digitar f ou F Tambem e necessario que a data seja 8 de marco A expressao logica INCORRETA e sexo f sexo F dia 8 mes 3 Para sexo com valor f dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 f f f F 8 8 3 3 V F V V V F V V F V coincidiu de resultar o esperado Para sexo com valor F dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 sexo f sexo F dia 8 mes 3 F f F F 8 8 3 3 F V V V F V V F V V coincidiu de resultar o esperado Para sexo com valor p dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 sexo f sexo F dia 8 mes 3 p f p F 8 8 3 3 F F V V F F V F F F coincidiu de resultar o esperado Para sexo com valor f dia igual a 9 e mes igual a 3 sexo f sexo F dia 8 mes 3 sexo f sexo F dia 8 mes 3 f f f F 9 8 3 3 V F F V V F V V F V nao e o resultado esperado 37 Precedˆencia entre os Operadores Aritmeticos Relacionais e Logicos A precedˆencia entre os operadores aritmeticos relacionais e logicos estao apresentados na Tabela 39 No Exemplo 310 e apresentado um exemplo de expressao com todos os operadores 31 E importante saber que na linguagem C o 0 zero representa o valor booleano falso e tudo que for diferente de 0 e verdadeiro E importante lembrar que operandos de operadores logicos sao interpretados como booleanos verdadeiro ou falso Tabela 39 C Precedˆencia entre os operadores aritmeticos relacionais e logicos Prioridade Operadores 1a parˆenteses mais internos 2a operador logico NAO 3a operadores aritmeticos 4a operadores relacionais 5a operadores logicos E e OU Exemplo 310 C Um caso de uso da precedˆencia de operadores aritmeticos relacionais e logicos 3 1 4 5 2 3 0 3 4 4 5 1 3 0 3 4 4 5 0 3 0 3 4 4 5 3 0 3 16 5 3 0 3 11 3 0 3 11 3 0 1 1 0 1 0 1 32 CAPITULO 4 Estruturas Condicionais As estruturas condicionais permitem determinar qual e a acao a ser tomada com base no resultado de uma expressao condicional Por exemplo em um curso de ciˆencia da computacao a media final Mf para se passar em uma disciplina e 7 0 Caso o aluno nao a alcance vai para exame e tera que tirar no mınimo 506Mf4 Caso nao passe no exame ira para recuperacao tendo que tirar pelo menos 10 Mf Neste exemplo representado pelo fluxograma da Figura 41 dependendo do resultado da verificacao a acao a ser tomada pode ser uma dentre varias assim e necessario o uso de estruturas condicionais Figura 41 Fluxograma com expressoes condicionais e acoes a serem tomadas 33 C oferece trˆes estruturas condicionais 1 if estrutura condicional simples 2 if else estrutura condicional composta 3 switch alternativa de estrutura condicional composta mas possui algumas limitacoes em relacao a estrutura if else Neste capıtulo serao apresentadas figuras com blocos de programacao utilizando o software Scratch1 muito utilizado em universidades com Berkeley e Harvard para ensinar programacao de computadores de uma forma mais simples e ludica 41 Estrutura Condicional Simples if Na estrutura condicional simples sem chaves cuja forma geral e apresentada em Listing 41 a instrucao no corpo do if so sera executada se a expressao condicional resultar em verdadeira Uma expressao condicional e uma comparacao que resulta em dois valores possıveis verdadeiro ou falso No Scratch a condicional simples e mostrada na Figura 42 Listing 41 C Forma geral da estrutura condicional simples sem chaves i f expressao condicional instrucao c o r p o d o i f Figura 42 Scratch Estrutura condicional simples se No Exemplo 41 e apresentado um trecho de codigo que utiliza a condicional simples sem chaves na linguagem C Verifique que a unica instrucao que sera executada caso a condicao resulte em verdadeira e o cout Exemplo 41 C Trecho de codigo que utiliza a condicional simples sem chaves Suponha que se deseje parabenizar as mulheres pelo seu dia 8 de marco Caso nao seja o dia das mulheres ou o usuario seja homem nao emite mensagem ifsexousuariof dia8 mes3 cout Parabens mulher pelo seu dia Para imprimir a frase de congratulacoes o sexo devera ser f o dia 8 e o mˆes 3 resultando em verdadeira a expressao condicional Em C e obrigatoria a utilizacao de chaves quando houver mais de uma instrucao a ser executada quando a expressao condicional resultar em verdadeira A forma geral 1httpmitscratchedu 34 da estrutura condicional simples com chaves e apresentada em Listing 42 As instrucoes entre as chaves e que fazem parte do corpo do if so serao executadas se a expressao condicional resultar em verdadeira A chave de abertura indica inıcio do bloco corpo que sera executado se a expressao condicional resultar em verdadeira A outra chave indica o fim do bloco corpo No Exemplo 42 ha trˆes instrucoes que serao executadas caso a expressao condicional resulte em verdadeira dois comandos de impressao e uma alteracao em uma variavel contadora2 Listing 42 C Forma geral da estrutura condicional simples com chaves i f expressao condicional c o r p o d o i f i n s t r u c a o 1 a i n s t r u c a o n instrucao1 instrucao2 instrucaon Exemplo 42 C Trecho de codigo que utiliza a condicional simples com chaves Seja o exemplo anterior e suponha que se deseje calcular e imprimir a quantidade de mulheres que acessaram o sistema no dia 8 de marco ifsexousuariof dia8 mes3 cout Parabens mulher pelo seu dia cout Voce e a cont 1 a mulher a acessar o sistema hoje cont ou cont cont 1 Inicialmente cont recebera o valor 0 Verifique que ha trˆes instrucoes no corpo da instrucao if dois cout e um incremento de variavel contadora Assim devese utilizar as chaves No Exemplo 43 e apresentado um trecho de codigo que utiliza um contador em uma sequˆencia de estruturas condicionais simples Na Figura 43 e apresentado o mesmo exemplo trabalhado no Scratch Exemplo 43 C Trecho de codigo que utiliza sequencialmente varias condicionais simples sem chaves Suponha que se deseje verificar quantas notas de um total de quatro sao maiores que 90 cont 0 if n1 90 cont cont cont 1 if n2 90 cont cont cont 1 if n3 90 cont cont cont 1 if n4 90 cont cont cont 1 cout A quantidade de notas maiores que 90 e cont Verifique que ha a necessidade de se verificar cada uma das notas que sendo maior que 90 incrementase a variavel contadora 2Um contador e uma variavel que dado um valor inicial geralmente zero e incrementada somada a um valor constante geralmente 1 35 Figura 43 Scratch Exemplo correspondente ao Exemplo 43 42 Estrutura Condicional Composta if else A forma geral da estrutura condicional composta sem chaves e apresentada em Listing 43 Se a expressao condicional resultar em verdadeira sera executada a instrucao 1 caso contrario a expressao condicional resultar em falsa sera executada a instrucao 2 No Scratch a condicional composta e mostrada na Figura 44 36 Listing 43 C Forma geral da estrutura condicional composta sem chaves i f expressao condicional instrucao1 c o r p o d o i f else instrucao2 c o r p o d o e l s e Figura 44 Scratch Estrutura condicional composta se senao Ja a forma geral da estrutura condicional composta com chaves e apresentada em Listing 44 Se a expressao condicional resultar em verdadeira as instrucoes 1 e 2 corpo do if serao executadas caso contrario as instrucoes 3 e 4 corpo do else serao executadas Listing 44 C Forma geral da estrutura condicional composta com chaves i f expressao condicional c o r p o d o i f instrucao1 instrucao2 else c o r p o d o e l s e instrucao3 instrucao4 37 No Exemplo 44 e apresentado um programa que realiza a divisao entre dois numeros inteiros passados pelo usuario lembrando que o divisor nao pode ser zero Na Figura 45 e apresentada uma solucao no Scratch Exemplo 44 C Programa que faz a divisao de dois numeros inteiros passados pelo usuario 1 int main 2 3 int dividendo d i v i s o r 4 float quociente 5 6 cout Entrecomodividendoeodivisor respectivamente 7 cin dividendo d i v i s o r 8 9 i f d i v i s o r 0 10 11 quociente float dividendo d i v i s o r 12 cout Oquocientee quociente 13 14 else 15 cout ImpossıvelfazeradivisaoOdivisoreigualazero 16 17 system pause 18 19 return 0 20 Neste exemplo devese verificar se o divisor e diferente de zero pois so assim e possıvel fazer a divisao Um dado importante e que o quociente da divisao entre numeros inteiros pode ser um numero real Assim mesmo declarando a variavel quociente como float e necessario que se converta o valor do dividendo ou do divisor para um numero real Isso e feito colocandose o tipo float entre parˆenteses antes da variavel neste caso dividendo linha 11 Note que ha duas instrucoes nas linhas 11 e 12 que serao executadas caso o divisor seja diferente de zero Assim as chaves devem ser utilizadas Nas Tabelas 41 e 42 sao apresentados dois testes de mesa para esse programa Tabela 41 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 0 Variaveis Comparacao Saıda dividendo divisor quociente divisor 0 1 3 lixo lixo 2 4 lixo lixo lixo 3 6 lixo lixo lixo Entre com o dividendo e o divisor 4 7 21 0 lixo 5 9 21 0 lixo Falso 6 15 21 0 lixo Impossıvel fazer a divisao O divisor 7 17 21 0 lixo Espera o pressionamento de alguma tecla 38 Tabela 42 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 4 Variaveis Comparacao Saıda dividendo divisor quociente divisor 0 1 3 lixo lixo 2 4 lixo lixo lixo 3 6 lixo lixo lixo Entre com o dividendo e o divisor 4 7 21 4 lixo 5 9 21 4 lixo Verdadeiro 6 11 21 4 525 7 12 21 4 525 O quociente e 525 8 17 21 4 525 Espera o pressionamento de alguma tecla Figura 45 Scratch Divisao entre dois numeros correspondente ao Exemplo 44 43 Encadeamento de Estruturas Condicionais Compostas Quando uma estrutura condicional composta esta no corpo do senao else de outra estrutura condicional composta temse um encadeamento de estruturas condicionais compostas Para ilustrar esse encadeamento verifique a Figura 46 Podese ter tantas condicio nais compostas quanto necessarias 39 Figura 46 Scratch Encadeamento de estruturas condicionais compostas Uma estrutura sesenao esta no corpo do senao de outra estrutura condicional composta Para exemplificar o encadeamento de condicionais compostas e apresentado um programa de uma calculadora de 4 operacoes aritmeticas adicao subtracao multiplicacao e divisao A entrada deve seguir o seguinte formato operando operador operando Exemplo se o usuario entrar com 5 7 sera impresso O produto e 35 Caso o operador seja invalido emita uma mensagem Na Figura 47 e apresentado um trecho de uma solucao no Scratch No Exemplo 45 pagina 41 e apresentado um programa completo em C Figura 47 Scratch Exemplo de encadeamento de condicionais compostas 40 Exemplo 45 C Programa que representa uma calculadora de 4 operacoes matematicas 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 i f op 10 11 res n1 n2 12 cout Asomae res 13 14 else 15 16 i f op 17 18 res n1 n2 19 cout Adiferencae res 20 21 else 22 23 i f op 24 25 i f n2 0 26 cout Impossıvelfazerdivisaoporzero 27 else 28 29 res n1 n2 30 cout Oquocientee res 31 32 33 else 34 35 i f op 36 37 res n1 n2 38 cout Oprodutoe res 39 40 else 41 cout Operadorinvalido 42 f i m d o e l s e d o i f o p 43 f i m d o e l s e d o i f o p 44 f i m d o e l s e d o i f o p 45 46 system pause 47 return 0 48 f i m m a i n 41 No Exemplo 45 pagina 41 existem varias expressoes condicionais que a partir do momento em que uma resulta em verdadeira nao ha a necessidade de se verificar as demais expressoes condicionais pois a variavel op so pode ser um dos operadores aritmeticos ou um operador invalido diferente dos demais Assim a construcao mais adequada para a resolucao deste problema e o uso de estruturas condicionais compostas encadeadas if else Por exemplo se op e o caracter teste de mesa na Tabela 43 a expressao condicional da linha 9 resulta em falsa Daı a execucao vai para a linha 16 na qual e verificada outra expressao condicional que tambem resulta em falsa Como op nao e igual aos caracteres e chegase ao ultimo else no qual e impresso que o operador e invalido Tabela 43 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a Variaveis Comparacoes Saıda n1 n2 res op op op op op 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Digite NUMERO 4 7 15 6 lixo 5 9 15 6 lixo Falso 6 16 15 6 lixo Falso 7 23 15 6 lixo Falso 8 35 15 6 lixo Falso 9 40 15 6 lixo 10 41 15 6 lixo Operador invalido 11 46 15 6 lixo Espera o pressionamento Caso op seja o caracter teste de mesa na Tabela 44 a expressao condicional da linha 9 resulta em falsa Daı a execucao vai para a instrucao de linha 16 na qual resulta em verdadeira Assim como as demais instrucoes possuem else a execucao do programa vai para a proxima instrucao apos eles o systempause que esta na linha 46 Tabela 44 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a Variaveis Comparacoes Saıda n1 n2 res op op op op op 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Digite NUMERO 4 7 15 6 lixo 5 9 15 6 lixo Falso 6 16 15 6 lixo Verdadeiro 7 17 15 6 9 8 18 15 6 9 A diferenca e 9 46 15 6 9 Espera o pressionamento ATENC AO No Exemplo 46 pagina 46 e apresentada uma versao do Exemplo 45 pagina 41 sem o uso de alguns pares de chaves e pois alguns sao desnecessarios Uma informacao muito util e que uma estrutura if else e considerada como um unico comando Ja no Exemplo 47 pagina 47 e apresentada uma versao sem o uso de algumas indentacoes escrevendose o if na mesma linha do else tornando o codigo mais simples 42 ATENC AO Na Figura 48 e apresentada uma transformacao de encadeamento de condici onais compostas com indentacoes para uma versao mais simples sem indentacoes Figura 48 C Transformacao de encadeamento de condicionais compostas com indentacoes para uma versao mais simples com menos indentacoes amplamente utilizada em programacao Um outro exemplo de encadeamento de estruturas condicionais if else e apresentado no Exemplo 48 em que a media de notas de um aluno devera estar em um dos 5 conceitos A B C D ou E por isso o encadeamento de if else e recomendado Perceba que quando ha apenas uma instrucao a ser executada quando a expressao condicional resultar em verdadeira podese escrevˆela na mesma linha da expressao condicional 44 Estruturas Condicionais Aninhadas Uma estrutura condicional esta aninhada quando esta dentro de outra tanto de um if quanto de um else No encadeamento de condicionais compostas apresentado na secao anterior ocorreu o aninhamento de condicionais compostas dentro do else Exemplo 45 pagina 41 Quando se tem aninhamento de estruturas condicionais e importante saber a qual if um determinado else esta ligado para nao ocorrer erro logico No Exemplo 49 pagina 49 perceba que a condicional composta linhas 10 a 21 esta no corpo da condicional if da linha 8 Note tambem que o else da linha 16 esta vinculado ao if da linha 10 e nao ao da linha 8 43 45 Alternativa de Estrutura Condicional Composta switch Embora construcoes if else possam executar testes para escolha de uma entre varias alter nativas muitas vezes sao deselegantes O comando switch tem um formato limpo e claro Sua forma geral e apresentada em Listing 45 Listing 45 C Forma geral da estrutura condicional switch switch nome da v a r i a v e l case constante1 instrucao1 instrucao2 break case constante2 instrucao3 instrucao4 break default instrucao5 instrucao6 O comando switch possui as seguintes regras O corpo de um switch deve estar entre chaves Pode haver nenhuma uma ou mais instrucoes seguindo cada caso case Geralmente a ultima instrucao de um caso e break que causa a saıda imediata de todo o corpo do switch Na falta dele todas as instrucoes apos o caso escolhido serao executadas mesmo as que pertencem aos casos seguintes switch testa a variavel que deve ser do tipo int ou char Nao se pode usar uma variavel ou expressao logica como rotulo de caso que vem apos o case E apenas permitido constantes do tipo int ou char Cada um dos casos pode ser considerado um if Um caso default e opcional Pode ser encarado como o else de todos os ifs Ou seja se nenhum caso for satisfeito e existir um caso default a execucao comecara nele No Exemplo 410 pagina 50 e apresentada uma solucao utilizando switch correspondente ao Exemplo 45 da pagina 41 Os operadores sao caracteres por isso estao entre apostrofos Se a variavel a ser analisada fosse do tipo inteiro nao se deveria colocar apostrofos entre as constantes Verifique o comando break apos cada caso Verifique tambem o default como ultima alternativa ou seja caso op nao seja igual a nenhum dos caracteres anteriores 44 Agora suponha que se deseje permitir que o usuario do programa da calculadora utilize o sinal ou x para indicar multiplicacao e o sinal ou para indicar divisao O Exemplo 411 ilustra isso Alguns casos devem executar as mesmas instrucoes daı a construcao de casos sem break linhas 19 e 24 45 Exemplo 46 C Programa correspondente ao anterior Exemplo 45 mas perceba que nao foram inseridas algumas chaves pois uma estrutura if else e considerada como um unico comando 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 i f op 10 11 res n1 n2 12 cout Asomae res 13 14 else 15 i f op 16 17 res n1 n2 18 cout Adiferencae res 19 20 else 21 i f op 22 23 i f n2 0 24 cout Impossıvelfazerdivisaoporzero 25 else 26 27 res n1 n2 28 cout Oquocientee res 29 30 31 else 32 i f op 33 34 res n1 n2 35 cout Oprodutoe res 36 37 else 38 cout Operadorinvalido 39 40 system pause 41 42 return 0 43 f i m m a i n 46 Exemplo 47 C Programa correspondente ao anterior Exemplo 46 mas perceba que a palavrachave if a partir do segundo if foi colocada na mesma linha do else colocandose o par de chaves e do corpo do else na mesma linha imaginaria vertical do i do primeiro if 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 i f op 10 11 res n1 n2 12 cout Asomae res 13 14 else i f op 15 16 res n1 n2 17 cout Adiferencae res 18 19 else i f op 20 21 i f n2 0 22 cout Impossıvelfazerdivisaoporzero 23 else 24 25 res n1 n2 26 cout Oquocientee res 27 28 29 else i f op 30 31 res n1 n2 32 cout Oprodutoe res 33 34 else 35 cout Operadorinvalido 36 37 system pause 38 39 return 0 40 f i m m a i n 47 Exemplo 48 C Programa que dada uma media de 00 a 100 verifica seu conceito A 8 0 10 0 B 7 0 8 0 C 6 0 7 0 D 5 0 6 0 e E 0 0 5 0 1 int main 2 3 float media 4 5 cout Digitesuamedia 6 cin media 7 8 i f media 80 cout ConceitoA 9 else i f media 70 cout ConceitoB 10 else i f media 60 cout ConceitoC 11 else i f media 50 cout ConceitoD 12 else cout ConceitoE 13 14 system pause 15 16 return 0 17 f i m m a i n 48 Exemplo 49 C Programa que coloca 3 valores inteiros em ordem crescente 1 int main 2 3 int a b c 4 5 cout Entrecom3valoresinteiros 6 cin a b c 7 8 i f a b a c 9 10 i f b c 11 12 aux a 13 a b 14 b aux 15 16 else 17 18 aux a 19 a c 20 c aux 21 22 23 i f b c 24 25 aux b 26 b c 27 c aux 28 29 30 cout a b c 31 32 return 0 33 49 Exemplo 410 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 switch op 10 11 case 12 res n1 n2 13 cout Asomae res 14 break 15 case 16 res n1 n2 17 cout Adiferencae res 18 break 19 case 20 i f n2 0 cout Impossıvelfazerdivisaoporzero 21 else 22 23 res n1 n2 24 cout Oquocientee res 25 26 break 27 case 28 res n1 n2 29 cout Oprodutoe res 30 break 31 default 32 cout Operadorinvalido 33 f i m s w i t c h 34 35 system pause 36 37 return 0 38 f i m m a i n 50 Exemplo 411 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch com alguns casos sem break 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 switch op 10 11 case 12 res n1 n2 13 cout Asomae res 14 break 15 case 16 res n1 n2 17 cout Adiferencae res 18 break 19 case 20 case 21 i f n2 0 cout Impossıvelfazerdivisaoporzero 22 else 23 24 res n1 n2 25 cout Oquocientee res 26 27 break 28 case x 29 case 30 res n1 n2 31 cout Oprodutoe res 32 break 33 default 34 cout Operadorinvalido 35 f i m s w i t c h 36 37 system pause 38 39 return 0 40 f i m m a i n 51 CAPITULO 5 Funcoes Um recurso bastante importante em linguagens de programacao e a modularizacao na qual um programa pode ser particionado em pedacos menores chamados modulos ou funcoes As principais motivacoes para o uso de funcoes sao Evitar repeticao de codigo Qualquer sequˆencia de instrucoes que apareca no programa mais de uma vez e candidata a ser uma funcao Dividir e estruturar melhor um algoritmo Aumentar a legibilidade do codigo Como mencionado na Secao 15 do Capıtulo 1 pag 6 um programa em C consiste na definicao de uma ou mais funcoes e se o programa tiver apenas uma esta sera a principal main Ate agora apenas a funcao principal foi definida nos programas apresentados Alem disso apenas uma funcao foi chamada ate agora nos nossos exemplos a system com o parˆametro pause para esperar o pressionamento de alguma tecla Para ser executada uma funcao precisa ser ativada chamada pela funcao principal ou por outra funcao A chamada a uma funcao e o meio pelo qual e solicitado ao programa que desvie o fluxo de controle de execucao para a funcao execute suas instrucoes e depois volte a instrucao seguinte a da chamada da funcao Figura 51 Figura 51 Ilustracao de uma chamada a funcao system 52 Existem varias funcoes predefinidas na linguagem C principalmente as matematicas como sin pow e sqrt Exemplo 51 M PI e uma constante definida na biblioteca cmath Exemplo 51 C Programa que chama varias funcoes matematicas definidas na biblioteca cmath 1 includeiostream c i n e c o u t 2 includecstdlib s y s t e m 3 includecmath f u n c o e s m a t e m a t i c a s 4 using namespace std 5 6 int main 7 8 cout ALGUMASFUNCOESMATEMATICAS 9 cout Raizquadradade144 sqrt 144 endl 10 cout 2elevadoa10 pow2 10 endl 11 cout Raizcubicade1000 cbrt 1000 endl 12 cout Hipotenusadetrianguloretangulocomlados3e4 13 hypot 3 4 endl 14 15 cout Seno0 sin 0 endl 16 cout Seno30 sin M PI6 endl 17 cout Seno45 sin M PI4 endl 18 cout Seno60 sin M PI3 endl 19 cout Seno90 sin M PI2 endl 20 21 cout Tetode245 c e i l 245 endl 22 cout Pisode245 f l o o r 245 endl 23 24 system pause 25 26 return 0 27 Essas funcoes matematicas ja foram predefinidas na linguagem C e o programador so tem que chamalas Entretanto se o programador quiser utilizar uma funcao que nao exista ele e que devera implementala ou seja definila Assim para criar e utilizar uma funcao devese nao necessariamente nessa ordem Escrever seu prototipo serve para indicar ao compilador a existˆencia de uma funcao que possui nome parˆametros e seus tipos se houver e seu tipo de retorno se houver Chamala serve para ativar a funcao definida Definila e a codificacao da funcao No programa apresentado a seguir em Listing 51 sao destacadas cada uma dessas partes prototipo chamada a funcao e definicao de funcao Alem disso tambem e apresentado um conceito muito importante o escopo de variaveis 53 51 Escopo de Variaveis O escopo ou abrangˆencia de uma variavel referese a sua visibilidade perante as diversas definicoes de funcoes de um programa As variaveis que sao definidas no inıcio do programa fora de qualquer funcao sao denominadas globais por serem visıveis ou seja podem ser utilizadas por qualquer funcao definida no programa Ha casos em que uma variavel e utilizada apenas por uma funcao especıfica o que nao justifica uma definicao global pois somente se fazem necessarios o conhecimento e a utilizacao dessa variavel dentro dos limites desse bloco logico Esta situacao ocorre quando a variavel e declarada internamente a funcao sendo denominada variavel local Ate agora todos os exemplos possuıam apenas variaveis locais declaradas dentro da funcao main Em Listing 51 e apresentado um programa que utiliza variaveis local e global cujo objetivo e desenhar uma linha de tamanho passado pelo usuario Listing 51 C Programa que apresenta prototipo chamada a funcao desenha linha e sua definicao de funcao Apresenta tambem variaveis locais e globais 1 includeiostream 2 includecstdlib s y s t e m 3 using namespace std 4 5 void desenha linha P r o t o t i p o d a f u n c a o d e s e n h a l i n h a 6 7 V a r i a v e l g l o b a l v i s ı v e l em t o d a s a s f u n c o e s m a i n e d e s e n h a l i n h a 8 int tam 9 10 int main D e f i n i c a o d a f u n c a o m a i n 11 12 system cls C h a m a d a a f u n c a o s y s t e m com p a r ˆa m e t r o c l s 13 14 cout Entrecomotamanhodalinha 15 cin tam 16 17 C h a m a d a a f u n c a o d e s e n h a l i n h a 18 desenha linha 19 20 system pause C h a m a d a a f u n c a o s y s t e m com p a r ˆa m e t r o p a u s e 21 return 0 22 f i m m a i n 23 24 void desenha linha D e f i n i c a o d a f u n c a o d e s e n h a l i n h a 25 26 int i V a r i a v e l l o c a l v i s ı v e l a p e n a s n e s s a f u n c a o 27 28 for i 0 itam i 29 cout xc4 30 f i m d e s e n h a l i n h a Verifique que a variavel inteira tam foi declarada no inıcio do programa na linha 8 fora de qualquer funcao assim ela possui escopo global e pode ser acessada por qualquer funcao definida neste caso a main e a desenha linha 54 A main nao possui qualquer declaracao de variavel Na desenha linha e declarada apenas a variavel i acessada apenas nessa funcao Veja o teste de mesa para esse programa na Tabela 51 Verifique que a variavel tam existe no decorrer de toda a execucao do programa sendo que a variavel i existe apenas na funcao desenha linha Tabela 51 Teste de mesa para o programa apresentado em Listing 51 com tam igual a 1 para facilitar o teste de mesa Variaveis Condicao Observacoes Saıda tam i i tam 1 8 lixo 2 10 lixo Definicao da funcao main 3 11 lixo Inıcio da funcao main 4 12 lixo Chama a funcao systemcls 5 14 lixo Entre com o tamanho da linha 6 15 1 7 18 1 Chama a funcao desenha linha 8 24 1 Definicao da funcao desenha linha 9 25 1 Inıcio da funcao desenha linha 10 26 1 lixo 11 28 1 0 V 12 29 1 0 13 28 1 1 F 14 30 1 1 Fim da funcao desenha linha 15 20 1 Retornou a funcao main Espera o pressionamento de alguma tecla 16 21 1 Fim da funcao main Atencao o uso de variaveis globais em programas nao e recomendado porque se qualquer funcao definida pode acessalas a qualquer momento e mais difıcil a sua manutencao e checagem de erros de logica 52 Prototipo de Funcao Para utilizar uma variavel em um programa devese primeiramente declarala O mesmo acontece com as funcoes A declaracao de uma funcao e chamada prototipo e e uma instrucao colocada no inıcio do programa que informa o tipo da funcao seu nome e os tipos dos parˆametros1 tambem chamados de argumentos caso haja O programa apresentado anteriormente em Listing 51 pag 54 possui o prototipo da funcao desenha linha na linha 5 que informa que o tipo da funcao e void nao possui retorno e nao recebe nada como parˆametro Verifique que nao ha nada entre os parˆenteses da funcao na linha 5 53 Chamada de Funcao Chamada de funcao e o meio pelo qual o programa desvia o controle de execucao para a definicao da funcao executa suas instrucoes e depois volta a instrucao seguinte a chamada da funcao Chamase uma funcao pelo seu nome seguido de abertura de parˆentese zero ou mais parˆametros sem os tipos e o fechamento de parˆentese Exemplo na linha 18 de Listing 51 pag 54 chamase a funcao escrevendose desenha linha 1Quando existem os parˆametros sao informacoes imprescindıveis para a execucao da funcao 55 54 Definicao de Funcao E o codigo que descreve o que a funcao faz Sua forma geral foi apresentada anteriormente Secao 15 do Capıtulo 1 pag 6 e modificada com a inclusao de parˆametros entre os parˆenteses conforme a Figura 52 Figura 52 C Forma geral de definicao de funcao com parˆametros caso haja Em Listing 51 pag 54 as definicoes da funcoes main e desenha linha foram escritas nas linhas 10 a 22 e 24 a 30 respectivamente 55 Retorno de Funcao O tipo de retorno de uma funcao e definido pelo tipo de valor que ela retorna por meio do comando return Esse comando termina a execucao da funcao e retorna o controle para a instrucao seguinte ao codigo de chamada A instrucao return nao e obrigatoria Uma funcao sem esse comando e do tipo void e e terminada quando encontrar a chave que indica fim da funcao Em Listing 51 apresentado anteriormente pag 54 a funcao desenha linha nao possui o comando return por isso e do tipo void Os tipos de funcoes C sao os mesmos tipos de variaveis na linguagem exceto quando a funcao nao retorna nada sendo do tipo void O valor de retorno de uma funcao e acessado na instrucao de chamada por meio do nome dela seguido de parˆenteses contendo ou nao parˆametros No programa apresentado a seguir em Listing 52 a chamada a funcao verifica maior linha 16 possui dois parˆametros inteiros e retorna o maior deles O valor de retorno e atribuıdo a variavel maior na linha 16 Verifique que nao ha variaveis globais existem apenas variaveis locais As variaveis locais a main sao n1 n2 e maior declaradas na linha 9 As variaveis locais a funcao verifica maior sao a b e m linhas 26 e 28 Seu teste de mesa esta na Tabela 52 Atencao o comando return pode retornar somente um unico valor para a funcao que a chamou 56 Listing 52 C Programa que possui a definicao da funcao verifica maior que retorna o maior de dois numeros inteiros 1 includeiostream 2 includecstdlib 3 using namespace std 4 5 int v e r i f i c a m a i o r int int P r o t o t i p o d a f u n c a o v e r i f i c a m a i o r 6 7 int main D e f i n i c a o d a f u n c a o m a i n 8 9 int n1 n2 maior V a r i a v e i s l o c a i s a m a i n 10 11 cout Entrecomdoisnumerosinteiros 12 cin n1 n2 13 14 C h a m a d a a f u n c a o v e r i f i c a m a i o r e a t r i b u i c a o d o s e u v a l o r 15 d e r e t o r n o a v a r i a v e l m a i o r 16 maior v e r i f i c a m a i o r n1 n2 17 18 cout Omaiornumeroe maior 19 20 system pause 21 return 0 22 f i m m a i n 23 24 int v e r i f i c a m a i o r int a int b D e f i n i c a o d a f u n c a o v e r i f i c a m a i o r 25 26 int m V a r i a v e l l o c a l d a f u n c a o v e r i f i c a m a i o r 27 Mesmo s e n d o p a r ˆa m e t r o s a s v a r i a v e i s a e b s a o l o c a i s 28 i f a b 29 m a 30 else 31 m b 32 33 return m r e t o r n a o v a l o r d e m 34 f i m v e r i f i c a m a i o r Tabela 52 Teste de mesa com valores 15 e 67 para as variaveis n1 e n2 para o programa de Listing 52 Variaveis Observacoes Condicao Saıda n1 n2 maior a b m a b 1 7 Definicao da funcao main 2 8 Inıcio da funcao main 3 9 lixo lixo lixo 4 11 lixo lixo lixo Entre com dois numeros inteiros 5 12 15 67 lixo 6 16 15 67 lixo Chamada a funcao verifica maior 7 24 15 67 Inıcio da funcao verifica maior 8 26 15 67 lixo 9 28 15 67 lixo F 10 31 15 67 67 11 33 15 67 67 Retorna o valor de m que e 67 12 16 15 67 67 O valor de retorno e atribuıdo a maior 13 18 15 67 67 O maior numero e 67 14 20 15 67 67 Espera o pressionamento de alguma tecla 15 21 15 67 67 Fim da funcao main 56 Funcoes com Passagem de Parˆametro Podese pensar em parˆametros como dados de entrada de uma funcao sao informacoes ne cessarias para sua execucao Por exemplo para calcular a raiz quadrada de um numero devese passalo como parˆametro Para calcular a hipotenusa de um triˆangulo retˆangulo devese passar seus catetos como parˆametros Existem basicamente dois tipos de passagem de parˆametro em C i por valor e ii por referˆencia 561 Passagem de Parˆametro por Valor Significa que para a execucao da funcao chamada serao geradas copias dos valores de cada um dos parˆametros Seja o exemplo apresentado anteriormente em Listing 52 pag 57 verificar e imprimir o maior valor de dois numeros Na Figura 53 e feita uma representacao grafica de como ocorre uma passagem de parˆametros por valor apresentada no programa Figura 53 Ilustracao da chamada a funcao verifica maior com passagem de parˆametros por valor e seu retorno Suponha que os valores armazenados nas variaveis n1 e n2 por meio da execucao da linha 12 do programa foram respectivamente 15 e 67 Quando a linha 16 e executada esses valores sao copiados para as variaveis a e b pertencentes a funcao verifica maior Depois disso e verificado qual e o maior dos valores de a e b atribuindo a m o maior deles O resultado dessa comparacao e retornado a funcao main pela execucao da linha 33 onde o maior valor 67 e atribuıdo a variavel maior na funcao main No momento em que a funcao verifica maior chega ao fim as variaveis a b e m sao des truıdas 562 Passagem de Parˆametro por Referˆencia Na passagem de parˆametro por valor ocorre a copia dos valores dos parˆametros assim mo dificacoes na copia nao afetam o valor original da variavel na funcao que efetuou a chamada 59 Ja quando parˆametros sao passados por referˆencia a funcao chamada pode modificar o valor original da variavel Existem duas formas de passagem de parˆametro por referˆencia ponteiros e alias O primeiro e foco de estudo para uma proxima ocasiao sendo o segundo apresentado neste capıtulo Assim podese definir um alias como um apelido para a variavel passada como parˆametro Para utilizar esse tipo de passagem de parˆametro devese no prototipo da funcao e no cabecalho de definicao da funcao colocar um e comercial depois do tipo do parˆametro na chamada de funcao simplesmente mencionar o nome da variavel que sera passada por referˆencia da mesma forma que se faz na passagem de parˆametro por valor Assim qualquer alteracao no valor desse parˆametro no corpo da funcao chamada alterara o valor da variavel original na funcao chamadora Em Listing 53 e apresentado um programa que faz a troca de valores de duas variaveis Na Tabela 53 e apresentado seu teste de mesa Listing 53 Programa que mostra o uso de passagem de parˆametro por referˆencia 1 include iostream 2 include cstdlib 3 using namespace std 4 5 void troca int int P r o t o t i p o d a f u n c a o t r o c a 6 7 int main D e f i n i c a o d a f u n c a o m a i n 8 9 system cls C h a m a d a a f u n c a o p r e d e f i n i d a s y s t e m 10 11 int a9 b7 V a r i a v e i s l o c a i s a m a i n e s u a s a t r i b u i c o e s 12 13 cout Antesdatroca 14 cout a a endl 15 cout b b endl endl 16 17 troca a b C h a m a d a a f u n c a o t r o c a 18 19 cout Depoisdatroca 20 cout a a endl 21 cout b b endl 22 23 system pause C h a m a d a a f u n c a o p r e d e f i n i d a s y s t e m 24 return 0 25 26 27 void troca int x int y D e f i n i c a o d a f u n c a o t r o c a 28 29 int aux 30 60 31 aux x 32 x y 33 y aux 34 Tabela 53 Teste de mesa com valores 9 e 7 para as variaveis a e b Variaveis Observacoes Saıda a b x y aux 1 7 Definicao da funcao main 2 8 Inıcio da funcao main 3 9 Limpa a tela 4 11 9 7 5 13 9 7 Antes da troca 6 14 9 7 a 9 7 15 9 7 b 7 8 17 9 7 Chamada a funcao troca 9 27 9 7 Definicao e inıcio da funcao troca 10 29 9 7 lixo 11 31 9 7 9 12 32 7 7 9 13 33 7 9 9 14 34 7 9 9 Fim da funcao troca 15 17 7 9 Voltando da chamada a funcao 16 19 7 9 Depois da troca 17 20 7 9 a 7 18 21 7 9 b 9 19 23 7 9 Espera o pressionamento de alguma tecla 20 24 7 9 Fim da funcao main 61 CAPITULO 6 Estruturas Condicionais com Funcoes Um programa com funcoes e estruturas condicionais nada mais e do que um programa modu larizado ou seja dividido em partes que utiliza estruturas condicionais Seja o seguinte problema escrever um programa que receba do usuario duas datas no formato dd mm aaaa e determine caso exista qual e a data cronologicamente maior Caso as datas sejam iguais isso devera ser informado ao usuario Observacao vocˆe devera validar as datas antes de verificar qual e a maior 61 Pseudocodigo Utilizar modulos funcoes para resolver esse problema nos ajuda muito no raciocınio logico do programa Poderıamos pensar inicialmente na solucao em pseudocodigo apresentado na Figura 61 Figura 61 Pseudocodigo para verificar qual de duas datas entrada pelo usuario e a maior Nas proximas secoes sao apresentadas cada uma das partes desse pseudocodigo 62 62 Variaveis data1 e data2 sao desmembradas nas variaveis numericas inteiras dia1 mes1 ano1 dia2 mes2 e ano2 conforme Listing 61 Listing 61 C Declaracao de variaveis que representam as datas int dia1 mes1 ano1 dia2 mes2 ano2 63 Entrada de Dados Para realizar a entrada de dados na primeira data poderıamos escrever cout Primeira data cout Entre com a data no formato dd mm aaaa cin dia1 mes1 ano1 Para a segunda data poderıamos repetir esse trecho de codigo cout Segunda data cout Entre com a data no formato dd mm aaaa cin dia2 mes2 ano2 Verifique que ambos os trechos sao muito parecidos excetuandose principalmente pelos nomes das variaveis Sendo assim podemos definir uma funcao de entrada para uma data apresentada em Listing 62 Listing 62 C Funcao que realiza a entrada de uma data dia mes e ano com parˆametros passados por referˆencia void entradaData int dia int mes int ano cout Entrecomadatanoformatoddmmaaaa cin dia mes ano Perceba que os parˆametros da funcao sao dia mes e ano nesta ordem Mas a qual data eles se referem A primeira ou a segunda Isso vai depender de quais variaveis serao passadas por parˆametro na chamada a essa funcao Caso a chamada na main seja realizada conforme codigo de Listing 63 entao a entrada de dados sera realizada na primeira data Listing 63 C Chamada a funcao entradaData entradaData dia1 mes1 ano1 Verifique tambem que os parˆametros foram passados por referˆencia int dia int mes int ano Sabemos disso pelo antes do nome de cada parˆametro no cabecalho de definicao da funcao O que isso quer dizer Que qualquer alteracao no valor dessas variaveis alterara o valor das variaveis correspondentes na funcao que a chamou Outra observacao e que a funcao e do tipo void ou seja nao possui valor de retorno ou seja nao possui o comando return com algum valor 63 64 Validade das Datas Validar uma data significa verificar se o dia mˆes e ano estao corretos tanto individual quanto juntamente Por exemplo nao existe dia negativo ou zero e nem maior que 31 nao existe dia 31 do mˆes 9 nao existe dia 29 do mˆes 2 do ano 1900 pois 1900 nao e bissexto Como verificamos se uma data e valida Voltando ao pseudocodigo do inıcio deste capıtulo temos uma condicao se data1 e valida e data2 e valida entao Assim e melhor escrever definir uma funcao booleana que retorne verdadeiro true caso a data seja valida ou falso false caso contrario conforme pseudocodigo da Figura 62 Figura 62 Pseudocodigo da funcao que retorna verdadeiro caso uma data seja valida ou falso caso contrario Verifique que ha uma chamada a funcao bissexto no pseudocodigo que devemos definir re tornando um valor booleano A funcao validaData em C esta apresentada em Listing 64 O cabecalho da funcao bissexto e apresentado com o par de chaves mas sem as instrucoes do seu corpo Vocˆe devera pesquisar como se calcula um ano bissexto retornando verdadeiro caso seja ou falso caso contrario Verifique que na linha 19 a funcao bissexto e chamada retornando o seu valor de retorno Exemplo caso o ano seja bissexto a funcao bissexto retornara true para a instrucao da linha 19 que por ter um return retornara esse valor a funcao que a chamou que no nosso caso e a main 64 Listing 64 C Funcao validaData 1 bool validaData int dia int mes int ano 2 3 i f dia 1 dia 31 4 5 i f mes 1 mes 12 6 7 i f mes 9 mes 4 mes 6 mes 11 8 9 i f dia 30 10 return true 11 else 12 return false 13 14 else i f mes 2 15 16 i f dia 28 17 return true 18 else i f dia 29 19 return bissexto ano 20 else 21 return false 22 23 return true 24 25 else 26 return false 27 28 else 29 return false 30 31 32 bool bissexto int ano 33 34 35 65 Verificacao da Maior Data Na Figura 63 a seguir e apresentado um pseudocodigo para verificar qual das duas datas e a maior A funcao verificaMaiorData e apresentada em Listing 65 65 Figura 63 Pseudocodigo da funcao que verifica e imprime qual data e a maior Listing 65 C Funcao verificaMaiorData 1 void verificaMaiorData int dia1 int mes1 int ano1 2 int dia2 int mes2 int ano2 3 4 i f ano1 ano2 5 cout Data dia1 mes1 ano1 6 ecronologicamentemaior 7 else i f ano1 ano2 8 cout Data dia2 mes2 ano2 9 ecronologicamentemaior 10 else 11 12 i f mes1 mes2 13 cout Data dia1 mes1 ano1 14 ecronologicamentemaior 15 else i f mes1 mes2 16 cout Data dia2 mes2 ano2 17 ecronologicamentemaior 18 else 19 20 i f dia1 dia2 21 cout Data dia1 mes1 ano1 22 ecronologicamentemaior 23 else i f dia1 dia2 24 cout Data dia2 mes2 ano2 25 ecronologicamentemaior 26 else 66 27 cout Datasiguais 28 29 30 66 Juntando Tudo Agora que cada parte do pseudocodigo da Figura 61 pag 62 foi explicado e todas as funcoes necessarias definidas Listings 62 64 65 o programa completo e apresentado em Listing 66 Listing 66 C Programa que verifica qual data de duas e a maior Tambem valida as datas 1 includeiostream 2 using namespace std 3 4 P r o t o t i p o s d a s f u n c o e s 5 void entradaData int dia int mes int ano 6 bool validaData int dia int mes int ano 7 bool bissexto int ano 8 void verificaMaiorData int dia1 int mes1 int ano1 9 int dia2 int mes2 int ano2 10 11 int main 12 13 int dia1 mes1 ano1 dia2 mes2 ano2 14 15 entradaData dia1 mes1 ano1 16 entradaData dia2 mes2 ano2 17 18 i f validaData dia1 mes1 ano1 validaData dia2 mes2 ano2 19 20 verificaMaiorData dia1 mes1 ano1 dia2 mes2 ano2 21 22 else 23 cout Data1eoudata2invalidas 24 25 return 0 26 27 28 void entradaData int dia int mes int ano 29 30 cout Entrecomadatanoformatoddmmaaaa 31 cin dia mes ano 32 33 34 bool validaData int dia int mes int ano 35 36 i f dia 1 dia 31 37 38 i f mes 1 mes 12 67 39 40 i f mes 9 mes 4 mes 6 mes 11 41 42 i f dia 30 43 return true 44 else 45 return false 46 47 else i f mes 2 48 49 i f dia 28 50 return true 51 else i f dia 29 52 return bissexto ano 53 else 54 return false 55 56 return true 57 58 else 59 return false 60 61 else 62 return false 63 64 65 bool bissexto int ano 66 67 e s c r e v a o c o d i g o a q u i 68 69 70 void verificaMaiorData int dia1 int mes1 int ano1 71 int dia2 int mes2 int ano2 72 73 i f ano1 ano2 74 cout Data dia1 mes1 ano1 75 ecronologicamentemaior 76 else i f ano1 ano2 77 cout Data dia2 mes2 ano2 78 ecronologicamentemaior 79 else 80 81 i f mes1 mes2 82 cout Data dia1 mes1 ano1 83 ecronologicamentemaior 84 else i f mes1 mes2 85 cout Data dia2 mes2 ano2 86 ecronologicamentemaior 87 else 88 89 i f dia1 dia2 68 90 cout Data dia1 mes1 ano1 91 ecronologicamentemaior 92 else i f dia1 dia2 93 cout Data dia2 mes2 ano2 94 ecronologicamentemaior 95 else 96 cout Datasiguais 97 98 99 69 CAPITULO 7 Estruturas de Repeticao Existem situacoes em que e necessario repetir um determinado trecho de codigo uma quantidade fixa de vezes Por exemplo na Figura 71 a seguir para fazer o passaro vermelho do Angry Birds chegar ao porco devese repetir 5 vezes o bloco de comando avance Ja na Figura 72 devese fazer a Anna do filme Frozen desenhar um quadrado no gelo Para isso deve repetir 4 vezes os comandos avance por 100 pixels e vire a direita por 90 graus Figura 71 Uso de estrutura de repeticao com quantidade fixa de vezes no Code Studio com o tema Angry Birds Fonte httpsstudiocodeorghoc6 Alem de repetir um trecho de codigo uma quantidade fixa de vezes tambem ha situacoes em que e necessario repetir um determinado trecho de codigo ate que algo aconteca como na Figura 73 em que devese repetir o comando avance ate que o passaro alcance o porco 70 Figura 72 Uso de estrutura de repeticao com quantidade fixa de vezes no Code Studio com o tema Frozen Fonte httpsstudiocodeorgsfrozenstage1puzzle4 Figura 73 Uso de estrutura de repeticao ate que algo aconteca no Code Studio com o tema Angry Birds Fonte httpsstudiocodeorghoc10 Assim toda vez que se identifica um comportamento de repeticao seja explıcito ou nao deve 71 se utilizar as estruturas de repeticao para generalizar tal comportamento empregando assim uma correta logica de programacao Caso o programador nao utilize essas estruturas estara repetindo trechos de codigos varias vezes o que e trabalhoso deselegante e muitas vezes inviavel C possui trˆes tipos de estruturas de repeticao tambem chamadas de loops ou lacos 1 do while recomendado quando ha um numero indeterminado de repeticoes sendo que o teste da expressao condicional e realizado no final da repeticao 2 while tambem recomendado quando ha um numero indeterminado de repeticoes O teste da expressao condicional e realizado no inıcio da repeticao 3 for recomendado quando ha um numero determinado de repeticoes Apesar de cada laco ter a sua recomendacao todo problema pode ser resolvido com qualquer laco Existem diferencas entre eles como na sintaxe e em seu proprio uso 71 O Laco do while O laco do while cria um ciclo repetido i ate que a expressao de teste seja falsa ou ii enquanto a expressao de teste for verdadeira Verifique que o teste de condicao e avaliado depois do corpo do laco ser executado Assim o corpo do laco do while e executado pelo menos uma vez Atencao Nao esqueca do pontoe vırgula apos o fechamento do parˆentese Listing 71 C Forma geral do laco do while do c o r p o d o l a c o instrucao while expressao condicional 711 Exemplo Usando o Laco do while Seja o programa apresentado em Listing 72 que calcula a area de um triˆangulo a partir de uma base e uma altura passados pelo usuario Listing 72 C Programa que calcula a area de um triˆangulo 1 int main 2 3 4 float area base altura 5 6 cout Calculodaareadetriangulo 7 8 cout Entrecomabase 9 cin base 10 cout Entrecomaaltura 72 11 cin altura 12 13 area base altura 2 14 15 cout Resultado area 16 17 system pause0 18 return 0 19 Agora se o usuario desejar calcular a area de outro triˆangulo ele devera executar novamente o programa Sera que existe uma forma de se calcular a area de outro triˆangulo sem ter que executar novamente o programa Sim escrevendose o que se quer repetir no caso as instrucoes das linhas 8 a 15 de Listing 72 no corpo de um laco de preferˆencia do do while e antes de acabar o corpo do laco fazer uma pergunta ao usuario do tipo Deseja calcular a area de outro triˆangulo sn e tendose resp s como condicao do laco conforme programa apresentado em Listing 73 Listing 73 C Programa que calcula a area de um triˆangulo enquanto o usuario desejar 1 int main 2 3 4 float area base altura 5 char resp 6 7 cout Calculodaareadetriangulo 8 9 do 10 cout Entrecomabase 11 cin base 12 cout Entrecomaaltura 13 cin altura 14 15 area base altura 2 16 17 cout Resultado area 18 19 cout Desejacalcularaareadeoutrotriangulosn 20 cin resp 21 while resp s 22 23 system pause0 24 return 0 25 Verifique que o corpo do laco do while e executado pelo menos uma vez a primeira antes da verificacao da condicao do laco resp s Acompanhe seu teste de mesa na Tabela 71 Tabela 71 Teste de mesa para o programa de area de triˆangulos Variaveis Condicao Saıda area base altura resp resp s 1 4 lixo lixo lixo 2 5 lixo lixo lixo lixo 3 7 lixo lixo lixo lixo Calculo da area de triangulo 4 10 lixo lixo lixo lixo Entre com a base 5 11 lixo 10 lixo lixo 6 12 lixo 10 lixo lixo Entre com a altura 7 13 lixo 10 5 lixo 8 15 25 10 5 lixo 9 17 25 10 5 lixo Resultado 25 10 19 25 10 5 lixo Deseja calcular a area de outro triangulo 11 20 25 10 5 s 12 21 25 10 5 s V 13 10 25 10 5 s Entre com a base 14 11 25 20 5 s 15 12 25 20 5 s Entre com a altura 16 13 25 20 3 s 17 15 30 20 3 s 18 17 30 20 3 s Resultado 30 19 19 30 20 3 s Deseja calcular a area de outro triangulo 20 20 30 20 3 n 21 21 30 20 3 n F 22 23 30 20 3 n Espera o pressionamento de alguma tecla 712 Outro Exemplo Usando o Laco do while Seja o programa apresentado a seguir em Listing 74 que repete um menu de opcoes e executa o codigo correspondente a opcao ate que o usuario digite 0 para sair Se o usuario digitar a opcao 1 o programa imprimira Bom dia Se ele escolher a opcao 2 o programa imprimira Boa noite Se escolher algo diferente de 1 2 ou 0 imprimira Opcao invalida Toda vez que escolher uma opcao diferente de 0 o menu e impresso novamente ao usuario para que escolha outra opcao Quando o usuario digitar 0 a condicao op 0 se tornara falsa e o corpo do laco nao sera mais repetido Listing 74 C Programa que repete um menu de opcoes ate que o usuario digite 0 para sair 1 int main 2 3 int op 4 5 do 6 cout MENU 7 cout 1Frase1 8 cout 2Frase2 9 cout 0Sair 10 cin op 11 12 switch op 13 14 case 1 cout Bomdia break 15 case 2 cout Boanoite break 16 case 0 cout Saindo break 17 default cout Opcaoinvalida 18 19 while op 0 20 21 system pause 22 return 0 23 72 O Laco while Um outro laco bastante utilizado em C e o while que funciona da seguinte forma se a expressao condicional for verdadeira o corpo do laco while e executado uma vez e a expressao de teste e avaliada novamente Quando ha uma unica instrucao no corpo do laco while nao e necessario o uso de chaves como em Listing 75 porem quando ha mais de uma instrucao e obrigatorio seu uso como em Listing 76 75 Listing 75 C Forma geral do laco while com apenas uma unica instrucao no corpo do laco while expressao condicional instrucao c o r p o d o l a c o Listing 76 C Forma geral do laco while com mais de uma instrucao no corpo do laco Verifique o uso obrigatorio das chaves while expressao condicional c o r p o d o l a c o instrucao1 instrucao2 instrucaon O ciclo de teste e execucao e repetido ate que a expressao de teste se torne falsa Entao a execucao do laco termina e o controle do programa passa para a linha seguinte ao laco Verifique que no laco while a expressao condicional pode ser falsa na primeira vez nunca executando as instrucoes do corpo do laco Essa e a principal diferenca com o laco do while em que o corpo do laco e executado pelo menos uma vez independente de sua expressao condicional resultar em verdadeira ou falsa 721 Exemplo Usando o Laco while Seja o seguinte problema calcular e imprimir a tabuada do 4 Verifique na Figura 74 que o multiplicador varia de 0 a 10 de 1 em 1 O produto e resultado de 4 multiplicador Figura 74 Tabuada do 4 Assim podemos utilizar um laco em que o multiplicador inicia em zero e a expressao condicional do laco e multiplicador 10 escrevendose no corpo do laco o calculo e a impressao da multi plicacao e no final o incremento do multiplicador conforme o programa apresentado em Listing 77 com teste de mesa apresentado na Tabela 72 Listing 77 C Programa da tabuada do 4 utilizando o laco while 76 1 int main 2 3 int multiplicador prod 4 5 cout Tabuadado4 6 multiplicador 0 i n i c i a l i z a c a o 7 while multiplicador 10 e x p r e s s a o c o n d i c i o n a l 8 9 prod 4 multiplicador 10 cout 4x multiplicador prod 11 multiplicador i n c r e m e n t o 12 13 system pause0 14 return 0 15 Tabela 72 Teste de mesa para o programa da tabuada do 4 que utiliza while Variaveis Condicao Saıda multiplicador prod mltiplicador 10 1 3 lixo lixo 2 5 lixo lixo Tabuada do 4 3 6 0 lixo 4 7 0 lixo V 5 9 0 0 6 10 0 0 4 x 0 0 7 11 1 0 8 7 1 0 V 9 9 1 4 10 10 1 4 4 x 1 4 11 11 2 4 7 10 36 V 9 10 40 10 10 40 4 x 10 40 11 11 40 7 11 40 F 13 11 40 Espera o pressionamento de tecla Uma tabela mais simples do que a do teste de mesa que pode ser utilizada para entender o funcionamento de um algoritmo com estruturas de repeticao e aquela em que se colocam os valores das variaveis apos cada iteracao passo ou repeticao do laco conforme a Tabela 73 a seguir 77 Tabela 73 Tabela de iteracoes correspondente ao programa da tabuada do 4 apresentado em Listing 77 multiplicador prod Apos a 1a iteracao 1 0 Apos a 2a iteracao 2 4 Apos a 3a iteracao 3 8 Apos a 4a iteracao 4 12 Apos a 5a iteracao 5 16 Apos a 6a iteracao 6 20 Apos a 7a iteracao 7 24 Apos a 8a iteracao 8 32 Apos a 9a iteracao 9 36 Apos a 10a iteracao 10 40 722 Outro Exemplo Usando o Laco while Suponha que se deseje calcular a media de idades de um numero nao determinado de pessoas em que o usuario digita uma idade invalida 0 ou um numero negativo quando deseja encerrar a entrada das idades A solucao para esse problema esta em Listing 78 a seguir Verifique que para se calcular a media de idades de uma certa quantidade de pessoas devese calcular a soma das idades e saber qual e essa quantidade de pessoas Lembrese que se o usuario digitar uma idade invalida na primeira vez que e a condicao de parada do laco essa quantidade e zero e nao se pode realizar divisao por zero Verifique tambem que mesmo a variavel media sendo do tipo float devese utilizar o casting float para converter o valor de soma para float visto que soma e quant sao do tipo int Seus testes de mesa estao nas Tabelas 74 e 75 A tabela de iteracoes correspondente ao primeiro teste de mesa esta na Tabela 76 Listing 78 C Programa que calcula a media de idades de uma quantidade nao determinada de pessoas 1 int main 2 3 int idade soma quant 4 float media 5 6 cout Entrecomumaidade 7 cin idade 8 9 soma 0 10 quant 0 11 12 while idade 0 13 14 soma soma idade 15 quant 16 17 cout Entrecomoutraidade 78 18 cin idade 19 20 21 i f quant 0 22 cout Naohouveentradavalida 23 else 24 25 media float soma quant 26 cout Amediadasidadese media 27 28 29 system pause0 30 return 0 31 Verifique que na linha 14 foi utilizada a variavel acumuladora soma para somar as idades validas Note que ha uma semelhanca muito grande com contadores A unica diferenca e que na acumulacao o valor adicionado pode variar variavel idade no exemplo enquanto que na contagem o valor adicionado e constante geralmente 1 Tabela 74 Teste de mesa do programa apresentado em Listing 78 com uma unica entrada zero Variaveis Condicoes Saıda idade soma quant media idade 0 quant 0 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Entre com uma idade 4 7 0 lixo lixo lixo 5 9 0 0 lixo lixo 6 10 0 0 0 lixo 7 12 0 0 0 lixo F 8 21 0 0 0 lixo V 9 22 0 0 0 lixo Nao houve entrada valida 10 29 0 0 0 lixo Espera o pressionamento de alguma tecla 79 Tabela 75 Teste de mesa do programa apresentado em Listing 78 com as entradas 12 20 18 e 0 Variaveis Condicoes Saıda idade soma quant media idade 0 quant 0 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Entre com uma idade 4 7 12 lixo lixo lixo 5 9 12 0 lixo lixo 6 10 12 0 0 lixo 7 12 12 0 0 lixo V 8 14 12 12 0 lixo V 9 15 12 12 1 lixo 10 17 12 12 1 lixo Entre com outra idade 11 18 20 12 1 lixo 12 12 20 12 1 lixo V 13 14 20 32 1 lixo 14 15 20 32 2 lixo 15 17 20 32 2 lixo Entre com outra idade 16 18 18 32 2 lixo 17 12 18 32 2 lixo V 18 14 18 50 2 lixo 19 15 18 50 3 lixo 20 17 18 50 3 lixo Entre com outra idade 21 18 0 50 3 lixo 22 12 0 50 3 lixo F 23 21 0 50 3 lixo F 24 25 0 50 3 1666 25 26 0 50 3 1666 A media de idades e 1666 26 29 0 50 3 1666 Espera o pressionamento de qualquer tecla Tabela 76 Tabela de iteracoes correspondente ao programa de Listing 78 com o teste correspon dente ao da Tabela 75 soma quant Apos a 1a iteracao 12 1 Apos a 2a iteracao 32 2 Apos a 3a iteracao 50 3 73 O Laco for O laco for engloba trˆes expressoes em uma unica e e util principalmente quando se quer repetir algo uma quantidade fixa de vezes A forma geral do laco for com uma unica instrucao no corpo do laco e apresentada em Listing 79 Ja a forma geral do laco for com mais de uma instrucao a ser executada no corpo do laco sendo obrigatorio o uso das chaves esta apresentada em Listing 710 Listing 79 C Forma geral do laco for com apenas uma unica instrucao no corpo do laco for i n i c i a l i z a c a o expressao condicional in decremento instrucao c o r p o d o l a c o 80 Listing 710 C Forma geral do laco for com mais de uma instrucao no corpo do laco for i n i c i a l i z a c a o expressao condicional in decremento c o r p o d o l a c o instrucao1 instrucao2 instrucaon Devese usar chaves se o corpo do laco tiver mais de uma instrucao Os parˆenteses seguindo a palavrachave for contˆem trˆes expressoes separadas por pontosevırgulas 1 Inicializacao em sua forma mais simples e uma instrucao de atribuicao multiplicador 0 na linha 6 em Listing 711 e e sempre executada uma unica vez antes do laco ser iniciado 2 Expressao condicional e uma instrucao de condicao que controla o laco multiplicador10 na linha 6 em Listing 711 Essa expressao e avaliada como verdadeira ou falsa toda vez que o laco for iniciado ou reiniciado Se verdadeira o corpo do laco e executado Quando a expressao tornarse falsa o laco e terminado e o controle passa para a instrucao seguinte ao laco 3 indecremento define a maneira como a variavel de controle do laco sera alterada cada vez que o laco e repetido multiplicador na linha 6 em Listing 711 que pode ser um incremento ou decremento Essa instrucao e executada toda vez imediatamente apos a execucao do corpo do laco 731 Exemplo Usando o Laco for Seja o problema do calculo e impressao da tabuada do 4 visto anteriormente na Secao 721 do laco while pagina 76 Esse e um problema em que o laco for se adequa melhor pois existe um numero fixo de repeticoes O programa utilizando o laco for e apresentado em Listing 711 Seu teste de mesa e apresentado na Tabela 77 A tabela de iteracoes e a mesma do laco while apresentada anteriormente na Tabela 73 Listing 711 C Resolucao da tabuada do 4 usando o laco for 1 int main 2 3 int multiplicador prod 4 5 cout Tabuadado4 6 for multiplicador 0 multiplicador 10 multiplicador 7 8 prod 4 multiplicador 9 cout 4x imultiplicador prod 10 11 system pause0 12 return 0 13 81 Tabela 77 Teste de mesa para o programa da tabuada do 4 utilizando o laco for Variaveis Condicao Saıda multiplicador prod multiplicador 10 1 3 lixo lixo 2 5 lixo lixo Tabuada do 4 3 6 0 lixo V 4 8 0 0 5 9 0 0 4 x 0 0 6 6 1 0 V 7 8 1 4 8 9 1 4 4 x 1 4 9 6 2 4 V 10 8 2 8 11 9 2 8 4 x 2 8 6 10 36 V 8 10 50 9 10 50 4 x 10 40 6 11 40 F 11 11 40 Espera o pressionamento de alguma tecla O laco while pode utilizar os mesmos elementos do laco for mas eles sao distribuıdos de maneira diferente no programa Em geral um laco while pode substituir um laco for na forma apresentada em Listing 712 Listing 712 C Como o laco while pode substituir o laco for i n i c i a l i z a c a o while expressao condicional in decremento 732 Outro Exemplo Usando o Laco for Seja o seguinte problema calcular a media de idades de 10 pessoas Esse tambem e um problema com uma quantidade fixa de repeticoes sendo o laco for mais recomendado Sao 10 entradas de idades por isso podemos utilizar uma variavel chamada quant para controlar a entrada e o somatorio das idades O programa que resolve esse problema e apresentado em Listing 713 a seguir Na Tabela 78 e apresentada a tabela de iteracoes com as entradas 2 8 38 39 5 40 30 18 45 e 60 nesta ordem 82 Listing 713 C Programa que calcula a media de idades de 10 pessoas utilizando o laco for 1 int main 2 3 int idade soma0 quant1 4 5 for quant1 quant 10 quant 6 7 cout Entrecoma quant aidade 8 cin idade 9 soma soma idade 10 11 media float soma quant 12 cout Amediadeidadesdas10pessoase media 13 system pause0 14 return 0 15 Tabela 78 Tabela de iteracoes correspondente ao programa da media de 10 idades apresentado em Listing 713 idade soma quant Apos a 1a iteracao 2 2 2 Apos a 2a iteracao 8 10 3 Apos a 3a iteracao 38 48 4 Apos a 4a iteracao 39 87 5 Apos a 5a iteracao 5 92 6 Apos a 6a iteracao 40 132 7 Apos a 7a iteracao 30 162 8 Apos a 8a iteracao 18 180 9 Apos a 9a iteracao 45 225 10 Apos a 10a iteracao 60 285 11 83 74 Estruturas de Repeticao com Funcoes Nesta secao e apresentado um exemplo de um programa cuja parte principal e um laco e cujas entradas de dados que tambem utilizam lacos sao implementadas como funcoes 741 O Problema Seja o seguinte problema uma pesquisa sobre algumas caracterısticas fısicas da populacao de uma determinada regiao coletou os seguintes dados referentes a cada habitante para serem analisados idade em anos seu programa nao devera aceitar idade negativa e nem idade superior a 150 anos sexo M masculino F feminino devera haver uma funcao que faca a entrada do sexo juntamente com sua validacao cor dos olhos A azuis V verdes C castanhos devera haver uma funcao que faca a entrada da cor dos olhos juntamente com sua validacao cor dos cabelos L louros C castanhos P pretos devera haver uma funcao que faca a entrada da cor dos cabelos juntamente com sua validacao Para cada habitante deverao ser digitados todos esses dados e a ultima entrada que nao cor responde a ninguem contera o valor de idade igual a 0 Assim faca um programa que determine e escreva a maior idade dos habitantes a porcentagem de mulheres com cor de olhos azuis ou verdes mas que tenham cabelos pretos 742 O Pseudocodigo Basicamente o algoritmo para resolver o problema segue o pseudocodigo apresentado na Figura 75 a seguir Repare que foram escritas todas as variaveis utilizadas lembrando que na hora de programar devemos escrever seus tipos de dados Verifique que a todos os contadores quant quantMulheres quantMulheresCat foram atribuıdos o valor inicial zero senao ficam com valor de lixo da memoria A variavel maiorIdade recebe o valor inicial zero pois deve receber um valor muito baixo para ser trocado pela primeira idade valida pela primeira vez Atencao as entradas em idade sexo cor de olhos e cor de cabelos devem ser realizadas em funcoes que ja retornam os valores validos para cada uma delas Os pseudocodigos para as funcoes de entrada em idade e em sexo sao apresentados nas Figuras 76 e 77 As funcoes de entrada para cor de cabelhos e cor de olhos sao similares a funcao de entrada em sexo Verifique o uso dos operadores logicos fazendo tabelasverdade Repare que ao final do laco devese entrar novamente com uma idade para ser verificada pela condicao do laco 84 Figura 75 Pseudocodigo do modulo principal que utiliza estruturas de repeticao com funcoes Figura 76 Pseudocodigo do modulo de entrada em idade com validacao 743 O Programa Em Listing 714 e apresentado um programa correspondente ao pseudocodigo da Figura 75 85 Figura 77 Pseudocodigo do modulo de entrada em sexo com validacao Listing 714 C 1 includeiostream 2 using namespace std 3 4 P r o t o t i p o s d a s f u n c o e s 5 int entradaIdade 6 char entradaSexo 7 char entradaCorOlhos 8 char entradaCorCabelos 9 10 int main 11 12 int idade maiorIdade quant quantMulheres quantMulheresCat 13 char sexo corOlhos corCabelos 14 15 maiorIdade 0 quant 0 quantMulheres 0 quantMulheresCat 0 16 17 idade entradaIdade 18 19 while idade 0 20 21 sexo entraSexo 22 corOlhos entradaCorOlhos 23 corCabelos entradaCorCabelos 24 25 quant 26 27 i f idade maiorIdade 28 maiorIdade idade 29 i f sexo f 30 31 quantMulheres 32 i f corOlhos a corOlhos v 33 corCabelos p 34 quantMulheresCat 35 36 86 37 idade entradaIdade 38 39 40 i f quant 0 41 cout Naohouvedadosvalidos 42 else 43 cout Amaioridadeentretodososhabitantese 44 maiorIdade 45 i f quantMulheres 0 46 cout Naohouvemulhercadastrada 47 else 48 cout Aporcentagemdemulherescomcordeolhosazuisou 49 verdesecabelospretose 50 float quantMulheresCatquantMulheres 100 51 52 53 return 0 54 55 56 int entradaIdade 57 58 int idade 59 60 cout Entrecomumaidadede0a1500parasair 61 cin idade 62 while idade 0 idade 150 63 64 cout Idadeinvalida 65 cout Entrecomumaidadede0a1500parasair 66 cin idade 67 68 return idade 69 70 71 char entradaSexo 72 73 char sexo 74 75 do 76 cout Entrecomosexofemininooumasculino 77 cin sexo 78 i f sexo f sexo m 79 80 cout Sexoinvalido 81 cout Entrecomosexofemininooumasculino 82 cin sexo 83 84 while sexo f sexo m 85 86 return sexo 87 87 88 89 char entradaCorOlhos 90 91 char corOlhos 92 93 do 94 cout Entrecomacordosolhosazuisverdesou 95 castanhos 96 cin corOlhos 97 i f corOlhos a corOlhos v corOlhos c 98 99 cout Corinvalida 100 cout Entrecomacordosolhosazuisverdesou 101 cout castanhos 102 cin corOlhos 103 104 while corOlhos a corOlhos v corOlhos c 105 106 return corOlhos 107 108 109 char entradaCorCabelos 110 111 char corCabelos 112 113 do 114 cout Entrecomacordoscabeloslouroscastanhos 115 oupretos 116 cin corCabelos 117 i f corCabelos l corCabelos c corCabelos p 118 119 cout Corinvalida 120 cout Entrecomacordoscabeloslouros 121 castanhosoupretos 122 cin corCabelos 123 124 while corCabelos l corCabelos c corCabelos p 125 126 return corCabelos 127 88 CAPITULO 8 Vetores Imagine o seguinte problema calcular a media aritmetica das notas de provas de cinco alunos Assim poderseia escrever o programa apresentado em Listing 81 Listing 81 C Programa que calcula a media de notas de cinco alunos utilizandose uma variavel para cada nota includeiostream using namespace std int main float nota1 nota2 nota3 nota4 nota5 media cout Digiteanotadoaluno1 cin nota1 cout Digiteanotadoaluno2 cin nota2 cout Digiteanotadoaluno3 cin nota3 cout Digiteanotadoaluno4 cin nota4 cout Digiteanotadoaluno5 cin nota5 media nota1nota2nota3nota4nota5 5 cout Mediadasnotas media return 0 Imagine agora se se pretendesse encontrar a media aritmetica das notas de uma classe de 50 alunos ou da escola toda com 2000 alunos Seria uma tarefa bastante volumosa Ou talvez vocˆe pense na solucao do programa apresentado em Listing 82 em que ha a de claracao de uma variavel chamada nota e fazendo a entrada de dados em um laco nessa mesma 89 variavel ha o acumulo da soma de notas na variavel soma Qual o problema com essa solucao E que a cada iteracao do laco a nota e substituıda por outra e vocˆe perde os valores das notas caso necessite acessalas mais tarde Listing 82 C Programa que calcula a media de notas de cinco alunos utilizandose apenas uma variavel para armazenar a nota de todos os alunos uma por vez includeiostream using namespace std int main float nota media soma00 cout Entrecom5notas for int cont 1 cont 5 cont cout Entrecoma cont1 anota cin nota soma soma nota media soma 5 cout Mediadasnotas media return 0 E evidente que e necessaria uma maneira conveniente para referenciar tais colecoes de dados similares Vetor e um tipo de dado oferecido para esse proposito 81 Definicao de Vetor Um vetor e um conjunto de variaveis capazes de armazenar varios valores do mesmo tipo Cada um desses valores e identificado pelo mesmo nome o nome dado ao vetor sendo diferenciado apenas por um ındice Os ındices utilizados em C para identificar as posicoes de um vetor comecam sempre em 0 e vao ate o tamanho do vetor menos um 90 82 Declaracao de Vetor A declaracao de um vetor segue o seguinte formato tipo nomeDoVetor numeroMaximoDePosicoes Verifique o Exemplo 81 a seguir que apresenta um vetor de 5 elementos do tipo real Exemplo 81 C Exemplo de vetor de numeros reais com cinco posicoes float notas5 O vetor chamado notas possui 5 posicoes comecando pelo ındice 0 e indo ate o ındice 4 tamanhodovetor 1 Em cada posicao poderao ser armazenados numeros reais conforme es pecificado pelo tipo float na declaracao Exemplo 0 1 2 3 4 65 40 90 60 85 83 Acesso a um Elemento do Vetor Para acessar um elemento do vetor devese utilizar o nome do vetor e indicar o ındice entre o par de colchetes Assim nomeDoVetor ındice Verifique o Exemplo 82 que apresenta o acesso a elementos de um vetor Exemplo 82 C Alguns acessos de elementos do vetor notas Para acessar o terceiro elemento notas2 com valor 90 Para acessar o primeiro elemento notas0 com valor 65 Qual o valor de notas5 Nao existe pois nao ha o ındice 5 que seria o sexto elemento Qual o valor de notas4 85 84 Um Exemplo de Programa Utilizando um Vetor A seguir e apresentado um programa Listing 83 que calcula a media de notas de cinco alunos utilizando um vetor Verifique que o acumulo da soma e realizado dentro do laco e a media e calculada fora dele Seu teste de mesa e apresentado na Tabela 81 91 Listing 83 C Programa que calcula a media de cinco alunos utilizando um vetor 1 include iostream 2 using namespace std 3 4 int main 5 6 float notas 5 soma media 7 int i 8 9 soma 0 10 for i 0 i 5 i 11 12 cout Digiteanotadoaluno i1 13 cin notas i 14 soma soma notas i 15 16 media soma 5 17 cout Mediadasnotas media 18 system pause 19 return 0 20 Tabela 81 Teste de mesa para o programa de media de notas de cinco alunos usando um vetor Suponha que os valores a serem inseridos no vetor sao na ordem 65 40 90 60 e 85 Variaveis Condicao Saıda notas soma media i i 5 0 1 2 3 4 1 6 lixo lixo lixo lixo lixo lixo lixo 2 7 lixo lixo lixo lixo lixo lixo lixo lixo 3 9 lixo lixo lixo lixo lixo 0 lixo lixo 4 10 lixo lixo lixo lixo lixo 0 lixo 0 V 5 12 lixo lixo lixo lixo lixo 0 lixo 0 Digite a nota do aluno 1 6 13 65 lixo lixo lixo lixo 0 lixo 0 7 14 65 lixo lixo lixo lixo 65 lixo 0 8 10 65 lixo lixo lixo lixo 65 lixo 1 V 9 12 65 lixo lixo lixo lixo 65 lixo 1 Digite a nota do aluno 2 10 13 65 40 lixo lixo lixo 65 lixo 1 11 14 65 40 lixo lixo lixo 105 lixo 1 12 10 65 40 lixo lixo lixo 105 lixo 2 V 13 12 65 40 lixo lixo lixo 105 lixo 2 Digite a nota do aluno 3 14 13 65 40 90 lixo lixo 105 lixo 2 15 14 65 40 90 lixo lixo 195 lixo 2 16 10 65 40 90 lixo lixo 195 lixo 3 V 17 12 65 40 90 lixo lixo 195 lixo 3 Digite a nota do aluno 4 18 13 65 40 90 60 lixo 195 lixo 3 19 14 65 40 90 60 lixo 255 lixo 3 20 10 65 40 90 60 lixo 255 lixo 4 V 21 12 65 40 90 60 lixo 255 lixo 4 Digite a nota do aluno 5 22 13 65 40 90 60 85 255 lixo 4 23 14 65 40 90 60 85 340 lixo 4 24 10 65 40 90 60 85 340 lixo 5 F 25 16 65 40 90 60 85 340 68 5 26 17 65 40 90 60 85 340 68 5 A media das notas e 68 27 18 65 40 90 60 85 340 68 5 Espera o pressionamento de tecla 92 85 Funcoes Passando Vetor como Parˆametro Nesta secao e apresentado um programa que define funcoes que tˆem vetor como parˆametro Esse programa modularizado esta apresentado a seguir em Listing 84 com os seguintes passos 1 Inicializa um vetor de 10 posicoes com valores do tipo real inseridos pelo usuario 2 Imprime o vetor separando cada elemento por um espaco em branco 3 Verifica se o vetor esta ordenado emitindo mensagem apropriada 4 Caso nao esteja ordena seus elementos e os imprime 93 Quando se define funcoes em que um vetor e passado como parˆametro devese ter em mente duas informacoes 1 Escrever o nome do vetor na chamada a funcao como nas linhas 14 15 17 22 e 23 de Listing 84 2 Declarar o vetor no cabecalho de definicao da funcao como nas linhas 28 35 49 e 69 de Listing 84 Listing 84 C Programa modularizado com funcoes 1 includeiostream 2 using namespace std 3 4 P r o t o t i p o s d a s f u n c o e s 5 void entradaVetor float vet 6 void ordena float vet 7 bool estahOrdenado float vet 8 void imprimeVetor float vet 9 10 int main 11 12 float vet 1 0 13 14 entradaVetor vet 15 imprimeVetor vet 16 17 i f estahOrdenado vet 18 cout Vetorestaordenado 19 else 20 21 cout Vetornaoestaordenado 22 ordena vet 23 imprimeVetor vet 24 25 return 0 26 27 28 void entradaVetor float vet 29 30 cout Entrecom10valoresreais 31 for int i 0 i 10 i 32 cin vet i 33 34 35 void imprimeVetor float vet 36 37 cout Vetor 38 for int i 0 i 10 i 39 cout vet i 40 41 94 42 void troca float a float b 43 44 int aux a 45 a b 46 b aux 47 48 49 void ordena float vet 50 51 int iMenor 52 float menor 53 54 for int quant1 quant9 quant 55 56 iMenor quant 1 57 menor vet iMenor 58 for int iquant i 10 i 59 i f vet i menor 60 61 menor vet i 62 iMenor i 63 64 troca vet quant 1 vet iMenor 65 66 67 68 69 bool estahOrdenado float vet 70 71 for int i 0 i 9 i 72 i f vet i vet i 1 73 return false 74 return true 75 95 CAPITULO 9 Strings Strings sao utilizadas para representar sequˆencias de caracteres como frases nomes de pessoas cidades ruas paıses etc O conteudo deste capıtulo possui varias informacoes novas mas o uso de strings foi empregado desde as primeiras aulas quando se imprimia uma frase com o uso do comando cout No exemplo a seguir tudo o que esta entre as aspas e uma string mas e uma string constante cout Digite sua idade Entretanto algumas vezes houve a necessidade de se armazenar strings em variaveis como por exemplo o nome de uma pessoa o nome de uma cidade ou ate mesmo uma frase 91 Definicao de String Uma string e um vetor de caracteres terminado por um caracter nulo Um caracter nulo e especi ficado como 0 lˆese barra zero 92 Declaracao de String Assim a declaracao de uma string e char nomeDaString tamanhoMaximo E preciso declarar vetores de caracteres como sendo um caracter mais longo que a maior string que eles devem guardar Por exemplo para declarar um vetor s que guarda uma string de 10 caracteres devese escrever char s11 Isso reserva espaco para o caracter nulo no final da string 96 93 Alguns ComandosFuncoes com Strings Apesar de uma string ser um vetor sua manipulacao difere de vetores numericos em varias situacoes como na leitura impressao copia e comparacao Tarefa Comandos Leitura cin nomeDaString ou getsnomeDaString Impressao cout nomeDaString Copia de uma string s2 em outra s1 strcpys1 s2 Comparacao entre duas strings strcmps1 s2 Calculo do tamanho de uma string strlennomeDaString Para a leitura em uma string existem duas opcoes o comando cin caso a string nao possua espacos em branco ou a funcao gets da biblioteca cstdio caso contrario Em qualquer caso o usuario pode entrar com a string inteira finalizando com a tecla ENTER Mesmo declarando um tamanho maximo de string o usuario podera entrar com caracteres a mais Assim e o programador quem deve prever o tamanho maximo para que este nao seja ultrapassado Na impressao o comando cout imprime todos os caracteres ate encontrar o caracter de fim de string o 0 Para comparar copiar e encontrar o tamanho de uma string sao utilizadas as seguintes funcoes respectivamente strcmp strcpy e strlen todas da biblioteca cstring A funcao strcmp retorna 0 se as strings sao iguais e diferente de 0 caso contrario Ja a strlen retorna o tamanho de uma string que nao e o tamanho maximo especificado na declaracao verificando quantos caracteres existem antes do caracter nulo 94 Um Exemplo Utilizando String Seja o seguinte problema escreva um programa que peca ao usuario o nome de um mˆes Faca a abreviacao desse nome copiando em uma outra string seus trˆes primeiros caracteres seguidos de um ponto Imprima o mˆes abreviado O programa correspondente a esse problema esta apresentado em Listing 91 Listing 91 C Programa em que o desenvolvedor monta uma string caracter a caracter 1 includeiostream 2 using namespace std 3 4 const int MAX CHAR MES 15 Q u a n t i d a d e m a x i m a d e 5 c a r a c t e r e s p a r a o m e s 6 MAX CHAR ABREV 3 P a r a o s 3 p r i m e i r o s c a r a c t e r e s 7 8 int main 9 10 D e c l a r a c a o d e v a r i a v e i s 11 char mes MAX CHAR MES 12 abrev MAX CHAR ABREV2 13 int i 97 14 15 L e i t u r a d o m e s 16 P o d e s e r u s a d o o c i n p o r q u e n o m e d e m e s n a o p o s s u i e s p a c o 17 em b r a n c o 18 cout Entrecomummesdoano 19 cin mes 20 21 p a r a c o p i a r o s t r ˆe s p r i m e i r o s c a r a c t e r e s 22 for i 0 iMAX CHAR ABREV i 23 abrev i mes i 24 25 C o p i a o s c a r a c t e r e s p o n t o e b a r r a z e r o 26 abrev i 27 i 28 abrev i 0 29 30 I m p r e s s a o d o mˆe s a b r e v i a d o 31 cout Abreviaturadomes abrev 32 33 return 0 34 f i m m a i n Quando a instrucao da linha 19 e executada o comando cin insere o caracter 0 ao final da string digitada Tabela 91 Vetor mes apos a leitura da string Abril ındice 0 1 2 3 4 5 14 caracter A b r i l 0 lixo lixo Quando uma string e declarada dentro de uma funcao neste caso a main ela possui lixo Tabela 92 Vetor abrev antes da abreviacao ındice 0 1 2 3 4 caracter lixo lixo lixo lixo lixo Apos as instrucoes das linhas 22 a 28 Tabela 93 Vetor abrev apos a abreviacao ındice 0 1 2 3 4 caracter A b r 0 Devese inserir o caracter 0 para indicar que a string termina apos o caracter ponto linha 28 Na instrucao de linha 31 o comando cout imprimira todos os caracteres da string ate encontrar o 0 mesmo que exceda o tamanho maximo declarado na string Por isso caso nao se coloque o 0 o comando cout podera imprimir varios caracteres lixo ate encontrar seu delimitador de fim 98 95 Outro Exemplo utilizando String Seja o seguinte problema escreva um programa que peca ao usuario o nome da cidade onde nasceu e o nome da cidade na qual reside Verifique se sao as mesmas emitindo as mensagens correspondentes A seguir verifique e imprima a quantidade de vogais no nome da segunda cidade substituindoas pelo caracter Imprima o nome da segunda cidade alterada O programa correspondente a esse problema esta apresentado em Listing 92 Listing 92 C Programa que ilustra a manipulacao de algumas funcoes da biblioteca cstring 1 include iostream 2 include cstring s t r c m p s t r l e n 3 include cstdio g e t s 4 using namespace std 5 6 const int MAX CHAR 50 q u a n t i d a d e m a x i m a d e c a r a c t e r e s 7 8 int main 9 10 D e c l a r a c a o d e v a r i a v e i s 11 char cid1 MAX CHAR cid2 MAX CHAR 12 int i quant tam 13 14 L e i t u r a d a s c i d a d e s 15 cout Entrecomonomedacidadeondenasceu 16 gets cid1 17 cout Entrecomonomedacidadenaqualreside 18 gets cid2 19 20 V e r i f i c a c a o d a s c i d a d e s i m p r i m i n d o a s m e n s a g e n s 21 c o r r e s p o n d e n t e s 22 i f strcmp cid1 cid2 0 i f s t r c m p c i d 1 c i d 2 23 cout Ascidadessaoasmesmas 24 else 25 cout Ascidadessaodiferentes 26 27 C a l c u l o d o t a m a n h o d o n o m e d a 2 a c i d a d e 28 tam s t r l e n cid2 s t r i n g h 29 30 V a r r e d u r a n o n o m e d a 2 a c i d a d e v e r i f i c a n d o q u a i s c a r a c t e r e s 31 s a o v o g a i s s u b s t i t u i n d o a s p o r e c o n t a n d o s e a q u a n t i d a d e 32 d e s u b s t i t u i c o e s 33 quant 0 34 for i 0 itam i 35 36 i f cid2 i a cid2 i e cid2 i i 37 cid2 i o cid2 i u 38 39 cid2 i 40 quant 41 42 99 43 44 I m p r e s s a o d o n o m e d a 2 ª c i d a d e a l t e r a d a e a q u a n t i d a d e d e 45 s u b s t i t u i c o e s 46 cout Nomealteradodacidadenaqualreside cid2 47 cout Quantidadedesubstituicoesrealizadas quant 48 49 return 0 50 f i m m a i n Quando as instrucoes das linhas 16 e 18 sao executadas a funcao gets insere o caracter 0 ao final da string digitada Nas outras posicoes apos esse caracter existem lixos na memoria Tabela 94 Vetor cid1 apos a entrada da string Araraquara ındice 0 1 2 3 4 5 6 7 8 9 10 49 caracter A r a r a q u a r a 0 lixo lixo Tabela 95 Vetor cid2 apos a entrada da string Boa Vista ındice 0 1 2 3 4 5 6 7 8 9 49 caracter B o a V i s t a 0 lixo lixo Ao passar pela instrucao de linha 28 tam recebe o valor 9 que e o tamanho da string passada pelo usuario Daı na linha 34 a variavel i vai de 0 a tam 1 que e o valor 8 Se i variasse de 0 a 49 poderiam ser encontradas outras vogais lixo do ındice 10 ao 49 Para comparar cada caracter da string com as vogais devese acessalo da mesma forma que se acessa elementos de um vetor numerico nomeDoVetorındice Para comparar com cada vogal constante devese colocala entre apostrofos Tabela 96 Vetor cid2 apos as substituicoes ındice 0 1 2 3 4 5 6 7 8 9 49 caracter B V s t 0 lixo lixo 96 Strings como Parˆametros em Funcoes Sendo uma string um vetor de caracteres ao se passar uma string por parˆametro em uma funcao devese fazer o mesmo procedimento quando um vetor numerico e um parˆametro 100 CAPITULO 10 Matrizes 101 Definicao de Matriz Sao similares aos vetores sendo compostas por linhas e colunas No exemplo a seguir e apresentada uma matriz denominada mat com 3 linhas e 6 colunas e que contem numeros reais float mat36 declaracao da variavel mat 0 1 2 3 4 5 0 1 2 12 56 98 34 15 89 59 78 47 14 36 85 65 23 12 96 78 10 102 Declaracao de Matriz A declaracao de uma matriz segue o seguinte formato tipo nomeDaMatriz numeroDeLinhas numeroDeColunas Da mesma forma que ocorre com os vetores os ındices comecam sempre em 0 tanto de linha quanto de coluna Sendo assim com a declaracao anterior criouse uma variavel chamada mat contendo trˆes linhas ındices de 0 a 2 e seis colunas ındices de 0 a 5 capaz de armazenar numeros reais 103 Acesso a Elemento de Matriz Para acessar cada elemento da matriz devese utilizar o nome da matriz e indicar os ındices de linha e de coluna entre cada par de colchetes Assim nomeDaMatriz ındiceDaLinha ındiceDaColuna 101 Exemplo 101 C Alguns acessos de elementos da matriz mat 1 Para acessar o terceiro numero que esta na segunda linha mat12 com valor 47 2 Para acessar o primeiro numero da terceira linha mat20 com valor 65 3 Qual o valor de mat30 Nao existe pois nao ha o ındice 3 de linha 4 Qual o valor de mat16 Nao existe pois nao ha o ındice 6 de coluna Desta forma como seria o codigo em que se pedem valores para serem inseridos em uma matriz Depende do problema se a matriz e preenchida de uma vez ou aos poucos se e preciso inserir valores de linha a linha ou de coluna a coluna etc O codigo a seguir insere de uma vez valores de linha a linha em uma matriz ou seja fixase a linha e variase a coluna i L i n e o ı n d i c e d a l i n h a e i C o l e o ı n d i c e d a c o l u n a for iLin 0 iLin quantLinhas iLin for iCol 0 iCol quantColunas iCol cin nomeDaMatriz iLin iCol Como a matriz possui quantLinhas linhas o for externo deve variar de 0 a quantLinhas1 per correndo assim as quantLinhas linhas da matriz e o for interno deve variar de 0 a quantColunas 1 percorrendo assim as quantColunas colunas da matriz Exemplificando quando iLin e zero iCol varia de 0 a quantColunas 1 varrendo assim a primeira linha quando iLin e 1 iCol varia de 0 a quantColunas 1 varrendo assim a segunda linha e assim por diante ate quando iLin e quantLinhas 1 com iCol variando de 0 a quantColunas 1 O codigo a seguir insere de uma vez valores de coluna a coluna em uma matriz Perceba que para cada coluna sao varridos todos os ındices de linhas ou seja fixase a coluna e variase a linha for iCol 0 iCol quantColunas iCol for iLin 0 iLin quantLinhas iLin cin nomeDaMatriz iLin iCol 104 Um Exemplo Utilizando Matriz Seja o seguinte problema escreva um programa que receba do usuario notas de um aluno em 8 disciplinas por 4 bimestres inserindoas em uma matriz 9 x 4 A ultima linha devera conter a media por bimestre conforme apresentada na figura a seguir Imprima as medias da seguinte forma A media no Xo bimestre foi Y O programa correspondente a esse problema e apresentado em Listing 101 102 1o Bim 2o Bim 3o Bim 4o Bim Disciplina 1 Disciplina 2 Disciplina 3 Disciplina 4 Disciplina 5 Disciplina 6 Disciplina 7 Disciplina 8 Media Bimestral 65 55 50 80 40 50 30 100 35 70 100 95 80 65 60 45 40 30 95 20 25 40 35 15 55 45 100 80 100 100 100 100 55 568 712 668 Listing 101 C Programa que manipula matriz numerica 1 include iostream 2 using namespace std 3 4 const int NUM BIM 4 n u m e r o d e b i m e s t r e s 5 NUM DISCIP 8 n u m e r o d e d i s c i p l i n a s 6 7 int main 8 9 D e c l a r a c a o d e v a r i a v e i s 10 float notas NUM DISCIP1NUM BIM 11 soma media 12 int iDiscip iBim 13 14 L e i t u r a d a s n o t a s 15 cout LEITURADENOTAS 16 for iBim0 iBimNUM BIM iBim 17 18 soma 0 19 cout iBim1 oBimestre 20 for i D i s c i p 0 iDiscip NUM DISCIP i D i s c i p 21 22 cout Entrecomanotadadisciplina i D i s c i p1 23 24 cin notas i D i s c i p iBim 25 soma soma notas i D i s c i p iBim 26 27 media soma NUM DISCIP 28 notas i D i s c i p iBim media 29 30 31 I m p r e s s a o d a s m e d i a s b i m e s t r a i s 32 for iBim0 iBimNUM BIM iBim 33 cout Amediano iBim1 oBimestrefoi 34 notas NUM DISCIP iBim 35 36 return 0 37 f i m m a i n 103 105 Funcoes Passando Matriz como Parˆametro Seja o seguinte problema devese gerar inteiros aleatorios de 0 a 9 em uma matriz 3 x 5 Em seguida devese gerar uma matriz transposta e depois imprimir a matriz original e a transposta O programa modularizado para esse problema esta apresentado em Listing 102 Da mesma forma que em vetores quando se passa uma matriz como parˆametro em uma funcao devese ter em mente duas informacoes 1 Escrever o nome da matriz na chamada a funcao como nas linhas 14 15 e 16 de Listing 102 2 Declarar a matriz no cabecalho de definicao da funcao como nas linhas 21 28 e 35 de Listing 102 Listing 102 C Programa modularizado com matrizes 1 includeiostream 2 includecstdlib r a n d 3 using namespace std 4 5 P r o t o t i p o s d a s f u n c o e s 6 void geraElementosMatriz int matriz 3 5 7 void geraTransposta int matriz 3 5 int matrizT 5 3 8 void imprimeMatrizes int matriz 3 5 int matrizT 5 3 9 10 int main 11 12 int matriz 3 5 matrizT 5 3 13 14 geraElementosMatriz matriz 15 geraTransposta matriz matrizT 16 imprimeMatrizes matriz matrizT 17 18 return 0 19 20 21 void geraElementosMatriz int matriz 3 5 22 23 for int iLin 0 iLin 3 iLin 24 for int iCol 0 iCol 5 iCol 25 matriz iLin iCol rand 10 26 27 28 void geraTransposta int matriz 3 5 int matrizT 5 3 29 30 for int iLin 0 iLin 5 iLin 31 for int iCol 0 iCol 3 iCol 32 matrizT iLin iCol matriz iCol iLin 33 34 35 void imprimeMatrizes int matriz 3 5 int matrizT 5 3 104 36 37 cout MATRIZORIGINAL 38 for int iLin 0 iLin 3 iLin 39 40 for int iCol 0 iCol 5 iCol 41 cout matriz iLin iCol 42 cout endl 43 44 45 cout MATRIZTRANSPOSTA 46 for int iLin 0 iLin 5 iLin 47 48 for int iCol 0 iCol 3 iCol 49 cout matrizT iLin iCol 50 cout endl 51 52 105 CAPITULO 11 Registros Ate o presente momento so foi possıvel a manipulacao de dados simples armazenados em variaveis simples como int float bool char ou a manipulacao de conjuntos de elementos do mesmo tipo em vetores ou matrizes 111 Definicao de Registros Ja com registros tambem chamados de estruturas e possıvel agregar informacoes de tipos diferentes criandose um novo tipo de dado Um registro e portanto uma colecao de campos em que cada campo pode ser de um tipo diferente 112 Forma Geral de um Tipo de Dado Registro A forma geral para se criar um tipo de dado registro e apresentada a seguir struct tipoRegistro tipoCampo1 nomeCampo1 tipoCampo2 nomeCampo2 tipoCampon nomeCampon Como exemplo podese criar um tipo de dado para representar um produto que possui os campos de codigo e descricao struct Produto int cod char desc50 Assim foi criado o tipo registro Produto composto de campos dos tipos numerico cod e caracter desc 106 113 Declaracao de uma Variavel do Tipo de Dado Registro Mas como se declara uma variavel desse tipo E simples segue o mesmo raciocınio de uma declaracao qualquer tipoRegistro nomeVariavel Verifique as seguintes declaracoes Produto prod Criouse uma variavel simples chamada prod do tipo registro Produto Figura 111 Ilustracao de um produto com codigo e descricao Produto produtos10 Criouse um vetor de 10 produtos do tipo registro Produto Isso e o que se chama de vetor de registros Figura 112 Ilustracao de um vetor de registros de produtos Cada elemento do vetor possui os campos codigo e descricao 114 Acesso a Membros de um Registro Mas como se acessa os campos de um registro no exemplo como se acessa o codigo e a descricao do produto Se for uma variavel simples como prod devese escrever o nome da variavel seguido de um ponto e seguido do nome do campo prodcod acessase o codigo do produto Se for um vetor ou uma matriz de registros devese escrever o elemento do vetor ou matriz seguido de um ponto e seguido do nome do campo produtos3cod acessase o codigo do quarto produto 107 115 VetoresMatrizes como Membros de um Registro Vetores eou matrizes podem ser campos de tipos registro conforme a figura a seguir Figura 113 Ilustracao de um vetor de baixas do produto por dia da semana incluindo o sabado Supondo o seguinte tipo de registro e a variavel desse tipo responda struct Produto int cod char desc50 int baixas6 Produto p 1 Como se acessa a baixa do produto no segundo dia da semana Resposta pbaixas1 2 Como se acessa a descricao do produto Resposta pdesc Agora suponha que ao inves de um produto tenhase no maximo 50 Responda 1 Declare a variavel do tipo registro definido Resposta Produto p50 2 Como se acessa a baixa do primeiro produto no segundo dia da semana Resposta p0baixas1 3 Como se acessa a descricao do ultimo produto Resposta p49desc 116 Funcoes Passando um Registro Simples como Parˆametro O programa apresentado a seguir em Listing 111 cadastra e exibe os dados de um funcionario passando um registro simples como parˆametro nas duas funcoes cadastra e exibe Na funcao cadastra o parˆametro deve ser passado por referˆencia pois devera ocorrer atua lizacao dos membros do registro apos a sua chamada Ja na funcao exibe o parˆametro pode ser passado por valor pois nao ocorrera quaisquer modificacoes nos membros do registro Entretanto e importante frisar que no caso de registros que ocupam grande quantidade de memoria nao e aconselhavel utilizar a passagem de parˆametros por valor pois ocorrera copias de todos seus membros na memoria Observase que a criacao do novo tipo de dado Funcionario foi global ou seja e visıvel por qualquer funcao definida no programa 108 Listing 111 C Programa que manipula registro simples como parˆametro em funcao 1 include iostream 2 include cstdio 3 using namespace std 4 5 struct Funcionario 6 7 int codigo 8 char nome 3 0 9 float s a l a r i o 10 char sexo 11 12 13 void cadastra Funcionario f 14 void exibe Funcionario f 15 16 int main 17 18 Funcionario funcionario 19 20 cadastra funcionario 21 exibe funcionario 22 23 return 0 24 25 26 void cadastra Funcionario f 27 28 cout Entrecomocodigo 29 cin f codigo 30 cout Entrecomonome 31 f f l u s h stdin 32 gets f nome 33 cout Entrecomosalario 34 cin f s a l a r i o 35 cout Entrecomosexo 36 cin f sexo 37 38 39 void exibe Funcionario f 40 41 cout Codigo f codigo 42 cout Nome f nome 43 cout Salario f s a l a r i o 44 cout Sexo f sexo 45 109 117 Funcoes Passando um Vetor de Registro como Parˆametro A sintaxe para passar um vetor ou matriz de registros e semelhante quando se passa um vetor ou uma matriz de variaveis simples Na chamada a uma funcao devese escrever apenas o nome do vetor ou matriz No cabecalho de definicao da funcao declaramse normalmente os vetoresmatrizes de registros Verifique o programa apresentado em Listing 112 que cadastra e exibe informacoes de 10 funcionarios Listing 112 C Programa que manipula vetor de registro como parˆametro em funcao 1 include iostream 2 include cstdio 3 using namespace std 4 5 struct Funcionario 6 7 int codigo 8 char nome 3 0 9 float s a l a r i o 10 char sexo 11 12 13 void cadastra Funcionario f 14 void exibe Funcionario f 15 16 int main 17 18 Funcionario f u n c i on ar i os 1 0 19 20 cadastra f u n c i o n ar i os 21 exibe f u n c i o n ar i os 22 23 return 0 24 25 26 void cadastra Funcionario f 1 0 27 28 for int i 0 i 10 i 29 30 cout i1 oFUNCIONARIO 31 cout Entrecomocodigo 32 cin f i codigo 33 cout Entrecomonome 34 f f l u s h stdin 35 gets f i nome 36 cout Entrecomosalario 37 cin f i s a l a r i o 38 cout Entrecomosexo 39 cin f i sexo 40 41 110 42 void exibe Funcionario f 1 0 43 44 for int i 0 i 10 i 45 46 cout i1 oFUNCIONARIO 47 cout Codigo f i codigo 48 cout Nome f i nome 49 cout Salario f i s a l a r i o 50 cout Sexo f i sexo 51 52 118 Funcoes que Retornam um Registro Podese retornar um registro completo para outra funcao como pode ser observado na funcao novaV enda no exemplo apresentado em Listing 113 Listing 113 C Programa que possui uma funcao que retorna um registro 1 include iostream 2 using namespace std 3 4 struct Venda 5 int quantPecas 6 float preco 7 8 9 Venda novaVenda 10 11 Venda v 12 cout NovaVenda 13 cout Insiraonumerodepecas 14 cin v quantPecas 15 cout Insiraopreco 16 cin v preco 17 return v 18 19 20 void listaTotalVendas Venda v1 Venda v2 21 22 cout VendaTotal 23 cout Totaldepecas v1 quantPecas v2 quantPecas 24 cout PrecoTotal v1 preco v2 preco 25 26 27 int main 28 29 Venda venda1 venda2 30 venda1 novaVenda 31 venda2 novaVenda 111 32 listaTotalVendas venda1 venda2 33 return 0 34 119 Inicializacao de Variaveis do Tipo Registro E possıvel inicializar uma variavel do tipo registro de forma semelhante a uma matriz Os valores a serem atribuıdos a seus membros devem ser colocados na ordem em que foram definidos separados por vırgulas e entre chaves conforme apresentado em Listing 114 Listing 114 C Programa que mostra a inicializacao de variaveis do tipo registro 1 struct Data 2 int dia 3 int mes 4 int ano 5 6 Data natal 25 12 2011 7 Data a n i v e r s a r i o 12 8 2011 1110 Atribuicoes entre Registros Uma variavel do tipo registro pode ser atribuıda a outra variavel do mesmo tipo atraves de uma atribuicao simples Os valores de todos os membros de um registro sao atribuıdos aos membros de outro registro Segue um exemplo em Listing 115 Listing 115 C Programa que mostra a atribuicao entre registros 1 struct Data 2 int dia 3 int mes 4 int ano 5 6 7 Data anoNovo 1 1 2012 8 Data a n i v e r s a r i o C r i s anoNovo Assim os valores de aniversarioCrisdia aniversarioCrismes e aniversarioCrisano serao respectivamente 1 1 e 2012 1111 Registros Aninhados Podese definir tipos de dados registro cujos membros sao outros registros No exemplo a seguir apresentado em Listing 116 foi adicionado um membro do tipo Data chamado dtV enda ao tipo de dado V enda 112 A variavel v possui trˆes membros sendo que um deles e do tipo Data Portanto vdtVenda e o nome de uma variavel do tipo Data e para acessar seus membros devese aplicar o operador ponto Listing 116 C Programa que mostra o uso de registros aninhados 1 include iostream 2 include cstdio 3 using namespace std 4 5 struct Data 6 int dia 7 int mes 8 int ano 9 10 struct Venda 11 int quantPecas 12 float preco 13 Data dtVenda 14 15 int main 16 17 Venda v 15 13050 27 5 2011 18 19 cout Quantidadedepecas v quantPecas endl 20 Preco v preco endl 21 Datadavenda v dtVenda dia 22 cout v dtVenda mes v dtVenda ano 23 return 0 24 113 Referˆencias Bibliograficas A F G Ascencio and E A V de Campos Fundamentos da Programacao de Computadores Algoritmos Pascal e CC Prentice Hall 2002 Sao Paulo 1a edicao H M Deitel and P J Deitel C Como Programar Apresentando Projeto Orientado a Objeto com UML Bookman 2001 Porto Alegre 3a edicao A L V Forbellone and H F Eberspacher Logica de Programacao A Construcao de Algoritmos e Estrutura de Dados Pearson Prentice Hall 2005 Sao Paulo 3a edicao V V Mizrahi Treinamento em Linguagem C Modulos 1 e 2 Makron Books 1994 Sao Paulo 1a edicao D D Salvetti and L M Barbosa Algoritmos Makron Books 1998 Sao Paulo 1a edicao 114 APˆENDICE A Erros Comuns na Programacao Usando o Ambiente CodeBlocks A1 Erros Comuns na Compilacao Erros na compilacao tambem sao chamados de erros de sintaxe que ocorrem quando o compilador nao reconhece um comando 1 Digitar main incorretamente undefined reference to WinMain16 2 Nao salvar o arquivo com extensao cpp fatal error iostream No such file or directory 3 Esquecer de incluir a biblioteca iostream error cout was not declared in this scope error cin was not declared in this scope 4 Esquecer de incluir as bibliotecas correspondentes das funcoes error sqrt was not declared in this scope error pow was not declared in this scope error system was not declared in this scope 5 Digitar incorretamente um comando a intencao era digitar cout error cout was not declared in this scope 6 Trocar para letras maiusculas as palavraschave reservadas da linguagem tais como while if for e else que contˆem somente letras minusculas C e case sensitive ou seja sensıvel a letras maiusculas e minusculas error WHILE was not declared in this scope error If was not declared in this scope 7 Digitar incorretamente o nome de uma variavel por exemplo declarouse como num e utilizou se Num error Num was not declared in this scope 115 8 Digitar espaco em branco em nome de variavel por exemplo nome pessoa error expected initializer before pessoa 9 Comecar o nome de uma variavel com numero por exemplo 1num error invalid suffix nome on integer constant 10 Esquecer o pontoevırgula ao final de um comando acusase erro na linha posterior error expected before 11 Usar o operador modulo com operandos nao inteiros error invalid operands of types double and int to binary operator 12 Colocar espacos entre os dois sımbolos dos operadores e error expected primaryexpression before token 13 Inverter a ordem do par de sımbolos dos operadores e para e respectivamente error expected primaryexpression before 14 Colocar um pontoevırgula logo apos parˆentese da direita do comando if na estrutura con dicional ifelse como em 1 i f idade 18 2 cout Idadesuperiora18anos 3 else 4 cout Idadeate18anos que e o mesmo que 1 i f idade 18 2 3 cout Idadesuperiora18anos 4 else 5 cout Idadeate18anos O pontoevırgula faz com que o corpo da estrutura if seja considerado vazio Assim o proximo comando na sequˆencia e o cout fazendo com que o else esteja relacionado a ele e nao ao if emitindo a mensagem error else without a previous if 15 Usar vırgula no lugar de pontoevırgula no cabecalho do comando for como em for i0 i10 i error expected initializer before token 16 Colocar um pontoevırgula apos o parˆentese direito ao encerrar a lista de parˆametros de uma definicao de funcao como em Listing A1 Definicao de funcao INCORRETA 1 int calcula soma int num1 int num2 2 3 int soma 4 5 soma num1 num2 6 7 return soma 8 116 O correto e eliminar o pontoevırgula da linha 1 error expected unqualifiedid before token 17 Declarar parˆametros da funcao do mesmo tipo como float n1 n2 ao inves de float n1 float n2 error n2 has not been declared 18 Definir um parˆametro de funcao novamente como variavel local dentro da funcao como em 1 int calcula soma int num1 int num2 2 3 int num1 num2 INCORRETO 4 soma 5 6 soma num1 num2 7 8 return soma 9 emitira os seguintes erros error declaration of int num1 shadows a parameter error declaration of int num2 shadows a parameter 19 Esquecer o pontoevırgula ao final de uma declaracao de prototipo causa um erro de sintaxe expected initdeclarator before A2 Erros Comuns de Logica Os erros de logica nao sao indicados pelo compilador mas pelo resultado incorreto do pro grama Sao erros da estruturacao logica do pensamento 1 Dividir por zero no ambiente CodeBlocks causa erro durante a execucao do programa pro duzindo um erro fatal ou seja causa o termino imediato do programa sem este ter executado com sucesso seu trabalho Warning division by zero 2 Confundir o operador de atribuicao com o operador relacional de igualdade Seja o seguinte exemplo de erro muito comum if n1 n2 A intencao era comparar os valores das variaveis mas o que ocorre e uma atribuicao do valor de n2 para n1 3 Colocar um pontoevırgula logo apos parˆentese da direita do comando if como em 1 i f idade 18 2 cout Idadesuperiora18anos 3 getch O pontoevırgula faz com que o corpo da estrutura if seja considerado vazio Assim inde pendente da condicao ser verdadeira ou falsa o cout e executado pois e o proximo comando na sequˆencia 4 Colocar um pontoevırgula logo apos parˆentese da direita do cabecalho do comando while tornando o corpo do while vazio 117 5 Colocar um pontoevırgula logo apos parˆentese da direita do cabecalho do comando for tornando o corpo do for vazio 6 Nao inicializar contador ou acumulador pode resultar em erro 7 Embora 4 y 8 seja uma condicao matematicamente correta ela nao e avaliada cor retamente em C Use 4 y y 8 ou y 4 y 8 para obter a avaliacao apropriada 8 Acessar um elemento alem dos limites de um vetor e um erro de logica que ocorre durante a execucao Exemplo se foi declarado int vet10 entao nao existe o elemento vet10 118 APˆENDICE B Boas Praticas de Programacao 1 Comece seu programa com um comentario descrevendo os nomes dos programadores a data de implementacao e o seu proposito Exemplo Listing B1 somacpp 1 2 P r o g r a m a d o r a C l a u d i a A I z e k i 3 D a t a 7 1 2 2 0 0 5 4 D e s c r i c a o P r o g r a m a q u e c a l c u l a a s o m a d e d o i s n u m e r o s i n t e i r o s 5 p a s s a d o s p e l o u s u a r i o 6 7 includeiostream 8 using namespace std 9 10 int main 11 2 Escolha nomes de variaveis significativos pois torna o programa mais facil de ser entendido ao inves de ter que ler manuais ou usar comentarios em excesso 3 Evite usar variaveis com mesmo nome para propositos diferentes em um programa pois pode gerar confusao 4 Alguns programadores preferem declarar cada variavel em uma linha separada Este formato permite a facil insercao de comentario descritivo apos cada declaracao 5 Solicite explicitamente ao usuario cada entrada pelo teclado O lembrete deve indicar a forma da entrada e quaisquer valores de entrada especiais que devam ser fornecidos como por exemplo o valor que o usuario deve digitar para terminar um laco Exemplo cout Entrecomumaidadedigite1parasair cin idade 6 Coloque espacos dos dois lados de um operador binario Isso faz com que o operador se desta que tornando o programa mais legıvel Exemplo escreva num 8 ao inves de num8 119 7 Coloque uma linha em branco para separar instrucoes com objetivos diferentes tornando os programas mais legıveis 8 Insira um espaco apos cada vırgula para tornar os programas mais legıveis 9 Consulte a precedˆencia de operadores quando escrever expressoes contendo muitos operadores Confirme que os operadores na expressao sao executados na ordem que se espera Caso nao tenha certeza da ordem de execucao de uma expressao complexa separea em comandos menores ou use parˆenteses para forcar a ordem 10 Indente 1 em um nıvel o corpo inteiro de cada funcao Isso faz com que a estrutura funcional de um programa se destaque e ajuda a tornar os programas mais faceis de ler Compare os dois exemplos Listing B2 Programa sem indentacao na funcao main INCORRETO 1 include iostream c i n e c o u t 2 include cstdlib s y s t e m 3 using namespace std 4 5 int calcula soma int num1 int num2 6 7 int soma 8 9 soma num1 num2 10 11 return soma 12 13 14 int main 15 16 int num1 num2 soma 17 18 cout Somadedoisnumeros 19 20 cout Entrecomoprimeironumero 21 cin num1 22 23 cout Entrecomosegundonumero 24 cin num2 25 26 soma calcula soma num1 num2 27 28 cout Asomae 29 cout soma 30 31 system pause 32 33 return 0 34 1Indentacao e um espacamento fundamentalmente utilizado por programadores para destacar os conteudos de funcoes e de estruturas condicionais e de repeticao tornando os programas mais faceis de ler pelo programador 120 Listing B3 Programa com indentacao na funcao main CORRETO 1 include iostream c i n e c o u t 2 include cstdlib s y s t e m 3 using namespace std 4 5 int calcula soma int num1 int num2 6 7 int soma 8 9 soma num1 num2 10 11 return soma 12 13 14 int main 15 16 int num1 num2 soma 17 18 cout Somadedoisnumeros 19 20 cout Entrecomoprimeironumero 21 cin num1 22 23 cout Entrecomosegundonumero 24 cin num2 25 26 soma calcula soma num1 num2 27 28 cout Asomae 29 cout soma 30 31 system pause 32 33 return 0 34 11 Estabeleca um padrao nos tamanhos da indentacao Se teclar espacos em branco para a indentacao useos sempre sendo preferıvel 3 espacos Caso use a tabulacao tecla Tab verifique se o ambiente esta configurado para o mesmo tamanho de tabulacao Menu Settings Editor General Settings TAB size in spaces sendo 3 o preferıvel 12 Indente em um nıvel o corpo de uma estrutura if para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos 121 Listing B4 Corpo de uma estrutura if sem indentacao INCORRETO 1 i f op 1 2 3 cout Calculodenovosalario 4 cout Entrecomseusalario 5 cin s a l 6 7 novo sal s a l 1 4 5 8 9 cout Seunovosalarioe novo sal 10 11 else i f op 2 12 13 cout Calculodeimpostosobreosalario 14 cout Entrecomseusalario 15 cin s a l 16 17 imp s a l 0 0 2 18 19 cout Oimpostoede imp 20 21 else 22 cout Opcaoinvalida Listing B5 Corpo de uma estrutura if com indentacao CORRETO 1 i f op 1 2 3 cout Calculodenovosalario 4 cout Entrecomseusalario 5 cin s a l 6 7 novo sal s a l 1 4 5 8 9 cout Seunovosalarioe novo sal 10 11 else i f op 2 12 13 cout Calculodeimpostosobreosalario 14 cout Entrecomseusalario 15 cin s a l 16 17 imp s a l 0 0 2 18 19 cout Oimpostoede imp 20 21 else 22 cout Opcaoinvalida 13 Indente em um nıvel o corpo de uma estrutura while para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos 122 Listing B6 Corpo de uma estrutura while sem indentacao INCORRETO 1 i 0 2 while i 10 3 4 res num i 5 cout num x i res 6 i 7 Listing B7 Corpo de uma estrutura while com indentacao CORRETO 1 i 0 2 while i 10 3 4 res num i 5 cout num x i res 6 i 7 14 Indente em um nıvel o corpo de uma estrutura for para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos Listing B8 Corpo de uma estrutura for sem indentacao INCORRETO 1 for i 0 i 10 i 2 3 res num i 4 cout num x i res 5 Listing B9 Corpo de uma estrutura for com indentacao CORRETO 1 for i 0 i 10 i 2 3 res num i 4 cout num x i res 5 15 Indente em um nıvel o corpo de uma estrutura dowhile para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos Listing B10 Corpo de uma estrutura dowhile sem indentacao INCORRETO do cout Menudeopcoes cout 1Calculodesoma cout 2Calculodesubtracao cout 3Sair cin op while op 3 123 Listing B11 Corpo de uma estrutura dowhile com indentacao CORRETO 1 do 2 cout Menudeopcoes 3 cout 1Calculodesoma 4 cout 2Calculodesubtracao 5 cout 3Sair 6 cin op 7 8 9 while op 3 16 Mantenha a indentacao mesmo em estruturas que compoem outras Por exemplo no corpo de uma funcao main existe um laco dowhile sendo que no corpo deste existem estruturas encadeadas if else Compare os exemplos Listing B12 Programa sem indentacao INCORRETO 1 int main 2 3 int op soma dif n1 n2 4 5 do 6 cout Menudeopcoes 7 cout 1Calculodesoma 8 cout 2Calculodesubtracao 9 cout 3Sair 10 cin op 11 12 i f op 1 13 14 cout Somadedoisnumeros 15 cout Entrecomdoisnumerosinteiros 16 cin n1 n2 17 soma n1 n2 18 cout Asomae soma 19 20 else i f op 2 21 22 cout Subtracaodedoisnumeros 23 cout Entrecomdoisnumerosinteiros 24 cin n1 n2 25 d i f n1 n2 26 cout Adiferencae d i f 27 28 else 29 cout Opcaoinvalida 30 while op 3 31 32 system pause 33 34 return 0 35 124 Listing B13 Programa com indentacao CORRETO 1 int main 2 3 int op soma dif n1 n2 4 5 do 6 cout Menudeopcoes 7 cout 1Calculodesoma 8 cout 2Calculodesubtracao 9 cout 3Sair 10 cin op 11 12 i f op 1 13 14 cout Somadedoisnumeros 15 cout Entrecomdoisnumerosinteiros 16 cin n1 n2 17 soma n1 n2 18 cout Asomae soma 19 20 else i f op 2 21 22 cout Subtracaodedoisnumeros 23 cout Entrecomdoisnumerosinteiros 24 cin n1 n2 25 d i f n1 n2 26 cout Adiferencae d i f 27 28 else 29 cout Opcaoinvalida 30 while op 3 31 32 system pause 33 34 return 0 35 17 Alguns programadores usam letras maiusculas nos nomes de constantes para se destacarem no programa e nao serem confundidos com variaveis Exemplo const int MAX ALUNOS 100 ao inves de const int max alunos 100 18 Escolha nomes significativos para funcoes e parˆametros tornando o programa mais legıvel e evitando o uso excessivo de comentarios 19 Sempre inclua prototipos de funcoes ainda que seja possıvel omitilos quando as funcoes sao definidas antes que sejam usadas 20 Antes de compilar verifique se os prototipos as chamadas e as definicoes de funcoes estao em acordo quanto aos nomes das funcoes os tipos e sequˆencias dos parˆametros bem como seus tipos de retornos se houver 125 21 E aconselhavel definir o tamanho do vetor como uma constante com const ao inves de cons tante numero ou seja const int TAM 10 int vetTAM ao inves de int vet10 126 APˆENDICE C Revisao de Conceitos Matematicos Muito Utilizados 1 Adicao combina dois numeros termos somandos ou parcelas em um unico numero a soma 2 Subtracao indica quanto e um valor numerico minuendo se dele for removido outro valor numerico subtraendo a b c a e o minuendo b e o subtraendo c e a diferenca 3 Divisao e a operacao matematica que determina a quantidade de vezes que um numero divisor esta contido dentro de outro numero dividendo ab q a e o dividendo b e o divisor q e o quociente r e o resto O divisor nao pode ser zero pois qual numero multiplicado por zero e igual ao dividendo 4 Multiplicacao e uma forma simples de se adicionar uma quantidade finita de numeros iguais O resultado da multiplicacao de dois numeros e chamado produto Esses numeros sao chamados de multiplicando e multiplicador 5 Prioridades das operacoes a multiplicacao e a divisao possuem prioridade sobre a adicao e a subtracao Entretanto devese realizar primeiramente a operacao que estiver dentro de parˆenteses colchetes ou chaves 6 Media aritmetica simples e a soma dos elementos dividida pela quantidade deles Exem plo calcular a media aritmetica MA de quatro notas bimestrais N1 N2 N3 e N4 Solucao MA N1 N2 N3 N44 7 Media aritmetica ponderada primeiro multiplicase cada peso com seu elemento Fazse a soma dos produtos dividindoa pela soma dos pesos Exemplo Calcular a media ponderada MP de 2 notas em que a primeira possui peso 3 e a segunda peso 2 Solucao MP 3 N1 2 N25 8 Regra de 3 e um processo de resolucao de problemas de quatro valores sendo que trˆes sao conhecidos e devese determinar o quarto valor Para resolvˆelo devese montar uma tabela e 127 resolver a equacao Exemplo um atleta percorre 30 km em 3h Em quanto tempo percorrera 50km mantendo o mesmo ritmo Solucao montase uma tabela Percurso km Tempo h 30 3 50 x Assim temos 30 50 3 x C1 30x 150 C2 x 5 C3 Portanto o atleta percorrera 50 km em 5h Outro exemplo um produto de valor RP sofrera aumento de X Calcule o valor em reais do aumento A e o novo valor NP em reais do produto Solucao Valor R Porcentagem P 100 A X Assim temos P A 100 X C4 100A PX C5 A PX 100 C6 Portanto o aumento e calculado pela equacao C6 E o novo preco e NP P A 9 Divisibilidade um numero inteiro A e divisıvel por um inteiro nao nulo B se e somente se existir k inteiro tal que A kB ou seja se o resto da divisao de A por B for zero 10 Numero par e todo numero inteiro que ao ser dividido pelo numero dois resulta em um numero inteiro ou seja o resto e zero 11 Numero ımpar e todo numero inteiro que ao ser dividido pelo numero dois resulta em um numero racional nao inteiro 12 Numeros inteiros sao somente constituıdos dos numeros naturais 0 1 2 e dos seus opostos 1 2 3 Dois numeros sao opostos se e somente se sua soma e zero 128 13 Numeros naturais e um inteiro naonegativo 0 1 2 3 14 Numero racional e todo numero que pode ser representado por uma razao ou fracao entre dois numeros inteiros 129

Envie sua pergunta para a IA e receba a resposta na hora

Recomendado para você

Lógica de Programação - Trabalho N2 - Cálculo de Salário e Verificação de Números

3

Lógica de Programação - Trabalho N2 - Cálculo de Salário e Verificação de Números

Introdução à Lógica e Programação

UNIFEI

Função de Salvamento de Lista de Compras em CSV

1

Função de Salvamento de Lista de Compras em CSV

Introdução à Lógica e Programação

UNIFEI

Código para Gerenciamento de Listas de Compras

1

Código para Gerenciamento de Listas de Compras

Introdução à Lógica e Programação

UNIFEI

Gerenciador de Lista de Compras via Linha de Comando - Interface e Funcoes

1

Gerenciador de Lista de Compras via Linha de Comando - Interface e Funcoes

Introdução à Lógica e Programação

UNIFEI

Listagem de Itens com Descrição e Quantidade

1

Listagem de Itens com Descrição e Quantidade

Introdução à Lógica e Programação

UNIFEI

Prova Pratica 1 Fundamentos Logica Programacao UNIFEI Itabira

2

Prova Pratica 1 Fundamentos Logica Programacao UNIFEI Itabira

Introdução à Lógica e Programação

UNIFEI

Funções para Gerenciamento de Lista de Compras

1

Funções para Gerenciamento de Lista de Compras

Introdução à Lógica e Programação

UNIFEI

Código do Aplicativo CompraFácil

1

Código do Aplicativo CompraFácil

Introdução à Lógica e Programação

UNIFEI

Leitura de Listas de Compras em CSV com Python

1

Leitura de Listas de Compras em CSV com Python

Introdução à Lógica e Programação

UNIFEI

Tutorial CodeBlocks - Compilação de Classes C++

3

Tutorial CodeBlocks - Compilação de Classes C++

Introdução à Lógica e Programação

UNIFEI

Texto de pré-visualização

Aprendendo Logica de Programacao com a Linguagem C Prof Claudia Akemi Izeki UNIFEI Campus Itabira 27 de Marco de 2022 Sumario 1 Introducao a Linguagem C 1 11 Logica de Programacao 1 12 Algoritmo e Programa 1 13 Linguagem de Programacao e Compilador 3 14 Ambiente de Programacao CodeBlocks 4 141 Criando um Arquivo CC 4 142 Criando um Projeto 6 15 Estrutura Basica de um Programa em C usando o CodeBlocks 6 16 Primeiro Programa 8 17 Instrucoes de Programa 8 18 Comandos Iniciais 9 181 cout Comando de SaıdaEscrita 9 182 cin Comando de EntradaLeitura 9 183 systempause 0 10 184 Caracter que imita a tecla ENTER 10 19 Uso de Comentarios 10 110 Teste de Mesa 11 2 Variaveis e Tipos de Dados 13 21 Declaracao de Variaveis 13 22 Regras para Nomes de Variaveis 13 23 Tipos de Dados de Variaveis ou simplesmente Tipos de Dados 14 24 Exemplo 15 241 Analise e Implementacao 15 i 242 Verificacao do Programa 17 25 Declaracao de Valores Constantes 17 3 Operadores 19 31 Operador de Atribuicao 19 32 Operadores Aritmeticos 19 321 Precedˆencia de Operadores Aritmeticos 20 33 Operadores de Incremento e de Decremento 21 34 Operadores Aritmeticos de Atribuicao 22 35 Operadores Relacionais 23 351 Precedˆencia dos operadores aritmeticos juntamente com os relacionais 24 36 Operadores Logicos 25 361 E Logico 26 362 OU Logico 27 363 N AO Logico 28 364 Mais Exemplos de E e OU Logicos 29 365 Precedˆencia dos Operadores Logicos 30 37 Precedˆencia entre os Operadores Aritmeticos Relacionais e Logicos 31 4 Estruturas Condicionais 33 41 Estrutura Condicional Simples if 34 42 Estrutura Condicional Composta if else 36 43 Encadeamento de Estruturas Condicionais Compostas 39 44 Estruturas Condicionais Aninhadas 43 45 Alternativa de Estrutura Condicional Composta switch 44 5 Funcoes 52 51 Escopo de Variaveis 54 52 Prototipo de Funcao 55 53 Chamada de Funcao 55 54 Definicao de Funcao 56 55 Retorno de Funcao 56 ii 56 Funcoes com Passagem de Parˆametro 59 561 Passagem de Parˆametro por Valor 59 562 Passagem de Parˆametro por Referˆencia 59 6 Estruturas Condicionais com Funcoes 62 61 Pseudocodigo 62 62 Variaveis 63 63 Entrada de Dados 63 64 Validade das Datas 64 65 Verificacao da Maior Data 65 66 Juntando Tudo 67 7 Estruturas de Repeticao 70 71 O Laco do while 72 711 Exemplo Usando o Laco do while 72 712 Outro Exemplo Usando o Laco do while 75 72 O Laco while 75 721 Exemplo Usando o Laco while 76 722 Outro Exemplo Usando o Laco while 78 73 O Laco for 80 731 Exemplo Usando o Laco for 81 732 Outro Exemplo Usando o Laco for 82 74 Estruturas de Repeticao com Funcoes 84 741 O Problema 84 742 O Pseudocodigo 84 743 O Programa 85 8 Vetores 89 81 Definicao de Vetor 90 82 Declaracao de Vetor 91 83 Acesso a um Elemento do Vetor 91 84 Um Exemplo de Programa Utilizando um Vetor 91 85 Funcoes Passando Vetor como Parˆametro 93 iii 9 Strings 96 91 Definicao de String 96 92 Declaracao de String 96 93 Alguns ComandosFuncoes com Strings 97 94 Um Exemplo Utilizando String 97 95 Outro Exemplo utilizando String 99 96 Strings como Parˆametros em Funcoes 100 10 Matrizes 101 101 Definicao de Matriz 101 102 Declaracao de Matriz 101 103 Acesso a Elemento de Matriz 101 104 Um Exemplo Utilizando Matriz 102 105 Funcoes Passando Matriz como Parˆametro 104 11 Registros 106 111 Definicao de Registros 106 112 Forma Geral de um Tipo de Dado Registro 106 113 Declaracao de uma Variavel do Tipo de Dado Registro 107 114 Acesso a Membros de um Registro 107 115 VetoresMatrizes como Membros de um Registro 108 116 Funcoes Passando um Registro Simples como Parˆametro 108 117 Funcoes Passando um Vetor de Registro como Parˆametro 110 118 Funcoes que Retornam um Registro 111 119 Inicializacao de Variaveis do Tipo Registro 112 1110Atribuicoes entre Registros 112 1111Registros Aninhados 112 Referˆencias Bibliograficas 114 A Erros Comuns na Programacao Usando o Ambiente CodeBlocks 115 A1 Erros Comuns na Compilacao 115 A2 Erros Comuns de Logica 117 iv B Boas Praticas de Programacao 119 C Revisao de Conceitos Matematicos Muito Utilizados 127 v Lista de Exemplos 21 C Declaracao de uma variavel do tipo inteiro 13 22 C Declaracao de mais de uma variavel do tipo inteiro 13 31 C Um caso de uso do operador maior ou igual que 23 32 C Precedˆencia do operador aritmetico sobre o relacional 24 33 C Um caso de uso do operador logico E 26 34 C Outro caso de uso do operador logico E 27 35 C Um caso de uso do operador logico OU 28 36 C Outro caso de uso do operador logico OU 28 37 C Um caso de uso do operador logico NAO 29 38 C Um exemplo do emprego da precedˆencia dos operadores logicos 30 39 C Um exemplo analogo ao anterior Exemplo 38 mas com o uso INCORRETO dos operadores logicos 31 310 C Um caso de uso da precedˆencia de operadores aritmeticos relacionais e logicos 32 41 C Trecho de codigo que utiliza a condicional simples sem chaves 34 42 C Trecho de codigo que utiliza a condicional simples com chaves 35 43 C Trecho de codigo que utiliza sequencialmente varias condicionais simples sem chaves 35 44 C Programa que faz a divisao de dois numeros inteiros passados pelo usuario 38 45 C Programa que representa uma calculadora de 4 operacoes matematicas 41 46 C Programa correspondente ao anterior Exemplo 45 mas perceba que nao foram inseridas algumas chaves pois uma estrutura if else e considerada como um unico comando 46 47 C Programa correspondente ao anterior Exemplo 46 mas perceba que a palavrachave if a partir do segundo if foi colocada na mesma linha do else colocandose o par de chaves e do corpo do else na mesma linha imaginaria vertical do i do primeiro if 47 48 C Programa que dada uma media de 00 a 100 verifica seu conceito A 8 0 10 0 B 7 0 8 0 C 6 0 7 0 D 5 0 6 0 e E 0 0 5 0 48 49 C Programa que coloca 3 valores inteiros em ordem crescente 49 410 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch 50 411 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch com alguns casos sem break 51 51 C Programa que chama varias funcoes matematicas definidas na biblioteca cmath 53 81 C Exemplo de vetor de numeros reais com cinco posicoes 91 82 C Alguns acessos de elementos do vetor notas 91 101 C Alguns acessos de elementos da matriz mat 102 vi Lista de Tabelas 11 Teste de mesa do primeiro programa comentado apresentado em Listing 16 Su ponha que os valores entrados pelo usuario para as variaveis num1 e num2 sejam respectivamente 12 e 7 12 21 Alguns tipos de dados em C 15 22 Teste de mesa do programa apresentado em Listing 21 Suponha que o usuario tenha entrado com o valor 553 para o preco de produto 17 31 C Operadores aritmeticos 19 32 C Precedˆencia dos operadores aritmeticos 20 33 C Exemplos de operadores aritmeticos de atribuicao 23 34 C Operadores relacionais op1 e op2 sao operandos 23 35 Tabelaverdade do E logico 26 36 Tabelaverdade do OU logico 27 37 Tabelaverdade do NAO logico 29 38 C Precedˆencia entre os operadores logicos 30 39 C Precedˆencia entre os operadores aritmeticos relacionais e logicos 32 41 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 0 38 42 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 4 39 43 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a 42 44 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a 42 51 Teste de mesa para o programa apresentado em Listing 51 com tam igual a 1 para facilitar o teste de mesa 55 52 Teste de mesa com valores 15 e 67 para as variaveis n1 e n2 para o programa de Listing 52 58 53 Teste de mesa com valores 9 e 7 para as variaveis a e b 61 71 Teste de mesa para o programa de area de triˆangulos 74 72 Teste de mesa para o programa da tabuada do 4 que utiliza while 77 73 Tabela de iteracoes correspondente ao programa da tabuada do 4 apresentado em Listing 77 78 74 Teste de mesa do programa apresentado em Listing 78 com uma unica entrada zero 79 75 Teste de mesa do programa apresentado em Listing 78 com as entradas 12 20 18 e 0 80 76 Tabela de iteracoes correspondente ao programa de Listing 78 com o teste corres pondente ao da Tabela 75 80 77 Teste de mesa para o programa da tabuada do 4 utilizando o laco for 82 78 Tabela de iteracoes correspondente ao programa da media de 10 idades apresentado em Listing 713 83 vii 81 Teste de mesa para o programa de media de notas de cinco alunos usando um vetor Suponha que os valores a serem inseridos no vetor sao na ordem 65 40 90 60 e 85 92 91 Vetor mes apos a leitura da string Abril 98 92 Vetor abrev antes da abreviacao 98 93 Vetor abrev apos a abreviacao 98 94 Vetor cid1 apos a entrada da string Araraquara 100 95 Vetor cid2 apos a entrada da string Boa Vista 100 96 Vetor cid2 apos as substituicoes 100 viii Listings 11 Pseudocodigo correspondente ao fluxograma da Figura 11 3 12 C Programa correspondente ao Pseudocodigo de Listing 11 3 13 C Programa cujo objetivo e imprimir Hello World na tela 5 14 Estrutura basica de um programa em C usando o CodeBlocks 7 15 C Primeiro programa somacpp 8 16 C Programa da soma comentado 10 21 C Resolucao do problema de reajuste de preco de um produto 16 22 C Exemplo de declaracao e uso de constante para representar o valor de pi 18 41 C Forma geral da estrutura condicional simples sem chaves 34 42 C Forma geral da estrutura condicional simples com chaves 35 43 C Forma geral da estrutura condicional composta sem chaves 37 44 C Forma geral da estrutura condicional composta com chaves 37 45 C Forma geral da estrutura condicional switch 44 51 C Programa que apresenta prototipo chamada a funcao desenha linha e sua definicao de funcao Apresenta tambem variaveis locais e globais 54 52 C Programa que possui a definicao da funcao verifica maior que retorna o maior de dois numeros inteiros 57 53 Programa que mostra o uso de passagem de parˆametro por referˆencia 60 61 C Declaracao de variaveis que representam as datas 63 62 C Funcao que realiza a entrada de uma data dia mes e ano com parˆametros passados por referˆencia 63 63 C Chamada a funcao entradaData 63 64 C Funcao validaData 65 65 C Funcao verificaMaiorData 66 66 C Programa que verifica qual data de duas e a maior Tambem valida as datas 67 ix 71 C Forma geral do laco do while 72 72 C Programa que calcula a area de um triˆangulo 72 73 C Programa que calcula a area de um triˆangulo enquanto o usuario desejar 73 74 C Programa que repete um menu de opcoes ate que o usuario digite 0 para sair 75 75 C Forma geral do laco while com apenas uma unica instrucao no corpo do laco 76 76 C Forma geral do laco while com mais de uma instrucao no corpo do laco Verifique o uso obrigatorio das chaves 76 77 C Programa da tabuada do 4 utilizando o laco while 76 78 C Programa que calcula a media de idades de uma quantidade nao determinada de pessoas 78 79 C Forma geral do laco for com apenas uma unica instrucao no corpo do laco 80 710 C Forma geral do laco for com mais de uma instrucao no corpo do laco 81 711 C Resolucao da tabuada do 4 usando o laco for 81 712 C Como o laco while pode substituir o laco for 82 713 C Programa que calcula a media de idades de 10 pessoas utilizando o laco for 83 714 C 85 81 C Programa que calcula a media de notas de cinco alunos utilizandose uma variavel para cada nota 89 82 C Programa que calcula a media de notas de cinco alunos utilizandose apenas uma variavel para armazenar a nota de todos os alunos uma por vez 90 83 C Programa que calcula a media de cinco alunos utilizando um vetor 92 84 C Programa modularizado com funcoes 94 91 C Programa em que o desenvolvedor monta uma string caracter a caracter 97 92 C Programa que ilustra a manipulacao de algumas funcoes da biblioteca cstring 99 101 C Programa que manipula matriz numerica 103 102 C Programa modularizado com matrizes 104 111 C Programa que manipula registro simples como parˆametro em funcao 109 112 C Programa que manipula vetor de registro como parˆametro em funcao 110 113 C Programa que possui uma funcao que retorna um registro 111 114 C Programa que mostra a inicializacao de variaveis do tipo registro 112 115 C Programa que mostra a atribuicao entre registros 112 116 C Programa que mostra o uso de registros aninhados 113 x A1 Definicao de funcao INCORRETA 116 B1 somacpp 119 B2 Programa sem indentacao na funcao main INCORRETO 120 B3 Programa com indentacao na funcao main CORRETO 121 B4 Corpo de uma estrutura if sem indentacao INCORRETO 122 B5 Corpo de uma estrutura if com indentacao CORRETO 122 B6 Corpo de uma estrutura while sem indentacao INCORRETO 123 B7 Corpo de uma estrutura while com indentacao CORRETO 123 B8 Corpo de uma estrutura for sem indentacao INCORRETO 123 B9 Corpo de uma estrutura for com indentacao CORRETO 123 B10 Corpo de uma estrutura dowhile sem indentacao INCORRETO 123 B11 Corpo de uma estrutura dowhile com indentacao CORRETO 124 B12 Programa sem indentacao INCORRETO 124 B13 Programa com indentacao CORRETO 125 xi Licenca e uso da obra Este material tratase de uma obra derivada de varias outras obras existentes a respeito da area de Logica e Linguagem de Programacao O mesmo e utilizado em disciplinas ministradas pela autora Este material foi produzido usando o formatador de textos LATEXversao MikTEX2a no sistema opera cional Microsoft Windows com o editor TEXnicCenterb O autor disponibiliza a obra no formato PDF e os arquivosfonte compactados em um arquivo ZIP Qualquer mudanca ou uso deste material deve ser informado ao autor pelo email cizekihotmailcom aO compilador MikTEXpode ser obtido no endereco httpwwwmiktexorg bO editor de texto LATEXTEXnicCenter pode ser obtido no endereco httpwwwtoolscenterorg xii CAPITULO 1 Introducao a Linguagem C 11 Logica de Programacao Podese pensar em logica como a arte de bem pensar ou a ordem correta do pensamento No diaadia utilizase logica para organizar os pensamentos como 1 A gaveta esta fechada O grampeador esta dentro da gaveta Assim devese abrir a gaveta para pegar o grampeador ou ainda 2 Luciane e mais velha que Claudia Claudia e mais velha que Marcos Portanto Luciane e mais velha que Marcos Ja a logica na programacao envolve o uso correto do raciocınio objetivando o desenvolvimento de tecnicas que cooperem para a producao de solucoes logicamente validas e coerentes resolvendo com qualidade os problemas que se deseja programar Da mesma forma que um mesmo raciocınio pode ser representado em diversos idiomas a logica de programacao independe da linguagem utilizada sendo portanto empregado o uso de algoritmos 12 Algoritmo e Programa Para resolver um problema computacional utilizase algoritmo que e uma sequˆencia finita de passos para atingir um objetivo bem definido No diaadia algoritmos sao utilizados constante mente em situacoes como trocar pneu de um carro fazer uma omelete buscar as criancas na escola etc 1 Na elaboracao de um algoritmo devem ser especificados passos claros e precisos que partindo de um estado inicial apos um perıodo de tempo finito produzem um estado final previsıvel e bem definido A descricao de um algoritmo pode ser realizada atraves de pseudocodigo linguagem seme lhante a natural com algumas regras comuns as linguagens de programacao ou de fluxogramas representados por desenhos A implementacao de um algoritmo e chamado de programa ou seja a codificacao de um algoritmo em alguma linguagem de programacao Segundo Ascencio Campos 2007 as etapas para o desenvolvimento de um programa sao 1 Analise estudase o enunciado do problema para definir os dados de entrada o processamento e os dados da saıda 2 Algoritmo para descrever o algoritmo podese utilizar descricao narrativa fluxograma ou pseudocodigo 3 Codificacao o algoritmo e transformado em codigos da linguagem de programacao escolhida para trabalhar que no nosso caso e a linguagem C Nao menos importante esta a etapa de Testes na qual e verificada a corretude do programa ou seja comparase a resposta obtida com a resposta esperada Seja o seguinte problema pedir ao usuario sua idade e verificar se ele e maior ou menor de idade O fluxograma o pseudocodigo e o programa correspondentes a solucao desse problema sao apresentados na Figura 11 Listing 11 e Listing 12 respectivamente Nao se preocupe se nao entender essas partes detalhadamente E necessario que vocˆe apenas verifique a forma de cada uma delas Figura 11 Representacao em fluxograma da solucao do problema de verificar se uma pessoa e maior ou menor de idade 2 Listing 11 Pseudocodigo correspondente ao fluxograma da Figura 11 1 INICIO 2 VARIAVEIS idade 3 4 idade entrada de dados TECLADO 5 se idade 18 entao 6 imprimir MONITOR Maiordeidade 7 caso contrario 8 imprimir MONITOR Menordeidade 9 FIM Listing 12 C Programa correspondente ao Pseudocodigo de Listing 11 1 include iostream 2 include cstdlib 3 using namespace std 4 5 int main 6 7 int idade 8 9 cout Entrecomsuaidade 10 cin idade 11 12 i f idade 18 13 cout Maiordeidade 14 else 15 cout Menordeidade 16 17 system pause 18 19 return 0 20 13 Linguagem de Programacao e Compilador Da mesma forma que nos seres humanos precisamos de uma linguagem para nos comunicar uma linguagem de programacao serve de comunicacao entre o indivıduo que deseja resolver um determinado problema e o computador escolhido para ajudalo na solucao Entretanto o computador entende apenas a linguagem de maquina dita de mais baixo nıvel que consiste de sequˆencias de zeros e uns Assim programar em uma linguagem de mais baixo nıvel e mais difıcil e trabalhoso para o programador Atualmente as linguagens de programacao mais utilizadas sao aquelas ditas de alto nıvel consideradas mais proximas da linguagem humana sendo portanto mais faceis que linguagens de baixo nıvel C e um exemplo de linguagem de alto nıvel Todavia linguagem de alto nıvel nao e a linguagem que o computador entende Assim o programador deve usar um compilador para converter o programa feito em linguagem de alto nıvel 3 para codigo em linguagem de maquina Caso existam erros de sintaxe no programa a conversao nao e realizada 14 Ambiente de Programacao CodeBlocks CodeBlocks e um ambiente de desenvolvimento integrado IDE Integrated Development En vironment gratis para a linguagem CC Com ele podese editar um programa compilalo e executalo Um programa e uma sequˆencia de instrucoes codificadas em uma linguagem de programacao que para ser executado precisa estar armazenado na memoria do computador O CodeBlocks e multiplataforma operacional ou seja a mesma versao funciona em sistemas operacionais Linux Mac e Windows Consequentemente todos os projetos criados no CodeBlocks funcionam em diferentes sistemas operacionais Visite o site do CodeBlocks httpwwwcodeblocksorgdownloads e baixe a versao binaria binary release para seu sistema operacional preferido Recomendase baixar a versao que vem com o compilador Por exemplo para Windows na versao 2003 do Codeblocks recomenda se baixar o arquivo codeblocks2003mingwsetupexe O CodeBlocks permite duas formas de criar programas em CC 1 Criando um arquivo CC 2 Criando um projeto 141 Criando um Arquivo CC A primeira e a forma mais simples de comecar a programar em linguagem CC Para criar um programa inicial realize os seguintes passos 1 Clique na opcao do menu File escolha New depois selecione File 2 Na janela aberta escolha o ıcone CC Source 3 Clique no botao Next 4 Na janela aberta escolha a opcao C e clique no botao Next 5 Depois clique no botao trˆes pontinhos para selecionar a pasta onde sera criado o arquivo 6 Escolhida a pasta dˆe um nome ao arquivo Por exemplo olamundocpp 7 Clique no botao Salvar 8 Clique no botao Finish 9 Para testar o seu arquivo digite o codigo de Listing 13 pag 5 sem copiar a numeracao Dica e melhor digitar o codigo em vez de utilizar CTRLC CTRLV Compile e execute seu programa indo no menu Build Build and Run ou simplesmente acionando a tecla F9 Se houver erros na compilacao serao apresentadas a linha e a descricao do possıvel 4 erro conforme mostrado na Figura 12 pag 5 Caso a janela de erros nao esteja visıvel va em View Logs Caso nao haja erros na compilacao o compilador gerara um arquivo executavel e o programa sera executado automaticamente conforme Figura 13 pag 5 Listing 13 C Programa cujo objetivo e imprimir Hello World na tela 1 include iostream 2 using namespace std 3 4 int main 5 6 cout HelloWorld endl 7 return 0 8 Figura 12 Apresentacao de erros na aba Build messages Verifique que ha indicacao do numero da linha do erro e sua mensagem a fim de que possa corrigilo Neste caso faltou pontoevırgula ao final da linha 6 Fonte captura de tela Figura 13 Tela de execucao do programa hellocpp Fonte captura de tela 5 142 Criando um Projeto Um projeto no CodeBlocks consiste em criar uma pasta contendo um ou mais arquivos escritos na linguagem CC E uma boa pratica de programacao para organizar seus programas Para criar um novo projeto siga os passos 1 Clique na opcao do menu File escolha New depois selecione Project 2 Escolha o tipo do projeto Console Application e clique em Go 3 Clique em Next 4 Escolha a opcao C e clique no botao Next 5 Digite o tıtulo do projeto exemplo Hello e escolha a pasta folder onde sera criado o projeto Clique em Next 6 Selecione o compilador GNU GCC Compiler geralmente ja estara selecionado e clique em Finish 7 Pronto Seu projeto foi criado com um arquivo chamado maincpp Na aba Projects da janela Management estara o seu projeto Clique no ıcone correspondente a pasta denominada Sources e clique duplamente no arquivo maincpp que tera um conteudo semelhante ao codigo CC da Figura 14 a seguir Para compilar e executar seu projeto tecle F9 Caso haja erros na compilacao serao apresentadas mensagens na janela Build messages como na Figura 12 apresentada anteriormente Caso a janela de erros nao esteja visıvel va em View Logs Caso nao tenha ocorrido erros sera apresentada uma janela como na Figura 13 tambem apresentada anteriormente 15 Estrutura Basica de um Programa em C usando o CodeBlocks Um programa C consiste na definicao de uma ou mais funcoes Na Figura 15 a seguir e apresentada a forma geral de definicao de funcao que possui um tipo de dado de retorno ou simplesmente tipo da funcao um nome acompanhado de parˆenteses e dentro deles a declaracao de parˆametros se houver A seguir devese inserir uma chave de abertura de bloco escrever as instrucoes no corpo da funcao e terminar com uma chave de fechamento de bloco Todo programa C deve possuir uma funcao chamada main do inglˆes principal Listing 14 a seguir na qual a execucao se inicia com a chave de abertura e apos executar as instrucoes contidas no corpo da funcao termina quando e encontrada a chave de fechamento Verifique que no inıcio do programa ha a inclusao de biblioteca que e um arquivo necessario para a execucao de comandos utilizados no decorrer do programa Devese incluir cada biblioteca com o comando includenomeDeBiblioteca 6 Figura 14 Projeto chamado Hello com um arquivo maincpp com conteudo padrao Fonte captura de tela Figura 15 C Forma geral de definicao de funcao Listing 14 Estrutura basica de um programa em C usando o CodeBlocks include nomeDeBiblioteca using namespace std int main instrucao1 instrucao2 instrucaon return 0 7 16 Primeiro Programa Em Listing 15 e apresentado um exemplo de programa cuja finalidade e calcular e imprimir a soma de dois numeros inteiros passados pelo usuario Listing 15 C Primeiro programa somacpp 1 include iostream 2 include cstdlib 3 using namespace std 4 5 int main 6 7 int num1 num2 soma 8 9 cout Somadedoisnumeros 10 11 cout Entrecomoprimeironumero 12 cin num1 13 14 cout Entrecomosegundonumero 15 cin num2 16 17 soma num1 num2 18 19 cout Asomae 20 cout soma 21 22 system pause0 23 24 return 0 25 Podese digitar o codigo e salvalo com o nome somacpp sem as aspas O sufixo cpp indica programafonte em C plus plus do inglˆes C mais mais O programa possui apenas uma definicao de funcao a main O nome de uma funcao pode ser qualquer um com excecao da main reservado para a funcao que inicia a execucao do programa Se um programa for constituıdo de uma unica definicao de funcao esta sera main O programa termina quando for encerrada a execucao dessa funcao A funcao main do programa apresentado e do tipo int que indica que a funcao possui valor de retorno inteiro no caso o zero Esse valor zero indica que a execucao do programa foi normal repare na Figura 13 a mensagem Process returned 0 0x0 em contraste quando ocorre interrupcao anormal do programa um exemplo e a divisao por zero 17 Instrucoes de Programa Geralmente as instrucoes C terminam em um pontoevırgula O primeiro programa Listing 15 possui varias instrucoes e sao executadas na ordem em que sao escritas 8 i A execucao do programa se inicia pela funcao main A chave de abertura na linha 6 indica o inıcio da funcao main ii Na linha 7 sao declaradas trˆes variaveis do tipo inteiro int iiii Na linha 9 o comando cout seguido de imprime na tela tudo o que esta entre aspa dupla ou seja a frase Soma de dois numeros iv Na linha 11 e impressa uma frase que pede ao usuario um numero inteiro v Na linha 12 o comando cin seguido de e do nome da variavel num1 espera o usuario entrar com algum dado que e colocado na variavel indicada vi As instrucoes das linhas 14 e 15 seguem a mesma explicacao das linhas 11 e 12 vii Na linha 17 e realizada a soma com os valores passados pelo usuario nas variaveis num1 e num2 atribuindo o resultado a variavel soma viii Na linha 19 e impressa a frase A soma e ix Na linha 20 e impresso o valor que esta na variavel soma Perceba que neste caso nao foi utilizada aspas foi apenas escrito o nome da variavel Caso se utilizasse as aspas seria impressa a palavra soma e nao o valor que esta na variavel soma x A chamada a funcao system com parˆametro pause 0 faz com que se espere a digitacao de alguma tecla para continuar a execucao do programa ou seja faz com que o usuario consiga visualizar o resultado na tela xi A instrucao na linha 24 retorna 0 ao sistema operacional indicando que ele foi executado e terminado corretamente Quando um programa e terminado antes da hora ele retorna um valor qualquer ao sistema indicando erro durante a execucao xii A chave na linha 25 denota o fim da funcao main ou seja o fim da execucao do programa 18 Comandos Iniciais 181 cout Comando de SaıdaEscrita cout pronunciase C out saıda esta associado a saıda padrao geralmente o vıdeo O operador conecta a mensagem a ser impressa a cout As definicoes e declaracoes necessarias para seu uso estao contidas na biblioteca iostream que tambem contem os elementos necessarios para a execucao de operacoes de leitura e impressao IO InputOutput 182 cin Comando de EntradaLeitura cin pronunciase C in entrada manipula toda a entrada do teclado por meio do operador que conecta a entrada de dados a variavel que a contera As definicoes necessarias ao uso de cin e estao na biblioteca iostream 9 183 systempause 0 A chamada a funcao system com parˆametro pause 0 faz com que se espere a digitacao de alguma tecla para continuar a execucao do programa Pode ser utilizada para o usuario conseguir visualizar o resultado na tela quando se executa o programa clicando diretamente no arquivo executavel exe Caso a funcao nao seja chamada o usuario nao conseguira ver a saıda pois a janela e fechada Caso se escreva apenas systempause e impressa na tela a mensagem Pressione qualquer tecla para continuar Devese incluir a biblioteca cstdlib 184 Caracter que imita a tecla ENTER Alem da tecla ENTER varios outros caracteres nao podem ser digitados do teclado para dentro do programa Esses caracteres que nao podem ser obtidos diretamente do teclado sao codificados em C por meio da combinacao do sinal barra invertida com outros caracteres Para imitar a tecla ENTER use o caracter 19 Uso de Comentarios Comentarios sao textos que podem ser inseridos em programas com o objetivo de documentalo Os comentarios nao sao analisados pelo compilador Os comentarios podem ocupar uma ou varias linhas podendo ser utilizados de duas formas 1 A regiao de comentarios e aberta pelos sımbolos e e encerrada automaticamente ao final da linha 2 A regiao de comentarios e aberta com os sımbolos e e encerrada com os sımbolos Em Listing 16 e apresentado o primeiro programa utilizando as duas formas de comentarios Listing 16 C Programa da soma comentado 1 2 P r o g r a m a d o r C l a u d i a A I z e k i 3 D a t a 7 1 2 2 0 0 5 4 D e s c r i c a o P r o g r a m a q u e c a l c u l a a s o m a d e d o i s n u m e r o s i n t e i r o s 5 p a s s a d o s p e l o u s u a r i o 6 7 I n c l u s a o d e b i b l i o t e c a s 8 include iostream P a r a u s o d e c i n e c o u t 9 include cstdlib P a r a u s o d a f u n c a o s y s t e m 10 using namespace std 11 12 F u n c a o p r i n c i p a l 13 int main 14 15 D e c l a r a c a o d e v a r i a v e i s 16 int num1 num2 soma 17 10 18 I m p r i m e o o b j e t i v o d o p r o g r a m a a o u s u a r i o 19 cout Somadedoisnumeros 20 21 P e d e um n u m e r o a o u s u a r i o 22 cout Entrecomoprimeironumero 23 cin num1 O q u e o u s u a r i o d i g i t a r e i n s e r i d o em num1 24 25 P e d e a o u s u a r i o o u t r o n u m e r o 26 cout Entrecomosegundonumero 27 cin num2 O q u e o u s u a r i o d i g i t a r e i n s e r i d o em num2 28 29 C a l c u l a a s o m a 30 soma num1 num2 31 32 I m p r i m e a s o m a 33 cout Asomae 34 cout soma 35 36 E s p e r a o p r e s s i o n a m e n t o d e a l g u m a t e c l a Com i s s o o 37 u s u a r i o c o n s e g u e v i s u a l i z a r o r e s u l t a d o 38 system pause0 39 40 return 0 41 110 Teste de Mesa Um recurso muito utilizado para verificar erros de logica em um algoritmo e a simulacao ou teste de mesa Segundo Salvetti e Barbosa 1998 a partir de dados escolhidos com resposta co nhecida simulase a execucao do algoritmo e comparase a resposta obtida com a resposta esperada Se nao houver coincidˆencia esta detectado um erro embora a recıproca nao seja verdadeira Saber escolher os dados para os testes e de muita importˆancia na simulacao Assim devese escolher amostras de dados de forma que provoquem a execucao de todas as instrucoes presentes no algoritmo testando todas as diferentes possibilidades de saıda Para realizar o teste de mesa sao listadas todas as variaveis utilizadas no algoritmo e registrados todos os valores assumidos pelas variaveis na ordem em que ocorrem Para localizar facilmente a variavel que foi definida ou alterada em um dado momento e con veniente identificar com um numero cada uma das instrucoes contidas no algoritmo Na Tabela 11 e apresentado um teste de mesa do primeiro programa Listing 16 pag 10 Verifique que o sımbolo indica a ordem de execucao das instrucoes indica o numero da instrucao sendo executada o sublinhado indica valor definido ou modificado o pontilhado indica impressao e a saıda e alguma impressao com o comando cout 11 Tabela 11 Teste de mesa do primeiro programa comentado apresentado em Listing 16 Suponha que os valores entrados pelo usuario para as variaveis num1 e num2 sejam respectivamente 12 e 7 Variaveis Saıda num1 num2 soma 1 16 lixo lixo lixo 2 19 lixo lixo lixo Soma de dois numeros 3 22 lixo lixo lixo Entre com o primeiro numero 4 23 12 lixo lixo 5 26 12 lixo lixo Entre com o segundo numero 6 27 12 7 lixo 7 30 12 7 19 8 33 12 7 19 A soma e 9 34 12 7 19 19 10 38 12 7 19 Espera o pressionamento de alguma tecla 12 CAPITULO 2 Variaveis e Tipos de Dados Variaveis sao os aspectos fundamentais de qualquer linguagem de computador Segundo Mizrahi 1994 uma variavel em C e um espaco de memoria reservado para armazenar um certo tipo de dado e possui um nome para referenciar seu conteudo Uma variavel pode conter a cada tempo valores diferentes Na Secao 16 pagina 8 foi apresentado um programa com trˆes variaveis do tipo inteiro num1 num2 e soma utilizadas para armazenar respectivamente as entradas do usuario e o resultado da adicao 21 Declaracao de Variaveis Antes de comecar a armazenar dados em uma variavel devese declarala escrevendo seu tipo seguido por um ou mais espacos um nome e um pontoevırgula No Exemplo 21 e declarada uma variavel num para armazenar um valor inteiro Exemplo 21 C Declaracao de uma variavel do tipo inteiro int num Podese criar mais de uma variavel do mesmo tipo em uma instrucao escrevendose o tipo e entao os nomes das variaveis separados por vırgulas e um pontoevırgula no final No Exemplo 22 sao declaradas trˆes variaveis do tipo inteiro num1 num2 e soma Exemplo 22 C Declaracao de mais de uma variavel do tipo inteiro int num1 num2 soma E boa pratica de programacao utilizar nomes significativos para variaveis tornandoas faceis de entender o que facilita a manutencao do programa 22 Regras para Nomes de Variaveis O nome de uma variavel e utilizado para sua identificacao e posterior uso em um programa Assim e necessario estabelecer algumas regras de utilizacao 13 1 O primeiro caracter do nome da variavel deve ser sempre uma letra ou o caracter subli nhado 2 Os demais caracteres podem ser letras numeros e o caracter 3 Nomes de variaveis nao podem ser iguais as palavras reservadas da linguagem como por exemplo int float if e else 4 A linguagem C distingue as letras maiusculas e minusculas ou seja e case sensitive Por exemplo ABC e abc sao diferenciadas pela linguagem 23 Tipos de Dados de Variaveis ou simplesmente Tipos de Dados O tipo de uma variavel informa a quantidade de memoria em bytes que a variavel ocupara e a forma como um valor devera ser armazenado e interpretado A classificacao dos tipos de dados pode ser vista na Figura 21 onde temse os tipos numerico logico e literal O tipo de dados numerico e classificado em inteiro e real Ja o tipo literal e classificado em caracter e string Figura 21 Tipos de dados primitivos 1 Tipos de dados numericos inteiros sao dados numericos positivos e negativos incluindo o zero Nao podem ser fracionarios e sao representados pelo tipo int Exemplos i idades de pessoas podem ser consideradas do tipo inteiro como 18 25 e 68 ii alturas em centımetros sao do tipo inteiro como 154 176 e 200 iii quantidade de filhos tambem e inteira como 0 2 e 7 2 Tipos de dados numericos reais sao dados numericos positivos e negativos incluindo o zero Podem ser fracionarios e sao representados pelos tipos float e double Por exemplo saldos de contas de banco sao do tipo real como 12045 00 e 34598 alturas de pessoas em metros sao do tipo real como 154 176 e 20 temperatura em graus Celsius tambem sao como 365 372 e 400 3 Tipos de dados literal relacionado a um unico caracter ou a uma sequˆencia de caracteres E representado pelo tipo char Exemplos de caracteres letras numeros sinais de pontuacao e caracteres especiais Uma sequˆencia de caracteres e chamada de string Para diferenciar um caracter de uma string usase apostrofo para o primeiro e aspa para o segundo Exemplo s e um caracter Hello World e uma string 14 4 Tipos de dados logicos ou booleanos sao dados que representam dois possıveis valores verdadeiro true ou falso false Exemplo Na pergunta O ano X e bissexto a resposta pode ser true ou false dependendo de X Na Tabela 21 sao apresentados alguns tipos de dados em C Podese considerar que os 6 primeiros tipos sao os basicos da linguagem os demais utilizam os modificadores unsigned long e short O modificador unsigned significa que se pode armazenar somente numeros positivos incluindo o zero O modificador short normalmente se refere a um inteiro de 2 bytes e o long mais frequentemente a um inteiro de 4 bytes mas nenhum desses e certo A linguagem exige apenas que um short seja mais curto ou igual a um inteiro e que um inteiro seja mais curto ou igual a um long Para saber quantos bytes um determinado tipo possui utilize a funcao sizeoftipo exemplo sizeofint retornara a quantidade de bytes de um int e sizeofshort int retornara a quantidade de bytes de um short int Tabela 21 Alguns tipos de dados em C Tipo Tamanho Valores aproximados int 4 bytes 2147483648 a 2147483647 char 1 byte 256 valores de caracteres float 4 bytes 34e38 a 34e38 double 8 bytes 17e308 a 17e308 void 0 Nenhum valor bool 1 2 valores 1 true 0 false unsigned int 4 bytes 0 a 4294967295 short int 2 bytes 32768 a 32767 unsigned short int 2 bytes 0 a 65535 long int 4 bytes 2147483648 a 2147483647 unsigned long int 4 bytes 0 a 4294967295 24 Exemplo Um produto sofrera um aumento de 10 Escreva um programa que peca ao usuario o preco de um produto calcule e mostre em reaisR qual sera o valor do aumento e o valor reajustado do produto 241 Analise e Implementacao Para resolver esse e outros problemas devese ter em mente os seguintes passos 1 Quais sao as entradas do programa geralmente sao pedidas ao usuario mas tambem podem vir de outras fontes como um banco de dados ou um arquivo 2 Qual e o processamento o que se deve fazer com essas entradas verificar calcular modificar etc 3 Quais sao as saıdas 15 Neste exemplo a entrada do programa e o preco de um produto no enunciado do exercıcio peca ao usuario o preco de um produto De que tipo ele e para se fazer a declaracao Preco e um numero real assim utilizase o tipo float O que se deve fazer com a entrada Calcular o aumento de 10 e o preco reajustado no enunciado calcule qual sera o valor do aumento e o valor reajustado do produto Como fazer isso Podese empregar a regra de trˆes prod 100 21 aum 10 22 aum 100 prod 10 23 aum prod 10 100 24 aum prod 0 10 25 Assim podese chegar a Equacao 24 aum prod10100 ou simplesmente a Equacao 25 aum 010 prod Perceba que na Equacao 25 foi utilizado o ponto no lugar da vırgula em 010 Assim toda vez que for escrever um numero com casas decimais na linguagem C nao use vırgula use o ponto Tendose o valor do aumento e so somalo com o valor do produto para encontrar o preco reajustado Os nomes de variaveis utilizadas para armazenar esses valores foram respectivamente aum prod e prod reaj Por ultimo e so imprimir o que se pede no exercıcio no enunciado mostre qual sera o valor do aumento e o valor reajustado do produto Analise como esse problema foi solucionado no programa apresentado em Listing 21 a seguir Listing 21 C Resolucao do problema de reajuste de preco de um produto 1 include iostream 2 include cstdlib 3 using namespace std 4 5 int main 6 7 float prod aum prod reaj 8 9 cout Entrecomovalordoproduto 10 cin prod 11 12 aum prod 0 1 0 13 14 prod reaj prod aum 16 15 16 cout Valordoaumento aum 17 cout Valordoprodutoreajustado prod reaj 18 19 system pause0 20 21 return 0 22 242 Verificacao do Programa A execucao do programa apresentado anteriormente em Listing 21 segue os seguintes passos mas pode ser observada no teste de mesa da Tabela 22 a seguir Suponha que o usuario tenha entrado com o valor 553 para o preco do produto i Linha 7 quando ocorre a declaracao de variaveis na funcao main elas estao com valor de lixo ou seja estao com algum valor que estao naquelas posicoes de memoria ii Linha 9 imprime na tela Entre com o valor do produto iii Linha 10 o usuario deve entrar com algum valor por exemplo 553 Novamente atentese que o usuario devera entrar com o ponto ao inves da vırgula iv Linha 12 calculase o aumento onde aum ficara com o valor 553 Como ha uma atribuicao o produto substitui o valor de lixo que existia anteriormente em aum v Linha 14 calculase o valor do preco reajustado inserindoo na variavel prod reaj que armazenara o valor 6083 vi Linhas 16 e 17 a seguir sao impressos os valores contidos nas variaveis aum e prod reaj Tabela 22 Teste de mesa do programa apresentado em Listing 21 Suponha que o usuario tenha entrado com o valor 553 para o preco de produto Variaveis Saıda prod aum prod reaj 1 7 lixo lixo lixo 2 9 lixo lixo lixo Entre com o valor do produto 3 10 553 lixo lixo 4 12 553 553 lixo 5 14 553 553 6083 6 16 553 553 6083 Valor do aumento 553 7 17 553 553 6083 Valor do produto reajustado 6083 8 19 553 553 6083 Espera pressionamento de alguma tecla 25 Declaracao de Valores Constantes A palavrachave const e utilizada para declarar valores constantes Ela assegura que a variavel associada nao sera alterada em todo o programa Em Listing 22 a seguir e apresentado um exemplo 17 A sintaxe de declaracao de valores constantes e const tipoDaConstante nomeDaConstante valor Verifique que na linha 9 foi declarado o valor 3141592 para PI Assim podese utilizala em varias partes do programa como nas linhas 17 e 19 Como PI e uma constante nao se pode modificala no decorrer do programa Uma alternativa para a declaracao dessa constante e utilizar uma constante predefinida da linguagem que e M PI mas devese incluir a biblioteca cmath Listing 22 C Exemplo de declaracao e uso de constante para representar o valor de pi 1 D e s c r i c a o d o p r o g r a m a C a l c u l a a a r e a d e um c ı r c u l o e o p e r ı m e t r o 2 d e s u a c i r c u n f e r ˆe n c i a 3 include iostream 4 include cstdlib 5 using namespace std 6 7 int main 8 9 const float PI 3141592 10 float area raio 11 12 cout Calculodaareadeumcırculoedoperımetro 13 desuacircunferencia 14 cout Porfavorentrecomoraio 15 cin raio 16 17 area PI raio raio 18 19 comp 2 PI raio 20 21 cout Aareadocırculoe area 22 cout Ocomprimentodesuacircunferenciae comp 23 24 system pause0 25 26 return 0 27 18 CAPITULO 3 Operadores 31 Operador de Atribuicao Em C o sinal de igual nao tem a interpretacao dada em matematica Representa a atribuicao da expressao a sua direita a variavel a sua esquerda Por exemplo x 0 atribui o valor zero a variavel de nome x A acao e executada da direita para a esquerda Lˆese x recebe o valor zero Mesmo em expressoes mais complexas como em delta bb4ac primeiro e realizado calculo da expressao a direita do operador de atribuicao para depois atribuir o resultado a variavel delta 32 Operadores Aritmeticos C oferece 5 operadores aritmeticos binarios que operam sobre dois operandos e um opera dor aritmetico unario que opera sobre um operando apresentados na Tabela 31 Tabela 31 C Operadores aritmeticos Binarios Soma Subtracao Multiplicacao Divisao Modulo Unario Menos unario Os operadores de soma subtracao multiplicacao e o unario nao tˆem segredo funcionam como vocˆes ja viram no Ensino Medio Atencao especial deve ser dada aos operadores de divisao e modulo 19 Quando se usa o operador de divisao o quociente de operandos inteiros sera obrigatoria mente um inteiro Em C um numero que possui o ponto em sua representacao e considerado real e aquele que nao o possui e considerado inteiro Exemplo 40 e um valor real e 4 e um valor inteiro A seguir sao apresentados exemplos do uso do operador de divisao com operandos inteiros resultando em quociente obrigatoriamente inteiro 206 3 45 0 75 1 Agora quando pelo menos um dos operandos e um valor real o quociente tambem e real Exemplos 2006 3333 aqui 200 e um valor real e 6 um valor inteiro 450 08 4 e um valor inteiro e 50 um valor real 7050 14 70 e 50 sao valores reais Ja o operador modulo opera somente com operandos inteiros e da como resultado o resto da divisao do inteiro a sua esquerda pelo inteiro a sua direita Por exemplo 17 5 possui o valor 2 pois quando se divide 17 por 5 resta o valor 2 O operador menos unario e usado somente para indicar a troca do sinal algebrico do valor Tambem pode ser pensado como o operador que multiplica seu operando por 1 Por exemplo x 8 x x Depois destas duas instrucoes o conteudo de x sera 8 321 Precedˆencia de Operadores Aritmeticos A precedˆencia dos operadores aritmeticos e apresentada na Tabela 32 Os operadores que possuem a mesma prioridade devem ser executados da esquerda para a direita na expressao em que aparecem Para alterar a prioridade da tabela devese utilizar parˆenteses mais internos Tabela 32 C Precedˆencia dos operadores aritmeticos Prioridade Operadores 1a parˆenteses mais internos 2a 3a 20 Exemplos 1 Suponha que se deseje calcular o valor final de uma compra de acordo com a formula a seguir Os valores dos produtos e do desconto sao respectivamente 2350 1400 500 e 200 Como existem apenas os operadores de soma e de subtracéo que possuem a mesma precedéncia a execucao comecara da esquerda para a direita valorfinalcompra valorprodutol valorproduto2 valorproduto3 desconto valorfinalcompra 2350 1400 500 200 ae 3750 valorfinalcompra 3750 500 200 S SS 4250 valorfinalcompra 4250 200 S 4050 valorfinalcompra 4050 2 Sejam 1 6 e 8 os valores de a 5 e c respectivamente Na formula de delta existem os operadores de subtracao e de multiplicacao este ultimo tendo precedéncia sobre o primeiro Assim a ultima operacao a ser realizada é a subtracaéo sendo que todas as multiplicagoes sao resolvidas da esquerda para a direita delta bx b4aC delta 6 64 18 S eS 36 delta 36 4 18 YY 4 delta 36 4 8 NY 32 delta 4 3 Seja a seguinte férmula que calcula a nota que um aluno devera tirar no exame EF onde Ma é a média anual Suponha que Ma seja 40 Verifique que os operadores com maior precedéncia sao o da multiplicacao e o da diviséo Note ainda que ha parénteses o que indica que o que esta em seu interior deve ser resolvido primeiro E 506 Ma4 E 50 6 40 4 240 E 50 240 4 SSE 260 E 2604 Sa 65 E65 33 Operadores de Incremento e de Decremento O operador de incremento é um operador unario que adiciona 1 a4 varidvel operando O operador de incremento pode ser usado de duas formas préfixado quando aparece antes do nome da varidvel e pésfixado quando aparece em seguida ao nome da variavel 21 A instrucao x x 1 adiciona 1 ao valor de x e e equivalente a x prefixado que e equivalente a x posfixado A diferenca entre as operacoes executadas pelo operador prefixado e posfixado aparece em instrucoes que fazem mais do que somente incrementar a variavel operando Por exemplo n 5 x n cout Ovalordene n cout Ovalordexe x A saıda sera O valor de n e 6 O valor de x e 6 O operador de incremento prefixado incrementa a variavel operando antes de executar a instrucao em que ele aparece Desta forma n tera seu valor incrementado de 1 antes de ser atribuıdo a x Observe agora o proximo exemplo n 5 x n cout Ovalordene n cout Ovalordexe x A saıda sera O valor de n e 6 O valor de x e 5 O operador de incremento posfixado incrementa a variavel operando logo apos a instrucao em que ele aparece Desta forma n e atribuıdo a x e depois seu valor e incrementado de 1 Quando o operador de incremento aparece sozinho em uma instrucao nao faz diferenca o uso prefixado ou posfixado A sintaxe e o modo de uso do operador de decremento prefixado e posfixado e idˆentica a do operador de incremento exceto porque a variavel e decrementada de 1 34 Operadores Aritmeticos de Atribuicao Esses operadores sao binarios e combinam as operacoes aritmeticas com a atribuicao O operando da esquerda e sempre o nome de uma variavel e o da direita uma expressao qualquer A 22 operacao consiste em atribuir um novo valor a variavel que dependera do operador e da expressao a direita Como regra geral se x e uma variavel exp uma expressao e op um operador aritmetico entao x op exp equivale a x x op exp As expressoes com estes operadores sao mais compactas e normalmente muito usadas em C Na Tabela 34 sao apresentados alguns exemplos desses operadores Tabela 33 C Exemplos de operadores aritmeticos de atribuicao i 2 equivale a i i 2 x y 1 equivale a x x y1 t 25 equivale a t t 25 p 5 equivale a p p 5 d 3 equivale a d d 3 35 Operadores Relacionais Operadores relacionais sao utilizados para fazer comparacoes conforme apresentados na Tabela 34 sempre necessitando de dois operandos Tabela 34 C Operadores relacionais op1 e op2 sao operandos Operador relacional com os operandos Significado op1 op2 op1 e igual a op2 op1 op2 op1 e diferente de op2 op1 op2 op1 e maior que op2 op1 op2 op1 e menor que op2 op1 op2 op1 e maior ou igual que op2 op1 op2 op1 e menor ou igual que op2 Uma atencao especial Exemplo 31 e dada quanto ao uso dos operadores maior ou igual que e menor ou igual que Exemplo 31 C Um caso de uso do operador maior ou igual que Suponha que seja de interesse verificar se a media final Mf e no mınimo 7 0 Isso significa que Mf deve ser igual ou maior que 7 0 Sejam trˆes situacoes com os seguintes valores para Mf 70 85 e 68 Mf 70 70 70 Verdadeiro Mf 70 85 70 Verdadeiro Mf 70 68 70 Falso 23 351 Precedˆencia dos operadores aritmeticos juntamente com os relacionais Os operadores aritmeticos tˆem precedˆencia sobre os operadores relacionais No Exemplo 32 e verificado se n e um numero par Exemplo 32 C Precedˆencia do operador aritmetico sobre o relacional Suponha duas situacoes em que os valores para n sejam 13 e 8 Desejase checar se n e um numero par Verifique que primeiro e feito o calculo do resto e depois a checagem de igualdade n 2 0 13 2 0 1 0 Falso n 2 0 8 2 0 0 0 Verdadeiro 24 36 Operadores Logicos Operadores logicos tambem fazem comparacoes A diferenca entre comparacoes logicas e rela cionais esta na forma como os operadores avaliam seus operandos Operandos de operadores logicos sao avaliados como logicos falso ou verdadeiro e nao como numericos C oferece trˆes operadores logicos significa E logico significa OU logico significa NAO logico 25 361 E Logico Se e1 e e2 sao duas expressoes entao e1 e2 resulta verdadeiro somente se e1 e e2 forem verdadeiras Em qualquer outra situacao resulta falso Verifique a tabelaverdade1 do E logico na Tabela 35 e os Exemplos 33 e 34 observando a precedˆencia dos operadores relacionais sobre os logicos Tabela 35 Tabelaverdade do E logico Expressao logica e1 e2 Resultado V V V V F F F V F F F F Exemplo 33 C Um caso de uso do operador logico E Suponha que se deseje verificar se a nota de um aluno e no mınimo 70 mas abaixo de 80 A expressao logica devera ser nota 70 nota 80 Para nota com valor 8 0 nota 70 nota 80 80 70 80 80 V F F Para nota com valor 7 0 nota 70 nota 80 70 70 70 80 V V V Para nota com valor 6 5 nota 70 nota 80 65 70 65 80 F V F 1Segundo Forbellone e Eberspacher 2005 tabelaverdade e o conjunto de todas as possibilidades combinatorias entre os valores de diversas variaveis logicas as quais se encontram em apenas duas situacoes V ou F em um conjunto de operadores logicos 26 Exemplo 34 C Outro caso de uso do operador logico E Suponha que se deseje verificar se o usuario e do sexo feminino e a data 8 de marco A expressao logica devera ser sexo f dia 8 mes 3 Para sexo com valor f dia igual a 8 e mes igual a 3 sexo f dia 8 mes 3 f f 8 8 3 3 V V V V V V Para sexo com valor m dia igual a 8 e mes igual a 3 sexo f dia 8 mes 3 m f 8 8 3 3 F V V F V F 362 OU Logico Se e1 e e2 sao duas expressoes entao e1 e2 resulta falso somente se e1 e e2 forem falsas Em qualquer outra situacao resulta verdadeiro Verifique a tabelaverdade do OU logico na Tabela 36 e os Exemplos 35 e 36 Observe novamente a precedˆencia dos operadores relacionais sobre os logicos Tabela 36 Tabelaverdade do OU logico Expressao logica e1 e2 Resultado V V V V F V F V V F F F 27 Exemplo 35 C Um caso de uso do operador logico OU Suponha que se deseje verificar se sexo e valido Sexos validos sao f de feminino e m de masculino A expressao logica devera ser sexo f sexo m Para sexo com valor f sexo f sexo m f f f m V F V Para sexo com valor m sexo f sexo m m f m m F V V Para sexo com valor p sexo f sexo m p f p m F F F Exemplo 36 C Outro caso de uso do operador logico OU Suponha que se deseje verificar se um caracter e f ou F A expressao logica devera ser caracter f caracter F Para caracter com valor f caracter f caracter F f f f F V F V Para caracter com valor F caracter f caracter F F f F F F V V Para caracter com valor s caracter f caracter F s f s F F F F 363 NAO Logico Sendo e1 uma expressao logica e1 resulta verdadeiro somente se e1 for falsa e viceversa Verifique a tabelaverdade do N AO logico na Tabela 37 e o Exemplo 37 28 Tabela 37 Tabelaverdade do NAO logico Expressao logica e1 Resultado V F F V Exemplo 37 C Um caso de uso do operador logico NAO Suponha que seja de interesse saber se o nome de uma pessoa nao foi encontrado em uma lista telefˆonica Suponha tambem que exista uma variavel chamada achou que possa ter os valores 0 ou 1 o primeiro indicando que nao encontrou o nome da pessoa e o segundo indicando que o encontrou A expressao logica devera ser achou Para achou com valor 0 achou 0 V Para achou com valor 1 achou 1 F 364 Mais Exemplos de E e OU Logicos Como exemplos mais elucidativos dos operadores E e OU podese citar 1 Se tiver febre e dor no corpo vou ao medico Quando vou ao medico Observase na tabelaverdade do E que vou ao medico quando os termos tiver febre e tiver dor no corpo forem simultaneamente verdade 2 Se tiver febre ou dor no corpo vou ao medico Quando vou ao medico Observase na tabelaverdade do OU logico que as possibilidades de vou ao medico se tornam maiores pois sera verdadeiro em trˆes situacoes somente ter febre somente ter dor no corpo e ter febre e dor no corpo 29 365 Precedˆencia dos Operadores Logicos A precedˆencia dos operadores logicos e apresentada na Tabela 38 Observe os Exemplos 38 e 39 O primeiro apresenta o uso correto da precedˆencia e e segundo nao Tabela 38 C Precedˆencia entre os operadores logicos Prioridade Operadores 1a NAO 2a E 3a OU Exemplo 38 C Um exemplo do emprego da precedˆencia dos operadores logicos Suponha que se deseje verificar se uma pessoa e do sexo feminino mas para isso o usuario pode digitar f ou F Tambem e necessario que a data seja 8 de marco A expressao logica devera ser sexo f sexo F dia 8 mes 3 Para sexo com valor f dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 f f f F 8 8 3 3 V F V V V V V V V V Para sexo com valor F dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 F f F F 8 8 3 3 F V V V V V V V V V Para sexo com valor p dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 p f p F 8 8 3 3 F F V V F V V F V F Para sexo com valor f dia igual a 9 e mes igual a 3 sexo f sexo F dia 8 mes 3 f f f F 9 8 3 3 V F F V V F V F V F 30 Exemplo 39 C Um exemplo analogo ao anterior Exemplo 38 mas com o uso INCORRETO dos operadores logicos Suponha que se deseje verificar se uma pessoa e do sexo feminino mas para isso o usuario pode digitar f ou F Tambem e necessario que a data seja 8 de marco A expressao logica INCORRETA e sexo f sexo F dia 8 mes 3 Para sexo com valor f dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 f f f F 8 8 3 3 V F V V V F V V F V coincidiu de resultar o esperado Para sexo com valor F dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 sexo f sexo F dia 8 mes 3 F f F F 8 8 3 3 F V V V F V V F V V coincidiu de resultar o esperado Para sexo com valor p dia igual a 8 e mes igual a 3 sexo f sexo F dia 8 mes 3 sexo f sexo F dia 8 mes 3 p f p F 8 8 3 3 F F V V F F V F F F coincidiu de resultar o esperado Para sexo com valor f dia igual a 9 e mes igual a 3 sexo f sexo F dia 8 mes 3 sexo f sexo F dia 8 mes 3 f f f F 9 8 3 3 V F F V V F V V F V nao e o resultado esperado 37 Precedˆencia entre os Operadores Aritmeticos Relacionais e Logicos A precedˆencia entre os operadores aritmeticos relacionais e logicos estao apresentados na Tabela 39 No Exemplo 310 e apresentado um exemplo de expressao com todos os operadores 31 E importante saber que na linguagem C o 0 zero representa o valor booleano falso e tudo que for diferente de 0 e verdadeiro E importante lembrar que operandos de operadores logicos sao interpretados como booleanos verdadeiro ou falso Tabela 39 C Precedˆencia entre os operadores aritmeticos relacionais e logicos Prioridade Operadores 1a parˆenteses mais internos 2a operador logico NAO 3a operadores aritmeticos 4a operadores relacionais 5a operadores logicos E e OU Exemplo 310 C Um caso de uso da precedˆencia de operadores aritmeticos relacionais e logicos 3 1 4 5 2 3 0 3 4 4 5 1 3 0 3 4 4 5 0 3 0 3 4 4 5 3 0 3 16 5 3 0 3 11 3 0 3 11 3 0 1 1 0 1 0 1 32 CAPITULO 4 Estruturas Condicionais As estruturas condicionais permitem determinar qual e a acao a ser tomada com base no resultado de uma expressao condicional Por exemplo em um curso de ciˆencia da computacao a media final Mf para se passar em uma disciplina e 7 0 Caso o aluno nao a alcance vai para exame e tera que tirar no mınimo 506Mf4 Caso nao passe no exame ira para recuperacao tendo que tirar pelo menos 10 Mf Neste exemplo representado pelo fluxograma da Figura 41 dependendo do resultado da verificacao a acao a ser tomada pode ser uma dentre varias assim e necessario o uso de estruturas condicionais Figura 41 Fluxograma com expressoes condicionais e acoes a serem tomadas 33 C oferece trˆes estruturas condicionais 1 if estrutura condicional simples 2 if else estrutura condicional composta 3 switch alternativa de estrutura condicional composta mas possui algumas limitacoes em relacao a estrutura if else Neste capıtulo serao apresentadas figuras com blocos de programacao utilizando o software Scratch1 muito utilizado em universidades com Berkeley e Harvard para ensinar programacao de computadores de uma forma mais simples e ludica 41 Estrutura Condicional Simples if Na estrutura condicional simples sem chaves cuja forma geral e apresentada em Listing 41 a instrucao no corpo do if so sera executada se a expressao condicional resultar em verdadeira Uma expressao condicional e uma comparacao que resulta em dois valores possıveis verdadeiro ou falso No Scratch a condicional simples e mostrada na Figura 42 Listing 41 C Forma geral da estrutura condicional simples sem chaves i f expressao condicional instrucao c o r p o d o i f Figura 42 Scratch Estrutura condicional simples se No Exemplo 41 e apresentado um trecho de codigo que utiliza a condicional simples sem chaves na linguagem C Verifique que a unica instrucao que sera executada caso a condicao resulte em verdadeira e o cout Exemplo 41 C Trecho de codigo que utiliza a condicional simples sem chaves Suponha que se deseje parabenizar as mulheres pelo seu dia 8 de marco Caso nao seja o dia das mulheres ou o usuario seja homem nao emite mensagem ifsexousuariof dia8 mes3 cout Parabens mulher pelo seu dia Para imprimir a frase de congratulacoes o sexo devera ser f o dia 8 e o mˆes 3 resultando em verdadeira a expressao condicional Em C e obrigatoria a utilizacao de chaves quando houver mais de uma instrucao a ser executada quando a expressao condicional resultar em verdadeira A forma geral 1httpmitscratchedu 34 da estrutura condicional simples com chaves e apresentada em Listing 42 As instrucoes entre as chaves e que fazem parte do corpo do if so serao executadas se a expressao condicional resultar em verdadeira A chave de abertura indica inıcio do bloco corpo que sera executado se a expressao condicional resultar em verdadeira A outra chave indica o fim do bloco corpo No Exemplo 42 ha trˆes instrucoes que serao executadas caso a expressao condicional resulte em verdadeira dois comandos de impressao e uma alteracao em uma variavel contadora2 Listing 42 C Forma geral da estrutura condicional simples com chaves i f expressao condicional c o r p o d o i f i n s t r u c a o 1 a i n s t r u c a o n instrucao1 instrucao2 instrucaon Exemplo 42 C Trecho de codigo que utiliza a condicional simples com chaves Seja o exemplo anterior e suponha que se deseje calcular e imprimir a quantidade de mulheres que acessaram o sistema no dia 8 de marco ifsexousuariof dia8 mes3 cout Parabens mulher pelo seu dia cout Voce e a cont 1 a mulher a acessar o sistema hoje cont ou cont cont 1 Inicialmente cont recebera o valor 0 Verifique que ha trˆes instrucoes no corpo da instrucao if dois cout e um incremento de variavel contadora Assim devese utilizar as chaves No Exemplo 43 e apresentado um trecho de codigo que utiliza um contador em uma sequˆencia de estruturas condicionais simples Na Figura 43 e apresentado o mesmo exemplo trabalhado no Scratch Exemplo 43 C Trecho de codigo que utiliza sequencialmente varias condicionais simples sem chaves Suponha que se deseje verificar quantas notas de um total de quatro sao maiores que 90 cont 0 if n1 90 cont cont cont 1 if n2 90 cont cont cont 1 if n3 90 cont cont cont 1 if n4 90 cont cont cont 1 cout A quantidade de notas maiores que 90 e cont Verifique que ha a necessidade de se verificar cada uma das notas que sendo maior que 90 incrementase a variavel contadora 2Um contador e uma variavel que dado um valor inicial geralmente zero e incrementada somada a um valor constante geralmente 1 35 Figura 43 Scratch Exemplo correspondente ao Exemplo 43 42 Estrutura Condicional Composta if else A forma geral da estrutura condicional composta sem chaves e apresentada em Listing 43 Se a expressao condicional resultar em verdadeira sera executada a instrucao 1 caso contrario a expressao condicional resultar em falsa sera executada a instrucao 2 No Scratch a condicional composta e mostrada na Figura 44 36 Listing 43 C Forma geral da estrutura condicional composta sem chaves i f expressao condicional instrucao1 c o r p o d o i f else instrucao2 c o r p o d o e l s e Figura 44 Scratch Estrutura condicional composta se senao Ja a forma geral da estrutura condicional composta com chaves e apresentada em Listing 44 Se a expressao condicional resultar em verdadeira as instrucoes 1 e 2 corpo do if serao executadas caso contrario as instrucoes 3 e 4 corpo do else serao executadas Listing 44 C Forma geral da estrutura condicional composta com chaves i f expressao condicional c o r p o d o i f instrucao1 instrucao2 else c o r p o d o e l s e instrucao3 instrucao4 37 No Exemplo 44 e apresentado um programa que realiza a divisao entre dois numeros inteiros passados pelo usuario lembrando que o divisor nao pode ser zero Na Figura 45 e apresentada uma solucao no Scratch Exemplo 44 C Programa que faz a divisao de dois numeros inteiros passados pelo usuario 1 int main 2 3 int dividendo d i v i s o r 4 float quociente 5 6 cout Entrecomodividendoeodivisor respectivamente 7 cin dividendo d i v i s o r 8 9 i f d i v i s o r 0 10 11 quociente float dividendo d i v i s o r 12 cout Oquocientee quociente 13 14 else 15 cout ImpossıvelfazeradivisaoOdivisoreigualazero 16 17 system pause 18 19 return 0 20 Neste exemplo devese verificar se o divisor e diferente de zero pois so assim e possıvel fazer a divisao Um dado importante e que o quociente da divisao entre numeros inteiros pode ser um numero real Assim mesmo declarando a variavel quociente como float e necessario que se converta o valor do dividendo ou do divisor para um numero real Isso e feito colocandose o tipo float entre parˆenteses antes da variavel neste caso dividendo linha 11 Note que ha duas instrucoes nas linhas 11 e 12 que serao executadas caso o divisor seja diferente de zero Assim as chaves devem ser utilizadas Nas Tabelas 41 e 42 sao apresentados dois testes de mesa para esse programa Tabela 41 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 0 Variaveis Comparacao Saıda dividendo divisor quociente divisor 0 1 3 lixo lixo 2 4 lixo lixo lixo 3 6 lixo lixo lixo Entre com o dividendo e o divisor 4 7 21 0 lixo 5 9 21 0 lixo Falso 6 15 21 0 lixo Impossıvel fazer a divisao O divisor 7 17 21 0 lixo Espera o pressionamento de alguma tecla 38 Tabela 42 Teste de mesa do programa de divisao utilizando dividendo 21 e divisor 4 Variaveis Comparacao Saıda dividendo divisor quociente divisor 0 1 3 lixo lixo 2 4 lixo lixo lixo 3 6 lixo lixo lixo Entre com o dividendo e o divisor 4 7 21 4 lixo 5 9 21 4 lixo Verdadeiro 6 11 21 4 525 7 12 21 4 525 O quociente e 525 8 17 21 4 525 Espera o pressionamento de alguma tecla Figura 45 Scratch Divisao entre dois numeros correspondente ao Exemplo 44 43 Encadeamento de Estruturas Condicionais Compostas Quando uma estrutura condicional composta esta no corpo do senao else de outra estrutura condicional composta temse um encadeamento de estruturas condicionais compostas Para ilustrar esse encadeamento verifique a Figura 46 Podese ter tantas condicio nais compostas quanto necessarias 39 Figura 46 Scratch Encadeamento de estruturas condicionais compostas Uma estrutura sesenao esta no corpo do senao de outra estrutura condicional composta Para exemplificar o encadeamento de condicionais compostas e apresentado um programa de uma calculadora de 4 operacoes aritmeticas adicao subtracao multiplicacao e divisao A entrada deve seguir o seguinte formato operando operador operando Exemplo se o usuario entrar com 5 7 sera impresso O produto e 35 Caso o operador seja invalido emita uma mensagem Na Figura 47 e apresentado um trecho de uma solucao no Scratch No Exemplo 45 pagina 41 e apresentado um programa completo em C Figura 47 Scratch Exemplo de encadeamento de condicionais compostas 40 Exemplo 45 C Programa que representa uma calculadora de 4 operacoes matematicas 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 i f op 10 11 res n1 n2 12 cout Asomae res 13 14 else 15 16 i f op 17 18 res n1 n2 19 cout Adiferencae res 20 21 else 22 23 i f op 24 25 i f n2 0 26 cout Impossıvelfazerdivisaoporzero 27 else 28 29 res n1 n2 30 cout Oquocientee res 31 32 33 else 34 35 i f op 36 37 res n1 n2 38 cout Oprodutoe res 39 40 else 41 cout Operadorinvalido 42 f i m d o e l s e d o i f o p 43 f i m d o e l s e d o i f o p 44 f i m d o e l s e d o i f o p 45 46 system pause 47 return 0 48 f i m m a i n 41 No Exemplo 45 pagina 41 existem varias expressoes condicionais que a partir do momento em que uma resulta em verdadeira nao ha a necessidade de se verificar as demais expressoes condicionais pois a variavel op so pode ser um dos operadores aritmeticos ou um operador invalido diferente dos demais Assim a construcao mais adequada para a resolucao deste problema e o uso de estruturas condicionais compostas encadeadas if else Por exemplo se op e o caracter teste de mesa na Tabela 43 a expressao condicional da linha 9 resulta em falsa Daı a execucao vai para a linha 16 na qual e verificada outra expressao condicional que tambem resulta em falsa Como op nao e igual aos caracteres e chegase ao ultimo else no qual e impresso que o operador e invalido Tabela 43 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a Variaveis Comparacoes Saıda n1 n2 res op op op op op 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Digite NUMERO 4 7 15 6 lixo 5 9 15 6 lixo Falso 6 16 15 6 lixo Falso 7 23 15 6 lixo Falso 8 35 15 6 lixo Falso 9 40 15 6 lixo 10 41 15 6 lixo Operador invalido 11 46 15 6 lixo Espera o pressionamento Caso op seja o caracter teste de mesa na Tabela 44 a expressao condicional da linha 9 resulta em falsa Daı a execucao vai para a instrucao de linha 16 na qual resulta em verdadeira Assim como as demais instrucoes possuem else a execucao do programa vai para a proxima instrucao apos eles o systempause que esta na linha 46 Tabela 44 Teste de mesa da calculadora utilizando n1 igual a 15 n2 igual a 6 e op igual a Variaveis Comparacoes Saıda n1 n2 res op op op op op 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Digite NUMERO 4 7 15 6 lixo 5 9 15 6 lixo Falso 6 16 15 6 lixo Verdadeiro 7 17 15 6 9 8 18 15 6 9 A diferenca e 9 46 15 6 9 Espera o pressionamento ATENC AO No Exemplo 46 pagina 46 e apresentada uma versao do Exemplo 45 pagina 41 sem o uso de alguns pares de chaves e pois alguns sao desnecessarios Uma informacao muito util e que uma estrutura if else e considerada como um unico comando Ja no Exemplo 47 pagina 47 e apresentada uma versao sem o uso de algumas indentacoes escrevendose o if na mesma linha do else tornando o codigo mais simples 42 ATENC AO Na Figura 48 e apresentada uma transformacao de encadeamento de condici onais compostas com indentacoes para uma versao mais simples sem indentacoes Figura 48 C Transformacao de encadeamento de condicionais compostas com indentacoes para uma versao mais simples com menos indentacoes amplamente utilizada em programacao Um outro exemplo de encadeamento de estruturas condicionais if else e apresentado no Exemplo 48 em que a media de notas de um aluno devera estar em um dos 5 conceitos A B C D ou E por isso o encadeamento de if else e recomendado Perceba que quando ha apenas uma instrucao a ser executada quando a expressao condicional resultar em verdadeira podese escrevˆela na mesma linha da expressao condicional 44 Estruturas Condicionais Aninhadas Uma estrutura condicional esta aninhada quando esta dentro de outra tanto de um if quanto de um else No encadeamento de condicionais compostas apresentado na secao anterior ocorreu o aninhamento de condicionais compostas dentro do else Exemplo 45 pagina 41 Quando se tem aninhamento de estruturas condicionais e importante saber a qual if um determinado else esta ligado para nao ocorrer erro logico No Exemplo 49 pagina 49 perceba que a condicional composta linhas 10 a 21 esta no corpo da condicional if da linha 8 Note tambem que o else da linha 16 esta vinculado ao if da linha 10 e nao ao da linha 8 43 45 Alternativa de Estrutura Condicional Composta switch Embora construcoes if else possam executar testes para escolha de uma entre varias alter nativas muitas vezes sao deselegantes O comando switch tem um formato limpo e claro Sua forma geral e apresentada em Listing 45 Listing 45 C Forma geral da estrutura condicional switch switch nome da v a r i a v e l case constante1 instrucao1 instrucao2 break case constante2 instrucao3 instrucao4 break default instrucao5 instrucao6 O comando switch possui as seguintes regras O corpo de um switch deve estar entre chaves Pode haver nenhuma uma ou mais instrucoes seguindo cada caso case Geralmente a ultima instrucao de um caso e break que causa a saıda imediata de todo o corpo do switch Na falta dele todas as instrucoes apos o caso escolhido serao executadas mesmo as que pertencem aos casos seguintes switch testa a variavel que deve ser do tipo int ou char Nao se pode usar uma variavel ou expressao logica como rotulo de caso que vem apos o case E apenas permitido constantes do tipo int ou char Cada um dos casos pode ser considerado um if Um caso default e opcional Pode ser encarado como o else de todos os ifs Ou seja se nenhum caso for satisfeito e existir um caso default a execucao comecara nele No Exemplo 410 pagina 50 e apresentada uma solucao utilizando switch correspondente ao Exemplo 45 da pagina 41 Os operadores sao caracteres por isso estao entre apostrofos Se a variavel a ser analisada fosse do tipo inteiro nao se deveria colocar apostrofos entre as constantes Verifique o comando break apos cada caso Verifique tambem o default como ultima alternativa ou seja caso op nao seja igual a nenhum dos caracteres anteriores 44 Agora suponha que se deseje permitir que o usuario do programa da calculadora utilize o sinal ou x para indicar multiplicacao e o sinal ou para indicar divisao O Exemplo 411 ilustra isso Alguns casos devem executar as mesmas instrucoes daı a construcao de casos sem break linhas 19 e 24 45 Exemplo 46 C Programa correspondente ao anterior Exemplo 45 mas perceba que nao foram inseridas algumas chaves pois uma estrutura if else e considerada como um unico comando 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 i f op 10 11 res n1 n2 12 cout Asomae res 13 14 else 15 i f op 16 17 res n1 n2 18 cout Adiferencae res 19 20 else 21 i f op 22 23 i f n2 0 24 cout Impossıvelfazerdivisaoporzero 25 else 26 27 res n1 n2 28 cout Oquocientee res 29 30 31 else 32 i f op 33 34 res n1 n2 35 cout Oprodutoe res 36 37 else 38 cout Operadorinvalido 39 40 system pause 41 42 return 0 43 f i m m a i n 46 Exemplo 47 C Programa correspondente ao anterior Exemplo 46 mas perceba que a palavrachave if a partir do segundo if foi colocada na mesma linha do else colocandose o par de chaves e do corpo do else na mesma linha imaginaria vertical do i do primeiro if 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 i f op 10 11 res n1 n2 12 cout Asomae res 13 14 else i f op 15 16 res n1 n2 17 cout Adiferencae res 18 19 else i f op 20 21 i f n2 0 22 cout Impossıvelfazerdivisaoporzero 23 else 24 25 res n1 n2 26 cout Oquocientee res 27 28 29 else i f op 30 31 res n1 n2 32 cout Oprodutoe res 33 34 else 35 cout Operadorinvalido 36 37 system pause 38 39 return 0 40 f i m m a i n 47 Exemplo 48 C Programa que dada uma media de 00 a 100 verifica seu conceito A 8 0 10 0 B 7 0 8 0 C 6 0 7 0 D 5 0 6 0 e E 0 0 5 0 1 int main 2 3 float media 4 5 cout Digitesuamedia 6 cin media 7 8 i f media 80 cout ConceitoA 9 else i f media 70 cout ConceitoB 10 else i f media 60 cout ConceitoC 11 else i f media 50 cout ConceitoD 12 else cout ConceitoE 13 14 system pause 15 16 return 0 17 f i m m a i n 48 Exemplo 49 C Programa que coloca 3 valores inteiros em ordem crescente 1 int main 2 3 int a b c 4 5 cout Entrecom3valoresinteiros 6 cin a b c 7 8 i f a b a c 9 10 i f b c 11 12 aux a 13 a b 14 b aux 15 16 else 17 18 aux a 19 a c 20 c aux 21 22 23 i f b c 24 25 aux b 26 b c 27 c aux 28 29 30 cout a b c 31 32 return 0 33 49 Exemplo 410 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 switch op 10 11 case 12 res n1 n2 13 cout Asomae res 14 break 15 case 16 res n1 n2 17 cout Adiferencae res 18 break 19 case 20 i f n2 0 cout Impossıvelfazerdivisaoporzero 21 else 22 23 res n1 n2 24 cout Oquocientee res 25 26 break 27 case 28 res n1 n2 29 cout Oprodutoe res 30 break 31 default 32 cout Operadorinvalido 33 f i m s w i t c h 34 35 system pause 36 37 return 0 38 f i m m a i n 50 Exemplo 411 C Programa da calculadora de 4 operacoes aritmeticas utilizando switch com alguns casos sem break 1 int main 2 3 float n1 n2 res 4 char op 5 6 cout DigiteNUMEROOPERADORNUMERO 7 cin n1 op n2 8 9 switch op 10 11 case 12 res n1 n2 13 cout Asomae res 14 break 15 case 16 res n1 n2 17 cout Adiferencae res 18 break 19 case 20 case 21 i f n2 0 cout Impossıvelfazerdivisaoporzero 22 else 23 24 res n1 n2 25 cout Oquocientee res 26 27 break 28 case x 29 case 30 res n1 n2 31 cout Oprodutoe res 32 break 33 default 34 cout Operadorinvalido 35 f i m s w i t c h 36 37 system pause 38 39 return 0 40 f i m m a i n 51 CAPITULO 5 Funcoes Um recurso bastante importante em linguagens de programacao e a modularizacao na qual um programa pode ser particionado em pedacos menores chamados modulos ou funcoes As principais motivacoes para o uso de funcoes sao Evitar repeticao de codigo Qualquer sequˆencia de instrucoes que apareca no programa mais de uma vez e candidata a ser uma funcao Dividir e estruturar melhor um algoritmo Aumentar a legibilidade do codigo Como mencionado na Secao 15 do Capıtulo 1 pag 6 um programa em C consiste na definicao de uma ou mais funcoes e se o programa tiver apenas uma esta sera a principal main Ate agora apenas a funcao principal foi definida nos programas apresentados Alem disso apenas uma funcao foi chamada ate agora nos nossos exemplos a system com o parˆametro pause para esperar o pressionamento de alguma tecla Para ser executada uma funcao precisa ser ativada chamada pela funcao principal ou por outra funcao A chamada a uma funcao e o meio pelo qual e solicitado ao programa que desvie o fluxo de controle de execucao para a funcao execute suas instrucoes e depois volte a instrucao seguinte a da chamada da funcao Figura 51 Figura 51 Ilustracao de uma chamada a funcao system 52 Existem varias funcoes predefinidas na linguagem C principalmente as matematicas como sin pow e sqrt Exemplo 51 M PI e uma constante definida na biblioteca cmath Exemplo 51 C Programa que chama varias funcoes matematicas definidas na biblioteca cmath 1 includeiostream c i n e c o u t 2 includecstdlib s y s t e m 3 includecmath f u n c o e s m a t e m a t i c a s 4 using namespace std 5 6 int main 7 8 cout ALGUMASFUNCOESMATEMATICAS 9 cout Raizquadradade144 sqrt 144 endl 10 cout 2elevadoa10 pow2 10 endl 11 cout Raizcubicade1000 cbrt 1000 endl 12 cout Hipotenusadetrianguloretangulocomlados3e4 13 hypot 3 4 endl 14 15 cout Seno0 sin 0 endl 16 cout Seno30 sin M PI6 endl 17 cout Seno45 sin M PI4 endl 18 cout Seno60 sin M PI3 endl 19 cout Seno90 sin M PI2 endl 20 21 cout Tetode245 c e i l 245 endl 22 cout Pisode245 f l o o r 245 endl 23 24 system pause 25 26 return 0 27 Essas funcoes matematicas ja foram predefinidas na linguagem C e o programador so tem que chamalas Entretanto se o programador quiser utilizar uma funcao que nao exista ele e que devera implementala ou seja definila Assim para criar e utilizar uma funcao devese nao necessariamente nessa ordem Escrever seu prototipo serve para indicar ao compilador a existˆencia de uma funcao que possui nome parˆametros e seus tipos se houver e seu tipo de retorno se houver Chamala serve para ativar a funcao definida Definila e a codificacao da funcao No programa apresentado a seguir em Listing 51 sao destacadas cada uma dessas partes prototipo chamada a funcao e definicao de funcao Alem disso tambem e apresentado um conceito muito importante o escopo de variaveis 53 51 Escopo de Variaveis O escopo ou abrangˆencia de uma variavel referese a sua visibilidade perante as diversas definicoes de funcoes de um programa As variaveis que sao definidas no inıcio do programa fora de qualquer funcao sao denominadas globais por serem visıveis ou seja podem ser utilizadas por qualquer funcao definida no programa Ha casos em que uma variavel e utilizada apenas por uma funcao especıfica o que nao justifica uma definicao global pois somente se fazem necessarios o conhecimento e a utilizacao dessa variavel dentro dos limites desse bloco logico Esta situacao ocorre quando a variavel e declarada internamente a funcao sendo denominada variavel local Ate agora todos os exemplos possuıam apenas variaveis locais declaradas dentro da funcao main Em Listing 51 e apresentado um programa que utiliza variaveis local e global cujo objetivo e desenhar uma linha de tamanho passado pelo usuario Listing 51 C Programa que apresenta prototipo chamada a funcao desenha linha e sua definicao de funcao Apresenta tambem variaveis locais e globais 1 includeiostream 2 includecstdlib s y s t e m 3 using namespace std 4 5 void desenha linha P r o t o t i p o d a f u n c a o d e s e n h a l i n h a 6 7 V a r i a v e l g l o b a l v i s ı v e l em t o d a s a s f u n c o e s m a i n e d e s e n h a l i n h a 8 int tam 9 10 int main D e f i n i c a o d a f u n c a o m a i n 11 12 system cls C h a m a d a a f u n c a o s y s t e m com p a r ˆa m e t r o c l s 13 14 cout Entrecomotamanhodalinha 15 cin tam 16 17 C h a m a d a a f u n c a o d e s e n h a l i n h a 18 desenha linha 19 20 system pause C h a m a d a a f u n c a o s y s t e m com p a r ˆa m e t r o p a u s e 21 return 0 22 f i m m a i n 23 24 void desenha linha D e f i n i c a o d a f u n c a o d e s e n h a l i n h a 25 26 int i V a r i a v e l l o c a l v i s ı v e l a p e n a s n e s s a f u n c a o 27 28 for i 0 itam i 29 cout xc4 30 f i m d e s e n h a l i n h a Verifique que a variavel inteira tam foi declarada no inıcio do programa na linha 8 fora de qualquer funcao assim ela possui escopo global e pode ser acessada por qualquer funcao definida neste caso a main e a desenha linha 54 A main nao possui qualquer declaracao de variavel Na desenha linha e declarada apenas a variavel i acessada apenas nessa funcao Veja o teste de mesa para esse programa na Tabela 51 Verifique que a variavel tam existe no decorrer de toda a execucao do programa sendo que a variavel i existe apenas na funcao desenha linha Tabela 51 Teste de mesa para o programa apresentado em Listing 51 com tam igual a 1 para facilitar o teste de mesa Variaveis Condicao Observacoes Saıda tam i i tam 1 8 lixo 2 10 lixo Definicao da funcao main 3 11 lixo Inıcio da funcao main 4 12 lixo Chama a funcao systemcls 5 14 lixo Entre com o tamanho da linha 6 15 1 7 18 1 Chama a funcao desenha linha 8 24 1 Definicao da funcao desenha linha 9 25 1 Inıcio da funcao desenha linha 10 26 1 lixo 11 28 1 0 V 12 29 1 0 13 28 1 1 F 14 30 1 1 Fim da funcao desenha linha 15 20 1 Retornou a funcao main Espera o pressionamento de alguma tecla 16 21 1 Fim da funcao main Atencao o uso de variaveis globais em programas nao e recomendado porque se qualquer funcao definida pode acessalas a qualquer momento e mais difıcil a sua manutencao e checagem de erros de logica 52 Prototipo de Funcao Para utilizar uma variavel em um programa devese primeiramente declarala O mesmo acontece com as funcoes A declaracao de uma funcao e chamada prototipo e e uma instrucao colocada no inıcio do programa que informa o tipo da funcao seu nome e os tipos dos parˆametros1 tambem chamados de argumentos caso haja O programa apresentado anteriormente em Listing 51 pag 54 possui o prototipo da funcao desenha linha na linha 5 que informa que o tipo da funcao e void nao possui retorno e nao recebe nada como parˆametro Verifique que nao ha nada entre os parˆenteses da funcao na linha 5 53 Chamada de Funcao Chamada de funcao e o meio pelo qual o programa desvia o controle de execucao para a definicao da funcao executa suas instrucoes e depois volta a instrucao seguinte a chamada da funcao Chamase uma funcao pelo seu nome seguido de abertura de parˆentese zero ou mais parˆametros sem os tipos e o fechamento de parˆentese Exemplo na linha 18 de Listing 51 pag 54 chamase a funcao escrevendose desenha linha 1Quando existem os parˆametros sao informacoes imprescindıveis para a execucao da funcao 55 54 Definicao de Funcao E o codigo que descreve o que a funcao faz Sua forma geral foi apresentada anteriormente Secao 15 do Capıtulo 1 pag 6 e modificada com a inclusao de parˆametros entre os parˆenteses conforme a Figura 52 Figura 52 C Forma geral de definicao de funcao com parˆametros caso haja Em Listing 51 pag 54 as definicoes da funcoes main e desenha linha foram escritas nas linhas 10 a 22 e 24 a 30 respectivamente 55 Retorno de Funcao O tipo de retorno de uma funcao e definido pelo tipo de valor que ela retorna por meio do comando return Esse comando termina a execucao da funcao e retorna o controle para a instrucao seguinte ao codigo de chamada A instrucao return nao e obrigatoria Uma funcao sem esse comando e do tipo void e e terminada quando encontrar a chave que indica fim da funcao Em Listing 51 apresentado anteriormente pag 54 a funcao desenha linha nao possui o comando return por isso e do tipo void Os tipos de funcoes C sao os mesmos tipos de variaveis na linguagem exceto quando a funcao nao retorna nada sendo do tipo void O valor de retorno de uma funcao e acessado na instrucao de chamada por meio do nome dela seguido de parˆenteses contendo ou nao parˆametros No programa apresentado a seguir em Listing 52 a chamada a funcao verifica maior linha 16 possui dois parˆametros inteiros e retorna o maior deles O valor de retorno e atribuıdo a variavel maior na linha 16 Verifique que nao ha variaveis globais existem apenas variaveis locais As variaveis locais a main sao n1 n2 e maior declaradas na linha 9 As variaveis locais a funcao verifica maior sao a b e m linhas 26 e 28 Seu teste de mesa esta na Tabela 52 Atencao o comando return pode retornar somente um unico valor para a funcao que a chamou 56 Listing 52 C Programa que possui a definicao da funcao verifica maior que retorna o maior de dois numeros inteiros 1 includeiostream 2 includecstdlib 3 using namespace std 4 5 int v e r i f i c a m a i o r int int P r o t o t i p o d a f u n c a o v e r i f i c a m a i o r 6 7 int main D e f i n i c a o d a f u n c a o m a i n 8 9 int n1 n2 maior V a r i a v e i s l o c a i s a m a i n 10 11 cout Entrecomdoisnumerosinteiros 12 cin n1 n2 13 14 C h a m a d a a f u n c a o v e r i f i c a m a i o r e a t r i b u i c a o d o s e u v a l o r 15 d e r e t o r n o a v a r i a v e l m a i o r 16 maior v e r i f i c a m a i o r n1 n2 17 18 cout Omaiornumeroe maior 19 20 system pause 21 return 0 22 f i m m a i n 23 24 int v e r i f i c a m a i o r int a int b D e f i n i c a o d a f u n c a o v e r i f i c a m a i o r 25 26 int m V a r i a v e l l o c a l d a f u n c a o v e r i f i c a m a i o r 27 Mesmo s e n d o p a r ˆa m e t r o s a s v a r i a v e i s a e b s a o l o c a i s 28 i f a b 29 m a 30 else 31 m b 32 33 return m r e t o r n a o v a l o r d e m 34 f i m v e r i f i c a m a i o r Tabela 52 Teste de mesa com valores 15 e 67 para as variaveis n1 e n2 para o programa de Listing 52 Variaveis Observacoes Condicao Saıda n1 n2 maior a b m a b 1 7 Definicao da funcao main 2 8 Inıcio da funcao main 3 9 lixo lixo lixo 4 11 lixo lixo lixo Entre com dois numeros inteiros 5 12 15 67 lixo 6 16 15 67 lixo Chamada a funcao verifica maior 7 24 15 67 Inıcio da funcao verifica maior 8 26 15 67 lixo 9 28 15 67 lixo F 10 31 15 67 67 11 33 15 67 67 Retorna o valor de m que e 67 12 16 15 67 67 O valor de retorno e atribuıdo a maior 13 18 15 67 67 O maior numero e 67 14 20 15 67 67 Espera o pressionamento de alguma tecla 15 21 15 67 67 Fim da funcao main 56 Funcoes com Passagem de Parˆametro Podese pensar em parˆametros como dados de entrada de uma funcao sao informacoes ne cessarias para sua execucao Por exemplo para calcular a raiz quadrada de um numero devese passalo como parˆametro Para calcular a hipotenusa de um triˆangulo retˆangulo devese passar seus catetos como parˆametros Existem basicamente dois tipos de passagem de parˆametro em C i por valor e ii por referˆencia 561 Passagem de Parˆametro por Valor Significa que para a execucao da funcao chamada serao geradas copias dos valores de cada um dos parˆametros Seja o exemplo apresentado anteriormente em Listing 52 pag 57 verificar e imprimir o maior valor de dois numeros Na Figura 53 e feita uma representacao grafica de como ocorre uma passagem de parˆametros por valor apresentada no programa Figura 53 Ilustracao da chamada a funcao verifica maior com passagem de parˆametros por valor e seu retorno Suponha que os valores armazenados nas variaveis n1 e n2 por meio da execucao da linha 12 do programa foram respectivamente 15 e 67 Quando a linha 16 e executada esses valores sao copiados para as variaveis a e b pertencentes a funcao verifica maior Depois disso e verificado qual e o maior dos valores de a e b atribuindo a m o maior deles O resultado dessa comparacao e retornado a funcao main pela execucao da linha 33 onde o maior valor 67 e atribuıdo a variavel maior na funcao main No momento em que a funcao verifica maior chega ao fim as variaveis a b e m sao des truıdas 562 Passagem de Parˆametro por Referˆencia Na passagem de parˆametro por valor ocorre a copia dos valores dos parˆametros assim mo dificacoes na copia nao afetam o valor original da variavel na funcao que efetuou a chamada 59 Ja quando parˆametros sao passados por referˆencia a funcao chamada pode modificar o valor original da variavel Existem duas formas de passagem de parˆametro por referˆencia ponteiros e alias O primeiro e foco de estudo para uma proxima ocasiao sendo o segundo apresentado neste capıtulo Assim podese definir um alias como um apelido para a variavel passada como parˆametro Para utilizar esse tipo de passagem de parˆametro devese no prototipo da funcao e no cabecalho de definicao da funcao colocar um e comercial depois do tipo do parˆametro na chamada de funcao simplesmente mencionar o nome da variavel que sera passada por referˆencia da mesma forma que se faz na passagem de parˆametro por valor Assim qualquer alteracao no valor desse parˆametro no corpo da funcao chamada alterara o valor da variavel original na funcao chamadora Em Listing 53 e apresentado um programa que faz a troca de valores de duas variaveis Na Tabela 53 e apresentado seu teste de mesa Listing 53 Programa que mostra o uso de passagem de parˆametro por referˆencia 1 include iostream 2 include cstdlib 3 using namespace std 4 5 void troca int int P r o t o t i p o d a f u n c a o t r o c a 6 7 int main D e f i n i c a o d a f u n c a o m a i n 8 9 system cls C h a m a d a a f u n c a o p r e d e f i n i d a s y s t e m 10 11 int a9 b7 V a r i a v e i s l o c a i s a m a i n e s u a s a t r i b u i c o e s 12 13 cout Antesdatroca 14 cout a a endl 15 cout b b endl endl 16 17 troca a b C h a m a d a a f u n c a o t r o c a 18 19 cout Depoisdatroca 20 cout a a endl 21 cout b b endl 22 23 system pause C h a m a d a a f u n c a o p r e d e f i n i d a s y s t e m 24 return 0 25 26 27 void troca int x int y D e f i n i c a o d a f u n c a o t r o c a 28 29 int aux 30 60 31 aux x 32 x y 33 y aux 34 Tabela 53 Teste de mesa com valores 9 e 7 para as variaveis a e b Variaveis Observacoes Saıda a b x y aux 1 7 Definicao da funcao main 2 8 Inıcio da funcao main 3 9 Limpa a tela 4 11 9 7 5 13 9 7 Antes da troca 6 14 9 7 a 9 7 15 9 7 b 7 8 17 9 7 Chamada a funcao troca 9 27 9 7 Definicao e inıcio da funcao troca 10 29 9 7 lixo 11 31 9 7 9 12 32 7 7 9 13 33 7 9 9 14 34 7 9 9 Fim da funcao troca 15 17 7 9 Voltando da chamada a funcao 16 19 7 9 Depois da troca 17 20 7 9 a 7 18 21 7 9 b 9 19 23 7 9 Espera o pressionamento de alguma tecla 20 24 7 9 Fim da funcao main 61 CAPITULO 6 Estruturas Condicionais com Funcoes Um programa com funcoes e estruturas condicionais nada mais e do que um programa modu larizado ou seja dividido em partes que utiliza estruturas condicionais Seja o seguinte problema escrever um programa que receba do usuario duas datas no formato dd mm aaaa e determine caso exista qual e a data cronologicamente maior Caso as datas sejam iguais isso devera ser informado ao usuario Observacao vocˆe devera validar as datas antes de verificar qual e a maior 61 Pseudocodigo Utilizar modulos funcoes para resolver esse problema nos ajuda muito no raciocınio logico do programa Poderıamos pensar inicialmente na solucao em pseudocodigo apresentado na Figura 61 Figura 61 Pseudocodigo para verificar qual de duas datas entrada pelo usuario e a maior Nas proximas secoes sao apresentadas cada uma das partes desse pseudocodigo 62 62 Variaveis data1 e data2 sao desmembradas nas variaveis numericas inteiras dia1 mes1 ano1 dia2 mes2 e ano2 conforme Listing 61 Listing 61 C Declaracao de variaveis que representam as datas int dia1 mes1 ano1 dia2 mes2 ano2 63 Entrada de Dados Para realizar a entrada de dados na primeira data poderıamos escrever cout Primeira data cout Entre com a data no formato dd mm aaaa cin dia1 mes1 ano1 Para a segunda data poderıamos repetir esse trecho de codigo cout Segunda data cout Entre com a data no formato dd mm aaaa cin dia2 mes2 ano2 Verifique que ambos os trechos sao muito parecidos excetuandose principalmente pelos nomes das variaveis Sendo assim podemos definir uma funcao de entrada para uma data apresentada em Listing 62 Listing 62 C Funcao que realiza a entrada de uma data dia mes e ano com parˆametros passados por referˆencia void entradaData int dia int mes int ano cout Entrecomadatanoformatoddmmaaaa cin dia mes ano Perceba que os parˆametros da funcao sao dia mes e ano nesta ordem Mas a qual data eles se referem A primeira ou a segunda Isso vai depender de quais variaveis serao passadas por parˆametro na chamada a essa funcao Caso a chamada na main seja realizada conforme codigo de Listing 63 entao a entrada de dados sera realizada na primeira data Listing 63 C Chamada a funcao entradaData entradaData dia1 mes1 ano1 Verifique tambem que os parˆametros foram passados por referˆencia int dia int mes int ano Sabemos disso pelo antes do nome de cada parˆametro no cabecalho de definicao da funcao O que isso quer dizer Que qualquer alteracao no valor dessas variaveis alterara o valor das variaveis correspondentes na funcao que a chamou Outra observacao e que a funcao e do tipo void ou seja nao possui valor de retorno ou seja nao possui o comando return com algum valor 63 64 Validade das Datas Validar uma data significa verificar se o dia mˆes e ano estao corretos tanto individual quanto juntamente Por exemplo nao existe dia negativo ou zero e nem maior que 31 nao existe dia 31 do mˆes 9 nao existe dia 29 do mˆes 2 do ano 1900 pois 1900 nao e bissexto Como verificamos se uma data e valida Voltando ao pseudocodigo do inıcio deste capıtulo temos uma condicao se data1 e valida e data2 e valida entao Assim e melhor escrever definir uma funcao booleana que retorne verdadeiro true caso a data seja valida ou falso false caso contrario conforme pseudocodigo da Figura 62 Figura 62 Pseudocodigo da funcao que retorna verdadeiro caso uma data seja valida ou falso caso contrario Verifique que ha uma chamada a funcao bissexto no pseudocodigo que devemos definir re tornando um valor booleano A funcao validaData em C esta apresentada em Listing 64 O cabecalho da funcao bissexto e apresentado com o par de chaves mas sem as instrucoes do seu corpo Vocˆe devera pesquisar como se calcula um ano bissexto retornando verdadeiro caso seja ou falso caso contrario Verifique que na linha 19 a funcao bissexto e chamada retornando o seu valor de retorno Exemplo caso o ano seja bissexto a funcao bissexto retornara true para a instrucao da linha 19 que por ter um return retornara esse valor a funcao que a chamou que no nosso caso e a main 64 Listing 64 C Funcao validaData 1 bool validaData int dia int mes int ano 2 3 i f dia 1 dia 31 4 5 i f mes 1 mes 12 6 7 i f mes 9 mes 4 mes 6 mes 11 8 9 i f dia 30 10 return true 11 else 12 return false 13 14 else i f mes 2 15 16 i f dia 28 17 return true 18 else i f dia 29 19 return bissexto ano 20 else 21 return false 22 23 return true 24 25 else 26 return false 27 28 else 29 return false 30 31 32 bool bissexto int ano 33 34 35 65 Verificacao da Maior Data Na Figura 63 a seguir e apresentado um pseudocodigo para verificar qual das duas datas e a maior A funcao verificaMaiorData e apresentada em Listing 65 65 Figura 63 Pseudocodigo da funcao que verifica e imprime qual data e a maior Listing 65 C Funcao verificaMaiorData 1 void verificaMaiorData int dia1 int mes1 int ano1 2 int dia2 int mes2 int ano2 3 4 i f ano1 ano2 5 cout Data dia1 mes1 ano1 6 ecronologicamentemaior 7 else i f ano1 ano2 8 cout Data dia2 mes2 ano2 9 ecronologicamentemaior 10 else 11 12 i f mes1 mes2 13 cout Data dia1 mes1 ano1 14 ecronologicamentemaior 15 else i f mes1 mes2 16 cout Data dia2 mes2 ano2 17 ecronologicamentemaior 18 else 19 20 i f dia1 dia2 21 cout Data dia1 mes1 ano1 22 ecronologicamentemaior 23 else i f dia1 dia2 24 cout Data dia2 mes2 ano2 25 ecronologicamentemaior 26 else 66 27 cout Datasiguais 28 29 30 66 Juntando Tudo Agora que cada parte do pseudocodigo da Figura 61 pag 62 foi explicado e todas as funcoes necessarias definidas Listings 62 64 65 o programa completo e apresentado em Listing 66 Listing 66 C Programa que verifica qual data de duas e a maior Tambem valida as datas 1 includeiostream 2 using namespace std 3 4 P r o t o t i p o s d a s f u n c o e s 5 void entradaData int dia int mes int ano 6 bool validaData int dia int mes int ano 7 bool bissexto int ano 8 void verificaMaiorData int dia1 int mes1 int ano1 9 int dia2 int mes2 int ano2 10 11 int main 12 13 int dia1 mes1 ano1 dia2 mes2 ano2 14 15 entradaData dia1 mes1 ano1 16 entradaData dia2 mes2 ano2 17 18 i f validaData dia1 mes1 ano1 validaData dia2 mes2 ano2 19 20 verificaMaiorData dia1 mes1 ano1 dia2 mes2 ano2 21 22 else 23 cout Data1eoudata2invalidas 24 25 return 0 26 27 28 void entradaData int dia int mes int ano 29 30 cout Entrecomadatanoformatoddmmaaaa 31 cin dia mes ano 32 33 34 bool validaData int dia int mes int ano 35 36 i f dia 1 dia 31 37 38 i f mes 1 mes 12 67 39 40 i f mes 9 mes 4 mes 6 mes 11 41 42 i f dia 30 43 return true 44 else 45 return false 46 47 else i f mes 2 48 49 i f dia 28 50 return true 51 else i f dia 29 52 return bissexto ano 53 else 54 return false 55 56 return true 57 58 else 59 return false 60 61 else 62 return false 63 64 65 bool bissexto int ano 66 67 e s c r e v a o c o d i g o a q u i 68 69 70 void verificaMaiorData int dia1 int mes1 int ano1 71 int dia2 int mes2 int ano2 72 73 i f ano1 ano2 74 cout Data dia1 mes1 ano1 75 ecronologicamentemaior 76 else i f ano1 ano2 77 cout Data dia2 mes2 ano2 78 ecronologicamentemaior 79 else 80 81 i f mes1 mes2 82 cout Data dia1 mes1 ano1 83 ecronologicamentemaior 84 else i f mes1 mes2 85 cout Data dia2 mes2 ano2 86 ecronologicamentemaior 87 else 88 89 i f dia1 dia2 68 90 cout Data dia1 mes1 ano1 91 ecronologicamentemaior 92 else i f dia1 dia2 93 cout Data dia2 mes2 ano2 94 ecronologicamentemaior 95 else 96 cout Datasiguais 97 98 99 69 CAPITULO 7 Estruturas de Repeticao Existem situacoes em que e necessario repetir um determinado trecho de codigo uma quantidade fixa de vezes Por exemplo na Figura 71 a seguir para fazer o passaro vermelho do Angry Birds chegar ao porco devese repetir 5 vezes o bloco de comando avance Ja na Figura 72 devese fazer a Anna do filme Frozen desenhar um quadrado no gelo Para isso deve repetir 4 vezes os comandos avance por 100 pixels e vire a direita por 90 graus Figura 71 Uso de estrutura de repeticao com quantidade fixa de vezes no Code Studio com o tema Angry Birds Fonte httpsstudiocodeorghoc6 Alem de repetir um trecho de codigo uma quantidade fixa de vezes tambem ha situacoes em que e necessario repetir um determinado trecho de codigo ate que algo aconteca como na Figura 73 em que devese repetir o comando avance ate que o passaro alcance o porco 70 Figura 72 Uso de estrutura de repeticao com quantidade fixa de vezes no Code Studio com o tema Frozen Fonte httpsstudiocodeorgsfrozenstage1puzzle4 Figura 73 Uso de estrutura de repeticao ate que algo aconteca no Code Studio com o tema Angry Birds Fonte httpsstudiocodeorghoc10 Assim toda vez que se identifica um comportamento de repeticao seja explıcito ou nao deve 71 se utilizar as estruturas de repeticao para generalizar tal comportamento empregando assim uma correta logica de programacao Caso o programador nao utilize essas estruturas estara repetindo trechos de codigos varias vezes o que e trabalhoso deselegante e muitas vezes inviavel C possui trˆes tipos de estruturas de repeticao tambem chamadas de loops ou lacos 1 do while recomendado quando ha um numero indeterminado de repeticoes sendo que o teste da expressao condicional e realizado no final da repeticao 2 while tambem recomendado quando ha um numero indeterminado de repeticoes O teste da expressao condicional e realizado no inıcio da repeticao 3 for recomendado quando ha um numero determinado de repeticoes Apesar de cada laco ter a sua recomendacao todo problema pode ser resolvido com qualquer laco Existem diferencas entre eles como na sintaxe e em seu proprio uso 71 O Laco do while O laco do while cria um ciclo repetido i ate que a expressao de teste seja falsa ou ii enquanto a expressao de teste for verdadeira Verifique que o teste de condicao e avaliado depois do corpo do laco ser executado Assim o corpo do laco do while e executado pelo menos uma vez Atencao Nao esqueca do pontoe vırgula apos o fechamento do parˆentese Listing 71 C Forma geral do laco do while do c o r p o d o l a c o instrucao while expressao condicional 711 Exemplo Usando o Laco do while Seja o programa apresentado em Listing 72 que calcula a area de um triˆangulo a partir de uma base e uma altura passados pelo usuario Listing 72 C Programa que calcula a area de um triˆangulo 1 int main 2 3 4 float area base altura 5 6 cout Calculodaareadetriangulo 7 8 cout Entrecomabase 9 cin base 10 cout Entrecomaaltura 72 11 cin altura 12 13 area base altura 2 14 15 cout Resultado area 16 17 system pause0 18 return 0 19 Agora se o usuario desejar calcular a area de outro triˆangulo ele devera executar novamente o programa Sera que existe uma forma de se calcular a area de outro triˆangulo sem ter que executar novamente o programa Sim escrevendose o que se quer repetir no caso as instrucoes das linhas 8 a 15 de Listing 72 no corpo de um laco de preferˆencia do do while e antes de acabar o corpo do laco fazer uma pergunta ao usuario do tipo Deseja calcular a area de outro triˆangulo sn e tendose resp s como condicao do laco conforme programa apresentado em Listing 73 Listing 73 C Programa que calcula a area de um triˆangulo enquanto o usuario desejar 1 int main 2 3 4 float area base altura 5 char resp 6 7 cout Calculodaareadetriangulo 8 9 do 10 cout Entrecomabase 11 cin base 12 cout Entrecomaaltura 13 cin altura 14 15 area base altura 2 16 17 cout Resultado area 18 19 cout Desejacalcularaareadeoutrotriangulosn 20 cin resp 21 while resp s 22 23 system pause0 24 return 0 25 Verifique que o corpo do laco do while e executado pelo menos uma vez a primeira antes da verificacao da condicao do laco resp s Acompanhe seu teste de mesa na Tabela 71 Tabela 71 Teste de mesa para o programa de area de triˆangulos Variaveis Condicao Saıda area base altura resp resp s 1 4 lixo lixo lixo 2 5 lixo lixo lixo lixo 3 7 lixo lixo lixo lixo Calculo da area de triangulo 4 10 lixo lixo lixo lixo Entre com a base 5 11 lixo 10 lixo lixo 6 12 lixo 10 lixo lixo Entre com a altura 7 13 lixo 10 5 lixo 8 15 25 10 5 lixo 9 17 25 10 5 lixo Resultado 25 10 19 25 10 5 lixo Deseja calcular a area de outro triangulo 11 20 25 10 5 s 12 21 25 10 5 s V 13 10 25 10 5 s Entre com a base 14 11 25 20 5 s 15 12 25 20 5 s Entre com a altura 16 13 25 20 3 s 17 15 30 20 3 s 18 17 30 20 3 s Resultado 30 19 19 30 20 3 s Deseja calcular a area de outro triangulo 20 20 30 20 3 n 21 21 30 20 3 n F 22 23 30 20 3 n Espera o pressionamento de alguma tecla 712 Outro Exemplo Usando o Laco do while Seja o programa apresentado a seguir em Listing 74 que repete um menu de opcoes e executa o codigo correspondente a opcao ate que o usuario digite 0 para sair Se o usuario digitar a opcao 1 o programa imprimira Bom dia Se ele escolher a opcao 2 o programa imprimira Boa noite Se escolher algo diferente de 1 2 ou 0 imprimira Opcao invalida Toda vez que escolher uma opcao diferente de 0 o menu e impresso novamente ao usuario para que escolha outra opcao Quando o usuario digitar 0 a condicao op 0 se tornara falsa e o corpo do laco nao sera mais repetido Listing 74 C Programa que repete um menu de opcoes ate que o usuario digite 0 para sair 1 int main 2 3 int op 4 5 do 6 cout MENU 7 cout 1Frase1 8 cout 2Frase2 9 cout 0Sair 10 cin op 11 12 switch op 13 14 case 1 cout Bomdia break 15 case 2 cout Boanoite break 16 case 0 cout Saindo break 17 default cout Opcaoinvalida 18 19 while op 0 20 21 system pause 22 return 0 23 72 O Laco while Um outro laco bastante utilizado em C e o while que funciona da seguinte forma se a expressao condicional for verdadeira o corpo do laco while e executado uma vez e a expressao de teste e avaliada novamente Quando ha uma unica instrucao no corpo do laco while nao e necessario o uso de chaves como em Listing 75 porem quando ha mais de uma instrucao e obrigatorio seu uso como em Listing 76 75 Listing 75 C Forma geral do laco while com apenas uma unica instrucao no corpo do laco while expressao condicional instrucao c o r p o d o l a c o Listing 76 C Forma geral do laco while com mais de uma instrucao no corpo do laco Verifique o uso obrigatorio das chaves while expressao condicional c o r p o d o l a c o instrucao1 instrucao2 instrucaon O ciclo de teste e execucao e repetido ate que a expressao de teste se torne falsa Entao a execucao do laco termina e o controle do programa passa para a linha seguinte ao laco Verifique que no laco while a expressao condicional pode ser falsa na primeira vez nunca executando as instrucoes do corpo do laco Essa e a principal diferenca com o laco do while em que o corpo do laco e executado pelo menos uma vez independente de sua expressao condicional resultar em verdadeira ou falsa 721 Exemplo Usando o Laco while Seja o seguinte problema calcular e imprimir a tabuada do 4 Verifique na Figura 74 que o multiplicador varia de 0 a 10 de 1 em 1 O produto e resultado de 4 multiplicador Figura 74 Tabuada do 4 Assim podemos utilizar um laco em que o multiplicador inicia em zero e a expressao condicional do laco e multiplicador 10 escrevendose no corpo do laco o calculo e a impressao da multi plicacao e no final o incremento do multiplicador conforme o programa apresentado em Listing 77 com teste de mesa apresentado na Tabela 72 Listing 77 C Programa da tabuada do 4 utilizando o laco while 76 1 int main 2 3 int multiplicador prod 4 5 cout Tabuadado4 6 multiplicador 0 i n i c i a l i z a c a o 7 while multiplicador 10 e x p r e s s a o c o n d i c i o n a l 8 9 prod 4 multiplicador 10 cout 4x multiplicador prod 11 multiplicador i n c r e m e n t o 12 13 system pause0 14 return 0 15 Tabela 72 Teste de mesa para o programa da tabuada do 4 que utiliza while Variaveis Condicao Saıda multiplicador prod mltiplicador 10 1 3 lixo lixo 2 5 lixo lixo Tabuada do 4 3 6 0 lixo 4 7 0 lixo V 5 9 0 0 6 10 0 0 4 x 0 0 7 11 1 0 8 7 1 0 V 9 9 1 4 10 10 1 4 4 x 1 4 11 11 2 4 7 10 36 V 9 10 40 10 10 40 4 x 10 40 11 11 40 7 11 40 F 13 11 40 Espera o pressionamento de tecla Uma tabela mais simples do que a do teste de mesa que pode ser utilizada para entender o funcionamento de um algoritmo com estruturas de repeticao e aquela em que se colocam os valores das variaveis apos cada iteracao passo ou repeticao do laco conforme a Tabela 73 a seguir 77 Tabela 73 Tabela de iteracoes correspondente ao programa da tabuada do 4 apresentado em Listing 77 multiplicador prod Apos a 1a iteracao 1 0 Apos a 2a iteracao 2 4 Apos a 3a iteracao 3 8 Apos a 4a iteracao 4 12 Apos a 5a iteracao 5 16 Apos a 6a iteracao 6 20 Apos a 7a iteracao 7 24 Apos a 8a iteracao 8 32 Apos a 9a iteracao 9 36 Apos a 10a iteracao 10 40 722 Outro Exemplo Usando o Laco while Suponha que se deseje calcular a media de idades de um numero nao determinado de pessoas em que o usuario digita uma idade invalida 0 ou um numero negativo quando deseja encerrar a entrada das idades A solucao para esse problema esta em Listing 78 a seguir Verifique que para se calcular a media de idades de uma certa quantidade de pessoas devese calcular a soma das idades e saber qual e essa quantidade de pessoas Lembrese que se o usuario digitar uma idade invalida na primeira vez que e a condicao de parada do laco essa quantidade e zero e nao se pode realizar divisao por zero Verifique tambem que mesmo a variavel media sendo do tipo float devese utilizar o casting float para converter o valor de soma para float visto que soma e quant sao do tipo int Seus testes de mesa estao nas Tabelas 74 e 75 A tabela de iteracoes correspondente ao primeiro teste de mesa esta na Tabela 76 Listing 78 C Programa que calcula a media de idades de uma quantidade nao determinada de pessoas 1 int main 2 3 int idade soma quant 4 float media 5 6 cout Entrecomumaidade 7 cin idade 8 9 soma 0 10 quant 0 11 12 while idade 0 13 14 soma soma idade 15 quant 16 17 cout Entrecomoutraidade 78 18 cin idade 19 20 21 i f quant 0 22 cout Naohouveentradavalida 23 else 24 25 media float soma quant 26 cout Amediadasidadese media 27 28 29 system pause0 30 return 0 31 Verifique que na linha 14 foi utilizada a variavel acumuladora soma para somar as idades validas Note que ha uma semelhanca muito grande com contadores A unica diferenca e que na acumulacao o valor adicionado pode variar variavel idade no exemplo enquanto que na contagem o valor adicionado e constante geralmente 1 Tabela 74 Teste de mesa do programa apresentado em Listing 78 com uma unica entrada zero Variaveis Condicoes Saıda idade soma quant media idade 0 quant 0 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Entre com uma idade 4 7 0 lixo lixo lixo 5 9 0 0 lixo lixo 6 10 0 0 0 lixo 7 12 0 0 0 lixo F 8 21 0 0 0 lixo V 9 22 0 0 0 lixo Nao houve entrada valida 10 29 0 0 0 lixo Espera o pressionamento de alguma tecla 79 Tabela 75 Teste de mesa do programa apresentado em Listing 78 com as entradas 12 20 18 e 0 Variaveis Condicoes Saıda idade soma quant media idade 0 quant 0 1 3 lixo lixo lixo 2 4 lixo lixo lixo lixo 3 6 lixo lixo lixo lixo Entre com uma idade 4 7 12 lixo lixo lixo 5 9 12 0 lixo lixo 6 10 12 0 0 lixo 7 12 12 0 0 lixo V 8 14 12 12 0 lixo V 9 15 12 12 1 lixo 10 17 12 12 1 lixo Entre com outra idade 11 18 20 12 1 lixo 12 12 20 12 1 lixo V 13 14 20 32 1 lixo 14 15 20 32 2 lixo 15 17 20 32 2 lixo Entre com outra idade 16 18 18 32 2 lixo 17 12 18 32 2 lixo V 18 14 18 50 2 lixo 19 15 18 50 3 lixo 20 17 18 50 3 lixo Entre com outra idade 21 18 0 50 3 lixo 22 12 0 50 3 lixo F 23 21 0 50 3 lixo F 24 25 0 50 3 1666 25 26 0 50 3 1666 A media de idades e 1666 26 29 0 50 3 1666 Espera o pressionamento de qualquer tecla Tabela 76 Tabela de iteracoes correspondente ao programa de Listing 78 com o teste correspon dente ao da Tabela 75 soma quant Apos a 1a iteracao 12 1 Apos a 2a iteracao 32 2 Apos a 3a iteracao 50 3 73 O Laco for O laco for engloba trˆes expressoes em uma unica e e util principalmente quando se quer repetir algo uma quantidade fixa de vezes A forma geral do laco for com uma unica instrucao no corpo do laco e apresentada em Listing 79 Ja a forma geral do laco for com mais de uma instrucao a ser executada no corpo do laco sendo obrigatorio o uso das chaves esta apresentada em Listing 710 Listing 79 C Forma geral do laco for com apenas uma unica instrucao no corpo do laco for i n i c i a l i z a c a o expressao condicional in decremento instrucao c o r p o d o l a c o 80 Listing 710 C Forma geral do laco for com mais de uma instrucao no corpo do laco for i n i c i a l i z a c a o expressao condicional in decremento c o r p o d o l a c o instrucao1 instrucao2 instrucaon Devese usar chaves se o corpo do laco tiver mais de uma instrucao Os parˆenteses seguindo a palavrachave for contˆem trˆes expressoes separadas por pontosevırgulas 1 Inicializacao em sua forma mais simples e uma instrucao de atribuicao multiplicador 0 na linha 6 em Listing 711 e e sempre executada uma unica vez antes do laco ser iniciado 2 Expressao condicional e uma instrucao de condicao que controla o laco multiplicador10 na linha 6 em Listing 711 Essa expressao e avaliada como verdadeira ou falsa toda vez que o laco for iniciado ou reiniciado Se verdadeira o corpo do laco e executado Quando a expressao tornarse falsa o laco e terminado e o controle passa para a instrucao seguinte ao laco 3 indecremento define a maneira como a variavel de controle do laco sera alterada cada vez que o laco e repetido multiplicador na linha 6 em Listing 711 que pode ser um incremento ou decremento Essa instrucao e executada toda vez imediatamente apos a execucao do corpo do laco 731 Exemplo Usando o Laco for Seja o problema do calculo e impressao da tabuada do 4 visto anteriormente na Secao 721 do laco while pagina 76 Esse e um problema em que o laco for se adequa melhor pois existe um numero fixo de repeticoes O programa utilizando o laco for e apresentado em Listing 711 Seu teste de mesa e apresentado na Tabela 77 A tabela de iteracoes e a mesma do laco while apresentada anteriormente na Tabela 73 Listing 711 C Resolucao da tabuada do 4 usando o laco for 1 int main 2 3 int multiplicador prod 4 5 cout Tabuadado4 6 for multiplicador 0 multiplicador 10 multiplicador 7 8 prod 4 multiplicador 9 cout 4x imultiplicador prod 10 11 system pause0 12 return 0 13 81 Tabela 77 Teste de mesa para o programa da tabuada do 4 utilizando o laco for Variaveis Condicao Saıda multiplicador prod multiplicador 10 1 3 lixo lixo 2 5 lixo lixo Tabuada do 4 3 6 0 lixo V 4 8 0 0 5 9 0 0 4 x 0 0 6 6 1 0 V 7 8 1 4 8 9 1 4 4 x 1 4 9 6 2 4 V 10 8 2 8 11 9 2 8 4 x 2 8 6 10 36 V 8 10 50 9 10 50 4 x 10 40 6 11 40 F 11 11 40 Espera o pressionamento de alguma tecla O laco while pode utilizar os mesmos elementos do laco for mas eles sao distribuıdos de maneira diferente no programa Em geral um laco while pode substituir um laco for na forma apresentada em Listing 712 Listing 712 C Como o laco while pode substituir o laco for i n i c i a l i z a c a o while expressao condicional in decremento 732 Outro Exemplo Usando o Laco for Seja o seguinte problema calcular a media de idades de 10 pessoas Esse tambem e um problema com uma quantidade fixa de repeticoes sendo o laco for mais recomendado Sao 10 entradas de idades por isso podemos utilizar uma variavel chamada quant para controlar a entrada e o somatorio das idades O programa que resolve esse problema e apresentado em Listing 713 a seguir Na Tabela 78 e apresentada a tabela de iteracoes com as entradas 2 8 38 39 5 40 30 18 45 e 60 nesta ordem 82 Listing 713 C Programa que calcula a media de idades de 10 pessoas utilizando o laco for 1 int main 2 3 int idade soma0 quant1 4 5 for quant1 quant 10 quant 6 7 cout Entrecoma quant aidade 8 cin idade 9 soma soma idade 10 11 media float soma quant 12 cout Amediadeidadesdas10pessoase media 13 system pause0 14 return 0 15 Tabela 78 Tabela de iteracoes correspondente ao programa da media de 10 idades apresentado em Listing 713 idade soma quant Apos a 1a iteracao 2 2 2 Apos a 2a iteracao 8 10 3 Apos a 3a iteracao 38 48 4 Apos a 4a iteracao 39 87 5 Apos a 5a iteracao 5 92 6 Apos a 6a iteracao 40 132 7 Apos a 7a iteracao 30 162 8 Apos a 8a iteracao 18 180 9 Apos a 9a iteracao 45 225 10 Apos a 10a iteracao 60 285 11 83 74 Estruturas de Repeticao com Funcoes Nesta secao e apresentado um exemplo de um programa cuja parte principal e um laco e cujas entradas de dados que tambem utilizam lacos sao implementadas como funcoes 741 O Problema Seja o seguinte problema uma pesquisa sobre algumas caracterısticas fısicas da populacao de uma determinada regiao coletou os seguintes dados referentes a cada habitante para serem analisados idade em anos seu programa nao devera aceitar idade negativa e nem idade superior a 150 anos sexo M masculino F feminino devera haver uma funcao que faca a entrada do sexo juntamente com sua validacao cor dos olhos A azuis V verdes C castanhos devera haver uma funcao que faca a entrada da cor dos olhos juntamente com sua validacao cor dos cabelos L louros C castanhos P pretos devera haver uma funcao que faca a entrada da cor dos cabelos juntamente com sua validacao Para cada habitante deverao ser digitados todos esses dados e a ultima entrada que nao cor responde a ninguem contera o valor de idade igual a 0 Assim faca um programa que determine e escreva a maior idade dos habitantes a porcentagem de mulheres com cor de olhos azuis ou verdes mas que tenham cabelos pretos 742 O Pseudocodigo Basicamente o algoritmo para resolver o problema segue o pseudocodigo apresentado na Figura 75 a seguir Repare que foram escritas todas as variaveis utilizadas lembrando que na hora de programar devemos escrever seus tipos de dados Verifique que a todos os contadores quant quantMulheres quantMulheresCat foram atribuıdos o valor inicial zero senao ficam com valor de lixo da memoria A variavel maiorIdade recebe o valor inicial zero pois deve receber um valor muito baixo para ser trocado pela primeira idade valida pela primeira vez Atencao as entradas em idade sexo cor de olhos e cor de cabelos devem ser realizadas em funcoes que ja retornam os valores validos para cada uma delas Os pseudocodigos para as funcoes de entrada em idade e em sexo sao apresentados nas Figuras 76 e 77 As funcoes de entrada para cor de cabelhos e cor de olhos sao similares a funcao de entrada em sexo Verifique o uso dos operadores logicos fazendo tabelasverdade Repare que ao final do laco devese entrar novamente com uma idade para ser verificada pela condicao do laco 84 Figura 75 Pseudocodigo do modulo principal que utiliza estruturas de repeticao com funcoes Figura 76 Pseudocodigo do modulo de entrada em idade com validacao 743 O Programa Em Listing 714 e apresentado um programa correspondente ao pseudocodigo da Figura 75 85 Figura 77 Pseudocodigo do modulo de entrada em sexo com validacao Listing 714 C 1 includeiostream 2 using namespace std 3 4 P r o t o t i p o s d a s f u n c o e s 5 int entradaIdade 6 char entradaSexo 7 char entradaCorOlhos 8 char entradaCorCabelos 9 10 int main 11 12 int idade maiorIdade quant quantMulheres quantMulheresCat 13 char sexo corOlhos corCabelos 14 15 maiorIdade 0 quant 0 quantMulheres 0 quantMulheresCat 0 16 17 idade entradaIdade 18 19 while idade 0 20 21 sexo entraSexo 22 corOlhos entradaCorOlhos 23 corCabelos entradaCorCabelos 24 25 quant 26 27 i f idade maiorIdade 28 maiorIdade idade 29 i f sexo f 30 31 quantMulheres 32 i f corOlhos a corOlhos v 33 corCabelos p 34 quantMulheresCat 35 36 86 37 idade entradaIdade 38 39 40 i f quant 0 41 cout Naohouvedadosvalidos 42 else 43 cout Amaioridadeentretodososhabitantese 44 maiorIdade 45 i f quantMulheres 0 46 cout Naohouvemulhercadastrada 47 else 48 cout Aporcentagemdemulherescomcordeolhosazuisou 49 verdesecabelospretose 50 float quantMulheresCatquantMulheres 100 51 52 53 return 0 54 55 56 int entradaIdade 57 58 int idade 59 60 cout Entrecomumaidadede0a1500parasair 61 cin idade 62 while idade 0 idade 150 63 64 cout Idadeinvalida 65 cout Entrecomumaidadede0a1500parasair 66 cin idade 67 68 return idade 69 70 71 char entradaSexo 72 73 char sexo 74 75 do 76 cout Entrecomosexofemininooumasculino 77 cin sexo 78 i f sexo f sexo m 79 80 cout Sexoinvalido 81 cout Entrecomosexofemininooumasculino 82 cin sexo 83 84 while sexo f sexo m 85 86 return sexo 87 87 88 89 char entradaCorOlhos 90 91 char corOlhos 92 93 do 94 cout Entrecomacordosolhosazuisverdesou 95 castanhos 96 cin corOlhos 97 i f corOlhos a corOlhos v corOlhos c 98 99 cout Corinvalida 100 cout Entrecomacordosolhosazuisverdesou 101 cout castanhos 102 cin corOlhos 103 104 while corOlhos a corOlhos v corOlhos c 105 106 return corOlhos 107 108 109 char entradaCorCabelos 110 111 char corCabelos 112 113 do 114 cout Entrecomacordoscabeloslouroscastanhos 115 oupretos 116 cin corCabelos 117 i f corCabelos l corCabelos c corCabelos p 118 119 cout Corinvalida 120 cout Entrecomacordoscabeloslouros 121 castanhosoupretos 122 cin corCabelos 123 124 while corCabelos l corCabelos c corCabelos p 125 126 return corCabelos 127 88 CAPITULO 8 Vetores Imagine o seguinte problema calcular a media aritmetica das notas de provas de cinco alunos Assim poderseia escrever o programa apresentado em Listing 81 Listing 81 C Programa que calcula a media de notas de cinco alunos utilizandose uma variavel para cada nota includeiostream using namespace std int main float nota1 nota2 nota3 nota4 nota5 media cout Digiteanotadoaluno1 cin nota1 cout Digiteanotadoaluno2 cin nota2 cout Digiteanotadoaluno3 cin nota3 cout Digiteanotadoaluno4 cin nota4 cout Digiteanotadoaluno5 cin nota5 media nota1nota2nota3nota4nota5 5 cout Mediadasnotas media return 0 Imagine agora se se pretendesse encontrar a media aritmetica das notas de uma classe de 50 alunos ou da escola toda com 2000 alunos Seria uma tarefa bastante volumosa Ou talvez vocˆe pense na solucao do programa apresentado em Listing 82 em que ha a de claracao de uma variavel chamada nota e fazendo a entrada de dados em um laco nessa mesma 89 variavel ha o acumulo da soma de notas na variavel soma Qual o problema com essa solucao E que a cada iteracao do laco a nota e substituıda por outra e vocˆe perde os valores das notas caso necessite acessalas mais tarde Listing 82 C Programa que calcula a media de notas de cinco alunos utilizandose apenas uma variavel para armazenar a nota de todos os alunos uma por vez includeiostream using namespace std int main float nota media soma00 cout Entrecom5notas for int cont 1 cont 5 cont cout Entrecoma cont1 anota cin nota soma soma nota media soma 5 cout Mediadasnotas media return 0 E evidente que e necessaria uma maneira conveniente para referenciar tais colecoes de dados similares Vetor e um tipo de dado oferecido para esse proposito 81 Definicao de Vetor Um vetor e um conjunto de variaveis capazes de armazenar varios valores do mesmo tipo Cada um desses valores e identificado pelo mesmo nome o nome dado ao vetor sendo diferenciado apenas por um ındice Os ındices utilizados em C para identificar as posicoes de um vetor comecam sempre em 0 e vao ate o tamanho do vetor menos um 90 82 Declaracao de Vetor A declaracao de um vetor segue o seguinte formato tipo nomeDoVetor numeroMaximoDePosicoes Verifique o Exemplo 81 a seguir que apresenta um vetor de 5 elementos do tipo real Exemplo 81 C Exemplo de vetor de numeros reais com cinco posicoes float notas5 O vetor chamado notas possui 5 posicoes comecando pelo ındice 0 e indo ate o ındice 4 tamanhodovetor 1 Em cada posicao poderao ser armazenados numeros reais conforme es pecificado pelo tipo float na declaracao Exemplo 0 1 2 3 4 65 40 90 60 85 83 Acesso a um Elemento do Vetor Para acessar um elemento do vetor devese utilizar o nome do vetor e indicar o ındice entre o par de colchetes Assim nomeDoVetor ındice Verifique o Exemplo 82 que apresenta o acesso a elementos de um vetor Exemplo 82 C Alguns acessos de elementos do vetor notas Para acessar o terceiro elemento notas2 com valor 90 Para acessar o primeiro elemento notas0 com valor 65 Qual o valor de notas5 Nao existe pois nao ha o ındice 5 que seria o sexto elemento Qual o valor de notas4 85 84 Um Exemplo de Programa Utilizando um Vetor A seguir e apresentado um programa Listing 83 que calcula a media de notas de cinco alunos utilizando um vetor Verifique que o acumulo da soma e realizado dentro do laco e a media e calculada fora dele Seu teste de mesa e apresentado na Tabela 81 91 Listing 83 C Programa que calcula a media de cinco alunos utilizando um vetor 1 include iostream 2 using namespace std 3 4 int main 5 6 float notas 5 soma media 7 int i 8 9 soma 0 10 for i 0 i 5 i 11 12 cout Digiteanotadoaluno i1 13 cin notas i 14 soma soma notas i 15 16 media soma 5 17 cout Mediadasnotas media 18 system pause 19 return 0 20 Tabela 81 Teste de mesa para o programa de media de notas de cinco alunos usando um vetor Suponha que os valores a serem inseridos no vetor sao na ordem 65 40 90 60 e 85 Variaveis Condicao Saıda notas soma media i i 5 0 1 2 3 4 1 6 lixo lixo lixo lixo lixo lixo lixo 2 7 lixo lixo lixo lixo lixo lixo lixo lixo 3 9 lixo lixo lixo lixo lixo 0 lixo lixo 4 10 lixo lixo lixo lixo lixo 0 lixo 0 V 5 12 lixo lixo lixo lixo lixo 0 lixo 0 Digite a nota do aluno 1 6 13 65 lixo lixo lixo lixo 0 lixo 0 7 14 65 lixo lixo lixo lixo 65 lixo 0 8 10 65 lixo lixo lixo lixo 65 lixo 1 V 9 12 65 lixo lixo lixo lixo 65 lixo 1 Digite a nota do aluno 2 10 13 65 40 lixo lixo lixo 65 lixo 1 11 14 65 40 lixo lixo lixo 105 lixo 1 12 10 65 40 lixo lixo lixo 105 lixo 2 V 13 12 65 40 lixo lixo lixo 105 lixo 2 Digite a nota do aluno 3 14 13 65 40 90 lixo lixo 105 lixo 2 15 14 65 40 90 lixo lixo 195 lixo 2 16 10 65 40 90 lixo lixo 195 lixo 3 V 17 12 65 40 90 lixo lixo 195 lixo 3 Digite a nota do aluno 4 18 13 65 40 90 60 lixo 195 lixo 3 19 14 65 40 90 60 lixo 255 lixo 3 20 10 65 40 90 60 lixo 255 lixo 4 V 21 12 65 40 90 60 lixo 255 lixo 4 Digite a nota do aluno 5 22 13 65 40 90 60 85 255 lixo 4 23 14 65 40 90 60 85 340 lixo 4 24 10 65 40 90 60 85 340 lixo 5 F 25 16 65 40 90 60 85 340 68 5 26 17 65 40 90 60 85 340 68 5 A media das notas e 68 27 18 65 40 90 60 85 340 68 5 Espera o pressionamento de tecla 92 85 Funcoes Passando Vetor como Parˆametro Nesta secao e apresentado um programa que define funcoes que tˆem vetor como parˆametro Esse programa modularizado esta apresentado a seguir em Listing 84 com os seguintes passos 1 Inicializa um vetor de 10 posicoes com valores do tipo real inseridos pelo usuario 2 Imprime o vetor separando cada elemento por um espaco em branco 3 Verifica se o vetor esta ordenado emitindo mensagem apropriada 4 Caso nao esteja ordena seus elementos e os imprime 93 Quando se define funcoes em que um vetor e passado como parˆametro devese ter em mente duas informacoes 1 Escrever o nome do vetor na chamada a funcao como nas linhas 14 15 17 22 e 23 de Listing 84 2 Declarar o vetor no cabecalho de definicao da funcao como nas linhas 28 35 49 e 69 de Listing 84 Listing 84 C Programa modularizado com funcoes 1 includeiostream 2 using namespace std 3 4 P r o t o t i p o s d a s f u n c o e s 5 void entradaVetor float vet 6 void ordena float vet 7 bool estahOrdenado float vet 8 void imprimeVetor float vet 9 10 int main 11 12 float vet 1 0 13 14 entradaVetor vet 15 imprimeVetor vet 16 17 i f estahOrdenado vet 18 cout Vetorestaordenado 19 else 20 21 cout Vetornaoestaordenado 22 ordena vet 23 imprimeVetor vet 24 25 return 0 26 27 28 void entradaVetor float vet 29 30 cout Entrecom10valoresreais 31 for int i 0 i 10 i 32 cin vet i 33 34 35 void imprimeVetor float vet 36 37 cout Vetor 38 for int i 0 i 10 i 39 cout vet i 40 41 94 42 void troca float a float b 43 44 int aux a 45 a b 46 b aux 47 48 49 void ordena float vet 50 51 int iMenor 52 float menor 53 54 for int quant1 quant9 quant 55 56 iMenor quant 1 57 menor vet iMenor 58 for int iquant i 10 i 59 i f vet i menor 60 61 menor vet i 62 iMenor i 63 64 troca vet quant 1 vet iMenor 65 66 67 68 69 bool estahOrdenado float vet 70 71 for int i 0 i 9 i 72 i f vet i vet i 1 73 return false 74 return true 75 95 CAPITULO 9 Strings Strings sao utilizadas para representar sequˆencias de caracteres como frases nomes de pessoas cidades ruas paıses etc O conteudo deste capıtulo possui varias informacoes novas mas o uso de strings foi empregado desde as primeiras aulas quando se imprimia uma frase com o uso do comando cout No exemplo a seguir tudo o que esta entre as aspas e uma string mas e uma string constante cout Digite sua idade Entretanto algumas vezes houve a necessidade de se armazenar strings em variaveis como por exemplo o nome de uma pessoa o nome de uma cidade ou ate mesmo uma frase 91 Definicao de String Uma string e um vetor de caracteres terminado por um caracter nulo Um caracter nulo e especi ficado como 0 lˆese barra zero 92 Declaracao de String Assim a declaracao de uma string e char nomeDaString tamanhoMaximo E preciso declarar vetores de caracteres como sendo um caracter mais longo que a maior string que eles devem guardar Por exemplo para declarar um vetor s que guarda uma string de 10 caracteres devese escrever char s11 Isso reserva espaco para o caracter nulo no final da string 96 93 Alguns ComandosFuncoes com Strings Apesar de uma string ser um vetor sua manipulacao difere de vetores numericos em varias situacoes como na leitura impressao copia e comparacao Tarefa Comandos Leitura cin nomeDaString ou getsnomeDaString Impressao cout nomeDaString Copia de uma string s2 em outra s1 strcpys1 s2 Comparacao entre duas strings strcmps1 s2 Calculo do tamanho de uma string strlennomeDaString Para a leitura em uma string existem duas opcoes o comando cin caso a string nao possua espacos em branco ou a funcao gets da biblioteca cstdio caso contrario Em qualquer caso o usuario pode entrar com a string inteira finalizando com a tecla ENTER Mesmo declarando um tamanho maximo de string o usuario podera entrar com caracteres a mais Assim e o programador quem deve prever o tamanho maximo para que este nao seja ultrapassado Na impressao o comando cout imprime todos os caracteres ate encontrar o caracter de fim de string o 0 Para comparar copiar e encontrar o tamanho de uma string sao utilizadas as seguintes funcoes respectivamente strcmp strcpy e strlen todas da biblioteca cstring A funcao strcmp retorna 0 se as strings sao iguais e diferente de 0 caso contrario Ja a strlen retorna o tamanho de uma string que nao e o tamanho maximo especificado na declaracao verificando quantos caracteres existem antes do caracter nulo 94 Um Exemplo Utilizando String Seja o seguinte problema escreva um programa que peca ao usuario o nome de um mˆes Faca a abreviacao desse nome copiando em uma outra string seus trˆes primeiros caracteres seguidos de um ponto Imprima o mˆes abreviado O programa correspondente a esse problema esta apresentado em Listing 91 Listing 91 C Programa em que o desenvolvedor monta uma string caracter a caracter 1 includeiostream 2 using namespace std 3 4 const int MAX CHAR MES 15 Q u a n t i d a d e m a x i m a d e 5 c a r a c t e r e s p a r a o m e s 6 MAX CHAR ABREV 3 P a r a o s 3 p r i m e i r o s c a r a c t e r e s 7 8 int main 9 10 D e c l a r a c a o d e v a r i a v e i s 11 char mes MAX CHAR MES 12 abrev MAX CHAR ABREV2 13 int i 97 14 15 L e i t u r a d o m e s 16 P o d e s e r u s a d o o c i n p o r q u e n o m e d e m e s n a o p o s s u i e s p a c o 17 em b r a n c o 18 cout Entrecomummesdoano 19 cin mes 20 21 p a r a c o p i a r o s t r ˆe s p r i m e i r o s c a r a c t e r e s 22 for i 0 iMAX CHAR ABREV i 23 abrev i mes i 24 25 C o p i a o s c a r a c t e r e s p o n t o e b a r r a z e r o 26 abrev i 27 i 28 abrev i 0 29 30 I m p r e s s a o d o mˆe s a b r e v i a d o 31 cout Abreviaturadomes abrev 32 33 return 0 34 f i m m a i n Quando a instrucao da linha 19 e executada o comando cin insere o caracter 0 ao final da string digitada Tabela 91 Vetor mes apos a leitura da string Abril ındice 0 1 2 3 4 5 14 caracter A b r i l 0 lixo lixo Quando uma string e declarada dentro de uma funcao neste caso a main ela possui lixo Tabela 92 Vetor abrev antes da abreviacao ındice 0 1 2 3 4 caracter lixo lixo lixo lixo lixo Apos as instrucoes das linhas 22 a 28 Tabela 93 Vetor abrev apos a abreviacao ındice 0 1 2 3 4 caracter A b r 0 Devese inserir o caracter 0 para indicar que a string termina apos o caracter ponto linha 28 Na instrucao de linha 31 o comando cout imprimira todos os caracteres da string ate encontrar o 0 mesmo que exceda o tamanho maximo declarado na string Por isso caso nao se coloque o 0 o comando cout podera imprimir varios caracteres lixo ate encontrar seu delimitador de fim 98 95 Outro Exemplo utilizando String Seja o seguinte problema escreva um programa que peca ao usuario o nome da cidade onde nasceu e o nome da cidade na qual reside Verifique se sao as mesmas emitindo as mensagens correspondentes A seguir verifique e imprima a quantidade de vogais no nome da segunda cidade substituindoas pelo caracter Imprima o nome da segunda cidade alterada O programa correspondente a esse problema esta apresentado em Listing 92 Listing 92 C Programa que ilustra a manipulacao de algumas funcoes da biblioteca cstring 1 include iostream 2 include cstring s t r c m p s t r l e n 3 include cstdio g e t s 4 using namespace std 5 6 const int MAX CHAR 50 q u a n t i d a d e m a x i m a d e c a r a c t e r e s 7 8 int main 9 10 D e c l a r a c a o d e v a r i a v e i s 11 char cid1 MAX CHAR cid2 MAX CHAR 12 int i quant tam 13 14 L e i t u r a d a s c i d a d e s 15 cout Entrecomonomedacidadeondenasceu 16 gets cid1 17 cout Entrecomonomedacidadenaqualreside 18 gets cid2 19 20 V e r i f i c a c a o d a s c i d a d e s i m p r i m i n d o a s m e n s a g e n s 21 c o r r e s p o n d e n t e s 22 i f strcmp cid1 cid2 0 i f s t r c m p c i d 1 c i d 2 23 cout Ascidadessaoasmesmas 24 else 25 cout Ascidadessaodiferentes 26 27 C a l c u l o d o t a m a n h o d o n o m e d a 2 a c i d a d e 28 tam s t r l e n cid2 s t r i n g h 29 30 V a r r e d u r a n o n o m e d a 2 a c i d a d e v e r i f i c a n d o q u a i s c a r a c t e r e s 31 s a o v o g a i s s u b s t i t u i n d o a s p o r e c o n t a n d o s e a q u a n t i d a d e 32 d e s u b s t i t u i c o e s 33 quant 0 34 for i 0 itam i 35 36 i f cid2 i a cid2 i e cid2 i i 37 cid2 i o cid2 i u 38 39 cid2 i 40 quant 41 42 99 43 44 I m p r e s s a o d o n o m e d a 2 ª c i d a d e a l t e r a d a e a q u a n t i d a d e d e 45 s u b s t i t u i c o e s 46 cout Nomealteradodacidadenaqualreside cid2 47 cout Quantidadedesubstituicoesrealizadas quant 48 49 return 0 50 f i m m a i n Quando as instrucoes das linhas 16 e 18 sao executadas a funcao gets insere o caracter 0 ao final da string digitada Nas outras posicoes apos esse caracter existem lixos na memoria Tabela 94 Vetor cid1 apos a entrada da string Araraquara ındice 0 1 2 3 4 5 6 7 8 9 10 49 caracter A r a r a q u a r a 0 lixo lixo Tabela 95 Vetor cid2 apos a entrada da string Boa Vista ındice 0 1 2 3 4 5 6 7 8 9 49 caracter B o a V i s t a 0 lixo lixo Ao passar pela instrucao de linha 28 tam recebe o valor 9 que e o tamanho da string passada pelo usuario Daı na linha 34 a variavel i vai de 0 a tam 1 que e o valor 8 Se i variasse de 0 a 49 poderiam ser encontradas outras vogais lixo do ındice 10 ao 49 Para comparar cada caracter da string com as vogais devese acessalo da mesma forma que se acessa elementos de um vetor numerico nomeDoVetorındice Para comparar com cada vogal constante devese colocala entre apostrofos Tabela 96 Vetor cid2 apos as substituicoes ındice 0 1 2 3 4 5 6 7 8 9 49 caracter B V s t 0 lixo lixo 96 Strings como Parˆametros em Funcoes Sendo uma string um vetor de caracteres ao se passar uma string por parˆametro em uma funcao devese fazer o mesmo procedimento quando um vetor numerico e um parˆametro 100 CAPITULO 10 Matrizes 101 Definicao de Matriz Sao similares aos vetores sendo compostas por linhas e colunas No exemplo a seguir e apresentada uma matriz denominada mat com 3 linhas e 6 colunas e que contem numeros reais float mat36 declaracao da variavel mat 0 1 2 3 4 5 0 1 2 12 56 98 34 15 89 59 78 47 14 36 85 65 23 12 96 78 10 102 Declaracao de Matriz A declaracao de uma matriz segue o seguinte formato tipo nomeDaMatriz numeroDeLinhas numeroDeColunas Da mesma forma que ocorre com os vetores os ındices comecam sempre em 0 tanto de linha quanto de coluna Sendo assim com a declaracao anterior criouse uma variavel chamada mat contendo trˆes linhas ındices de 0 a 2 e seis colunas ındices de 0 a 5 capaz de armazenar numeros reais 103 Acesso a Elemento de Matriz Para acessar cada elemento da matriz devese utilizar o nome da matriz e indicar os ındices de linha e de coluna entre cada par de colchetes Assim nomeDaMatriz ındiceDaLinha ındiceDaColuna 101 Exemplo 101 C Alguns acessos de elementos da matriz mat 1 Para acessar o terceiro numero que esta na segunda linha mat12 com valor 47 2 Para acessar o primeiro numero da terceira linha mat20 com valor 65 3 Qual o valor de mat30 Nao existe pois nao ha o ındice 3 de linha 4 Qual o valor de mat16 Nao existe pois nao ha o ındice 6 de coluna Desta forma como seria o codigo em que se pedem valores para serem inseridos em uma matriz Depende do problema se a matriz e preenchida de uma vez ou aos poucos se e preciso inserir valores de linha a linha ou de coluna a coluna etc O codigo a seguir insere de uma vez valores de linha a linha em uma matriz ou seja fixase a linha e variase a coluna i L i n e o ı n d i c e d a l i n h a e i C o l e o ı n d i c e d a c o l u n a for iLin 0 iLin quantLinhas iLin for iCol 0 iCol quantColunas iCol cin nomeDaMatriz iLin iCol Como a matriz possui quantLinhas linhas o for externo deve variar de 0 a quantLinhas1 per correndo assim as quantLinhas linhas da matriz e o for interno deve variar de 0 a quantColunas 1 percorrendo assim as quantColunas colunas da matriz Exemplificando quando iLin e zero iCol varia de 0 a quantColunas 1 varrendo assim a primeira linha quando iLin e 1 iCol varia de 0 a quantColunas 1 varrendo assim a segunda linha e assim por diante ate quando iLin e quantLinhas 1 com iCol variando de 0 a quantColunas 1 O codigo a seguir insere de uma vez valores de coluna a coluna em uma matriz Perceba que para cada coluna sao varridos todos os ındices de linhas ou seja fixase a coluna e variase a linha for iCol 0 iCol quantColunas iCol for iLin 0 iLin quantLinhas iLin cin nomeDaMatriz iLin iCol 104 Um Exemplo Utilizando Matriz Seja o seguinte problema escreva um programa que receba do usuario notas de um aluno em 8 disciplinas por 4 bimestres inserindoas em uma matriz 9 x 4 A ultima linha devera conter a media por bimestre conforme apresentada na figura a seguir Imprima as medias da seguinte forma A media no Xo bimestre foi Y O programa correspondente a esse problema e apresentado em Listing 101 102 1o Bim 2o Bim 3o Bim 4o Bim Disciplina 1 Disciplina 2 Disciplina 3 Disciplina 4 Disciplina 5 Disciplina 6 Disciplina 7 Disciplina 8 Media Bimestral 65 55 50 80 40 50 30 100 35 70 100 95 80 65 60 45 40 30 95 20 25 40 35 15 55 45 100 80 100 100 100 100 55 568 712 668 Listing 101 C Programa que manipula matriz numerica 1 include iostream 2 using namespace std 3 4 const int NUM BIM 4 n u m e r o d e b i m e s t r e s 5 NUM DISCIP 8 n u m e r o d e d i s c i p l i n a s 6 7 int main 8 9 D e c l a r a c a o d e v a r i a v e i s 10 float notas NUM DISCIP1NUM BIM 11 soma media 12 int iDiscip iBim 13 14 L e i t u r a d a s n o t a s 15 cout LEITURADENOTAS 16 for iBim0 iBimNUM BIM iBim 17 18 soma 0 19 cout iBim1 oBimestre 20 for i D i s c i p 0 iDiscip NUM DISCIP i D i s c i p 21 22 cout Entrecomanotadadisciplina i D i s c i p1 23 24 cin notas i D i s c i p iBim 25 soma soma notas i D i s c i p iBim 26 27 media soma NUM DISCIP 28 notas i D i s c i p iBim media 29 30 31 I m p r e s s a o d a s m e d i a s b i m e s t r a i s 32 for iBim0 iBimNUM BIM iBim 33 cout Amediano iBim1 oBimestrefoi 34 notas NUM DISCIP iBim 35 36 return 0 37 f i m m a i n 103 105 Funcoes Passando Matriz como Parˆametro Seja o seguinte problema devese gerar inteiros aleatorios de 0 a 9 em uma matriz 3 x 5 Em seguida devese gerar uma matriz transposta e depois imprimir a matriz original e a transposta O programa modularizado para esse problema esta apresentado em Listing 102 Da mesma forma que em vetores quando se passa uma matriz como parˆametro em uma funcao devese ter em mente duas informacoes 1 Escrever o nome da matriz na chamada a funcao como nas linhas 14 15 e 16 de Listing 102 2 Declarar a matriz no cabecalho de definicao da funcao como nas linhas 21 28 e 35 de Listing 102 Listing 102 C Programa modularizado com matrizes 1 includeiostream 2 includecstdlib r a n d 3 using namespace std 4 5 P r o t o t i p o s d a s f u n c o e s 6 void geraElementosMatriz int matriz 3 5 7 void geraTransposta int matriz 3 5 int matrizT 5 3 8 void imprimeMatrizes int matriz 3 5 int matrizT 5 3 9 10 int main 11 12 int matriz 3 5 matrizT 5 3 13 14 geraElementosMatriz matriz 15 geraTransposta matriz matrizT 16 imprimeMatrizes matriz matrizT 17 18 return 0 19 20 21 void geraElementosMatriz int matriz 3 5 22 23 for int iLin 0 iLin 3 iLin 24 for int iCol 0 iCol 5 iCol 25 matriz iLin iCol rand 10 26 27 28 void geraTransposta int matriz 3 5 int matrizT 5 3 29 30 for int iLin 0 iLin 5 iLin 31 for int iCol 0 iCol 3 iCol 32 matrizT iLin iCol matriz iCol iLin 33 34 35 void imprimeMatrizes int matriz 3 5 int matrizT 5 3 104 36 37 cout MATRIZORIGINAL 38 for int iLin 0 iLin 3 iLin 39 40 for int iCol 0 iCol 5 iCol 41 cout matriz iLin iCol 42 cout endl 43 44 45 cout MATRIZTRANSPOSTA 46 for int iLin 0 iLin 5 iLin 47 48 for int iCol 0 iCol 3 iCol 49 cout matrizT iLin iCol 50 cout endl 51 52 105 CAPITULO 11 Registros Ate o presente momento so foi possıvel a manipulacao de dados simples armazenados em variaveis simples como int float bool char ou a manipulacao de conjuntos de elementos do mesmo tipo em vetores ou matrizes 111 Definicao de Registros Ja com registros tambem chamados de estruturas e possıvel agregar informacoes de tipos diferentes criandose um novo tipo de dado Um registro e portanto uma colecao de campos em que cada campo pode ser de um tipo diferente 112 Forma Geral de um Tipo de Dado Registro A forma geral para se criar um tipo de dado registro e apresentada a seguir struct tipoRegistro tipoCampo1 nomeCampo1 tipoCampo2 nomeCampo2 tipoCampon nomeCampon Como exemplo podese criar um tipo de dado para representar um produto que possui os campos de codigo e descricao struct Produto int cod char desc50 Assim foi criado o tipo registro Produto composto de campos dos tipos numerico cod e caracter desc 106 113 Declaracao de uma Variavel do Tipo de Dado Registro Mas como se declara uma variavel desse tipo E simples segue o mesmo raciocınio de uma declaracao qualquer tipoRegistro nomeVariavel Verifique as seguintes declaracoes Produto prod Criouse uma variavel simples chamada prod do tipo registro Produto Figura 111 Ilustracao de um produto com codigo e descricao Produto produtos10 Criouse um vetor de 10 produtos do tipo registro Produto Isso e o que se chama de vetor de registros Figura 112 Ilustracao de um vetor de registros de produtos Cada elemento do vetor possui os campos codigo e descricao 114 Acesso a Membros de um Registro Mas como se acessa os campos de um registro no exemplo como se acessa o codigo e a descricao do produto Se for uma variavel simples como prod devese escrever o nome da variavel seguido de um ponto e seguido do nome do campo prodcod acessase o codigo do produto Se for um vetor ou uma matriz de registros devese escrever o elemento do vetor ou matriz seguido de um ponto e seguido do nome do campo produtos3cod acessase o codigo do quarto produto 107 115 VetoresMatrizes como Membros de um Registro Vetores eou matrizes podem ser campos de tipos registro conforme a figura a seguir Figura 113 Ilustracao de um vetor de baixas do produto por dia da semana incluindo o sabado Supondo o seguinte tipo de registro e a variavel desse tipo responda struct Produto int cod char desc50 int baixas6 Produto p 1 Como se acessa a baixa do produto no segundo dia da semana Resposta pbaixas1 2 Como se acessa a descricao do produto Resposta pdesc Agora suponha que ao inves de um produto tenhase no maximo 50 Responda 1 Declare a variavel do tipo registro definido Resposta Produto p50 2 Como se acessa a baixa do primeiro produto no segundo dia da semana Resposta p0baixas1 3 Como se acessa a descricao do ultimo produto Resposta p49desc 116 Funcoes Passando um Registro Simples como Parˆametro O programa apresentado a seguir em Listing 111 cadastra e exibe os dados de um funcionario passando um registro simples como parˆametro nas duas funcoes cadastra e exibe Na funcao cadastra o parˆametro deve ser passado por referˆencia pois devera ocorrer atua lizacao dos membros do registro apos a sua chamada Ja na funcao exibe o parˆametro pode ser passado por valor pois nao ocorrera quaisquer modificacoes nos membros do registro Entretanto e importante frisar que no caso de registros que ocupam grande quantidade de memoria nao e aconselhavel utilizar a passagem de parˆametros por valor pois ocorrera copias de todos seus membros na memoria Observase que a criacao do novo tipo de dado Funcionario foi global ou seja e visıvel por qualquer funcao definida no programa 108 Listing 111 C Programa que manipula registro simples como parˆametro em funcao 1 include iostream 2 include cstdio 3 using namespace std 4 5 struct Funcionario 6 7 int codigo 8 char nome 3 0 9 float s a l a r i o 10 char sexo 11 12 13 void cadastra Funcionario f 14 void exibe Funcionario f 15 16 int main 17 18 Funcionario funcionario 19 20 cadastra funcionario 21 exibe funcionario 22 23 return 0 24 25 26 void cadastra Funcionario f 27 28 cout Entrecomocodigo 29 cin f codigo 30 cout Entrecomonome 31 f f l u s h stdin 32 gets f nome 33 cout Entrecomosalario 34 cin f s a l a r i o 35 cout Entrecomosexo 36 cin f sexo 37 38 39 void exibe Funcionario f 40 41 cout Codigo f codigo 42 cout Nome f nome 43 cout Salario f s a l a r i o 44 cout Sexo f sexo 45 109 117 Funcoes Passando um Vetor de Registro como Parˆametro A sintaxe para passar um vetor ou matriz de registros e semelhante quando se passa um vetor ou uma matriz de variaveis simples Na chamada a uma funcao devese escrever apenas o nome do vetor ou matriz No cabecalho de definicao da funcao declaramse normalmente os vetoresmatrizes de registros Verifique o programa apresentado em Listing 112 que cadastra e exibe informacoes de 10 funcionarios Listing 112 C Programa que manipula vetor de registro como parˆametro em funcao 1 include iostream 2 include cstdio 3 using namespace std 4 5 struct Funcionario 6 7 int codigo 8 char nome 3 0 9 float s a l a r i o 10 char sexo 11 12 13 void cadastra Funcionario f 14 void exibe Funcionario f 15 16 int main 17 18 Funcionario f u n c i on ar i os 1 0 19 20 cadastra f u n c i o n ar i os 21 exibe f u n c i o n ar i os 22 23 return 0 24 25 26 void cadastra Funcionario f 1 0 27 28 for int i 0 i 10 i 29 30 cout i1 oFUNCIONARIO 31 cout Entrecomocodigo 32 cin f i codigo 33 cout Entrecomonome 34 f f l u s h stdin 35 gets f i nome 36 cout Entrecomosalario 37 cin f i s a l a r i o 38 cout Entrecomosexo 39 cin f i sexo 40 41 110 42 void exibe Funcionario f 1 0 43 44 for int i 0 i 10 i 45 46 cout i1 oFUNCIONARIO 47 cout Codigo f i codigo 48 cout Nome f i nome 49 cout Salario f i s a l a r i o 50 cout Sexo f i sexo 51 52 118 Funcoes que Retornam um Registro Podese retornar um registro completo para outra funcao como pode ser observado na funcao novaV enda no exemplo apresentado em Listing 113 Listing 113 C Programa que possui uma funcao que retorna um registro 1 include iostream 2 using namespace std 3 4 struct Venda 5 int quantPecas 6 float preco 7 8 9 Venda novaVenda 10 11 Venda v 12 cout NovaVenda 13 cout Insiraonumerodepecas 14 cin v quantPecas 15 cout Insiraopreco 16 cin v preco 17 return v 18 19 20 void listaTotalVendas Venda v1 Venda v2 21 22 cout VendaTotal 23 cout Totaldepecas v1 quantPecas v2 quantPecas 24 cout PrecoTotal v1 preco v2 preco 25 26 27 int main 28 29 Venda venda1 venda2 30 venda1 novaVenda 31 venda2 novaVenda 111 32 listaTotalVendas venda1 venda2 33 return 0 34 119 Inicializacao de Variaveis do Tipo Registro E possıvel inicializar uma variavel do tipo registro de forma semelhante a uma matriz Os valores a serem atribuıdos a seus membros devem ser colocados na ordem em que foram definidos separados por vırgulas e entre chaves conforme apresentado em Listing 114 Listing 114 C Programa que mostra a inicializacao de variaveis do tipo registro 1 struct Data 2 int dia 3 int mes 4 int ano 5 6 Data natal 25 12 2011 7 Data a n i v e r s a r i o 12 8 2011 1110 Atribuicoes entre Registros Uma variavel do tipo registro pode ser atribuıda a outra variavel do mesmo tipo atraves de uma atribuicao simples Os valores de todos os membros de um registro sao atribuıdos aos membros de outro registro Segue um exemplo em Listing 115 Listing 115 C Programa que mostra a atribuicao entre registros 1 struct Data 2 int dia 3 int mes 4 int ano 5 6 7 Data anoNovo 1 1 2012 8 Data a n i v e r s a r i o C r i s anoNovo Assim os valores de aniversarioCrisdia aniversarioCrismes e aniversarioCrisano serao respectivamente 1 1 e 2012 1111 Registros Aninhados Podese definir tipos de dados registro cujos membros sao outros registros No exemplo a seguir apresentado em Listing 116 foi adicionado um membro do tipo Data chamado dtV enda ao tipo de dado V enda 112 A variavel v possui trˆes membros sendo que um deles e do tipo Data Portanto vdtVenda e o nome de uma variavel do tipo Data e para acessar seus membros devese aplicar o operador ponto Listing 116 C Programa que mostra o uso de registros aninhados 1 include iostream 2 include cstdio 3 using namespace std 4 5 struct Data 6 int dia 7 int mes 8 int ano 9 10 struct Venda 11 int quantPecas 12 float preco 13 Data dtVenda 14 15 int main 16 17 Venda v 15 13050 27 5 2011 18 19 cout Quantidadedepecas v quantPecas endl 20 Preco v preco endl 21 Datadavenda v dtVenda dia 22 cout v dtVenda mes v dtVenda ano 23 return 0 24 113 Referˆencias Bibliograficas A F G Ascencio and E A V de Campos Fundamentos da Programacao de Computadores Algoritmos Pascal e CC Prentice Hall 2002 Sao Paulo 1a edicao H M Deitel and P J Deitel C Como Programar Apresentando Projeto Orientado a Objeto com UML Bookman 2001 Porto Alegre 3a edicao A L V Forbellone and H F Eberspacher Logica de Programacao A Construcao de Algoritmos e Estrutura de Dados Pearson Prentice Hall 2005 Sao Paulo 3a edicao V V Mizrahi Treinamento em Linguagem C Modulos 1 e 2 Makron Books 1994 Sao Paulo 1a edicao D D Salvetti and L M Barbosa Algoritmos Makron Books 1998 Sao Paulo 1a edicao 114 APˆENDICE A Erros Comuns na Programacao Usando o Ambiente CodeBlocks A1 Erros Comuns na Compilacao Erros na compilacao tambem sao chamados de erros de sintaxe que ocorrem quando o compilador nao reconhece um comando 1 Digitar main incorretamente undefined reference to WinMain16 2 Nao salvar o arquivo com extensao cpp fatal error iostream No such file or directory 3 Esquecer de incluir a biblioteca iostream error cout was not declared in this scope error cin was not declared in this scope 4 Esquecer de incluir as bibliotecas correspondentes das funcoes error sqrt was not declared in this scope error pow was not declared in this scope error system was not declared in this scope 5 Digitar incorretamente um comando a intencao era digitar cout error cout was not declared in this scope 6 Trocar para letras maiusculas as palavraschave reservadas da linguagem tais como while if for e else que contˆem somente letras minusculas C e case sensitive ou seja sensıvel a letras maiusculas e minusculas error WHILE was not declared in this scope error If was not declared in this scope 7 Digitar incorretamente o nome de uma variavel por exemplo declarouse como num e utilizou se Num error Num was not declared in this scope 115 8 Digitar espaco em branco em nome de variavel por exemplo nome pessoa error expected initializer before pessoa 9 Comecar o nome de uma variavel com numero por exemplo 1num error invalid suffix nome on integer constant 10 Esquecer o pontoevırgula ao final de um comando acusase erro na linha posterior error expected before 11 Usar o operador modulo com operandos nao inteiros error invalid operands of types double and int to binary operator 12 Colocar espacos entre os dois sımbolos dos operadores e error expected primaryexpression before token 13 Inverter a ordem do par de sımbolos dos operadores e para e respectivamente error expected primaryexpression before 14 Colocar um pontoevırgula logo apos parˆentese da direita do comando if na estrutura con dicional ifelse como em 1 i f idade 18 2 cout Idadesuperiora18anos 3 else 4 cout Idadeate18anos que e o mesmo que 1 i f idade 18 2 3 cout Idadesuperiora18anos 4 else 5 cout Idadeate18anos O pontoevırgula faz com que o corpo da estrutura if seja considerado vazio Assim o proximo comando na sequˆencia e o cout fazendo com que o else esteja relacionado a ele e nao ao if emitindo a mensagem error else without a previous if 15 Usar vırgula no lugar de pontoevırgula no cabecalho do comando for como em for i0 i10 i error expected initializer before token 16 Colocar um pontoevırgula apos o parˆentese direito ao encerrar a lista de parˆametros de uma definicao de funcao como em Listing A1 Definicao de funcao INCORRETA 1 int calcula soma int num1 int num2 2 3 int soma 4 5 soma num1 num2 6 7 return soma 8 116 O correto e eliminar o pontoevırgula da linha 1 error expected unqualifiedid before token 17 Declarar parˆametros da funcao do mesmo tipo como float n1 n2 ao inves de float n1 float n2 error n2 has not been declared 18 Definir um parˆametro de funcao novamente como variavel local dentro da funcao como em 1 int calcula soma int num1 int num2 2 3 int num1 num2 INCORRETO 4 soma 5 6 soma num1 num2 7 8 return soma 9 emitira os seguintes erros error declaration of int num1 shadows a parameter error declaration of int num2 shadows a parameter 19 Esquecer o pontoevırgula ao final de uma declaracao de prototipo causa um erro de sintaxe expected initdeclarator before A2 Erros Comuns de Logica Os erros de logica nao sao indicados pelo compilador mas pelo resultado incorreto do pro grama Sao erros da estruturacao logica do pensamento 1 Dividir por zero no ambiente CodeBlocks causa erro durante a execucao do programa pro duzindo um erro fatal ou seja causa o termino imediato do programa sem este ter executado com sucesso seu trabalho Warning division by zero 2 Confundir o operador de atribuicao com o operador relacional de igualdade Seja o seguinte exemplo de erro muito comum if n1 n2 A intencao era comparar os valores das variaveis mas o que ocorre e uma atribuicao do valor de n2 para n1 3 Colocar um pontoevırgula logo apos parˆentese da direita do comando if como em 1 i f idade 18 2 cout Idadesuperiora18anos 3 getch O pontoevırgula faz com que o corpo da estrutura if seja considerado vazio Assim inde pendente da condicao ser verdadeira ou falsa o cout e executado pois e o proximo comando na sequˆencia 4 Colocar um pontoevırgula logo apos parˆentese da direita do cabecalho do comando while tornando o corpo do while vazio 117 5 Colocar um pontoevırgula logo apos parˆentese da direita do cabecalho do comando for tornando o corpo do for vazio 6 Nao inicializar contador ou acumulador pode resultar em erro 7 Embora 4 y 8 seja uma condicao matematicamente correta ela nao e avaliada cor retamente em C Use 4 y y 8 ou y 4 y 8 para obter a avaliacao apropriada 8 Acessar um elemento alem dos limites de um vetor e um erro de logica que ocorre durante a execucao Exemplo se foi declarado int vet10 entao nao existe o elemento vet10 118 APˆENDICE B Boas Praticas de Programacao 1 Comece seu programa com um comentario descrevendo os nomes dos programadores a data de implementacao e o seu proposito Exemplo Listing B1 somacpp 1 2 P r o g r a m a d o r a C l a u d i a A I z e k i 3 D a t a 7 1 2 2 0 0 5 4 D e s c r i c a o P r o g r a m a q u e c a l c u l a a s o m a d e d o i s n u m e r o s i n t e i r o s 5 p a s s a d o s p e l o u s u a r i o 6 7 includeiostream 8 using namespace std 9 10 int main 11 2 Escolha nomes de variaveis significativos pois torna o programa mais facil de ser entendido ao inves de ter que ler manuais ou usar comentarios em excesso 3 Evite usar variaveis com mesmo nome para propositos diferentes em um programa pois pode gerar confusao 4 Alguns programadores preferem declarar cada variavel em uma linha separada Este formato permite a facil insercao de comentario descritivo apos cada declaracao 5 Solicite explicitamente ao usuario cada entrada pelo teclado O lembrete deve indicar a forma da entrada e quaisquer valores de entrada especiais que devam ser fornecidos como por exemplo o valor que o usuario deve digitar para terminar um laco Exemplo cout Entrecomumaidadedigite1parasair cin idade 6 Coloque espacos dos dois lados de um operador binario Isso faz com que o operador se desta que tornando o programa mais legıvel Exemplo escreva num 8 ao inves de num8 119 7 Coloque uma linha em branco para separar instrucoes com objetivos diferentes tornando os programas mais legıveis 8 Insira um espaco apos cada vırgula para tornar os programas mais legıveis 9 Consulte a precedˆencia de operadores quando escrever expressoes contendo muitos operadores Confirme que os operadores na expressao sao executados na ordem que se espera Caso nao tenha certeza da ordem de execucao de uma expressao complexa separea em comandos menores ou use parˆenteses para forcar a ordem 10 Indente 1 em um nıvel o corpo inteiro de cada funcao Isso faz com que a estrutura funcional de um programa se destaque e ajuda a tornar os programas mais faceis de ler Compare os dois exemplos Listing B2 Programa sem indentacao na funcao main INCORRETO 1 include iostream c i n e c o u t 2 include cstdlib s y s t e m 3 using namespace std 4 5 int calcula soma int num1 int num2 6 7 int soma 8 9 soma num1 num2 10 11 return soma 12 13 14 int main 15 16 int num1 num2 soma 17 18 cout Somadedoisnumeros 19 20 cout Entrecomoprimeironumero 21 cin num1 22 23 cout Entrecomosegundonumero 24 cin num2 25 26 soma calcula soma num1 num2 27 28 cout Asomae 29 cout soma 30 31 system pause 32 33 return 0 34 1Indentacao e um espacamento fundamentalmente utilizado por programadores para destacar os conteudos de funcoes e de estruturas condicionais e de repeticao tornando os programas mais faceis de ler pelo programador 120 Listing B3 Programa com indentacao na funcao main CORRETO 1 include iostream c i n e c o u t 2 include cstdlib s y s t e m 3 using namespace std 4 5 int calcula soma int num1 int num2 6 7 int soma 8 9 soma num1 num2 10 11 return soma 12 13 14 int main 15 16 int num1 num2 soma 17 18 cout Somadedoisnumeros 19 20 cout Entrecomoprimeironumero 21 cin num1 22 23 cout Entrecomosegundonumero 24 cin num2 25 26 soma calcula soma num1 num2 27 28 cout Asomae 29 cout soma 30 31 system pause 32 33 return 0 34 11 Estabeleca um padrao nos tamanhos da indentacao Se teclar espacos em branco para a indentacao useos sempre sendo preferıvel 3 espacos Caso use a tabulacao tecla Tab verifique se o ambiente esta configurado para o mesmo tamanho de tabulacao Menu Settings Editor General Settings TAB size in spaces sendo 3 o preferıvel 12 Indente em um nıvel o corpo de uma estrutura if para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos 121 Listing B4 Corpo de uma estrutura if sem indentacao INCORRETO 1 i f op 1 2 3 cout Calculodenovosalario 4 cout Entrecomseusalario 5 cin s a l 6 7 novo sal s a l 1 4 5 8 9 cout Seunovosalarioe novo sal 10 11 else i f op 2 12 13 cout Calculodeimpostosobreosalario 14 cout Entrecomseusalario 15 cin s a l 16 17 imp s a l 0 0 2 18 19 cout Oimpostoede imp 20 21 else 22 cout Opcaoinvalida Listing B5 Corpo de uma estrutura if com indentacao CORRETO 1 i f op 1 2 3 cout Calculodenovosalario 4 cout Entrecomseusalario 5 cin s a l 6 7 novo sal s a l 1 4 5 8 9 cout Seunovosalarioe novo sal 10 11 else i f op 2 12 13 cout Calculodeimpostosobreosalario 14 cout Entrecomseusalario 15 cin s a l 16 17 imp s a l 0 0 2 18 19 cout Oimpostoede imp 20 21 else 22 cout Opcaoinvalida 13 Indente em um nıvel o corpo de uma estrutura while para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos 122 Listing B6 Corpo de uma estrutura while sem indentacao INCORRETO 1 i 0 2 while i 10 3 4 res num i 5 cout num x i res 6 i 7 Listing B7 Corpo de uma estrutura while com indentacao CORRETO 1 i 0 2 while i 10 3 4 res num i 5 cout num x i res 6 i 7 14 Indente em um nıvel o corpo de uma estrutura for para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos Listing B8 Corpo de uma estrutura for sem indentacao INCORRETO 1 for i 0 i 10 i 2 3 res num i 4 cout num x i res 5 Listing B9 Corpo de uma estrutura for com indentacao CORRETO 1 for i 0 i 10 i 2 3 res num i 4 cout num x i res 5 15 Indente em um nıvel o corpo de uma estrutura dowhile para fazer com que o seu corpo se destaque melhorando a legibilidade Compare os exemplos Listing B10 Corpo de uma estrutura dowhile sem indentacao INCORRETO do cout Menudeopcoes cout 1Calculodesoma cout 2Calculodesubtracao cout 3Sair cin op while op 3 123 Listing B11 Corpo de uma estrutura dowhile com indentacao CORRETO 1 do 2 cout Menudeopcoes 3 cout 1Calculodesoma 4 cout 2Calculodesubtracao 5 cout 3Sair 6 cin op 7 8 9 while op 3 16 Mantenha a indentacao mesmo em estruturas que compoem outras Por exemplo no corpo de uma funcao main existe um laco dowhile sendo que no corpo deste existem estruturas encadeadas if else Compare os exemplos Listing B12 Programa sem indentacao INCORRETO 1 int main 2 3 int op soma dif n1 n2 4 5 do 6 cout Menudeopcoes 7 cout 1Calculodesoma 8 cout 2Calculodesubtracao 9 cout 3Sair 10 cin op 11 12 i f op 1 13 14 cout Somadedoisnumeros 15 cout Entrecomdoisnumerosinteiros 16 cin n1 n2 17 soma n1 n2 18 cout Asomae soma 19 20 else i f op 2 21 22 cout Subtracaodedoisnumeros 23 cout Entrecomdoisnumerosinteiros 24 cin n1 n2 25 d i f n1 n2 26 cout Adiferencae d i f 27 28 else 29 cout Opcaoinvalida 30 while op 3 31 32 system pause 33 34 return 0 35 124 Listing B13 Programa com indentacao CORRETO 1 int main 2 3 int op soma dif n1 n2 4 5 do 6 cout Menudeopcoes 7 cout 1Calculodesoma 8 cout 2Calculodesubtracao 9 cout 3Sair 10 cin op 11 12 i f op 1 13 14 cout Somadedoisnumeros 15 cout Entrecomdoisnumerosinteiros 16 cin n1 n2 17 soma n1 n2 18 cout Asomae soma 19 20 else i f op 2 21 22 cout Subtracaodedoisnumeros 23 cout Entrecomdoisnumerosinteiros 24 cin n1 n2 25 d i f n1 n2 26 cout Adiferencae d i f 27 28 else 29 cout Opcaoinvalida 30 while op 3 31 32 system pause 33 34 return 0 35 17 Alguns programadores usam letras maiusculas nos nomes de constantes para se destacarem no programa e nao serem confundidos com variaveis Exemplo const int MAX ALUNOS 100 ao inves de const int max alunos 100 18 Escolha nomes significativos para funcoes e parˆametros tornando o programa mais legıvel e evitando o uso excessivo de comentarios 19 Sempre inclua prototipos de funcoes ainda que seja possıvel omitilos quando as funcoes sao definidas antes que sejam usadas 20 Antes de compilar verifique se os prototipos as chamadas e as definicoes de funcoes estao em acordo quanto aos nomes das funcoes os tipos e sequˆencias dos parˆametros bem como seus tipos de retornos se houver 125 21 E aconselhavel definir o tamanho do vetor como uma constante com const ao inves de cons tante numero ou seja const int TAM 10 int vetTAM ao inves de int vet10 126 APˆENDICE C Revisao de Conceitos Matematicos Muito Utilizados 1 Adicao combina dois numeros termos somandos ou parcelas em um unico numero a soma 2 Subtracao indica quanto e um valor numerico minuendo se dele for removido outro valor numerico subtraendo a b c a e o minuendo b e o subtraendo c e a diferenca 3 Divisao e a operacao matematica que determina a quantidade de vezes que um numero divisor esta contido dentro de outro numero dividendo ab q a e o dividendo b e o divisor q e o quociente r e o resto O divisor nao pode ser zero pois qual numero multiplicado por zero e igual ao dividendo 4 Multiplicacao e uma forma simples de se adicionar uma quantidade finita de numeros iguais O resultado da multiplicacao de dois numeros e chamado produto Esses numeros sao chamados de multiplicando e multiplicador 5 Prioridades das operacoes a multiplicacao e a divisao possuem prioridade sobre a adicao e a subtracao Entretanto devese realizar primeiramente a operacao que estiver dentro de parˆenteses colchetes ou chaves 6 Media aritmetica simples e a soma dos elementos dividida pela quantidade deles Exem plo calcular a media aritmetica MA de quatro notas bimestrais N1 N2 N3 e N4 Solucao MA N1 N2 N3 N44 7 Media aritmetica ponderada primeiro multiplicase cada peso com seu elemento Fazse a soma dos produtos dividindoa pela soma dos pesos Exemplo Calcular a media ponderada MP de 2 notas em que a primeira possui peso 3 e a segunda peso 2 Solucao MP 3 N1 2 N25 8 Regra de 3 e um processo de resolucao de problemas de quatro valores sendo que trˆes sao conhecidos e devese determinar o quarto valor Para resolvˆelo devese montar uma tabela e 127 resolver a equacao Exemplo um atleta percorre 30 km em 3h Em quanto tempo percorrera 50km mantendo o mesmo ritmo Solucao montase uma tabela Percurso km Tempo h 30 3 50 x Assim temos 30 50 3 x C1 30x 150 C2 x 5 C3 Portanto o atleta percorrera 50 km em 5h Outro exemplo um produto de valor RP sofrera aumento de X Calcule o valor em reais do aumento A e o novo valor NP em reais do produto Solucao Valor R Porcentagem P 100 A X Assim temos P A 100 X C4 100A PX C5 A PX 100 C6 Portanto o aumento e calculado pela equacao C6 E o novo preco e NP P A 9 Divisibilidade um numero inteiro A e divisıvel por um inteiro nao nulo B se e somente se existir k inteiro tal que A kB ou seja se o resto da divisao de A por B for zero 10 Numero par e todo numero inteiro que ao ser dividido pelo numero dois resulta em um numero inteiro ou seja o resto e zero 11 Numero ımpar e todo numero inteiro que ao ser dividido pelo numero dois resulta em um numero racional nao inteiro 12 Numeros inteiros sao somente constituıdos dos numeros naturais 0 1 2 e dos seus opostos 1 2 3 Dois numeros sao opostos se e somente se sua soma e zero 128 13 Numeros naturais e um inteiro naonegativo 0 1 2 3 14 Numero racional e todo numero que pode ser representado por uma razao ou fracao entre dois numeros inteiros 129

Sua Nova Sala de Aula

Sua Nova Sala de Aula

Empresa

Central de ajuda Contato Blog

Legal

Termos de uso Política de privacidade Política de cookies Código de honra

Baixe o app

4,8
(35.000 avaliações)
© 2025 Meu Guru®