Você está na página 1de 85

CAMADA DE

PROGRAMAÇÃO
PROFESSOR: ÉDER PORFÍRIO
TIPOS DE DADOS E
VARIÁVEIS
CONTEÚDO PROGRAMÁTICO
TIPOS DE DADOS VARIÁVEIS
 TIPOS DE DADOS PRIMITIVOS  NOME
 CADEIA DE CARACTERES  ENDEREÇO
 MATRIZES  TIPO
 REGISTROS  VALOR
 VERIFICAÇÃO DE TIPOS  TEMPO DE VIDA
 TIPAGEM FORTE  ESCOPO
TIPOS DE DADOS
1. TIPOS DE DADOS
 Programas produzem resultados através da MANIPULAÇÃO DE DADOS;

 TIPOS DE DADOS (definem):


 Coleção de valores;
 Conjunto de operações sobre esses valores.

 SISTEMA DE TIPOS
 Define como o tipo é associado a cada expressão
 Inclui regras para equivalência e compatibilidade
 É importante para entender a semântica das Linguagens de Programação (LP)
1.1 TIPOS DE DADOS PRIMITIVOS
 Tipos de dados não definidos em termos de outros
 Alguns são reflexo do hardware;
 Outros requerem suporte externo ao hardware;

 Utilizados com um ou mais construtores de tipos  fornecer tipos


estruturados
1.1 TIPOS DE DADOS PRIMITIVOS

 Tipos Numéricos

 Tipos Booleanos

 Tipos Caracteres
1.1.1 TIPOS NUMÉRICOS
 Desempenham papel central entre os tipos suportados

 Muitas LP’s possuem apenas tipos numéricos

 Principais Tipos:
◦ Inteiros
◦ Ponto flutuante
◦ Decimais
INTEIRO
 Tipo mais comum
 Não possuem parte decimal;
 Podem ser positivos e negativos;

 Maioria dos tipos inteiros são suportados diretamente pelo


hardware;

 Inicialmente ocupava 2 Bytes.


 Operações Aritméticas  Valores Grandes  Inteiros Longos
INTEIRO

 INTEIRO COM SINAL

 SINAL MAGNITUDE  Cadeia de bits, com um dos bits representando o sinal;

 COMPLEMENTO DE DOIS  Aritmética computacional;


PONTO FLUTUANTE
 Modelam números reais; PROBLEMA:
 Perda de precisão por expressões
aritméticas;
 SINTAXE:
 Frações Exponenciais (notação  Representação são apenas aproximações:
científica) π–е

 PRICIPAL REPRESENTAÇÃO:  TAMANHO:


 float
 IEEE Float-Point Standard 754  double
DECIMAL
 Computadores de grande porte possuem suporte de hardware
para decimais
 Funcionamento: Armazenam um número fixo de números
decimais – ponto decimal em uma posição fixa

 Vantagem:
 Capazes de armazenar precisamente valores decimais (dentro de uma faixa)

Desvantagens:
 Restrita (nenhum expoente é usado)
 Precisão em memória é dispendiosa
1.1.2 TIPOS BOOLEANOS
 Tipos de dados mais simples;

 Faixa de valores apenas dois elementos: verdadeiro e falso

 Geralmente usados para representar escolhas.


 Poderiam ser realizadas com outros tipos (inteiros por exemplo)
 Tipo booleano aumenta a Legibilidade
1.1.3 CARACTERES
 São armazenados como codificações numéricas

 Tradicionalmente  ASCII (não mais usada)


 Atualmente  UCS-4 ou UTF-32.
 Consórcio: Unicod e ISO
1.2 CADEIA DE CARACTERES
 SEQUÊNCIA DE CARACTERES  Usados para rotular entradas/saídas

 Tipo essencial para LP’s que desejam manipular caracteres

 Duas questões de projeto:


1. Cadeia é um tipo especial de vetor ou um tipo primitivo?
2. As cadeias devem ter tamanho estático ou dinâmico?
1.3 MATRIZES
 Agregação homogênea de elementos

 Elementos específicos são referenciados por meio de um mecanismo


sintático e dois níveis:
◦ Primeira parte: Nome do Agregado;
◦ Segunda parte: seletor – um ou mais itens (índices)

 Sintaxe Universal:
 Nome da matriz, seguida por uma lista de índices (envolvidos por parênteses ou
colchetes)
1.4 REGISTROS
 Agregado de elementos de dados
 Usado para modelar coleções de dados que não são do mesmo tipo;
 Elementos individuais identificados por nomes e acessados por
deslocamento a partir do início da estrutura;

Exemplo C:
Struct ficha_aluno {
char nome[50];
char disciplina [30];
float AP1;
float AP2;
float AP3;
}
1.5 VERIFICAÇÃO DE TIPOS
 Atividade de garantir que operandos e operadores são de tipos compatíveis;

 Tipo compatível:
 Legal
 É permitido dentro das regras da LP - convertido (coerção) - Ex: IntToFloat

 TIPOS ESTÁTICOS  Vinculação feita de maneira estática  verificação na


compilação
 TIPOS DINÂMICOS  Vinculação feita de maneira dinâmica  verificação em
tempo de execução
EQUIVALÊNCIA DE TIPOS
 Definida para dar suporte a verificação de tipos

 Regras de Compatibilidade
 Ditam os operandos aceitáveis para cada operador ;
 Especificam possíveis erros de tipos.

 Regras simples e rígidas  escalares pré-definidos (inteiros)


 Regras Complexas  tipos estruturados (matrizes e registros)
1.6 TIPAGEM FORTE
 FORTEMENTE TIPADA  Erros de tipos são sempre detectados;

 Requer que tipos de dados sejam determinados em tempo de compilação ou


em tempo de execução;

 IMPORTANTE: Habilidade de detectar usos incorretos de variáveis (erros de


tipos)

 Permite a detecção em tempo de execução, do uso de tipo incorretos em


variáveis que podem armazenar valores de mais de um tipo.
VARIÁVEIS
2. VARIÁVEIS
 Linguagens Imperativas  Abstrações para arquitetura de Von Neumann

 Variáveis  Abstração para células de memória

 Coleção de Atributos:
◦ Nome
◦ Endereço
◦ Tipo
◦ Valor
◦ Tempo de Vida
◦ Escopo
2.1 NOMES
 Nome ou Identificador  Cadeia de caracteres usada para identificar alguma
entidade em um programa.
 Usado para denominar muitas entidades: variáveis, tipos, funções, etc.

 Regras léxicas rígidas.


 Formato (maioria das LPs): uma letra seguida por uma cadeia de letras, dígitos e
sublinhado (_).
 Primeiras LP – apenas maiúsculas – limites sobre o comprimento;

 Algumas linguagens são Key Sensitive.


PALAVRAS ESPECIAIS
USADAS PARA:
◦ Tornar os programas mais legíveis;
◦ Nomearem ações realizadas;
◦ Separar as partes sintáticas das sentenças;

PALAVRAS RESERVADAS  Não podem ser usada como identificadores

Importantes para a análise


◦ Identificam construções importantes (C: int, if, while)
2.2 ENDEREÇO
 DEFINIAÇÃO  Endereço de memória ao qual a variável está associada.

 Essa associação não é tão simples:


 Muitas LP  variável pode está alocada em diferentes endereços

 Momento da associação  Importante para o entendimento das LP


 ALOCAÇÃO  Vinculação da célula a um endereço;
 LIBERAÇÃO  Célula volta para o conjunto de células disponíveis

 Conhecido como Valor Esquerdo (L-VALUE)

APELIDOS (ALIASES) – Mais de um nome para acessar a mesma posição de memória


2.3 TIPO
 DETERMINA:
◦ Faixa de valores que a LP pode armazenar
◦ Conjunto de operações definidas para valores do tipo

 CONCEITO JÁ DISCUTIDO NA SEÇÃO ANTERIOR


2.4 VALOR
 Conteúdo das células de memória

 Conveniente pensar em células abstratas ao invés de células físicas

 Conhecido como Valor Direito (R-VALUE)


 Para acessar o lado direto é necessário determinar o lado esquerdo antes
2.5 TEMPO DE VIDA
 Tempo que uma variável fica vinculada a uma célula de memória;

 COMEÇA  Quando a variável é alocada

 TERMINA  Quando a variável é liberada


2.6 ESCOPO
Faixa de sentença onde a variável é visível
◦ Visível na Sentença  Se pode ser referenciada nessa sentença

REGRA DE ESCOPO - Determina:


◦ Como o nome é associado a variável
◦ Como referências à variáveis declaradas fora (subprograma ou bloco) são
associadas com suas declarações e com seus atributos

VARIÁVEL LOCAL  declarada dentro de uma unidade ou bloco;


VARIÁVEL NÃO-LOCAL  visíveis dentro da unidade ou bloco, mas
não declaradas lá;
ESCOPO GLOBAL
 Definidas fora da sentença

 Maioria das LP: é implicitamente visível em todas as sentenças


 Exceto nas que incluem variáveis com mesmo nome

 Algumas LP: Variáveis locais e globais com mesmo nome podem


ser acessadas por um operador de escopo.
 EXEMPLO: C++ (x  variável local; ::x – variável global)
ESCOPO – Métodos de Associação
 ESTÁTICO
 Determinado estaticamente  antes da execução

 DINÂMICO
 Baseado na sequência de chamada a subprogramas
 Determinado em tempo de execução

 ESCOPO ESTÁTICO (mais utilizado)


 Mais fácil de ler
 Mais confiável
 Executam mais rápido
RESUMO - Variável
Nome: Identificação da variável
Endereço: Célula de memória vinculada
Tipo: Faixa de valores
Valor: Conteúdo da célula de memória
Tempo de Vida: Tempo de alocação da variável
Escopo: Faixa de sentenças onde é visível
ALGORITMOS
Ciência da computação é algumas vezes definida
como o estudo de algoritmos e da implementação eficiente
deles em um computador.
Solucionando Problemas...
Em 1945, George Polya, How to Solvi it: A New Aspect of Mathematical Method o é apresentada
uma descrição clássica do processo de solucionar problemas.

EM RESUMO:
1. Compreensão do Problema;
2. Encontrar conexão entre os dados e as incógnitas;
3. Executa seu plano;
4. Examine a solução obtida.
EXAMINANDO A ESTRATÉGIA DE POLYA

FAÇA PERGUNTAS
 O que sei sobre o problema?
 Com o que a solução se parece?
 Que tipos de casos especiais existem?
 Como reconhecerei ter encontrado a solução?
PROCURE POR COISAS FAMILIARES

Em computação certo problemas são vistos repetidas vezes;

Você nunca deverá reinventar a roda;

Se solução existir, use-a;


DIVIDIR PARA CONQUISTAR
Dividir o problema em unidades menores com as quais possamos lidar.

Esse abordagem aplica o conceito de abstração;

Tarefas são divididas em subtarefas, que podem ser divididas em outras


subtarefas
ALGORITMOS

Algoritmo é um conjunto de instruções usadas para solucionar um problema ou


um subproblema em uma quantia finita de tempo, com uma quantidade finita
de dados;

Em computação devemos tornar explicitas certas condições que são implícitas
em condições humanas;
Processo de solução de problemas por
computador...
 Análise e Especificação

 Desenvolvimento do Algoritmo

 Implementação

 Manutenção
Projetando Algoritmos
A metodologia de projetar algoritmos pode ser subdividida em quatro passos
simples:

1. Analise o Problema
2. Liste as Principais Tarefas
3. Escreva os Módulos Restantes
4. Refaça a Sequência e Revise de Acordo com as Necessidades
PRINCIPAIS TIPOS DE
ALGORITMOS
ALGORITMOS COM VARIÁVEIS SIMPLES

 ALGORITMOS SEQUENCIAIS

ALGORITMO COM SELEÇÃO

 ALGORITMO COM REPETIÇÃO


Sequenciais
{Programa que soma 2 /*Programa que soma 2
numeros } números */
Program Soma; #include <stdio.h>
var A, B, C : integer; int main(void){
begin int A, B, C;
Readln( A ); scanf("%d", &A);
Readln( B ); scanf("%d", &B);
C := A + B; C = A + B;
Writeln( C ); printf("%d", C );
end. }
Seleção ou Condicional
A estrutura condicional permite a escolha do grupo de ações e estruturas a ser executado
quando determinadas condições são ou não satisfeitas. A estrutura condicional pode ser
apresentada através de uma estrutura simples ou de uma estrutura composta.

Formato de uma Estrutura Condicional Simples

se condição
então sequência de comandos
Exemplo

Algoritmo #!/usr/bin/perl
declare sequencia01, sequencia02 literal # Selecao Simples.
sequencia01 ← “GTGGGATC” my ($sequencia01, $sequencia02);
leia sequencia02 $sequencia01 = "GTGGGATC";
se sequencia01 = sequencia02 print "Digite a sequencia: ";
então escreva “Sequencia encontrada” chomp($sequencia02 = <STDIN>);
Fim_Algoritmo if($sequencia01 eq $sequencia02){
print "Sequencia encontrada\n";
}
Estrutura Condicional Composta

se condição
então sequência 1 de comandos
senão sequência 2 de comandos

Neste caso, a sequência 1 só será executada se a condição for verdadeira e a


sequência 2 de comandos só será executada se a condição for falsa.
Exemplo
Algoritmo #!/usr/bin/perl
declare sequencia01 literal # Selecao Composta.
leia sequencia01 my ($sequencia);
se sequencia01 = “GGTCAG” print "Digite a sequencia: ";
então escreva “Sequencia encontrada” chomp($sequencia = <STDIN>);
senão escreva “Sequencia não if ($sequencia eq "GGTCAG"){
encontrada” print "Sequencia encontrada\n";
Fim_Algoritmo }
else {
print "Sequencia não encontrada\n";
}
Estrutura Condicional
Exemplo

Algoritmo #!/usr/bin/perl
declare seq01, seq02, seq03 literal # Selecao Composta.
seq01 ← “GGTACGTA” my ($seq01, $seq02, $seq03);
seq02 ← “GGTACGAT” $seq01 = "GGTACGTA";
leia seq03 $seq02 = "GGTACGAT";
se seq03 = seq01 print "Digite a sequencia: ";
então escreva “Encontrou” chomp($seq03 = <STDIN>);
senão se seq03 = seq02 if ($seq03 eq $seq01){
então escreva “Encontrou” print "Encontrou\n";
senão escreva “Não achou!” } elsif ($seq03 eq $seq02){
Fim_Algoritmo print "Encontrou\n";
}
else {print "Não achou\n";
}
Seleção
Repetição
A estrutura de repetição permite que uma sequência de comandos seja executada
repetidamente até que uma determinada condição de interrupção seja satisfeita. A
condição de interrupção que deve ser satisfeita é representada por uma expressão
lógica. As estruturas de repetição são:

• Comando Enquanto

• Comando Repita

• Comando Para
Estrutura Enquanto

Enquanto o valor da condição for verdadeiro, as ações dos comandos são executadas.
Quando for falso, o comando é abandonado. Se já da primeira vez o resultado é falso, os
comandos não são executados nenhuma vez.

Formato do comando Enquanto

enquanto condição faça


inicio
comandos
fim
Exemplo

Algoritmo #!/usr/bin/perl
declare X,Y, L numérico # Repeticao: Enquanto.
L←0 my ($x, $y, $l);
$l = 0;
enquanto L <= 3 faça
while ($l <= 3){
início print "digite x: ";
leia X,Y $x = <STDIN>;
se X > Y print "digite y: ";
então escreva X $y = <STDIN>;
senão escreva Y if ($x > $y){
L←L+1 print "$x \n";
fim } else {
Fim_Algoritmo. print "$y \n";
}
$l = $l + 1;
}
Estrutura Repita

Os comandos são executados pelo menos uma vez. Quando a condição é encontrada, ela é
testada. Se for verdadeira o comando seguinte será executado. Se for falsa, os comandos
voltam a ser executados. Em outras palavras os comandos são executados até que a
condição se torne verdadeira.

Formato do comando Repita

repita
comandos
até condição
Exemplo

Algoritmo #!/usr/bin/perl
declare X,Y, L numérico # Repeticao: Repita.
L←0 my ($x, $y, $l);
$l = 0;
repita
do {
leia X,Y print "digite x: ";
se X > Y $x = <STDIN>;
então escreva X print "digite y: ";
senão escreva Y $y = <STDIN>;
L←L+1 if ($x > $y){
até L > 3 print "$x \n";
Fim_Algoritmo. } else {
print "$y \n";
}
$l = $l + 1;
} until $l >= 3

Sandro Carvalho Izidoro


Estrutura Para

O comando para é, na verdade, o comando enquanto utilizando uma variável de controle,


escrito numa notação compactada. Neste caso existirá sempre uma inicialização da variável
de controle, um teste para verificar se a variável atingiu o limite e um acréscimo na variável
de controle.

Formato do comando Para

para var de val_num_1 até val_num_2 [ passo val_num_3] faça


início
comandos
fim
Exemplo

Algoritmo #!/usr/bin/perl
declare X,Y, L numérico # Repeticao: Para.
para L de 1 até 3 passo 1 faça my ($x, $y, $l);
for ($l=0;$l<=3;$l++){
início
print "digite x: ";
leia X,Y $x = <STDIN>;
se X > Y print "digite y: ";
então escreva X $y = <STDIN>;
senão escreva Y if ($x > $y){
fim print "$x \n";
Fim_Algoritmo. } else {
print "$y \n";
}
}
VARIÁVEIS COMPOSTAS

 VETORES E MATRIZES

REGISTROS
Vetores
Cada elemento do vetor é referenciado individualmente por meio de um número
inteiro e positivo, entre colchetes.

◦ Este número/índice representa a posição do elemento no vetor.


◦ A numeração dos índices inicia em ZERO.

Exemplo:
◦ x[0] = 1;
◦ y[10] = 'a';
Matrizes
Funcionam de modo similar a vetores.
Declaração:
<tipo de dado> <identificador> [tamanho1,tamanho2,...]

Exemplo:
int m[3][3]; /* declara uma matriz 3x3 */
int n[3][4][5]; /* declara uma matriz
tridimensional de tamanho 3x4x5 */

double p[10][2]; /* declara uma matriz do tipo


double de tamanho 10x2 */
Matrizes - Inicialização
int a[3][3]={1,2,3,4,5,6,7,8,9};

int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
/* Separa os dados de cada linha da matriz. Esta maneira é preferida. */

Em ambos os exemplos acima é criada a matriz:


123
456
789
ALGORITMOS DE PESQUISA

 BUSCA SEQUENCIAL

BUSCA BINÁRIA
Métodos de Busca
Busca Sequencial – vetor não ordenado
Busca Sequencial – vetor não ordenado
Int busca(int n, int *vet, int elem)
{
int i = 0;
while (i < n && vet[i] != elem)
i++;
if (i == n)
return -1; // elemento não encontrado
else return i; //elemento na posição i
}
Busca Binária
inicio meio fim
Elem = 22
0 5 11

4 7 8 10 14 21 22 36 62 77 81 91
22 >21, inicio = meio +1
inicio meio fim
6 8 11

4 7 8 10 14 21 22 36 62 77 81 91
22 < 62, fim= meio -1
inicio meio fim
6 6 7

4 7 8 10 14 21 22 36 62 77 81 91
22 = 22, o elem está na posição meio
ALGORITMOS DE ORDENAÇÃO
 SELEÇÃO

BOLHA

 INSERÇÃO
Ordenação
Ordenação - bolha
ALGORITMOS RECURSIVOS

FATORIAL

 PESQUISA BINÁRIA RECURSIVA


Conceito de Recursividade
Fundamental em Matemática e Ciência da Computação
◦ Um programa recursivo é um programa que chama a si mesmo
◦ Uma função recursiva é definida em termos dela mesma

Conceito poderoso
◦ Define conjuntos infinitos com comandos finitos
Recursividade
A recursividade é uma estratégia que pode ser utilizada sempre que o
cálculo de uma função para o valor n, pode ser descrita a partir do cálculo
desta mesma função para o termo anterior (n-1).

Exemplo – Função fatorial:

n! = n * (n-1) * (n-2) * (n-3) *....* 1


(n-1)! = (n-1) * (n-2) * (n-3) *....* 1
logo:
n! = n * (n-1)!

Algoritmos e Estrutura de Dados I


Recursividade
Definição: dentro do corpo de uma função, chamar novamente a própria função
◦ recursão direta: a função A chama a própria função A
◦ recursão indireta: a função A chama uma função B que, por sua vez, chama A

Algoritmos e Estrutura de Dados I


Condição de parada
Nenhum programa nem função pode ser exclusivamente definido por si
◦ Um programa seria um loop infinito
◦ Uma função teria definição circular

Condição de parada
◦ Permite que o procedimento pare de se executar
◦ F(x) > 0 onde x é decrescente

Objetivo
◦ Estudar recursividade como ferramenta prática!
Exemplo
Fat (int n) {
if (n<=0)
return 1;
else
return n * Fat(n-1);
}

Main() {
int f;
f = fat(5);
printf(“%d”,f);
}
PARADIGMAS DE
PROGRAMAÇÃO
O QUE É UM PARADIGMA
PROGRAMAÇÃO IMPERATIVO
PROGRAMAÇÃO ORIENTADA A OBJETOS
PROGRAMAÇÃO FUNCIONAL
PROGRAMAÇÃO LÓGICA

Você também pode gostar