Beruflich Dokumente
Kultur Dokumente
1ª Edição - 2012
Sumário
Introdução ..................................................................................................................................... 1
Capítulo 1 - Algoritmos e Lógica de Programação
Introdução
Algoritmo e lógica de programação é uma disciplina fundamental para qualquer
aluno de engenharia. Essa disciplina permite o desenvolvimento do pensamento
lógico, além de fornecer uma pequena ideia de como os computadores
funcionam. Agora, reflita sobre todos os softwares que você utiliza diariamente,
além daqueles que você gostaria de entender como funcionam. Por diversas
vezes em engenharia, o profissional da área utilizará softwares específicos, ou
até mesmo precisará implementar, ou seja, criar um software para um
determinado fim. Dada a importância dessa disciplina, de uma coisa você
precisa saber antes de começar: NÃO TENHA MEDO. Programar pode ser uma
tarefa empolgante e desafiadora à medida que temos os nossos intelectos
desafiados à cada nova atividade, só o que precisamos é desvendar algumas
ferramentas e saber como elas funcionam, e esse é o objetivo principal dessa
apostila, repassar uma noção inicial sobre essas ferramentas e de como utilizá-
las. Bons estudos!
2
Exemplo 2 - Imagine que você tenha que desenvolver um algoritmo para trocar
lâmpadas. Como seria esse algoritmo? Bem, vamos supor que você disponha de
uma escada, de uma certa quantidade de lâmpadas que funcionam e uma
lâmpada queimada, a qual deve ser trocada. Vamos tentar organizar nossas ações
numa sequência lógica abaixo:
3º - Suba na escada.
5º - Desça da escada.
9º - Desça da escada.
Esse é um exemplo muito simples de um algoritmo, ele segue uma sequência lógica,
afinal você não colocaria a escada embaixo da lâmpada depois de trocá-la, supondo
um altura considerável, você nem conseguiria trocá-la, então uma ação completa a
outra em termos de sentido. Você poderia criar outro algiritmo para um outro
problema? Como o de trocar o pneu de um carro, por exemplo.
Se você ainda não se sente confortável com a ideia de algoritmo, há ainda um modo
bem fácil de lembrar que você, de alguma forma ou de outra, já deve ter utilizado um
algoritmo. A prova disso está nos fluxogramas, os quais são tipos de diagramas usados
na esquematização de processos, como um projeto. Vamos pensar no caso da lâmpada
novamente. Mas agora, pensemos que você tem uma certa quantidade de lampadas
que supostamente funcionam, ou seja, você não sabe quais das lâmpadas disponíveis
realmente funciona, vamos considerar também que você não saiba por que a lâmpada
que deve ser trocada não está funcionando. Então, vamos criar um novo algoritmo
focando apenas na parte de testes, supondo as outras condições acessíveis ou já
realizadas, como a de colocar a escada embaixo da lâmpada, essa é uma outra
situação, ok? Podemos organizar nossa rotina, ou seja, nossas instruções que formam
uma repetição, em um fluxograma:
4
Sobre fluxograma há muito que poderia ser abordado, por exemplo, cada tipo de
bloco representa algo, os retângulos de bordas arrendodas significam ações ou
constatações, já os losângulos representam testes, é claro que há vários outros
padrões criados, por isso, informações dentro de cada bloco se fazem necessárias. No
entanto, nosso objetivo foi apenas o de mostrar como esse encadeamento de
pensamentos pode ocorrer.Repare como cada caminho se completa numa sequência
de ações lógicas que levam a resolução do nosso problema. Abaixo, temos uma tabela
que mostra um padrão estabelico para o significado de cada bloco e mais dois
exemplos de fluxogramas:
5
Onde temos:
De certa forma, essas fases se assemelham bastante ao que o ser humano faz durante
a resolução de um problema, ou mesmo durante uma conversa:
6
Essas três etapas são essenciais para qualquer algoritmo, e todo esse processo de
criação acontece no computador por meio de um programa chamado compilador
através de uma linguagem de programação. Mas não se preocupe com isso agora,
primeiro, precisamos entender como cada fase dessa funciona, ou o que ocorre em
cada fase, para isso, vamos simular um problema: O cálculo da média de um aluno.
1ª Parte: Entrada
Na entrada, como dito anteriormente, são onde os dados são fornecidos. Mas, o que
são os dados? Como os usamos? Os dados são basicamente conjunto de informações
que nós possuímos, no nosso caso, nossos dados são as notas. Os dados , de uma
maneira geral, são divididos em categorias: Variáveis e Constantes.
Constante: É um determinado valor fixo que não se modifica à medida que o algoritmo
é executado. Por exemplo, para cálcular a média aritmética de quatro notas, a soma
das quatro notas é dividida por quatro, ou seja, esse valor é imutável ao longo do
processamento, ele é uma constante.
Tipos de variáveis
As variáveis e as constantes podem ser divididas em quatro categorias básicas:
Lógicas: Armazenam apenas dados lógicos que podem ser Verdadeiro ou Falso.
7
2ª Parte: Processamento.
Operadores: São meios pelo qual algumas operações lógicas são realizadas, como
incrementar (aumentar algo), decrementar (diminuir algo), comparar, etc.
Tipos de Operadores
Operadores Aritméticos: São utilizados para obter resultados numéricos.
Operações do tipo soma, subtração, multiplicação, divisão e
potênciação.
3ª Parte: Saída.
PROBLEMAS - CAPÍTULO 1
1 – Três índios, conduzindo três brancos, precisam atravessar um rio dispondo para tal
de um barco cuja capacidade é de apenas duas pessoas. Por questões de segurança, os
índios não querem ficar em minoria, em nenhum momento e em nenhuma das
margens. Escreva um algoritmo que oriente os índios para realizarem a travessia nas
condições fixadas. (Cabe observar que, usualmente, este exercício é enunciado
envolvendo três jesuítas e três canibais. A alteração feita é uma modesta contribuição
para o resgate da verdadeira história dos índios).
2 – O jogo conhecido como Torre de Hanói consiste de três torres chamadas origem,
destino e auxiliar e um conjunto de n discos de diâmetros diferentes, colocados na
torre origem na ordem decrescente dos seusdiâmetros. O objetivo do jogo é, movendo
um único disco de cada vez e não podendo colocar um disco sobreoutro de diâmetro
menor, transportar todos os discos para torre destino, podendo usar a torre auxiliar
comopassagem intermediária dos discos. Escreva algoritmos para este jogo nos casos
n= 2 e n = 3.
Lembre-se que em nossa analogia das fases de um algoritmo, o ser humano recebia
instruções ou as captava pelos sentidos, tato, audição, visão, processava as
informações no cérebro e dava uma resposta adequada. Agora, de quantas maneiras
diferentes através da fala você pode passar uma instrução? Há várias maneiras, uma
delas é usar palavras diferentes que no fim, resultam no mesmo significado, é o que
chamamos de semântica e a outra forma é simplesmente mudar o idioma, e é claro
que você precisaria entender o idioma em que as instruções são passadas para que
você as possa processar e fornecer uma resposta adequada. Da mesma forma, há
várias formas de passar instruções para o computador, existem várias linguagens que
possibilitam a comunicação com ele, desde que haja um tradutor adequado, no caso, o
compilador, ou programa que você vai usar para programar. Então, o que seria, de
fato, linguagem de programação? Nada mais do que uma forma padronizada de passar
instruções ao computador. E o que define essa padronização? O que define a
padronização é a sintaxe, que nada mais é do que a forma que você escrever as
instruções. O c++ é uma das várias linguagens de programação existentes, ela é
considerada uma linguagem de nível médio (quanto mais alto nível, mas fácil de
manipular), e existe desde 1985. Passada essa parte teórica, vamos ao que realmente
interessa.
O compilador usado para os exemplos dessa apostila, o DEV-C++ é muito fácil de ser
instalado, é gratuito e pode ser facilmente encontrado na internet. Após a instalação,
ao executar o programa você encontrará isso:
10
Na parte de cima, uma barra de ferramentas que você desvendará à medida que
utilizar o programa, à esquerda um espaço reservado para visualizar os projetos em
que você está trabalhando no momento e na caixa de texto, uma dica sobre o
compilador . Para iniciar um novo projeto, vá em File->New->Project, ao fazer isso você
verá:
Pronto, é aqui onde a “mágica” acontece. Nessa imagem, temos a estrutura inicial para
começar qualquer aplicação simples. Repita o seguinte código abaixo:
#include <cstdlib>
#include <iostream>
Depois de digitar o código acima, você pode executar o código, ou em outras palavras,
compilá-lo para ver o que acontece, para isso, basta pressionar a teclar “F9”. Primeiro,
lhe será perguntando onde você deseja salvar o arquivo “main.cpp”, ou seja, o arquivo
principal do seu projeto, sugerimos que salve na mesma pasta criada por você
anteriormente. Após salvar, o resultado esperado será esse:
E esse foi o nosso primeiro programa, o qual simplesmente exibe na tela a mensagem
“Ola mundo!”.
12
int main(int argc, char *argv[]) Função principal, aqui é onde tudo acontece.
{
cout << "Ola mundo!" << endl; Linha de código, comando “cout”
system("PAUSE"); Comando de Pausa.
return EXIT_SUCCESS; Determinação do fim do algoritmo.
}
Todos os algoritmos são executados numa sequência lógica, o copilador vai lendo as
linhas de código de cima para baixo e executando-as à media que passar por elas, cada
linha diferente é separada por “;”. Além disso, o símbolo “{“ abre um bloco de
comando e ele sempre deve ser fechado pelo seu par: “}”. Você pode escrever algo no
código a ser ignorado pelo compilador? A resposta é sim, como comentários por
exemplo, os quais são simplesmente frases que os programadores colocam para deixá-
lo mais claro a outras pessoas. E para fazer um comentário basta colocar “//” ao lado
esquerdo do que você deseja tornar um comentário. Por exemplo, se comentarmos a
nossa segunda linha: #include <iostream>, ficaremos com: //#include <iostream> e se
executarmos o progarama, teremos o seguinte erro:
13
é uma linguagem do tipo case sensitive, o que significa que se você digitar COUT ao
invés de cout, ele não reconhecerá mais o comando, por isso, é importante conhecer
bem a sintaxe da linguagem, ou seja, a forma de como os comandos devem ser
escritos.
Tipos de variáveis:
Abaixo, temos uma tabela que demonstra o quanto de cada espaço é reservado da
memória para cada tipo de variável;
Há ainda um tipo de dado muito usado, que é o tipo string, o qual é usado para
representar uma sequência de caracteres, como um nome. Para usar tal tipo de dado,
faz-se necessária a inclusão da biblioteca <string>.
#include <cstdlib>
#include <iostream>
#include <string> Inclusão da biblioteca string
Regras:
a) Identificadores podem ser compostos por letras, números ou sublinhados, como
nome_1;
b) Identificadores devem começar com uma letra ou sublinhado
c) Identificadores não pode ser palavras reservadas da linguagem c/c++.
#include <cstdlib>
#include <iostream>
#include <string>
i = 500; j = 10;
valor = 4.7 Atribuíção de valores.
nome = “fulano”;
system("PAUSE");
return EXIT_SUCCESS;
}
17
Exemplo 6 – Declaração de variáveis e atribuíção de valores (2º Método)
#include <cstdlib>
#include <iostream>
#include <string>
Agora que já sabemos manipular variáveis, vamos fazer um exemplo simples , no qual
recebemos dois números fornecidos pelo usuário e mostramos a soma como resposta:
#include <cstdlib>
#include <iostream>
system("PAUSE");
return EXIT_SUCCESS;
}
Exercício – Faça um algoritmo que receba dois valores “a” e “b” e forneça como
resultado seus valores invertidos, ou seja, o valor de “a” tem que passar para “b” e o
valor de “b” tem que passar para “a”.
2.6 – Operadores
Até agora, temos utilizado operadores nas nossas expressões, mas ainda não tivemos
uma abordagem mais prática sobre o assunto. Embora conheçamos os tipos de
operadores, não sabemos muito bem ainda como utilizá-los na linguagem C++, vamos
então aprender um pouco de sintaxe.
Operadores Aritméticos
Operador Ação
+ Adição.
- Subtração, menos unário.
* Multiplicação
/ Divisão
% Resto da divisão
Dica: Lembre-se de usar o tipo adequado (inteiro, real, etc) para as variáveis!
Incremento e decremento
Algo interessante que podemos fazer com operadores aritméticos são os incrementos
e decrementos, que consistem simplemente em aumentar e diminuir algo.
Por exemplo, para dizer que uma variável tem o valor dela mesma adicionado de 1,
poderíamos fazer isso de duas formas:
1ª Forma: x = x + 1;
2ª Forma: ++x;
Operador Ação
-- Decrementa -> Subtrai 1 ao operando
++ Incrementa -> Soma 1 ao operando
19
OBS.: Há uma diferença entre ++x e x++ quando usados em uma expressão. Atenção
ao próximo exemplo:
#include <cstdlib>
#include <iostream>
a = ++n;
b = m++;
cout << “Valor de a:” << a << “ “ << “Valor de b:” << b << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Regras:
a) Operadores de mesmo nível de precedência são analisados da esquerda para
direita.
b) Pode-se usar parentêses para forçar uma (ou mais) operação a ter precedência
maior.
#include <cstdlib>
#include <iostream>
valorFinal = b + ++c*d;
system("PAUSE");
return EXIT_SUCCESS;
}
Operadores de atribuíção
O operador de atribuíção é o mais simples, ele tem sido usado até agora sem nenhum
problema. No entanto, há algumas peculiaridades que podem ajudar bastante na hora
de escrever um código. A linguagem C++ também permite a utilização de operadores
compostos. Por exemplo:
1ª Forma: i = i + 2;
2ª Forma: i += 2;
Ambas as linhas produzem o mesmo resultado, só que a segunda é obtida por meio do
operador +=. Sendo assim, temos:
Operador Ação
+= Soma o operando do valor que estiver à
direita.
-= Subtrai o operando do valor que estiver à
direita.
*= Multiplica o operando do valor que
estiver à direita.
/= Divide o operando do valor que estiver à
direita.
%= Obtém o resto da divisão pelo valor que
estiver à direita.
#include <cstdlib>
#include <iostream>
v1 += 3; v2 -= 2;
v3 *= 3; v4 /= 3;
v5 %= 3;
cout << v1 << “ “ << v2 << “ “ << v3 << “ “ << v4 << “ “ << v5 << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Resultado: 7 2 12 1 1
Operadores relacionais: São usados como o próprio nome diz para comparar valores, o
resultado dessa comparação é sempre 0 (falso) ou 1 (verdadeiro).
Operador Comparação
< Menor que
> Maior que
<= Menor ou igual que
>= Maior ou igual que
== Igual a
!= Diferente de
Operador Significado
&& Operador binário E (AND)
|| Operador binário OU(OR)
! Operador unário de NEGAÇÃO (NOT)
Regras:
a) Expressões conectadas por && ou || são avaliadas da esquerda para direita, e a
avaliação pára assim que a veracidade ou falsidade do resultado for conhecida.
b) Quanto ao nível de precedência, têm um nível menor do que os operadores
aritméticos. Por exemplo:
#include <cstdlib>
#include <iostream>
cout << “Valor de a: “ << a << “ “ << “Valor de b: “ << b << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
COMENTÁRIOS: Analisando a expressão a = (c > 10) || (d > c), temos a setença c é maior
que 10 ou o valor da variável “d” (13) é maior do que o valor da variável “c” (10), como
uma das afirmações resulta em verdadeira e estamos o operador lógico ou, temos como
resposta final 1 (verdadeiro). Já no segundo caso, devemos interpretar a expressão da
seguinte maneira o valor de “c” é menor do que 10 e o valor de “d” é maior do que o valor
de “c”? O que resulta em falso, já que o valor de “c” é 10. Lembre-se que o resultado de
expressões lógicas são sempre 0 ou 1, falso ou verdadeiro.
d) c = (a > 2) && (a < 30) e) c = (b < 12) || (a > 20) f) c = (a > b) && (b > 20)
24
Até agora temos trabalhado, nos nossos exemplos, sempre com variáveis do mesmo
tipo. No entanto, na prática, em um algoritmo se trabalha com variáveis de mais de um
tipo que, por vezes, se relacionam em expressões. Trantando-se de expressões
aritméticas, por exemplo, existem conversões automáticas de valores na avaliação de
uma expressão.
Com exemplo, tivemos a expressão 4/3 cujo resultado aproximado é 1.3333, mas a
resposta era dada por 1, uma vez que a variável que recebia o valor da divisão era do
tipo inteira. Mas, se tivermos uma variável do tipo double recebendo o resultado da
expressão 4/2.5, temos uma constante inteira sendo dividida por uma constante do
tipo double e o resultado é 1.6. O que acontece com a constante inteira, já que
estamos trabalhando com dois tipos diferentes? O que ocorre é uma conversão
implícita, ou seja, a constante 4 do tipo int é promovida ao tipo double antes da
operação ser realizada e a operação é feita na precisão do tipo mais representativo.
Na figura acima temos uma expressão que combina variáveis de diferentes tipos, à
medida que as operações acontecem, temos os tipos dos resultados, o quais vão ser
recombinados em uma expressão diferente, orginando, por sua vez, um tipo cuja o
nível de representatividade é sempre maior.
OBS.: Não podemos usas as variáveis sem antes atribuír um valor a elas, esse é um
exemplo puramente ilustrativo.
25
PROBLEMAS – CAPÍTULO 2
3 – Uma loja vende seus produtos no sistema entrada mais duas prestações, sendo a
entrada maior do que ou igual às duas prestações; estas devem ser iguais, inteiras e
as maiores possíveis. Por exemplo, se o valor da mercadoria for R$ 270,00, a entrada
e as duas prestações são iguais a R$ 90,00; se o valor da mercadoria for R$ 302,75, a
entrada é de R$ 102,75 e as duas prestações são a iguais a R$ 100,00. Escreva um
programa que receba o valor da mercadoria e forneça o valor da entrada e das duas
prestações, de acordo com as regras acima. Observe que uma justificativa para a
adoção desta regra é que ela facilita a confecção e o consequente pagamento dos
boletos das duas prestações. Dica: As parcelas são iguais e são do tipo inteiro,
determine primeiro o valor das parcelas, como o pagamento consiste em entrada + 2
parcelas, fica fácil descobrir o valor da entrada, o qual não é do tipo inteiro.
If (Expressão)
{
sequência de comandos
}
Que, com o uso do comando else poderia ser escrito da seguinte maneira:
b) O comando switch:
Muitos programas são desenvolvidos de modo que eles podem realizar várias
tarefas, de forma independente. Por exemplo, um programa que gerencie um
caixa eletrônico de um banco deve oferecer ao usuário algumas opções em
relação à ação que ele pretende realizar na sua conta como a emissão do saldo
atual, a emissão de um extrato, a realização de um saque e a realização de um
depósito. É comum que um programa que permita a realização de várias
tarefas inicie apresentando ao usuário um menu de opções com a indicação das
diversas tarefas que o programa pode executar e a permissão de que o usuário
escola a tarefa pretendida. Como, em geral, são várias as opções disponíveis
(cada uma delas com uma sequência específica de comandos) e só uma das
opções será a escolhida, é necessária uma estrutura que decida entre várias
sequências de comandos qual vai ser executada ou quais vão ser executadas.
O comando switch tem este objetivo e deve ser escrito com a seguinte sintaxe:
switch (Expressão)
{
case constante1:
sequência de instruções1
case constante2:
sequência de instruções2
...
case constante n:
sequência de instruções n
default:
sequência de comando x
}
Observações:
A sequência de instruções vinculada a uma opção case pode ser vazia,
caso em que, evidentemente, nada é executado;
Se apenas uma sequência de comandos deve ser executada, deve-se
encerrá-la com um break;
A opção default é opcional: se ela não aparece no comando e o valor da
“Expressão” for diferente de todos os valores disponíveis, nada é
executado e a instrução logo após o comando switch passa a ser
executada.
30
Exercícios
1. Escreva um programa que realize arredondamentos de números utilizando a
regra geral da matemática: se a parte fracionária for maior do que ou igual a
0,5, o número é arredondado para o inteiro imediatamente superior; caso
contrário, é arredondado para o inteiro imediatamente anterior.
2. Escreva um programa para determinar o maior entre três números dados.
3. Escreva um programa para classificar um triângulo de lados de comprimentos
dados em escaleno, isósceles ou equilátero.
4. Escreva um programa para verificar se um triângulo de lados de comprimentos
dados é retângulo, exibindo, nos casos afirmativos, sua hipotenusa e seus
catetos.
a) O comando for ( ; ; ):
b) O comando while
while (Expressão)
{
sequência de comandos
incrementos
}
c) O comando do while:
do
{
sequência de comandos
}
while (Expressão)
32
Exercícios
1. Escreva um programa para calcular a soma dos n primeiros números de:
a) Uma progressão aritmética de razão r dada;
b) Uma progressão geométrica de razão q dada.
2. Escreva um programa para determinar o número de algarismos de um
número inteiro positivo dado.
3. Escreva um programa que determine o n-ésimo termo da sequência de
Fibonacci.
3.3 – Vetores
Pense num ventor como uma gaveta contendo várias pastas, cada pasta é um
elemento que pode receber um determinado valor, é claro que cada gaveta só pode
conter pastas contendo arquivos do mesmo tipo, ou seja, se você declarar um vetor do
tipo inteiro, só poderá amazenar valores do mesmo tipo. Abaixo, um exemplo que
preenche um vetor com números inteiros, checa quantos dos números são maiores ou
iguais a três e quantos são menores.
int vetor[5];
int qtdMaior = 0;
int qtdMenor = 0;
//Checagem
else qtdMenor++;
//Resultado
cout << "Existem " << qtdMaior << " numeros maiores ou igual a 3 e " << qtdMenor << " menores!"
<< endl;
COMENTÁRIOS: Cada elemento do vetor está associado a um índice, no nosso caso, temos um
vetor de 5 elementos, o primeiro elemento tem índice “0”. Na checagem usamos um loop para
percorrer todos os elementos do vetor e verificar, elemento a elemento, quais são maiores ou igual
a três e quais são menores, depois mostramos apenas o resultado de quantos são esses números.
Você saberia mostrar quais são esses números também? (Dica: o mesmo procedimento de
preenchimento pode ser usado, mas nesse caso use o cout para mostrar cada elemento).
34
Exercícios
1. Escreva um programa que exiba as componentes de um vetor na ordem inversa
daquela em que foram armazenadas.
2. Escreva um programa que exiba o maior elemento de um vetor.
3. Escreva um programa que forneça as componentes distintas de um vetor dado.
Por exemplo, se o vetor dado for v = {3, 2, 1, 3, 4, 1, 5, 5, 2}, deve-se obter {3, 2,
1, 4, 5}.
4. Escreva um programa que receba um vetor e o decomponha em dois outros
vetores, um contendo as componentes de ordem ímpar e o outro contendo as
componentes de ordem par.
35
PROBLEMAS – CAPÍTULO 3
1 – Escreva um programa que calcule a média de uma quantidade “n” de alunos determinada
pelo usuário.
2 – Escreva um programa que receba uma quantidade “n” de números determinada pelo
usuários e diga quantos são os pares e os ímpares dos números recebidos.
3 – Escreva um programa para determinar a idade da pessoa, em anos, meses e dias, dadas a
data (dia, mês e ano) do seu nascimento e a data (dia, mês e ano) atual.
4 – Um número inteiro é dito perfeito se o dobro dele é igual à soma de todos os seus
divisores. Por exemplo, como os divisores de 6 são 1, 2, 3 e 6 e 1 + 2 + 3 + 6 = 12, 6 é perfeito.
A matemática ainda não sabe se a quantidade de números perfeitos é ou não finita. Escreva
um programa que liste todos os números perfeitos menores que um inteiro n dado.
1, se n = 1 ou n = 2
an =
+ , se n > 2
6 – Dada uma seqüência de “n” números reais, determinar os números que compõem a
seqüência e o número de vezes que cada um deles ocorre na mesma. (Dica: Use vetores)
Exemplo: n = 8
REFERÊNCIAS: