Você está na página 1de 86

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:
▪ Representação são apenas aproximações:
▪ Frações Exponenciais (notação π–е
científica)

▪ TAMANHO:
▪ PRINCIPAL REPRESENTAÇÃO: ▪ 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 numeros } /*Programa que soma 2 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
# Selecao Simples.
declare sequencia01, sequencia02 literal
my ($sequencia01, $sequencia02);
sequencia01 ← “GTGGGATC”
$sequencia01 = "GTGGGATC";
leia sequencia02
print "Digite a sequencia: ";
se sequencia01 = sequencia02
chomp($sequencia02 = <STDIN>);
então escreva “Sequencia encontrada”
if($sequencia01 eq $sequencia02){
Fim_Algoritmo
print "Sequencia encontrada\n";
}
Estrutura Condicional Composta

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

• A sequência 1 só será executada se a condição for verdadeira


• A sequência 2 de comandos só será executada se a condição for falsa.
Exemplo

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

Algoritmo my ($seq01, $seq02, $seq03);


$seq01 = "GGTACGTA";
declare seq01, seq02, seq03 literal
$seq02 = "GGTACGAT";
seq01 ← “GGTACGTA”
print "Digite a sequencia: ";
seq02 ← “GGTACGAT”
chomp($seq03 = <STDIN>);
leia seq03
if ($seq03 eq $seq01){
se seq03 = seq01
print "Encontrou\n";
então escreva “Encontrou”
} elsif ($seq03 eq $seq02){
senão se seq03 = seq02
print "Encontrou\n";
então escreva “Encontrou”
}
senão escreva “Não achou!”
else {print "Não achou\n";
Fim_Algoritmo
}
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
#!/usr/bin/perl
# Repeticao: Enquanto.
Exemplo
my ($x, $y, $l);
Algoritmo $l = 0;
while ($l <= 3){
declare X,Y, L numérico
L←0 print "digite x: ";
enquanto L <= 3 faça $x = <STDIN>;
início
leia X,Y print "digite y: ";
se X > Y $y = <STDIN>;
então escreva X if ($x > $y){
senão escreva 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
#!/usr/bin/perl
# Repeticao: Repita.
EXEMPLO my ($x, $y, $l);
$l = 0;
Algoritmo
do {
declare X,Y, L numérico print "digite x: ";
L←0 $x = <STDIN>;
repita
print "digite y: ";
leia X,Y
se X > Y $y = <STDIN>;
então escreva X if ($x > $y){
senão escreva Y
print "$x \n";
L←L+1
até L > 3 } else {
Fim_Algoritmo. print "$y \n";
}
$l = $l + 1;
} until $l >= 3
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
#!/usr/bin/perl

EXEMPLO # Repeticao: Para.


my ($x, $y, $l);

Algoritmo for ($l=0;$l<=3;$l++){


print "digite x: ";
declare X,Y, L numérico $x = <STDIN>;
para L de 1 até 3 passo 1 faça
início print "digite y: ";
leia X,Y $y = <STDIN>;
se X > Y
if ($x > $y){
então escreva X
senão escreva Y print "$x \n";
fim } else {
Fim_Algoritmo.
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)!
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 IMPERATIVA
PROGRAMAÇÃO ORIENTADA A
OBJETOS
PROGRAMAÇÃO FUNCIONAL
PROGRAMAÇÃO LÓGICA

Você também pode gostar