Introdução à Programação

Tamanho: px
Começar a partir da página:

Download "Introdução à Programação"

Transcrição

1 Introdução à Programação Uma das características de um engenheiro é a capacidade de resolver problemas técnicos. Qualquer problema de engenharia é resolvido recorrendo a uma sequência de fases: - a compreensão do problema -> corresponde a perceber e identificar de um modo preciso o problema que tem de ser resolvido; - especificação do problema -> onde o problema é descrito e documentado de modo a remover dúvidas e imprecisões; - desenvolvimento da solução (ou modelação da solução) -> utiliza-se a especificação do problema para produzir um esboço da solução do problema, identificando métodos apropriados de resolução de problemas e as suposições necessárias. O esboço da solução é progressivamente detalhado até se atingir um nível de especificação que seja adequado para a sua realização; - concretização da solução -> as especificações desenvolvidas são concretizadas; - verificação e testes -> o resultado produzido é validado, verificado e testado. A engenharia informática difere das outras pois trabalha com entidades imateriais, lida com entidades intangíveis que apenas podem ser observadas indirectamente através dos efeitos que produzem. Ela tem como finalidade a concepção e realização de abstracções ou modelos de entidades abstractas que fazem com que o computador apresente um comportamento que corresponde à solução de um dado problema. Um computador é uma máquina cuja função é manipular a informação. Informação é qualquer coisa que pode ser transmitida ou registada e tem um significado associado à sua representação simbólica. A informação provém de muitos sítios diferentes. O que distingue o computador das outras máquinas que lidam com informação é o facto de este poder manipular a informação para além de a armazenar e transmitir. A manipulação da informação segue um sequência de instruções a que se dá o nome de programa. É portanto, uma caixa electrónica que tem a capacidade de compreender e de executar as instrucções que constituem os programas. Um processo computacional é um ente imaterial que existe dentro de um computador durante a execução de um programa, e cuja evolução ao longo do tempo é ditada pelo programa. 1.1 Algoritmos Um algoritmo é uma sequência de instrucções que podem ser executadas de um modo mecânico de modo a atingir um determinado objectivo. A execução das instrucções do algoritmo garante que o seu objectivo é atingido. Cada algoritmo está também associado a um agente que deve executar as suas instrucções. O que é um algoritmo para um agente pode não ser para outro. Embora um algoritmo não seja mais do que uma sequência de passos a seguir para atingir um determinado objectivo podem ser consideradas um algoritmo, pois todo o algoritmo deve possuir três características: ser rigoroso, ser eficaz, e ter a garantia de terminar. Um algoritmo é rigoroso. Cada instrucção do algoritmo deve especificar exacta e rigorosamente o que deve ser feito, não havendo lugar para ambiguidade. O facto de um algoritmo poder ser executado mecanicamente obriga a que cada uma das suas instrucções tenha uma e só uma interpretação. 1

2 Um algoritmo é eficaz. Cada instrucção do algoritmo deve ser suficientemente básica e bem compreendida de modo a poder ser executada num intervalo de tempo finito, com uma quantidade de esforço finita. Um algoritmo deve terminar. O algoritmo deve levar a uma situação em que o objectivo tenha sido atingido e não existam mais instrucções para ser executadas. Um algoritmo é uma sequência finita de instrucções, bem definidas e não ambíguas, cada uma das quais pode ser executada mecanicamente num período de tempo finito com uma quantidade de esforço finita. Um programa é um algoritmo escrito numa linguagem que é entendida por um computador, chamada uma linguagem de programação. 1.2 O desenvolvimento de programas O desenvolvimento de programas utiliza muitas actividades e técnicas: a definição exacta do que se pretende fazer, removendo ambiguidades e incertezas que possam estar contidas nos objectivos a atingir (a compreensão do problema), a decisão do processo a utilizar para a solução do problema e o delineamento da solução utilizando um linguagem adequada (o desenvolvimento da solução); a codificação da solução numa linguagem de programação; a verificação e os testes. De todas estas, a mais criativa e mais dificil é o desenvolvimento da solução. A sua maior dificuldade é o controlo da sua complexidade. A abordagem do topo para a base é uma técnica que consiste em identificar os principais sub-problemas que constituem o problema a resolver, e em determinar qual a relação entre esses sub-problemas. O processo é aplicado repetitivamente para cada um dos sub-problemas até se atingirem problemas cuja solução não temos dificuldade em escrever. A abstracção é uma técnica que consiste em ignorar informação irrelevante, num dado contexto. 1.3 Programas em Scheme O Scheme é uma linguagem de programação, ou seja, corresponde a um formalismo para escrever programas. Uma forma é uma frase em Scheme. A linguagem Scheme é constituída por formas. O interpretador do Scheme é uma caixa electrónica que compreende as formas da linguagem Scheme, ou seja, sabe reagir apropriadamente a uma forma da linguagem. Em processamento interactivo, o utilizador dialoga com o computador, fornecendo uma forma de cada vez e esperando pela resposta do computador antes de fornecer a próxima forma. A utilização interactiva do Scheme correpsonde à repetição de um ciclo chamado o ciclo lê-avalia-escreve. Ao interagir com o interpretador do Scheme, sempre que escrevemos uma forma a seguir ao carácter de pronto, estamos a pedir ao interpretador que avalie essa forma, sendo o seu valor fornecido na linha imediatamente a seguir àquela que corresponde ao nosso pedido Sintaxe e Semantica 2

3 O Scheme apresenta dois aspectos distintos: as frases da linguagem e o significado associado às frases. Estes aspectos são denominados a sintaxe e a semântica da linguagem. Sintaxe A sintaxe de uma linguagem é o conjunto de regras que definem quais as relações válidas entre os componentes da linguagem. A sintaxe nada diz em relação ao significado das frases da linguagem. Os símbolos que aparecem nas frases da linguagem são chamados símbolos terminais e são escritos, em notaçao BNF, sem qualquer símbolo especial à sua volta. Um símbolo não terminal está sempre associado a um conjunto de entidades da linguagem. O símbolo (lido ou ) representa possíveis alternativas. O símbolo ::= (lido é definido como ) serve para definir componentes da linguagem. A utilização do carácter + imediatamente após um símbolo não terminal significa que esse símbolo pode ser repetido zero ou mais vezes. Semântica A semântica de uma linguagem define qual o significado de cada frase da linguagem. Cada forma em Scheme tem uma semântica, a qual representa a acção tomada pelo interpretador do Scheme ao avaliar essa forma, ou seja, o significado que o interpretador do Scheme atribui à forma. Esta semântica é definida por regras para extrair o significado de formas Construcção de formas Ao escrevermos programas em Scheme iremos produzir formas. As formas em Scheme são construídas de três modos diferentes: - Formas primitivas. Estas formas representam as entidades mais simples da linguagem, as quais têm um significado predefinido para o interpretador do Scheme. Estas formas primitivas fazem parte do interpretador do Scheme, são as suas formas nativas. - Modos de combinação. Estes modos permitem a construcção de formas compostas a partir de elementos mais simples. - Modos de abstracção. Estes modos permitem que elementos compostos recebam nomes e sejam tratados como unitários. 1.4 Expressões nome. Uma expressão é uma entidade computacional que tem um valor. Uma expressão em Scheme pode ser uma constante, uma combinação ou um O valor de uma constante é a própria constante. Existem em Scheme os seguintes tipos de constantes: - Números inteiros. Estes correspondem a números sem parte decimal (com ou sem sinal) e podem ser arbitrariamente grandes. 3

4 - Números racionais. Estes correspondem ao quociente de dois números inteiros, os quais são separados pelo símbolo /. Os números racionais são sempre representados pelo Scheme reduzidos à sua forma canónica (o numerador e o denominador são primos entre si) e podem ter ou não sinal. Um número racional com denominador 1, é automaticamente indicado como um número inteiro. - Números reais. Estes correspondem a números com parte decimal (com ou sem sinal) e podem ser arbitrariamente grzndes ou arbitrariamente pequenos. Os números reais com valores absolutos muito pequenos ou muito grandes são apresentados em notação científica. Em notação científica, representa-se o número, com ou sem sinal, através de uma mantissa e de uma potência inteira de dez que multiplicada pela mantissa produz o número. A mantissa e o expoente são separados pelo símbolo e. - Valores lógicos. Os quais são representados em Scheme por #t (verdadeiro) e #f (falso). - Cadeias de caracteres. As quais correspondem a sequências de caracteres. O comprimento da cadeia é o número de caracteres que a constitui. As constantes das cadeias de caracteres são representadas em Scheme delimitadas por aspas Combinações Por procedimentos primitivos entendem-se operações que o interpretador de Scheme conhece, independentemente de qualquer indicação que lhe seja dada por um programa. Em Scheme, para qualquer destas operações existe uma indicação interna daquilo que o computador deve fazer quando surge uma expressão com essa operação. Este procedimento faz parte do próprio Scheme. Os procedimentos primitivos podem ser utilizados através do conceito de combinação. Uma combinação corresponde ao conceito de aplicação de uma operação a uma sequência de operandos. Uma combinação é composta por um operador e por um certo número de operandos. Os operadores podem ser unários, binários, etc. Em Scheme, as operações são escritas utilizando a notação prefixa: (1) o operador aparece antes dos operandos e (2) o operador e a sequência dos seus operandos são escritos dentro de parênteses. Uma combinação é constituída por um operador seguido de zero ou mais expressões (os operandos). Uma das vantagens da notação prefixa é a de evitar ambiguidade quanto ao domínio e prioridade do operador, o que nos permite a utilização de expressões encadeadas. Para calcular o valor de uma combinação, avaliam-se as sub-expressões na combinação (por qualquer ordem). Após esta avaliação, aplica-se o procedimento correspondente ao valor da primeira sub-expressão (o operador) aos argumentos que correspondem aos valores das restantes sub-expressões (os operandos). Cada operador aceita um certo número de operandos, os quais têm de ser de certo tipo. O resultado da aplicação de alguns operadores depende do tipo dos seus operandos. Operações numéricas em Scheme Operação Número de Argumentos Tipo dos argumentos Valor 4

5 (+ <e1>... <en>) Dois ou mais Números A soma dos valores de <e1>... <en>. (- <e1>... <en>) Dois ou mais Números O resultado de subtrair ao valor de <e1> os valores de... e <en> (- <e>) Um Número O simétrico de e (* <e1>... <en>) Dois ou mais Números O produto dos valores de <e1>... <en> (/ <e1>... <en>) Dois ou mais Números O resultado de dividir o valor de <e1> sucessivamente pelos valores de... e <en> (/ <e>) Um Número O inverso de <e> (cos <e>) Um Número O coseno do valor de <e>, tomado como um valor em radianos (sin <e>) Um Número O seno do valor de <e>, tomado como um valor em radianos (log <e>) Um Número O logaritmo natural do valor de <e> (sqrt <e>) Um Número A raiz quadrada do valor <e> (max <e1>... <en>) Um ou mais Números O máximo dos valores de <e1>... <en>. (min <e1>... <en>) Um ou mais Números O mínimo dos valores de <e1>... <en> (quotient <e1> <e2> (remainder <e1> <e2> Dois Números O resultado da divisão inteira entre o valor de <e1> e <e2> Dois Números O resto da divisão inteira entre o valor de <e1> e <e2> (round <e>) Um Número O resultado de arredondar o valor de <e> (inexact->exact <e>) Um Número O resultado de converter o valor de <e> para o inteiro mais próximo 5

6 Predicados primitivos em Scheme Predicado Número de Tipo dos Valor argumentos argumentos (odd? <e>) Um Inteiro Tem o valor #t se e só se o valor de <e> for ímpar (even? <e>) Um Inteiro Tem o valor #t se e só se o valor de <e> for par (= <e1>... <en>) Dois ou mais Números Tem o valor #t se e só se os valores das expressões de <e1>... <en> são todos iguais (> <e1>... <en>) Dois ou mais Números Tem o valor #t se e só se os valores das expressões <e1>... <en> se encontram ordenados por ordem decrescente, não existindo dois valores iguais. (< <e1>... <en>) Dois ou mais Números Tem o valor #t se e só se os valores das expressões <e1>... <en> se encontram ordenados por ordem crescente, não existindo dois valores iguais (>= <e1>... <en>) Dois ou mais Números Tem o valor #t se e só se os valores das expressões <e1>... <en> se encontram ordenados por ordem decrescente, podendo existir valores (<= <e1>... <en>) Predicados e condições iguais Dois ou mais Números Tem o valor #t se e só se os valores das expressões <e1>... <en> se encontram ordenados por ordem crescente, podendo existir valores iguais As condições podem ser combinadas através de operações lógicas. Uma operação que produz resultados do tipo lógico chama-se um predicado. Uma expressão cujo valor é do tipo lógico chama-se uma condição. 6

7 Operações lógicas primitivas em Scheme Operação Número de Tipo dos Valor argumentos argumentos (and <e1>... <en>) Dois ou mais Condições A conjunção dos valores de <e1>... <en> (or <e1>... <en>) Dois ou mais Condições A disjunção dos valores <e1>... <en> (not <e>) Um Condição A negação do valor <e> 1.5 Avaliação de expressões primeira abordagem Para avaliar expressões, o interpretador do Scheme utiliza regras de avaliação. Podemos considerar que exste uma regra de avaliação constituída pelas seguintes partes: - se a expressão é uma constante, o seu valor é a própria constante - se a expressão é uma operação primitiva, o seu valor é o procedimento interno associado a essa operação - se a expressão é uma combinação, o seu valor é calculado do seguinte modo: o avaliam-se as sub-expressões na combinação (por qualquer ordem) o aplica-se o procedimento que é o valor d primeira sub-expressão (o operador) aos argumentos que correspondem aos valores das restantes sub-expressões (os operandos). Um dos aspectos importantes a notar em relação à regra de avaliação é que para avliar uma combinação temos de aplicar a própria regra de avaliação definida em tremos de si própria é uma definição recursiva. Durante o processo de avaliação, a regra de avaliação é invocada por si própria múltiplas vezes. Esta invocação deixa de ser necessária quando se encontra uma entidade cujo valor é conhecido pelo avaliador do Scheme, ou seja quando o objecto computacional a avaliar é uma constante ou um procedimento primitivo. Uma definição diz-se recursiva se a entidade que está a ser definida for definida em termos de si própria. A ideia fundamental numa deifinição recursiva consiste em definir um problema em termos de uma versão semelhante, embora mais simples, de si próprio. As definições recursivas são constituídas por duas partes distintas: - uma parte básica, ou caso terminal, a qual constitui a versão mais simples do problema para o qual a solução é conhecida; - uma parte recursiva, ou caso geral, na qual o problema é definido em termos de uma versão mais simples de si próprio. 1.6 Nomes A utilização de nomes corresponde a um nível de abstracção no qual deixamos de nos preocupar com a indicação directa do objecto computacional, referindo-nos a esse objecto pelo seu nome. A associação entre um nome e um valor é obtida pela operação de nomeação. A operação de nomeação é realizada em Scheme através do procedimento primitivo chamado define. Este procedimento recebe dois operandos; o primeiro 7

8 corresponde ao nome que queremos usar para nomear o valor resultante da avaliação do segundo operando, o qual é uma expressão. O procedimento primitivo define dá origem a uma forma que não corresponde a uma expressão (é uma definição). Um ambiente é uma associação entre nomes e objectos computacionais. O valor de um nome corresponde ao objecto computacional que está associado a esse nome no ambiente em consideração. O valor de uma expressão depende do ambiente em que é avaliada. A utilização de um nome que não é conhecido pelo interpretador do Scheme, origina um erro pois o computador não sabe o que o nome significa o nome não faz parte do ambiente. Um nome pode ser utilizado para referir o valor de uma expressão. A associação é feita entre o nome e o valor da expressão. O valor de um nome é o objecto computacional associado a esse nome no ambiente em consideração. 1.7 Formas Especiais Existem em scheme algumas formas, chamadas formas especiais, que têm regras de avaliação especiais. Cada forma especial tem o seu modo específico de avaliação. O operador define é uma forma especial porque tem uma regra de avaliação específica. Os operadores lógicos and e or são formas especiais. Ao avaliar a combinação (and), os predicados são avaliados pela ordem em que aparecem. Assim que o valor de um deles for falso, a avaliação termina com o valor falso. Se o valor de todos os predicados for verdadeiro, o valor da expressão é verdadeiro. Ao avaliar a combinação (or), os predicados são avaliados pela ordem em que aparecem. Assim que o valor de um deles for verdadeiro, a avaliação termina com o valor verdadeiro. Se o valor de todos os predicados for falso, o valor da expressão é falso. 1.8 Resumo Um algoritmo é uma sequência finita de instrucções, cuja execução não necessita de inteligência, imaginação, intuição e que mais cedo ou mais tarde chega ao fim. A um algoritmo escrito em Scheme dá-se o nome de procedimento. A execução de um procedimento pelo interpretador do Scheme dá origem a um processo computacional. Um programa Scheme é constituído por formas, as quais são divididas em definições e em expressões. As definições permitem associar nomes a objectos computacionais. As expressões podem ser constantes, nomes ou combinações. As formas em Scheme podem ainda ser classificadas segundo uma outra dimensão ortogonal à primeira, considerando o modo de avaliação. Segundo esta classificação as formas podem ser (1) normais, se seguem as regras gerais estabelecidas para a avaliação, ou (2) especiais, se têm regras próprias de avaliação. A regra de avaliação corresponde a uma definição recursiva. 8

9 Capítulo 2 Procedimentos Compostos 2.1 Definição de Procedimentos O processo de utilização de procedimentos definidos pelo programador compreende dois aspectos distintos: a definição do procedimento que é feita fornecendo os argumentos do procedimento e um processo de cálculo para os valores do procedimento, e a aplicação do procedimento a um valor, ou valores, do(s) seu(s) argumento(s). Uma forma de deifnir procedimentos compostos em Scheme é através de expressões lambda. Para tal, indicam-se os argumentos do procedimento, chamados parâmetros formais, seguidos da especificação do processo de cálculo que o procedimento deve seguir. A aplicação de um procedimento em Scheme corresponde a uma combinação em que o operador corresponde ao procedimento e os operandos correspondem aos valores aos quais queremos aplicaro o procedimento. Estes operandos que correspondem a expressões, são designados por parâmetros concretos. Podemos combinar a operação de nomeação de procedimentos com a definição de procedimentos para dar nomes aos nossos procedimentos. Os procedimentos compostos podem sr usados do mesmo modo que os procedimentos primitivos. A abstracção procedimental consiste em abstrair do modo como os procedimentos realizam as suas tarefas, concentrando-se apenas na tarefa que os procedimentos realizam. Ou seja, a separação do como de o que. Açúcar sintáctico alternativa para tornar a notação mais simples. 2.2 Avaliação de expressões segunda abordagem Para avaliar expressões, o interpretador do Scheme utiliza a seguinte regra: 1. Se a expressão é uma constante, o seu valor é a própria constante; 2. Se a expressão é um nome, o seu valor é o objecto computacional associado ao nome; 3. Se a expressão corresponde a uma forma especial, o seu valor é calculado pelas regras de avaliação para essa forma especial; 4. Se a expressão é uma combinação, aplica-se o operador da combinação aos operandos, o que é feito do seguinte modo: a.) Avaliam-se as sub-expressões na combinação; b.) Associam-se os parâmetros formais do procedimento correspondente à primeira sub-expressão (o operador) com os valores das restantes subexpressões (os parâmetros concretos). Esta associação é feita com base na ordem das sub-expressões, isto é, o primeiro parâmetro concreto é associado ao primeiro parâmetro formal e assim sucessivamente; c.) No ambiente definido pela associação entre os parâmetros formais e os parâmetros concretos, avalia-se o corpo do procedimento correspondente à primeira sub-expressão. 2.3 Expressões condicionais Uma expressão condicional é uma forma especial, iniciado pela palavra cond (um símbolo terminal) e seguida por um número arbitrário de cláusulas. Cada cláusula é 9

10 constituída por uma condição (uma expressão cujo valor é verdadeiro ou falso), seguida de um número arbitrário (eventualmente zero) de expressões. Numa expressão condicional, as condições são avaliadas pela ordem em que aparecem. Assim que uma destas condições tiver o valor verdadeiro, as expressões que lhe estão associadas na cláusula são avaliadas, representando o valor da última expressão avaliada o valor da expressão condicional. Em Scheme, existe um nome especial, designado por else, cujo valor é sempre verdadeiro, e que apenas pode ser usado como condição na última cláusula de uma expressão condicional Cálculo de Potencias Para calcular a potencia de um número fazemos o produto de x por si próprio n vezes. (define (potencia x n) (if (= n 1) x (* x (potencia x (- n 1))))) Cálculo do máximo divisor comum O máximo divisor comum entre dois inteiros m e n, escrito mdc(m,n), é o maior inteiro p tal que ambos m e n são divisíveis por p. O ma ximo divisor comum entre um número e zero é o próprio número. Quando dividimos um número por um menor, o máximo divisor comum entre o resto da divisão e o divisor é o mesmo que o máximo divisor comum entre o dividendo e o divisor. Podemos escrever o seguinte procedimento em Scheme para calcular o máximo divisor comum entre os inteiros m e n (com o procedimento primitivo remainder). (define (mdc m n) (if (= n 0) m (mdc n (remainder m n)))) Cálculo do arco de tangente Não vamos obter o valor exacto do arco de tangente, mas sim uma aproximação que seja suficientemente boa para o fim em vista. A função arco de tangente, designada por arctg, é a função inversa da função tangente e como tal pode ser definida do seguinte modo: arctg(x) é o número y tal que x=tg(y). Consideremos então o seguinte algoritmo para calcular arctg(x), o qual começa com uma aproximação ao valor do arco de tangente (a qual pode ser o primeiro termo da série): - Se a aproximação estiver suficientemente próxima do valor do arco de tangente (se esta for suficientemente boa), essa aproximação será o valor do arco de tangente; - Em caso contrário, calculamos uma aproximação melhor, por adição de mais um termo da série. (define (calc-arctg x aprox n) 10

11 (if (boa-aprox? Aprox x) aprox (calc arctg x (+ aprox (termo x n)) (+ n 1)))) O procedimento calc-arctg recebe três argumentos: (1) o valor para o qual se pretende calcular o acro de tangente, x; (2) uma aproximação dada pela soma de um certo número de termos da série, aprox; e (3) o índice do próximo termo da série que pode ser utilizado para calcular uma nova aproximação, n: - se a aproximação fornecida for satisfatória, essa aproximação será o valor do procedimento; - em caso contrário o procedimento gera uma nova aproximação considerando mais um termo e usa o próprio procedimento calc-arctg para decidir sobre a nova aproximação. (define (boa-aprox? Aprox x) (< (abs (- (tg aprox) x)) 0.001)) (define (tg x) (/ (sin x) (cos x))) (define (termo x n) (* (sinal n) (termo-sem-sinal x n))) (define (sinal n) (if (odd? n) -1 1)) (define (termo-sem-sinal x n) (/ (potencia x (dobro-mais-um n)) (dobro-mais-um n))) (define (dobro-mais-um n) (+ (* 2 n) 1)) (define (arctg x) (if (< (abs x) 1) (calc-arctg x x 1) arctg: o módulo do argumento não é menor que 1 )) O procedimento arctg é definido através de um agrupamento de outros procedimentos. Isto corresponde à abstracção procedimental. 2.6 Estrutura de Blocos Um bloco corresponde a um conjunto de instrucções. A importância dos blocos provém das seguintes regras informais: - cada bloco deve corresponder a um sub-problema que o procedimento correspondente tem de resolver. Este aspecto permite modularizar o programa. - O algoritmo usado por um bloco está escondido do resto do programa. Isto permite controlar a complexidade do programa. - Toda a informação definida dentro de um bloco pertence a esse bloco, e só pode ser usada por esse bloco e pelos blocos definidos dentro dele. Isto permite a protecção efectiva da informação definida em cada bloco da utilização não autorizada por parte de outros blocos. 11

12 Em Scheme, qualquer procedimento pode ser considerado como um bloco, dentro do qual podem ser definidos outros blocos. Todos os nomes que são definidos pela forma especial define, directamente avaliada após o carácter de pronto, pertencem a um ambiente a que se chama o ambiente global. O ambiente global contém todos os nomes que foram fornecidos directamente ao interpretador do Scheme. Um ambiente local corresponde a uma associação entre nomes e objectos computacionais, a qual é realizada durante o processo de avaliação de uma forma. Um ambiente local desaparece no momento em que termina a avaliação da forma que deu origem à sua criação. Diz-se que um nome está ligado num dado ambiente se existe um objecto computacional associado ao nome nesse ambiente. Quando se define procedimentos dentro de outros procedimentos (blocos) e quando se define procedimentos cujos nomes são colocados no ambiente global? A decisão de se definir procedimentos no ambiente global vai-se prender com a utilidade do procedimento e com as restrições impostas à utilização do procedimento. Um nome local apenas tem significado dentro do corpo de uma expressão lambda. Um nome que aparece no corpo de uma expressão lambda e que não é um nome local diz-se não local. Define-se domínio de um nome como a gama de formas nas quais o nome é conhecido, ou seja, o conjunto das formas onde o nome pode ser utilizado. A utilização exclusiva de nomes locais permite manter a independência entre procedimentos, no sentido em que toda a comunicação entre eles é limitada à associação dos parâmetros concretos com os parâmetros formais. Quando este tipo de comunicação é mantido, para utilizar um procedimento apenas é preciso saber o que ele faz, e não como foi programado. A isto chama-se abstracção procedimental. O tipo de domínio utilizado em Scheme é chamado domínio estático: o domínio de um nome é definido em termos da estrutura do programa (o encadeamento dos seus blocos) e não é influenciado pelo modo como a execução do programa é feita. 12

13 Capítulo 3 Processos Gerados por Procedimentos Um procedimento pode ser considerado como a especificação da evoluação local de um processo computacional. Por evolução local entenda-se que o procedimento define, em cada instante, o comportamento do processo computacional, ou seja, especifica como construir cada estágio do processo a partir do estágio anterior. 3.1 Recursão Linear Caracterização de um processo recursivo linear Os procedimentos são caracterizados por uma fase de expansão devido à existência de operações adiadas, seguida por uma fase de contracção em que essas operações são executadas. Este padrão de evolução de um processo é muito comum em programação e tem o nome de processo recursivo. Num processo recursivo existe uma fase de expansão correspondente à construcção de uma cadeia de operações adiadas, seguida por uma fase de contracção correspondente à execução dessas operações. Um processo recursivo é pois caracterizado pela construcção de uma cadeia de operações adiadas. A um processo recursivo que cresce linearmente com um valor dá-se o nome de processo recursivo linear. 3.2 Iteração Linear Caracterização de um processo iterativo linear Um processo iterativo é caracterizado por um certo número de variáveis, chamadas variáveis de estado, juntamente com uma regra que especifica como as actualizar. Estas variáveis fornecem uma descrição completa do estado de computação em cada momento. Um processo iterativo não expande nem contrai. A um processo iterativo cujo número de operações cresce linearmente como um valor dá-se o nome de processo iterativo linear. 3.3 Recursão em processos e em procedimentos A palavra recursão tem dois significados distintos conforme se refere à recursão em procedimentos ou à recursão em processos. A recursão em procedimentos refere-se à definição do procedimento em termos de si próprio ao passo que a recursão em processos refere-se ao padrão de evolução do processo. A evolução de processos pode ser classificada como uma evolução recursiva ou como uma evolução iterativa: - Um processo recursivo é caracterizado por uma fase de expansão (correspondente à construcção de uma cadeia de operações adiadas) seguida de uma fase de contracção (correspondente à execução dessas operações). O interpretador mantém informação escondida que regista o ponto onde está o processo na cadeia de operações adiadas. - Um processo iterativo não cresce nem contrai. Este é caracterizado por um conjunto de variáveis de estado e um conjunto de regras que define como estas 13

14 variáveis evoluem. As variáveis de estado fornecem uma descrição completa do estado do processo em cada ponto. Um procedimento recursivo tanto pode gerar um processo recursivo como um processo iterativo. A recursão em procedimentos refere-se à definição do procedimento em termos de si próprio ao passo que a recursão em processos refere-se ao padrão de evolução do processo. 3.4 Recursão em árvore Os números de Fibonacci A recursão em árvore apresenta um comportamento que se assemelha ao processo recursivo. Tem fases de crescimento, originadas por operações adiadas, seguidas por fases de contracção em que algumas das operações adiadas são executadas. Ao contrário do que acontece com o processo recursivo linear estamos perante a existência de múltiplas fases de crescimento e de contracção, que são originadas pela dupla recursão que existe no procedimento. A este tipo de evolução de um procedimento dá-se o nome de recursão em árvore. Esta designação deve-se ao facto da evolução do processo ter a forma de uma árvore. Este processo é muito inefieciente, pois existem muitos cálculos que são repetidos múltiplas vezes. Para além disso, o processo utiliza um número de passos que não cresce linearmente com o valor de n. Demonstra-se que este número cresce exponencialmente com o valor de n A torre de Hanói (define (mova n origem destino aux) (cond ((= n 1) (mova-disco origem destino)) (else (mova (- n 1) origem aux destino) (mova-disco origem destino) (mova (- n 1) aux destino origem)))) Este procedimento reflecte o desenvolvimento do topo para a base: o primeiro passo para a solução de um problema consiste na identificação dos sub-problemas que o constituem, bem como a determinação da sua inter-relação. O procedimento display aceita como argumento uma expressão e, sempre que é avaliado, força o interpretador do Scheme a escrever o valor dessa expressão. O procedimento newline informa o interpretador do Scheme que deve começar a escrever numa nova linha. 3.5 Sequenciação Na expressão condicional, cada cláusula permite a utilização de várias expressões, as quais são avaliadas sequencialmente pela ordem em que aparecem, correspondendo o valor da cláusula ao valor da última expressão avaliada. Cada cláusula de uma expressão condicional introduz uma sequenciação implicita, ou seja, indica implicitamente qual a sequência de avaliação das expressões que contém. Esta explicitação de avaliação sequencial é chamada sequenciação. O operador de sequenciação, realizado através da forma especial begin, tem a seguinte sintaxe: 14

15 <operação de sequenciação> ::= (begin <expressão>+) A avaliação de uma expressão com a operação de sequenciação causa a avaliação sequencial das várias expressões que esta contém, sendo o valor da operação de sequenciação o valor da última expressão avaliada. A sequenciação permite especificar que uma dada sequência de expressões deve ser avaliada pela ordem em que aparece. 3.6 Ordens de crescimento Os processos gerados por procedimentos podem diferir drasticamente quanto à taxa a que consomem recursos computacionais. Assim, um dos aspectos que vamos ter que levar em linha de conta quando escrevemos programas é a minimização dos recursos computacionais consumidos (tempo e espaço). O tempo diz respeito ao tempo que o nosso programa demora a executar, e o espaço diz respeito ao espaço de memória do computador usado pelo nosso programa. Utiliza-se o termo complexidade de um algoritmo como uma medida dos recursos computacionais que são consumidos durante a evolução do processo que corresponde ao algoritmo (ou ao procedimento que o realiza). Os recursos utilizados por um processo não dependem apenas do algoritmo utilizado mas também do grau de dificuldade ou dimensão do problema a ser resolvido. A ordem de crescimento de um processo é uma medida grosseira dos recursos consumidos pelo processo em função do grau de dificuldade do problema. Se R(n) for uma medida da quantidade de recursos consumidos por um processo computacional ao resolver um problema de grau de dificuldade n, dizemos que R(n) tem ordem de crescimento Ө(f(n)) se: Эk 1,k 2 >0 : k 1 f(n) R(n) k 2 f(n) Para valores suficientemente grandes de n. Alguns valores típicos de ordens de crescimento são: - o crescimento constante, Ө(1); - o crescimento logarítmico, Ө(log(n)); - o crescimento linear, Ө(n); - o crescimento polinomial, Ө(n p ), sendo p um número natural; - o crescimento exponencial, Ө(k n ), sendo k um número natural; - o crescimento factorial, Ө(n!) Potencia rápida (define (potencia-rapida x n) (cond ((= n 1) x) (( odd? n) (* x (potencia-rapida x (- n 1)))) (else (quadrado (potencia-rapida x (quotient n 2)))))) 15

16 4 Procedimentos de ordem superior Um objecto computacional é um objecto de primeira classe se: (1) pode ser nomeado; (2) pode ser utilizado como argumento de procedimentos; (3) pode ser devolvido por procedimentos; (4) pode ser utilizado como componenete de estruturas de informação. A ideia subjacente à definição de um objecto computacional como um cidadão de primeira classe é a de que todos estes objectos computacionais têm os mesmos direitos e responsabilidades. Um dos objectos computacionais que tradicionalmente não é tratado como cidadão de primeira classe é o procedimento. Um procedimento que recebe outros procedimentos como parâmetros ou cujo valor é um procedimento é chamado um procedimento de ordem superior ou, alternativamente, um funcional. 4.1 Procedimentos como parâmetros Os procedimentos correspondem a abstracções que definem operações compostas, independentemente dos valores por estes utilizados. O poder da abstracção correspondente ao somatório permite lidar com o conceito de soma em vez de tratar apenas com somas particulares. A existência da abstracção correspondente ao somatório leva-nos a pensar em definir um procedimento correspondente a este abstracção em vez de apenas utilizar procedimentos que calculam somas particulares. Um dos processos para tornar os procedimentos mais gerais corresponde a utilizar parâmetros adicionais que indicam quais as operações a efectuar sobre os objectos computacionais manipulados pelo procedimento Procedimentos como métodos gerais A utilização de procedimentos como argumentos de procedimentos pode originar métodos gerais de computação, independentemente dos procedimentos envolvidos. 4.2 Procedimentos produzidos por procedimentos Em Scheme os procedimentos podem ser utilizados como argumentos de outros procedimentos. Esta utilização permite a criação de abstracções mais gerais do que as obtidas até agora Cálculo de derivadas O conceito de derivada de uma função é suficientemente importante para ser capturado por uma abstracção. 16

17 5 Abstracção de dados A resolução de um problema, com ou sem auxílio do computador, obriga à escolha de uma abstracção (à criação de um modelo) dos objectos do mundo real. A informação utilizada numa dada aplicação representa uma abstracção da realidade. O tipo da informação vai determinar o tipo das operações a efectuar sobre essa informação. Ao resolver um problema com o computador é essencial decididr, não só qual a informação a considerar (ou seja, qual a informação a abstrair do mundo real), mas também como representar essa informação. A decisão quanto ao modo de representar a informação é de tal modo importante que, por vezes, pode ser um factor decisivo na escolha da linguagem de programação para resolver um dado problema. A importância de utilizar uma linguagem que ofereça modos de representação adequados traduz-se não só na facilidade de desenvolvimento do programa, como também na própria fiabilidade do programa. Em programação é importante considerar que cada objecto computacional correspondente a um dado pertence a um certo tipo. Este tipo vai caracterizar a sua possível gama de valores e as operações a que pode ser sujeito. A utilização de tipos para caracterizar objectos que correspondem a adados é muito importante em programação. Um tipo de informação é caracterizado por um conjunto de objectos e um conjunto de operações aplicáveis a esses objectos. Ao conjunto de objectos dá-se o nome de domínio do tipo. Cada um dos objectos do domínio do tipo é designado por elemento do tipo. Um tipo de informação é constituído por um conjunto de objectos e um conjunto de operações aplicáveis a esses objectos. Os tipos de informação podem-se dividir em dois grandes grupos: os tipos elementares e os tipos estruturados. Os tipos elementares são caracterizados pelo facto das suas constantes (os elementos do tipo) serem tomadas como incompatíveis (ao nível da utilização do tipo). Dentro dos tipos elementares podemos considerar o tipo lógico e o tipo escalar. Os tipos estruturados são caracterizados pelo facto das suas constantes serem constituídas por um agregado de valores. Os tipos de informação elementares contêm elementos que não são deocmponíveis; os tipos de informação estruturados contêm elementos que são compostos por várias partes. 5.1 Aritmética dos números complexos Vamos supor que existe em Scheme os procedimentos: (cria-compl r i) procedimento que recebe como argumentos dois números reais, r e i, e constrói o número complexo cuja parte real é r e cuja parte imaginária é i; (parte-real c) procedimento que recebe como argumento um número complexo, c, e que produz a parte real desse número; (parte-imag c) procedimento que recebe como argumento um número complexo, c, e que produz a parte imaginária desse número. A representação interna de um objecto computacional corresponde à representação manipulada pelo interpretador do Scheme. A representação externa de um objecto computacional corresponde ao modo como esse objecto computacional é mostrado pelo Scheme ao mundo exterior. 17

18 5.1.1 Complexos como procedimentos (define (compl+ c1 c2) (cria-compl define (compl- c1 c2) (cria-compl (+ (parte-real c1) (parte-real c2)) (+ (parte-imag c1) (parte-imag c2)))) (- (parte-real c1) (parte-real c2)) (- (parte-imag c1) (parte-imag c2)))) define (compl* c1 c2) (cria-compl (- (* (parte-real c1) (parte-real c2)) (* (parte-imag c1) (parte-imag c2))) (+ (* (parte-real c1) (parte-real c2)) (* (parte-imag c1) (parte-imag c2))))) Essência da abstracção de dados O comportamento anterior revela a independência entre os procedimentos que efectuam operações aritméticas sobre números complexas e a representação interna de números complexos. Este comportamento foi obtido através de uma separação clara entre as operações que manipulam números complexos e a representação interna de complexos. Esta separação permitenos alterar a representação de complexos sem ter que alterar o programa que lida com números complexos. Esta é a esseência da abstracção de dados, a separação entre: (1) o estudo das propriedados dos dados e (2) os pormenores da realização dos dados numa linguagem de programação. Esta essência é traduzida pela separação das partes do programa que lidam com o modo como os dados são utilizados das partes que lidam com o modo como os dados são representados. A abstracção de dados consiste na separação entre as partes do programa que lidam com o modo como os dados são utilizados das partes do programa que lidam com o modo como os dados são representados. Para definir a parte do programa que lida com o modo como os dados são utilizados, devemos identificar, para cada tipo de dados, o conjunto das operações básicas que podem ser efectuadas sobre os elementos desse tipo. Ao definir um tipo de informação não podemos definir todas as operações que manipulam os elementos do tipo. A ideia subjacente à definição de um novo tipo é a definição do mínimo possível de operações que permitam caracterizar o tipo. Estas operações são chamadas operações básicas e dividem-se em quatro grupos, os construtores, os selectores, os reconhecedores e os testes. (1) Os construtores permitem construir novos elementos do tipo. (2) Os selectores permitem aceder aos constituintes dos elementos do tipo. (3) Os reconhecedores identificam elementos do tipo. Os reconhecedores são de duas categorias. Por um lado, fazem a distinção entre os elementos do tipo e os elementos de qualquer outro tipo, reconhecendo explicitamente os elementos que pertencem ao tipo. Por outro lado, identificam elementos do tipo que se individualizam dos restantes por possuírem certas propriedades particulares. (4) Os testes efectuam comparações entre os elementos do tipo. Os construtores, celectores, reconhecedores e testes são chamados as operações básicas do tipo de dados. O papel destas operações é construirem elementos do tipo (os construtores), seleccionarem componenetes dos elementos do tipo (os selectores) e responderem a perguntas sobre os elementos do tipo (os reconhecedores e os testes). 18

19 5.1.3 O tipo par Em Scheme existe um tipo primitivo chamado par que aglomera dois elementos quaisquer num único elemento. Embora estes dois elementos sejam aglomerados numa única entidade, é possível recuperar tanto o primeiro elemento como o segundo elemento de um par. O tipo par é definido através das seguintes operações básicas, todas elas correspondentes a procedimentos primitivos em Scheme: 1. Construtores: O procedimento cons aceita dois argumentos de qualquer tipo e tem como valor o par constituído por estes argumentos. O primeiro argumento fornecido a cons corresponde ao primeiro elemento do par e o segundo argumento fornecido a cons corresponde ao segundo elemento do par. 2. Selectores: O procedimento car aceita como argumento um par e tem como valor o primeiro elemento desse par. O procedimento cdr aceita como argumento um par e tem como valor o segundo elemento desse par. 3. Reconhecedores: O procedimento pair? Recebe como argumento um elemento de qualquer tipo e tem o valor #t apenas no caso de este elemento ser um par. 4. Testes: Não identificaremos testes para o tipo par. Como a representação gráfica de pares com um grande grau de encadeamento se pode tornar pesada, é tradicional representar pares como caixas duplas cujo conteúdo não está representado directamente no interior de cada cauxa, mas é representado na extremidade de uma seta que sai da caixa esta representação é chamada notação de caixas e ponteiros. Os pares são estruturas que verificam uma propriedade importante: um elemento de um par pode ser, por sua vez, um par. Existe uma semelhança entre combinações e pares: as combinações podem conter sub-expressões que, por sua vez, são combinações; os pares podem conter elemento que, por sua vez, são pares. Esta semelhança é traduzida pela propriedade do fecho: uma operação para combinar entidades satisfaz a propriedade do fecho se os resultados da combinação de entidades com essa operaão puderem ser combinados através da mesma operação. Uma operação para combinar entidades satisfaz a propriedade do fecho se os resultados da combinação de entidades com essa operação puderem ser combinados através da mesma operação. Resumindo, o tipo par tem as seguintes propriedades: 1. Construtores: Cons: universal x universal -> par Cons (e1,e2) tem como valor o par cujo primeiro elemento é e1 e cujo segundo elemento é e2. 2. Selectores: Car: par -> universal Car (p) tem como valor o primeiro elemento do par p. Cdr: par -> universal Cdr (p) tem como valor o segundo elemento do par p. 3. Reconhecedores: Pair?: universal -> lógico Pair? (arg) tem o valor verdadeiro se arg é um par e tem o valor falso em caso contrário. 19

20 Estas operações têm que estar relacionadas entre si de modo a que o seu todo defina o tipo par. De um modo geral, o conjunto das interdependências entre as operações básicas de um tipo não é simples de definir. Estas interdependências são como um conjunto de igualdades que definem uma espécie de contrato a que as operações envolvidas têm que obedecer. Este conjunto de igualdades é designado por axiomatização das operações básicas. Estas igualdades correspondem às relações que devem de existir entre as operações básicas do tipo par de moodo a que estas constituam um todo coerente Complexos como pares Os números complexos podem ser representados por pares. A interacção é exactamente igual à obtida com a representação de complexos através de procedimentos. 5.2 Tipos abstractos de informação Um tipo de informação é uma colecção de entidades, chamadas os elementos do tipo, conjuntamente com uma colecção de operações que podem ser efectuadas sobre essas entidades. Estas operações constroem novas entidades, seleccionam constituintes dessas entidades, identificam e comparam elementos dessas entidades. Metodologia dos tipos abstractos de informação: a sua essência é a separação das partes do programa que lidam com o modo como as entidades do tipo são utilizadas das partes que lidam com o modo como as entidades são representadas. Na utilização da metodologia dos tipos abstractos de informação devem ser seguidos quatro passos sequenciais: (1) a identificação das operações básicas; (2) a axiomatização das operações básicas; (3) a escolha de uma representação para os elementos do tipo; e (4) a concretização das operações básicas para a representação escolhida. Na metodologia dos tipos abstractos de informação são seguidos quatro passos sequenciais: 1. a identificação das operações básicas; 2. a axiomatização das operações básicas; 3. a escolha de uma representação para os elementos do tipo; 4. a concretização das operações básicas para a representação escolhida. Esta metodologia permite a definição de tipos de informação que é independente da sua representação. Esta independência leva à designação destes tipos por tipos abstractos de informação Identificação das operações básicas O primeiro passo na construcção de um novo tipo abstracto de informação consiste em identificar quais são as operações básicas a efectuar sobre os elementos do tipo. Estas operações dividem-se em quatro grupos, os construtores, os selectores, os reconhecedores e os testes. As operações básicas dividem-se em quatro grupos: 1. Os construtores permitem construir novos elementos do tipo. 2. Os selectores permitem aceder (isto é, seleccionar) aos constituintes dos elementos do tipo. 3. Os reconhecedores identificam elementos do tipo. Os reconhecedores são de duas categorias. Por um lado, fazem a distinção entre os elemento do tipo e os 20

21 elementos de qualquer outro tipo, reconhecendo explicitamente os elementos que pertencem ao tipo. Por outro lado, indentificam elementos do tipo que se individualizam dos restantes por possuírem certas propriedades particulares. 4. Os testes efectuam comparações entre os elementos do tipo. Ao conjunto das operações básicas para um dado tipo dá-se o nome de assinatura do tipo. Devemos definir uma representação externa para complexos. O transformador de entrada transforma a notação externa para as entidades abstractas na sua representação interna e o transformador de saída transforma a representação interna das entidades na sua representação externa Axiomatização A axiomatização especifica o modo como as operações básicas se relacionam entre si. O que fazemos é especificar quais as relações obrigatoriamente existentes entre as operações básicas para que estas definam o tipo de um modo coerente Escolha da representação O terceiro passo na definição de um tipo de informação consiste em escolher uma representação para os elementos do tipo em termos de oturos tipos existentes Realização das operações básicas O último passo na definição de um tipo de informação consiste em realizar as operações básicas definidas no primeiro passo em termos da representação definida no terceiro passo. No passo correspondente à realização das operações básicas, devemos especificar os transformadores de entrada e de saída Barreiras de abstracção Depois de concluídos todos os passos na definição de um tipo abstracto de informação (a definição de como todos os elementos do tipo são utilizados e a definição de como eles são representados, bem como a escrita de procedimentos correspondentes às respectivas operações), podemos juntar o conjunto de procedimentos correspondente ao tipo a um programa que utiliza o tipo como se este fosse primitivo na linguagem. O programa acede a uma conjunto de operações que são específicas do tipo e que, na realidade, caracterizam o seu comportamento como tipo de informação. Qualquer manipulação efectuada sobre uma entidade de um dado tipo deve apenas recorrer às operações básicas para esse tipo. As linguagens de programação que foram desenvolvidas antes do aparecimento da metodologia para os tipos abstractos de informação não possuem mecanismos para garantir que toda a utilização dos elementos de um dado tipo é efectuada recorrendo exclusivamente à operações específicas desse tipo. As linguagens de programação mais recentes garantem que as manipulações efectuadas sobre os elementos de um tipo apenas utilizam as operações básicas desse tipo. Este comportamento é obtido através da utilização de dois conceitos chamados encapsulação da informação e anonimato da representação. A encapsulação da informação corresponde ao conceito de que o 21

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Soluções do primeiro teste 13 de Novembro de 2004 9:00-10:30 Nota Número: 20 Nome: Turma: Escreva o seu número em todas as folhas do teste. O espaço das respostas deve ser limitado

Leia mais

Tipo de argumentos. valor. argumentos

Tipo de argumentos. valor. argumentos Operação Numero de argumentos Tipo de argumentos valor (+ ) 2 ou + Numérico Soma ( ) 2 ou + Numérico Subtração ( ) 1 Numérico Simétrico (/ ...) 2 ou + Numérico Divisão (cos

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Primeiro Teste 16 de Abril de 2011 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 7 páginas com 9 perguntas. A cotação de cada pergunta está assinalada

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Solução do Segundo Teste 23 de Janeiro de 2012 09:00 10:30 Nome: Número: 1. (1.0) Explique em que consiste a abstracção de dados, usando os termos barreiras de abstracção, encapsulação

Leia mais

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91 ÍNDICE PREFÁCIO xv 1 NOÇÕES BÁSICAS 1 1.1 Algoritmos 5 1.2 O Desenvolvimento de Programas 8 1.3 Programas em Scheme 11 1.3.1 Sintaxe e semântica 13 1.3.2 Construção de formas 15 1.4 Expressões 16 1.4.1

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Primeiro Teste 6 de Novembro de 200 09:00 0:30 SOLUÇÃO. (.0) Escolha a única afirmação incorrecta. Uma resposta certa vale valor e uma resposta errada desconta 0.4 valores. A.

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Primeiro Teste 21 de Abril de 2012 11:30 13:00 Nome: Número: Esta prova, individual e sem consulta, tem 5 páginas com 10 perguntas. A cotação de cada pergunta está assinalada

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução da Repescagem do Primeiro Teste 31 de Janeiro de 2013 09:00 10:30 1. De um modo sucinto, (a) (0.5) Diga o que é um processo computacional. Um processo computacional é

Leia mais

Exercícios para Fundamentos da Programação Utilizando Múltiplos Paradigmas

Exercícios para Fundamentos da Programação Utilizando Múltiplos Paradigmas Exercícios para Fundamentos da Programação Utilizando Múltiplos Paradigmas Pedro Adão, Fausto Almeida, Ana Cardoso-Cachopo, Pedro Amaro de Matos (editores) Departamento de Engenharia Informática Instituto

Leia mais

Programação imperativa

Programação imperativa Capítulo 8 Programação imperativa 8.1 Exercícios de revisão 1. Distinga entre programação imperativa e programação funcional. 2. Explique a necessidade da introdução do operador de atribuição. 3. Diga

Leia mais

Faculdade de Estudos Avançados do Pará Disciplina: Algoritmos Professor: Armando Hage. Introdução à Programação

Faculdade de Estudos Avançados do Pará Disciplina: Algoritmos Professor: Armando Hage. Introdução à Programação Faculdade de Estudos Avançados do Pará Disciplina: Algoritmos Professor: Armando Hage Introdução à Programação Construção de Algoritmos Algoritmo é uma seqüência finita de ações que descrevem como um problema

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Primeiro Teste 26 de Outubro de 2013 09:00 10:30 1. (1.0) O que é um processo computacional? Qual a relação entre um programa e um processo computacional? Um processo

Leia mais

2. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados.

2. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados. Capítulo 5 Abstracção de dados 5. Exercícios de revisão. Diga o que é um tipo abstracto de informação.. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados.

Leia mais

TÉCNICO DE INFORMÁTICA - SISTEMAS

TÉCNICO DE INFORMÁTICA - SISTEMAS 782 - Programação em C/C++ - estrutura básica e conceitos fundamentais Linguagens de programação Linguagem de programação são conjuntos de palavras formais, utilizadas na escrita de programas, para enunciar

Leia mais

Fundamentosde Programação

Fundamentosde Programação Fundamentosde Programação Soluçãodo Primeiro teste 19 de Novembrode 2005 1. (1.0) Utilizando a notação BNF, apresente a definição completa da forma define. Explique cada um dos constituintes da sua definição.

Leia mais

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS Bruno Maffeo Departamento de Informática PUC-Rio MÉTODO INDUTIVO O método indutivo para resolver problemas aqui empregado inspira-se na formulação mais

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Segundo Teste 10 de Janeiro de 2014 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 8 páginas com 12 perguntas. A cotação de cada pergunta está assinalada

Leia mais

Estruturação de Procedimentos

Estruturação de Procedimentos Capítulo 4 Estruturação de Procedimentos 4. Exercícios de revisão. Diga o que entende por linguagem estruturada em blocos. Descreva a regra associada a esta estrutura, e diga qual a sua importância. 2.

Leia mais

Programação Introdução

Programação Introdução PROGRAMAÇÃO Programação Introdução Prof. Dr. Adriano Mauro Cansian 1 Introdução Para armazenar um algoritmo na memória de um computador e para que ele possa, em seguida, comandar as operações a serem executadas,

Leia mais

Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi

Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi Algoritmos Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi Conceitos Linhas de Código de um Algoritmo ou Programa escrita do programa linha a linha, ou seja, a sintaxe do programa, podendo-se

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Exame 13 de Janeiro de 2017 09:00 11:00 1. Indique se cada uma das seguintes afirmações é verdadeira ou falsa. No caso de ser falsa, justifique de forma sucinta. (a)

Leia mais

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema ALGORITMIA Resolução De Problemas Em Informática Docente: Ana Paula Afonso 2000-2001 Resolução de Problemas 1. Analisar o problema Conhecer o bem o problema Descrever o problema: subdividir, detalhar 2.

Leia mais

Introdução à Programação. João Manuel R. S. Tavares

Introdução à Programação. João Manuel R. S. Tavares Introdução à Programação João Manuel R. S. Tavares Sumário 1. Ciclo de desenvolvimento de um programa; 2. Descrição de algoritmos; 3. Desenvolvimento modular de programas; 4. Estruturas de controlo de

Leia mais

EXPRESSÕES ARITMÉTICAS PARTE 1

EXPRESSÕES ARITMÉTICAS PARTE 1 AULA 5 EXPRESSÕES ARITMÉTICAS PARTE 1 5.1 Operadores aritméticos Os operadores aritméticos definem as operações aritméticas que podem ser realizadas sobre os números inteiros e reais. Para os inteiros,

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Segundo Teste 6 de Janeiro de 2010 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 8 páginas com 9 perguntas. A cotação de cada pergunta está assinalada

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Segundo Teste 18 de Junho de 2014 15:00 16:30 1. (1.0) Diga quais as fases por que passa o desenvolvimento de um programa no modelo estudado e o que se faz em cada uma delas.

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Exame 9 de Janeiro de 2015 09:00 11:00 1. De um modo sucinto, explique o que é: (a) (0.5) Um processo computacional. Um ente imaterial que existe dentro de um computador durante

Leia mais

Linguagens de Programação Aula 13

Linguagens de Programação Aula 13 Linguagens de Programação Aula 13 Celso Olivete Júnior olivete@fct.unesp.br Na aula passada Suporte para a programação orientada a objetos 2 Na aula de hoje Programação Funcional Linguagem Haskell 3 Roteiro

Leia mais

Métodos para a construção de algoritmo

Métodos para a construção de algoritmo Métodos para a construção de algoritmo Compreender o problema Identificar os dados de entrada e objetos desse cenário-problema Definir o processamento Identificar/definir os dados de saída Construir o

Leia mais

Aula prática 5. Funções Recursivas

Aula prática 5. Funções Recursivas Programação Funcional UFOP DECOM 2014.1 Aula prática 5 Funções Recursivas Resumo Definições recursivas são comuns na programação funcional. Nesta aula vamos aprender a definir funções recursivas. Sumário

Leia mais

Fundamentos da Programação de Computadores

Fundamentos da Programação de Computadores Universidade do Minho Escola de Engenharia Departamento de Sistemas de Informação Fundamentos da Programação de Computadores Licenciatura em Tecnologias e Sistemas de Informação 1º Ano 1º Semestre Ano

Leia mais

Introdução à Computação

Introdução à Computação Conteúdo de hoje... Your Logo Here Prof. Lucas Amorim lucas@ic.ufal.br Tipos de dados Dados numéricos Inteiro Real Dados literais Dados lógicos Variáveis Introdução à Computação Tipos de dados, variáveis

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Program João Manuel R. S. Tavares Sumário 1. Ciclo de desenvolvimento de um programa; 2. Descrição de algoritmos; 3. Desenvolvimento modular de programas; 4. Estruturas de controlo de um programa.

Leia mais

CONCEITOS DE ALGORITMOS

CONCEITOS DE ALGORITMOS CONCEITOS DE ALGORITMOS Fundamentos da Programação de Computadores - 3ª Ed. 2012 Editora Prentice Hall ISBN 9788564574168 Ana Fernanda Gomes Ascênsio Edilene Aparecida Veneruchi de Campos Algoritmos são

Leia mais

SEBENTA INTRODUÇÃO Á ALGORITMIA

SEBENTA INTRODUÇÃO Á ALGORITMIA SEBENTA INTRODUÇÃO Á ALGORITMIA O desenvolvimento de programas para computador está sempre baseado na tarefa de programar um computador para seja resolvido um problema ou executada uma função e assim dar

Leia mais

Introdução à Computação

Introdução à Computação Your Logo Here Prof. Bruno de Jesus bruno.jesus@ic.ufal.br Introdução à Computação Tipos de dados, variáveis e expressões Conteúdo de hoje... Tipos de dados Dados numéricos Inteiro Real Dados literais

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Exame 1 de Fevereiro de 2019 09:00 11:00 1. Usando palavras suas e, no máximo, em cinco linhas responda às seguintes questões. Respostas dadas através de exemplos

Leia mais

ESCOLA SUPERIOR DE TECNOLOGIA DE TOMAR DEPARTAMENTO DE ENGENHARIA INFORMÁTICA 2006/2007

ESCOLA SUPERIOR DE TECNOLOGIA DE TOMAR DEPARTAMENTO DE ENGENHARIA INFORMÁTICA 2006/2007 ESCOLA SUPERIOR DE TECNOLOGIA DE TOMAR DEPARTAMENTO DE ENGENHARIA INFORMÁTICA INTRODUÇÃO À PROGRAMAÇÃO (ENG. INFORMÁTICA) COMPUTADORES E PROGRAMAÇÃO I (ENG. ELECTROTÉCNICA) 2006/2007 TRABALHO PRÁTICO Nº

Leia mais

01/08/2011. Tipos de dados Numéricos Alfanuméricos Lógicos. Numéricos. Tipos de dados. Dados Numéricos Inteiros. Dados Numéricos Reais.

01/08/2011. Tipos de dados Numéricos Alfanuméricos Lógicos. Numéricos. Tipos de dados. Dados Numéricos Inteiros. Dados Numéricos Reais. Engenharia de Controle e Automação Programação I Prof. Ricardo Sobjak ricardo.sobjak@ifsc.edu.br Tipos de dados Numéricos Alfanuméricos Lógicos Tipos de dados Os tipos de dados primitivos ou básicos são

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Primeiro Teste 29 de Março de 2014 09:00 10:30 1. (1.0) O que é um processo computacional? Qual a relação entre um programa e um processo computacional? Um processo

Leia mais

Material Didático Unificado.

Material Didático Unificado. Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Comissão da Disciplina Programação de Computadores I CDPCI Programação de Computadores I BCC701 www.decom.ufop.br/bcc701 Material

Leia mais

Aula 3: Algoritmos: Formalização e Construção

Aula 3: Algoritmos: Formalização e Construção Aula 3: Algoritmos: Formalização e Construção Fernanda Passos Universidade Federal Fluminense Programação de Computadores IV Fernanda Passos (UFF) Algoritmos: Formalização e Pseudo-Código Programação de

Leia mais

Linguagem Haskell. Riocemar S. de Santana

Linguagem Haskell. Riocemar S. de Santana Linguagem Haskell Riocemar S. de Santana Haskell, o que é? É uma linguagem de programação puramente funcional, de propósito geral. Nomeada em homenagem ao matemático americano Haskell B. Curry (1900 1982).

Leia mais

Programação. Folha Prática 5. Lab. 5. Departamento de Informática Universidade da Beira Interior Portugal. Copyright 2010 All rights reserved.

Programação. Folha Prática 5. Lab. 5. Departamento de Informática Universidade da Beira Interior Portugal. Copyright 2010 All rights reserved. Programação Folha Prática 5 Lab. 5 Departamento de Informática Universidade da Beira Interior Portugal Copyright 2010 All rights reserved. 1. Revisão. 2. Objectivos. 3. Exercícios LAB. 5 5ª semana ESTRUTURAS

Leia mais

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição 1 Comando while Deseja-se calcular o valor de: 1 + 2 + 3 +... + N. Observação: não sabemos, a priori, quantos termos

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Primeiro Teste 27 de Outubro de 2012 09:00 10:30 1. (1.0) O que é um processo computacional? Qual a relação entre um programa e um processo computacional? Um processo

Leia mais

Programação de Computadores III

Programação de Computadores III Programação de Computadores III Introdução ao FORTRAN Professor Leandro Augusto Frata Fernandes laffernandes@ic.uff.br Material disponível em http://www.ic.uff.br/~laffernandes/teaching/2013.1/tcc-00.157

Leia mais

Estruturas de Repetição

Estruturas de Repetição Algoritmos e Estruturas de Dados I (DCC/003) Estruturas de Repetição Aula Tópico 4 (while, for) 1 Problema 10 Suponha que soma (+) e subtração (-) são as únicas operações disponíveis em C. Dados dois números

Leia mais

5. Expressões aritméticas

5. Expressões aritméticas 5. Expressões aritméticas 5.1. Conceito de Expressão O conceito de expressão em termos computacionais está intimamente ligado ao conceito de expressão (ou fórmula) matemática, onde um conjunto de variáveis

Leia mais

Algoritmos - 1. Alexandre Diehl. Departamento de Física - UFPel

Algoritmos - 1. Alexandre Diehl. Departamento de Física - UFPel Algoritmos - 1 Alexandre Diehl Departamento de Física - UFPel Conceitos básicos Computador: conceito clássico (até quando????) HARDWARE (partes físicas) SOFTWARE (programas) SCEF 2 Conceitos básicos Computador:

Leia mais

Exercícios Repetição

Exercícios Repetição Curso de Engenharia de Controle e Automação Disciplina: Informática para a Automação Professor: Marcelo Cendron Exercícios Repetição 1.1 8.3 Exercícios 1. Faça um programa utilizando o comando while, que

Leia mais

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 3ª Parte Prof. Sandra Pais Soares

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 3ª Parte Prof. Sandra Pais Soares Curso Profissional de Gestão e Programação de Sistemas Informáticos Programação e Sistemas de Informação Módulo 1 3ª Parte Prof. Sandra Pais Soares Fundamentos de Programação 1. Palavras Reservadas 2.

Leia mais

PROGRAMAÇÃO EM SCHEME:

PROGRAMAÇÃO EM SCHEME: Exercícios para PROGRAMAÇÃO EM SCHEME: Introdução à Programação Utilizando Múltiplos Paradigmas Departamento de Engenharia Informática Instituto Superior Técnico Universidade Técnica de Lisboa 2 Conteúdo

Leia mais

Programação de Computadores III

Programação de Computadores III Programação de Computadores III Introdução ao FORTRAN Professor Hugo de Oliveira Barbalho hbarbalho@ic.uff.br Material produzido pelo professor: Leandro Augusto Frata Fernandes (laffernandes@ic.uff.br)

Leia mais

Aula 03 - Introdução ao Scilab (p2)

Aula 03 - Introdução ao Scilab (p2) BCC701- Programação de Computadores I Aula 03 - Introdução ao Scilab (p2) Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM http://www.decom.ufop.br/bcc701 BCC701-2019-01 DECOM

Leia mais

Algoritmos Computacionais

Algoritmos Computacionais Material produzido por professores da UFABC Objetivos Aprender a sintaxe e a semântica de instruções de saída e de entrada de dados na linguagem PORTUGOL Aprender alguns operadores pra uso na parte de

Leia mais

Programação Procedimental

Programação Procedimental Programação Procedimental Maria Adriana Vidigal de Lima Universidade Federal de Uberlândia - 2013 1 Escrita de Algoritmos 1.1 Técnicas de Programação e Algoritmos Na elaboração de programas maiores e complexos

Leia mais

CAPÍTULO 4 - OPERADORES E EXPRESSÕES

CAPÍTULO 4 - OPERADORES E EXPRESSÕES CAPÍTULO 4 - OPERADORES E EXPRESSÕES 4.1 - OPERADORES ARITMÉTICOS Os operadores aritméticos nos permitem fazer as operações matemáticas básicas, usadas no cálculo de expressões aritméticas. A notação usada

Leia mais

CAPÍTULO 2 PROGRAMAÇÃO IMPERATIVA: a Linguagem Pascal

CAPÍTULO 2 PROGRAMAÇÃO IMPERATIVA: a Linguagem Pascal Métodos de Programação I Departamento de Matemática, FCTUC 16 CAPÍTULO 2 PROGRAMAÇÃO IMPERATIVA: a Linguagem Pascal 2.1 Programação: Conceitos Fundamentais 2.1.1 Fases de construção de um programa executável

Leia mais

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA SUMÁRIO Introdução Conceitos básicos Formato básico Tipos primitivos Variáveis Constantes Operadores Operações

Leia mais

Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701

Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701 Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701 www.decom.ufop.br/red AULA TEÓRICA 02 1 Prof. Marcelo Luiz Silva Red CONTEÚDOS DA AULA

Leia mais

- Aula 01, 02, 03 e 04 Apresentação da disciplina.

- Aula 01, 02, 03 e 04 Apresentação da disciplina. 1 - Aula 01, 02, 03 e 04 Apresentação da disciplina. Disciplina: Algoritmos (Disciplina é pré-requisito para outras disciplinas). Plano de Ensino: Estrutura Sequencial, Estrutura de Decisão (Desvio Condicional

Leia mais

Engenharia de Software

Engenharia de Software Sumário Engenharia de Software Modelos de desenvolvimento de software Fases de desenvolvimento Programação modular Abordagem top-down e bottom-up Linguagens de programação: Compilação / Interpretação Aplicação

Leia mais

ALGORITMOS 3ª Aula. 3. Introdução Tipos de dados, variáveis e operadores Tipos de dados

ALGORITMOS 3ª Aula. 3. Introdução Tipos de dados, variáveis e operadores Tipos de dados 3. Introdução Segundo alguns especialistas, qualquer programa de computador pode ser escrito utilizando apenas três estruturas básicas: Seqüência, Condição e Repetição. Isto significa que, na construção

Leia mais

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO Dados em Algoritmos Quando escrevemos nossos programas, trabalhamos com: Dados que nós fornecemos ao programa Dados

Leia mais

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR Medida do Tempo de Execução de um Programa David Menotti Algoritmos e Estruturas de Dados II DInf UFPR Classes de Comportamento Assintótico Se f é uma função de complexidade para um algoritmo F, então

Leia mais

CURSO SUPERIOR DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS DISCIPLINA : INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO ASSUNTO: ALGORITMOS

CURSO SUPERIOR DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS DISCIPLINA : INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO ASSUNTO: ALGORITMOS CURSO SUPERIOR DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS DISCIPLINA : INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO ASSUNTO: ALGORITMOS PROFESSOR : Romilson Lopes Sampaio Introdução a Lógica de Programação

Leia mais

Conceitos Básicos de Programação

Conceitos Básicos de Programação BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de

Leia mais

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012 Capítulo 5: Repetições Waldemar Celes e Roberto Ierusalimschy 29 de Fevereiro de 2012 1 Construção de laços Uma das principais características de um computador é sua capacidade para realizar cálculo e

Leia mais

Computação e Programação Exame Época de recurso

Computação e Programação Exame Época de recurso Nome : Número : Computação e Programação 2013-2014 Mestrado Integrado em Engenharia Civil Licenciatura Bolonha em Engenharia Geológica e de Minas DECivil Exame Época de recurso 29 de Janeiro de 2014 v

Leia mais

Variáveis e Memória. Revisão. Conceitos. Operações sobre a memória

Variáveis e Memória. Revisão. Conceitos. Operações sobre a memória Variáveis e Memória Revisão Estudamos, na Introdução, que os programas de computador implementam algoritmos, os quais manipulam um conjunto de dados para produzir um resultado. O algoritmo é um conjunto

Leia mais

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2 Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas Aula Tópico 2 1 Problema 3 Exibir o maior número inteiro que pode ser representado no computador. 2 Qual o maior número inteiro? Para o compilador

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Segundo Teste 18 de Janeiro de 2013 09:00 10:30 1. (2.0) Escolha a única resposta incorrecta para as seguintes questões. Cada resposta certa vale 1 valor e cada resposta

Leia mais

Apêndice A. Pseudo-Linguagem

Apêndice A. Pseudo-Linguagem Apêndice A. Pseudo-Linguagem Apostila de Programação I A.1 Considerações Preliminares Os computadores convencionais se baseiam no conceito de uma memória principal que consiste de células elementares,

Leia mais

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Programação em C Variáveis e Expressões DCA0800 Algoritmos e Lógica de Programação Heitor Medeiros Florencio

Leia mais

Material Didático Unificado. Variáveis correspondem a nomes para endereços de memória que são gerenciados pelo Scilab.

Material Didático Unificado. Variáveis correspondem a nomes para endereços de memória que são gerenciados pelo Scilab. Universidade Federal de Ouro Preto -UFOP Departamento de Computação - DECOM Comissão da Disciplina Programação de Computadores I CDPCI Programação de Computadores I BCC701 www.decom.ufop.br/bcc701 Material

Leia mais

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013 Linguagem Haskell Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação Tiago Carneiro 19 Agosto 2013 1 1 Linguagem Haskell Linguagem de programação funcional É um paradigma de programação

Leia mais

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados Métodos Computacionais Operadores, Expressões Aritméticas e Entrada/Saída de Dados Tópicos da Aula Hoje aprenderemos a escrever um programa em C que pode realizar cálculos Conceito de expressão Tipos de

Leia mais

Recursividade. Objetivos do módulo. O que é recursividade

Recursividade. Objetivos do módulo. O que é recursividade Recursividade Objetivos do módulo Discutir o conceito de recursividade Mostrar exemplos de situações onde recursividade é importante Discutir a diferença entre recursividade e iteração O que é recursividade

Leia mais

Introdução à Ciência da Computação (ICC) PROVA P2 Sexta-feira 1 de Junho de 2001

Introdução à Ciência da Computação (ICC) PROVA P2 Sexta-feira 1 de Junho de 2001 Introdução à Ciência da Computação (ICC) 2001.1 PROVA P2 Sexta-feira 1 de Junho de 2001 Nome do Aluno: Matrícula PUC: Questões P2 Revisão 1 (1.5) 2 (1.5) 3a (1.0) 3b (1.0) 3c (1.0) 3d (1.0) 4 (2.0) Prova

Leia mais

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira Algoritmos e Estrutura de Dados Aula 3 Conceitos Básicos de Algoritmos Prof. Tiago A. E. Ferreira Definição de Algoritmo Informalmente... Um Algoritmo é qualquer procedimento computacional bem definido

Leia mais

Fundamentos de Programação

Fundamentos de Programação Licenciatura em Engenharia Informática e de Computadores Fundamentos de Programação Trabalho para casa 22 de Setembro de 2008 Este trabalho corresponde à instalação, no seu computador, do interpretador

Leia mais

Oficina de Introdução de Programação usando Linguagem Python Prof. Ms. Perini

Oficina de Introdução de Programação usando Linguagem Python Prof. Ms. Perini Oficina de Introdução de Programação usando Linguagem Python Prof. Ms. Perini Apresentação do Professor Professor: José Carlos Perini E-mail: jose.perini@metrocamp.edu.br Blog: http://profperini.com Formação

Leia mais

Programação de Computadores:

Programação de Computadores: Instituto de C Programação de Computadores: Introdução ao FORTRAN Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com Introdução ao FORTRAN Cinco aspectos

Leia mais

Linguagem de Programação I Prof. Tiago Eugenio de Melo.

Linguagem de Programação I Prof. Tiago Eugenio de Melo. Linguagem de Programação I Prof. Tiago Eugenio de Melo tmelo@uea.edu.br www.tiagodemelo.info 1 Sumário Introdução Conceitos preliminares Introdução Variáveis Comandos Condicionais 2 Por que aprender a

Leia mais

Técnicas de análise de algoritmos

Técnicas de análise de algoritmos CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS Técnicas de análise de algoritmos Algoritmos e Estruturas de Dados I Natália Batista https://sites.google.com/site/nataliacefetmg/ nataliabatista@decom.cefetmg.br

Leia mais

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO TEORIA DA COMPUTAÇÃO Aula 03 Programas (Monolítico e Iterativo) Prof.ª Danielle Casillo Programas, Máquinas e Computações Diferentes

Leia mais

2.2.5 EXPRESSÕES - Regras para o cálculo de valores

2.2.5 EXPRESSÕES - Regras para o cálculo de valores Métodos de Programação I Departamento de Matemática, FCTUC 30 2.2.5 EXPRESSÕES - Regras para o cálculo de valores As expressões fornecidas ao computador, quer tenham variáveis, constantes ou apenas literais,

Leia mais

Oficina de Python Prof. Me. José Carlos Perini

Oficina de Python Prof. Me. José Carlos Perini Oficina de Python Prof. Me. José Carlos Perini Prof. José Carlos Perini Formação em Análise de Sistemas Univ. S. Francisco Pós em Administração Universidade S. Francisco Mestrado em Ciência da Computação

Leia mais

Instruções de repetição

Instruções de repetição Folha Prática Instruções de repetição 1 Instruções de repetição Repetição (e componentes associadas a qualquer repetição: inicialização, teste da condição de paragem e actualização) Repetição com teste

Leia mais

Oficina: Programação para Android com o App Inventor. Profª. Alana Gama Licencianda em Ciências da Computação IF Baiano Campus Senhor do Bonfim

Oficina: Programação para Android com o App Inventor. Profª. Alana Gama Licencianda em Ciências da Computação IF Baiano Campus Senhor do Bonfim Oficina: Programação para Android com o App Inventor Profª. Alana Gama Licencianda em Ciências da Computação IF Baiano Campus Senhor do Bonfim Desenvolver o quinto Item da lista (Programação) Testa uma

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Segundo Teste 9 de Junho de 2012 9:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 6 páginas com 12 perguntas. A cotação de cada pergunta está assinalada entre

Leia mais

Introdução ao Curso. Área de Teoria DCC/UFMG 2019/01. Introdução à Lógica Computacional Introdução ao Curso Área de Teoria DCC/UFMG /01 1 / 22

Introdução ao Curso. Área de Teoria DCC/UFMG 2019/01. Introdução à Lógica Computacional Introdução ao Curso Área de Teoria DCC/UFMG /01 1 / 22 Introdução ao Curso Área de Teoria DCC/UFMG Introdução à Lógica Computacional 2019/01 Introdução à Lógica Computacional Introdução ao Curso Área de Teoria DCC/UFMG - 2019/01 1 / 22 Introdução: O que é

Leia mais

Oficina de Python Prof. Me. José Carlos Perini

Oficina de Python Prof. Me. José Carlos Perini Oficina de Python Prof. Me. José Carlos Perini Prof. José Carlos Perini Formação em Análise de Sistemas Univ. S. Francisco Pós em Administração Universidade S. Francisco Mestrado em Ciência da Computação

Leia mais

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 2ª Parte Prof. Sandra Pais Soares

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 2ª Parte Prof. Sandra Pais Soares Curso Profissional de Gestão e Programação de Sistemas Informáticos Programação e Sistemas de Informação Módulo 1 2ª Parte Prof. Sandra Pais Soares Introdução à Lógica de Programação A elaboração de um

Leia mais

APONTAMENTOS DE PASCAL

APONTAMENTOS DE PASCAL APONTAMENTOS DE PASCAL PROGRAMAÇÃO DE COMPUTADORES 1º ANO DA LICENCIATURA EM ENGENHARIA MECÂNICA 2000 Luisa Costa Sousa 1 ÍNDICE: 1 INTRODUÇÃO 3 1.1 A estrutura do algoritmo e do respectivo programa 4

Leia mais

Algoritmos e Estruturas de Dados I

Algoritmos e Estruturas de Dados I Algoritmos e Estruturas de Dados I Conceitos Básicos Profa. Márcia Cristina Moraes Profa.Milene Selbach Silveira Material para estudo: Forbellone, A. e Eberspächer, H. (2005) capítulos 1 e 2 (até atribuição)

Leia mais

Computação e Programação

Computação e Programação Computação e Programação MEMec, LEAN - º Semestre 205-206 Expressões Relacionais Estruturas de Selecção Simples Genéricas Aula Teórica 5 D.E.M. Área Científica de Controlo Automação e Informática Industrial

Leia mais