SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
Resumo de Aulas
Linguagens de Programação I




                 Pedro Victor de Sousa Lima
                    Ciência da Computação
Sumário
TIPOS DE DADOS .................................................................................................................................................. 4
   inteiros .......................................................................................................................................................................... 4
   ponto flutuante ............................................................................................................................................................. 4
   decimais ........................................................................................................................................................................ 5
   booleanos ...................................................................................................................................................................... 5
   caracteres...................................................................................................................................................................... 6
   ponteiros ....................................................................................................................................................................... 6
STRING ................................................................................................................................................................ 7
   representação de strings ............................................................................................................................................... 7
   strings dinâmicas .......................................................................................................................................................... 8
   interpolação de strings.................................................................................................................................................. 8
   casamento de padrões .................................................................................................................................................. 8
   biblioteca de programação ........................................................................................................................................... 8
   enumerados .................................................................................................................................................................. 8
   subfaixas ....................................................................................................................................................................... 9
VETORES ............................................................................................................................................................ 10
   alocação estática ou dinâmica.................................................................................................................................... 11
   vetores associativos (hashes) ...................................................................................................................................... 11
   árvore .......................................................................................................................................................................... 11
   registro ........................................................................................................................................................................ 11
   tipo lista ...................................................................................................................................................................... 12
   tipo unidade ................................................................................................................................................................ 12
VINCULAÇÕES .................................................................................................................................................... 13
   vinculação de nome .................................................................................................................................................... 14
   aliases.......................................................................................................................................................................... 14
   namespaces................................................................................................................................................................. 14
ESCOPO ............................................................................................................................................................. 15
   escopo estático............................................................................................................................................................ 15
   escopo dinâmico ......................................................................................................................................................... 15
   vinculação de tipos ...................................................................................................................................................... 15
   inferênca de tipos ........................................................................................................................................................ 15
COERÇÃO (IMPLÍCITA) X CONVERSÃO (EXPLÍCITA) ............................................................................................... 16
   compatibilidade de tipos ............................................................................................................................................. 16
VINCULAÇÃO AO ARMAZENAMENTO ................................................................................................................. 17




                                                                                          2
INICIALIZAÇÃO ................................................................................................................................................... 17
AVALIAÇÃO DE EXPRESSÕES ............................................................................................................................... 18
CONVERSÃO DE TIPOS ........................................................................................................................................ 19
COERÇÃO EM EXPRESSÕES ................................................................................................................................. 19
OPERADORES RELACIONAIS E EXPRESSÕES BOOLEANAS...................................................................................... 19
AVALIAÇÃO EM CURTO CIRCUITO ....................................................................................................................... 19
OPERADOR DE ATRIBUIÇÃO ............................................................................................................................... 20
   atribuição simples ....................................................................................................................................................... 20
   alvos múltiplos ............................................................................................................................................................ 20
   alvos condicionais ....................................................................................................................................................... 20
   atribuição composta ................................................................................................................................................... 20
   operador unitário de atribuição .................................................................................................................................. 20
   atribuição como função .............................................................................................................................................. 20
CONTROLE DE FLUXO ......................................................................................................................................... 21
   instruções compostas .................................................................................................................................................. 21
   instruções de seleção .................................................................................................................................................. 22
   seletores alinhados ..................................................................................................................................................... 22
   endentação ................................................................................................................................................................. 22
   seletores múltiplos ...................................................................................................................................................... 23
INSTRUÇÕES ITERATIVAS .................................................................................................................................... 24
   laço controlado por contador...................................................................................................................................... 24
   laço controlado por lógica .......................................................................................................................................... 24
   controle localizado pelo usuário ................................................................................................................................. 24
   laço controlado por estruturas de dados .................................................................................................................... 24
DESVIO INCONDICIONAL .................................................................................................................................... 25
   programação não estruturada.................................................................................................................................... 25
   programação estruturada........................................................................................................................................... 25
   programação orientada a objetos .............................................................................................................................. 25
   goto ............................................................................................................................................................................. 25
   saídas múltiplas .......................................................................................................................................................... 25
   comandos protegidos.................................................................................................................................................. 26
REVISÃO ............................................................................................................................................................ 27
DICAS ................................................................................................................................................................ 27




                                                                                          3
Tipos de dados

       A possibilidade de declarar tipos de dados apareceu no algol68
       Estruturas de dados podem ser produzidas a partir de tipos simples (ex. listas a partir de vetores).
       Algol68 – formato da linguagem definida no ano de 68
       Podem-se usar tipos de dados para criar novas estruturas, novos coisas.



                                                      INTEIROS


       São abstrações bastante diretas da memória
       Aparecem em diferentes capacidades
       Com ou sem sinal
       Representados geralmente na forma de complemento de 2

Podem ser “infinitos.”.

A maioria das linguagens tenta oferecer uma garantia de um número mínimo.

Inteiros dinâmicos são mais lentos, o hardware faz contas “dígitos por dígitos”, isto é, em partes.

 Wrap around: acontece quando o tipo de dados escolhido não consegue suprir as necessidades dele.



                                               PONTO FLUTUANTE


   Podem possuir precisão simples, dupla ou quádrupla.
   Poucos valores conhecidos são muito precisos, as operações fazem a precisão cair.
   Objetivo: aproveitar o número limitado de bits para guardar a maior quantidade de dígitos significativos
    possíveis (mantissa e expoente).

Ponto flutuante = float (em C)



     Representar um número que não é inteiro é ter uma forma de representação de não ter dígitos de casas
      decimais de formas fixas, apenas ter números decimais e depois por tais números de forma representativa.
      Escrevendo a parte significativa separada da magnitude, a parte que irá classificar, diferencia o número
      pequeno de um número grande.

+ 0.23 * 10²

Bits separados, um bit indica sinal, outro bit a mantissa e o outro magnitude.




                                                           4
A verificação de equivalência entre dois valores de tipo ponto flutuante é altamente imprevisível.

Exemplo:

Int inteiro = 16777217

Float real = inteiro;

If (real == inteiro)

         Cout << “os valores são iguais. n”;

         Else

         Cout << “valores são diferentes!n”;




                                                     DECIMAIS


        Possuem um número fixo de casas decimais (chamados também de ponto fixo, em contrapartida aos de
         pontos flutuantes).
        São interessantes em aplicações comerciais.
        Alguns processadores tinham circuitos específicos para operações com decimais (e notação própria)
        Geralmente representados por strings de dígitos. (4 bits para cada digito do número decimal, o software
         faria a conta de 4 em 4 dígitos).
        Hoje simulados por software (inteiros). (incomum)




                                                   BOOLEANOS


        Aumentam a legibilidade (um dos tipos mais importantes, senão o mais importante. C não possui booleano
         explícito...).
        Geralmente não são endereçáveis.
        Podem ser facilmente representados por inteiros ou descritos em termos de outros tipos.
        Algumas linguagens permitem que o valor de qualquer tipo seja “testado”.

Int terminou = 1

                =0

If (terminou) >>> dessa forma, a declaração fica mais legível




                                                          5
CARACTERES


-A velha dificuldade de padronização da representação.

-Quanto espaço ocupa um caractere?

ASCII -> padronização da associação de caracteres. Ele possui 128 espaços para associações. Com 7 bits.

No Brasil costuma-se usar a padronização para sistema de codificação chamada ISSO-8859-1

Uma tabela completa com todos os símbolos utilizados pelo homem foi criada. Chamada por UNICODE. No momento
de representar um número inteiro temos muitas opções,para um numero natural também, no entanto, o processo de
tabelamento de todos os símbolos gráficos demorou muitos anos, quando começaram a aparecer os primeiros
softwares com UNICODE não haviam muitos símbolos.

Antes haviam tamanhos fixos para as representações de caracteres.

Após algum tempo surgiu um novo padrão mais sofisticado,o UNICODE.Neste, temos milhões de símbolos no
utilizando 64 bits pra cada símbolo. No entanto utilizar 64 bits para cada símbolo é muito. Solução: fazer tamanho
variável.

Vantagem: os símbolos usados por americanos utilizados com poucos bits, e símbolos mais sofisticados utilizam-se
mais bits. Alfabetos que utilizam muitos caracteres ocuparão pouco espaço, e alfabetos que utilizam poucos
caracteres ocuparão o mesmo espaço, visto que os textos serão escritos com menos símbolos.

UTF-8

                                                   PONTEIROS


     Flexibilização
     Representam uma posição de memória:


0        1          2        3             4         5          6         7          8
Representação de espaços na memória.

Nem tudo o que é guardado representa um espaço na memória.

Existe pelo menos uma representação que não significa espaço, é a posição “0” (não usada).

Porque o 0? Porque quase todo computador representa um lugar, convenciona um lugar, para que ele comece a
executar as instruções iniciais, um programa não tem acesso ao começo da memória.

Assim o 0 fica reservado para representar um valor especial. Dependendo da linguagem.

Em Pascal é o “nil”

Em C é o “NULL”

O ponteiro pode apontar um valor ou não.




                                                         6
STRING

 São a forma de representar texto. As strings são junções de caracteres.

 Seqüência de caracteres, cadeia de caracteres, possuem a característica de representar caracteres uns ao lado dos
 outros.

      Podem ser tipos primitivos (tipo que não pode ser acessado por partes) – independentes da forma de
       representação.

 Quando a string é primitiva vem acompanhada de algumas operações:

      Concatenar strings: junção de strings
      Encontrar uma substring – Pedro (outra string com valores ou caracteres da primeira string).


                                           REPRESENTAÇÃO DE STRINGS


        Pascal

 É feita em varias posições na memória, pegando caracteres consecutivos na memória.

 2      0           i         a        b        c          d         e      f         G
Tamanho                                     Caracteres

 Forma de representação que limita o tamanho, há sempre um tamanho máximo. E pode-se sempre estar
 desperdiçando memória.

      Vantagem: a hora que quiser saber quantos caracteres há numa string, estará lá, na parte que cuida do
       controle.
      Normalmente os compiladores usavam 2 bytes no controle.
      Desvantagem: não há como representar string com mais de 255 caracteres.



        C

 Em C também há quantidades variáveis de strings, ao contrario de pascal, não há tamanho padrão. Em C deve-se
 declarar o tamanho. Porém, um espaço razoável na memória será gasto.

 0           i      0        B        C         e         f         G      i         O


 Todos os espaços são usados para guardar informações, menos 1, que será um espaço especial, um sinal para indicar
 o fim da seqüência.

      Vantagens: não há tamanhos máximos para as strings. Desde que haja posições suficientes.
      Desvantagens: necessário contar a quantidade de caracteres.




                                                           7
   ANSI Strings

 2      o             i         /0         a       e       g        h       e         n
Tamanho                        Controle

 Padronização: ao se representar strings, reserva-se uma parte para armazenar o tamanho e outra para indicar o
 controle, o fim da string.

                                                 STRINGS DINÂMICAS
      Seus valores mudam ao decorrer da execução.

 String x:= “alo”;

 Na hora de mudar o valor, desmarca-se a região antiga, reserva-se uma nova região de memória e depois associa a
 variável com a nova posição de memória. Desperdiça-se tempo porém, economiza-se memória.



                                               INTERPOLAÇÃO DE STRINGS
      Inserir números ou variáveis no meio de Strings. Concatenação.

 Writeln (‘o resultado é: ‘, result);

 Printf(“O resultado é: %d’, result);

 Insere a String a partir de outra coisa



                                               CASAMENTO DE PADRÕES
             Expressão regular que define um formato, strings que seguem regras de formação.
             Substitui uma string por uma série de operações separadas.
             Um único comando verifica se a String segue tal expressão.



                                           BIBLIOTECA DE PROGRAMAÇÃO
      Conjunto de partes de programa, pedaços, desenvolvidos previamente e que agora poderá ser usado no seu
       próprio programa.



                                                       ENUMERADOS
      Aumentam a legibilidade
      Repetição de constantes simbólicas.

 Parece com uma string, ou com um identificador, porém não é associado a tais coisas. É usado pelo compilador, de
 modo que uma tabela será construída automaticamente e usada pelo programa. Temos legibilidade sem
 complicação.

 reais          0                                                                 Utilizar 1 nome para
                                                                                  representar coisas distintas.
 copos          1
                                                                                  Rosa, cor, e rosa, flor.



                                                           8
SUBFAIXAS


       Aumentam a legibilidade (tornam os limites explícitos)
       Podem ajudar na detecção de erros;
       Conjunto limitado de outro tipo, tipo que existe uma ordem entre os elementos.



Ex: tipos numéricos: [1,2,3,4,5,6] Alguns vem antes e outros depois.

     Facilidade: não é necessário ficar verificando constantemente se aqueles valores não estão em sequencia.

Em pascal há o índice de subfaixa e é indicado no início de uma declaração de vetor:

Array [1..10] of integer;

Tipo de dados: classificação dos dados nos programas. Os compiladores usam essa classificação para realizar
checagens.

Estrutura de Dados: não há como serem declaradas.




                                                          9
VETORES

     Valores em posições consecutivas

É vetor:
X                    X                 x                x                  x


Não é vetor:
X                                      x                                   x


São posições na memória, há coisas relacionadas antes e depois das posições.
x        x        x        X          ...     ...        15


     Há dificuldade para mudar o tamanho.

Deve se procurar outro lugar na memória em que caibam outros elementos que se deseja

     Acesso em tempo constante.

O tempo que se demora em saber se o 1º ou qualquer outro elemento são iguais:

          Dada uma posição, faz-se uma conta e assim a conta se refere à posição de memória onde se localiza o
           elemento desejado, o tempo da conta é a mesma, igual, constante para todos os elementos.

     Homogêneo

Os elementos devem ser do mesmo tipo. Índices organizados

Os ponteiros guardam as referencias, as “contas” para as obtenções do elementos que estão em determinada
posição. Demora um pouco mais, porém o tempo continua sendo constante para todos os elementos.

-Operador [] ou ()

Dependem da linguagem. A questão da declaração e uso dos operadores dependem da linguagem porque cada
linguagem possui um paradigma próprio.

A linguagem pode querer enfatizar coisas importantes para a mesma:

     - Tipo do índice
     -O valor mínimo do índice
     -A validação do índice

Algumas vezes há a checagem, depende da linguagem, ou pode ser característica do compilador, ou algumas vezes o
compilador não obedece à regra.




                                                       10
ALOCAÇÃO ESTÁTICA OU DINÂMICA
Estática: pré-definida

Dinâmica: definida na hora da compilação. Primeiro guarda os valores e depois se define o tamanho do vetor.



                                      VETORES ASSOCIATIVOS (HASHES)
Em Perl é hash, em Lua é table, em Python é lista.

      São estruturas chave-valor.
      Podem ser usados como vetores, listas ou registros.
      Implementados por arvores ou funções hash.

Nota [“João”]

          Tabela Hash

33                       22                      30                    26


Traduzir para a forma que o hardware consiga trabalhar.

        Função hash: pega-se uma quantidade indeterminada de bytes para determinar, pega-se por partes, faz-se
         um conta misturando as partes de forma que saia sempre um número de tamanho fixo.

Associa qualquer quantidade de informação numa quantidade fixa.

Nota [hash(“João”)]

A conta gera um índice referente ao nome.

                                                      ÁRVORE
Estrutura de dados em que há pedaços diferentes localizados em lugares diferentes na memória.

      Fácil inserir e remover elementos, porém ao acessar torna-se mais lenta.


                                                      REGISTRO
Informação heterogênea para representar muitas coisas. É um tipo de vetor associativo

      Associa diferentes tipos comuns. Aglomerado de informações assim como no vetor, só que diferente deste,
       acumula tipos diferentes.

Aluno
Nome
Nº de matricula
Nota


Data TipoEixo = X|Y|Z|Eixo FloatFloatFloat

Em Sublinhado = são as chamadas “Tags”



                                                        11
TIPO LISTA


É um aglomerado de valores assim como o vetor

São chamados de tipos fundamentais.

     A diferença para o vetor é que a lista é espalhada pela memória, seus itens são encontrados e/ou
      organizados por ponteiros.



                                                TIPO UNIDADE


     Tipo que só pode representar um valor.

Com 1 bit só se representa 2 valores, 0 ou 1.

A unidade pode ser representada com 0 bits, não se precisa de memória para guardar o tipo unidade.

Void > Tipo que não precisa de armazenamento, é tratado de maneira especial pelo compilador.

     Os compiladores também definem tipos.

     Há bibliotecas que já são importadas pelo compilador.

     O tipo pode estar na linguagem, no compilador, na biblioteca ou em alguma parte do programa.




                                                       12
Vinculações

      Nome -> (escopo)
      Tipo
      Armazenamento (endereço) -> “Tempo de vida”, que a variável consegue guardar o valor.
      Valor


Costuma-se pensar na variável como o seu valor. A variável não é a única que está sujeita à vinculação.

    Deve-se entender a variável como algo que se está vinculado com um nome, um tipo, um armazenamento
     (endereço) e valor. Mas não necessariamente com todos. Tais itens podem variar ao longo do
     tempo/execução.


Problema do endereço – ao se declarar uma variável, declara-se um endereço. Se o endereço é sempre o mesmo gera
uma complicação na flexibilidade.



    Vinculação estática - sempre a mesma associação em toda a execução do programa.
    Vinculação dinâmica – Associação da variável com mais coisas na execução do programa. Pode-se mudar
     várias vinculações, o nome, o tipo, o endereço, o valor da variável.


Projeto de linguagem – coisas que acontecem no projeto. Em Pascal, BEGIN está vinculado ao projeto de linguagem.

*Implementação de linguagem, construção do compilador ou implementador da linguagem.

      Tempo de implementação de programa –
      Tempo de compilação – momento da tradução do código fonte em código objeto, as instruções escritas de
       uma forma mais próxima do que o hardware entende.
      Tempo de ligação – tempo em que o compilador (link editor) faz as vinculações. Mais especificamente, com
       endereços de memória, outro exemplo, os comandos importados de bibliotecas. Algum programa ira pegar
       as instruções de outros lugares e inserir no seu programa.
      Tempo de carregamento - após criar o executável em linguagem de maquina, há certas coisas que faltam
       serem resolvidas. A Cópia das instruções do HD para algum lugar na memória ou outro local é chamado de
       tempo de carregamento.
      Tempo de execução – Tempo entre uma execução e outra. A partir do comando inicial de executar.




                                                        13
VINCULAÇÃO DE NOME


    Cada instrução possui um nome referente.
    Há variáveis que não possuem nomes:

Print (a+b)
O a+b serão resolvidos e retornados para alguma outra variável de forma que :
Print (x) onde x é igual a a+b

      Palavras reservadas – possuem sempre o mesmo significado. São vinculadas em tempo de projeto da
       linguagem.

      Palavras - chave – são especiais apenas em algum determinado contexto.

Ambas são coisas diferentes.

Palavras pré-definidas – algumas vezes uma palavra está ligada com uma linguagem por questões de facilidade.
Como por exemplo o “Writeln” de Pascal, que significa escrever algo na saída padrão.



                                                    ALIASES


    Mais de um nome para a mesma coisa.

Ex: passagem de parâmetro por referência.



                                                 NAMESPACES


Erros de nomes comuns, acontecem geralmente com bibliotecas. O que acontece é que o compilador não consegue
distinguir uma coisa de outra.

    Solução: o uso dos Namespaces.
    Auxiliam a distinguir os nomes de cada coisa do programa.

Algo parecido com “nome” e “sobrenome” para uma melhor identificação/controle extra, fazendo com que se haja
muito menos conflitos na linguagem.

    Desvantagem: complicações a mais e uma maior necessidade de atenção.




                                                       14
Escopo

Lugares das instruções em que o nome é válido

Declaração da variável. Um recurso é utilizado para que o mesmo nome possa ser utilizado para outras coisas, então
divide-se o programa em varias partes. Mais internas e mais externas. Está inicialmente ligado às funções, ou
subprogramas.

*Variáveis locais

*Variáveis externas (“globais”)

É importante criar “pedaços” de códigos, cada um com seus nomes, variáveis respectivas, criando uma
independência entre elas e facilitando a programação.

Efeito colateral: quando o valor de uma variável muda a partir de outro pedaço do programa em outro local. São
desvantajosos, pelo fato de que diminuiu a independência das partes do programa.

Para criar mais partes independentes do programa é necessário que se use os recursos da linguagem para se limitar
a múltipla utilização de nomes.

Diretriz do escopo mínimo: projetar os nomes das variáveis do programa para que eles sejam utilizados
especificamente em sua parte especifica.

Comparando C++ com Pascal, ao se declarar um subprograma em pascal é necessário que se tenha uma seção
específica de declaração de variáveis, e estritamente naquele local que serão visíveis em todo o trecho do
subprograma. Já em C++ não se tem uma seção especifica d declaração de variáveis, a declaração acontece em
qualquer lugar do código, mais um recurso da linguagem para reduzir o escopo.

                                               ESCOPO ESTÁTICO
O COMPILADOR SABE QUE qualquer instrução de códigos os nomes que são validos e os que não são. Neste tipo de
escopo as regras são aplicáveis antes da execução.

                                               ESCOPO DINÂMICO
Regras são definidas em função da execução.

                                             VINCULAÇÃO DE TIPOS
Associação das variáveis com os tipos, normalmente é realizada antes da operação, só posso somar se souber o tipo
das variáveis. Ao se restringir as variáveis em tipos pode-se restringir o que o programador irá fazer.
Pode ser explícita ou implícita.
Estática ou dinâmica
Explícita: quando se escreve a vinculação de tipos
Na dinâmica, o compilador é mais simples de ser feito. Na estática, tem-se mais eficiência, pois não se precisa gerar
o código para se controlar o sistema de tipos. Sabendo o tipo o compilador pode fazer otimizações, dependendo da
situação o compilador pode passar mais tempo com o código. Nas linguagens com vinculação dinâmica, é comum
que se possa mudar o tipo.

                                              INFERÊNCA DE TIPOS
     Estática e implícita / Sujeito à redundância



                                                        15
Coerção (implícita) X Conversão (explícita)
Quando se diz que se muda o tipo de uma variável quer se dizer que há uma variável correspondente a um espaço na
memória, escolhe-se outro lugar na memória para fazer uma nova vinculação.

B = (float) a


cria=se uma variável temporária copia-se o valor para B.



                                           COMPATIBILIDADE DE TIPOS


Tipos que podem ser utilizados uns nos lugares do outros como se forem a “mesma coisa”

       Compatibilidade por nome (dois tipos são iguais se eles possuem o mesmo nome).
       Compatibilidade por estrutura (dois tipos são iguais se possuem as mesmas partes internas).
       Herança.



    Type Graus = real;
          Radianos = real;
    Function Seno (x:graus)
    Os tipos acima são compatíveis



    Var vet: array [1..100] of integer;
    Ordena (var v: array [1..100] of integer);
    Os tipos acima não são compatíveis



    Frequentemente tem-se tipos que são espalhados pela memória, normalmente se faz isso com ponteiro. Uma das
    partes do tipo normalmente são ponteiros que apontam para os lugares que possuem as partes do programa.



    Obs.: quando se usa compatibilidade para nome, é frequente que se use comparações globais de tipo.



         O compilador precisa conhecer todos os nomes para determinar as compatibilidades de tipos, se fazemos
          declarações de tipos que só valem em uma parte do código podem ocorrer erros.




                                                           16
Vinculação ao Armazenamento
      Estática - processo simples e gera código eficiente, mas não aproveita muito bem a memória.

Inicialmente era estática, só que à medida que os programas aumentaram, necessita dividir o programa em
programas independentes, uma variável para cada subprograma, não para o programa todo. O ideal seria vincular
na hora da execução respectiva e desvincular na hora que se acaba a execução.

      Stack-dinâmica – simples, é fonte de problemas comuns, é de sistema dinâmico, a vinculação muda ao
       longo da execução, mas segue um controle de pilha, de forma que se empilham endereços ou espaços de
       armazenamento daquelas variáveis, de tal forma que se desempilha economizando memória. É a mais
       comum atualmente.
      Heap-dinâmica explícita – Demorado, é um controle um pouco mais “bagunçado” , mais complicado
       (lento), é muito mais demorado se alocar uma heap-dinâmica explícita do que uma Stack Dinâmica, porém
       consegue-se fazer mais coisas que esta, principalmente em linguagens em que podem se abstrair mais
       coisas.

Em Java utiliza-se o comando “new”.

      Heap-dinâmica implícita – Não se manda fazer o controle. Como exemplo, PHP. Usada em casos em que
       não tem como se prever o que será feito pelo compilador. Ou será uma situação criada automaticamente,
       como variáveis temporárias para se guardar alguma coisa.

“Heap” – Monte, um pouco sem controle, coisas jogadas sem organização.

Tempo de vida de uma variável – inicia-se no momento da vinculação, até o momento em que a vinculação acaba
(desvinculação), independentemente de mudanças na vinculação.

“Garbage Collection” – os programadores frequentemente esquecem-se de declarar que não querem mais uma
variável. Então se torna necessário evitar que o programador faça isto, com um controle mais automático por
meio de algoritmos (contadores em todos os ponteiros). É menos eficiente em termos de tempo e aproveitamento
de memória, porém facilita alocando mais memória do que o necessário é o “melhor sobrar do que faltar” Java é
um exemplo de linguagem que possui Garbage Collection.



                                              Inicialização

Quando uma variável é vinculada a um armazenamento é necessário que seja vinculada a um valor também. Auxilia
a mostrar o que funciona e o que não funciona. Não basta apenas inicializar, é necessário que se inicialize com
alguma coisa. Normalmente inicializa-se com zeros, o hardware normalmente possui circuitos para colocar zeros em
grandes quantidades de bits, tal quantidade significará uma coisa ou outra dependendo dos tipos.

Uma string em C conforme abaixo, seria uma String vazia.

0        0        0      0          0         0         0        0       0       0
Pode-se gastar tempo com 2 inicializações, tanto inicialização do programador quanto do compilador, quando o
compilador faz isso automaticamente tem-se menos eficiência. A inicialização é, realmente, o valor após a
declaração do armazenamento.




                                                       17
Avaliação de Expressões
(A+B)*C

Normalmente tem-se algumas expressões ou símbolos previamente criados.

Alguns são definidos pela matemática, outros são meramente símbolos representados pelo teclado que não são tão,
“especiais”.

Normalmente tem-se parênteses, operadores, e mais alguns operadores que todos juntos forma-se algo chamado
“expressão”.

Para se calcular uma expressão, dar um significado para aquela serie de símbolos é:

    1. Ordem de avaliação: como cada expressão tem uma ordem de processamento, é melhor que se faça um
       único significado para tudo. Portanto haverá associatividade entre alguns operadores. Associatividade à
       direita e à esquerda. Um exemplo de associatividade à esquerda seria (a+b+c). Outro exemplo de
       associatividade à direita seria o comando de atribuição em C/C++.

    2. Definição do compilador: as regras de execução das expressões podem ser previamente determinadas pelo
       compilador ou não, dependendo da linguagem. Em Java é sempre do mesmo jeito, o que prejudica a
       velocidade de execução. E C++ não se tem a garantia de que será compilado e executado sempre do mesmo
       jeito, porém se terá a garantia de que a execução/compilação será mais rápida.



    3. Ordem de avaliação dos operandos: f(a) + f(b) aqui, os operandos são também funções, então o compilador
       terá de calcular cada um separadamente para no final calcular a expressão.



    4. Sobrecarga de Operadores: quando o mesmo nome está associado/vinculado está associado com mais de
       uma operação diferente, é necessário se especificar qual a operação está mais correta. Algumas linguagens
       permitem que o usuário faça a modificação da especificação dos operandos, um “+” pode significar uma
       operação. Quando a linguagem permite isto, quer dizer que a linguagem possui sobrecarga. Na maioria das
       linguagens só se e possível utilizar nomes previamente definidos, outras são mais flexíveis como, por
       exemplo, digitar muitos símbolos e associar a um nome para alguma coisa. A sobrecarga de operadores
       (possibilidade de o programador definir novos usos para os identificadores) é mais comum em linguagens
       mais modernas. Costuma-se dizer que a sobrecarga de operadores é um recurso bom, porque aumenta a
       legibilidade. Outro problema da sobrecarga de operadores é no caso de bibliotecas, em que cada um que cria
       uma biblioteca pode associar um símbolo/operador diferente, reduzindo a padronização e ocasionando
       ambiguidade, a linguagem não sabe mais como distinguir o significado de um operador para o outro.




                                                        18
Conversão de Tipos
    No hardware costuma-se ser mais restrito com tipos. O objetivo da conversão de tipos é criar outra variável com
    outro tipo, mas que irá significar a mesma coisa, outra representação com outro tipo diferente. Caracterizada em
    dois tipos:

    1.) Estreitamento: alguns valores não possuem nada parecido para se colocar num tipo novo.
    2.) Alargamento: existe uma representação aproximada para qualquer valor, para qualquer valor representado
        num tipo ‘a’ tem-se algo parecido num tipo ‘b’. É mais segura, possui uma garantia maior de que irá
        acontecer.

Na necessidade de novos tipos em que o hardware não consegue trabalhar, a linguagem pode oferecer novas
opções, recursos. Há uma serie de conversões em que a linguagem faz automaticamente, outras linguagens serão
necessárias à conversão de tipos da própria linguagem.




                                       Coerção em Expressões
Acontecem implicitamente em expressões de modo misto (os operandos não estão na posição certa, no sentido de
que a operação não existe, e por isso necessita uma conversão de tipos previamente para ser efetuada).




                  Operadores Relacionais e Expressões Booleanas
O processamento entre operando é uma relação, daí designa-se que o quando o resultado de uma operação com os
operadores gera um booleano, chama-se expressão booleana. O operador booleano nem sempre existe, mas mesmo
que não exista, deve-se haver uma referencia ao booleano, e frequentemente tem-se um número inteiro para
representar estes valores, como mais comuns ‘0’ para falso e ‘1’ para verdadeiro.

Tem-se certa dificuldade de se seguir conceitos matemáticos, porque em matemática tem-se “abreviações” dos
operadores “(a>b>c)” no caso da programação, quer-se dizer que (a>b e a>c) o que não existe. No caso da linguagem
“C” faz-se por relação de precedência primeira (a>b) e depois (b>c). Em Java não há conversão de booleano para
algum tipo numérico.



                                    Avaliação em curto circuito
Tem-se uma expressão e outros operadores, mas às vezes pode-se não precisar percorrer toda expressão para
calcular o resultado, caso consiga-se detectar a operação em questão, calcula-se. (possibilidade de que a avaliação
não seja processada por inteiro, faz se o caminho mais curto para se chegar ao resultado) O contrário seria o circuito
longo, em que se varre toda a expressão o que gasta mais tempo. É mais comum em expressões booleanas em que se
exclui uma determinada parte {(a and b) or c} o que pode gerar um efeito colateral, pelo fato de que se deixou fazer
uma parte de uma operação, o estado das coisas é diferente, resultando em algo diverso aquilo pretendido. Algumas
linguagens possibilitam “chavear” o efeito de querer ou não fazer-se uso da avaliação em curto circuito com
comandos específicos, Ada é uma linguagem que possibilita isto.




                                                         19
Operador de atribuição
Fundamental para qualquer linguagem imperativa. Bastante necessário, algumas linguagens possuem um operador
bem simples, como no caso de Pascal {:=} outras linguagens possuem extras a mais em seus operadores.

Chama-se o operando da esquerda de “Left value” e o da direita de “Right value”, e são operandos com
características distintas. Na direita, é Necessário que seja capaz de transformar em um valor, no caso da esquerda é
necessário que ele seja capaz de transformar algo em endereço. Nem sempre é possível atribuir um endereço ao
operando da esquerda.
                            (Left value) {Operador de atribuição da linguagem} (Right value)


                                                 ATRIBUIÇÃO SIMPLES
É a mais comum, assim como Pascal, do tipo “copie um valor de um lado para o outro”

                                                   ALVOS MÚLTIPLOS
Copia um valor para vários lugares, frequentemente as linguagens utilizam uma vírgula para separar as variáveis,
como por exemplo: {a,b=0}

                                                 ALVOS CONDICIONAIS
Atribuição em que algumas vezes se copie para um lado, e outras vezes para o outro.

                                               ATRIBUIÇÃO COMPOSTA
Inc (a,2) é a atribuição em que o valor que se pretende copiar depende um valor prévio. “incremento”, “decremento”,
pode-se associar a este tipo de atribuição a um valor que depende de outro valor prévio.
Em C existem vários operadores de atribuição tais como “+=” “-=” “*=”.
Algumas vezes a linguagem faz uma otimização própria, como no caso de “C” em que a possibilidade de se escrever
a+=2 é mais eficiente do que escrever a=a+2.


                                      OPERADOR UNITÁRIO DE ATRIBUIÇÃO
E a atribuição em que há apenas um elemento. Unitário, como no caso de um incremento {i++} pelos mesmos
motivos da atribuição composta, é mais prático e vantajoso i++ do que i=i+1
C possui dois tipos o pré-incremento (++i) e o pós-incremento (i++) a diferença é que o pré-incremento é o operador
que faz o incremento e depois retorna o valor. O por declara o valor e depois incrementa. Para isso ele cria uma
variável temporária que assume o valor de i e tal variável posteriormente é posta no lugar da expressão.


                                            ATRIBUIÇÃO COMO FUNÇÃO
Algumas vezes a atribuição é uma função e outras vezes, procedimento. Ou seja, algumas vezes retorna valor e outra
não retorna.

A=b=c=0;

(a?b: c=0); “questiona ‘a’ . Se ‘a’ for verdadeira, copia o valor para ‘b’. se for falsa, copia para ‘c’ ”

A atribuição como função, permite simplificar uma serie de códigos. Porém torna o programa menos legível, por
compactar uma serie de códigos e absorver mais informação, em termos de quantidade de código. Quando a
linguagem não exige que dois operando sejam de mesmo tipo chama-se atribuição de forma mista.




                                                             20
Controle de Fluxo
É necessário algo que mantenha a ordem na execução de um programa imperativo.

O hardware possui um sistema de controle em que as instruções são guardadas na memória:

Instrução              Próxima execução
executando             “física”


Desvio incondicional: instrução que dá o endereço da próxima instrução a ser executada. (geralmente aparece como
o comando “goto”)

Desvio condicional: tem o endereço da próxima instrução, mas a próxima instrução só será ela mesma se algo ou
algum evento acontecer previamente.

No entanto, as duas instruções acima possuem um nível de abstração muito baixo, portanto as linguagens precisam
converter tal esquema acima para algo de mais alto nível.



                                          INSTRUÇÕES COMPOSTAS


É o primeiro passo da programação, permite colocar elementos em que a linguagem esperaria um comando.

São feitas de vários comandos, por exemplo, em Pascal:

Begin
         ---
         ---
         ---
End
É o trecho de programa que está entre o Begin e o end.



IF (teste) comando


IF (teste) goto x
         ---
         ---
         x:
Isto não é mais usado em instruções compostas, pois traz mais desvantagens.

Repeat
         ---
         ---
         ---
Until (teste)




                                                         21
INSTRUÇÕES DE SELEÇÃO
As instruções em Linguagens de Programação que definem qual o caminho a ser percorrido chamam-se instruções de
seleção.

Desvio: associado ao hardware

Seleção: associado à Linguagem de Programação

           Unidirecional:

Garante uma única opção de caminho. Testa a condição e mediante resultado executa alguma instrução.

IF (teste) comando
Em sublinhado: expressão booleana.

Em alguns casos especiais de algumas linguagens, temos opções de utilizar números no lugar de instruções para
serem testados. FORTRAN é uma destas linguagens.

           Bidirecional:

Dá duas opções de caminho. Existe em quase toda linguagem e frequentemente aparece como abaixo:

IF teste then comando
         Else comando

Varias linguagens apresentam os seletores unidirecionais como se fossem bidirecionais.



                                           SELETORES ALINHADOS
IF teste then
         IF teste then comando
Else comando

(Gera uma ambiguidade).Algumas linguagens possuem regras que resolvem o problema da ambiguidade acima.

Um seletor não pode ser parte de outro seletor. Em ALGOL, por exemplo, não se pode colocar um IF dentro de outro
IF.

                                                 ENDENTAÇÃO
     Em algumas linguagens os comandos compostos não são marcados por comando em especial. Devido a isto,
         fazem essa classificação e separação por meio da endentação.
IF (teste) then
        -------
        -------
        -------
          Vários comandos à direita do IF. O compilador sabe que é um comando composto. E os comandos
              compostos eliminam a ambiguidade. Python é um tipo de linguagem que faz isto.

Em outras linguagens, existem regras próprias para desambiguação como exemplo em C e Pascal, o “else” é do “if”
mais interno dele. O ponto-e-vírgula tem o significado de separar comandos (;).



                                                        22
Seletores Múltiplos

        Oferecem múltiplos caminhos. Em C é representado pelo comando “switch”, em Pascal é representado
         pelo comando “case”:

Case (expressão) of
        -----
        -----
        -----
End

    É muito mais prático (abstrato) do que seletores unidirecionais. (legibilidade)
    Uma desvantagem é a questão da endentação, que com muitas opções torna o programa menos legível.

Algumas linguagens fornecem a possibilidade de um novo seletor, sem a necessidade de ficar terminando muitos
comandos, é o “elseif” ou “elif” de Python, PHP. Portanto, também são classificados como seletores múltiplos.




                                                    23
Instruções Iterativas

     Iterativo = repetitivo ou INDICA UMA REPETIÇÃO.


                                    LAÇO CONTROLADO POR CONTADOR
For i:=1 to n do comando

Tem-se uma variável especial que controla a repetição (“i”) e um valor final.
Na maioria das linguagens o tipo dessa variável especial é o tipo inteiro.
Outras linguagens permitem escrever intervalos entre os espaços.


                                       LAÇO CONTROLADO POR LÓGICA
Quer repetir, no entanto fazem-se várias verificações para saber se já atingiu o ponto final ou, a cada fim de
repetição faz-se uma verificação para saber se já atingiu o ponto final. O “while” do Pascal é um tipo de laço
controlado por Lógica.

While (teste) do comando
Utiliza a lógica no começo.

Repeat
         ---
         ---
         ---
Until (teste)
Utiliza a lógica no fim, executa e depois utiliza. Não se sabe quantas vezes irá repetir, para isto escreve-se uma
expressão booleana. São mais genéricos que laços controlados por contador.



                                   CONTROLE LOCALIZADO PELO USUÁRIO
O controle não é fixo e nem está na sintaxe do comando. Está em outro comando que o programador põe a seu
favor:

Repeat
         ---
         ---
         ---
         If ~~~~~~~ then resume
         If ~~~~~~~ then break


                              LAÇO CONTROLADO POR ESTRUTURAS DE DADOS
A repetição surgiu livre e associada com o vetor. Então se tinha um índice que iria repetir com um índice controlando.
Hoje em dia há estruturas de dados mais eficientes. O “for” do Java, por exemplo, tanto pode ser controlado por
contador quanto por estruturas de dados:
for(i: coleção)




                                                         24
DESVIO INCONDICIONAL
      Instrução do hardware que indica a próxima instrução a ser executada.
      Em assembly chama-se “JMP”
Varias linguagens de alto nível também possuem essa instrução, em tais linguagens, normalmente chama-se “goto”.
Inicialmente haviam programas mais simples, programados com recursos oferecidos pelo hardware. Com o tempo os
programas foram se sofisticando a as linguagens de programação necessitaram correr atrás desse desenvolvimento.
O hardware sempre soube fazer desvio incondicional, esta forma sempre apareceu nas primeiras linguagens de
programação. No entanto, reflete num sistema de programação que não é muito planejado. Chamado de
“Programação não estruturada”.


                                  PROGRAMAÇÃO NÃO ESTRUTURADA

Programação Não estruturada é quando o programa não possui uma estrutura planejada, uma fase de engenharia
em que se planeja o que irá ser feito.Com o tempo, a necessidade de construir programas maiores aconteceu.Da
programação não estruturada evoluiu-se para a programação estruturada.


                                     PROGRAMAÇÃO ESTRUTURADA
Há uma diretriz fundamental em que se separa o programa em partes (modularização).Pequenas coisas, ou partes,
que fazem coisas simples, com todas juntas criam-se coisas maiores. Juntamente com esse tipo de programação
vieram novos paradigmas.Um exemplo “clássico” de programação estruturada é o Pascal. Com o objetivo de
incentivar determinadas coisas.Em certo tempo, a programação estrutura tornou-se insuficiente, daí apareceu a
programação orientada a objeto.


                                PROGRAMAÇÃO ORIENTADA A OBJETOS
Diferentemente da estruturada, na POO tem-se varias diretrizes de como são as partes independentes, como elas se
comportam separadamente. Um exemplo de linguagem é o SmallTalk.


                                                     GOTO
É uma Instrução de controle de fluxo.
O GOTO é um dos elementos antigos que permanecem depois de muito tempo. Sendo muito fundamental na
programação estruturada, tem-se trechos no programa tratando de trechos diferentes tratando partes diferentes, no
entanto não se tem maneiras de se separar cada uma das partes. Para isto, usa-se o goto. Uma parte do programa
recebe um nome, e a partir disso é possível redirecionar a execução para qualquer parte do programa.
A medida que os recursos foram aumentando, o goto passou a ser considerado um problema.
Uma das diretrizes da programação estruturada é não utilizar o goto. Daí começaram a aparecer linguagens que o
goto não é tão eficiente quanto das linguagens anteriores. Com o desenvolvimento novas linguagens foram
aparecendo e abandoando o goto gradualmente. Um exemplo de linguagem que não possui goto é o Java.
Independentemente da linguagem é uma estrutura que atrapalha a instrução e a legibilidade.


                                             SAÍDAS MÚLTIPLAS
Situação numa instrução iterativa em que se executa no inicio porem tem-se vários pontos de saída, tanto da
condicional, do seletor ou outro.
Dessa forma, quebra-se a diretriz da programação estruturada, tendo em vista que não está se executando cada
bloquinho, cada pedaço do programa, a do seu inicio ao a seu fim.
O “brake” em C é um exemplo de instrução que finaliza um bloco. Em algumas linguagens ele pode finalizar um
seletor. Há outros exemplos, como o “return” o “continue”, “last”, “resume” dependendo da linguagem.




                                                      25
COMANDOS PROTEGIDOS

É outra estrutura de controle de fluxo. Abstrai vários detalhes do programador, no entanto abstraindo, não se terá
mais controle do programa, então se perde o controle sobre o que o programa irá executar. series de instruções que
serão executadas mediantes testes, jogando para o compilador a decisão. Selecionar pedaços do programa de uma
maneira mais geral para garantir a execução ou o teste em questão.

IF teste -> comando
[] teste -> comando
[] teste -> comando
.
.
.
Fi

É Apenas um recurso a mais. A partir de vários testes, dá mais garantias de que não irá executar se não for possível
executar, ou se algo já foi executado previamente.




                                                         26
Revisão
          O que é uma variável externa e o que é uma variável global? Dê um exemplo em uma linguagem.

* Escolher uma linguagem:

       Variável Global ou Externa: Declarada no mesmo bloco que está sendo usada.

       Variável Local: Declarada num outro bloco que também está relacionado com um bloco antecedendo, mas
        que a variável é visível a partir do bloco precedente.

Linguagem Pascal

Procedure P()
Var v: integer;

Begin
         X:=y;          ( x não foi declarado e P(), logo é externa a P() )
         ---
         ---
         V:=x;          (v é interno a P() )
end


          Dê um exemplo de implementação em que variáveis diferentes tem o mesmo nome:




                                                        DICAS
            Cuidado com termos mais específicos, se faz sentido para você, pode não fazer para os outros. Pode estar
             fora do contexto.
            Estar atento a respostas parciais.
            Pôr a teoria em prática é essencial.
            Nos exemplos, escrever em qual linguagem está se designando os fatores.
            Cuidado com respostas ” Universais”.




                                                           27

Mais conteúdo relacionado

Mais procurados

Excel_2007_Nivel1
Excel_2007_Nivel1Excel_2007_Nivel1
Excel_2007_Nivel1trusterjb
 
Apostila bnb2014 cef_informatica_sergio_spolador
Apostila bnb2014 cef_informatica_sergio_spoladorApostila bnb2014 cef_informatica_sergio_spolador
Apostila bnb2014 cef_informatica_sergio_spoladorEliene Meira
 
Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)chfceilandia
 
Hibernate Reference20061120
Hibernate Reference20061120Hibernate Reference20061120
Hibernate Reference20061120daniloasantos
 
Jquery 38book-pt-br
Jquery 38book-pt-brJquery 38book-pt-br
Jquery 38book-pt-brJean Lopes
 
Fundamentos de energia solar fotovoltaica soliens va
Fundamentos de energia solar fotovoltaica   soliens vaFundamentos de energia solar fotovoltaica   soliens va
Fundamentos de energia solar fotovoltaica soliens vaGuilherme Karashima
 
Apostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_huneckeApostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_huneckeEliene Meira
 
Aprenda computação com python 3.0 (1)
Aprenda computação com python 3.0 (1)Aprenda computação com python 3.0 (1)
Aprenda computação com python 3.0 (1)intaum
 
Cientista da computacao usando python
Cientista da computacao usando pythonCientista da computacao usando python
Cientista da computacao usando pythonJean Lopes
 
Apostila adobe-flash-cs5
Apostila adobe-flash-cs5Apostila adobe-flash-cs5
Apostila adobe-flash-cs5aulaemvideo
 
Manual geogebra 3.0
Manual geogebra 3.0Manual geogebra 3.0
Manual geogebra 3.0Franbfk
 

Mais procurados (20)

Excel_2007_Nivel1
Excel_2007_Nivel1Excel_2007_Nivel1
Excel_2007_Nivel1
 
Apostila bnb2014 cef_informatica_sergio_spolador
Apostila bnb2014 cef_informatica_sergio_spoladorApostila bnb2014 cef_informatica_sergio_spolador
Apostila bnb2014 cef_informatica_sergio_spolador
 
Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)Guia do usuário da indexação do family search (setembro de 2010)
Guia do usuário da indexação do family search (setembro de 2010)
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Hibernate Reference20061120
Hibernate Reference20061120Hibernate Reference20061120
Hibernate Reference20061120
 
Moodle
MoodleMoodle
Moodle
 
Jquery 38book-pt-br
Jquery 38book-pt-brJquery 38book-pt-br
Jquery 38book-pt-br
 
Fundamentos de energia solar fotovoltaica soliens va
Fundamentos de energia solar fotovoltaica   soliens vaFundamentos de energia solar fotovoltaica   soliens va
Fundamentos de energia solar fotovoltaica soliens va
 
Apostila tex
Apostila texApostila tex
Apostila tex
 
Apostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_huneckeApostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_hunecke
 
ajuda
ajudaajuda
ajuda
 
Guia track macker
Guia track mackerGuia track macker
Guia track macker
 
Aprenda computação com python 3.0 (1)
Aprenda computação com python 3.0 (1)Aprenda computação com python 3.0 (1)
Aprenda computação com python 3.0 (1)
 
mateus
mateusmateus
mateus
 
Aprenda computaocompython
Aprenda computaocompythonAprenda computaocompython
Aprenda computaocompython
 
Cientista da computacao usando python
Cientista da computacao usando pythonCientista da computacao usando python
Cientista da computacao usando python
 
Material LINUX
Material LINUXMaterial LINUX
Material LINUX
 
Manual word 2009
Manual word 2009Manual word 2009
Manual word 2009
 
Apostila adobe-flash-cs5
Apostila adobe-flash-cs5Apostila adobe-flash-cs5
Apostila adobe-flash-cs5
 
Manual geogebra 3.0
Manual geogebra 3.0Manual geogebra 3.0
Manual geogebra 3.0
 

Semelhante a Resumo de Aulas de Linguagens de Programação I

Python
PythonPython
PythonTiago
 
Apostila excel Avançado.pdf
Apostila excel Avançado.pdfApostila excel Avançado.pdf
Apostila excel Avançado.pdfCatarinnaSobral
 
Mini Curso – Controle e Segurança com Iptables
Mini Curso – Controle e Segurança com IptablesMini Curso – Controle e Segurança com Iptables
Mini Curso – Controle e Segurança com Iptablesedmafer
 
Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)
Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)
Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)Rafael Biriba
 
Ncl e Lua - desenvolvendo aplicações interativas para tv digital
Ncl e Lua - desenvolvendo aplicações interativas para tv digitalNcl e Lua - desenvolvendo aplicações interativas para tv digital
Ncl e Lua - desenvolvendo aplicações interativas para tv digitalRafael Carvalho
 
Apostila ata informatica_julio_alves
Apostila ata informatica_julio_alvesApostila ata informatica_julio_alves
Apostila ata informatica_julio_alvesYara Grasielle
 
Apostila Excel 2000 - Treinamento Empresarial
Apostila Excel 2000 - Treinamento EmpresarialApostila Excel 2000 - Treinamento Empresarial
Apostila Excel 2000 - Treinamento EmpresarialAdriano Lima
 
Manual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo FederalManual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo FederalVincere Comunicação
 
Manual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo FederalManual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo FederalBlog Mídia8!
 
Apostila infbam saquanet
Apostila infbam saquanetApostila infbam saquanet
Apostila infbam saquanetalexandrade2402
 
Apostila completa-html
Apostila completa-htmlApostila completa-html
Apostila completa-htmlKleiton Araujo
 
Caderno didatico pascal
Caderno didatico pascalCaderno didatico pascal
Caderno didatico pascalAlvaro Melo
 
Analise real cattai_uneb
Analise real cattai_unebAnalise real cattai_uneb
Analise real cattai_unebjecyjs
 
Analise real cattai_uneb
Analise real cattai_unebAnalise real cattai_uneb
Analise real cattai_unebSaulo Maggot
 
Analise real
Analise realAnalise real
Analise realDelerre
 

Semelhante a Resumo de Aulas de Linguagens de Programação I (20)

Manual Excel
Manual ExcelManual Excel
Manual Excel
 
Python
PythonPython
Python
 
Grafoes-cap1e2.pdf
Grafoes-cap1e2.pdfGrafoes-cap1e2.pdf
Grafoes-cap1e2.pdf
 
Apostila excel Avançado.pdf
Apostila excel Avançado.pdfApostila excel Avançado.pdf
Apostila excel Avançado.pdf
 
Mini Curso – Controle e Segurança com Iptables
Mini Curso – Controle e Segurança com IptablesMini Curso – Controle e Segurança com Iptables
Mini Curso – Controle e Segurança com Iptables
 
Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)
Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)
Faculdade: Trabalho sobre Seguranca Digital (Versão em PDF)
 
Ncl e Lua - desenvolvendo aplicações interativas para tv digital
Ncl e Lua - desenvolvendo aplicações interativas para tv digitalNcl e Lua - desenvolvendo aplicações interativas para tv digital
Ncl e Lua - desenvolvendo aplicações interativas para tv digital
 
Apostila ata informatica_julio_alves
Apostila ata informatica_julio_alvesApostila ata informatica_julio_alves
Apostila ata informatica_julio_alves
 
Apostila Excel 2000 - Treinamento Empresarial
Apostila Excel 2000 - Treinamento EmpresarialApostila Excel 2000 - Treinamento Empresarial
Apostila Excel 2000 - Treinamento Empresarial
 
Apostilha8
Apostilha8Apostilha8
Apostilha8
 
Manual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo FederalManual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo Federal
 
Manual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo FederalManual de orientação para atuação em redes sociais - Governo Federal
Manual de orientação para atuação em redes sociais - Governo Federal
 
Apostila infbam saquanet
Apostila infbam saquanetApostila infbam saquanet
Apostila infbam saquanet
 
Apostila completa-html
Apostila completa-htmlApostila completa-html
Apostila completa-html
 
Caderno didatico pascal
Caderno didatico pascalCaderno didatico pascal
Caderno didatico pascal
 
Tutorial java
Tutorial javaTutorial java
Tutorial java
 
Apostila Java
Apostila JavaApostila Java
Apostila Java
 
Analise real cattai_uneb
Analise real cattai_unebAnalise real cattai_uneb
Analise real cattai_uneb
 
Analise real cattai_uneb
Analise real cattai_unebAnalise real cattai_uneb
Analise real cattai_uneb
 
Analise real
Analise realAnalise real
Analise real
 

Resumo de Aulas de Linguagens de Programação I

  • 1. Resumo de Aulas Linguagens de Programação I Pedro Victor de Sousa Lima Ciência da Computação
  • 2. Sumário TIPOS DE DADOS .................................................................................................................................................. 4 inteiros .......................................................................................................................................................................... 4 ponto flutuante ............................................................................................................................................................. 4 decimais ........................................................................................................................................................................ 5 booleanos ...................................................................................................................................................................... 5 caracteres...................................................................................................................................................................... 6 ponteiros ....................................................................................................................................................................... 6 STRING ................................................................................................................................................................ 7 representação de strings ............................................................................................................................................... 7 strings dinâmicas .......................................................................................................................................................... 8 interpolação de strings.................................................................................................................................................. 8 casamento de padrões .................................................................................................................................................. 8 biblioteca de programação ........................................................................................................................................... 8 enumerados .................................................................................................................................................................. 8 subfaixas ....................................................................................................................................................................... 9 VETORES ............................................................................................................................................................ 10 alocação estática ou dinâmica.................................................................................................................................... 11 vetores associativos (hashes) ...................................................................................................................................... 11 árvore .......................................................................................................................................................................... 11 registro ........................................................................................................................................................................ 11 tipo lista ...................................................................................................................................................................... 12 tipo unidade ................................................................................................................................................................ 12 VINCULAÇÕES .................................................................................................................................................... 13 vinculação de nome .................................................................................................................................................... 14 aliases.......................................................................................................................................................................... 14 namespaces................................................................................................................................................................. 14 ESCOPO ............................................................................................................................................................. 15 escopo estático............................................................................................................................................................ 15 escopo dinâmico ......................................................................................................................................................... 15 vinculação de tipos ...................................................................................................................................................... 15 inferênca de tipos ........................................................................................................................................................ 15 COERÇÃO (IMPLÍCITA) X CONVERSÃO (EXPLÍCITA) ............................................................................................... 16 compatibilidade de tipos ............................................................................................................................................. 16 VINCULAÇÃO AO ARMAZENAMENTO ................................................................................................................. 17 2
  • 3. INICIALIZAÇÃO ................................................................................................................................................... 17 AVALIAÇÃO DE EXPRESSÕES ............................................................................................................................... 18 CONVERSÃO DE TIPOS ........................................................................................................................................ 19 COERÇÃO EM EXPRESSÕES ................................................................................................................................. 19 OPERADORES RELACIONAIS E EXPRESSÕES BOOLEANAS...................................................................................... 19 AVALIAÇÃO EM CURTO CIRCUITO ....................................................................................................................... 19 OPERADOR DE ATRIBUIÇÃO ............................................................................................................................... 20 atribuição simples ....................................................................................................................................................... 20 alvos múltiplos ............................................................................................................................................................ 20 alvos condicionais ....................................................................................................................................................... 20 atribuição composta ................................................................................................................................................... 20 operador unitário de atribuição .................................................................................................................................. 20 atribuição como função .............................................................................................................................................. 20 CONTROLE DE FLUXO ......................................................................................................................................... 21 instruções compostas .................................................................................................................................................. 21 instruções de seleção .................................................................................................................................................. 22 seletores alinhados ..................................................................................................................................................... 22 endentação ................................................................................................................................................................. 22 seletores múltiplos ...................................................................................................................................................... 23 INSTRUÇÕES ITERATIVAS .................................................................................................................................... 24 laço controlado por contador...................................................................................................................................... 24 laço controlado por lógica .......................................................................................................................................... 24 controle localizado pelo usuário ................................................................................................................................. 24 laço controlado por estruturas de dados .................................................................................................................... 24 DESVIO INCONDICIONAL .................................................................................................................................... 25 programação não estruturada.................................................................................................................................... 25 programação estruturada........................................................................................................................................... 25 programação orientada a objetos .............................................................................................................................. 25 goto ............................................................................................................................................................................. 25 saídas múltiplas .......................................................................................................................................................... 25 comandos protegidos.................................................................................................................................................. 26 REVISÃO ............................................................................................................................................................ 27 DICAS ................................................................................................................................................................ 27 3
  • 4. Tipos de dados  A possibilidade de declarar tipos de dados apareceu no algol68  Estruturas de dados podem ser produzidas a partir de tipos simples (ex. listas a partir de vetores).  Algol68 – formato da linguagem definida no ano de 68  Podem-se usar tipos de dados para criar novas estruturas, novos coisas. INTEIROS  São abstrações bastante diretas da memória  Aparecem em diferentes capacidades  Com ou sem sinal  Representados geralmente na forma de complemento de 2 Podem ser “infinitos.”. A maioria das linguagens tenta oferecer uma garantia de um número mínimo. Inteiros dinâmicos são mais lentos, o hardware faz contas “dígitos por dígitos”, isto é, em partes.  Wrap around: acontece quando o tipo de dados escolhido não consegue suprir as necessidades dele. PONTO FLUTUANTE  Podem possuir precisão simples, dupla ou quádrupla.  Poucos valores conhecidos são muito precisos, as operações fazem a precisão cair.  Objetivo: aproveitar o número limitado de bits para guardar a maior quantidade de dígitos significativos possíveis (mantissa e expoente). Ponto flutuante = float (em C)  Representar um número que não é inteiro é ter uma forma de representação de não ter dígitos de casas decimais de formas fixas, apenas ter números decimais e depois por tais números de forma representativa. Escrevendo a parte significativa separada da magnitude, a parte que irá classificar, diferencia o número pequeno de um número grande. + 0.23 * 10² Bits separados, um bit indica sinal, outro bit a mantissa e o outro magnitude. 4
  • 5. A verificação de equivalência entre dois valores de tipo ponto flutuante é altamente imprevisível. Exemplo: Int inteiro = 16777217 Float real = inteiro; If (real == inteiro) Cout << “os valores são iguais. n”; Else Cout << “valores são diferentes!n”; DECIMAIS  Possuem um número fixo de casas decimais (chamados também de ponto fixo, em contrapartida aos de pontos flutuantes).  São interessantes em aplicações comerciais.  Alguns processadores tinham circuitos específicos para operações com decimais (e notação própria)  Geralmente representados por strings de dígitos. (4 bits para cada digito do número decimal, o software faria a conta de 4 em 4 dígitos).  Hoje simulados por software (inteiros). (incomum) BOOLEANOS  Aumentam a legibilidade (um dos tipos mais importantes, senão o mais importante. C não possui booleano explícito...).  Geralmente não são endereçáveis.  Podem ser facilmente representados por inteiros ou descritos em termos de outros tipos.  Algumas linguagens permitem que o valor de qualquer tipo seja “testado”. Int terminou = 1 =0 If (terminou) >>> dessa forma, a declaração fica mais legível 5
  • 6. CARACTERES -A velha dificuldade de padronização da representação. -Quanto espaço ocupa um caractere? ASCII -> padronização da associação de caracteres. Ele possui 128 espaços para associações. Com 7 bits. No Brasil costuma-se usar a padronização para sistema de codificação chamada ISSO-8859-1 Uma tabela completa com todos os símbolos utilizados pelo homem foi criada. Chamada por UNICODE. No momento de representar um número inteiro temos muitas opções,para um numero natural também, no entanto, o processo de tabelamento de todos os símbolos gráficos demorou muitos anos, quando começaram a aparecer os primeiros softwares com UNICODE não haviam muitos símbolos. Antes haviam tamanhos fixos para as representações de caracteres. Após algum tempo surgiu um novo padrão mais sofisticado,o UNICODE.Neste, temos milhões de símbolos no utilizando 64 bits pra cada símbolo. No entanto utilizar 64 bits para cada símbolo é muito. Solução: fazer tamanho variável. Vantagem: os símbolos usados por americanos utilizados com poucos bits, e símbolos mais sofisticados utilizam-se mais bits. Alfabetos que utilizam muitos caracteres ocuparão pouco espaço, e alfabetos que utilizam poucos caracteres ocuparão o mesmo espaço, visto que os textos serão escritos com menos símbolos. UTF-8 PONTEIROS  Flexibilização  Representam uma posição de memória: 0 1 2 3 4 5 6 7 8 Representação de espaços na memória. Nem tudo o que é guardado representa um espaço na memória. Existe pelo menos uma representação que não significa espaço, é a posição “0” (não usada). Porque o 0? Porque quase todo computador representa um lugar, convenciona um lugar, para que ele comece a executar as instruções iniciais, um programa não tem acesso ao começo da memória. Assim o 0 fica reservado para representar um valor especial. Dependendo da linguagem. Em Pascal é o “nil” Em C é o “NULL” O ponteiro pode apontar um valor ou não. 6
  • 7. STRING São a forma de representar texto. As strings são junções de caracteres. Seqüência de caracteres, cadeia de caracteres, possuem a característica de representar caracteres uns ao lado dos outros.  Podem ser tipos primitivos (tipo que não pode ser acessado por partes) – independentes da forma de representação. Quando a string é primitiva vem acompanhada de algumas operações:  Concatenar strings: junção de strings  Encontrar uma substring – Pedro (outra string com valores ou caracteres da primeira string). REPRESENTAÇÃO DE STRINGS  Pascal É feita em varias posições na memória, pegando caracteres consecutivos na memória. 2 0 i a b c d e f G Tamanho Caracteres Forma de representação que limita o tamanho, há sempre um tamanho máximo. E pode-se sempre estar desperdiçando memória.  Vantagem: a hora que quiser saber quantos caracteres há numa string, estará lá, na parte que cuida do controle.  Normalmente os compiladores usavam 2 bytes no controle.  Desvantagem: não há como representar string com mais de 255 caracteres.  C Em C também há quantidades variáveis de strings, ao contrario de pascal, não há tamanho padrão. Em C deve-se declarar o tamanho. Porém, um espaço razoável na memória será gasto. 0 i 0 B C e f G i O Todos os espaços são usados para guardar informações, menos 1, que será um espaço especial, um sinal para indicar o fim da seqüência.  Vantagens: não há tamanhos máximos para as strings. Desde que haja posições suficientes.  Desvantagens: necessário contar a quantidade de caracteres. 7
  • 8. ANSI Strings 2 o i /0 a e g h e n Tamanho Controle Padronização: ao se representar strings, reserva-se uma parte para armazenar o tamanho e outra para indicar o controle, o fim da string. STRINGS DINÂMICAS  Seus valores mudam ao decorrer da execução. String x:= “alo”; Na hora de mudar o valor, desmarca-se a região antiga, reserva-se uma nova região de memória e depois associa a variável com a nova posição de memória. Desperdiça-se tempo porém, economiza-se memória. INTERPOLAÇÃO DE STRINGS  Inserir números ou variáveis no meio de Strings. Concatenação. Writeln (‘o resultado é: ‘, result); Printf(“O resultado é: %d’, result); Insere a String a partir de outra coisa CASAMENTO DE PADRÕES  Expressão regular que define um formato, strings que seguem regras de formação.  Substitui uma string por uma série de operações separadas.  Um único comando verifica se a String segue tal expressão. BIBLIOTECA DE PROGRAMAÇÃO  Conjunto de partes de programa, pedaços, desenvolvidos previamente e que agora poderá ser usado no seu próprio programa. ENUMERADOS  Aumentam a legibilidade  Repetição de constantes simbólicas. Parece com uma string, ou com um identificador, porém não é associado a tais coisas. É usado pelo compilador, de modo que uma tabela será construída automaticamente e usada pelo programa. Temos legibilidade sem complicação. reais 0 Utilizar 1 nome para representar coisas distintas. copos 1 Rosa, cor, e rosa, flor. 8
  • 9. SUBFAIXAS  Aumentam a legibilidade (tornam os limites explícitos)  Podem ajudar na detecção de erros;  Conjunto limitado de outro tipo, tipo que existe uma ordem entre os elementos. Ex: tipos numéricos: [1,2,3,4,5,6] Alguns vem antes e outros depois.  Facilidade: não é necessário ficar verificando constantemente se aqueles valores não estão em sequencia. Em pascal há o índice de subfaixa e é indicado no início de uma declaração de vetor: Array [1..10] of integer; Tipo de dados: classificação dos dados nos programas. Os compiladores usam essa classificação para realizar checagens. Estrutura de Dados: não há como serem declaradas. 9
  • 10. VETORES  Valores em posições consecutivas É vetor: X X x x x Não é vetor: X x x São posições na memória, há coisas relacionadas antes e depois das posições. x x x X ... ... 15  Há dificuldade para mudar o tamanho. Deve se procurar outro lugar na memória em que caibam outros elementos que se deseja  Acesso em tempo constante. O tempo que se demora em saber se o 1º ou qualquer outro elemento são iguais:  Dada uma posição, faz-se uma conta e assim a conta se refere à posição de memória onde se localiza o elemento desejado, o tempo da conta é a mesma, igual, constante para todos os elementos.  Homogêneo Os elementos devem ser do mesmo tipo. Índices organizados Os ponteiros guardam as referencias, as “contas” para as obtenções do elementos que estão em determinada posição. Demora um pouco mais, porém o tempo continua sendo constante para todos os elementos. -Operador [] ou () Dependem da linguagem. A questão da declaração e uso dos operadores dependem da linguagem porque cada linguagem possui um paradigma próprio. A linguagem pode querer enfatizar coisas importantes para a mesma:  - Tipo do índice  -O valor mínimo do índice  -A validação do índice Algumas vezes há a checagem, depende da linguagem, ou pode ser característica do compilador, ou algumas vezes o compilador não obedece à regra. 10
  • 11. ALOCAÇÃO ESTÁTICA OU DINÂMICA Estática: pré-definida Dinâmica: definida na hora da compilação. Primeiro guarda os valores e depois se define o tamanho do vetor. VETORES ASSOCIATIVOS (HASHES) Em Perl é hash, em Lua é table, em Python é lista.  São estruturas chave-valor.  Podem ser usados como vetores, listas ou registros.  Implementados por arvores ou funções hash. Nota [“João”]  Tabela Hash 33 22 30 26 Traduzir para a forma que o hardware consiga trabalhar.  Função hash: pega-se uma quantidade indeterminada de bytes para determinar, pega-se por partes, faz-se um conta misturando as partes de forma que saia sempre um número de tamanho fixo. Associa qualquer quantidade de informação numa quantidade fixa. Nota [hash(“João”)] A conta gera um índice referente ao nome. ÁRVORE Estrutura de dados em que há pedaços diferentes localizados em lugares diferentes na memória.  Fácil inserir e remover elementos, porém ao acessar torna-se mais lenta. REGISTRO Informação heterogênea para representar muitas coisas. É um tipo de vetor associativo  Associa diferentes tipos comuns. Aglomerado de informações assim como no vetor, só que diferente deste, acumula tipos diferentes. Aluno Nome Nº de matricula Nota Data TipoEixo = X|Y|Z|Eixo FloatFloatFloat Em Sublinhado = são as chamadas “Tags” 11
  • 12. TIPO LISTA É um aglomerado de valores assim como o vetor São chamados de tipos fundamentais.  A diferença para o vetor é que a lista é espalhada pela memória, seus itens são encontrados e/ou organizados por ponteiros. TIPO UNIDADE  Tipo que só pode representar um valor. Com 1 bit só se representa 2 valores, 0 ou 1. A unidade pode ser representada com 0 bits, não se precisa de memória para guardar o tipo unidade. Void > Tipo que não precisa de armazenamento, é tratado de maneira especial pelo compilador.  Os compiladores também definem tipos.  Há bibliotecas que já são importadas pelo compilador.  O tipo pode estar na linguagem, no compilador, na biblioteca ou em alguma parte do programa. 12
  • 13. Vinculações  Nome -> (escopo)  Tipo  Armazenamento (endereço) -> “Tempo de vida”, que a variável consegue guardar o valor.  Valor Costuma-se pensar na variável como o seu valor. A variável não é a única que está sujeita à vinculação.  Deve-se entender a variável como algo que se está vinculado com um nome, um tipo, um armazenamento (endereço) e valor. Mas não necessariamente com todos. Tais itens podem variar ao longo do tempo/execução. Problema do endereço – ao se declarar uma variável, declara-se um endereço. Se o endereço é sempre o mesmo gera uma complicação na flexibilidade.  Vinculação estática - sempre a mesma associação em toda a execução do programa.  Vinculação dinâmica – Associação da variável com mais coisas na execução do programa. Pode-se mudar várias vinculações, o nome, o tipo, o endereço, o valor da variável. Projeto de linguagem – coisas que acontecem no projeto. Em Pascal, BEGIN está vinculado ao projeto de linguagem. *Implementação de linguagem, construção do compilador ou implementador da linguagem.  Tempo de implementação de programa –  Tempo de compilação – momento da tradução do código fonte em código objeto, as instruções escritas de uma forma mais próxima do que o hardware entende.  Tempo de ligação – tempo em que o compilador (link editor) faz as vinculações. Mais especificamente, com endereços de memória, outro exemplo, os comandos importados de bibliotecas. Algum programa ira pegar as instruções de outros lugares e inserir no seu programa.  Tempo de carregamento - após criar o executável em linguagem de maquina, há certas coisas que faltam serem resolvidas. A Cópia das instruções do HD para algum lugar na memória ou outro local é chamado de tempo de carregamento.  Tempo de execução – Tempo entre uma execução e outra. A partir do comando inicial de executar. 13
  • 14. VINCULAÇÃO DE NOME  Cada instrução possui um nome referente.  Há variáveis que não possuem nomes: Print (a+b) O a+b serão resolvidos e retornados para alguma outra variável de forma que : Print (x) onde x é igual a a+b  Palavras reservadas – possuem sempre o mesmo significado. São vinculadas em tempo de projeto da linguagem.  Palavras - chave – são especiais apenas em algum determinado contexto. Ambas são coisas diferentes. Palavras pré-definidas – algumas vezes uma palavra está ligada com uma linguagem por questões de facilidade. Como por exemplo o “Writeln” de Pascal, que significa escrever algo na saída padrão. ALIASES  Mais de um nome para a mesma coisa. Ex: passagem de parâmetro por referência. NAMESPACES Erros de nomes comuns, acontecem geralmente com bibliotecas. O que acontece é que o compilador não consegue distinguir uma coisa de outra.  Solução: o uso dos Namespaces.  Auxiliam a distinguir os nomes de cada coisa do programa. Algo parecido com “nome” e “sobrenome” para uma melhor identificação/controle extra, fazendo com que se haja muito menos conflitos na linguagem.  Desvantagem: complicações a mais e uma maior necessidade de atenção. 14
  • 15. Escopo Lugares das instruções em que o nome é válido Declaração da variável. Um recurso é utilizado para que o mesmo nome possa ser utilizado para outras coisas, então divide-se o programa em varias partes. Mais internas e mais externas. Está inicialmente ligado às funções, ou subprogramas. *Variáveis locais *Variáveis externas (“globais”) É importante criar “pedaços” de códigos, cada um com seus nomes, variáveis respectivas, criando uma independência entre elas e facilitando a programação. Efeito colateral: quando o valor de uma variável muda a partir de outro pedaço do programa em outro local. São desvantajosos, pelo fato de que diminuiu a independência das partes do programa. Para criar mais partes independentes do programa é necessário que se use os recursos da linguagem para se limitar a múltipla utilização de nomes. Diretriz do escopo mínimo: projetar os nomes das variáveis do programa para que eles sejam utilizados especificamente em sua parte especifica. Comparando C++ com Pascal, ao se declarar um subprograma em pascal é necessário que se tenha uma seção específica de declaração de variáveis, e estritamente naquele local que serão visíveis em todo o trecho do subprograma. Já em C++ não se tem uma seção especifica d declaração de variáveis, a declaração acontece em qualquer lugar do código, mais um recurso da linguagem para reduzir o escopo. ESCOPO ESTÁTICO O COMPILADOR SABE QUE qualquer instrução de códigos os nomes que são validos e os que não são. Neste tipo de escopo as regras são aplicáveis antes da execução. ESCOPO DINÂMICO Regras são definidas em função da execução. VINCULAÇÃO DE TIPOS Associação das variáveis com os tipos, normalmente é realizada antes da operação, só posso somar se souber o tipo das variáveis. Ao se restringir as variáveis em tipos pode-se restringir o que o programador irá fazer. Pode ser explícita ou implícita. Estática ou dinâmica Explícita: quando se escreve a vinculação de tipos Na dinâmica, o compilador é mais simples de ser feito. Na estática, tem-se mais eficiência, pois não se precisa gerar o código para se controlar o sistema de tipos. Sabendo o tipo o compilador pode fazer otimizações, dependendo da situação o compilador pode passar mais tempo com o código. Nas linguagens com vinculação dinâmica, é comum que se possa mudar o tipo. INFERÊNCA DE TIPOS  Estática e implícita / Sujeito à redundância 15
  • 16. Coerção (implícita) X Conversão (explícita) Quando se diz que se muda o tipo de uma variável quer se dizer que há uma variável correspondente a um espaço na memória, escolhe-se outro lugar na memória para fazer uma nova vinculação. B = (float) a cria=se uma variável temporária copia-se o valor para B. COMPATIBILIDADE DE TIPOS Tipos que podem ser utilizados uns nos lugares do outros como se forem a “mesma coisa”  Compatibilidade por nome (dois tipos são iguais se eles possuem o mesmo nome).  Compatibilidade por estrutura (dois tipos são iguais se possuem as mesmas partes internas).  Herança. Type Graus = real; Radianos = real; Function Seno (x:graus) Os tipos acima são compatíveis Var vet: array [1..100] of integer; Ordena (var v: array [1..100] of integer); Os tipos acima não são compatíveis Frequentemente tem-se tipos que são espalhados pela memória, normalmente se faz isso com ponteiro. Uma das partes do tipo normalmente são ponteiros que apontam para os lugares que possuem as partes do programa. Obs.: quando se usa compatibilidade para nome, é frequente que se use comparações globais de tipo.  O compilador precisa conhecer todos os nomes para determinar as compatibilidades de tipos, se fazemos declarações de tipos que só valem em uma parte do código podem ocorrer erros. 16
  • 17. Vinculação ao Armazenamento  Estática - processo simples e gera código eficiente, mas não aproveita muito bem a memória. Inicialmente era estática, só que à medida que os programas aumentaram, necessita dividir o programa em programas independentes, uma variável para cada subprograma, não para o programa todo. O ideal seria vincular na hora da execução respectiva e desvincular na hora que se acaba a execução.  Stack-dinâmica – simples, é fonte de problemas comuns, é de sistema dinâmico, a vinculação muda ao longo da execução, mas segue um controle de pilha, de forma que se empilham endereços ou espaços de armazenamento daquelas variáveis, de tal forma que se desempilha economizando memória. É a mais comum atualmente.  Heap-dinâmica explícita – Demorado, é um controle um pouco mais “bagunçado” , mais complicado (lento), é muito mais demorado se alocar uma heap-dinâmica explícita do que uma Stack Dinâmica, porém consegue-se fazer mais coisas que esta, principalmente em linguagens em que podem se abstrair mais coisas. Em Java utiliza-se o comando “new”.  Heap-dinâmica implícita – Não se manda fazer o controle. Como exemplo, PHP. Usada em casos em que não tem como se prever o que será feito pelo compilador. Ou será uma situação criada automaticamente, como variáveis temporárias para se guardar alguma coisa. “Heap” – Monte, um pouco sem controle, coisas jogadas sem organização. Tempo de vida de uma variável – inicia-se no momento da vinculação, até o momento em que a vinculação acaba (desvinculação), independentemente de mudanças na vinculação. “Garbage Collection” – os programadores frequentemente esquecem-se de declarar que não querem mais uma variável. Então se torna necessário evitar que o programador faça isto, com um controle mais automático por meio de algoritmos (contadores em todos os ponteiros). É menos eficiente em termos de tempo e aproveitamento de memória, porém facilita alocando mais memória do que o necessário é o “melhor sobrar do que faltar” Java é um exemplo de linguagem que possui Garbage Collection. Inicialização Quando uma variável é vinculada a um armazenamento é necessário que seja vinculada a um valor também. Auxilia a mostrar o que funciona e o que não funciona. Não basta apenas inicializar, é necessário que se inicialize com alguma coisa. Normalmente inicializa-se com zeros, o hardware normalmente possui circuitos para colocar zeros em grandes quantidades de bits, tal quantidade significará uma coisa ou outra dependendo dos tipos. Uma string em C conforme abaixo, seria uma String vazia. 0 0 0 0 0 0 0 0 0 0 Pode-se gastar tempo com 2 inicializações, tanto inicialização do programador quanto do compilador, quando o compilador faz isso automaticamente tem-se menos eficiência. A inicialização é, realmente, o valor após a declaração do armazenamento. 17
  • 18. Avaliação de Expressões (A+B)*C Normalmente tem-se algumas expressões ou símbolos previamente criados. Alguns são definidos pela matemática, outros são meramente símbolos representados pelo teclado que não são tão, “especiais”. Normalmente tem-se parênteses, operadores, e mais alguns operadores que todos juntos forma-se algo chamado “expressão”. Para se calcular uma expressão, dar um significado para aquela serie de símbolos é: 1. Ordem de avaliação: como cada expressão tem uma ordem de processamento, é melhor que se faça um único significado para tudo. Portanto haverá associatividade entre alguns operadores. Associatividade à direita e à esquerda. Um exemplo de associatividade à esquerda seria (a+b+c). Outro exemplo de associatividade à direita seria o comando de atribuição em C/C++. 2. Definição do compilador: as regras de execução das expressões podem ser previamente determinadas pelo compilador ou não, dependendo da linguagem. Em Java é sempre do mesmo jeito, o que prejudica a velocidade de execução. E C++ não se tem a garantia de que será compilado e executado sempre do mesmo jeito, porém se terá a garantia de que a execução/compilação será mais rápida. 3. Ordem de avaliação dos operandos: f(a) + f(b) aqui, os operandos são também funções, então o compilador terá de calcular cada um separadamente para no final calcular a expressão. 4. Sobrecarga de Operadores: quando o mesmo nome está associado/vinculado está associado com mais de uma operação diferente, é necessário se especificar qual a operação está mais correta. Algumas linguagens permitem que o usuário faça a modificação da especificação dos operandos, um “+” pode significar uma operação. Quando a linguagem permite isto, quer dizer que a linguagem possui sobrecarga. Na maioria das linguagens só se e possível utilizar nomes previamente definidos, outras são mais flexíveis como, por exemplo, digitar muitos símbolos e associar a um nome para alguma coisa. A sobrecarga de operadores (possibilidade de o programador definir novos usos para os identificadores) é mais comum em linguagens mais modernas. Costuma-se dizer que a sobrecarga de operadores é um recurso bom, porque aumenta a legibilidade. Outro problema da sobrecarga de operadores é no caso de bibliotecas, em que cada um que cria uma biblioteca pode associar um símbolo/operador diferente, reduzindo a padronização e ocasionando ambiguidade, a linguagem não sabe mais como distinguir o significado de um operador para o outro. 18
  • 19. Conversão de Tipos No hardware costuma-se ser mais restrito com tipos. O objetivo da conversão de tipos é criar outra variável com outro tipo, mas que irá significar a mesma coisa, outra representação com outro tipo diferente. Caracterizada em dois tipos: 1.) Estreitamento: alguns valores não possuem nada parecido para se colocar num tipo novo. 2.) Alargamento: existe uma representação aproximada para qualquer valor, para qualquer valor representado num tipo ‘a’ tem-se algo parecido num tipo ‘b’. É mais segura, possui uma garantia maior de que irá acontecer. Na necessidade de novos tipos em que o hardware não consegue trabalhar, a linguagem pode oferecer novas opções, recursos. Há uma serie de conversões em que a linguagem faz automaticamente, outras linguagens serão necessárias à conversão de tipos da própria linguagem. Coerção em Expressões Acontecem implicitamente em expressões de modo misto (os operandos não estão na posição certa, no sentido de que a operação não existe, e por isso necessita uma conversão de tipos previamente para ser efetuada). Operadores Relacionais e Expressões Booleanas O processamento entre operando é uma relação, daí designa-se que o quando o resultado de uma operação com os operadores gera um booleano, chama-se expressão booleana. O operador booleano nem sempre existe, mas mesmo que não exista, deve-se haver uma referencia ao booleano, e frequentemente tem-se um número inteiro para representar estes valores, como mais comuns ‘0’ para falso e ‘1’ para verdadeiro. Tem-se certa dificuldade de se seguir conceitos matemáticos, porque em matemática tem-se “abreviações” dos operadores “(a>b>c)” no caso da programação, quer-se dizer que (a>b e a>c) o que não existe. No caso da linguagem “C” faz-se por relação de precedência primeira (a>b) e depois (b>c). Em Java não há conversão de booleano para algum tipo numérico. Avaliação em curto circuito Tem-se uma expressão e outros operadores, mas às vezes pode-se não precisar percorrer toda expressão para calcular o resultado, caso consiga-se detectar a operação em questão, calcula-se. (possibilidade de que a avaliação não seja processada por inteiro, faz se o caminho mais curto para se chegar ao resultado) O contrário seria o circuito longo, em que se varre toda a expressão o que gasta mais tempo. É mais comum em expressões booleanas em que se exclui uma determinada parte {(a and b) or c} o que pode gerar um efeito colateral, pelo fato de que se deixou fazer uma parte de uma operação, o estado das coisas é diferente, resultando em algo diverso aquilo pretendido. Algumas linguagens possibilitam “chavear” o efeito de querer ou não fazer-se uso da avaliação em curto circuito com comandos específicos, Ada é uma linguagem que possibilita isto. 19
  • 20. Operador de atribuição Fundamental para qualquer linguagem imperativa. Bastante necessário, algumas linguagens possuem um operador bem simples, como no caso de Pascal {:=} outras linguagens possuem extras a mais em seus operadores. Chama-se o operando da esquerda de “Left value” e o da direita de “Right value”, e são operandos com características distintas. Na direita, é Necessário que seja capaz de transformar em um valor, no caso da esquerda é necessário que ele seja capaz de transformar algo em endereço. Nem sempre é possível atribuir um endereço ao operando da esquerda. (Left value) {Operador de atribuição da linguagem} (Right value) ATRIBUIÇÃO SIMPLES É a mais comum, assim como Pascal, do tipo “copie um valor de um lado para o outro” ALVOS MÚLTIPLOS Copia um valor para vários lugares, frequentemente as linguagens utilizam uma vírgula para separar as variáveis, como por exemplo: {a,b=0} ALVOS CONDICIONAIS Atribuição em que algumas vezes se copie para um lado, e outras vezes para o outro. ATRIBUIÇÃO COMPOSTA Inc (a,2) é a atribuição em que o valor que se pretende copiar depende um valor prévio. “incremento”, “decremento”, pode-se associar a este tipo de atribuição a um valor que depende de outro valor prévio. Em C existem vários operadores de atribuição tais como “+=” “-=” “*=”. Algumas vezes a linguagem faz uma otimização própria, como no caso de “C” em que a possibilidade de se escrever a+=2 é mais eficiente do que escrever a=a+2. OPERADOR UNITÁRIO DE ATRIBUIÇÃO E a atribuição em que há apenas um elemento. Unitário, como no caso de um incremento {i++} pelos mesmos motivos da atribuição composta, é mais prático e vantajoso i++ do que i=i+1 C possui dois tipos o pré-incremento (++i) e o pós-incremento (i++) a diferença é que o pré-incremento é o operador que faz o incremento e depois retorna o valor. O por declara o valor e depois incrementa. Para isso ele cria uma variável temporária que assume o valor de i e tal variável posteriormente é posta no lugar da expressão. ATRIBUIÇÃO COMO FUNÇÃO Algumas vezes a atribuição é uma função e outras vezes, procedimento. Ou seja, algumas vezes retorna valor e outra não retorna. A=b=c=0; (a?b: c=0); “questiona ‘a’ . Se ‘a’ for verdadeira, copia o valor para ‘b’. se for falsa, copia para ‘c’ ” A atribuição como função, permite simplificar uma serie de códigos. Porém torna o programa menos legível, por compactar uma serie de códigos e absorver mais informação, em termos de quantidade de código. Quando a linguagem não exige que dois operando sejam de mesmo tipo chama-se atribuição de forma mista. 20
  • 21. Controle de Fluxo É necessário algo que mantenha a ordem na execução de um programa imperativo. O hardware possui um sistema de controle em que as instruções são guardadas na memória: Instrução Próxima execução executando “física” Desvio incondicional: instrução que dá o endereço da próxima instrução a ser executada. (geralmente aparece como o comando “goto”) Desvio condicional: tem o endereço da próxima instrução, mas a próxima instrução só será ela mesma se algo ou algum evento acontecer previamente. No entanto, as duas instruções acima possuem um nível de abstração muito baixo, portanto as linguagens precisam converter tal esquema acima para algo de mais alto nível. INSTRUÇÕES COMPOSTAS É o primeiro passo da programação, permite colocar elementos em que a linguagem esperaria um comando. São feitas de vários comandos, por exemplo, em Pascal: Begin --- --- --- End É o trecho de programa que está entre o Begin e o end. IF (teste) comando IF (teste) goto x --- --- x: Isto não é mais usado em instruções compostas, pois traz mais desvantagens. Repeat --- --- --- Until (teste) 21
  • 22. INSTRUÇÕES DE SELEÇÃO As instruções em Linguagens de Programação que definem qual o caminho a ser percorrido chamam-se instruções de seleção. Desvio: associado ao hardware Seleção: associado à Linguagem de Programação  Unidirecional: Garante uma única opção de caminho. Testa a condição e mediante resultado executa alguma instrução. IF (teste) comando Em sublinhado: expressão booleana. Em alguns casos especiais de algumas linguagens, temos opções de utilizar números no lugar de instruções para serem testados. FORTRAN é uma destas linguagens.  Bidirecional: Dá duas opções de caminho. Existe em quase toda linguagem e frequentemente aparece como abaixo: IF teste then comando Else comando Varias linguagens apresentam os seletores unidirecionais como se fossem bidirecionais. SELETORES ALINHADOS IF teste then IF teste then comando Else comando (Gera uma ambiguidade).Algumas linguagens possuem regras que resolvem o problema da ambiguidade acima. Um seletor não pode ser parte de outro seletor. Em ALGOL, por exemplo, não se pode colocar um IF dentro de outro IF. ENDENTAÇÃO  Em algumas linguagens os comandos compostos não são marcados por comando em especial. Devido a isto, fazem essa classificação e separação por meio da endentação. IF (teste) then ------- ------- -------  Vários comandos à direita do IF. O compilador sabe que é um comando composto. E os comandos compostos eliminam a ambiguidade. Python é um tipo de linguagem que faz isto. Em outras linguagens, existem regras próprias para desambiguação como exemplo em C e Pascal, o “else” é do “if” mais interno dele. O ponto-e-vírgula tem o significado de separar comandos (;). 22
  • 23. Seletores Múltiplos  Oferecem múltiplos caminhos. Em C é representado pelo comando “switch”, em Pascal é representado pelo comando “case”: Case (expressão) of ----- ----- ----- End  É muito mais prático (abstrato) do que seletores unidirecionais. (legibilidade)  Uma desvantagem é a questão da endentação, que com muitas opções torna o programa menos legível. Algumas linguagens fornecem a possibilidade de um novo seletor, sem a necessidade de ficar terminando muitos comandos, é o “elseif” ou “elif” de Python, PHP. Portanto, também são classificados como seletores múltiplos. 23
  • 24. Instruções Iterativas  Iterativo = repetitivo ou INDICA UMA REPETIÇÃO. LAÇO CONTROLADO POR CONTADOR For i:=1 to n do comando Tem-se uma variável especial que controla a repetição (“i”) e um valor final. Na maioria das linguagens o tipo dessa variável especial é o tipo inteiro. Outras linguagens permitem escrever intervalos entre os espaços. LAÇO CONTROLADO POR LÓGICA Quer repetir, no entanto fazem-se várias verificações para saber se já atingiu o ponto final ou, a cada fim de repetição faz-se uma verificação para saber se já atingiu o ponto final. O “while” do Pascal é um tipo de laço controlado por Lógica. While (teste) do comando Utiliza a lógica no começo. Repeat --- --- --- Until (teste) Utiliza a lógica no fim, executa e depois utiliza. Não se sabe quantas vezes irá repetir, para isto escreve-se uma expressão booleana. São mais genéricos que laços controlados por contador. CONTROLE LOCALIZADO PELO USUÁRIO O controle não é fixo e nem está na sintaxe do comando. Está em outro comando que o programador põe a seu favor: Repeat --- --- --- If ~~~~~~~ then resume If ~~~~~~~ then break LAÇO CONTROLADO POR ESTRUTURAS DE DADOS A repetição surgiu livre e associada com o vetor. Então se tinha um índice que iria repetir com um índice controlando. Hoje em dia há estruturas de dados mais eficientes. O “for” do Java, por exemplo, tanto pode ser controlado por contador quanto por estruturas de dados: for(i: coleção) 24
  • 25. DESVIO INCONDICIONAL  Instrução do hardware que indica a próxima instrução a ser executada.  Em assembly chama-se “JMP” Varias linguagens de alto nível também possuem essa instrução, em tais linguagens, normalmente chama-se “goto”. Inicialmente haviam programas mais simples, programados com recursos oferecidos pelo hardware. Com o tempo os programas foram se sofisticando a as linguagens de programação necessitaram correr atrás desse desenvolvimento. O hardware sempre soube fazer desvio incondicional, esta forma sempre apareceu nas primeiras linguagens de programação. No entanto, reflete num sistema de programação que não é muito planejado. Chamado de “Programação não estruturada”. PROGRAMAÇÃO NÃO ESTRUTURADA Programação Não estruturada é quando o programa não possui uma estrutura planejada, uma fase de engenharia em que se planeja o que irá ser feito.Com o tempo, a necessidade de construir programas maiores aconteceu.Da programação não estruturada evoluiu-se para a programação estruturada. PROGRAMAÇÃO ESTRUTURADA Há uma diretriz fundamental em que se separa o programa em partes (modularização).Pequenas coisas, ou partes, que fazem coisas simples, com todas juntas criam-se coisas maiores. Juntamente com esse tipo de programação vieram novos paradigmas.Um exemplo “clássico” de programação estruturada é o Pascal. Com o objetivo de incentivar determinadas coisas.Em certo tempo, a programação estrutura tornou-se insuficiente, daí apareceu a programação orientada a objeto. PROGRAMAÇÃO ORIENTADA A OBJETOS Diferentemente da estruturada, na POO tem-se varias diretrizes de como são as partes independentes, como elas se comportam separadamente. Um exemplo de linguagem é o SmallTalk. GOTO É uma Instrução de controle de fluxo. O GOTO é um dos elementos antigos que permanecem depois de muito tempo. Sendo muito fundamental na programação estruturada, tem-se trechos no programa tratando de trechos diferentes tratando partes diferentes, no entanto não se tem maneiras de se separar cada uma das partes. Para isto, usa-se o goto. Uma parte do programa recebe um nome, e a partir disso é possível redirecionar a execução para qualquer parte do programa. A medida que os recursos foram aumentando, o goto passou a ser considerado um problema. Uma das diretrizes da programação estruturada é não utilizar o goto. Daí começaram a aparecer linguagens que o goto não é tão eficiente quanto das linguagens anteriores. Com o desenvolvimento novas linguagens foram aparecendo e abandoando o goto gradualmente. Um exemplo de linguagem que não possui goto é o Java. Independentemente da linguagem é uma estrutura que atrapalha a instrução e a legibilidade. SAÍDAS MÚLTIPLAS Situação numa instrução iterativa em que se executa no inicio porem tem-se vários pontos de saída, tanto da condicional, do seletor ou outro. Dessa forma, quebra-se a diretriz da programação estruturada, tendo em vista que não está se executando cada bloquinho, cada pedaço do programa, a do seu inicio ao a seu fim. O “brake” em C é um exemplo de instrução que finaliza um bloco. Em algumas linguagens ele pode finalizar um seletor. Há outros exemplos, como o “return” o “continue”, “last”, “resume” dependendo da linguagem. 25
  • 26. COMANDOS PROTEGIDOS É outra estrutura de controle de fluxo. Abstrai vários detalhes do programador, no entanto abstraindo, não se terá mais controle do programa, então se perde o controle sobre o que o programa irá executar. series de instruções que serão executadas mediantes testes, jogando para o compilador a decisão. Selecionar pedaços do programa de uma maneira mais geral para garantir a execução ou o teste em questão. IF teste -> comando [] teste -> comando [] teste -> comando . . . Fi É Apenas um recurso a mais. A partir de vários testes, dá mais garantias de que não irá executar se não for possível executar, ou se algo já foi executado previamente. 26
  • 27. Revisão  O que é uma variável externa e o que é uma variável global? Dê um exemplo em uma linguagem. * Escolher uma linguagem:  Variável Global ou Externa: Declarada no mesmo bloco que está sendo usada.  Variável Local: Declarada num outro bloco que também está relacionado com um bloco antecedendo, mas que a variável é visível a partir do bloco precedente. Linguagem Pascal Procedure P() Var v: integer; Begin X:=y; ( x não foi declarado e P(), logo é externa a P() ) --- --- V:=x; (v é interno a P() ) end  Dê um exemplo de implementação em que variáveis diferentes tem o mesmo nome: DICAS  Cuidado com termos mais específicos, se faz sentido para você, pode não fazer para os outros. Pode estar fora do contexto.  Estar atento a respostas parciais.  Pôr a teoria em prática é essencial.  Nos exemplos, escrever em qual linguagem está se designando os fatores.  Cuidado com respostas ” Universais”. 27