Algoritmos e C++

 
 
Roteiro de aulas práticas
Parte I - fundamentos
Sumário:
  • Algoritmos
  • Resolução de problema
  • Programas
  • Desenvolvimento de algoritmos
  • Diagrama de blocos
  • Tópicos fundamentais
    • Tipos de dados
    • Tipos modificados
    • Conversão de tipos
    • Declaração de variáveis
    • Denominação de variáveis
    • Constantes
    • Comando de atribuição
    • Operadores aritméticos
    • Operadores de incremento e de decremento
    • Operadores aritméticos de atribuição
    • Operadores relacionais
    • Operadores lógicos
    • Operador ternário ou condicional
    • Precedência dos operadores
    • Exercícios
    • Comandos de entrada e saída
    • Caracteres de controle
    • Formato de impressão
    • Comentários
  • Exemplo de algoritmo
    • Problema
    • Pré-algoritmo
    • Diagrama de blocos
    • Pseudocódigo
    • Implementação em C++
  • Aplicações de console
  • Bibliografia
 
Algoritmos

Um algoritmo é um descrição de um padrão de comportamento, expresso em termos de um conjunto finito de ações, ou
um algoritmo é uma seqüência de ações executáveis para a obtenção de uma solução para um determinado problema.

Exemplos:  Receita culinária, Itinerário, Instruções para o uso de medicamentos.

 
Resolução de problema
  • Compreender o problema;
  • Levantar necessidades de entrada e saída;
  • Definir as transformações ou o processamento de cálculos e restrições;
  • Dividir o problema em módulos funcionais;
  • Construir e testar a solução proposta.
 
 

Programas

Programar é basicamente construir algoritmo através do uso de uma linguagem de programação.
As linguagens de programação podem ser classificadas em três níveis:
  • Linguagem de máquina
    • Conjunto de instruções em código binário.
  • Linguagem de montagem ou de 2o nível
    • São utilizados códigos especiais chamados mnemônicos;
    • Um programa montador traduz as instruções simbólicas da linguagem de montagem para a linguagem de máquina.
  • Linguagem de alto nível
    • Comandos que se assemelham a linguagem natural (inglês);
    • Um programa compilador ou interpretador traduz para a linguagem de máquina.
Elementos de uma linguagem:
  • Sintaxe  diz respeito à forma. (Escrita correta);
  • Semântica  refere-se ao conteúdo. (Significado
 
 

Desenvolvimento de algoritmos

A construção da seqüência lógica para a solução de um problema pode ser realizada através de notação gráfica como a de
       diagrama de blocos ou fluxograma
e/ou de técnica narrativa denominada
       pseudocódigo ou portugol.

Etapas a percorrer para a resolucão do problema:
         ou
Exemplo:
Ler dois valores A e B, efetuar a soma em X e apresentar o resultado obtido.

Nota:  Para a resolução de qualquer problema ter sempre em mente os três conceitos fundamentais:  entrada, processamento e saída de dados.


Diagrama de blocos


Pseudocódigo

 
 

Diagrama de blocos

Principais símbolos gráficos utilizados em diagrama de blocos:

 
 

Tópicos fundamentais

Tipos de dados

(Em C++ uma string de caracteres é delimitada por aspas duplas.)

O tipo de uma variável determina a quantidade de memória que ela ocupará, em bytes, e o modo de armazenamento.

C++ possui cinco tipos básicos que são:

c++p1_img09
Nota: Ao contrário de outras linguagens, não existe um tipo de dado lógico que assuma um valor verdade ou falsidade (true/false).
Qualquer valor diferente de zero é considerado verdade e zero, falsidade.
 
 

Tipos modificados

Os tipos básicos podem ser acompanhados de modificadores na declaração de variáveis, exceto o tipo float e void. O tipo double só aceita o modificador long.
Os modificadores de tipo são: unsigned, short e long.

c++p1_img10
 
 

Conversão de tipos

c++p1_img11
 
 

Declaração de variáveis

Uma variável é uma área na memória referenciada por um identificador, onde pode ser armazenado um valor de certo tipo e alterado a qualquer momento.
Exemplos:
c++p1_img12

Um identificador nomeia a informação. O nome de variável, constante, função, etc. é considerado um identificador.
Um nome de identificador deve começar por uma letra ou por um caractere de sublinhado, ser único dentro de seu escopo, não pode ser igual a uma palavra reservada da linguagem ou que pertence a sintaxe da linguagem e é vedado o uso de caracteres especiais, exceto o símbolo de sublinhado.
C++ é sensível a letras maiúsculas e minúsculas (case-sensitive). É recomendável utilizar sempre identificadores com letras minúsculas.

Palavras reservadas:
c++p1_img13

Quais dos seguintes nomes são válidos para a declaração de variáveis em C++?
c==p1_img14
os itens de nomes considerados válidos.
 
 

Denominação de variáveis

Recomenda-se para a declaração de variáveis a utilização de letras minúsculas. Caso o nome seja composto de mais de uma palavra, as demais devem ser iniciadas com letras maiúsculas. Exemplos:
total contador valorMedio
segundaFase somaValorReal contaLinhaRel2

Dicas: Utilize nomes significativos na denominação de variáveis. Dê um nome que represente o mais precisamente possível o propósito desta variável.  Evite nomes sem significado ou abreviaturas não usuais.
 
 

Constantes

Uma constante é representada por um valor fixo que não pode ser alterado ao longo da execução do programa.
Exemplos:
   Pseudocódigo
   C++
 const real PI <-- 3.14159
 const float PI = 3.1419;
 const caractere LETRA <-- ‘x’
 const char LETRA = ‘x’;
 
 

Comando de atribuição

Utilizado para atribuir ou fornecer um valor a uma determinada variável.
Exemplos:
   Pseudocódigo
   C++
 salario 508.50
 salario = 508.50;
 resto <-- 120 – 49
 resto = 120 – 49;

Atribuições múltiplas em C++:    z = x = 8;  ou  z = (x = 8);
 
 

Operadores aritméticos

As variáveis e constantes numéricas podem ser utilizadas em cálculos matemáticos, aplicando os operadores:
 Pseudocódigo
 Função
   C++
   *
 Multiplicação
*
   /
 Divisão
/
   +
 Adição
+
   -
 Subtração
-
   Mod
 Divisão (resto)
%

ou serem utilizadas em funções matemáticas.

Algumas funções matemáticas pré-definidas:
Operação
Sintaxe
Exemplo
raiz quadrada
double sqrt(double)
 sqrt (9.0)
potenciação
double pow(double base, double exp)
 pow (2,5)
valor absoluto
int abs(int)
 abs (-5)
valor absoluto
double fabs(double)
 fabs (-4.3)
 
 

Operadores de incremento e de decremento

Os operadores de incremento (++) e de decremento (--) são operadores unários que adicionam e subtraem uma unidade do conteúdo da variável respectiva:

 Instrução
 Equivalência
  var++
 var = var + 1
  ++var
 var = var + 1
  var--
 var = var – 1
  --var
 var = var – 1
O valor da variável será incrementado (ou decrementado) depois ou antes da execução da instrução de que ela faz parte.
 
 

Operadores aritméticos de atribuição

Estes operadores combinam as operações aritméticas com atribuição:
 Aritmética de atribuição
 Instrução equivalente
   i += 5;
  i = i + 5;
   j -= x;
  j = j – x;
   k *= y + 2;
  k = k * (y + 2);
   m /= 4.2;
  m = m / 4.2;
   n %= 2;
  n = n % 2;
 
 

Operadores relacionais

Operadores relacionais fazem comparações, ou seja, verificam a relação de magnitude e  igualdade entre dois valores.
São seis os operadores relacionais:
Pseudocódigo
   Operação
C++
=
 Igual a
==
>
 Maior que
>
<
 Menor que
<
<>
 Diferente de
!=
>=
 Maior ou igual a
>=
<=
 Menor ou igual a
<=
 
 

Operadores lógicos

Utilizados em expressões lógicas compostas ou para inverter o estado lógico de uma condição. Retornam o valor verdadeiro ou falso.
Pseudocódigo
 Operação
C++
e
 Conjunção
&&
ou
 Disjunção
| |
não
 Negação
!
Os operadores && e | | são binários e o operador ! é unário.
Estes operadores avaliam os operandos como lógicos (0 ou 1), sendo o valor lógico 0 considerado falso e o valor lógico 1, verdadeiro.

As tabelas-verdade, a seguir, expressam operações lógicas:

conjunção (&&)
disjunção (||)
negação (!)
0 e 0 = 0
0 ou 0 = 0
não 0 = 1
0 e 1 = 0
0 ou 1 = 1
não 1 = 0
1 e 0 = 0
1 ou 0 = 1
 
1 e 1 = 1
1 ou 1 = 1
 
 
 

Operador ternário ou condicional

O operador ternário (?:) opera sobre três expressões:
condição ? expr1 : expr2
condição é uma expressão lógica que será avaliada primeiro. Se o valor for diferente de zero (verdade) a expr1 será o valor da condicional. Caso contrario a expr2 será o valor da condicional.
 
 

Precedência dos operadores

A precedência é o criterio que especifica a ordem de avaliação dos operadores de uma expressão qualquer. Os operadores de cada categoria possuem a mesma prioridade e são executados na ordem em que são escritos na instrução da esquerda para direita:
Categorias e operadores:
1. Negativo, incr/decr. e não lógico: -, ++, --, !
2. Aritméticos: (*, /, %), (+, -)
3. Relacionais: (<, <=, >, >=), (==, !=)
4. Lógicos: &&, ||
5. Ternário:  ?:
(Parêntesis podem ser utilizados para determinar uma forma específica de avaliação de uma expressão.)
 
 

Exercícios  (Para obter as respostas posicione o cursor sobre a letra da expressão)

a = (2 + 1) * 6;
b = 20 / (-2) / 5;
c = (5 + 1) / 2 * 3;
d = 2 + 6 / 4 * 8;
e = 18 – 11 % 3;
          
f = 50 > 5 && 20 == 10;
g = 50 > 5 || 20 == 10;
h = !12 > 30;
i = 5 < 8 && 2 > 4;
j = 8 != 18 || 12 > 4 * 5

int x=1, y=2, z=3;
k = x ? y : z;
l = x > y ? y : z;
m = y > x ? ++z : --z;
n = x >= z ? z : --y;
o = z != x ? z++: y;
     
int x=0, y=1, z=2;
p = x && y;
q = x > z || z == y;
r = x + y && !z – y;
s = !x && z – y;
t = y == x+1 || y + 3 > 4;

int ano = 2008; (Verificar se é bissexto)
u = ((ano % 4==0) && (ano % 100>0) || (ano%400==0));
ou testanto de outra forma:
v = ((!(ano % 4)) && (ano % 100) || (!(ano % 400)));
 
 

Comandos de entrada e saída

São comandos que permitem obter dados do ambiente exterior para a memória do computador e fornecer dados ao mundo exterior.
Exemplos:
Pseudocódigo
C++
 leia (nota)
 cin >> nota;
 escreva (resultado)
 cout << resultado;
cin utiliza o operador de extração  (>>)
cout utiliza o operador de insersão (<<)
 
 

Caracteres de controle

Utilizados para controle de páginas e exibição de códigos especiais. Algumas seqüências de controle:
Caractere de controle
Significado
\n
 nova linha
\t
 tabulação
\r
 início da linha
\\
 imprime barra invertida (\)
\”
 imprime aspa dupla
\’
 imprime apostrofo
A instrução endl (end line) encerra a linha de dados e coloca o cursor no início da próxima linha.
Tem, portanto, a mesma função do caractere de controle \n.
Exemplos:
cout<<"Imprime e alimenta linha\n";
cout<<"\nAlimenta linha e imprime";
cout<<"Imprime e alimenta linha"<<endl;
cout<<endl<<"Alimenta linha e imprime";
 
 

Formato de impressão

O tamanho de um campo de dado pode ser definido no comando cout para permitir o alinhamento na apresentação dos dados:
setw
determina o tamanho do campo a ser exibido
setfill
estabelece o caractere de preenchimento do espaço em branco
setprecision
determina a quantidade de casas decimais dos números reais ou de ponto flutuante (float);
O arquivo de inclusão iomanip.h define os manipuladores de alinhamento.

Codificação:
int ban=2300,  uva=58;
cout << setfill('.');    // caratere de prenchimento
cout << '\n' << "Bananas" << setw(10) << ban;
cout << '\n' << "Uvas      " << setw(10) << uva;

Saída (resultado): Bananas . . . . . . 2300
  Uvas       . . . . . . . . 58

Codificação:
float ban=2300.3,  uva=58.476;
cout << setprecision(2);    // exibe duas casas decimais
cout << '\n' << "Bananas" << setw(10) << ban;
cout << '\n' << "Uvas      " << setw(10) << uva;

Saída (resultado): Bananas         2300.30
  Uvas                   58.48
 
 

Comentários

São utilizados com a finalidade de documentar o programa-fonte. Eles não são tratados pelo compilador.
Os símbolos utilizados são:
Símbolo
Exemplo
/* e */
/* comentario delimitado por esses símbolos pode estender-se por várias linhas */
//
// conhecido como comentário de linha
 
 

Exemplo de um algoritmo

Problema
Calcular a média aritmética de três notas fornecidas pelo usuário e imprimir o resultado.
Pré-algoritmo
1. ler três notas para as variáveis nt1, nt2, nt3;
2. efetuar o cálculo da média, implicando o valor à variável media;
3. apresentar a média contida na variável media.

Diagrama de blocos (solução do algoritmo)
c++p1_img18

Pseudocódigo
algoritmo calcMedia
    declare nt1, nt2, nt3, media real
    escreva ('Informe as tres notas:')
    leia (nt1,nt2,nt3)
    media <-- (nt1 + nt2 + nt3) / 3
    escreva ('Média aritmética: ', media)
fim algoritmo

Implementação em C++
Um programa ou função em C++ tem a seguinte estrutura:    

c++p1_img19

#include é uma diretiva de compilação que inclui no programa códigos de arquivo pré-definido nomeado entre os símbolos < e >.
Diretivas são instruções dadas ao pré-processador e são iniciadas com o caractere #. Conhecidas também como arquivos-cabeçalho.

c++p1_img20
 
 

Aplicações de console

Os exercícios serão desenvolvidos no modo console do sistema operacional para a interação com o usuário. Na criação do projeto deve-se selecionar a opção “Win32 Console Application” para que as operações de entrada e saída de dados sejam realizadas através da janela do MS-DOS.
 
 

Bibliografia

  • ASCENCIO, Ana Fernanda Gomes, CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores : algoritmos, Pascal e C/C. São Paulo : Prentice Hall, 2002. xviii, 355p.
  • FORBELLONE, André Luiz Villar; EBERSPACHER, Henri Frederico. Lógica de programação : a construção de algoritmos e estruturas de dados. 2.ed. São Paulo : Makron Books, 2000. 197p.
  • JAMSA, Kris A. Aprendendo C. São Paulo : Makron Books do Brasil, 1999. 271p.
  • MIZRAHI, Victorine Viviane. Treinamento em linguagem C. Sao Paulo : Makron, 1994. v.
  • BERRY, John Thomas. Programando em C. Sao Paulo : Makron Books, 1991. xvi, 385p.
  • UCCI, Waldir; SOUSA, Reginaldo Luiz; KOTANI, Alice Mayumi, et al. . Lógica de programação : os primeiros passos. 8.ed. Sao Paulo : Erica, 1999. 339p.