! " # $ %! ! & ! " ' # % $ ) % &' &' &' &' % ' * $ ,% - % +% % % % 0+% 0 $ % ) % . +% ' % % +% $ . % % ( / ( % ' , . ( 2 &' 1 % ! ( ( ! ( " 2 3 4 % ( / 2! $ 4 % ) 0 % $ 5 % $ % % % " 3 4 % % . % /4 7 5 % / (% % $5( ( ) $ / #260( / . 2$ ! % $ #% $ algorithms and software Principles $ % / $ " . ! ) " *! ' ( + " , - % + .# / ' , ) ! & 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 2 ! " # ' +! )0! 1 ' +1 % ! # ' ! ! "0! 2- Primeiro exemplo ........................................................................................... 41 Outro exemplo de Algoritmo em pseudocódigo............................................. 42 Exemplos de implementações em linguagens de programação...................... 42 O conceito de subprograma ............................................................................ 44 O Conceito de variavel Local e Global .......................................................... 45 Procedimentos ................................................................................................ 45 Funções........................................................................................................... 47 Passagem de parãmetros por referência.......................................................... 49 Recursividade ................................................................................................. 50 Tipos de dados Variaáveis e Expressões ........................................................ 50 Operadores Aritméticos.................................................................................. 51 Operadores relacionais ................................................................................... 52 Operadores Boleanos...................................................................................... 52 Ficheiros de Texto .......................................................................................... 53 ! % 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 ! Forma geral de um algoritmo em pseudocódigo ............................................ 29 Entrada de dados............................................................................................. 33 Saída de dados ................................................................................................ 34 Estruturas de controlo de fluxo....................................................................... 35 Estruturas de sequência .................................................................................. 35 Estruturas de Decisão ..................................................................................... 36 Estruturas de Decisão Simples ....................................................................... 36 Estruturas de Decisão Múltipla ...................................................................... 37 Estruturas de Repetição ou Loop.................................................................... 38 Ciclos contados............................................................................................... 38 Ciclos Enquanto.............................................................................................. 39 Ciclos Repetir … Até que (cond) ................................................................... 40 /' # ! !"' 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 & ' #' % ! # ' ! # ' ) 11 Forma Geral de um programa em C ............................................................... 55 Declaração e inicialização de variaveis e constantes...................................... 55 Expressões em C............................................................................................. 55 Implementação de estruturas de controlo de fluxo......................................... 55 Leitura(input) e Escrita(output) de dados....................................................... 55 Funções, argumentos e passagem de parâmetros ........................................... 55 Exemplos de programas em C ........................................................................ 55 Arrays, Matrizes e Strings .............................................................................. 64 Ponteiros ......................................................................................................... 79 4 ! " 5.10 Estruturas avançadas de dados – Estruturas e uniões; Enumerações e tipos definidos pelo utilizador ............................................................................................. 81 5.11 Ficheiros de Texto em C, Rapor e VisualAlg................................................. 81 ! 6.1 % & 3 4, Pesquisa .......................................................................................................... 83 & 3 3 & 3 6.2 " # # 42 ( 5 4 Ordenação....................................................................................................... 93 6 ((# ! 7, % #"% 77 -8+ 9# # -81 : "; -87 Complexidade do Quicksort ..................................................................................... 109 7.1 Filas, Listas e Pilhas ........................................ Erro! Marcador não definido. 4 7 / "" 6 (# ! # ' " ' "5# "# = '< " --1+ 5 ! - % ! # " ' 8% - - $ , &' % . /% 9 ( , -% % % % ( ( : ) ;( &' 1 1 % , % ) . >' # ' /" < ' ! 3 ?" < 3 % % ! ' ( 9 '(@ ! %A " !% ,% ( % 1 ! $ % ; =3 8 % %,% 0+% -% % @ % / >( ! $ ? -% >/ / ( ' $ %,% - : ( * % ; )% B>' " ! $! ' #! : % ! ' ( % 1 ) . 6 % % A 8 % : % . B , ' ' < % ) -1 ' # ( 1 &A ; % ' % 8 % ( . ( &A <=$4 ;. % % 1 ( % 8 < % % ! % ( % , @ ( 1 &' % : &' . ( ,% ! . . 0 . < % % < 3 . < ' < " ' ! ' %A " C " ' ! $ 6 " $ (C " 5$ B "' " " " ! (C " # ! B ' % ( ( % % ( , &' . # % * " $ ( . % % &A 1 . ) ( & & ( % % %+ % & % % 1 . )% % 1 %+ % ' 3 # 3 #! ! 1 - 9 % %&' ( - ' # ' % ( "% C . B < % 1 ( ( &A . 0 ) &A 1 ( 8 4 ( 1 ( 9 &' 1 % . ( 1 ( % ,% 9 &' ,% ( 4 % % % % $ . ( % ! % 1 % < ' %&' ( ( 1 % & ' !# * % 1 . ) ' % 8 % &' % 1 &' . LINGUAGEM DE DESCRIÇÃO DE ALGORITMICA (LDA) % - ) % ( % ( D % ( E % . 7 1 ' ) &' &A ! " Estrutura um Algoritmo Algoritmo Nome_Do_Algoritmo variáveis Declaração das variáveis Procedimentos Declaração dos procedimentos Funções Declaração das funções Início Corpo do Algoritmo Fim Identificadores F % $ % &A ( , ( % ( G 1. O primeiro caracter deve ser uma letra 2. Os nomes devem ser formados por caracteres pertencentes ao seguinte conjunto : {a,b,c,..z,A,B,C,...Z,0,1,2,...,9,_} 3. Os nomes escolhidos devem explicitar seu conteúdo. Variáveis: B ,% &A &' . 9 , ( ( ( % G INTEIRO : qualquer número inteiro, negativo, nulo ou positivo. REAL : qualquer número real, negativo, nulo ou positivo. CARACTER : qualquer conjunto de caracteres alfanuméricos. LÓGICO : tipo especial de variável que armazena apenas os valores V e F, onde V representa VERDADE e F FALSO Declaração de variáveis &' 1 9 ( , ( % )G 8 , % % ! H , " (... G Operações Básicas: &' , - $ % % • % 8 , 1 ( 6F ( F6#G OPERADOR DE ATRIBUIÇÃO: NomeDaVariavel ← Valor ou Expressão Atribuída. • OPERADORES ARITMÉTICOS: + = Adição * = Multiplicação - = Subtração ou inversor do sinal. / = Divisão Quociente = Quociente da divisão de inteiros Resto = Resto da divisão de inteiros EXP(a,b) = Exponenciação ab • FUNÇÕES PRIMITIVAS: SEN(x); COS(x); TG(x); ABS(x); INT(x); Raiz(x); PI( ); • OPERADORES RELACIONAIS: #' * % :H = - igual < - menor ≤ - menor ou igual • % , ;( ) A ( G ≠ - diferente > - maior ≥ - maior ou igual OPERADORES LÓGICOS: #' ) A * % ( G e - e lógico ou conjunção. ou - ou lógico ou disjunção. não - negação. PRIORIDADE DE OPERADORES: ) % &' - % , 1 ) ' 1 ) +% ( % ' , % . 9 , ( ! " &' G 1º - Efectuar operações embutidas em parênteses "mais internos" 2º - Efectuar Funções 3º - Efectuar multiplicação e/ou divisão 4º - Efectuar adição e/ou subtracção 5º - Operadores Relacionais 6º - Operadores Lógicos ?#G % , &A ( ( % 1 ( &' % 9 ( % . COMANDOS DE ENTRADA E SAÍDA: - % % ,1 &A ( % 9 ( 1 ( 1 ( 9 % 9 : % (...;( ( +% ' % ( &' ( % ( ( 1 ) %9% ( % &' 8( &' % 6 #9 . Comando de Entrada de Dados Leia(variável_1, variável_2,...) Comando de Saída de Dados Imprima(expressão_1, expressão_2,...) COMANDOS DE CONTROLE DE FLUXO: &' % 8 ( ) D % )% % 8 % &' F 1 % . 6 6 1 ( &' ( &A % # % % 9 % % % &' . 10 &A &' ' G #1+% ( ! #6IBJ 0/ G 1 )% ' B % ( )% % 1+% , % " /9 % % ( $ ( . 1 . Inicio Comando_1 ... Comando_n Fim #6K60LM G % A ( % % % % 8 ) % &' &' ( . Simples Se (Expressão Lógica) Então Sequência_1 F6 62/ LM . 6) Composta Se (Expressão Lógica) Então Sequência_1 Senão Sequência_2 G # + % % ,% &A ( 8 %&A . Enquanto (Expressão Lógica) faça Sequência O comando Enquanto analisa a Expressão Lógica e enquanto o seu resultado for, o valor lógico, Verdade a Sequência é executada. Para variável ← valor_inicial até O comando Para incrementa, a variável, a partir do valor_inicial de uma unidade, até que, esta atinja o valor_final faça valor_final. E para cada incremento a Sequência é Sequência executada.. O comando Repita executa a Sequência até que o valor Repita Sequência retornado pela Expressão Lógica seja Verdadeiro Até (Expressão Lógica) TIPOS DE DADOS 6 % 8 . 11 , ( ! H602 FD % :$ :6 , % ;. % : ( - ( % 0 1 % E ) % % % 8 ; &' " ( ( ...;( $ - &' % % : E 9 % ;. : ;( . Declaração : NomeDoVector : vetor[nº de elementos] de Tipo do Vector Referência : NomeDoVector[índice] ! 2F/ NG $ % A . ( ( 1 ( +% % 9 % 1 A . Declaração : NomeDaMatriz : matriz[dimensões] de Tipo da Matriz Referência : NomeDaMatriz[índices] F6O/ #2F G % :P - 8 , ( 1 ;( * . Declaração : NomeDoRegistro : Registro Declaração de Variáveis FimRegistro Referênca : NomeDoRegistro.NomeDaVariável Obs: Podemos ainda definir um vector formado por registros. MODULARIZAÇÃO ' ! # E% * ( % ( - ( < %* % %* ' % 1 < . * % . 12 &' ( 1 ( 8 ,1 , ( &A % % 1 ' G ! & " !' % 0 < B &$ 1 % % - - ( % " %* % % +% D % %* 1 - . 1 D . Declaração : Procedimento NomeDoProcedimento [(parâmetros)] Variáveis Inicio Comandos; Fim; ( D % , . ; D 6 2F 6 2F #Q G 6 2F : % D D % 6 2F 6 2F : + % ;. ' 9 1 #Q D ( 1 #Q % 8 % % 1 HF &' . Referência : NomeDoProcedimento(variáveis) ?#G , D % % D . %A % % , % % , . < B &' - ( - ' % $ % ( ( % &$ ( &' ( 1 Declaração : Função NomeDaFunção [(parâmetros)] : tipo_da_função Variáveis Inicio Comandos NomeDaFunção ← (expressão de retorno) Fim; Referência : NomeDaFunção(parâmetro) 13 ( . 1 ( ! B .# / ' &' ,% ,% % 1 % &' % % 1 % 1 ( 1 1 " A . % , ( - % &' &A +< ( ,% ( % ) % &' % $ ! . >' ! ' ' #=" ! ! < ' ! ' ' 1 % ! " " ! 1 % %+% % . % % * % - &' 8% B # ( -% % 1 9% * % % 9 . + Modelo de memória de uma linguagem de programação de alto nível B 1 % % &' % , * 9 G P # %3 H O 14 % 0( ( ! / &A 6 P % ( 0( % % % , . ; & % ( . ' %: 1 % &' ;. 6 D % % ' % . I 6 % - % % % * % ( , &. . 1 1 D ( P %3 . * ( . , : A % * &A G & %+ - , ' % - & & &( R. I 8 , ' & - . # % & 1 : % % & & P " % & % ;. LINGUAGEM DE DESCRIÇÃO DE ALGORITMO (LDA) Para escrevermos algoritmos é preciso uma linguagem clara e que não deixe margem a ambiguidades, para isto, devemos definir uma sintaxe e uma semântica, de forma a permitir uma única interpretação das instruções num algoritmo. Estrutura um Algoritmo Algoritmo Nome_Do_Algoritmo variáveis Declaração das variáveis Procedimentos Declaração dos procedimentos 15 ! " Funções Declaração das funções Início Corpo do Algoritmo Fim Identificadores Representam os nomes escolhidos para rotular as variáveis, procedimentos e funções, normalmente, obedecem as seguintes regras : 4. O primeiro caracter deve ser uma letra 5. Os nomes devem ser formados por caracteres pertencentes ao seguinte conjunto : {a,b,c,..z,A,B,C,...Z,0,1,2,...,9,_} 6. Os nomes escolhidos devem explicitar seu conteúdo. Variáveis: Unidades básicas de armazenamento das informações a nível de linguagens de programação. Os tipos de dados e variáveis utilizados dependem da finalidade dos algoritmos, mas, podemos definir alguns, pelo fato de serem largamente utilizados e implementados na maioria das linguagens, sendo estes: INTEIRO : qualquer número inteiro, negativo, nulo ou positivo. REAL : qualquer número real, negativo, nulo ou positivo. CARACTER : qualquer conjunto de caracteres alfanuméricos. LÓGICO : tipo especial de variável que armazena apenas os valores V e F, onde V representa VERDADE e F FALSO Declaração de variáveis Para que os programas manipulem valores, estes devem ser armazenados em variáveis e para isso, devemos declará-las de acordo com a sintaxe: NomeVariável,... : tipo Operações Básicas: Na solução da grande maioria dos problemas é necessário que as variáveis tenham seus valores consultados ou alterados e, para isto, devemos definir um conjunto de OPERADORES, sendo eles: • OPERADOR DE ATRIBUIÇÃO: NomeDaVariavel ← Valor ou Expressão Atribuída. 16 ! • OPERADORES ARITMÉTICOS: + = Adição * = Multiplicação - = Subtração ou inversor do sinal. / = Divisão • " Quociente = Quociente da divisão de inteiros Resto = Resto da divisão de inteiros EXP(a,b) = Exponenciação ab FUNÇÕES PRIMITIVAS: SEN(x); COS(x); TG(x); ABS(x); INT(x); Raiz(x); PI( ); • OPERADORES RELACIONAIS: São utilizados para relacionar variáveis ou expressões, resultando num valor lógico (Verdadeiro ou Falso), sendo eles: = - igual < - menor ≤ - menor ou igual ≠ - diferente > - maior ≥ - maior ou igual • OPERADORES LÓGICOS: São utilizados para avaliar expressões lógicas, sendo eles: e - e lógico ou conjunção. ou - ou lógico ou disjunção. não - negação. PRIORIDADE DE OPERADORES: Durante a execução de uma expressão que envolve vários operadores, é necessário a existência de prioridades, caso contrário poderemos obter valores que não representam o resultado esperado. A maioria das linguagens de programação utiliza as seguintes prioridades de operadores : 1º - Efetuar operações embutidas em parênteses "mais internos" 2º - Efetuar Funções 3º - Efetuar multiplicação e/ou divisão 4º - Efetuar adição e/ou subtração 5º - Operadores Relacionais 6º - Operadores Lógicos OBS: O programador tem plena liberdade para incluir novas variáveis, operadores ou funções para adaptar o algoritmo as suas necessidades, lembrando sempre, de que, estes devem ser compatíveis com a linguagem de programação a ser utilizada. 17 ! " COMANDOS DE ENTRADA E SAÍDA : No algoritmo é preciso representar a troca de informações que ocorrerá entre o mundo da máquina e o nosso mundo, para isso, devemos utilizar comandos de entrada e saída, sendo que, a nível de algoritmo esses comandos representam apenas a entrada e a saída da informação, independe do dispositivo utilizado (teclado, discos, impressora, monitor,...), mas, sabemos que nas linguagens de programação essa independência não existe, ou seja, nas linguagens de programação temos comandos específicos para cada tipo de unidade de Entrada/Saída. Comando de Entrada de Dados Leia(variável_1, variável_2,...) Comando de Saída de Dados Imprima(expressão_1, expressão_2,...) COMANDOS DE CONTROLE DE FLUXO: Para representar a solução de um problema devemos escrever o conjunto de passos a serem seguidos, sendo que, a maioria dos problemas exigem uma dinâmica na sua solução, impondo assim que os algoritmos executem conjunto de instruções de acordo com as possíveis situações encontradas no problema original. E de acordo com a Programação Estruturada os mecanismos utilizados para esse controle são : Sequência, Seleção e Repetição. • SEQUÊNCIA : usada para executar comandos passo a passo, sabendo que todos eles serão executados na ordem de escrita, sem nenhum desvio. Uma sequência pode possuir um ou vários comandos, os quais devem ser delimitados pelos identificadores Início e Fim. Inicio Comando_1 ... Comando_n Fim • SELEÇÃO : usada para tomar decisões, ou seja desviar a execução do algoritmo de acordo com uma condição, podendo ser simples ou composta. Simples Se (Expressão Lógica) Então Sequência_1 Composta Se (Expressão Lógica) Então Sequência_1 Senão Sequência_2 18 ! • " REPETIÇÃO : Serve para efetuar um conjunto de ações repetidas vezes. Existem três tipos básicos de repetições, sendo elas. Enquanto (Expressão Lógica) faça Sequência O comando Enquanto analisa a Expressão Lógica e enquanto o seu resultado for, o valor lógico, Verdade a Sequência é executada. Para variável ← valor_inicial até O comando Para incrementa, a variável, a partir do valor_inicial de uma unidade, até que, esta atinja o valor_final faça valor_final. E para cada incremento a Sequência é Sequência executada.. O comando Repita executa a Sequência até que o valor Repita Sequência retornado pela Expressão Lógica seja Verdadeiro Até (Expressão Lógica) TIPOS DE DADOS Estruturas formadas por um conjunto de variáveis, permitindo modelar de forma mais natural os dados. VETOR: estrutura formada por um conjunto unidimensional de dados de mesmo tipo (homogêneo) e possuindo número fixo de elementos (Estático). Na declaração dos vetores devemos informar o seu nome, seu tipo (inteiro, real, caracter, ...), e seu tamanho (número de elementos). Cada elemento do vetor é identificado por um índice (unidimensional), o qual indica a sua posição no vetor. Declaração : NomeDoVetor : vetor[nº de elementos] de Tipo do Vetor Referência : NomeDoVetor[índice] MATRIZ: estrutura semelhante ao vetor, sendo que, pode possuir n dimensões. Desta forma para fazer referência aos elementos de uma matriz, precisaremos de tantos índices quanto for suas dimensões. Declaração : NomeDaMatriz : matriz[dimensões] de Tipo da Matriz Referência : NomeDaMatriz[índices] REGISTRO: estrutura formada por um conjunto de variáveis, que podem possuir tipos diferentes (Heterogêneo), agrupadas em uma só unidade. Declaração : NomeDoRegistro : Registro 19 ! " Declaração de Variáveis FimRegistro Referênca : NomeDoRegistro.NomeDaVariável Obs: Podemos ainda definir um vetor formado por registros. MODULARIZAÇÃO A modularização consiste num método para facilitar a construção de grandes programas, através de sua divisão em pequenas etapas, que são : módulos, rotinas, subrotinas ou sub-programas. Permitindo o reaproveitamento de código, já que podemos utilizar um módulo quantas vezes for necessário, eliminando assim a necessidade de escrever o mesmo código em situações repetitivas. Procedimentos - Um procedimento é um bloco de código precedido de um cabeçalho que contém o Nome do procedimento e seus parâmetros. Com isto, podemos fazer referência ao bloco de código de qualquer ponto do algoritmo através do seu nome e passando os seus parâmetros. Declaração : Procedimento NomeDoProcedimento [(parâmetros)] Variáveis Inicio Comandos; Fim; Onde, parâmetros representam as variáveis que devem ser passadas ao procedimento. Os parâmetros podem ser de : ENTRADA (passado por valor) ou de ENTRADA/SAÍDA (passado por referência). Os parâmetros de ENTRADA não podem ser alterados pelo procedimento, para que isso seja possível o parâmetro deve ser de ENTRADA/SAÍDA Para indicar que um parâmetro é de ENTRADA/SAÍDA devemos colocar a palavra VAR antes da sua declaração. Referência : NomeDoProcedimento(variáveis) OBS: As variáveis passadas aos procedimentos são associadas aos parâmetros do procedimento de acordo com a ordem das variáveis e da lista de parâmetros. Funções - Uma função é semelhante a um procedimento, sendo que esta deve retornar, obrigatoriamente, um valor em seu nome, desta forma, é necessário declarar, no cabeçalho da função, qual o seu tipo. Declaração : Função NomeDaFunção [(parâmetros)] : tipo_da_função Variáveis Inicio 20 ! " Comandos NomeDaFunção ← (expressão de retorno) Fim; Referência : NomeDaFunção(parâmetro) 6 # = .# / % % % . ' B ) 9% ( 9 // 0/ % ( /% (% #62 #( 1 ) % % 1 % - S . B 1 1 % 9 % R ) E % G@ % R >@ U@ O T . %D &A @ U@ V<RW @ 21 . 9 F 06## !6 2 ( 6) - %D - % ( % G / !( % %+% ! @' " 1 % , ' . . ! 6 #9 % ( . 6) U6#0F6H6F > 6#2FB2BF # 60/ #M ( 1 % ' #/ ! 9 ) % $ * 1 ( K6F > % '. % 6 " #/ ! ' '. 6 E 22 . . 6 M 2 9 . ( ! B % % &' P ), .6 0/ 0K # % 9 . B " + ) 1 ) % 1 % %% 1 %% . 2 1 - ) ) &' )% 1 % . %% % %% ( &' ( K % % 2 ( ) % %% I 6 IB ' ) 1 % % ( %% ' % %% 1 - )% :% ' % % .# %% )% - F -1 :% % ; 23 &' % % F6 62/ F X 2CIB6:% % &' . 61 % ' &' ; -% 1 )% 1 &' %% % %% * - )% % %% % . ( ;( ! ! 9 ( % 1 B " % G % %D % U B %$ ? ) , % , %D % 0 : + 9 % 0 % % % ;. +% % % &A . 24 1 ! 2 ) " @ " 8 % , #9 9 ,% ! =" ! % Y, % F $ &' G 1 1 ) 1 " 1 " G - 9 1 , -% . 9 ) %$ % ,% 9 - .. . 25 % ! 9 - ) " % 9 . % A . 9 &' , ) . 6 , , - % &' . 9 - E 8 , 5 ) % &' . , < $ . C 1 1 ) % &' . 6 % ) . ( ) < E % , 1 . ! ) % 1 % % , ) , ) % - . 6 " , # $ ( % ) % &' . @ '( # 6 S#5 9 Z 4T ' F % 1 ' 8 8 % G ( % 9 &' - , % % % 1 . ) 26 % ( % % , % 1 . ! , % >% [( % > &' ". K < &' @ ) V< )W R@ 1 &' - ,% . @ ) " % )WR@ . 6 % 9 @ # ) )WR@ - , . @ '( # ! ) # # 6 9 - % ,% ;. : % 9 %$ S &A : T - - ) \ % % %$ G 6 9 I - . 9 8 S T - )% 1 ( 1 % % , %$ ' G ! 0 % % %$ 1 E 1 . S % % ' ) : #" % ; 9 8 % . ) :/ F " - % % ) ! ;. E % % '. 1 T. C ;. 6 T F #"% G - ) ) 0 %&' - % % ;. F % % S +% 9 ' * % ) 1 A , , ' % :2 $ % 27 % ) A . 6 ! &' ) , ) % $ 1 - ' . #F""# G 1+% %% 9 % %% . ' ; % I " F &' %% : -1 ' 1 % &' ) % &' ) ; 28 ' % 1 . % % ! ) " ! & %* ! "0! & - 1 ! # -% : 1 ( % % $ ' % 1 ; ( % $ % &' . C( % %* ( ( ' ] " ) % ( )% < :% ) ; . %+% % &' %* ) +< 1 ( 1 : 1 ;. 6 % %* ( ? #/ 0( 1 %* 9 $ % : / 8%&' 9 +( % - . ' ) % $ < ;. #! ' # ' ' ! "0! &' H % 6 &' 9 % - H &A G - 9 ' %* &' &' ( % $ % % % % @ @ . 2 -% % . H ' $, % ^ 0;( ( % U % _ $ G 3 % % % % % 9 % ( % %9% &' ( % K :1 % 0. 2 - ) % % 29 ' % % . ! . ' 9 ( ' $, 0$ :;( :;( 0 % H ( 5:; % <%$ / %:;( #1 :;( &' % H * % ' - :;( A ( % ( H % . G ' .. )% &' $ / .. ( % " - % % .. ' .. ?, % %. % . % $ % . %* /% ,% ' %* @ % ( E% , $ ( ( E% <%$ ( % 0 , - G @ &' G G G # %&' % &A % # %&' 0 $ -% <%$ . 6 8 , : A ;. % &' %$ , ( 1 % - E $ $ , $ 1 G 9 ( - % - < % ( 1 <%$ %* - 1 %&' % % H %&' 1 % % . % .6 ) ) . H % % @ @( % , ( ' - % , G 1 1 $ . ' $ G1 30 ) ! 8 % % , ,% & ( 1 % " , $ ( % @@ . 2 6 + - G ( <%$ % 1 ( % H % 1 % * % ' : : ;. 1 ' + &' ;G G % , ( % % , -% ( 8( % % . % % % G , ( 8( % ( 8( % . % G H6F , 6/ F K# . H - - <%$ % (% % % E ( (% - % ` V < % < , , aG V 9 ( % % % . , % , ( $ . &' , % & % <%$ ( ) G < . ' ' % 9 % )% &' %&' < . & : A ;. , &' , ( &' , ) % H , V 8( . G % -% < V + < aG V @ b@ V , < < < < < a < a@ c @ a( , a( V )G 31 V ' a ' < < a ! V aG V ' < % 1 6) a .. V H . 8 % ( - V ( < < % a V ) " < % a% < 1 V < a V < a a. G % & ' () ' & % &% * (+ + (, -&% *+ + .)/+ + (, 0 0 - & & 1 % ' $, % &' G $ . % G bRc 9 bR c ( % , &' % 1 - R ( % % R[ b ( c ( b (dc ( b (R c ( bR( c ( bR(dc ( bR(R c ( ... , H % * % -[ 9 % % - bY(R c . , 9 % E :% - ;. ) % 0 ! ( % + '< " G % ' G -% % &' . % % &' H " - ' % - ) . 9 H ' G 1 1 % % . % :@ ;. K0 " G H6F 32 6/ F % ( ( , $ E K# . )% . ! &' 1 % < ) A , , , % % -% ;( 1 1 , 1 ) % V<. 9 ' ( :% 1 ( , $ . ) % - " &A ( , % G 12 3 ' (12 (+ 4 ' 12 ' (5 % * (,12 % * (,5 ! 63$ -* 3)7,12 8 .2 4 0 0 - 12 9 : % 12 ;<= > % % : ( + % 9 8 % ) ;G + ! ! !! # :V < < , a; F% ( % 8 ' V % % ;. C $ #% H8 ) ? % ?& :; < < , , ) G ( @ ! ?$ 33 , a :% 0. < % ( ! " % ! ?$ " , @ ! ! !! " $ :V < < ) A a; 6% 9 . 6 , ( ) A 1 % A V < % < ) E % % ) - $ 0 % ( ( % [ & ( $ < % :V < ) % e : 6) % % , , 1 ' % % ( ( < ) . % % % & 1 % G @ 5G G & E % )G G% % 9 % :)G[; , ;. @) ( - . A a;. ( % 4 % . " < 1 8 5 % /+ % 1 T % % % . C 1 ) ( % :5G"G ; S . E A 0. & % % ) % :; E , ) % % % U ' 4 -( A a. 9 % H % % % )V< .[ 5V< " 34 :; % $ . C % 1 ! V< @ " @ V< H6F 6/ F % :@ )@ ( )GYGR( 5W`GY; % : ( @ 3@ ; 6% G % : ( @ 3@ ; 6% G % : W @ 3@ ; % :; $ @ 6 % % (- % ! " ) % V 2 6/ F -% A % &' . I , % $ ; A ' % $ ; 3: G H6F ( $ ; 3: ) 1 d 3: G H & G ) .[ 6% 6% 1 % 6% 8 % < & < , % ( % : 6 1 % H A 1 . )( &' ;. &' % ( % % &' ' ) G % !$ ; 35 *) % % . <12(5A B ) 3?" % &' 6) , %* % 1 % &' ! ( a@ % 1 % #! = #/ 0 %* % * % ! ! " " % ' ' &' . 1 % - % 1 1 S T. :% % 0 % ' ; % ' ! V ) " . ' # '< * % a V 1f+ % < <% a % # % !E % ( H6F 6/ F ( a: $ K# ( H V ) % $ V 1f+ % < % % ; ' )% ' % 2C < . # ) % &' $ 1 ? ' < * % a. . D 1 EF 2 2 2(D 1 EF 2 2 2 D " % V ) '<* % a <% H6F ( &' 6/ F ( <Ra : $ % $ % ) % &' % ; ' $ K# ( % % )% 1 ( . # $ % $ % )% ' )% 6 V 1f+ % < V 1f+ % < ( <% < a : - ;. % ' $, 1 ... $ % ... $ % :% 36 ... % . ;( ! 1f+ % % . % 8 , ! $ " :% 4 %$ % $ V ) % % *# # H : <%$ . 4 % ' H % " % &A ; 0;. '< < ) - % % G &' a V ) RRa( V ) R a( ...( V ) R a V 1f+ % < % <% V ) Ra( V ) V 1f+ % < <Ra a( ...( V ) <% < a <% < ) a ... % V 1f+ % < a % $ H8 ) (1 @ 2 % 1 @ & % !B ! " A &$ $ ; ) ; ) ' % !H I % !H % !H ) G " +$ ) I ) ) +$ +$ " " 37 J % G ! 7 ! 6 % %+% 0 + &' % G ... ... 1 %% % ... % 4$ ... ... % %% Z$ X % ... 0;( ... ... -8 ) "# " % :U U ; : : " % ^_ % % 0; ... 0;. ) - ) % : ) G ! & 6 1f+ % % E . V , a V V % ac % V 1f+ % < <% < , a , &A < V < % a a 1 %% . % C A ab % ' , % E % ( (% . ) % ' 1 % % ' 1 , ) % % % % & . % .I () , % % %% . I ' V % a 1 - V % a. ) ' V % ) % &' ' / % .0 % a( < , C C V % V % ) V a a C V % % % ( % &' ,) % % % ' 1 , % &' ' a -R. H 9 % % ( a , &' %% . 1 % % ( 1 &' % &' ( (% . 1f+ % 1 , % V < 38 % %$ (V % a. # ! : (1 1f+ % % % , ( ) % &' % 1 8 % V < % a( V < ) % &' %% ( $ ) % &' ) A ) % % V % , )% a V % a ;( U , * . a ' ' &' ( 1 " E % , . ( E R R ' ) . KL ( ( % M & M ( ( " % ! M & 3$ " " / G#( 1 V < %% ' , )% . K 9 % a: $ ( &' ( V V % ) (1 . (! " ( % < % a a ' $ % M & M ( (" % ! M & 3$ " " 6 ) ( K ( (! , " % M & M ( ( % ! M & 3$ 2(" " " -- ) "# 61 ... 3 & 39 % $ <RG ;( ! 6 % 1f+ % % % &' : % - 1 ) " ' * % ; . 1 V ) V 1f+ % < 1 <% '< * % a a % 6 V ) '<* % a ) ' 1 %% . I V 1f+ % < <% - % H6F a- )% &' 6/ F ( . / % V 1f+ % < <% a 1 .0 1 ) % &' < 9 % %% 1 V ) '< * % a 8 .# &' H6F 6/ F ( V 1f+ % < % a , )% U% % , ( ) % &' , % * 1 . 1 ) , ( < % &' G KL ( ( ! E + + + " $ % M & M12 ( E M1N ( " % ! M & 3$ M12 M5 ( " E " / G0 )% %% )% -+ ) "# H 6 % &' : 1 1f+ % . <3 ... % % % ( &' 1f+ % , F" !G 1f+ % % % % - . 40 -1 ) ' * % ; 8 ! V 1f+ % < <% V ) '<* % a a / % 9 % %% . / % V ) * % a '< V 1f+ % < <% .0 1 %$ V ) '< * % aG K# ( % ' )% U% % , ( , % $ . 0 ) KL " a ( $ ) % &' * G ( ( ! $ % M & M12 ( % ! M & 3$ M12 M5 ( MD ( " /' # ! !"' ! "0! - & ' ) % % % % ! # ' ! /' # ) - 1 R . 12 @ 12 @ I<O< 12 (<PH( ;<Q =BO ! $ @ B DN BKPR> 12 5 12 5( ; B@ ; I<O<@ S 12 8 41 E $ ! B OB'BO !< + : :&) S$ /' #! 6) % $ % %$ # ' 1 % " ' ! "0! , : D ;1 - ' &' G " SS ' ! < : )G : $ > < : > < 122 < 5 G ! > <$ " , /' # ! ,- " " ' #' " SS ' %A '# ! ' % ! ) A$ T ! 5 A$ U@ , + )I)JJI $ I)KI A SS ' 5 A@ ! ) A$T U ,, ) (# N 5 A+ ,2 " A O #9 SS ' !<) G& $ & @ & N < 5 G@ @ ,1 L ;# # & & 2D AN 5 A 2D 22 ! &' %* $ ( % . 42 -% % ! , $ " SS " ' ! % () % " $ T ! ! % ($5 ! % $ $ @ U # A % , " &' ( U SS &A ' < < E% * * A, ,* % E% . & & A, , , 4 & "# " A O SS ' !<) G& & N < 5 G@ @ ,7 & # A SS ' T V! W ()W $N X0@ W (5 W @ U , -8 &L& SS " ' ! W' <) W' G$ T ! W' < 5 W' G$ @ U , -SS , -+ " & # ' ! <)G)O &M 9 SS ' 5A ! " , -1 " 6 " SS <5G+ ! ) A$ & , -, (M " 0 0 0% 5A "9 ' ! A $ & 2O ! ) A$ ! ?V$ ! ?5 V$ $$ ' ! )A$ 43 $ & @ ! SS ' " N 5A " ,- #6 " SS ' " SS ' N ! AV% ) AV% A $ 5A " 2 " " ! # ( ' - . &' - 2 < % % ( % &' Z ( 8 % ( % % % -1 &' 8 ,% -% &' . 2 % < ( % ( ' %$ % ( &' * % % ) '. % . % * %$ 1 - - % - ( . C ) % &' % %$ * ) P, B % &' ( 1 ) % &' . % %$ 1 )% ( 1 %$ 6 '( ' % &' . ( - ) % &' . &' ) % % % % . ) %$ G 44 ( % % ! 1 ) " ! $ 5$ # 0 ( %$ : ' , "# % #( # - % , ) ( &A $ 9 1 %$ ;. - - 9 + D % % : ' <$ : ' 1 ( G ' 1f+ % % 1 % % % &' . % ( - , . D 1 % , %$ % ( % ' 1 * %$ 1 ( , ;( ;( 1 " % % % +< % . * % &' & " !' H % : &' - 1 :% &' 1 % % &' ) , % ;( $ : $ ; 0 &' ( 1 % % ( )G % % ' ' % ;. # %* V &A < < # %&' D % < < % a b:V 1f+ % < < a;c &A / % # %&' 0 % V < % < D b < % a , acV 1f+ % < % . ( V 1f+ % < 1f+ % < D aG V 45 < < a < % &A < ! 9 % . % D , D <%$ % , ( . : - < D a- 1f+ % % ; 9 % . , % ; +% U% ( V 1f+ % < , & : " % & % <%$ ( ( %&' % % &' % )G V < < , *) aG V ) < < ( a - % % Y R`; 1 % % \d : ( 8( , , . D - % , ( 9 < % % , %,% , % : ( ) G ?& 8 8 ) % Y% ?12 5 12 ? A " % $ % G 12 . 12 27 %! $ )% % D (% % )G 46 ( ) , 9 , , - % ;( ! ! ?)V& 8 8 :% Y% " $ A 12 ?5 V " % $ % G 12 . 12 27 !) $ %! $ D . % ) % ( ' &G 1 ) % &' ( , , % % D ( % % %$ . < % ) % &' . E % %$ 1 . %A &' - 1 % 0;. % ( , % $ % D < < % < < &A , &' % % V # %&' H % a;c GV :% &' a ( &' ) b:V 1f+ % < < % )G &A < < a / % # %&' 0 % V , - < . < &' a % ( % V 1f+ % < 1f+ % 47 < % &A < < D a ! b cV 1f+ % < < D aG V 9 % . & : D a % ; <%$ +% U% % , ( . ( V 1f+ % < : - < D 9 1f+ % % . &' &' : a- % ; % < D , , < " * , % % ;. 6 ( &' : ;( % - . , % % & % <%$ ( ( %&' % % &' % )G V < < H , aG V ) Y % < < a ( 1 \d( &' % % % D . 6 - ) , %,% 9 < " , G & % ?& 8 8 ) ?12 % Y% A 5 ? " " % $ % V< Y V< <d 48 G ( ! " V< % : ; # , % D &' ( % :)(5G % G ;G % )W 5 % % $ % G V< Y V< <d V< : ( ; % : ; 4 & '! N' = ?" P, D G - ' +% . % ( ( 1 1 D % &' , - +% ' : %* % , 1 , , ;( ) D ( :)(5G % % ( U % V< )W 5 % 49 . - . % ) D % E . , &' . D , % H , 1 ( - ( & ) % &' H % +% G G ; ! % $ " % G V< Y V< <d : ( ( % : 7 " ; ; $! ! F% - %$ 1 . % &' E " ) % % 1 " ! %& % % D % G $ & %1N % %6" ! %2($ " " " -8 ! !! 5$ / 2 A % % :% + % ;G F : : 2 `; :0 % 0 % * % :2 `.RYR"; 2 S T SRT; ; 6 %* , 6) 2 % % ) % %&' H . G 50 % &' ! " )G 5G G% G % % 6 0 % 0 (% % &A ( ) % % ( ( ( ) . ( %( % . -- ! '< " , ( -( . #' W(< 6) ' % E % -% % G <`( W). 6 1 , ( W +% . < ' . ' e % . +% % &' W % <. % . &' ( &' ( h % , % % '. g . 2 ( [e ' -% W(<(h( ) + &' ( % &' + % 1 +% &A ( - 1 ) ' -% . * i ) ( : -( i ` g . 2 ' % % % : 1 WW ( << 1 ;. +% . % &' . j ' ) ( [j +% g [. 2 -% + , ;. B, 1 51 % ! % .6) 1 g WR : 1 0G WW - $ WW <<;. K WW k &' G ( 0 * % - % % . &' ;( : %* &' : , % %* ) -+ G@ F @W @ -( % % &' . I % ; % ! @ % % @ -% @g @ F @ . #" F % G ( g( V( ( a( &' Vg( ` g` : ` `l; ag( @ ?@ Va 1 0 -, - % % + - - % * % gWW % &' < % &' . 6) ?g WW. % " ! 1 ( . #' 1 ( ( A * % . 6) G 6/ F U@ @a @ ?@:@ @ , K# . K < % mg. ) H6F - % l; Va - 6 # , &' . K# g H6F 6/ F .2 * % . 61 H6F % 2 6/ F g +% % K# ( m 0. 1 H6F . 61 * % 0. 1 * % K % H6F 6/ F . 61 n n % oo 0. 1 > ( ' 6/ F 1 F ) H6F K# 6/ F . 61 0. ) % 52 * % > F % ! -2 ."9 ! " / B % %$ - ) . 6 %$ % ) 1 % %$ #6IBJ 0/ / # %$ K6 2pF/ # 6 % F % &' 1+% G q!/ 0 # % % 1 ( K * . 1 %$ &' ' ' 0 1 6 %* * ). 1 H , 1 1 6 % % R; # 1 - % 9 % % ' ; # %$ % H < ) ( % % - &' ( 1 % ) . . G 1 1 % . ) ( %$ ( H , ( , . H 9 ( 1 - , - &' . `; # % %* @ % $ Y; 0 ( @ 1 % , % % %&' % 9 % ( &A : A , ...;. ' 8 1 % % $ H/ #B KO.6>6 $ ( % ,;. 6 H : % 53 , % ( ' + ) ' ! 'U % ( % ) ) 1 H8 < ' : % V V % % &' ) ) ( . )( . 1 < 1 a- % % G +? % ?)V& ? ( ( %.;. a E % E % ( % -G < < 1 " 4" ! V$ " " 54 % : ;. ! / ! % ' #' ' )! # /+ ( ; % ! # ' I - /+ 3 B? % # " ? /+ 4 = ! /+ [ ; # ) $ B ! $ \ /' # ! ' H ') ) % 0 %% &' 9 ( % :K 0. % % 0 < mmm;. 6 1 % $ % /+ . % ! Z /+ S 4 " .[R P % !< % % % ) % % % &A &' - ) % # 0. 2 %% G % R. , % &' % %3 )% 6 .6>6 55 'G 0 ! . 0 K % : ; `. 6) % .# . % 0 0 &' 0 3 K 3. ) $ , )% /' # - O 0 % &' 8 )% Y. 0 ( % < ' -% .# % F % % ! )0! # ' @ ! R ## + 8 r @ &' G 0 % G H H % ! G <RR< " % % ! g# r ' R. $ ( G ( ( G # " % # &' V< V< V< V< V< 1 " $# :@ # 1 1 G@ ; : ; 0% 1 V<R % % =" 56 4. F - ' % Z . & " # ! : ; ! " $ :@ " @ ; " $# :; : # ; V< W =' V< " $ :@ !" $# : =' # .# / 2 -g@ ; ; ' ' F ; /' #+O0 % & ! )0! .# / ' E ' -R ## + 8 F ; /' #,O0 % & ! )0! .# / ' [. ' ## + 8 F ; /' #2O0 % & ! )0! # ' % ' @ 0 % ## + 8 rr % &' G 0 % &' G E r rR @ % % R % :; ! G R<RR< " H6F#M R. $ H G 57 . . ! % = " % : G ;G $ (G " V<R V< R <R = " V< h =' ='= " / % % % V< % :R ; " $# :@ =' # .# / ' ' #' s % R g@ ( ; ' F ; % ' @ % % : ') .$@ ;U :; 58 " ! " ^ U g % :@ :R ;U % R gi e @ ( ;U _ % : ; ^ (U gRU : g UagRU << ; ^ g hU _ U _ /' # 1 O 0 % 1 &' )j W?)W0g ( & G>Rg Wn n . ! )0! # ' ' ## + 8 @ 0 % F 61 &' @ &' G 0 % gg % >RFV<::< W 1 : > FV<::< W 1 : >R V< > V< 0 # 6K2 #6 ;; : h ;; !6 F IB6 6 2M )R V<:< ; : h ; )R V< #IF2:< 6K2 ; : h ; ) V<)R ) V<<)R % G G ! <RR< # %&' % (?(0( V< j <Yh h% " &A ()R () ()R () 1 1 % mg 59 ;; : h ;; t O ! $ (?(0( ()R () ()R () U " # %&' 0 K (?(0 1 % mg :@ g@ ; : ; =' : Va ; " $ :@ ?g@ ; # F6G K 0 " $ FB)PBG :0; 0 % V< j <Yh h% : ag ; )R V<::< ;W#FI2: ;; : h ; ) V<::< ;<#FI2: ;; : h ; )R V< ) V< )R V<:< ; : h ; )R V<#IF2:< ; : h; ) V<)R ) V<:<)R ; =' 6% % ) " $ :@ >Rg@ ; " $ :)R ; W@ ; " $ :@ 60 " ! " $# :)R ; 6% % ) > g@ ; " $ :@ " $ :) ; " $ :@ W@ ; " $# :) ; 2 =' # .# / ' ' #' ' F ; % ' s % V .$a s % V $.$a ') 61 " ! : ; ^ h0 % 1 % O ! HR. <RR< " / ! F2 26G % %0 % &' 0 % &' B 5 68 8 8 S - 8 8 ' DN 8 8 % - " <N )GN ) N )S "! N )](ON )]( N )] ON )] N @ - 8 8 = " B^ <?_ 5G?5 N ` $ @ < T "!` <N $ @ "!a" ) b<$ @ U c ! <NN $ @ 8 8 = " G "!` GN $ @ "!a" ) bG$ @ 8 8 = " "!` N$ @ "!a" )b $ @ 8 8 I - 8 8 S S N! G6G2.6<6 $ @ 8 8 "! S DN DN $ T ](ON! ! 2G$ 5E ! S ] ON! ! 2G$ 2 E ! S ]( N @ ] N @ U T ](ON! 2G$ 8 ! 6<$ @ 62 $ $ 8 ! 6<$ @ $ $ 8 ! 6<$ @ " ! ]( N E ! 2S $ 8 ! 6<$ @ ] ON](O@ ] N! 2]( $ @ U 8 8 B % - " ? 5d Ad "!` 2222222222222222222222222222222222222222222 $ @ "!` O - BE a"]_ 5a"]5a"N )<)G) $ @ "!](Na( +"5a( +"` )](O)" A ! ]( $ $ @ "!] Na( +"5a( +"` )] O)" A ! ] $ $ @ U 63 " ! 44 M B E 5- % 1 %&' , % % . + % 5. / :b c ; ) Y 5 : Notas[1] % R Y;. Notas[2] % ( % S G 9 % 0 % - Notas[3] 9 % . 6 / 1 ' . + . 9 % , ' 6 $ % % " % Notas[4] 8 , , - T 1 N . . % & R. 6 F H ? 1 R. ) 5( $ % % % 9 % % 9 % . Notas 1 2 3 4 87 93 77 82 64 % ! 5 E -1 % % %% % 5 % % : - ) G0 % - ) ! ! " # $ %& " # ' !" #( 65 ;. ) &' . 6 " Y % %% % ! 1 .6 - % 6) % 6) %9 % RG 6 Y Y . 5G 1 % 9 % " 1 E % . 66 " ( % % E 1 ,) 1 ! " # # " ## * ## # ) #+ # , # # # # # # # - ## ## ## # # %& # #! ., ! '! ! # # ( %& . ! ##! / # ' ! ## ( 67 " ! 6) %9 % % % - G ) %9 % 1 . 68 " ! " # # " ## * ## # ) #+ # , # # # # # # # - ## ## ## # # %& # #! ., ! '! ! # # ( %& . ! ##! / # ' ! ## ( 69 " ! F &' <%* G algoritmo "Calculo de Max_Min_Media" // Função : Calcular o valor maximo, minimo e media de 6 notas // Autor : Jorge Mota // Data : 05-12-2006 // Secção de Declarações var notas: vetor [1..6] de real numeros: vetor [1..6] de inteiro maxima,minima,media,soma,nota : real i,imax,imin,numero : inteiro inicio // Secção de Comandos //Inicialização de variaveis soma<-0 media<-0 maxima<-0 minima<-21 imax<-0 imin<-0 //Leitura e processamento para i<-1 ate 6 faca escreva("Numero do aluno=") leia(numero) escreva("Nota =") leia(nota) notas[i]<-nota numeros[i]<-numero soma<-soma+nota se (nota>maxima) entao maxima<-nota imax<-i fimse se (nota<minima) entao minima<-nota imin<-i fimse fimpara media<-soma/6 escreval("Nota maxima") escreval(maxima) escreval(imax) escreval("Nota minima") escreval(minima) escreval(imin) Escreva("Media =") 70 " ! escreval(media) fimalgoritmo 71 " ! 6) %9 % `G 0 % - % 72 . " ! , 0 1 0 2 ## # 3 4 # 5 ) # , ) 5 1 !# ! ## )# !5 # 6 5 # 6 ,! # 6 ,! # 65 ) ! # 65 $ 1 1 ! 65 1 ! 65 ! ) %& 5 )( 5! # 6 ,! # 6 ,! $ , 5 # #! %& # 777( 73 " ! , 0 1 0 2 ## # 3 4 # 5 ) # , ) 5 1 !# ! ## )# !5 # 6 5 # 6 ,! # 6 ,! # 65 ) ! # 65 $0 1 ! 65 1 ! 65 ! ) %& 5 )( 5! # 6 ,! # 6 ,! $ , 5 # #! %& # 777( 74 " ! <0* 75 " ! 5. Leitura validada de uma posição para o jogo do Galo: 4 ) ' 4' -'0 4-'0 8' 9' 4 ' 4' -'0 4-'0 %& , :;. < %.1 & ,= , .= = 0 ( %& 8' ! ! 9' !4( 76 " ! " 6. Desenhe um algoritmo que escreva os primeiros n numeris de Fibonacci uma série de fibonacci. 77 ! 7. Desenvolva algoritmicamente em raptor o jogo do Galo? 78 " ! " 47 & % &' ( &' % 8 % &. B 0+% , * ( - 0 - &' +% &' . 8.9.1 Ponteiros ' % &' % 1 * ( ( -% ( - 1 - & % * % 5 ,% K & . 6 9 % ( % 4 * ( &( - 1 % . &. - &. 1 % ( ) - % * 9 . / % , , * ( & 1 1 -%$ % $ &' . ( * & . % &' ( 1 1 % % % 6# % * ( ' % )( % % % . ( 1 1 1 , 1 * ( % 1 % -% 1 A % & % &' ( - \ % 1 9 * * ( \ 1 . 79 % ' ( % ! " 8.9.2 Utilidade dos Ponteiros ' % &A % ( +% * . #' ( % 1 :$ ;( % ' % % % % ( , % % & &A % % +% 8 D - ' %3;( 0;. / *) ' % ;. ' 1 -E 8 &' %$ - ( % +% &' . 2 :% % % - :% 9 <%$ (% : % &' . 6 % % % ( $ 0( 0WW( 8 -E ' % 1 % &' % &' 9 &' 1 1 %$ . &' E . K % 0 0WW 1 &A ( % &' 1 1 &' % . 1 6 % % &' % &' $ % % %3( %* &' % ( ,% 1 1 .2 . % % &' 8 . Exemplos Abaixo é mostrado o exemplo da declaração de uma lista encadeada em C, o que não seria possível sem o uso de ponteiros: /* a lista encadeada vazia é representada por NULL ou algum outro símbolo */ #define LISTA_VAZIA NULL struct link { 80 8 ! " void *info; /* conteúdo do nó da lista */ struct link *prox; /* endereço do próximo nó da lista; LISTA_VAZIA se este é o último nó */ }; 4 -8 $ ' ! !! %A 4 -- ."9 %$ : / # #E ! - % ## %&' 1 % ; ;( 1 : )G %$ - % % Z - %$ ) ' &' : $A . $ ) $ ' % % %$ %$ % ,) % &' % % ;. ' % % &' 8 .C % 1 $ % , % m E : &' % ;. \ '( %. F % ) %% %$ 1 % %$ :/ / ;. B %$ ) ' -. ). 6) 8 $ : ) % ) % &A . 6 % ;. ) $ 4. %$ &' %$ 8 . 6 %$ A Q ') % 1 O != ! ! B %! : . % ' 81 % 1 ! \ 0 )G " % ! . 6 ' %$ % 6 r r/ $ % (1 $ - $ $ % %$ !$# $ &' % Exemplo de redireccionamento: Chamamos a função, Redirect_Input("file.txt") ou Redirect_Input("C:\Documents and Settings\file.txt"); 6) %9 % G / 1 * S r R rR R . . )T Resolução em Raptor: 82 %$ %$ % R ! " = # . ) >/ # ? @ # ) # A B > @ %& # = # %& 7 ! 7- # % &' % ' ( #! . ) > @ # CD 7( & 3 ! & 3 % &A %+% % % &' . 0 % ( % % 9 &' % ( &A ( D% 83 &' ! 1 % % ( ) E &' E % . % ( ( % &A % ) % , : % H 9 % ( $ ; G #1 1 * % K '. ( % % * % ) % . 3 " # , # ,% ( % 0+% 0 &' ( % ) 1 % % 1 1 ( 1 : % ; 1+% $ 1+% U &' ' - ( ) - ( - % U R ( F %$ - 84 1 $ % U ,. Y 0 c . $ 1 %, 1 % * ' - % \ b 0( , ( 1 &' 9 % ( ( c . % ( % ,% . 1 - . % .43 ( E % % % 8( &' ( % < 1 ( &' % ;( 1 1+% % & 3 % ( 1 %$ *) b 1 + - % ( . P E % % ? , D% . % % &A 8% 1 * G % % %+% ) ( % %, 1 % : ) %&A - " % % U / &' ) % . ! " PESQUISA SEQUENCIAL O método mais simples de determinar a presença, ou não, de um elemento numa seqüência, é percorrê-la a partir do seu início, efetuando comparações, até que o elemento seja encontrado ou o fim da seqüência seja alcançado. Este método é chamado de pesquisa seqüencial. Dados : vetor de n elementos (n conhecido) elemento a ser pesquisado no vetor Resultado: Se o elemento existe, mostra-se a sua posição ou o total de ocorrências deste no vetor. Se o elemento não existe, mostra-se uma mensagem de falha. As considerações que podem ser feitas sobre os dados de entrada (vetor), são do tipo: o vetor esta ou não ordenado; o elemento ocorre uma única vez (pesquisa única) ou repetidas vezes no vetor (pesquisa única). Isso acarreta os seguintes tipos de pesquisa: a. Desordenada Única b. Desordenação Múltipla c. Ordenada Única d. Ordenada Múltipla Pesquisa Binária O método de pesquisa seqüencial é fácil de escrever e é razoavelmente eficientes para seqüências com poucos elementos. Entretanto, para seqüências de tamanho considerável, que ocorrem na maioria das aplicações existentes, a utilização do método torna-se inviável. Uma estratégia interessante e eficiente é utilizada no método de pesquisa binária. Descrição Geral do Método: • • • • • • Definir intervalo inicial (i, f) de busca Determinar a posição média do intervalo(m = (i+f) DIV 2) Comparar o elemento da posição média (v[m]) com o elemento E: Caso sejam iguais então terminou as pesquisa Caso contrário definir o novo intervalo de busca Aplicar sucessivamente o passo anterior até encontrar E ou não existir mais o intervalo de busca São aspectos fundamentais do método: • • vector de entrada tem que estar ordenado intervalo de busca inicial é (i,f) = (1,n) 85 ! " • intervalo de busca, considerado a cada iteração, é definido do seguinte modo: (i,m-1), se (E < v[m]) (m+1,f), se (E > v[m]) tendo a metade do tamanho do intervalo original • O teste de repetição é (i <= f) e Não Achou Dados : vetor de n elementos (n conhecido) elemento a ser pesquisado no vetor Resultado Se o elemento existe, mostra-se a sua posição ou o total de ocorrências deste no vetor. Se o elemento não existe, mostra-se uma mensagem de falha Os problemas de ordenação são comuns tanto em aplicações comerciais quanto científicas. Entretanto, raro são os problemas que se resumem à pura ordenação de seqüências de elementos. Normalmente, os problemas de ordenação são inseridos em problemas de pesquisa, intercalação e atualização. Isto torna ainda mais importante o projeto e a construção de algoritmos eficientes e confiáveis para tratar o problema. O nosso objectivo é analisar os seguintes tipos de ordenação : a. Selection Sort b. Bubble Sort c. Insertion Sort a. Selection Sort Este método é um dos mais simples e intuitivos dentre os métodos existentes. Sua estratégia é seleccionar o menor elemento da sequência considerada e colocá-lo no início da sequência. Assim, dada uma sequência de tamanho n, várias iterações são efectuadas, sendo que a cada vez que esta estratégia é aplicada, uma nova sequência é gerada pela eliminação do menor elemento da sequência original. Código em C /** * Retorna -1 caso não encontre ou a posição * caso encontre. */ int procura(char vetor[], int tamanho, char elementoProcurado) { int i; for (i = 0; i < tamanho; i++) { if (vetor[i] == elementoProcurado) { return i; } } 86 ! " return -1; } & 3 ( 5 1 % % , % : + 1 1 . 6 %$ % A :%$ % & % ; % % , ( % % . # % . 0 % % % %$ % % ) % % ( . 6 , ( ' % ( % % - ( - . $ % . B %* % % % ( ( % % %$ $ ;- * 1 % % 5 % , G ( $ H 1 G BUSCA-BINÁRIA (V[], inicio, fim, e} i recebe o índice no meio de inicio e fim se V[i] é igual a e então devolva o índice i # encontrei e senão se V[i] vem antes de e então faça a BUSCA-BINÁRIA(V, i+1, fim, e) senão faça a BUSCA-BINÁRIA(V, inicio, i-1, e) Código em C int PesquisaBinaria(char chave,char k[],int N) { int inf,sup,meio; inf=0; sup=N-1; while (inf<=sup) { meio=(inf+sup)/2; if (chave==k[meio]) return meio; else if (chave<k[meio]) sup=meio-1; else inf=meio+1; 87 % 8 ! } return -1; " /* não encontrado */ } 6.1.1 Exercício %$ ) 1 :S 1 % . )T % ( R 88 ;. ! 89 " ! 6.1.2 Exercício ) % 1 ? , 1+% . ./ 90 " &' %$ F . ! 91 " ! 6.1.3 Exercício < % % 1 &' F ? , ' % ) ) %$ ./ . = # > E 1# 2) # ? @ # ) #' # # # #! = # 2) > @ F % G H #I ) A J ) >#I )@ >A J' @ # I >>#I! )@$*@ '# # -' # # A J ) #K #I >A J' @ %& %& % # CD ! #( # D ? ? ?( # 92 #! % &' 1+% . &' " &' ! 7+ ! % &' % %+% % 1+% % ( % -% ' 6) &' % ,% . )% , 6 % A % &' % % . 1 \ 1+% . B % . &' - % G R; &' / % * : % < ;. R; &' 1 ) " ) &' %$ . 2 1 % : % &' ) ' ; % % ) % . -8 6 ((# ( &' ( 1 . % &' : . &' % 1+% . 6 , % $ % ( ( ' &A . % ) ( ' - % % 1 &' * )% : &A . % H602 F % . - % %* 1 ( ' 1 . % . :[ ; 1 ,% . % % % BUBBLESORT (V[], n) 1 houveTroca <- verdade # uma variável de controle 2 enquanto houveTroca for verdade faça 93 $ 9 &A - $ @ ;( % % 9 ( ; % ) . H$ @ - ! 3 4 5 6 7 " houveTroca <- falso para i de 1 até n-1 faça se V[i] vem depois de V[i + 1] então troque V[i] e V[i + 1] de lugar e houveTroca <- verdade Implementação em C void bubble(int x[],int n) { int troca, i, j, aux; for (i = n-1; i > 0; i--) { // o maior valor entre x[0] e x[i] vai para a posição x[i] troca = 0; for (j =0 ; j < i-1; j++) { if (x[j] > x[j+1]) { aux = x[j]; x[j] = x[j+1]; x[j+1] = aux; troca = 1; } } if (!troca) return; } } 94 ! Implementação em Raptor Bubble Sort: 95 " ! 2) J # # ) >#-' @ > '@ 5 ) >5 #K @ > # 5 # 5! @ L) %& 5 5! # #K # 96 7( CD M // " ! " = # 2) > E / # ? @ N ) N # N N = # 97 N! 2) > @ ! 98 " ! ! % % % " #"% ( &' G : ( - &' ( E %&' ( % 1 ;( % &' : <R; . Código em C void selectionSort(int vetor[],int tam) { int i,j; int min,aux; for (i=0;i<tam-1;i++) { min=i; for (j=i+1;j<tam;j++) { if (vetor[j]<vetor[min]) min=j; } aux=vetor[i]; vetor[i]=vetor[min]; vetor[min]=aux; } } 99 ! " Implementação em Raptor do algoritmo de ordenação por Selecção: 100 ! " Implementação dos subprogramas Troca e Carregar Lista: = # 2) > E / # ? @ N ) N # N N = # 101 N! 2) > @ ! / &' ( 6 ( % &' 1 ( &' ( 1 % - 1 1 % & . % 1 E % ) &' 8 . Implementação em C void insertSort(int a[], size_t length) { int i, j, value; for(i = 1; i < length; ++i) { value = a[i]; for (j = i - 1; j >= 0 && a[j] > value; --j) { a[j + 1] = a[j]; a[j] = value; } } } 102 . % 1 1 " % % % ! Implementação em Raptor: 103 " ! " = # 2) > E / # ? @ N ) N # N N = # 104 N! 2) > @ ! " 9# # 0 % #$ % &' , Rd[d( #$ ) % 1 ,% . ? % % . - % - &' Código em C void shellSort( int * vet, int size ){ int i , j , value; int gap = 1; do {gap = 3*gap+1;} while ( gap < size ); do { gap /= 3; for ( i = gap; i < size; i++ ){ value =vet[i]; j = i - gap; while ( j >= 0 && value < vet[j] ){ vet [j + gap] =vet[j]; j -= gap; } vet [j + gap] = value; } } while ( gap > 1); } 105 &' . ! Implementação em Raptor: 106 " ! 107 " ! Procedimento Inicializar a Lista com 100 elementos: = # 2) > E / # ? @ N ) N # N N = # N! 2) > @ 108 " ! " : "; I %3 I %3 0. .F. P ! % % . - &' Rd" ( 1 % . , B * Rd" % ( - . ,% . 6 &' b ( .43 ' ' c . . % ) ' #/! ! ! : "; R. 0 ) u: . 0 u: ; G u: ; % ; ) & G u: % $ % % - U ; . 109 $ % % - ! " Algoritmo em português estruturado proc quicksort (x:vet[n] int; ini:int; fim:int; n:int) var int: i,j,x,aux; início i <- ini; j <- fim; x <- x[(ini + fim) div 2]; repete enquanto (x[i] < x) faça i <- i + 1; fim-enquanto; enquanto (x[j] > x) faça j <- j - 1; fim-enquanto; se (i <= j) então aux <- x[i]; x[i] <- x[j]; x[j] <- aux; i <- i + 1; j <- j - 1; fim-se; até_que (i >= j); se (j > ini) então exec quicksort (x, ini, j, n); fim-se; se (i < fim) então exec quicksort (x, i, fim, n); fim-se; fim. Implementação em raptor (versão recursiva – não executável em Raptor) 110 ! J # ### I# F #N %& # 7( 111 " ! Implementação do procedimento quicksort: 112 " ! # ### 5 I# # I >>### ! I# @$*@ ) ) # #' # #! ) # 5-' 5 5K # -'5 # # # # # 5 # 5 # #! 5 5K #'5 5### I# 5 F #N # -I# ### # F #N 113 " ! Implementação da rotina que carrega a Lista: > E / = # # 2) ? @ N ) N # N N = # N! 2) > @ 114 " ! Implementação em C void sort(int array[], int begin, int end) { if (end - begin > 1) { int pivot = array[begin]; int l = begin + 1; int r = end; while(l < r) { if (array[l] <= pivot) { l++; } else { r--; swap(array[l], array[r]); } } l--; swap(array[begin], array[l]); sort(array, begin, l); sort(array, r, end); } } Implementaçao usando 'fat pivot': void sort(int array[], int begin, int end) { int pivot = array[begin]; int i = begin + 1, j = end, k = end; int t; while (i < j) { if (array[i] < pivot) i++; else if (array[i] > pivot) { j--; k--; t = array[i]; array[i] = array[j]; array[j] = array[k]; array[k] = t; } else { j--; swap(array[i], array[j]); } } i--; swap(array[begin], array[i]); if (i - begin > 1) sort(array, begin, i); if (end - k > 1) sort(array, k, end); } 115 " ! -- / "@ " 11.1.1 ! # ' " ' "5# "# " '< " Notas sobre integração de uma função Integral simples: xDireita f ( x) * dx xEsquerda 6 ) , . % % - &' ) % ). #! # D 116 )6 1 :);. S )T % 1 ! Integração usando a Regra de Simpson 11.1.2 # % % % ( ( , < . % &' % < % '. < '( A < . % < * . ' # n &' ;. C A 1 % ' ' &' :);( ( % % % &' % % < < - ) < , 1 . D ∆X * f ( xEsquerda + i * ∆X − X / 2) i =1 Que pode ser re-escrita como: ( xDireita − xEsquerda) / n * n f ( xEsquerda + ∆X (i − 1 / 2)) 1=1 " % " ! ' D 117 ' % , &' :); , :, ! N=numero de sub-intervalos no intervalo de ∆X = ( xDireita − xEsquerda ) / n = Largura do sub-intervalo f ( xEsquerda + i * ∆X − ∆X / 2) = Altura do sub-intervalo % # D 118 " ! 119 " ! % P ) ) " I CD O 1# # / 1# H > 1# # K @$ 1# H O #) # 1 O 8 $* ! # ) # ' 1# H #) # I # ! >0B B K*B @B #) # #) # ! # #! 120 H I CD ! % P ) ) " I CD O 1# # / 1#H > 1# # K @$ 1#H O #) # 1 O 8 $* ! # ) # ' 1#H #) # I ! >0B B K*B @B #) # #) # # ! #! 121 # H I CD ! " Notas sobre integração usando a técnica de Monte Carlo -% % &' ! 0 . &' ( :); 1 0 $ , % %% : % 8 &' ; % % ) ) :); % &' . ( v 2 ) " % w > :> :w ' 5 * gB 1 w gB > * ;g :); % % Vg :> :w , ; * Vg :> !ag :); >6 1 % $ 1 * * ;;h!h:) * <)6 1 ; ! = ' #D * * * <) :); g ! !g &' ( % $ . :);. I D g !h:)6 1 , ! &A S% ) T % ' ; 1 &' % . ' # < :)6 1 ( ) !( S% ) T :% !; 1 > ;;g )6 1 Vgw Vg> Vg>ag> ; * Vg! * Vg) * * 122 ) :); ! % # D 123 " ! " / + 0 " Pergunta 1 (2 valor) Coloque por ordem crescente de data de aparecimento as seguintes linguagens de programação (da mais antiga para a mais recente) Fortran LISP BASIC C# JAVA C C++ Visual Basic Cobol Pergunta 2 (2 valores) Em termos metodológicos no desenho e implementação algoritmica usamos essencialmente duas abordagens a: Top-Down e a Bottom-up Explique de forma clara em que consistem estas abordagens e em que situações aplicaria um e outro ou ambos. Pergunta 3 (2 valores) Qual a diferença entre função e procedimento? Em ambos podemos usar parâmetros, explique o que são, para que se usam e que tipos de passagens existem( quanto ao modo como é feita a passagem) ? Pergunta 4 (3 Valores) a)Analise o seguinte algoritmo em VisualAlg 2.0 e escreva qual o resultado do mesmo para um numero de elementos igual a 10? b)Substitua a estrutura de controlo REPETIR … ATE () por uma ENQUANTO () FAZER … FIMENQUANTO algoritmo "FIBO" // Função :FIBO // Autor :JORGE MOTA // Data : 29-01-2007 // Secção de Declarações var 124 ! " n,a,b,nFin: inteiro inicio // Secção de Comandos escreva("Numero de elementos:") Leia (nFin) n <- 0 a <- 0 b <- 1 REPITA escreval(a) escreval(b) n <- n + 2 a <- a + b b <- b + a ATE (n > (nFin-2)) fimalgoritmo Pergunta 5 (3 valores) Desenvolva um algoritmo em Raptor (fluxograma) que permita converter uma string para maiúsculas: Exemplo: esTe e um teste de algoritmia. ESTE E UM TESTE DE ALGORITMIA Pergunta 6 (3 valores) Implemente em raptor (fluxograma) e em C um algoritmo que calcule a altura ao solo de um passageiro durante um passeio na roda gigante tal que : Vamos imaginar, que uma roda leva 12 cadeiras igualmente espaçadas ao longo do seu perímetro, que o seu raio mede 10 metros e que o ponto mais baixo atingido ao longo do percurso círcular está a 0,5 metros do solo. Sabe-se também que uma roda demora cerca de 30 segundos a efectuar uma rotação completa. 125 ! " Com : h=10.sen(pt/15), t pertencente ao intrevalo fechado de [0,30]. Pergunta 7 (2 Valores) Implemente iterativamente o seguinte seguinte algoritmo (função) de cálculo de um factorial: " " ! %& $ & %1N % %6" ! %2($ " " " Pergunta 8 (3 Valores) Explique o algoritmo de ordenação Bubble Sort, implemente o mesmo em raptor (Fluxograma) para uma ordenação crescente, partindo do princípio que a lista a ordenar está contida num array de nome LISTA e que tem n elementos. 126 ! " Teste Tipo Prática Pergunta 1 Implemente em linguagem Visual Raptor( ou em Fluxograma tradicional) e em linguagem C um algoritmo que permita estimar o valor do integral de uma função simples f(x): 3 x 2 − 2 x , no intervalo (0,3) usando a regra de integração numérica de Simpson. Notas para a implementação: A regra de Simpson usa rectângulos para aproximar a área (integral) no intervalo (a,b) de uma função f(x). A área de cada rectangulo é calculada usando como base a largura de cada rectangulo e como altura o valor da função f(x) calculada no ponto médio de cada rectângulo e no final é somado o conjunto das áreas. Este valor final é o valor aproximado do integral naquele intervalo. Resposta ( # % % % , &' :);( (% % % &' &' :); ( < ' &' , % < A % < < . 1 ' % ' ;. . % % < < '( % % :, A 1 : % R < A 127 < - '. , ) &' * &' ;. C % ' , R Y ! -- - , . ' # ' n 11.1.4 D ∆X * f ( xEsquerda + i * ∆X − X / 2) i =1 Que pode ser re-escrita como: ( xDireita − xEsquerda) / n * n f ( xEsquerda + ∆X (i − 1 / 2)) 1=1 " % ! ' D 11.1.5 N = numero de subintervalos no intervalo de integração 11.1.6 ∆X = ( xDireita − xEsquerda ) / n = Largura do subintervalo 11.1.7 f ( xEsquerda + i * ∆X − ∆X / 2) = Altura do subintervalo Implementação em Raptor / * F # * A #J >0B B K*B @ # J %& 2 J !A #J! # H *6 D ' ! ( 128 # H #) # " ! % P ) ) " I CD O 1# # / 1#H > 1# # K @$ 1#H O #) # 1 O 8 $* ! # ) # ' 1#H #) # I ! >0B B K*B @B #) # #) # # ! #! 129 # H I CD ! " Implementação em Linguagem C: /**********************************************************/ /* */ /* Autor: JM */ /* Data: 25 Janeiro, 2007 */ /* Disciplina: Introdução a Ciência dos Computadores */ /* Professor: Jorge Mota */ /* Descrição: Este programa integra uma função, embebida*/ /*No código e representada por F, no intervalo definido */ /*A a B usando a regra de Simpson. */ /* */ /**********************************************************/ #include #include #include #include <math.h> <stdio.h> <stdlib.h> <limits.h> /* Usar a biblioteca matemática */ #define SEED 5 /* Formula */ #define A #define B #define FORMULA #define F_STRING 1.0 3.0 (3 * x * x - 2 * x) "(3 * x * x - 2 * x)" /* Esta é a função matemática a ser integrada. /* Tem uma variável x como entrada e devolve F(x). */ */ double f(double x) { return FORMULA; } /* Esta função integra f entre xEsquerda e xDireita usando a regra de simpson */ /* É feita uma divisão da função f em nDivs rectângulos */ /* e para cada rectângulo é calculada a área do mesmo usando como altura o ponto médio de cada sub-divisão. */ /* A função requer que no intervalo (xEsquerda e x Direita), calculemos o numero de divisões. */ /* O valor do integral no intervalo é o somatório das areas rectangulares. Quantas mais sub-divisões mais preciso é o resultado. */ double integrar_rect(double xEsquerda, double xDireita, double f(double), int nDivs) { int i; /* Variavel contadora */ double area = 0.0; /* area estimada */ double deltaX = (xDireita - xEsquerda)/nDivs; /* largura do Subdivisão */ double midpointX; /* ponto medio */ 130 ! " midpointX = xEsquerda + deltaX/2.0; for (i = 0; i < nDivs; ++i) { area += f(midpointX) * deltaX; midpointX += deltaX; } /* Acumula a área */ /* proximo rectangulo*/ return area; } /* Main() é responsável por chamar o método que calcula a integração*/ /* e imprimir a area calculada */ int main(void) { int n; double s; /* numero de rectangulos */ /* area estimada pela regra de simpson */ srand(SEED); printf("\n"); printf("Integrar F(x) = %s de %5.3f to %5.3f\n", F_STRING, A, B); printf("\n"); s = integrar_rect(A, B, f, n); printf(" Regra de Simpson: Area com 1024 sub-intervalos = %9.6f\n", s); return 0; } Esta pergunta vale 20 valores em 20. Critérios para correcção: Se o aluno consegue descrever em português corrente os passos do algoritmo 10% Se aluno estrutura convenientemente o algoritmo em funções(Métodos e Constantes) 10% Se o aluno comenta correcta e completamente o código 10% Se o aluno define o algoritmo de integração correctamente, separando convenientemente variáveis, ciclo de calculo acumulado da área e impressão formatada do output em Raptor 30% Se o aluno define o algoritmo de integração correctamente, separando convenientemente variáveis, ciclo de calculo acumulado da área e impressão formatada do output em C 20% Se o Nome das variaveis está adequado a sua função e não gera confusão com nomes reservados 5% Se o algoritmo em Raptor funciona sem erros 10% Se o algoritmo em C funciona Correctamente 5% 131 ! /D #% ! . :>R ) " ! +88 Licenciatura em Informática 1º Ano - 1º Semestre Frequência - Resolução Data : 5-02-2007 Parte Teórica Duração : 60 Minutos Prof. : Jorge Mota Introdução a Ciência dos Computadores – 1º Ano Numero : Nome : Pergunta 1 (2 valor) Explique o que é a Heap e a Stack num modelo de memória de uma linguagem de programação de alto nível como o C. Fale um pouco sobre a preocupação que deve ter com estas estruturas quando se usam ponteiros e alocação dinâmica de memória. Resposta: Uma arquitectura tradicional de memória para um programa em C, ou linguagens similares, inclui as seguintes áreas: Heap Stack Variaveis Globais Instruções Programa Em linguagens como o C podemos dinâmicamente alocar espaço na Heap, e usar este espaço para as nossas estruturas de dados. A gestão do espaço alocado fica da responsabilidade do programador que deve ter a responsabilidade de limpar (libertar) este espaço sempre que já não for necessário. Normalmente usa comandos de alocação dinâmica de espaço na 132 ! " Heap, do tipo malloc(size). Este espaço é depois manipulado/ endereçado por estruturas tipo ponteiro. Se isto não acontece podemos criar situações de erro grave de sistema por falta de espaço, nomeadamente: 1) Quando a stack cresce e não dispõem de mais espaço. 2) Quando tentamos alocar mais espaço na Heap. Esta é também uma fórmula comum de ataque aos programas, ficando o computador a mercê de um ataque de Hacker. A Stack é a área de memoria gerida pelo próprio programa, para as variaveis locais, parametros e outros. As variaveis globais e constantes usam o espaço reservado ao programa (no topo ou no inicio da memoria usada pelo programa). Pergunta 2 (2 valores) Implemente em VisualAlg e C um algoritmo que calcule os numeros primos até um determinado valor inteiro. Resposta: Um número primo é aquele que só é divisivel pela unidade e ele próprio. Se pretendemos imprimir a lista de numero primos até um valor, vamos fazer um ciclo que itera até este valor e para cada um testa se é primo (força bruta), se for é impresso senão passa ao seguinte. Para n=100 Temos a seguinte lista: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 Em VisulAlg: algoritmo "Primos" // Função : Calcular Primos // Autor : JM // Data : 23-02-2007 // Secção de Declarações var sai,i,j,n:inteiro inicio // Secção de Comandos escreva ("Ler quantos numeros(>4):") leia (n) escreval(2) 133 ! " escreval(3) para i<-4 ate n faca sai<-0 j<-2 enquanto (j<i) e (sai=0) faca se ((i%j)=0) entao sai<-1 senao j<-j+1 fimse fimenquanto se sai=0 entao escreval(i) fimse fimpara fim Em C: #include <stdio.h> void main(void) { int sai,i,j,n; printf("Numeros primos at-->"); scanf("%d",n); for(i=4;i<n;i++) { j=2; sai=0; while((j<i) && (sai==0)) { if (i%j==0) sai=1; else j=j+1; } if (sai==0) printf("\n%d ",i); } printf("\nTerminou o calculo"); } Pergunta 3 (2 valores) Na estruturação de algoritmos e implementação em linguagens de alto nível é comum decompormos o programa em problemas mais pequenos. A implementação destas unidades mais pequenas em linguagens como o C ou linguagens algoritmicas como o VisualAlg é feita sob a forma de funções ou 134 ! " procedimentos. Explique como implementar em VisualAlg e C procedimentos e funções e como se processam os diversos tipos de passagens de parâmetros. Resposta: Quer o C quer o VisualAlg possuem Funções e Procedimentos e respectivas passagens de parãmetros por valor e referência. Usamos Funções sempre que pretendemos atomizar funcionalidades do nosso programa e que seja devolvido um valor. Em C isto é feito implicitamente designando o nome da <função>. Em VisualAlg 2.0 usamos a palavra reservada funcao. Para os procedimentos o C usa igualmente a forma implicita só que não é especificado nenhum tipo de dados a devolver - void. Já o visualAlg 2.0 utiliza a palavra reservada Procedimento. Todas estas construções suportam passagem de parãmetros por valor e referência ou seja no primeiro a variavel chamadora não é alterada e na segunda o que usamos é uma referência para a mesma memória onde está instanciada a variavél chamadora, quer dize,r é como usar um aliás para esta variavel. Sintaxe em VisualAlg: funcao <nome-de-função> [(<seqüência-de-declarações-de-parâmetros>)]: <tipo-de-dado> // Secção de Declarações Internas inicio // Secção de Comandos fimfuncao procedimento <nome-de-procedimento> [(<seqüência-de-declarações-deparâmetros>)] // Secção de Declarações Internas inicio // Secção de Comandos fimprocedimento Passagem de parâmetros por referência (negrito) por valor a (italico): procedimento soma (x,y: inteiro; var resultado: inteiro) funcao soma (x,y: inteiro): inteiro … Em C: Void nome(<tipo> var,<tipo> *var) { 135 ! " … } int nome(<tipo> var,<tipo> *var) { … Return n } Pergunta 4 (3 Valores) a)Analise o seguinte algoritmo em VisualAlg 2.0 e escreva qual o resultado do mesmo para um numero de elementos igual a 12? b)Substitua a estrutura de controlo ENQUANTO () FAZER … FIMENQUANTO por uma REPETIR … ATE () . algoritmo "FIBO_ENQUANTO" // Autor :JORGE MOTA // Data : 29-01-2007 // Substituir um repetir por enquanto // Secção de Declarações var n,a,b,nFin: inteiro inicio // Secção de Comandos escreva("Numero de elementos:") Leia (nFin) n <- 0 a <- 0 b <- 1 enquanto (n<=nFin-2) faca escreval(a) escreval(b) n <- n + 2 a <- a + b b <- b + a 136 ! " fimenquanto fimalgoritmo Resposta: a) n a b N<=nFin-2 Escreva a Escreva b 0 0 1 V 0 1 2 1 2 V 1 2 4 3 5 V 3 5 6 8 13 V 8 13 8 21 34 V 21 34 10 55 89 V 55 89 12 144 233 F Sequência Impressa: 0,1,1,2,3,5,8,13,21,34,55,89 b) algoritmo "FIBO_Repetir" // Autor :JORGE MOTA // Data : 23-02-2007 // Substituir um repetir por enquanto // Secção de Declarações var n,a,b,nFin: inteiro inicio // Secção de Comandos escreva("Numero de elementos:") Leia (nFin) n <- 0 a <- 0 b <- 1 repetir escreval(a) escreval(b) n <- n + 2 a <- a + b b <- b + a ate que (n>nFin-2) fimalgoritmo Pergunta 5 (3 valores) Desenvolva um algoritmo em Raptor (fluxograma) que permita converter uma string para maisculas e que tenham sido subtraídos os espaços a mais: Exemplo: 137 ! esTe e um teste de algoritmia. " ESTE E UM TESTE DE ALGORITMIA Nota : o underscore representa simbólicamente espaço. Resposta: A KK A )# JQ .I >A A @ % A J # ) # )# A # '0* >A J' @ ># '@ A J > 'RS@ >-' **@ A J A % A %! K0* A A J # #! %& A Pergunta 6 (3 valores) 138 %( % A %! A % A %! ! " Implemente em raptor (fluxograma) e em C um algoritmo que calcule a altura ao solo de um passageiro durante um passeio na roda gigante a partir do numero (inteiro) de cadeira que conta abaixo de si: Vamos imaginar, que uma roda leva 12 cadeiras igualmente espaçadas ao longo do seu perímetro, que o seu raio mede 10 metros e que o ponto mais baixo atingido ao longo do percurso círcular está a 0,5 metros do solo. Sabe-se também que uma roda demora cerca de 30 segundos a efectuar uma rotação completa. Com : h=10.sen( ), t pertencente ao intervalo fechado de [0,30]. Resolução: Vamos considerar que o passageiro só conta as cadeiras de um dos lados. Assim temos o seguinte definição para o problema: Se o número de cadeiras é 0 então o passageiro esta a 0,5 m do solo. Se o número de cadeira é inferior a 3 então a altura aproximada é de h=10,5(n)*10*sen(30). Se o número de cadeira é de 3 então a altura ao solo é de 10,5 m. Se o número esta entre 4 e 6 (ou seja 5) então h=10,5+n*10*sen(30). Se o número de cadeiras é de 7 então a altura é de 20,5 m ao solo. 139 ! " # # # ' , ? T -0 , ? TK> @B >%#$0@ B# '0 , ? T -S , ? T! > @B #>%#$0@ B , %& *? T %& , ) # ' !, ( Pergunta 7 (2 Valores) Implemente iterativamente em fluxograma o seguinte seguinte algoritmo (função) de cálculo de um factorial: " " ! %& $ & %1N % %6" ! %2($ " " " Resposta: Implementação em Fluxograma: 140 2 HU# ( ! I # I CD V Q ) # ) #- A I IB# # #K # !I( ) O I %& " !! ' 141 ) 6 I #) # # O #? ! ' #' % s % @ % ' " ') .$@ : ;U :; ^ U g % :@ :R ;U % R gi e @ ( ;U _ % : ; ^ (U gRU : g UagRU << ; ^ g hU _ U _ Pergunta 8 (3 Valores) Explique o algoritmo de ordenação Insertion Sort, implemente o mesmo em raptor (Fluxograma) para uma ordenação crescente, partindo do princípio que a lista a ordenar está contida num array de nome LISTA e que tem n elementos. Resposta: Insertion sort, ou ordenação por inserção, é um algoritmo simples de ordenação, eficiente quando aplicado a um pequeno número de elementos. Em termos gerais, o que faz é percorrer um vector de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. O algoritmo de inserção funciona da mesma maneira como muitas pessoas ordenam cartas num jogo de cartas como o poquer. 142 ! 143 " ! / D #% I. $ ! +88 5 " ! = 3 ?" /' ! 1º Ano - 1º Semestre Resolução parte prática da Frequência e exame. Duração : 60 Minutos Prof. : Jorge Mota Engenharia Informática Introdução a Ciência dos Computadores – 1º Ano Data : 5-02-2007 Parte Prática Numero : " Nome : Pergunta 1 Implemente em linguagem Visual Raptor( ou em Fluxograma tradicional) e em linguagem C um algoritmo que permita estimar o valor do integral de uma função simples f(x) exemplo: 3 x 2 − 2 x , no intervalo (1,3) usando técnica de integração de Monte Carlo. Notas para a implementação: ver descrição da técnica em abaixo. 144 ! -- - 4 . ' # RR.R.d v ' 2 , -- - -RR.R.R ! g RR.R.R` w 11.1.16 gB * RR.R.RY> RR.R.R[ D g !h:)6 1 11.1.10 :> ! ' 5 1 !ag :); w * * ;g :); % % <" " ! :); g " % gB > * <) ) * :w Vg :> % ; :w * * 8 ;;h!h:) <)6 1 ; ! = ' #D >6 1 % $ 1 * 1 > * Vg :> Vg>ag> Vgw )6 1 ; * Vg! Vg> * Vg) * ;;g * ) ) # < :)6 1 () ; % !( ! 0 e ?f # $ : % % ) &' . ) :); ( &' S% ) T :);. I % $ % , . :); ! . % " &' ( :); 1 %% &' ; % :% 1 &' ( % , !; Resposta ((+ (+ ( ((+ (+ (/ 1) ( .+ $^ 3$ ^ " % + K ((+ (+ (7 .$Z *?B E E L % C , g +K % 3x 2 − 2 x +K )E % % L )?S - V E (+ % ? * ) (, # " E : % & ? ?? rx=(xDireita-xEsquerda)* random/(LONG_MAX))+xEsquerda ry=M*random()/(LONG_MAX) A constante LONG_MAX representa o máximo numero que pode ser gerado pelo random em raptor será igual a 1 e em gcc por exemplo está definida em limits.h 5)Iterar os 1024 pontos gerados aleatóriamente. No nosso caso implementado por um ciclo contado tendo o cuidado de para cada x e y gerado calcular o valor da função F(x) e verificar se é inferior ao Y gerado. No caso de ser incrementar o contador de pontos que depois nos irá permitir estimar a área. 6)Finalmente calcular a area pela proporção de numeros gerados que são inferiores a F(rx) relativamente a area da caixa de restrições. 145 ! " (contagem/nPontos)*(M*(xDireita-xEsquerda)) Implementação em Raptor: Programa principal, limita-se a inicializar variaveis e a chamar a função de cálculo pela técnica de integração de Monte Carlo(mc) e apresentar o valor calculado. . " ,8 " *? , M 0 % * " %& H ) # J '! ) * ( 146 ! " Função que implementa o calculo do integral pela técnica de integraçãode Monte Carlo (mc): 147 ! 148 " ! " Finalmente o subprograma que implementa a função a integrar (Hardcoded): I4 0B B K*B Implementação em Linguagem C: /**********************************************************/ /* */ /* Autor: JM */ /* Data: 25 Janeiro, 2007 */ /* Disciplina: Introdução a Ciência dos Computadores */ /* Professor: Jorge Mota */ /* Descrição: Este programa integra uma função, embebida*/ /*No código e representada por F, no intervalo definido */ /*A a B usando a Técnica de Integração de Monte Carlo. */ /* */ /**********************************************************/ #include #include #include #include <math.h> <stdio.h> <stdlib.h> <limits.h> /* Usar a biblioteca matemática */ #define SEED 5 /* Formula */ /* #define A 1.0 #define B 3.0 #define M 21.0 #define FORMULA (3 * x * x - 2 * x) #define F_STRING "(3 * x * x - 2 * x)" */ /* Esta é a função matemática a ser integrada. /* Tem uma variável x como entrada e devolve F(x). */ */ double F(double x) { return FORMULA; } /* Esta função integra f entre xEsquerda e xDireita usando o método de integração de Monte Carlo */ /* É desenhado caixa usando os valores definidos pelo intervalo xEsquerda e xDireita e o minimo e máximo como base e topo do mesmo. 149 ! " Para o valor máximo devemos estimar um valor adequado de acordo com a gráfico da função. */ /* São gerados pontos aleatóriamente dentro desta caixa de valores e determinado se o valor gerado se encontra acima ou abaixo da função F */ /* A fracção de pontos gerados abaixo da função é a mesma que a fracção da área da caixa abaixo da função ou seja o valor do integral da mesma no intervalo considerado. Esta consideração só é valida para um numero significativo de pontos*/ /*ATENÇÃO estamos a considerar que a constante LONG_MAX é o máximo valor possivel de ser gerado pela função rand(). Está sempre dependente do compilador. Neste caso consideramos que está definida em limits.h (gcc) */ double integrar_mc(double xEsquerda, double xDireita, double f(double), int nPontos, double M) { int i; /* Variavel contadora */ int contagem=0; /* Numero de ponto de abaixo da função*/ double rx; /* valor aleatório x no intervalo de valores da caixa*/ double ry; /* valor aleatório y no intervalo de valores da caixa*/ double f_y; /*valor de y= valor da função no ponto aleatório rx*/ for (i=0; i<nPontos;++i) { /*Escolher um pontos aleatório na caixa de valores. Os valores rx e ry devem escolhidos independentemente*/ rx=(xDireita-xEsquerda)* rand()/((double) (LONG_MAX))+xEsquerda); ry=M*rand()/((double) (LONG_MAX)); /* verificar se o ponto está abaixo da função*/ f_y=F(rx); if (ry<f_y) contagem++; } return (contagem/((double)(nPontos))*(M*(xDireita-xEsquerda))); } /* Main() é responsável por chamar o método que calcula a integração*/ /* e imprimir a area calculada */ int main(void) { int n; double mc; /* numero de pontos */ /* area estimada pela técnica de Monte Carlo */ srand(SEED); printf("\n"); printf("Integrar F(x) = %s de %5.3f to %5.3f\n", F_STRING, A, B); printf("\n"); n=1024; printf("n = %d\n", n); 150 ! " mc = integrar_mc(A, B, F, n,M); printf("Método Monte Carlo: Area com n pontos = %9.6f\n", mc); return 0; } Esta pergunta vale 20 valores em 20. Critérios para correcção: Se o aluno consegue descrever em português corrente os passos do algoritmo 10% Se aluno estrutura convenientemente o algoritmo em funções(Métodos e Constantes) 10% Se o aluno comenta correcta e completamente o código 10% Se o aluno consegue especificar a forma de calculo dos numeros gerados aleatóriamente na caixa de restrições 10% Se o aluno define o algoritmo de integração correctamente, separando convenientemente variáveis, ciclo de calculo acumulado da área e impressão formatada do output em Raptor 20% Se o aluno define o algoritmo de integração correctamente, separando convenientemente variáveis, ciclo de calculo acumulado da área e impressão formatada do output em C 20% Se o Nome das variaveis está adequado a sua função e não gera confusão com nomes reservados 5% Se o algoritmo em Raptor funciona sem erros 10% Se o algoritmo em C funciona Correctamente 5% 151 ! -+ 6 (# = bRcF %$ ( : 0 ( * ( / &' &' 0 ( ";. b c#%$ (P b`c# Z " ( C Completo e Total( : ( Rdd ;. ( Algorithms and Software Principles( : $( 2$ 5( Rdd[;. bYc# ( 0, b[c$ G 444. ! (! % . 152 H . (: ";. <