lÓGICA DE ALGORITMOS COM C++

51
Departamento de Matemática Introdução à Ciência da Computação Curso de C++ Básico Discente: Leonardo Ito Perillo Curso: Engenharia Elétrica Orientador: Prof. Dr. Anirio Salles Filho Ilha Solteira, 30 de Julho de 2010. UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO” FACULDADE DE ENGENHARIA DE ILHA SOLTEIRA

Transcript of lÓGICA DE ALGORITMOS COM C++

Page 1: lÓGICA DE ALGORITMOS COM C++

Departamento de Matemática

Introdução à Ciência da Computação Curso de C++ Básico

Discente: Leonardo Ito Perillo Curso: Engenharia Elétrica Orientador: Prof. Dr. Anirio Salles Filho

Ilha Solteira, 30 de Julho de 2010.

UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”

FACULDADE DE ENGENHARIA DE ILHA SOLTEIRA

Page 2: lÓGICA DE ALGORITMOS COM C++

1

Sumário

Uma Breve História do C++ 02 Introdução à Lógica de Programação 03 Compiladores 04 Tipos de Variáveis 05 Alguns Comandos Básicos 08 Comentários no Programa 11 Operadores 12 Constante e Variáveis 13 O comando Include e as Bibliotecas 14 Biblioteca <Math.h> 15 Controle de Fluxo de Execução – Decisão 16 Controle de Fluxo de Execução – Repetição 21 Arrays Unidimensionais – Vetores 30 Arrays Bidimensionais e Multidimensionais 35 Funções 41 Escopo de variáveis 42 Exercícios de Revisão 43 Referências Bibliográficas 50

Page 3: lÓGICA DE ALGORITMOS COM C++

2

Uma breve história do C++

O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs, durante a década de 1980 com o objectivo implementar uma versão distribuída do núcleoUnix. Como o Unix era escrito em C, dever-se-ia manter a compatibilidade, ainda que adicionando novos recursos. Alguns dos desafios incluíam simular a infraestrutura da comunicação entre processos num sistema distribuído ou de memória compartilhada e escrever drivers para tal sistema. Stroustrup percebeu que a linguagem Simula possuía características bastante úteis para o desenvolvimento de software, mas que era muito lenta para uso prático. Por outro lado, a linguagem BCPL era rápida, mas possuía demasiado baixo nível, dificultando sua utilização no desenvolvimento de aplicações. A partir de sua experiência de doutorado, começou a acrescentar elementos do Simula no C.

O C foi escolhido como base de desenvolvimento da nova linguagem pois possuía uma proposta de uso genérico, era rápido e também portável para diversas plataformas. Algumas outras linguagens que também serviram de inspiração para o cientista da computação foram ALGOL 68, Ada, CLU e ML.

Ainda em 1983 o nome da linguagem foi alterado de C with Classes para C++. Antes implementada usando um pré-processador, a linguagem passou a exigir um compilador próprio, escrito pelo próprio Stroustrup. Novas características foram adicionadas, como funções virtuais, sobrecarga de operadores e funções, melhorias na verificação de tipo de dado e estilo de comentário de código de uma linha (//). Em 1985 foi lançada a primeira edição do livro The C++ Programming Language, contendo referências para a utilização da linguagem, já que ainda não era uma norma oficial. A primeira versão comercial foi lançada em outubro do mesmo ano. Em 1989 a segunda versão foi lançada, contendo novas características como herança múltipla, classes abstratas, métodos estáticos, métodos constantes e membros protegidos, incrementando o suporte a orientação a objeto.

Assim como a linguagem, sua biblioteca padrão também sofreu melhorias ao longo do tempo. Sua primeira adição foi a biblioteca de E/S, e posteriormente a Standard Template Library (STL); ambas tornaram-se algumas das principais funcionalidades que distanciaram a linguagem em relação a C. Criada primordialmente na HP por Alexander Stepanov no início da década de 1990 para explorar os potenciais da programação genérica, a STL foi apresentada a um comitê unificado ANSI e ISO em 1993 à convite de Andrew Koenig. Após uma proposta formal na reunião do ano seguinte, a biblioteca recebe o aval do comitê.

Pode-se dizer que C++ foi a única linguagem entre tantas outras que obteve sucesso como uma sucessora à linguagem C, inclusive servindo de inspiração para outras linguagens como Java, a IDL de CORBA e C#.

Page 4: lÓGICA DE ALGORITMOS COM C++

3

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

A lógica de programação é necessária para pessoas que desejam trabalhar com desenvolvimento de sistemas e programas, ela permite definir a seqüência lógica para o desenvolvimento.Então o que é lógica?

Lógica de programação é a técnica de encadear pensamentos para atingir determinado objetivo. Seqüência Lógica:

Estes pensamentos podem ser descritos como uma seqüência de instruções, que devem ser seguidas para se cumprir uma determinada tarefa.

Seqüência Lógica são passos executados até atingir um objetivo ou solução de um problema. Instruções:

Na linguagem comum, entende-se por instruções “um conjunto de regras ou normas definidas para a realização ou emprego de algo”.

Em informática, porém, instrução é a informação que indica a um computador uma ação elementar a executar.Convém ressaltar que uma ordem isolada não permite realizar o processo completo, para isso é necessário um conjunto de instruções colocadas em ordem seqüencial lógica.

Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar em prática uma série de instruções: descascar as batatas, bater os ovos, fritar as batatas, etc...

É evidente que essas instruções tem que ser executadas em uma ordem adequada – não se pode descascar as batatas depois de fritá-las.

Dessa maneira, uma instrução tomada em separado não tem muito sentido para obtermos o resultado, precisamos colocar em prática o conjunto de todas as instruções, na ordem correta.

Instruções são um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em informática, é o que indica a um computador uma ação elementar a executar.

Page 5: lÓGICA DE ALGORITMOS COM C++

4

Compiladores

Um compilador é um programa de sistema que traduz um programa descrito em uma linguagem de alto nível para um programa equivalente em código de máquina para um processador. Em geral, um compilador não produz diretamente o código de máquina, mas sim um programa em linguagem simbólica (assembly) semanticamente equivalente ao programa em linguagem de alto nível. O programa em linguagem simbólica é então traduzido para o programa em linguagem de máquina através de montadores. Para desempenhar suas tarefas, um compilador deve executar dois tipos de atividade. A primeira atividade é a análise do código fonte, onde a estrutura e significado do programa de alto nível são reconhecidos. A segunda atividade é a síntese do programa equivalente em linguagem simbólica.

Embora conceitualmente seja possível executar toda a análise e apenas então iniciar a síntese, em geral estas duas atividades ocorrem praticamente em paralelo.

Para apresentar um exemplo das atividades que um compilador deve desempenhar, considere o seguinte trecho de um programa em C:

main() { int a, b, valor; a=10; b=20; Valor = a*(b+20); cout<<valor<<endl; getch(); }

Para o compilador, este segmento nada mais é do que uma seqüência de caracteres em um

arquivo texto. O primeiro passo da análise é reconhecer que agrupamentos de caracteres têm significado para o programa, por exemplo, saber que int é uma palavra-chave da linguagem e que a e b serão elementos individuais neste programa. Posteriormente, o compilador deve reconhecer que a seqüência int a ,corresponde a uma declaração de uma variável inteira cujo identificador recebeu o nome a.

As regras de formação de elementos e frases válidas de uma linguagem são expressas na gramática da linguagem. O processo de reconhecer os comandos de uma gramática é conhecido como reconhecimento de sentenças.

Page 6: lÓGICA DE ALGORITMOS COM C++

5

Tipos de Variáveis

Quando definimos uma variável em C++, precisamos informar ao compilador o tipo da variável: um número inteiro, um número de ponto flutuante, um caractere, e assim por diante. Essa informação diz ao compilador quanto espaço deve ser reservado na memória para a variável, e o tipo de valor que será armazenado nela.

As variáveis mais utilizadas, em um curso de C++ básico são:

� Int O tipo de dado int (inteiro) serve para armazenar valores numéricos inteiros. Existem vários

tipos de inteiros, cada um de um tamanho diferente (dependendo do sistema operacional e/ou arquitetura do processador): int , pode possuir 16 bits, 32 bits ou 64 bits short int, deve possuir tamanho de no mínimo 16 bits e não pode ser maior que int. long int, deve possuir tamanho mínimo de 32 bits. long long int, deve possuir tamanho mínimo de 64 bits.

Exemplo de aplicação:

#include <iostream.h> #include <conio.h> main() { int idade; cout<<“Digite a sua idade”<<endl; cin>>idade; cout<<“Sua idade daqui 10 anos será”<<idade +10<<endl; return 0 getch(); }

Note em nosso exemplo, que a idade da pessoa, obrigatoriamente deve ser um número inteiro,

por isso a escolha da variável int.

� Float O tipo de dado float serve para armazenar números de ponto flutuante, ou seja, com casas decimais

(Reais).Exemplo de aplicação:

#include <iostream.h> #include <conio.h> main() { int a,b; float d; a=5; b=3; d=a/b; cout<<d<<endl; return 0; getch()}

No nosso simples exemplo, terá como saída o número 1,66667

Page 7: lÓGICA DE ALGORITMOS COM C++

6

� Double O tipo de dado double serve para armazenar números de ponto flutuante de dupla precisão,

normalmente tem o dobro do tamanho do float e portanto o dobro da capacidade. Exemplo de aplicação:

#include <iostream.h> #include <conio.h> main() {double a; a=5/3; cout<<a<<endl; return 0; getch() }

Já utilizando a variável double, teremos um número mais significativo de saída, no caso, 1,6666 O Double é utilizado quando necessitamos de uma aproximação maior e mais exata do resultado

O Double consome incríveis 8 bytes de memória para o seu armazenamento. Esse consumo é explicado pela alta precisão de seu número (cerca de 14 dígitos após a vírgula)

� Char O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso significa que o

programa reserva um espaço de 8 bits na memória RAM ou em registradores do processador para armazenar um valor (char de tamanho maior que 8 bits é permitido pela linguagem, mas os casos são raros.

Exemplo de aplicação:

#include <iostream.h> #include <conio.h> main() {char nome[8]; cout<<"Digite seu nome: "; cin>>nome; cout<<"Seu nome e: "<< nome<<endl; return 0; getch(); }

No nosso exemplo, pode-se guardar uma string com até 20 caracteres de comprimento, caso

exceda o número máximo de caracteres, ocasionará erro no compilador. Caso fosse declarado apenas “char nome”, a variável nome armazenaria apenas uma letra, por

exemplo, se o usuário digitasse um nome com 7 letras, a variável apenas armazenaria a primeira letra digitada.

Page 8: lÓGICA DE ALGORITMOS COM C++

7

� Struct Em C podem ser usadas estruturas (chamados de registros em outras linguagens de programação).

As estruturas são grupos de variáveis organizadas arbitrariamente pelo programador. Exemplo de aplicação:

#include <stdio.h> #include <conio.h> struct pessoa; { unsigned short int idade; char nome[51]; /* vetor de 51 chars para o nome */ unsigned long int rg; }; /* estrutura declarada */ int main(void) { struct pessoa exemplo = {16, "Fulano", 123456789}; /* declaração de uma variável tipo struct pessoa */ printf("Idade: %hu\n", exemplo.idade); printf("Nome: %s\n", exemplo.nome); printf("RG: %lu\n", exemplo.rg); return 0; getch(); }

Esta estrutura é composta por 3 elementos de tipos diferentes. Depois de ser declarada uma

variável do tipo struct x, onde x é o nome da estrutura, para se acessar os diversos elementos deve-se fazer x.elemento.

Page 9: lÓGICA DE ALGORITMOS COM C++

8

Alguns Comandos Básicos

Em C++, a separação entre instruções é especificada com um ponto-e-vírgula (no final de cada

instrução). A divisão do código em linhas diferentes serve somente para torná-lo mais legível e

esquemático para seres humanos.

� #include <iostream.h> Comandos que começam com um sinal de numeração (#) são diretivas do pré-processador. Elas não são linhas de código executáveis, mas indicações para o compilador. Nesse caso, o comando #include <iostream.h> diz ao pré-processador do compilador para incluir o arquivo de cabeçalho padrão iostream. Esse arquivo específico inclui as declarações da biblioteca básica de entrada-saída do C++, e está sendo usado porque suas funcionalidades serão usadas mais tarde nesse programa.

� #include <conio.h> Esta biblioteca tem a finalidade de receber dados do teclado,ou outros dispositivos de entrada, além de também exibir dados na saída padrão. Quando utilizamos a biblioteca #include<conio.h>, temos a possibilidade de executar as funções “getch()” para ler as entradas do teclado e “kbhit() ” para testar se há buffers de teclado a serem lidos. É muito útil, e eu diria até indispensável o uso desta biblioteca para a programação.

� main()

Essa linha corresponde ao início da declaração da função main. A função main é o ponto pelo qual todos os programas em C++ iniciam a execução. Não faz diferença se estiver no início, no fim, ou no meio do código – seu conteúdo é sempre o primeiro a ser executado quando um programa inicia. Além disso, pelo mesmo motivo, é obrigatório que todos os programas em C++ tenham uma função main. Depois de main há um par de parênteses () porque é uma função. Em C++ todas as funções são seguidas por um par de parênteses () que, opcionalmente, podem incluir argumento dentro deles. O conteúdo da função main segue imediatamente após sua declaração formal e é coberto entre chaves ({}), como em nosso exemplo.

� cout << “Exemplo”<<endl;

Essa instrução faz a coisa mais importante nesse programa. cout é o dispositivo de saída padrão no C++ (geralmente o monitor), e a frase completa insere uma seqüência de caracteres no dispositivo de saída.O cout é declarado no arquivo de cabeçalho <iostream.h>, então pra que seja possível utiliza-lo, esse arquivo precisa ser incluso. Note que a frase termina com um caractere ponto-e-vírgula (Esse caractere significa o fim da instrução e precisa ser incluído após toda instrução em qualquer programa em C++ )Um dos erros mais comuns dos programadores de C++ é devido ao fato de esquecerem de incluir um ponto-e-vírgula; no final de cada instrução.

Page 10: lÓGICA DE ALGORITMOS COM C++

9

� cin>>variável;

O trabalho com a entrada padrão no C++ é feito aplicando-se o operador sobrecarregado de extração (>>) no comando cin. Isso precisa ser seguido pela variável que irá guardar o dado que será lido

Declarando a variável como desejada, então espera por uma entrada do cin (teclado) para que possa guardá-la em um espaço reservado da memória ROM.

O comando cin só pode processar a entrada do teclado depois que a tecla ENTER for pressionada. Sendo assim, mesmo que você peça um único caractere, o cin não irá processar a entrada até que o usuário pressione ENTER depois que o caractere tenha sido digitado.

Você precisa sempre considerar o tipo da variável que você está usando para guardar o valor extraído pelo cin. Se você pedir um inteiro, você receberá um inteiro, se você pedir um caractere, você receberá um caractere, e se você pedir uma string de caracteres, você receberá uma string de caracteres.

� return;

A instrução return faz com que a função main() termine e retorne o código que segue a instrução, nesse caso o 0. Essa é a maneira mais comum de terminar um programa que não encontrou nenhum erro durante sua execução. Como você verá em exemplos seguintes, todos os programas em C++ terminam com um comando parecido com esse.

� Exemplo de aplicação: Desenvolva um algoritmo que receba a massa e o volume de uma amostra qualquer e calcule

sua densidade. Solução:

#include<iostream.h> #include<conio.h> float massa, vol, den; main{ cout<< “Digite a massa do material”<<endl; cin>>massa; cout<< “Digite a massa do material”<<endl; cin>>vol; den = massa/vol; // Aqui será calculado o valor da densidade cout<< “A densidade do material sera ”<<den<<endl; return 0; getch();}

Observe que as estruturas utilizadas para a resolução desse programa já foram explicadas e detalhadas.

Page 11: lÓGICA DE ALGORITMOS COM C++

10

Observação importante: Sendo assim, você deve ter notado que nem todas as linhas desse programa realizaram uma

ação. Havia linhas contendo apenas comentários (aquelas iniciadas por //), linhas com instruções para o pré-processador do compilador (aquelas iniciadas por #), também haviam linhas que iniciavam a declaração de uma função (nesse caso, a função main) e, finalmente linhas com instruções (como a chamada à cout <<), todas essas últimas foram incluídas dentro do bloco delimitado pelas chaves ({}) da função main

O programa foi estruturado em linhas diferentes para que seja mais fácil lê-lo, mas isso não é obrigatório. Por exemplo, ao invés de:

#include <iostream.h> #include <conio.h> int main () { cout << " Exemplo "<<endl; return 0; getch();}

Poderíamos ter escrito: int main () { cout << " Exemplo"; return 0; } em apenas uma linha e isso

teria exatamente o mesmo significado. Porém, as estruturas “#include <iostream.h>” e “#include <conio.h>” devem ser inseridas em

linhas diferentes, pois o compilador não consegue diferencia-las quando essas estão inseridas na mesma linha.

Exercícios Propostos 1) Cálculo da média de quatro números inteiros dados. 2) Cálculo do quadrado de um número dado. 3) Cálculo da função f(x,y) = 2x+3y , com x e y sendo números reais dados. 4) Um bloco de concreto cai do topo de um prédio cuja altura é X metros acima do solo. Determinar o tempo de queda até o solo e a sua velocidade linear no instante em que atinge o solo. Despreze a resistência do ar e considere g=10 m/s2. ( S=So+Vot+at2/2 V=Vo+at). 5) Determine a média final de um aluno, dados as notas das provas (P1, P2) e dos trabalhos (T1, T2) obedecendo ao seguinte critério: Média = 0.2*(0,4*T1+0,6*T2)+0,4*(0,4*P1+0,6*P2) 6) Um veterinário realizou uma compra para abastecer sua clínica. Os itens comprados e os respectivos valores das unidades são: X coleiras (XR), Y casinhas de cachorro (YR), M camas para gatos (MR), 26/3 de sacos de ração (S), V vacinas contra raiva (VR). Determine o custo total da compra. 7) Dado um número inteiro A de quatro dígitos, obtenha dois outros números B e C sendo B formado pelos dois primeiros dígitos de A e C pelos dois últimos dígitos. Ex: A= 3421 B=34 e C=23 8) Dado um número inteiro A de três dígitos obtenha a soma destes dígitos Ex: A=872 soma=17

Page 12: lÓGICA DE ALGORITMOS COM C++

11

Comentários no Programa

Comentários são pedaços de código-fonte descartados do código pelo compilador. Eles não fazem nada. O objetivo deles é somente permitir que o programador insira notas ou descrições dentro do código-fonte. O C++ suporta duas maneiras para inserir comentários: // comentário de linha /* comentário de bloco */ O primeiro deles, o comentário de linha, descarta tudo desde onde o par de barras (//) é achado até o final daquela mesma linha. O segundo deles, o comentário de bloco, descarta tudo entre os caracteres /* e a próxima aparição dos caracteres */, com a possibilidade de incluir diversas linhas. Nós iremos adicionar comentários ao nosso segundo programa:

/* programa para analisar o valor de entrada */ #include <iostream.h> #include <conio.h> main () int valor; { cout << "Digite o valor desejado"; //associar valor cin>>valor; if (valor >=100) { cout<<“seu valor e considerado alto”<<endl; } else { cout<<“seu valor e considerado baixo”<<endl;} return 0; getch(); }

Note que “//associar valor” e “/* programa para analisar o valor de entrada*/ ” são os

comentários inseridos pelo programador para melhor compreensão de seu programa. Além disso, outros programadores podem compreender o programa mais facilmente, além de poder encontrar, caso exista, possíveis erros com mais exatidão.

Page 13: lÓGICA DE ALGORITMOS COM C++

12

Operadores

É necessário para programar, ter conhecimento de constantes e operadores, e seu respectivo significado, praticamente todos os programas fazem uso deles. São indispensáveis para a criação de programas de forma rápida e mais eficiente.

� Constantes de Barra Invertida

Código Significado \b Retrocesso (backspace) \f Alimentação de Formulário (form feed) \t Tabulação Horizontal (tab) \n Nova Linha \” Aspas \’ Apostrofo \0 Nulo \\ Barra Invertida \a Sinal Sonoro (Beep) \N Constante Octal (N é o valor da constante) \xN Constante Hexadecimal (N é o valor da constante)

� Operadores Aritméticos

Operador Ação

+ Soma - Subtração ou troca de sinal * Multiplicação / Divisão % Resto da divisão inteira ++ Incremento -- Decremento

� Operadores Relacionais

Operador Ação

> Maior que >= Maior que ou igual a < Menor que

<= Menor que ou igual a == Igual a != Diferente de

� Operadores lógicos

Operador Ação

&& AND || OR ! NOT

Page 14: lÓGICA DE ALGORITMOS COM C++

13

� Operadores Lógicos Bit a Bit

Operador Ação & AND Lógico | OR Lógico ^ XOR (OR exclusivo) ~ NOT

>> Shift Rigth << Shift Left

Constantes e Variáveis

� Restrições para a atribuições de variáveis

� As constantes são valores que serão mantidos fixos pelo compilador � O nome das variáveis deve começar com uma letra ou um sublinhado “_”. � Os demais caracteres podem ser letras, números ou sublinhado. � O nome da variável não pode ser igual a uma palavra reservada e aos nomes das

funções. � Tamanho máximo para o nome de uma variável é 32 caracteres.

� Classificação de Constantes e Variáveis

� Locais Podem ser usadas apenas na função onde foi declarada, sendo inutilizáveis para as

demais funções.

� Globais Podem ser usadas em qualquer lugar do programa

� Modificador const

A linguagem C++ introduz um novo modificador chamado const, que tem comportamento variado dependendo do local onde está sendo declarado. Sua função, basicamente, é estabelecer um vínculo entre declaração e obrigatoriedade da coerência no uso do símbolo declarado.

A princípio, quando declaramos uma constante com este modificador fazemos com que seja obrigatório o uso do símbolo de forma que o mesmo não possa ter seu valor alterado. Assim, se fizermos:

const int x = 4;

O inteiro x não poderá deixar de ter valor igual a 4. Qualquer tentativa de modificar o valor da constante ao longo do programa será reportada como erro pelo compilador.

Page 15: lÓGICA DE ALGORITMOS COM C++

14

O comando Include e as Bibliotecas

Como podemos ver, a linguagem C++ tem a capacidade de importar bibliotecas. A importância da biblioteca em C é imensa, pois ela nos poupa de muita programação. Uma vez que a função já está pronta dentro da biblioteca, basta importar tal biblioteca e utilizar a função que queremos.

Por exemplo, se quiséssemos mostrar uma mensagem na tela, você não tem que produzir uma função inteira ou criar um comando novo, basta importar a biblioteca <iostream.h>, que possui a finalidade de I/O (entrada e saída) de dandos. Quando o programa for compilado, o compilador irá buscar nas bibliotecas exigidas pelo usuário tais funções para saber como utilizá-las no programa.

O papel do pré-processamento é indicar, antes mesmo de compilar, os parâmetros necessários para ser criado o arquivo executável.

O pré-processamento é indicado pelo caractere sharp (#) no inicio da linha e deve ser usado na importação de bibliotecas ao programa que será desenvolvido. A importação de uma biblioteca é dada pelo comando #include (incluir) seguido da biblioteca entre os sinais de menor (<) e maior (>).

O .h é a extensão do arquivo da biblioteca que vem da palavra inglesa HEADER (cabeçalho). Após importarmos uma biblioteca por linha, no final dessa lista devemos demonstrar que tipo

de funções usaremos. Na grande maioria dos casos usaremos as funções padrões de cada bibloteca. Podemos fazer isso facilmente digitando a palavra reservada USING* indicando o espaço de nome (namespace) standard (std) , que quer dizer padrão em inglês.

Como exemplo, importaremos uma biblioteca padrão de entrada e saída de C++.

#include<iostream.h> using namespace std;

As bibliotecas de C são diferentes das bibliotecas de C++. Apesar de muitos compiladores de

C++ suportarem as bibliotecas de C, nenhum compilador exclusivamente de C suporta bibliotecas de C++.

Algumas bibliotecas do C++

� <algorithm>

� <fstream>

� <functional>

� <iostream>

� <locale>

� <map>

� <set>

� <sstream>

� <string>

� <vector>

Page 16: lÓGICA DE ALGORITMOS COM C++

15

Biblioteca <Math.h> Existem vários processos em um algoritmo que podemos simplesmente determinar como

operações matemáticas ou cálculos sendo executados pelo nosso programa. Levando para a questão realmente matemática, em C++ existe uma biblioteca própria para

cálculos matemáticos um pouco mais complexos, a biblioteca ao qual nos referimos é a <math.h> Com a biblioteca <math.h> podemos encontrar facilmente funções para calcular potências, raíz

quadrada, funções trigonométricas para cálculos que envolvem seno, co-seno e tangente, além de constantes para números irracionais como, por exemplo, PI (Π) e √2.

Simbologia O que é Valor da constante no C++ e Número de Euler 2,7172818284590452354

log2 e Logaritmo de e na base 2 1,4426950408889634074 log10 e Logaritmo de e na base 10 0,43429448190325182765 Ln2 (x) Logaritmo neperiano binário 0,69314718055994530942 Ln10 (x) Logaritmo neperiano ou natural 2,30258509299404568402 Π Pi 3,14159265358979323846 Π/2 Meio Pi 1,57079632679489661923 Π/4 Quarto de Pi 0,78539816339744830962 √2 Raiz quadrada de 2 1,41421356237309504880 √½ Raiz quadrada de meio 0,70710678118654752440

Como podemos ver, todas as constantes são valores do tipo double. E isso se reflete nas

funções.

� Trigonométricas

sin (): Retorna o valor do seno. Recebe como argumento o valor dos graus em double. cos (): Retorna o valor do co-seno. Recebe como argumento o valor dos graus em double. tan (): Retorna o valor da tangente. Recebe como argumento o valor dos graus em double.

� Logarítmicas

log (): Retorna o valor do logaritmo na base 2. Exige um argumento do tipo double. log10 (): Retorna o valor do logaritmo na base 10. Exige um argumento do tipo double.

� Potências pow (): Retorna o valor da base elevada ao expoente. Recebe dois argumentos do tipo double, o primeiro é a base e o segundo o expoente. Por exemplo: se quisermos saber o resultado da operação 210, faríamos pow (2, 10). sqrt (): Retorna o valor da raiz quadrada. Recebe como argumento um double do qual ele deve extrair a raiz.

Page 17: lÓGICA DE ALGORITMOS COM C++

16

Controle de Fluxo de Execução – Decisão

Os métodos de tomada de decisão no C++, estão presentes para as tarefas mais corriqueiras que o programa deve executar. Além desta forma de controle de decisões, C++ provê certas funcionalidades relacionadas a objetos que modificam a forma como o código é estruturado e, por consequência, decidem como o programa deve se comportar em determinadas situações. Examinemos os métodos básicos e analisemos de forma simples as estruturas de decisão, para entender como isso poderá nos ajudar a tornar o código mais bem construído.

� Estrutura IF/ELSE

Uma ação muito importante que o processador de qualquer computador executa, e que o torna

diferente de qualquer outra máquina, é a tomada de decisão definindo o que é verdadeiro e o que é falso.

Se quisermos fazer um bom programa, esse programa deve ser capaz de definir caminhos diferentes de acordo com decisões que o próprio programa toma. Para isso, precisamos de uma estrutura seletiva da qual o único valor possível é o bit 1 ou 0, resumindo: retornar o valor VERDADEIRO ou FALSO.

Em C / C++, como em muitas linguagens de programação, quem faz isso é o “if” , ou seja, se for tal coisa, faça isso! Simples desse jeito.

O ELSE é o que chamamos de caso contrário, ou seja, se for falso execute o que está no ELSE. Exemplificando: Se (IF) for tal coisa, faça isso! Caso contrário (ELSE), faça aquilo, com essa

idéia, selecionaremos apenas uma ação ou um único conjunto de ações, não podendo realizar 2 condições diferentes. 1 condição:

if (condição)

{declaração}

2 condições:

if (condição) {declaração 1;} else {declaração 2;}

3 condições:

if (condição 1) {declaração1;} else if (condição 2) {declaração 2} else {declaração 3;}

N condições:

if (condição 1) {declaração1;}

Page 18: lÓGICA DE ALGORITMOS COM C++

17

else if (condição 2) {declaração 2} else if (condição 3) {declaração 3} ... else if (condição (N-1)) {declaração (N-1)} else {declaração N;}

É possível observar que podemos criar um programa com quantas condições queremos,

restringindo a cada condição, uma ação ou um conjunto de ações. Um dos erros mais comuns é criar condições redundantes, como mostra o seguinte exemplo: Elabore um programa que diga qual ação, ou ações foram escolhidas: a) Ação 1: caso o número seja maior ou igual a 2. b) Ação 2: caso o número seja maior que 1. c) Ação 3: caso não seja satisfeita nenhuma condição.

#include<iostream.h> #include<conio.h> main() { float a; cout<<"digite o numero"<<endl; cin>>a; if (a>=2)

{cout<<"Ação 1 escolhida"<<endl;} else if (a>1) {cout<<" Ação 2 escolhida"<<endl;} else {cout<<" Ação 3 escolhida"<<endl;} getch();

}

Observe que o erro encontra-se no uso do “else if”, com ele, excluímos possibilidades possíveis

de respostas. Por exemplo, se digitarmos o número 3 no programa acima, o compilador nos dará como saída apenas a primeira condição ("Ação 1 escolhida”), onde na verdade temos duas respostas, pois satisfaz a ação 1 e 2 simultaneamente.

Se substituirmos o “if ” no lugar do “else if”, o compilador nos dará as 2 respostas possíveis ("Ação 1 escolhida” e "Ação 2 escolhida”), com isso, corrigiríamos o problema da redundância do nosso exemplo.

Com o uso apenas do “if” e do “else” é possível o compilador executar várias condições que ocorram simultaneamente.

Page 19: lÓGICA DE ALGORITMOS COM C++

18

� Exemplos de Aplicação 1) Dados dois números reais quaisquer, desenvolva um programa que diga se eles são iguais ou

diferentes. Solução:

#include<iostream.h> #include<conio.h> main() { float a,b; cout<<"digite o primeiro numero"<<endl; cin>>a; cout<<"digite o segundo numero"<<endl; cin>>b; if (b==a) {cout<<"Os números digitados sao iguais"<<endl;} else {cout<<"Os números digitados sao diferentes"<<endl;} getch(); }

2) Dado um número qualquer, determinar se este é neutro, positivo ou negativo.

Solução:

#include<iostream.h> #include<conio.h> main() { float a; cout<<"digite o numero"<<endl; cin>>a; if (a==0) {cout<<"O número digitado e nulo"<<endl;} else if (a>0) {cout<<"O número digitado e positivo"<<endl;} else {cout<<"O número digitado e negativo"<<endl;} getch(); }

3) Elabore um programa que identifique se um número inteiro digitado é par, impar ou nulo

Solução:

#include<iostream.h> #include<conio.h> #include <math.h> main() {int n;

Page 20: lÓGICA DE ALGORITMOS COM C++

19

cout<<"digite o numero"<<endl; cin>>n; if (n%2==0) { if (n==0) {cout<<" nulo "<<endl;} else {cout<<" par "<<endl;} } else {cout<<"impar"<<endl;} getch();}

Observação: Note atentamente a hierarquia das estruturas do terceiro exemplo. 4) Dado um número real qualquer, calcule sua raiz quadrada.

Solução:

#include<iostream.h> #include<conio.h> #include<math.h> main() {float n,a; cout<<"digite um numero"<<endl; cin>>n; a= pow (n,0.5); cout<<“A raiz de ”<<n<<“ é ”<<a<<endl; getch(); }

Observe que o comando pow serve para realizar operações com exponenciais. No nosso caso: a = pow(n,0.5), estamos atribuindo à variável a, a seguinte expressão

exponencial n elevado a 0.5. De forma genérica, no comando pow (A,B), teremos a função exponencial, onde A é a base e B

o expoente.

Exercícios Propostos 1) Dados três valores distintos, colocá-los em ordem decrescente. 2) Fazer um algoritmo para resolver o seguinte problema: calcular a soma dos dígitos de um número inteiro de quatro dígitos.Caso o número de entrada não possuir 4 dígitos, reportar erro ao usuário. 3) Dados os coeficientes de uma equação do segundo grau, verificar se a mesma possui raízes reais, (iguais ou diferentes). Escreva os valores das raízes. Se as raízes não forem reais emitir uma mensagem informando o fato. 4) O número 3025 tem a seguinte característica: 30+25=55 => 55*55=3025. Fazer um algoritmo que lê um número inteiro de quatro algarismos e testa se ele tem ou não a característica do 3025.

Page 21: lÓGICA DE ALGORITMOS COM C++

20

5) Dados três valores distintos, colocá-los em ordem crescente, decrescente e calcular o valor médio dos mesmos. 6) Dada a função f (x) a seguir, faça um programa que calcule f (x) para qualquer valor de x: x2 – 2 se x <-4 f (x) x +5 se –4 ≤ x <5 - x3 +8 se x ≥5 7) Dados três valores, X,Y e Z verificar se eles podem ser os comprimentos dos lados de um triângulo e, se forem, verificar se é um triângulo eqüilátero (3 lados iguais), isóscele (2 lados iguais) ou escaleno (3 lados diferentes). Se ele não formarem um triângulo, escrever uma mensagem. Condição de existência: Se X<Y+Z e Y<X+Z e Z<X+Y 8) Fazer um algoritmo usando menu, que leia um número N real e forneça as seguintes opções:

1) Cálculo da raiz de N ( o usuário deve digitar também o índice da raiz) 2) Cálculo da potência N por p ( o usuário deve digitar p (o índice da potência)) 3) Converter o número real para número inteiro 4) Calcular o resto da divisão de N por p ( o usuário deve digitar p ) 5) Sair do programa

9) Dado um número, verifique se ele é par ou ímpar. Se for par, calcule a sua raiz quadrada, se for impar calcule o seu quadrado. 10) Considere o problema de avaliação: dados uma nota é feita a seguinte avaliação, elabore um programa que informe ao usuário a situação do aluno em relação à nota: Nota inválida para 10 < nota < 0 Aprovado para 5 ≤ nota ≤ 10 Exame para 3 ≤ nota <5 Reprovado para 0 ≤ nota <3 11) Dados dois números reais distintos, calcular se eles são iguais em módulo. 12) Apresente um programa que solicite ao usuário o valor se x, calcule f(x) e mostre o resultado, sendo

2x se x ≥ 7 f (x) x +10 se –5 ≤ x < 7

- x – 5 se x <-5 13) Dado o salário inicial de cada cargo, faça um programa que ajusta os salários de funcionários de uma empresa. Se o funcionário for técnico (opção 1), o reajuste é de 50%; se for gerente (opção 2), o reajuste é de 30% se for outro funcionário (opção 3) é de 10%. 14) Faça um programa que, dado x, determine o valor de y = f (x) + g(x) , sendo:

Page 22: lÓGICA DE ALGORITMOS COM C++

21

Controle de Fluxo de Execução – Repetição

As estruturas de repetições são muito importantes para a solução de problemas na programação, pois muitas vezes o mesmo procedimentos têm que ser executados mais de uma vez, ou um número de vezes variável.

Em C/C++, basicamente existem três tipos de estrutura de repetição: for , while e do while.

� Estrutura FOR Para o for, como qualquer iteração (repetição), precisa de uma variável para controlar os loops

(voltas). No for , essa variável deverá ser iniciada, indicando pelo seu critério de execução, e forma de incremento ou decremento. Ou seja, o for precisa de três condições. Vale salientar que essas condições são separadas por ponto-e-vírgula.

O comando deve ser inserido no compilador da seguinte forma:

for (comando; condição; comando) {declaração;}

Um dos exemplos mais utilizados é o cálculo da potência de um número onde o usuário informa ao programa a base e o expoente. O programa deve fazer o número de interações iguais o número x do expoente. Considerando o número do expoente natural, positivo e maior que zero, temos o seguinte programa:

#include<iostream.h> #include<conio.h> main() {int x,y; cout<<"Digite a base"<<endl; cin>>y; cout<<"Digite o expoente"<<endl; cin>>x; int r=1 ; for (int i=0; i<x; i++ ) {r=r*y;} cout<<"O resultado será "<< r <<endl; getch();}

Observe que em “for (int i=0; i<x; i++ )”, temos as três condições dentro do parênteses.

int i=0 Critério de início e declaração da variável usada. i<x Critério de parada para a variável i. i++ ++ mostra o incremento da variável i, ou seja, aumentará de 1 em 1.

Isso fará com que ocorra de 0 a (x-1) iterações, que dará um total de x iterações.

Page 23: lÓGICA DE ALGORITMOS COM C++

22

� Exemplos de Aplicação

1) Elabore um programa que calcule o fatorial de um número dado. Solução:

#include<iostream.h> #include<conio.h> main() {int n; cout<<"digite o numero"<<endl; cin>>n; int fat=1; for (int i=1;i<=n;i++) { fat=fat*i ; } cout<<fat<<endl; getch(); }

2) Um número é dito perfeito quando a soma de seus divisores (exceto ele mesmo), é ele

próprio. Exemplo 28, divisores = 14+7+4+2+1 =28. Elabore um programa que diga se o número digitado é perfeito ou não.

Solução:

#include<iostream.h> #include<conio.h> #include<math.h> main() { int n; int cont=0; cout<<"Digite um número para descobrir se este é perfeito"<<endl; cin>>n; for (int i=1;i<n;i++) { if (n%i ==0) { cont=cont+i;} } if (cont==n) {cout<<"perfeito"<<endl;} else {cout<<"nao perfeito"<<endl;} getch(); }

Page 24: lÓGICA DE ALGORITMOS COM C++

23

� Estrutura WHILE

Uma outra forma de iteração (repetição) em C/C++ é o WHILE. O while executa uma comparação com a variável. Se a comparação for verdadeira, ele executa

o bloco de instruções, quantas vezes for necessário, até a comparação se tornar falsa. Traduzindo para a língua portuguesa, While significa enquanto, ou seja, enquanto a condição

for verdadeira, execute sua respectiva ação. A estrutura do while é parecida com a do if, no aspecto de possuir apenas uma condição:

while (condição) {declaração;}

� Exemplos de Aplicação

1) Elabore um programa que imprima os termos de uma progressão aritmética cujo primeiro termo é 3 e a razão 5. Parar o processamento quando for impresso um termo maior que 100.

#include<iostream.h> #include<conio.h> main() {int a=3; cout<<a<<endl; while (a<100) {a=a+5; cout<<a<<endl;} getch();}

2) Elabore um algoritmo que imprima os termos da serie abaixo. Parar o processamento quando for impresso um termo negativo.

15, 30, 60, 12, 24, 48, 9, 18, 36, 6, 12, 24, ...

#include<iostream.h> #include<conio.h> main() {int n=15; int cont=0; while (n>=0) {cout<<n<<endl; n=n*2; cont=cont+1; if (cont==2) {cont=0; n=(n/4)-3;} cout<<n<<endl;} getch();}

Um dos erros mais freqüentes, realizado por programadores desatentos, é o loop-infinito , que é

caracterizado por ocorrer infinitas iterações na estrutura.

Page 25: lÓGICA DE ALGORITMOS COM C++

24

� Exemplo de loop-infinito

Elabore um algoritmo que imprima os termos da serie abaixo, parando o processamento quando for impresso um termo maior que 80.

5, 10, 6, 11, 7, 12, 8, 13, ...

#include<iostream.h> #include<conio.h> main() {int n=5; int r=5; while (n<=80) {cout<<n<<endl; n=n-r; if (r==5) {r=-4;} else {r=5;} } cout<<n<<endl; getch();}

Observe que o erro consiste na expressão “n=n-r” que deveria ser: “n=n+r” .

Na expressão “n=n-r” o valor de n irá diminuir com o passar das interações, e sempre satisfará a condição de ser menor ou igual a 80, fazendo que continue com as iterações de modo infinito.

O compilador possivelmente acarretará um erro quando ocorrer o loop-infinito .

� DO/WHILE

A estrutura de repetição DO/WHILE parte do princípio de que deve-se fazer algo primeiro e só depois comparar uma variável para saber se o loop será executado mais uma vez.

A estrutura do/while é parecida com a do while, no aspecto de possuir apenas uma condição, e ambas são estruturas de repetição, porém o do/while, diferentemente do while, informa a condição ao compilador apensa no final da estrutura.

do {declaração;} while (condição);

Partindo do ponto de vista que o usuário irá digitar o valor da variável durante o bloco do “do”

e só depois será comparada no WHILE no final do bloco, isso pode ajudar muitas vezes em que é necessário executar um loop, nem que seja uma vez.

� Exemplo de Aplicação:

1) Faça um programa que analise se k é maior que n, se isso for verdadeiro, e imprima todos os valores de k a n, se k for igual a n calcule o fatorial de k, e caso k for menor que n, apenas informe ao usuário.

Page 26: lÓGICA DE ALGORITMOS COM C++

25

Solução:

#include <iostream.h> #include<conio.h> main() { int k,n; cout<<"Digite o valor de k"<<endl; cin>>k; cout<<"Digite o valor de n"<<endl; cin>>n; cout<<" "<<endl; if (n==k) {int fat=1; for (int i=1;i<=k;i++) {fat=fat*i;} cout<<"O fatorial de "<<k<<" e "<<fat;} else if (k>n) {do {cout<<n<<endl; n=n+1;} while (k>=n);} else {cout<<"O valor de k e menor que n"<<endl;} getch();} return 0;

Exercícios Propostos

1) Elabore um algoritmo que imprime ao usuário os termos de uma PG, de razão 2, onde o termo inicial é 4,5

2) Elabore um algoritmo que imprima os termos da série abaixo. Parar o processamento quando

for impresso um termo maior que 100. 1, 2, 1 ,4 ,1 ,6, 1, 8, 1, 10 ...

3) Desenvolva um programa que diz se um número é primo ou não 4) Elabore um algoritmo que imprima os termos da série de FIBONACCI. Parar o processamento

quando for impresso um termo maior que 800. 0, 1, 1 ,2 ,3 ,5, 8, 13, 21 ...

5) Elabore um algoritmo que imprima os termos da série abaixo. Parar o processamento quando for impresso um termo maior que 100. 4, 8, 11, 13, 14, 18, 21, 23, 24, 28...

6) Elabore um algoritmo que imprima os termos da serie abaixo. Parar o processamento quando for impresso um termo maior que 500.

Page 27: lÓGICA DE ALGORITMOS COM C++

26

1, 2, 3, 4, 8, 9, 10, 11, 22, 23, 24, 25, 50, 51, 52, 53, ...

7) Elabore um algoritmo que imprima os termos da serie abaixo. Parar o processamento quando for impresso um termo maior que 70. 2, 6, 9, 11, 12, 11, 15, 18, 20, 21, 20, 24, 27, ...

5) Elabore um algoritmo que imprima os termos da serie abaixo. Parar o processamento quando for impresso um termo maior que 40. 10, 8, 6, 4, 8, 12, 16, 14, 12, 10, 14,18, 22, ...

6) Uma quantia de R$ 500.000,00 foi depositada em um banco que paga 13% de juros ao mês. O dinheiro fica no banco durante 20 anos. Elabore um algoritmo que imprima o montante: a) a cada 3 meses, para os 3 primeiros anos; b) a cada 2 anos, para os 4 anos seguintes; c) a cada 3 meses, para os 6 ultimos anos;

7) Considere uma quantidade desconhecida de números reais, positivos. Elabore um algoritmo para ler esses números e imprimir: a) todos os valores cuja parte decimal for maior a 0,8 b) a quantidade de valores cuja parte decimal for menor ou igual a 0,5

8) Fazer um algoritmo que, dada uma seqüência de N números reais, determine qual é o maior e

qual é o menor número da seqüência e determine a posição que eles ocupam na seqüência. 9) Faça um algoritmo que leia uma seqüência de números quaisquer e calcula os quadrados dos

valores absolutos destes números. Fornecer a opção de repetir a leitura do número com (0) para sim e (1) para não.Utilizar teste inicial com entrada forçada.

10) Fazer um algoritmo em forma de Menu que forneça as seguintes opções para o usuário:

A - Cálculo da raiz do um número (método de aproximações sucessivas de Newton) B - Cálculo do fatorial de um número (utilizando agora a estrutura determinística) C- Determinar se um número é primo F- Determinar o quadrado do valor absoluto de um número G- Determinar se um número é perfeito H - Sair do algoritmo O algoritmo deve ler o número de forma conveniente para cada operação.

11) Dado um número inteiro de quatro algarismos imprimir o número formado pelos 2 primeiros

dígitos, o número formado pelos 2 últimos dígitos e a soma desses dois últimos. Por exemplo, se for dado 5283 deverão ser impressos 52, 83 e o resultado da soma: 52+83. Após a leitura, deve-se verificar se o número realmente é formado por quatro algarismos. Se não for, a leitura deve ser repetida até que seja digitado um número correto. Como critério de parada utilize uma entrada nula.

12) Faça um algoritmo que leia dois números k e n e imprima os números k, k+1, ... ,n ,até que k

seja maior que n, caso isso não seja possível, reportar erro ao usuário.

Page 28: lÓGICA DE ALGORITMOS COM C++

27

� Switch / Case

Uma outra forma de estrutura seletiva é o switch. Dentro dos switch há o case (que significa caso). Ou seja, é quase que um if com várias possibilidades, mas com algumas diferenças importantes.

Primeira diferença: Os cases não aceitam operadores lógicos. Portanto, não é possível fazer uma comparação. Isso limita o case a apenas valores definidos.

Segunda diferença: O switch executa seu bloco em cascata. Ou seja, se a variável indicar para o primeiro case e dentro do switch tiver 5 cases, o switch executará todos os outros 4 cases a não ser que utilizemos o comando para sair do switch. (Nos referimos ao BREAK ).

Agora, que conhecemos diferenças importantes, vamos ver como proceder com o switch / case. Primeiro o comando switch e entre parênteses a variável na qual está guardado o valor que será avaliado pelo case. Então, abre-se o bloco de dados. Dentro do bloco de dados colocamos o comando case e logo após um valor terminando a linha com dois pontos (:). Preste atenção no tipo de v ariável que será colocado, pois há diferenças entre um dado e outro. Por exemplo: 1 não é a mesma coisa que '1' e 'a' não é a mesma coisa que 'A'.

Então, é estruturado os comando que serão executados pelo case. Estruturalmente, seria isso:

switch (variável) {case valor1: Dados a serem executados; break; case valor2: Dados a serem executados; break;}

� Exemplo de Aplicação:

1) Elabore uma simples calculadora que realize as operações de adição, subtração, multiplicação e divisão, utilizando a estrutura switch/case. Solução:

#include <iostream.h> #include <conio.h> main () {int a, b, c, operacao; cout <<"Digite o 1o valor: "; cin >> a; cout <<"Digite o 2o valor: "; cin >> b; cout <<"Que operacao deseja realizar?"<<endl; cout<<"1.Adicao\t 2.Subtracao\t 3.Multiplicacao\t 4.Divisao \n\n=>"; cin >> operacao; switch (operacao) {case 1: c=a+b; cout <<a<<" + "<<b<<" = "<<c<<endl; break;

Page 29: lÓGICA DE ALGORITMOS COM C++

28

case 2: c=a-b; cout <<a<<" - "<<b<<" = "<<c<<endl; break; case 3: c=a*b; cout <<a<<" * "<<b<<" = "<<c<<endl; break; case 4: c=a/b; cout <<a<<" / "<<b<<" = "<<c<<endl; break;} getch(); return 0;}

Perceba que no final de cada case há um break. Porque se não houvesse, o switch continuaria

executando até o final. Por exemplo, no exercício anterior, havia 4 casos (case), e escolhemos a operação 2, caso não houvesse o break, o programa executaria os casos seguintes, no nosso caso, a operação 3 e 4

� Default

Default, do inglês padrão, é o case que é ativado caso não tenha achado nenhum case definido. Ou seja, é o que aconteceria em último caso. Vamos imaginar o seguinte cenário: Seu programa pede para que o usuário digite apenas duas opções (S ou N) para reiniciar o programa. Mas, propositalmente ou por engano, o usuário digita uma opção totalmente diferente. E agora? O que seu programa deve fazer? É aqui que o default entra. Geralmente o default é quando é previsto um erro, uma entrada de dado incorreta ou não de acordo com o contexto. O default tem seu papel parecido com o else, da estrutura if/else, caso nenhuma condição for feita, fará os comandos definidos no default.

#include <iostream.h> #include <conio.h> #include <cstdlib> main() {char opcao; int a=1; while (a==1) {cout <<"Deseja reiniciar o programa? [S/N]\n"; cin >> opcao; opcao=toupper(opcao); // deixar a letra maiúscula switch (opcao) {case 'S': //Entre aspas simples porque é um caracter cout<< "o programa será finalizado"<<endl; a=0; break; case 'N': //Entre aspas simples porque é um caracter cout<< "o programa continuará em execução"<<endl;

Page 30: lÓGICA DE ALGORITMOS COM C++

29

a=1; break; default: cout <<"Opção invalida"<<endl; a=1; break;}} getch();}

Como podemos ver, há dois casos: S para reiniciar ou N para sair. Se por acaso alguém digitar

algo diferente disso, executa-se o default, que informa que a opção escolhida é invalida e repete a pergunta se o usuário deseja sair do programa, até que seja digitada uma opção valida (S ou N). Como a linguagem C/C++ é case sensitive (diferencia maiúsculas de minúsculas) usamos uma função para deixar a letra maiúscula (toupper da biblioteca ctype). Agora, não importa o que o usuário digitar, pois o programa está preparado para reagir à qualquer entrada de dado.

Exercícios Propostos

1) Elabore um programa que receba do usuário um número entre 1 e 12, inclusive 1 e 12. Se

ele digitou o número 1 , mostre "O mês atual é Janeiro". Se ele digitou o número 2, mostre "O mês atual é Fevereiro" .

2) Peça um número e informe de acordo com as condições : 1 - Inclusão 2 - Exclusão 3 - Alteração 4 - Consulta 5 - Relatório Outros - Opção Inválida

3) Implemente a “calculadora maluca”, utilizando uma instrução switch-case para determinar a

operação que deve ser executada, conforme o usuário escolheu no menu de opções: Considere que o usuário entre com valores estritamente positivos.

Opção 1: Subtrai o fatorial do primeiro pelo segundo ao quadrado. Opção 2: Calcula a soma do cubo do primeiro com a metade do segundo. Opção 3: Calcula a soma da raiz quadrada dos números digitados. Opção 4: Soma da divisão do primeiro pelo segundo com o segundo. 4) Criar um programa que receba por janela JoptionPane o valor de um produto e um código de

aumento, segundo a tabela: Código Aumento (%) A 10 B 25 C 30 D 50 E 60

Page 31: lÓGICA DE ALGORITMOS COM C++

30

Arrays Unidimensionais – Vetores

Vetores, também chamados arrays (inglês), são uma maneira de armazenar vários dados num mesmo nome de variável através do uso de índices numéricos.

Por exemplo, se tivemos que criar 20 variáveis do mesmo tipo que querem dizer a mesma coisa, nós não criaríamos -> int x1, x2, x3, x4, x5, ... ao invés disso, criaríamos apenas uma variável de vetor para guardar todos os 20 números de uma vez.

Declaramos vetores de maneira muito semelhante à declaração de variáveis normais. A única diferença é que depois do nome da variável deve ser informada a quantidade de elementos do vetor. Para declarar um vetor qualquer, com cinco elementos inteiros, escrevemos:

Primeiro , o tipo de dado: int, float, double, ... Segundo, o nome da variável: usando as mesmas convenções de uma variável comum. (array,

vetor, vet, ...) E por fim , o tamanho necessário do vetor escrito entre colchetes: [5], [10], [3]... Então, definimos a declaração de um vetor da seguinte maneira, por exemplo:

int vet [4];

Note que a quantidade de elementos de um vetor não pode ser alterada depois que o vetor for

declarado. Todo vetor é um espaço linear na memória dividido de acordo com o tamanho que declaramos. Portanto, se declaramos “int vet [4]”, na memória é representado da seguinte forma:

Criamos então uma única variável com 4 espaços nos quais podem ser guardados números inteiros.Agora, para acessarmos um local específico dessa memória devemos indicar entre colchetes a posição desejada no vetor que chamamos de index.

O importante mesmo é saber que não importa o tamanho do vetor, o index (número que indica a posição) sempre começa em 0. Portanto, um vetor de tamanho 20 vai da posição 0 a 19, um vetor de tamanho 180 vai da posição 0 a 179, um vetor de tamanho 4 vai da posição 0 a 3. , portanto, se o número de elementos é N, o índice ou posição do último elemento será N − 1.

Agora, se quisermos atribuir os valores 540 na posição 1 e 8456 na posição 3 faríamos: vet [1]=540; vet [3]=8456.

Page 32: lÓGICA DE ALGORITMOS COM C++

31

Não podemos nunca nos esquecer que o limite do vetor é sempre seu tamanho menos 1. Usando

o exemplo: vetor de tamanho 4, posição máxima é 3 (pois 4-1=3). Então, se atribuirmos um valor a posição 4 ocorrerá um erro. Resumidamente, jamais poderíamos fazer vet [4]=200.

� Erro freqüente: Analise a seguinte situação:

int vet[4]; vet[0] = 3; int x = vet[2]; int y = vet[7]; // ERRO!

Observe que o programador atribuiu à variável y, o valor do vetor numa posição inexistente,

ocasionando assim um grande erro, pois o compilador atribuirá um valor desconhecido a variável.

� Exemplo de Aplicação: 1) Elabore um algoritmo que receba 10 valores distintos, e imprima eles na seqüência que foi digitado e na ordem crescente. Solução:

#include<iostream.h> #include<conio.h> main() {int vet[10],aux ,i, k; for (i=0;i<10;i++) {cout<<"Digite o termo "<<i+1<<endl; cin>>vet[i];} for (i=0;i<10;i++) {cout<<vet[i]<<" ";} cout<<" "<<endl; for (i=0;i<9;i++) {for (k=i;k<10;k++) {if(vet[i]>vet[k]) {aux=vet[i]; vet[i]=vet[k]; vet[k]=aux;}}} cout<<"Ordem crescente"<<endl; for (i=0;i<10;i++) {cout<<vet[i]<<" ";} getch(); return 0;}

Page 33: lÓGICA DE ALGORITMOS COM C++

32

No código acima criamos um vetor de tamanho 10 e usamos uma iteração (repetição / loop) para preencher todos os espaços do vetor e então outra iteração para mostrar todos os valores guardados. Para mudarmos as posições do vetor usamos uma variável chamada i.

2) Elabore um algoritmo que receba 10 valores distintos, e imprima eles na seqüência contrária na qual foi digitada. Solução:

#include<iostream.h> #include<conio.h> main() {int vet[10],aux ,i, k; for (i=0;i<10;i++) {cout<<"Digite o termo "<<i+1<<endl; cin>>vet[i];} for (i=0;i<10;i++) {cout<<vet[i]<<" ";} cout<<" "<<endl; cout<<"Ordem inversa"<<endl; for (i=0;i<10;i++) {cout<<vet[9-i]<<" ";} getch(); return 0;}

Observe que a ordem do vetor não foi alterado, apenas mudamos a forma de impressão.

3) Elabore um algoritmo que receba 5 valores distintos, transporte para um vetor VP, apenas os elementos primos. Solução:

#include<iostream.h> #include<conio.h> #include<math.h> main() {int vet[5],vp[5],i,a; int k=0; for (i=0;i<5;i++) {cout<<"Digite o termo "<<i+1<<endl; cin>>vet[i];} for (i=0;i<5;i++) {if (vet[i]%2 ==0) {vp[k]=vet[i]; k=k+1;}} cout<<"VP = "; for (i=0;i<k;i++) {cout<<vp[i]<<" ";} getch(); return 0;}

Page 34: lÓGICA DE ALGORITMOS COM C++

33

Exercícios Propostos

01) Elabore um algoritmo para ler uma sequência de 20 valores inteiros positivos e armazená-los em um vetor VET. Imprimir o vetor.

02) Dado um vetor, comparar todos os seus elementos um a um e ordena-los em ordem crescente e

decrescente. 03) Elabore um algoritmo para ler um vetor VET de 20 valores inteiros positivos e gerar dois outros

vetores VP e VI onde: VP conterá apenas os valores pares de VET, e VI conterá apenas os valores ímpares. Imprimir VET, VP e VI

04) Elabore um algoritmo para armazenar em um vetor KV todos os valores inteiros positivos

desde 1 até 50. Transportar todos os elementos primos do vetor KV para um vetor PV. Imprimir os dois vetores.

05) Elabore um algoritmo para ler um vetor V de 20 valores inteiros positivos, calcular e imprimir o

fatorial de todos os elementos pares do vetor, e calcular e imprimir a potência de 5 de todos os valores ímpares do vetor.

06) Construa um contador N que varie de 1 a 10 e construa um vetor A(N)=N2. Imprima N e A(N)

07) Apresente um algoritmo que receba uma seqüência de 9 valores, atribua-os a um vetor e

imprima-os na seqüência contrária da que foi recebida.

08) Construa um programa que leia um Número (N) de nomes de pessoas e suas respectivas idades e guarde esses dados em dois vetores distintos. Imprima o nome e a idade de cada pessoa na mesma linha. Em seguida escolha um número (índice do vetor) e imprima o nome e a idade da pessoa correspondente a este número

09) Faça um algoritmo que leia dois vetores de mesma dimensão e realize a soma entre eles.

Ex: vetor1=( 2, 4, 10, 11, 8, 6) , vetor2 = ( 4, 3, 1, 2, 0, 1) , vetor resultante = (6, 7,11, 13, 8, 7)

10) Ler uma variável de 15 elementos numéricos e verificar se existem elementos iguais a 25. Se existirem, escrever as posições em que estão armazenados.

11) Elabore e implemente um algoritmo que faça um cadastro de materiais de construção. Os itens

devem ser lidos e armazenados. Para cada item deve ser associado o nome do produto, um código e a quantidade existente em estoque. Depois escolha um código e imprima o nome do item e da quantidade existente correspondente a este código.

12) Deseja-se publicar o número de acertos de cada aluno em uma prova em forma de testes. A

prova consta de 5 questões, cada uma com cinco alternativas identificadas por A, B,C, D e E. Para isso são dados: o cartão gabarito, o cartão respostas para cada aluno, contendo o seu número e as respostas. Faça um algoritmo que resolva o problema e imprima os resultados.

13) Faça um algoritmo que calcula a média das notas de 10 alunos e determine o número de alunos

que tiveram nota superior a média calculada; o aluno que teve a maior nota e o aluno que teve a menor nota. Imprima uma lista com o nome dos alunos e a nota na ordem decrescente de notas juntamente com seus respectivos nomes.

Page 35: lÓGICA DE ALGORITMOS COM C++

34

14) A FEIS deseja saber se existem alunos cursando, simultaneamente, as disciplinas ICC e cálculo numérico. Existem disponíveis na unidade de entrada os números de matrícula de ICC (máximo 60 alunos) e Cálculo Numérico (máximo 80). Cada conjunto dos números de matrícula dos alunos de uma disciplina tem a matrícula fictícia 9999 no final. Formular um algoritmo que imprima o número de matrícula dos alunos que estão cursando estas disciplinas simultaneamente. Obs: O exercício trata da ocorrência de um elemento em um conjunto em outro conjunto.

15) Implemente um programa que lê 10 inteiros do teclado ou para quando dois inteiros consecutivos sejam digitados. Após a leitura o programa deverá imprimir o maior, o menor, a média e a soma dos números digitados.

16) Tentando descobrir se um dado era viciado, um dono de cassino honesto o lançou n vezes.

Dados os n resultados dos lançamentos, determinar o número de ocorrências em cada face.

17) Um usuário deseja obter todos os números primos, em ordem crescente, de uma série de 20 número aleatórios, não seriados.Elabore um programa que solucione esse problema, e imprima a seqüência digitada pelo usuário, a seqüência dos números primos em ordem crescente e a seqüência dos números não utilizados (não primos).

18) Faça um programa que utilize uma estrutura de repetição para ler 50 números armazenando-os

em um vetor e calcule e exiba a média aritmética deles. Em seguida o programa deve apresentar todos os valores armazenados no vetor que sejam menores que a média.

19) Desenvolva um programa que leia um vetor unidimensional de 10 números inteiro e exiba-o

verticalmente, trocando os elementos entre si, dois a dois, ou seja, os de índices par com os de índice ímpar.

20) Construa um programa que gere um vetor VI, que receba um número par de elementos e

multiplique os mesmos devolvendo o array resultante. Por exemplo, o array de entrada com os valores {1, 23, 10, 5, 7, 11} resulta no array de saída {23, 50, 77}.

21) Dados dois vetores x e y, ambos com n elementos, determinar ambos, são exatamente iguais. 22) Dada uma seqüência de n termos que contenha os números reais (0.0, 1.5, -1.7, 2.3 e 3.0)

determinar os números que compõem a seqüência e o número de vezes que cada um deles ocorre na mesma. Exemplo: n = 8 Seqüência: [-1.7, 3.0, 0.0, 1.5, 0.0, -1.7, 2.3, -1.7] Saída: -1.7 ocorre 3 vezes

3.0 ocorre 1 vez 0.0 ocorre 2 vezes 1.5 ocorre 1 vez 2.3 ocorre 1 vez

Page 36: lÓGICA DE ALGORITMOS COM C++

35

Arrays Bidimensionais e Multidimensionais

Além das matrizes simples de uma única dimensão (vetores) , C++ permite a criação de matrizes de múltiplas dimensões. As matrizes bidimensionais são sem dúvida as mais utilizadas e as mais úteis, pois se comportam como tabelas com linhas e colunas. Ao declarar uma matriz multidimensional, adicionamos um conjunto de colchetes para cada dimensão extra. Entre os colchetes de cada dimensão, colocamos o número de elementos que aquela dimensão terá (ou uma variável que represente o número de elementos). Assim:

� int tabela [10] [5]; //matriz bidimensional � int horas [12] [30] [24]; //matriz de três dimensões � int minutos [12] [30] [24] [60]; //matriz de quatro dimensões E assim por diante...

Normalmente trabalhamos no máximo com matrizes bidimensionais, mas podem surgir

ocasiões onde matrizes de mais de duas dimensões sejam necessárias. Matrizes multidimensionais funcionam como matrizes dentro de matrizes. Por exemplo, uma matriz bidimensional pode ser vista como uma matriz de uma dimensão cujos elementos são outra matrizes.

� Exemplo de Aplicação:

1) Elabore um programa que receba uma matriz 4x4 e informe ao usuário os elementos da diagonal secundária , depois ordene os mesmo de modo decrescente. Solução:

#include<iostream.h> #include<conio.h> main() {int vet [4][4],vet2[4],i,j,aux; int k=0; for (i=0;i<4;i++) {for (j=0;j<4;j++) {cout<<"Digite o elemento de linha "<<i+1<<" e coluna "<<j+1<<endl; cin>>vet [i][j];}} for (i=0;i<4;i++) {vet2[k]=vet[i][3-i]; k=k+1;} cout<<"Matriz:"<<endl; for (i=0;i<4;i++) {for (j=0;j<4;j++) {cout<<vet [i][j]<<" ";} cout<<" "<<endl;} cout<<"Diagonal secundaria"<<endl; for (k=0;k<4;k++) {cout<<vet2[k]<<" ";} cout<<" "<<endl; for (i=0;i<3;i++) {for (j=i;j<4;j++) {if (vet2[i]<vet2[j]) {aux=vet2[i];

Page 37: lÓGICA DE ALGORITMOS COM C++

36

vet2[i]=vet2[j]; vet2[j]=aux;}}} cout<<"Diagonal secundaria ordenada de modo decrescente"<<endl; for (k=0;k<4;k++) {cout<<vet2[k]<<" ";} cout<<endl; getch(); return 0;}

Observe que a matriz foi construída a partir das linhas (i), e para selecionar a diagonal

secundaria para trabalharmos apenas com ela na ordenação da mesma, transportamos para um outro vetor (vet2) todos seus elementos.

2) Elabore um programa que leia uma matriz de ordem 4X5 e apresente ao usuário a matriz

transposta. Solução:

#include<iostream.h> #include<conio.h> main() {int vet [5][5],i,j,aux, k=0; for (i=0;i<4;i++) {for (j=0;j<5;j++) {cout<<"Digite o elemento de linha "<<i+1<<" e coluna "<<j+1<<endl; cin>>vet[i][j];}} cout<<"Matriz:"<<endl; for (i=0;i<4;i++) {for (j=0;j<5;j++) {cout<<vet[i][j]<<" ";} cout<<" "<<endl;} cout<<"Matriz Transposta:"<<endl; for (j=0;j<5;j++) {for (i=0;i<4;i++) {cout<<vet[i][j]<<" ";} cout<<" "<<endl;} getch(); return 0;}

3) Elabore um programa que leia uma matriz inteira qualquer de ordem 3X3. Em seguida, o

usuário escolhe um número qualquer e o programa lhe informa quantos elementos maiores ou iguais a esse número escolhido existe. Solução:

Page 38: lÓGICA DE ALGORITMOS COM C++

37

#include<iostream.h> #include<conio.h> main() {int vet [3][3],i,j,n, cont=0; int k=0; for (i=0;i<3;i++) {for (j=0;j<3;j++) {cout<<"Digite o elemento de linha "<<i+1<<" e coluna "<<j+1<<endl; cin>>vet[i][j];}} cout<<"Matriz Lida:"<<endl; for (i=0;i<3;i++) {for (j=0;j<3;j++) {cout<<vet[i][j]<<" ";} cout<<" "<<endl;} cout<<"Entre com um valor para comparacao = "; cin>>n; for (i=0;i<3;i++) {for (j=0;j<3;j++) {if(vet[i][j]>=n) {cont=cont+1;}}} cout<<" "<<endl; cout<<"O numero de elementos maiores que "<<n<<" = "<<cont<<endl; getch(); return 0;}

� Matrizes multidimensionais

A linguagem C++ permite também utilizar matriz de três ou mais dimensões, porém não é

freqüentemente usada, pois requer uma quantidade grande de memória e os acessos aos seus elementos são mais lentos. Por esses motivos este tipo de matrizes não serão abordados com detalhes.

Declaração de matrizes multidimensionais:

� Tipo nome [tamanho1][tamanho2][tamanho3]....[tamanho n]. O exemplo abaixo mostra a declaração de uma matriz tridimensional. Preste atenção na

presença das chaves e das vírgulas separando cada elemento diferente:

int tritabela [2] [2] [2] = { {{ 9, 8}, {7,6}} , {{ 5, 4},{3, 2}} };

Cada elemento de uma matriz multidimensional pode ser acessado individualmente,

indicando a posição exata do valor dentro da matriz. Como vimos anteriormente no caso das matrizes simples, a utilização dos laços condicionais facilita o acesso aos vários elementos de uma matriz. No caso das matrizes multidimensionais, utilizamos laços aninhados para acessar cada dimensão de uma vez.

Page 39: lÓGICA DE ALGORITMOS COM C++

38

� Exemplo de Aplicação:

1) Elabore um programa que declara a matriz tridimensional que vimos anteriormente e utiliza uma sucessão de loops para exibir a matriz na tela. Solução:

#include <iostream> #include <conio.h> main() {int tritabela [2] [2] [2] = {{{ 9, 8}, {7,6}},{{5, 4},{3,2}}}; for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {for (int k = 0; k < 2; k++) {cout << tritabela[i][j][k]<<" ";} cout<<“ ”<<endl;} cout<<“ ”<<endl;} getch(); return 0;}

Como a matriz possui 3 dimensões, foi necessário utilizar três estruturas for para conseguir

realizar sua impressão corretamente. Se tivesse 4 dimensões, usaríamos 4 estruturas for , e assim por diante.

Exercícios Propostos

01) Dada uma matriz M(5,5), transportar para um vetor D apenas os elementos da diagonal da matriz M, e para o vetor S os elementos da diagonal secundária. Imprimir a matriz e os vetores.

02) Elabore um algoritmo que leia dois vetores inteiros V1 e V2, de 8 elementos cada. Gerar uma

matriz M por linha, tal que: Os elementos do vetor V1 devem formar as linhas ímpares da matriz e elementos do vetor V2 devem formar as linhas pares da matriz. Imprimir os vetores e a matriz gerada.

03) Fazer um algoritmo que, dado n, imprime as n primeiras linhas do triângulo de Pascal.

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 . .

04) Dizemos que uma matriz quadrada inteira é um quadrado mágico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todas iguais.

M(I,J) = 1 SE I=J M(I,J) = 1 SE J=1 M(I,J) = M(I-1,J-1) + M(I-1,J)

Page 40: lÓGICA DE ALGORITMOS COM C++

39

Exemplo: A matriz é um quadrado mágico.

2103

654

708

Dada uma matriz quadrada nnA × , verificar se A é um quadrado mágico.

05) Dizemos que uma matriz inteira nnA × é uma matriz de permutação se em cada linha e em cada

coluna houver 1−n elementos nulos e um único elemento igual a 1. Exemplo: A matriz abaixo é de permutação:

1000

0001

0100

0010

Observe que

−−

100

021

012

não é de permutação.

06) Dada uma matriz nnA × , imprimir o número de linhas e o número de colunas nulas da matriz.

Exemplo: 4=m e 4=n

0000

0000

6504

3201

tem 2 linhas nulas e 1 coluna nula. 07) Faça um algoritmo na forma de fluxograma e de programa que leia duas matrizes e realize a

soma entre elas. Ex: Considere matrizes A3x3 e B3x3 . Para realizar soma e subtração de matrizes elas devem ter mesma dimensão.

08) Faça um algoritmo em forma de menu que, dadas duas matrizes A e B, ofereça as seguintes

opções: 1. Soma A+B 2. Transpostas de A e B 3. Produto elemento a elemento entre A e B (Ai,j)*B(i,j) 4. Produto matricial entre A e B (A*B) 5. Construir um vetor com os elementos pares e outro com os elementos impares da matriz A

Page 41: lÓGICA DE ALGORITMOS COM C++

40

6. Construir um vetor com os elementos primos da matriz B 7. Sair do programa

09) Construa uma matriz ALxC, onde os elementos A(i,j), i=1....L, j=1,....C, é dado por A(i,j)=i+j 10) Crie um programa que leia uma matriz A. A partir de A crie uma matriz B idêntica. Em seguida

faça com que os elementos da primeira linha de B sejam o dobro dos elementos da primeira linha de A e os elementos da diagonal principal de B sejam todos nulos. Imprima A e B.

11) Faça um algoritmo em forma de menu que, dadas duas matrizes A e B, ofereça as seguintes

opções: A - Verificar se as matrizes A e B são simétricas A(i,j)=B(j,i) B – Verificar se os elementos das diagonais das duas matrizes são iguais C – Verificar quantos elementos nulos tem a matriz A D – Verificar quantos elementos pares tem a matriz B E - Sair do programa

12) Dada uma tabela de 4 x 5 elementos, calcular a soma de cada linha e a soma de todos os

elementos.

13) Uma certa fábrica produziu dois tipos de motores M1 e M2 nos meses de janeiro,..., dezembro. Fazer um algoritmo na forma que, a partir da produção mensal dos motores M1 e M2 e seus respectivos custos e lucros, calcule o custo e o lucro em cada um dos meses e o custo e lucro anuais.

14) Os elementos aij de uma matriz inteira Anxn representam os custos de transporte da cidade i para

a cidade j. Dados n itinerários, cada um com k cidades, calcular o custo total para cada itinerário.

Exemplo:

5217

8312

40125

3214

O custo do itinerário 1 4 2 4 4 3 2 1 é: a14 + a42 + a24 + a44 + a43 + a32 + a21 = 3 + 1 + 40 + 5 + 2 + 1 + 5 = 57

15) Faça um procedimento que receba uma matriz A(5,5), por parâmetro, e realize as seguintes trocas, na seguinte ordem: a) a linha 2 com a linha 5; b) a coluna 4 com a coluna 1; c) a diagonal principal com a secundária; d) a linha 5 com a coluna 5;

16) Faça um programa que receba, por parâmetro, uma matriz A(4,4) e retorne o menor valor dos elementos acima da diagonal secundária.

Page 42: lÓGICA DE ALGORITMOS COM C++

41

Funções

Usando funções podemos estruturar nossos programas de uma maneira mais modular, usando todo o potencial que a programação estruturada do C++ pode nos oferecer.

Uma função é um bloco de instruções que é executado quando é chamada de algum outro ponto do programa. Seu formato é o seguinte:

tipo nome ( argumento1, argumento2, ...) {conteúdo}

No qual:

� tipo é o tipo de dados que a função retorna. � nome é o nome pelo qual será possível chamar a função. � argumentos (podem ser especificados quantos você quiser). Cada argumento consiste em um

tipo de dados seguido pelo seu identificador, como na declaração de uma variável (por exemplo, int x) e que funciona dentro da função como qualquer outra variável. Eles permitem a passagem de parâmetros para a função quando é chamada. Os parâmetros diferentes são separados por vírgulas.

� conteúdo é o corpo da função. Pode ser uma única instrução ou um bloco de instruções. No último caso, precisa ser delimitado por chaves {} .

Exemplo de função:

#include <iostream.h> #include <conio.h> int addition (int a, int b) {int r; r=a+b; return (r);} int main () {int z; z = addition (5,3); cout << "O resultado e " << z<endl; getch(); return 0;}

Podemos ver como a função main começa declarando a variável z do tipo int . Logo depois

disso, vemos uma chamada para a função addition. Se prestarmos atenção, veremos a semelhança entre a estrutura da chamada da função com a própria declaração da função nas linhas de código acima:

Page 43: lÓGICA DE ALGORITMOS COM C++

42

Os parâmetros têm uma correspondência clara. Dentro da função main chamamos a addition passando dois valores: 5 e 3 que correspondem aos parâmetros “int a” e “int b” , declarados para a função addition.

No momento que a função é chamada em main, o controle é passado para a função addition. O valor de ambos os parâmetros passados na chamada (5 e 3) são copiados nas variáveis locais int a e int b dentro da função.

A função addition declara uma nova variável (int r; ), e através da expressão r =a+b, atribuindo o resultado da expressão à r . Devido ao fato dos parâmetros passados para a e b serem 5 e 3 respectivamente, o resultado é 8.

A seguinte linha de código: return (r); finaliza a função addition, e devolve o controle para a função main, continuando o programa do mesmo ponto que foi interrompido pela chamada a addition. Além disso, return foi chamado com o conteúdo da variável r (return (r); ), que naquele momento era 8, então esse foi o valor retornado pela função.

O valor retornado por uma função é o valor dado para a função quando é avaliada. Sendo

assim, z irá guardar o valor retornado por addition (5, 3), que é 8. Para explicar isso de outra maneira, você pode imaginar que a chamada para a função (addition (5,3)) é substituída literalmente pelo valor que retorna (8).

Escopo de variáveis

Você precisa considerar que o escopo de variáveis declaradas dentro de uma função ou qualquer outro bloco de instruções é somente da própria função ou do próprio bloco de instruções e não podem ser usadas fora deles. Por exemplo, no exemplo anterior teria sido impossível usar as variáveis aaaa, bbbb ou rrrr diretamente na função mainmainmainmain, pois eram variáveis locais da função additionadditionadditionaddition. E também teria sido impossível usar a variável zzzz diretamente dentro da função additionadditionadditionaddition, pois era uma variável local da função mainmainmainmain.

#include<iostream.h> #include<conio.h> char aCharacter; char nome [20]; int i; main() {float a,r; cout<<“Digite um número”<<endl; cin>>a; ... }

Note que “aCharacter” e “nome [20]” são variáveis globais e “a” e “r” são variáveis locais

Page 44: lÓGICA DE ALGORITMOS COM C++

43

Sendo assim, o escopo de variáveis locais é limitado ao mesmo nível de alinhamento no qual elas são declaradas. Mesmo assim podemos declarar variáveis globais que são visíveis em qualquer parte do código, dentro ou fora de qualquer função. Para declarar variáveis globais, você precisa fazê-lo fora de qualquer função ou bloco de instruções, ou seja, diretamente no corpo do programa.

� Exemplo de Aplicação:

1) Elabore um programa que calcule o dobro de um número inteiro informado pelo usuário na

função main(), o cálculo deve ser realizador pela função dobra(int x) e deve retornar o valor calculado e ser impresso na função main(). Solução:

#include <iostream.h> #include <conio.h> int dobra(int x); int vi,resultado; int main() {cout<<"Digite um numero"<<endl; cin>>vi; resultado = dobra(vi); cout<<resultado<<endl; cin>>vi; getch();} int dobra(int x) {x=x*2; return x;}

Observe que o exercício, foi resolvido da forma como o anunciado pede, exigindo que o

usuário informe o número na função principal main(), e posteriormente, “chama” a função dobra(int x) para dobrar o valor do número informado, e só depois de calculado, utilizamos com o comando: “return x ”, enviando o valor encontrado para a função main().

2) Elabore um programa que calcule o fatorial de um número inteiro informado pelo usuário na função main(), o cálculo deve ser realizador pela função fat(int x) e deve retornar o valor calculado e ser impresso na função main(). Caso o número informado pelo usuário seja negativo, repetir o programa até que seja informado um número maior ou igual a zero. Solução:

#include <iostream.h> #include <conio.h> int fat(int x); int i,y,fatorial,resultado; int main() { int cont=1; while (cont==1) {cout<<"Digite um numero"<<endl; cin>>y; if (y<0) {cont=1;}

Page 45: lÓGICA DE ALGORITMOS COM C++

44

else {cont=0;} } resultado = fat(y); cout<<resultado<<endl; getch();} int fat(int x) {fatorial=1; for (i=1;i<=x;i++) {fatorial=fatorial*i;} return fatorial; }

3) Elabore um programa que identifique e informe ao usuário se o número é par ou impar. A

identificação e a impressão deve ser realizada na função func(), já a função main() tem apenas a função de receber o número informado pelo usuário e transportá-lo á outra função. Solução:

#include <iostream.h> #include <conio.h> char func (int x); int y; char n[10]; int main() {int cont=1; while (cont==1) {cout<<"Digite um numero"<<endl; cin>>y; if (y<0) {cont=1;} else {cont=0;}} fat(y); getch();} char func (int x) {if (x%2==0) {strcpy (n,"Par");} else {strcpy (n,"Impar");} cout<<“O numero digitado é ”<<n<<endl; }

Observe que resolvemos o exercício proposto da forma como o anunciado pede. Note

que utilizamos o comando strcpy(x,“Palavra”), esse comando nos permite a atribuir os caracteres “Palavra” à variável x, como no caso descrito. Para realizar esse programa, devemos atribuir à variável x em sua declaração o número limite de caracteres que ela utilizará, exemplo x[10].

Page 46: lÓGICA DE ALGORITMOS COM C++

45

Exercícios Propostos

01) Faça um algoritmo que receba a massa e o volume de uma amostra qualquer, atribua os dados lidos a uma estrutura de dados Tamostra, passe essa estrutura como parâmetro para uma sub-rotina chamada densidade() que calcule e retorne a densidade da amostra.

02) Faça um algoritmo que receba dois pontos cartesianos quaisquer, atribua os dados lidos a duas

variáveis do tipo Tponto, passe esses dois pontos para uma sub-rotina distancia() que retorne a distância entre estes pontos.

03) Faça um algoritmo que receba os dados de um círculo, atribua os dados lidos a uma variável

do tipo Tcirculo, passe essa variável a uma sub-rotina area() que retorne a área do círculo.

04) Faça um algoritmo que receba os dados de um ponto e um círculo, atribua os dados lidos a uma variável do tipo Tponto e outra do tipo Tcirculo, respectivamente, passe essas variáveis a uma sub-rotina contido() que retorne verdadeiro se o ponto estiver contido no círculo.

05) Elabore um algoritmo que utilizando sub-rotina, calcula a média aritmética de 3 provas de um

aluno e retorna ao programa principal, se o aluno foi ou não aprovado (aprovado quando nota for superior ou igual a 5,0).

06) Faça uma função que recebe a idade de uma pessoa em anos, meses e dias e retorna essa idade

expressa em dias. Desconsidere a existência de anos bissextos.

07) Faça uma função que recebe por parâmetro o tempo de duração de uma fábrica expressa em segundos e retorna também por parâmetro esse tempo em horas, minutos e segundos.

08) Faça um procedimento que recebe por parâmetro os valores necessários para o cálculo da

fórmula de baskara e retorna, também por parâmetro, as suas raízes, caso seja possível calcular.

09) Faça uma função que recebe por parâmetro um valor inteiro e positivo e retorna o valor lógico

Verdadeiro caso o valor seja primo e Falso em caso contrário.

10) Faça uma função que recebe por parâmetro o raio de uma esfera e calcula o seu volume (v = 4/3.π.R3).

11) Faça uma função que recebe um valor inteiro e verifica se o valor é par ou ímpar. A função

deve retornar um valor lógico.

12) Faça uma função que leia um número não determinado de valores positivos e retorna a média aritmética dos mesmos.

13) Faça uma função que receba um valor inteiro e positivo e calcula o seu fatorial.

14) Faça um procedimento que lê 10 valores inteiros e retorna o maior e o menor deles.

15) Faça uma função que recebe, por parâmetro, um valor inteiro e positivo e retorna o número de

divisores desse valor.

Page 47: lÓGICA DE ALGORITMOS COM C++

46

Exercícios de Revisão

01) Construa um algoritmo para entrar com um número de 1 a 10 e imprimi-lo o número de vezes correspondente ao seu valor.

02) Desenvolva um algoritmo que calcule as raízes de uma equação do segundo grau. Utilize o

método de Baskara, fornecendo ao algoritmo os coeficientes A,B e C.

03) Construa um algoritmo que, tendo como dados de entrada dois pontos quaisquer no plano P(x1,y1) e Q(x2,y2), calcule a distancia entre eles.

04) Construa um algoritmo que calcule a quantidade de litros do combustível gastos em uma

viagem utilizando-se um automóvel que faz 12 km/L. Para realizar esse cálculo, o usuário deverá fornecer o tempo gasto da viagem e a velocidade média durante a mesma.O algoritmo deverá apresentar como resultado os valores da velocidade média, tempo gasto na viagem, distância percorrida e a quantidade de litros utilizada na viagem.

05) Especifique um algoritmo para uma sub-rotina que receba como parâmetro um valor real

qualquer, calcule o valor da F(x) = -x3 +8, para o parâmetro recebido, e retorne o valor calculado.

06) Dado a função F(x) da questão 5, faça um algoritmo que calcule F(x) para N valores igualmente

espaçados entre Xinicial até Xfinal.

07) Dado a função F(x) da questão 5, faça um algoritmo que calcule F(x) para valores entre Xinicial e X final. ,com intervalo definido pelo usuário.

08) Faça um algoritmo para uma sub-rotina que receba três números quaisquer e retorne o maior

deles.

09) Desenvolva um algoritmo que receba uma quantidade indefinida de notas e apresente as informações a seguir no final da seqüência de notas. O algoritmo deverá encerrar a seqüência de leitura quanto identificar que valor recebido não é uma nota inválida (valor negativo ou maior que 10)

i. Quantidade de notas da seqüência; ii. Média aritmética de todas as notas da seqüência; iii. Maior nota da seqüência; iv. Menor nota da seqüência; v. Percentual de notas maiores ou iguais a 5; vi. Percentual de notas inferiores a 5;

10) Refaça o algoritmo anterior para uma quantidade definida de notas, previamente informada pelo

usuário.

11) Escreva um algoritmo, utilizando sub-rotina, que retorne à função principal, o volume de um cilindro, dado o raio e altura do mesmo.

12) Escreva um algoritmo que leia dois números reais e um caractere, que represente a operação a

ser realizada (“+”, “-”, “*” e “/”). O algoritmo deve apresentar o resultado final da operação, ou

Page 48: lÓGICA DE ALGORITMOS COM C++

47

uma mensagem de erro para o caso da divisão de um número por zero, ou uma mensagem de erro caso não seja escolhida uma das quatro operações aritméticas básicas.

13) Escrever um algoritmo que lê um conjunto não determinado de valores, um de cada vez, e

escreve uma tabela com cabeçalho, que deve ser repetido a cada 20 linhas. A tabela conterá o valor lido, seu quadrado, seu cubo e sua raiz quadrada.

14) Escrever um algoritmo que lê um número não determinado de valores para m, todos inteiros e

positivos, um de cada vez. Se m for par, verificar quantos divisores possui e escrever esta informação. Se m for ímpar e menor do que 10 calcular e escrever o fatorial de m. Se m for ímpar e maior ou igual a 10 calcular e escrever a soma dos inteiros de 1 até m.

15) Faça um algoritmo que leia uma quantidade não determinada de números positivos. Calcule a

quantidade de números pares e ímpares, a média de valores pares e a média geral dos números lidos. O número que encerrará a leitura será zero.

16) Faça um algoritmo que leia vários números inteiros e positivos e calcule a somatória dos

números pares. O fim da leitura será indicado pelo número 0.

17) Escrever um algoritmo que leia um número N que indica quantos valores devem ser lidos a seguir. Para cada número lido, mostre uma tabela contendo o valor lido e a metade deste valor.

18) Crie um programa que leia um número entre 2 e 20 e gere uma tela com a seguinte

configuração: Exemplo: Digite um número: 4 Saída do programa:

1 12 123 1234 123 12 1

19) Elabore um programa que dada a idade de um nadador classifica-o em uma das seguintes categorias:

• infantil A = 5 - 7 anos • infantil B = 8-10 anos • juvenil A = 11-13 anos • juvenil B = 14-17 anos • adultos = maiores de 18 anos

20) Dados três números naturais, em qualquer seqüência, verificar se eles formam os lados de um

triângulo retângulo. 21) Construa um algoritmo que receba um número N inteiro e calcule o fatorial de (2N-1). 22) Considerando o índice de massa corporal humana (IMC) dado pela razão do peso ( P ), em

quilogramas, pela estatura ( E ) ao quadrado, em metros quadrados. Apresente um algoritmo

Page 49: lÓGICA DE ALGORITMOS COM C++

48

que solicite ao usuário os dados necessários, e com no máximo 5 estruturas de condição, apresente ao usuário sua classificação, de acordo com a tabela a seguir:

IMC Classificação

Até 14,5 Desnutrição Acima de 14,5 até 20 Abaixo do peso Acima de 20 até 25 Peso Normal Acima de 25 até 30 Sobrepeso Acima de 30 até 40 Obeso

Acima de 40 Obeso Mórbido

23) Crie um programa que exiba um menu na tela e que permita ao usuário a escolha de uma opção. Imprima uma mensagem dizendo qual foi a opção selecionada.

Exemplo de Menu: 1 - Gravar 2 - Carregar 3 - Apagar 4 - Inserir 5 - Fim

24) Construa um algoritmo para uma sub-rotina que receba como parâmetro a posição de um

elemento da seqüência de Fibonacci e retorne o elemento da seqüência correspondente à posição.

25) Faça um algoritmo para uma sub-rotina que receba um número N inteiro, calcule e retorne N! ,

se N for 0, enviar ao usuário uma mensagem que pela definição, o fatorial de 0 vale 1.

26) Faça um algoritmo que leia uma matriz A(4x4). A partir de A obtenha uma matriz B de modo que: primeira coluna de B: elementos são o seno dos elementos de A; segunda coluna de B: elementos são os co-senos dos elementos de A; terceira coluna de B: elementos são as raízes dos elementos de A; quarta coluna de B: elementos são o fatorial dos elementos de A. Imprima A e B.

27) Faça um programa que leia duas matrizes e realize a soma entre elas, passando primeira mente a

um teste se suas dimensões são compatíveis para realizar tal operação.

28) Apresente um algoritmo que receba uma seqüência de 9 valores, atribua-os a um vetor e imprima-os na seqüência contrária da que foi recebida.

29) Considere algoritmo em forma de programa que lê uma seqüência de números inteiros

positivos, de no máximo 100 elementos. O algoritmo constrói e imprime quatro vetores: a) um vetor V constituído dos elementos lidos. b) um vetor Q que armazena o quadrado dos elementos lidos c) um vetor R que armazena a raiz quadrada dos elementos lidos d) um vetor D que armazena o resto da divisão dos elementos lidos por 2

30) Faça um pseudocódigo, um fluxograma e um programa Fortran que leia um Número (N) de

nomes de pessoas e suas respectivas idades e guarde esses dados em dois vetores distintos. Imprima o nome e a idade de cada pessoa na mesma linha. Em seguida escolha um número (índice do vetor) e imprima o nome e a idade da pessoa correspondente a este número.

Page 50: lÓGICA DE ALGORITMOS COM C++

49

31) Dado um vetor V de n elementos, com n>10 e n impar, imprimir o vetor começando do termo

v[0] até o Vmédio. Exemplo: Caso V tenha 13 elementos, devemos imprimir os termos de 0 a 7

32) Desenvolva um programa que leia uma matriz de 4x4 de elementos inteiros. Depois percorra e

mostre em forma de matriz. Depois percorra e some o elementos da diagonal principal

33) Desenvolva um programa que leia (preencha) uma matriz 5X6. Mostre todos os elementos. Leia um número. Mostre, agora, quais são os elementos da matriz que são múltiplos deste número lido.

34) Faça um algoritmo que receba, uma matriz A(4,5)e retorne o menor valor dos elementos abaixo

da diagonal secundária.

35) Faça um algoritmo que receba uma matriz B(5,5) de reais e retorna a soma dos elementos das linhas pares de B

36) Faça uma função que recebe uma matriz A(4,4) e retorna a soma dos elementos da linha 4 e da coluna 3.

37) Faça uma função que recebe uma matriz A(5,5) e retorna a soma dos seus elementos, exceto seu

elemento central A(3,3).

38) Faça um programa que receba, por parâmetro, uma matriz A(3,3) e retorna, também por parâmetro, um vetor com a soma de cada uma das linhas de A .

39) Faça um programa que receba uma matriz A(4,4) e multiplica cada linha pelo elemento da

diagonal principal daquela linha. O procedimento deve retornar a matriz alterada.

40) Na teoria dos sistemas, define-se como elemento minimax de uma matriz o menor elemento de uma linha onde se encontra o maior elemento da matriz. Faça uma função que recebe, por parâmetro, uma matriz A(3,3) e retorna o seu elemento minimax, juntamente com a sua posição.

41) Faça um programa que receba um vetor A (15) de inteiros e retorna esse mesmo vetor

compactado, ou seja, sem os seus valores nulos (zero) e negativos.

42) Escreva uma função que recebe, por parâmetro, dois valores X e Z e calcula e retorna Xz . (sem utilizar funções ou operadores de potência prontos)

43) Faça um procedimento que recebe, por parâmetro, um valor N e calcula e escreve a tabuada de

1 até N. Mostre a tabuada na forma: 1 x N = N 2 x N = 2N ... N x N = N2

Page 51: lÓGICA DE ALGORITMOS COM C++

50

Referências Bibliográficas � http://www.gsmfans.com.br/index.php?topic=67407.0 � http://pt.wikipedia.org/wiki/C%2B%2B � Lista de exercício Prof. Alexandre Ribeiro – FEIS � Lista de exercício Prof. Anirio Salles Filho – FEIS � Lista de exercício Profa. Erica Regina Marani Daruichi Machado – FEIS � Apostila: “Introdução à Ciência da Computação e Teoria e Desenvolvimento de Algoritmos”,

Profa. Erica M. Daruichi Machado – FEIS � Curso Básico de Lógica de Programação, Unicamp - Centro de Computação – DSC, Autor: Paulo

Sérgio de Moraes � http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node37.html � http://www.linhadecodigo.com.br/Artigo.aspx?id=1114 � http://www.vivaolinux.com.br/artigo/Substituindo-a-biblioteca-conio.h-no-Linux-usando-ncurses-

curses.h/ � http://allanlima.wordpress.com/ � http://pt.wikipedia.org/wiki/C_(linguagem_de_programação) � http://www.apostilando.com/download.php?cod=3149&categoria=C%20e%20C++ � http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B � http://www.tiexpert.net/programacao � http://pt.wikibooks.org/wiki/Programar_em_C/Vetores � http://pt.wikipedia.org/wiki/C%2B%2B � TORRES, Jair Gustavo M. – Curso de Linguagem C – Ilha Solteira: Faculdade de Engenharia de

Ilha Solteira – FEIS – UNESP – Departamento de Engenharia Elétrica, 2006. � PRATA, Stephen – C++ Primer Plus, 4º edição – Nova York: Sams Publishing. 2001. � STROUSTRUP , Bjarne - The C++ Programming Language, 3º edição – New Jersey: Addison –

Wesley. 1997. � LIPPMAN, Stanley B.; LAJOIE, Josée Lajoie; MOO, Barbara E. – C++ Primer, 4º edição – New

Jersey: Addison-Wesley. 2005.