Sie sind auf Seite 1von 43

Flvio Morgado

EXERCCIOS DE ALGORITMOS Parte II

Santo Andr 2007

SUMRIO 1. ARRAYS .................................................................................................................3 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 ZERAR UM ARRAY ................................................................................................4 CARGA DE UM ARRAY, COM QUANTIDADE DE ELEMENTOS DETERMINADA...............5 CONTAR PARES ...................................................................................................5 MAIOR VALOR DE UM ARRAY ................................................................................6 MDIA E DESVIO PADRO ...................................................................................7 CPIA DE ARRAY, COM FILTRO.............................................................................8 BUSCA SEQENCIAL............................................................................................8 BUSCA BINRIA .................................................................................................10 INSERIR ELEMENTO EM UMA POSIO ................................................................11 INSERIR ELEMENTO NUM ARRAY ORDENADO. ......................................................11 REMOVER ELEMENTO DE UMA POSIO .............................................................12 REMOVER ELEMENTOS IGUAIS A X .....................................................................13 GERAR UM ARRAY SEM DUPLICIDADE, A PARTIR DE UM ARRAY ORDENADO ...........14 GERAR UM ARRAY SEM DUPLICIDADE, A PARTIR DE UM ARRAY NO ORDENADO. ...15 MODA DE UM ARRAY (USANDO CRIVO) ...............................................................15 ORDENAO POR SELEO ...............................................................................18 ORDENAO POR INSERO DIRETA ..................................................................19 BUBBLE SORT ...................................................................................................20 CARGA DE ARRAY, COM SENTINELA ....................................................................21 CARGA DE UMA MATRIZ (COM QUANTIDADE DE ELEMENTOS DETERMINADA) .......22 SOMA DE MATRIZES ...........................................................................................22 PRODUTO DE MATRIZES ....................................................................................23 INTERCALAR DOIS ARRAYS ORDENADOS ..............................................................24 EXERCCIOS PROPOSTOS ...................................................................................25 CONTAR A ....................................................................................................31 TEXTO INVERTIDO .............................................................................................31 PROCURAR A ................................................................................................33 NORMALIZAR STRING .........................................................................................34 CONTAR PALAVRAS COMEADAS POR E ..............................................................35 MAIOR PALAVRA ...............................................................................................36 PALNDROMO ...................................................................................................37 ROMANO PARA ARBICO ....................................................................................38 EXERCCIOS PROPOSTOS ...................................................................................40

STRINGS...............................................................................................................31

1.

ARRAYS

Considere-se o seguinte caso: um condomnio de 7 de casas, todas com a mesma planta, em terrenos do mesmo tamanho. As duas ltimas casas do condomnio no esto habitadas. Por existirem vrios condomnios assim no bairro, este foi chamado de A. Nome do Condomnio

A
Souza Silva Castro Gomes Alves

Famlia N da casa

Pode-se formular as seguintes questes: Quem mora na casa 4? (Contedo de A [4]?) Gomes Existe uma famlia Castro no condomnio? (Busca seqencial) Sim Como inserir a famlia Lima no condomnio, aps a ltima casa? (Acrescentar) Como substituir a famlia Gomes pela famlia Barros? (Atualizar) Como inserir a famlia Ruiz no condomnio, na casa 3, deslocando os moradores a partir desta casa? (Inserir) Como remover a famlia Castro do condomnio, sem deixar casas vazias, exceto no final? (Remover)

Nome do Condomnio

A
Souza Silva Ruiz Barros Alves Lima

Famlia N da casa

A estrutura tratada no caso acima chamada de ARRAY. Arrays so agregados homogneos de elementos de algum tipo previamente definido. Cada elemento identificado por sua posio no array.

Exemplo: O array X contm os resultados de um sorteio da Sena, que so elementos do tipo inteiro. X Contedo 3 15 19 26 34 45 Posio 1 2 3 4 5 6 Para acessar um elemento de um array usa-se o nome do array e um ou mais subscritores (ndices). Exemplos: X [3] refere-se ao 3 elemento do array, cujo contedo 19. Se uma varivel K tem o valor 4, X [K] ser = 26. As operaes de manuteno de arrays so: Alterao substituir o contedo de um elemento por outro valor Insero incluir, adicionar, acrescentar um novo elemento no array Remoo excluir, eliminar um elemento do array Pode-se tambm efetuar uma Busca, ou seja, localizar um elemento no array. Os elementos do array so armazenados em locais adjacentes na memria (lado a lado). Na alocao seqencial necessrio conhecer-se apenas o local de incio do array e o tamanho de cada elemento (determinado pelo tipo de dados escolhido). Exemplo: Numa lista de elementos do tipo inteiro cada elemento ocupar 2 bytes na memria.

1.1

Zerar um array
Dado um array com 20 elementos do tipo inteiro, atribuir zero para cada elemento. Soluo

A possibilidade de usar variveis indexadas permite um procedimento conhecido como varredura, ou seja, passear pelos elementos do array mediante a variao do ndice, de 1 em 1. Para cada valor do ndice, acessa-se um elemento do array e atribu-se zero a esse elemento. ARRAY Inteiro A (20) // Array com capacidade para 20 elementos inteiros Zerar ( ) // Objetivo: Zerar um Array Inteiro I Para I de 1 at 20 A [I] 0 Fim-para

1.2

Carga de um array, com quantidade de elementos determinada.

Dado um nmero N, inteiro e positivo, carregar N nmeros inteiros em um array A, com capacidade para 100 elementos desse tipo. Soluo A carga (povoamento) de um array pode ser feita pela leitura dos contedos dos elementos ou como resultado de um processo de gerao interna. A quantidade de elementos a serem carregados (varivel N) no pode ser maior que a quantidade de elementos reservada para o array, representada pela constante Max. ARRAY Inteiro A (100) // Array com capacidade para 100 elementos inteiros Inteiro N // Quantidade de elementos do array Inteiro Max 100 // Constante usada para definio da capacidade do array Booleano Ok // Status da operao de carga Carregar ( ) // Objetivo: Carregar um array com uma quantidade pr-definida de elementos Inteiro I Leia (N) Se N > Max ento N0 Ok Falso Seno Para I de 1 at N Leia (A[I]) Fim-para Ok Verdadeiro Fim-se

1.3

Contar pares
Dado um array A, com N elementos inteiros, obter quantos so pares. Soluo No processo de varredura, conta-se quantos elementos so divisveis por 2. ARRAY Inteiro A (20) // Array com capacidade para 20 elementos inteiros Inteiro N // Quantidade de elementos do array Qtd_Pares // Quantidade de elementos pares do array Contar_Pares ( ) Inteiro I Qtd_Pares 0 Para I de 1 at N Se A [I] mod 2 = 0 ento Qtd_Pares Qtd_Pares + 1 Fim-para

1.4 Maior valor de um array


Dado um array A, com N elementos do tipo inteiro (N > 0), obter o valor do maior elemento. Se houver empate, considerar o contedo da primeira ocorrncia. Soluo A 4 I 2 7 5 6 9 2 8 ... N 7 Maior 4

Percorrer o array (passear)

Iniciar a varivel Maior com o primeiro elemento de A. Comparar os valores do array A (do 2o at o ltimo) com o valor de Maior. Se algum valor for maior que Maior, substituir o contedo de Maior por esse valor.

ARRAY Inteiro A (100) // Array com capacidade para 100 elementos inteiros Inteiro N // Quantidade de elementos do array Maior // Maior valor do array Maior ( ) Inteiro I Maior A [1] // Primeiro elemento de A Para I de 2 at N Se A [I] > Maior ento Maior A [I] Fim-se Fim-para Outra estratgia seria guardar a posio do maior, e no o seu valor, que seria melhor no caso de arrays de registros (vrios campos), em que a cpia de um registro a cada substituio seria mais onerosa. A varivel P_Maior, que contm a posio do maior elemento, inicia com 1 (aponta para o 1 elemento). Maior ( ) Inteiro I, P_Maior 1 Para I de 2 at N Se A [I] > A [P_Maior] ento P_Maior K Fim-se Fim-para Maior A [P_Maior] DICA PARA TRABALHAR COM VARIVEIS INDEXADAS Identificar os valores assumidos pelo ndice (valor inicial e valor final, comportamento no intervalo, critrio de passeamento etc.) Definir o que fazer quando estiver apontando para um local (acesso).

1.5 Mdia e Desvio Padro


_ Calcular a mdia (X) e o desvio padro (S) de um conjunto de N notas de provas. Soluo N X=

N
Xi S=

i=1 N

i=1

(X i X ) N1

________________

____________________________

Exemplo:

N notas

Xi 10 7 4 9 5 X i = 35 _ X =35 / 5 = 7

_ 2 (X i X ) 2 (10 7) = 9 2 (7 7) =0 2 (4 7) =9 2 (9 7) =4 2 (5 7) =4 _ 2 (X i X ) = 26 S= 26 / (5 1) = 2,55

ALUNOS Inteiro X (100) // Array com capacidade para 100 notas Inteiro N // Quantidade de notas Inteiro Max 100 // Capacidade do array Real Mdia, Desvio // Mdia e Desvio Padro do conjunto MedDesv ( ) // Objetivo: Calcular a mdia e o desvio padro de um conjunto de notas // Pr-condio: N > 0 Inteiro I, Real Soma Soma 0 Para I de 1 at N Soma Soma + Notas [I] // Acumular notas Fim-para Media Soma / N // Calcular mdia Soma 0 Para I de 1 at N Soma Soma + (Notas [I] Media) ^ 2 // Acumular quadrados Fim-para Desvio (Soma / (N 1)) ^ 0.5 // Calcular desvio

1.6 Cpia de array, com filtro


Copiar, para um array B, somente os elementos positivos de um dado array A, com N elementos. Obs.: Supor que o array B tem a mesma capacidade de A. Soluo

I
1 5 Copiar elementos para B

Percorrer o array

A
4

NA
9

MaxA
100

...

B
5 1 8 2 6 ...

NB
5

MaxB
100

A varivel NB, que contm a quantidade de elementos de B, deve comear com zero (array vazio), pois pode ser que nenhum elemento de A seja positivo. Essa varivel , tambm, o ndice do ltimo elemento de B Varrer o array A usando a varivel I e, para cada elemento positivo, copiar para B, usando como local a varivel NB, aumentada de 1 elemento. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro NA // Quantidade de elementos do array A Inteiro B (100) // Array com capacidade para 100 nmeros inteiros Inteiro NB // Quantidade de elementos do array B Copiar_Positivos ( ) // Objetivo: Copiar os elementos positivos de A em B Inteiro I NB 0 // Array B vazio Para I de 1 at NA // varre A Se A[I] > 0 ento NB NB + 1 // aumenta 1 elemento em B B [NB] A[I] // usa ltima posio de B para copiar A[I] Fim-se Fim-para

1.7 Busca Seqencial


Dado um nmero inteiro X, obter sua localizao no array A, no ordenado. Se o valor de X no for encontrado, o resultado deve ser = 0. Soluo

X
8

I
1 5 4 1

A
8 7 9 2

N
7

P
0

Comparar A [ I ] com X. Se achou, para a busca. Seno, compara com o prximo

A varivel P indica a posio onde achou. Comea com 0, indicando que no achou. Podemos varrer o array A, com a varivel I, ENQUANTO no achar o valor X e no for o fim do array, ou seja, enquanto P = 0 e o ndice estiver nos limites do array (I <= N). Se X for encontrado, a varivel P recebe o valor de I (ndice que est sendo usado para varrer A). Se no final a varivel P continuar com 0 significa que no houve sucesso na busca. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array Inteiro Max 100 // Capacidade do array Inteiro X // Valor a ser localizado Inteiro P // Local onde foi encontrado o valor X BuscaSequencial ( ) // Objetivo: Obter a posio de X no array A Inteiro I P0 // Inicia P com 0 (X no existe) I1 // ndice para o 1o elemento Enquanto P = 0 e I N // No achou e no terminou Se A [I] = X ento PI // Guarde em P o local onde achou Seno II+1 // Avana o ndice Fim-se Fim-enquanto Outra forma de pesquisa avanar o ndice enquanto no encontrar X e for possvel avanar o ndice, ou seja, enquanto ele no estiver apontando para o ltimo elemento de A. Como so duas as condies para o avano do ndice, no se sabe porque o loop terminou, ou seja, se foi porque achou (A [I] = X), ou porque o ndice apontou para o ltimo elemento (I = N), ou ambos, significando que encontrou X no ltimo elemento. Assim, necessrio perguntar porque saiu do loop. Se A [I] for = X, saiu porque achou e P recebe o valor de I (onde achou). Seno, P continua com 0. BuscaSequencial ( ) // Objetivo: Obter a posio de X no array A, no ordenado Inteiro I P0 // Inicia P com 0 (X no existe) I1 // ndice para o 1o elemento Enquanto A [I] X e I < N // No achou e no o ltimo elemento II+1 // Avana o ndice (prximo elemento) Fim-enquanto Se A [I] = X ento PI // Achou na posio I Fim-se

10

1.8 Busca binria


Dado um nmero inteiro X, obter sua localizao no array A, ordenado. Se no for encontrado, o resultado deve ser = 0. Soluo X 7 A 7 4 N 11 P 0

Contedo Posio

2 1

4 2

5 3

8 10 12 13 14 18 20 5 6 7 8 9 10 11

A varivel P comea com zero, indicando que no achou. Na busca binria, calcula-se a posio do elemento do meio de A. Se for o valor procurado, a busca termina. Seno, verifica-se se o elemento procurado est antes ou depois do ponto central. Se estiver antes, atrasa-se o fim do espao de busca para uma posio antes do meio. Se estiver depois, adianta-se o incio para depois do meio. Inicio Fim 1 11 1 5 4 5 Meio 6 3 4 Meio int ((1 + 11) / 2) Meio int ((1 + 5) / 2) Meio int ((4 + 5) / 2) X A [6] X A [3] Achou o valor de X, em A[4]

ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de nmeros Inteiro X // Valor a ser localizado Inteiro P // Local onde foi encontrado o valor X BuscaBinaria ( ) // Objetivo: Obter a posio de X no array A, ordenado Inteiro Incio, Fim, Meio Incio 1 Fim N P 0 // Inicia P com 0 (No achou X) Enquanto Incio Fim e P = 0 // No terminou a busca e no achou Meio int ((Incio + Fim) / 2) // Calcula o Meio Se X = A [Meio] ento // Achou, no Meio P Meio Seno Se X < A [Meio] ento // X est antes do Meio Fim Meio 1 // Atrasa o fim Seno // X est depois do Meio Incio Meio + 1 // Avana o incio Fim-se Fim-se Fim-enquanto

11

1.9 Inserir elemento em uma posio


Inserir um valor X na posio P de um array A, com N elementos e capacidade para Max elementos. Soluo

A
5 4 1 8 3 4 3 9 2 2 1 5 ...

N
7

Max
100

X
7

P
4

Ordem dos movimentos

Para inserir um elemento na 4 posio, necessrio deslocar os elementos a partir dessa posio, uma posio para frente, iniciando pelo ltimo elemento. Se comear pela posio P, at o ltimo, o valor de A [P] ser repetido at o final. Aps a insero, a varivel N estar com 1 a mais. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array Inteiro Max 100 // Capacidade do array Inteiro X // Valor a ser inserido Inteiro P // Local onde ser inserido o valor X Booleano Ok // Se houve sucesso na insero Insere_X_em_P ( ) // Objetivo: Inserir o valor de X na posio de P de um array A Inteiro I Se N = Max ou P < 1 ou P > N + 1 ento //Array cheio ou P fora do limite Ok Falso Seno Para I de N at P passo 1 // Do fim at a posio P A [I+1] A [I] // Desloca uma posio Fim-para A [P] X // Insere X na posio P Ok Verdadeiro N N+1 // Aumenta qtde. de elementos Fim-se

1.10 Inserir elemento num array ordenado.


Inserir um valor X em um array A, em ordem crescente, de modo que A continue na mesma ordem. Soluo Percorre-se o array do fim para o comeo, verificando se X se encaixa antes do elemento apontado por I. Enquanto X < A [I], ou seja, se X puder ser inserido antes de A [I], desloca-se o elemento para frente, abrindo espao para a insero de X.

12

A busca termina quando se achar a posio para inserir X. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array Inteiro Max 100 // Capacidade do array Inteiro X // Valor a ser inserido Booleano Ok // Se houve sucesso na insero Insere_X_Ordenado ( ) // Objetivo: Inserir o valor de X no array A, em ordem crescente Inteiro I Booleano Achou Se N = Max ento // Array cheio Ok Falso Seno IN // ltima posio Achou Falso Enquanto I > 0 e No Achou Se X < A [I] ento // X se encaixa antes A [I + 1] A [I] // Desloca uma posio II1 // Recua ponteiro Seno Achou Verdadeiro // Achou local Fim-se Fim-enquanto A [I + 1] X // Insere X Ok Verdadeiro N N+1 Fim-se

1.11 Remover elemento de uma posio


Remover um elemento na posio P de um array A, com N elementos. Soluo

A
5 4 1 8 3 9 2 ...

N
7

Max
100

P
4

Se a posio de remoo for vlida, desloca-se cada elemento aps a posio de remoo, uma posio para trs. Observa-se que, aps a remoo, a varivel N est com o valor 6, ou seja, o array tem um elemento a menos.

A
5 4 1 3 9 2 ...

N
6

Max
100

P
4

13

ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array Inteiro P // Local onde ser removido o elemento Booleano Ok // Se houve sucesso na remoo Remover_Na_Posio ( ) // Objetivo: Remover o elemento na posio de P de um array A Inteiro I Se P < 1 ou P > N + 1 ento // P fora do limite Ok Falso Seno Para I de P + 1 at N // Aps P at o fim A [I 1] A [I] // Desloca uma posio para trs Fim-para N N1 // Diminui quantidade de elementos OK Verdadeiro Fim-se

1.12 Remover elementos iguais a X


Remover, de um array A com N elementos, todos os elementos iguais a X. Soluo Copia-se cada valor de A X nas posies iniciais do prprio array A. Quando for encontrado um valor = X, este no copiado. Usa-se a varivel J para controlar a quantidade de elementos que ficaram em A. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array Inteiro X // Valor a ser removido Remover_Todos ( ) // Objetivo: Remover todos os elementos com valor X Inteiro I, J J 0 Para I de 1 at N Se A [I] X ento JJ+1 // Mais um elemento no incio A [J] A [I] // Atribui elemento da posio I na posio J Fim-se Fim-para NJ // Atualiza quantidade de elementos de A

14

1.13 Gerar um array sem duplicidade, a partir de um array ordenado


Dada um array A, em ordem crescente, com NA elementos, gerar um array B, sem duplicidades e mantendo a ordem de A. Soluo O primeiro elemento de A pode ser copiado em B, pois no existe em B. Para cada elemento de A, a partir do segundo, se for diferente do anterior, copi-lo em B.

A
2 3 3 5 6 6 7 ...

NA
7

MaxA
100

B
2 B. 3 5 6 7 ...

NB
5

MaxB
100

No se pode esquecer de atualizar NB, que ter a quantidade de elementos copiados em ARRAY Inteiro A (100), B (100) // Arrays com capacidade para 100 nmeros inteiros Inteiro NA, NB // Quantidade de elementos dos arrays A e B Inteiro MaxA 100 // Capacidade do array A Inteiro MaxB 100 // Capacidade do array B Eliminar_Duplicidades ( ) // Objetivo: Criar um array B, sem duplicidades, a partir de um array A, // ordenado, mantendo a ordem de A Pr-Condio: NA > 0 // Array A no vazio Inteiro I NB 1 B [1] A [1] Para I de 2 at NA // Do segundo at o ltimo Se A [I] A [I 1] ento // Elemento diferente do anterior NB NB + 1 // Aumenta tamanho de B B [NB] A [I] // Elemento novo em B Fim-se Fim-para

15

1.14 Gerar um array sem duplicidade, a partir de um array no ordenado.


Dada um array A, no ordenado, com NA elementos, gerar um array B, sem duplicidades e mantendo a ordem de A. Soluo O primeiro elemento de A pode ser copiado em B, pois no existe em B. Para cada elemento de A, a partir do segundo, se no existir em B, copi-lo em B. ARRAY Inteiro A (100), B (100) // Arrays com capacidade para 100 nmeros inteiros Inteiro NA, NB // Quantidade de elementos dos arrays A e B Inteiro MaxA 100 // Capacidade do array A Inteiro MaxB 100 // Capacidade do array B Eliminar_Duplicidades_2 ( ) // Objetivo: Criar um array B, sem duplicidades, a partir de um array A, no vazio, // no ordenado, mantendo a ordem de A Inteiro I, J NB 1 B [1] A [1] Para I de 2 at NA // Do segundo at o ltimo J1 Enquanto A [I] B [J] e J < NB // Pesquisa A[I] em B JJ+1 Fim-enquanto Se A [I] B [J] ento // Elemento no existe em B NB NB + 1 B [NB] A [I] // Acrescenta elemento em B Fim-se Fim-para

1.15 Moda de um array (usando crivo)


Dada um array X, no ordenado, com N elementos do tipo Inteiro, obter o valor que mais ocorre, ou seja, a moda do array. Se houver empate, considerar a primeira ocorrncia. Soluo Pode-se comparar cada valor com os seguintes e contar quantas vezes o valor se repete. Se essa quantidade for maior que a quantidade da Moda (valor que mais ocorre), substituir essa quantidade pela nova contagem e guardar o valor da nova Moda. Para se evitar comparaes desnecessrias, usa-se um array de crivo, para marcar a posio dos elementos que so repeties de algum elemento anterior. O crivo um array com a mesma quantidade de elementos de A, e iniciado com zeros, indicando que nenhum elemento repetio de outro. medida que as varreduras acontecem, os elementos repetidos so marcados (com 1, por exemplo). Quando se chega a uma posio j marcada, ou seja, quando no respectivo local no crivo o valor for = 1, no necessrio compar-la com as demais.

16

4 0

7 0

4 0

6 0

X 7 C 0

2 0

7 0

9 0

6 0

7 0

N 10 Moda 0 Posio 0

Aps a primeira varredura, que compara o primeiro elemento com os demais, o crivo estar com os seguintes valores: 0 0 1 0 C 0 0 0 0 0 0 Moda 2 Posio 1

Aps a segunda varredura, que compara o segundo elemento (que no est marcado) com os demais, o crivo estar com os seguintes valores: 0 0 1 0 C 1 0 1 0 0 1 Moda 4 Posio 2

O terceiro elemento no comparado com os demais, pois j est marcado ( uma repetio de um elemento anterior, no caso o valor 4). Aps todas as varreduras, o crivo estar com os seguintes valores: 0 0 1 0 C 1 0 1 0 1 1 Moda 4 Posio 2

Um esboo para esse algoritmo : Iniciar crivo com zeros Iniciar Moda com zero Iniciar Quantidade de ocorrncias da Moda com zero Para cada elemento de A, at o penltimo Se no for uma repetio (crivo no marcado) Iniciar contador de ocorrncias com 1. Para cada elemento aps o atual, at o ltimo Se no for uma repetio (crivo no marcado) Se valor for igual ao atual Contador de ocorrncias + 1 Crivar o local Se Contador de ocorrncias > Quantidade da Moda Moda Valor atual Quantidade da Moda Contador de ocorrncias

17

ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array Inteiro Max 100 // Capacidade do array Inteiro Moda // Valor que mais ocorre Inteiro Qt_Moda // Quantidade de ocorrncias Moda ( ) Inteiro C (N) // Array de crivo Inteiro I, J, Contador Para I de 1 at N C [I] 0 // Zera o array de crivo Fim-para Moda 0 Qt_Moda 0 Para I de 1 at N 1 Se C [I] = 0 ento // Valor no uma repetio Contador 1 Para J de I + 1 at N Se C [J] = 0 ento Se A [I] = A [J] ento // Repetio Contador Contador + 1 C [J] 1 // Marca local da repetio Fim-se Fim-se Fim-para Se Contador > Qt_Moda Moda A [I] Qt_Moda Contador Fim-se Fim-se Fim-para Note que o valor final do array de crivo pode ser usado para determinar os elementos no repetidos do array A. Uma melhoria no algoritmo poderia ser feita parando a varredura na ltima posio no marcada (os elementos restantes seriam todos repeties). Pode-se usar uma estratgia diferente no caso de um array ordenado, pois as repeties esto juntas. Soluo com array de freqncia Pode-se usar outra estratgia caso se saiba que os elementos de A esto entre 1 e 12 (por exemplo, meses do ano). Nesse caso, pode-se usar o contedo de cada elemento como ndice de um array de freqncia, com 12 elementos.

18

Moda_2 ( ) Inteiro I, Freq (12) Para I de 1 at 12 Freq [I] 0 Fim-para Para I de 1 at N Freq [A[I]] Freq [A[I]] + 1 Fim-para Moda 1 Qt_Moda Freq [1] Para I de 2 at 12 Se Freq [I] > Qt_Moda ento Qt_Moda Freq [I] Moda I Fim-se Fim-para

// Zera array de freqncia // Calcula freqncia

1.16 Ordenao por seleo


Ordenar um Array A, com N nmeros inteiros, em ordem crescente. Soluo A idia desse mtodo selecionar o menor elemento e coloc-lo na primeira posio do array, o segundo menor na segunda posio, e assim por diante. Para selecionar o menor elemento, compara-se o valor de cada posio com os valores seguintes, at o ltimo. Se for encontrado algum valor menor, salva-se sua posio. No final, se foi encontrado algum valor menor, efetua-se a troca de contedo. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de nmeros Inteiro Max 100 // Capacidade do array Ordenar_Seleo ( ) // Objetivo: Ordenar um array pelo mtodo da seleo do menor Inteiro I, J, Pmenor, Aux Para I de 1 at N 1 // Do primeiro at o penltimo PMenor I // Inicia posio do menor Para J de I + 1 at N // Do seguinte at o ltimo Se A [J] < A [I] ento PMenor J // Posio do novo menor Fim-se Fim-para Se PMenor <> I ento Aux A [I] // Troca contedo A [I] A [PMenor] A [PMenor] Aux Fim-se Fim-para

19

1.17 Ordenao por insero direta


Ordenar um array A, com N nmeros inteiros, em ordem crescente. Soluo A idia desse mtodo que o comeo do array esteja ordenado e, cada elemento restante seja inserido na posio correta na parte ordenada. No incio, somente o primeiro elemento est em ordem. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de nmeros Inteiro Max 100 // Capacidade do array Ordenar_Insero ( ) // Objetivo: Ordenar um array pelo mtodo da insero direta Inteiro I, J, Aux Booleano Inserir Para I de 2 at N // Do segundo at o ltimo JI1 // Qtde. elementos em ordem Aux A[I] // Elemento a ser inserido Inserir Falso Enquanto J > 0 e No Inserir Se Aux < A [J] ento // X se encaixa antes A [J + 1] A [J] // Desloca uma posio JJ1 // Recua ponteiro Seno Inserir Verdadeiro // Pode inserir Fim-se A [J + 1] Aux // Insere elemento Fim-enquanto Fim-para

20

1.18 Bubble Sort


A cada varrida, os elementos so comparados, dois a dois, e o maior valor vai sendo borbulhado para o fim, sendo trocado por elementos menores, que vo sendo deslocados para o incio do array. A quantidade de elementos para serem borbulhados diminui de 1 a cada varrida, at que restem apenas 2 elementos. ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de nmeros Inteiro Max 100 // Capacidade do array Ordenar_Bubble ( ) // Objetivo: Ordenar um array pelo mtodo da bolha Inteiro I, J, Aux Para I de N at 2 passo 1 // Quantidade de elementos Para J de 1 at I 1 // Quantidade de comparaes Se A [J] > A [J+1] ento // Elemento fora de ordem Aux A [J] // Troca A [J] A [J+1] A [J+1] Aux Fim-se Fim-para Fim-para O algoritmo pode ser melhorado colocando-se um controle para que perceber que em uma varrida no ocorreram trocas, indicando que o array j est ordenado. Ordenar_Bubble ( ) // Objetivo: Ordenar um array pelo mtodo da bolha Inteiro I, J, Aux Booleano Trocou Verdadeiro IN Enquanto I > 1 e Trocou // H elementos p/ borbulhar e trocou Trocou Falso Para J de 1 at I 1 Se A [J] > A [J+1] ento Aux A [J] A [J] A [J+1] A [J+1] Aux Trocou Verdadeiro // Indica que houve troca Fim-se Fim-para II1 Fim-enquanto Outra melhoria seria guardar a posio onde foi feita a ltima troca, indicando que os elementos dali para frente j esto em ordem.

21

Ordenar_Bubble ( ) // Objetivo: Ordenar um array pelo mtodo da bolha Inteiro I, J, Aux, Ultima_Troca IN Enquanto I > 1 Para J de 1 at I 1 Se A [J] > A [J+1] ento Aux A [J] A [J] A [J+1] A [J+1] Aux Ultima_Troca J // Local da ltima troca Fim-se Fim-para I Ultima_Troca // Diminui conjunto Fim-enquanto

1.19 Carga de array, com sentinela


Quando no se sabe quantos elementos sero carregados no array, pode-se finalizar a seqncia de valores de entrada com um valor fora do padro do conjunto, que servir para avisar o fim dos dados (sentinela). Como exemplo, se o conjunto de nmeros positivos, a sentinela pode ser um valor negativo. necessrio tambm testar o limite fsico do array antes de armazenar um novo valor, para no fazer alocaes invlidas. Para no armazenar a sentinela no array, feita a leitura de cada valor em uma varivel fora do array e, se o valor lido for > 0, armazena-se esse valor no array. O esboo do algoritmo : Leia o 1o. valor Iniciar quantidade de elementos (N) com zero Enquanto valor sentinela e tiver espao no array Incrementar quantidade de elementos (N +1) Armazenar valor na ltima posio (N) do array Ler prximo valor

ARRAY Inteiro A (100) // Array com capacidade para 100 nmeros inteiros Inteiro N // Quantidade de elementos do array A Inteiro Max 100 // Capacidade do array A Carregar ( ) Inteiro Valor Leia (Valor) // Ler o primeiro N0 Enquanto Valor > 0 e N < Max // No a sentinela e tem espao NN+1 A [N] Valor // Guardar valor no array, na posio N Leia (Valor) // Ler o prximo Fim-enquanto

22

1.20 Carga de uma matriz (com quantidade de elementos determinada)


A carga de uma matriz (array multidimensional) pode ser feita pelas linhas (sentido horizontal de preenchimento) ou pelas colunas (sentido vertical). Na carga por linhas, fixa-se cada linha e varia-se a coluna. MATRIZ Inteiro A (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro M, N // Quantidade de linhas e colunas da matriz Inteiro MaxL 10 // Capacidade de linhas da matriz Inteiro MaxC 10 // Capacidade de colunas da matriz Booleano OK // Indicador de sucesso na carga Carregar ( ) // Objetivo: Carregar um array com uma quantidade pr-definida de elementos Inteiro I, J Leia (M, N) Se M < 1 ou M > MaxL ou N < 1 ou N > MaxC ento OK Falso Seno Para I de 1 at M // Para cada linha da matriz Para J de 1 at N // Para cada coluna da matriz Leia (A [I, J]) // Leia valor para a linha I coluna J Fim-para Fim-para Fim-se

1.21 Soma de matrizes


Calcular a soma de duas matrizes A e B, de mesma ordem. Soluo Os elementos da matriz soma so calculados somando cada elemento de A com o da mesma posio em B. Exemplo: Somar A (3X2) + B (3X2) A 3 2 2 1 2 4 + 2 3 1 B 1 2 5 = 5 5 3 S 2 4 9

23

MATRIZ Inteiro A (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro B (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro S (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro La, Ca // Quantidade de linhas e colunas da matriz A Inteiro Lb, Cb // Quantidade de linhas e colunas da matriz A Inteiro Ls, Cs // Quantidade de linhas e colunas da matriz S Booleano Ok // Se possvel somar A com B Soma ( ) // Objetivo: Soma da matriz A com B Inteiro I, J Se La Lb ou Ca Cb ento // Matrizes no de mesma ordem OK Falso Seno Para I de 1 at La // Linhas da matriz A Para J de 1 at Ca // Colunas da matriz A S [I, J] A[I, J] + B [I, J] Fim-para Fim-para Ok Verdadeiro Fim-se

1.22 Produto de matrizes


Calcular o produto de duas matrizes A e B. Soluo Para que o produto possa ser efetuado, necessrio que a quantidade de colunas de A seja igual quantidade de linhas de B. A matriz resultante ter a quantidade de linhas de A e a quantidade de colunas de B, ou seja: A (3 x 2 ) * B (2 X 3) = P (3 X 3). Os elementos do produto so calculados da seguinte forma: Para I de 1 at qtde. de linhas de A Para J de 1 at a quantidade de colunas de B N (quantidade de colunas de A e de linhas de B) P i, j =

K=1 1 2 4

A i, k * B k, j

3 Exemplo: 2 2

2 * 3

1 2

2 1 =

9 10 16

5 6 10

7 6 8

24

MATRIZ Inteiro A (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro B (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro P (10,10) // Matriz com capacidade para 10 linhas e 10 colunas Inteiro La, Ca // Quantidade de linhas e colunas da matriz A Inteiro Lb, Ca // Quantidade de linhas e colunas da matriz A Inteiro Lp, Cp // Quantidade de linhas e colunas da matriz P Booleano Ok // Se possvel multiplicar A por B Produto ( ) // Objetivo: Produto da matriz A por B Inteiro I, J Se Ca Lb ento // Colunas de A Linhas de B OK Falso Seno Para I de 1 at La // Linhas da matriz A Para J de 1 at Cb // Colunas da matriz B P [I, J] 0 Para K de 1 at Ca // Parcelas da somatria P [I, J] P [I, J] +A [I,K]*B [K,J] Fim-para Fim-para Fim-para Ok Verdadeiro Fim-se

1.23 Intercalar dois arrays ordenados


Intercalar A e B, guardando o resultado em C Soluo Os ponteiros I e J comeam posicionados no primeiro elemento de A e de B respectivamente. Comparar um valor de cada array, usando, respectivamente, os ponteiros I e J. O menor entre A e B deve ir para C e ser reposto. Se forem iguais, copiar A em C e repor A e B. Repor um valor para comparao significa andar uma posio na lista, ou seja, avanar o ponteiro. Este mtodo chamado de balance line. ARRAY Inteiro A (100), B (100) Inteiro C (200) Inteiro NA, NB, NC Inteiro MaxA 100 Inteiro MaxB 100 Inteiro MaxC 200 // Arrays com capacidade para 100 nmeros inteiros // Array com capacidade para intercalar A e B // Quantidade de elementos dos arrays A, B e C // Capacidade do array A // Capacidade do array B // Capacidade do array C

25

Intercalar ( ) // Objetivo: Intercalar as listas A e B em C Pr-Condio: NA > 0 e NB > 0 Inteiro I, J NC 0 I1 J1 Enquanto I NA e J NB NC NC + 1 Se A [I] = B [J] ento C [NC] A [I] II+1 JJ+1 Seno Se A [I] < B [J] ento C [NC] A [I] II+1 Seno C [NC] B [J] JJ+1 Fim-se Fim-se Fim-enquanto Para K de I at NA NC NC + 1 C [NC] A [K] Fim-para Para K de I at NB NC NC + 1 C [NC] B [K] Fim-para

// Arrays no vazios

// H elementos no intercalados

// Elementos restantes em A

// Elementos restantes em B

1.24 Exerccios propostos


1. Dado um array A, com N elementos j existentes, e um nmero inteiro X, obter quantos elementos so menores que X. A N X Inf_X Exemplo: 4 8 5 6 2 9 7 ... 7 6 3 Dada um array A, com N nmeros inteiros, obter a mdia dos elementos pares. A N Mdia_Pares Exemplo: 4 9 8 5 3 7 6 ... 7 6 Dada um array A, com N nmeros inteiros, obter a mdia dos elementos de ordem par. A N Mdia_Ord_Par Exemplo: 4 9 8 5 3 7 2 ... 7 7

2.

3.

26

4.

Dado um array A, com N elementos j existentes, obter quantos elementos so pares e maiores que 10 A N Par_Sup_10 Exemplo: 4 18 15 6 12 9 17 ... 7 2 Dado um array A, com N nmeros inteiros, obter quantos elementos so maiores que a mdia aritmtica dos valores de A. A N Mdia Sup_Med Exemplo: 4 8 5 6 2 9 8 ... 7 6 3 Obter a maior diferena entre 2 elementos consecutivos de um array. A N Maior_Dif Exemplo: 4 8 5 6 2 9 8 ... 7 7 Dado um array A, com NA elementos, e um array B, com capacidade para, no mnimo NA elementos, copiar os elementos de A em B. A NA Exemplo: 4 9 5 6 2 3 8 1 8 Resposta 4 9 5 B 6 2 3 8 1 NB 8

5.

6.

7.

8.

Dada um array A, com N nmeros inteiros distintos, verificar se esto em ordem crescente. A N Ord_Cresc Exemplo: 4 8 9 5 12 15 18 ... 7 Falso Dada um array A, ordenado, verificar se existe algum elemento repetido. A N Repetido Exemplo: 4 8 9 10 10 15 18 ... 7 Verdadeiro Dado um array A, com N nmeros inteiros, colocar os elementos pares no comeo da lista e os impares no final, mantendo a ordem original. A N Exemplo: 4 7 5 6 9 2 8 ... 7 Resposta: 4 6 2 A 8 7 5 9 ... N 7 N 7 Ult_Par 4

9.

10.

11.

Dada um array A, obter o ltimo nmero par. A Exemplo: 4 8 5 6 4 7 13 ...

12.

Dado um array A, com NA nmeros inteiros, criar uma lista B que contenha os elementos de A maiores que 5. A NA NB B Exemplo: 5 13 7 3 9 4 10 ... 7 4 13 7 9 10 ...

27

13. 14.

Escrever um algoritmo que, dado um nmero inteiro N, N > 1, carregue um array A com os N primeiros termos da seguinte seqncia: 2, 2, 4, 6, 10, 16, ... Dado um array A, com NA nmeros inteiros, criar uma lista B que contenha os primeiros elementos impares de A, at a posio do primeiro par. Obs.: A lista A pode conter somente nmeros pares ou somente mpares. Exemplo: 5 3 A 7 9 2 11 10 ... NA NB 7 4 B 5 3 7 9 ...

15.

Dada uma lista A, no ordenada, com N elementos, verificar se existe algum elemento repetido. A N Repetido Exemplo: 4 8 5 6 4 7 13 ... 7 Verdadeiro Dada uma lista A, no ordenada, com N elementos, verificar se existe algum elemento que ocorre no mnimo 3 vezes. A Exemplo: 4 3 5 3 4 7 3 6 3 7 ... N 10 Ocorre_3 Verdadeiro

16.

17.

Dada uma lista A, no ordenada, com N elementos, verificar se existe algum elemento que ocorre exatamente 3 vezes. A Exemplo: 4 3 5 3 4 7 3 6 8 7 ... N 10 Ocorre_3 Verdadeiro

18.

Dado um array A, com N elementos, eliminar todos os elementos pares de A. A N Exemplo: 4 9 5 6 2 3 6 Resposta: 9 5 3 A ... N 3

19.

Dado um array A, com N elementos distintos, remover o maior elemento. A N Exemplo: 4 9 5 6 2 3 6 Resposta: 4 5 6 A 2 3 N 5

20.

Dado um array A, com NA nmeros inteiros, criar uma lista B tal que cada elemento de B seja o acumulado dos elementos de A at aquela posio. A NA NB B Exemplo: 6 4 8 10 3 5 7 7 6 10 18 28 31 36

28

21.

Dado um array A e um array B, ambos com elementos distintos, verificar quantos elementos de A pertencem tambm a B. A NA Exemplo: 4 9 5 6 2 3 8 1 8 9 Resposta: Q 5 5 B 12 7 4 11 3 6 NB 8

22.

Dada uma matriz A (M X N), coloca-la em ordem crescente da primeira coluna. Exemplo: A 3 Dado 4 2 1 2 4 Obter 2 3 4 A 4 1 2

23.

Dada uma matriz A, com M linhas e N colunas, obter a linha com a maior soma dos elementos. Se houver empate, considerar a primeira ocorrncia de linha. Exemplo: M 4 N 3 1 2 6 3 A 3 8 1 2 4 1 3 4 Resposta 2

24.

Verificar se uma matriz quadrada de ordem N forma um quadrado mgico, cuja soma das linhas, das colunas e das diagonais so iguais. Exemplo de quadrado mgico: 8 0 7 4 5 6 3 10 2

25.

Dada uma matriz quadrada de ordem N, verificar se a soma dos elementos da diagonal principal igual soma da diagonal secundria. Exemplo: N = 3 A = 1 5 3 7 2 6 4 10 6 Resposta = Sim

29

26.

Dado N, inteiro e positivo, criar uma lista com os nmeros primos at N, usando o crivo de Eraststenes.

O nmero 2 o nico primo que par. O crivo de Eraststenes consiste em escrever todos os mpares de 3 at N e eliminar todos os terceiros elementos aps 3, todos os quintos elementos aps o 5 e assim por diante, at que tenham sido eliminados todos os mltiplos dos mpares menores que a raiz quadrada de N. Os nmeros que sobrarem sem marcas (crivo) so os primos de 3 at N. Exemplo: Obter os primos at N = 35 Escrever os mpares at 35 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35

Eliminao dos terceiros elementos aps o 3 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 35 29 31 35

Eliminao dos quintos elementos aps o 5, at 3 5 7 11 13 17 19

23 25

Os nmeros restantes so os primos mpares at 35 3 27. 5 7 11 13 17 19 23 29 31

Dado um nmero N, inteiro e positivo, gerar as N primeiras linhas do tringulo de Pascal. Exemplo: Dado N = 5 Obter: 1 1 1 1 1 1 2 1 3 3 1 4 6 4 1

28.

Verificar se uma matriz dada forma um Quadrado Latino de ordem N, no qual em cada linha e em cada coluna aparecem todos os inteiros 1,2,3, ... N, ou seja, cada linha ou coluna permutao dos N primeiros nmeros inteiros. Exemplo: N = 4 A= 1 2 4 3 2 3 1 4 3 4 2 1 4 1 3 2 Resposta = Sim

30

29.

Dada uma matriz N X 2, contendo, em cada linha, as idades do homem e da mulher no casamento, criar uma matriz de freqncia de idade de casamento, com as contagens para cada combinao de idades. As idades variam de 18 at 100. Exemplo: H 22 25 25 24 28 27 25 19 23 24 24 ... M 23 23 23 25 32 22 23 22 22 24 25 ... HOMENS 18 19 20 21 22 23 24 25 26 27 18 19 20 21 22 23 24 25 26 27 ... ...

MULHERES

1 1

1 3 1 2

Baseado nessa matriz de freqncia, obter os seguintes dados: 1. Qual a idade mais freqente de casamento dos homens 2. Qual a idade mais freqente de casamento das mulheres 3. Qual a combinao mais freqente de idades de casamento

31

STRINGS

O tipo de dados string consiste de seqncias de caracteres. As operaes do tipo dependem de consider-lo como tipo primitivo ou como array de caracteres. Nesse material, sero considerados das duas formas, ou seja, permitindo-se o acesso direto a um caractere e tambm operaes de substring.

2.1 Contar A
Dado um string, obter quantas letras A existem nele. Exemplo: Dado INFORMATICA, Obter 2. Soluo

X
I N F O R M A T I C A

CtA
0

I
1 Pode-se efetuar a varredura do string X usando a varivel I, que comea com 1 e vai at o tamanho do string, ou seja, para cada valor de I, acessado um caractere de X, que comparado o caractere A. Se for igual, soma-se 1 no contador de letras A. TEXTO String X Inteiro CtA Conta_A ( ) // Objetivo: Contar letras A no texto Inteiro I Para I de 1 at tamanho (X) Se X [I] = A ento CtA CtA + 1 Fim-se Fim-para // Texto // Contador de letras A

2.2 Texto invertido


Dado um texto, inverter seu contedo (texto de trs para frente) Exemplo: Dado AGULHAS NEGRAS, Obter SARGEN SAHLUGA Soluo Uma estratgia fazer uma varredura do fim para o comeo e concatenar (grudar) cada caractere em um outro string, que comea nulo.

32

X
A G U Inv S A R G etc. L H A S N E G R A S

I
14

Para varrer o string do fim para o comeo pode-se usar um ndice que tem esse mesmo comportamento, ou seja, que varia do tamanho do string at 1, com passo 1. TEXTO String X, Inv Inverte ( ) // Objetivo: Inverte texto X Inteiro I Inv Para I = tamanho (X) at 1 passo 1 Inv Inv + X [I] Fim-para // Texto e seu inverso

// String nulo // Varredura do fim para o comeo // Concatena caracteres

A segunda estratgia semelhante primeira, exceto que o ndice varia do incio at o fim do texto, com passo 1, e usado em uma funo inversa, ou seja, medida que I cresce, o valor da funo decresce. Essa funo tamanho (X) I + 1. TEXTO String X, Inv Inverte ( ) // Objetivo: Inverte texto X Inteiro I Inv Para I de 1 at tamanho (X) Inv Inv + X [tamanho (X) I + 1] Fim-para // Texto e seu inverso

// String nulo // Varredura do comeo at o fim // Concatena caracteres

Na terceira estratgia, mudamos o lado em que os caracteres so concatenados ao string de sada. Os caracteres sero acessados do incio para o fim do texto, mas sero concatenados no string de sada ANTES, em vez de APS o resultado anterior.

X
A G U L H A S Inv L U G A etc. N E G R A S

I
14

33

TEXTO String X, Inv Inverte ( ) // Objetivo: Inverte texto X Inteiro I Inv Para I de 1 at tamanho (X) Inv X [I] + Inv Fim-para

// Texto e seu inverso

// Inicializa Inv com string nulo // Variao do comeo at o fim // Concatena caracteres ANTES

2.3 Procurar A
Dado um texto, obter a posio da primeira ocorrncia da letra A no texto. Se no houver letra A, obter zero. Exemplo: Dado INFORMATICA, Obter 7, que a posio da primeira ocorrncia de A Soluo

X
I N F O R M A T I C A

P
0

I
1 Pode-se varrer o string X, usando a varivel I, ENQUANTO no achar a letra A e no terminar o string, ou seja, enquanto P = 0 e o ndice estiver nos limites do string: I <= tamanho (X), e para cada caractere, verificar se um A. Se o A for encontrado a varivel P recebe o valor de I (ndice que est sendo usado para varrer X). Como a varivel P comea com 0, se continuar com 0 significa que no houve sucesso na busca. TEXTO String X //Texto Inteiro P // Posio do primeiro A Procura_A ( ) // Objetivo: Obter a posio do primeiro A no texto Inteiro I P0 // Inicia P com 0 (No achou ) o I 1 // Apontar para o 1 caracter Enquanto P = 0 e I tamanho (X) // No achou e no terminou Se X [I] = A ento PI // Guarde em P o local onde achou Seno II+1 // Avana o ponteiro Fim-se Fim-enquanto

34

2.4 Normalizar string


Dado um string X, com pelo menos um caractere diferente de espao, criar um string Y sem os espaos desnecessrios em X. Exemplo: Dado ESPAOS A MAIS Obter ESPAOS A MAIS Soluo )

X
E S P A O S Incio 4 A MA I S Fim 19

Uma frase no normalizada pode ter espaos antes da primeira letra, aps a ltima letra ou no meio. Os espaos antes e depois so sempre desnecessrios. Os espaos do meio s so desnecessrios se estiverem duplicados. Assim, podemos usar mtodos diferentes para elimin-los. Para localizar a primeira letra pode-se iniciar um ndice com 1 e avan-lo enquanto o caractere for diferente de espao. Para os espaos no fim pode-se iniciar um ndice com o tamanho do string e recu-lo enquanto o caractere for diferente de espao. Um caractere do meio deve ser concatenado ao string de sada se for diferente de espao ou se for um espao e o caractere anterior for diferente de espao. TEXTO String X, Y // Texto original e normalizado Normalizar ( ) // Objetivo: Eliminar espaos desnecessrios Inteiro I Inteiro Incio, Fim, I Inicio 1 Enquanto X [Incio] = // Localizar primeiro caractere Incio Inicio + 1 Fim-enquanto Fim tamanho (X) Enquanto X (Fim) = // Localizar ltimo caractere Fim Fim 1 Fim-enquanto Y // String nulo Para I de Incio at Fim // Varre parte interna Se X [I] ento Y Y + X [I] Seno Se X [I 1] ento // Caractere anterior Y Y + X [I] Fim-se Fim-se Fim-para

35

2.5 Contar palavras comeadas por E


Dado um string normalizado, obter a quantidade de palavras que comeam por E. Exemplo: Dado: ESCOLA DE EDUCAO FSICA, Obter: 2. Soluo Anterior E S C O L A I 1 Uma palavra inicia com uma letra e tem um espao antes. Na varredura do string, podemos verificar se o caractere anterior um espao e o atual um E e somar 1 no contador de letras E. Como o string est normalizado, apenas a primeira palavra no tem espao antes. No se pode comparar X [I] com X [I 1] na primeira vez, pois X [0] estaria fora do string. Pode-se criar uma varivel para armazenar o caractere anterior, iniciando com espao. Antes de avanar o ndice, o caractere atual salvo nesta varivel. TEXTO String X // Texto Inteiro CtPal_E // Contador de palavras iniciadas por E ContaPal_E ( ) // Objetivo: Contar palavras comeadas por E Inteiro I String Anterior // Caractere anterior Para I de 1 at tamanho (X) Se Anterior = // Comeo de palavra Se X [I] = E ento // Palavra comeada por E CtPal_E CtPal_E + 1 // Soma 1 no contador Fim-se Fim-se Anterior X [I] // Guarda caractere atual Fim-para Uma soluo para evitar-se o problema da primeira palavra sem criar-se uma varivel para o controle do caractere anterior acrescentar um espao antes do string. Assim, a primeira palavra tambm ser precedida por um espao. A varivel auxiliar Y cpia de X, para que se possa preservar o valor de X. D E X E D U C O F S I C A

36

ContaPal_E ( ) // Objetivo: Contar palavras comeadas por E Inteiro I String Y + X // Espao antes do texto Para I de 2 at tamanho (Y) Se Y [I 1] = // Comeo de palavra Se Y [I] = E ento // Palavra comeada por E CtPal_E CtPal_E + 1 // Soma 1 no contador Fim-se Fim-se Fim-para

2.6 Maior palavra


Dado um string normalizado, obter a maior palavra dele. Soluo Pode-se varrer o string e concatenar letras numa varivel, formando uma palavra. Quando encontrar um espao, indicando o fim dessa palavra, compara-se o seu tamanho com o tamanho de uma varivel que guarda a maior palavra. Se for maior, substitu-se a maior palavra pela palavra atual O espao colocado aps o ltimo caractere funciona como uma sentinela, pois avisa o fim da ltima palavra, sem a necessidade de um procedimento especial para ela. TEXTO String X, Maior_P // Texto e maior palavra MaiorPalavra ( ) // Objetivo: Obter a maior palavra do texto Inteiro I String Anterior // Caractere anterior XX+ // Espao aps o ltimo caractere Maior // Inicia Maior Palavra // Inicia Palavra Para I de 1 at tamanho (X) Se X [I] A e X [I] Z ento // Letra Palavra Palavra + X [I] // Concatena letra Seno Se tamanho (Palavra) > tamanho (Maior) ento Maior Palavra Fim-se Palavra // Reinicializa Palavra Fim-se Fim-para Se no usar o espao no final, necessrio, aps o loop, perguntar novamente pelo tamanho, para no deixar a ltima palavra sem tratamento.

37

2.7 Palndromo
Verificar se uma frase palndromo, ou seja, se tem os mesmos caracteres quando lida da esquerda para a direita e vice-versa. Exemplos de palavras ou frases palndromos: OVO, MUSSUM, ARARA, ZE DE LIMA RUA LAURA MIL E DEZ, SOCORRAM-ME SUBI NO ONIBUS EM MARROCOS, AMOR ME AMA EM ROMA Soluo Uma estratgia usar um ndice para varrer o texto da esquerda para a direita comeando com 1 e outro para varrer da direita para a esquerda comeando com o tamanho do string e comparar uma letra de cada lado, simetricamente, ou seja, a primeira letra comparada com a ltima, a segunda com a penltima etc. Se as letras no forem iguais, a frase no palndromo, e a varivel Palndromo recebe Falso. Se forem iguais, ocorre o avano do ndice I e o recuo do ndice J, em direo ao centro, enquanto I < J. Se o string tiver tamanho impar, haver um caractere central ( I = J ), no sendo necessrio haver comparao nesta posio.

X
A M O R I 6 M E A M A E M R O M A J 14

A varivel booleana Palndromo comea com Verdadeiro e, caso o string no seja palndromo, se torna Falsa. O esboo do algoritmo : Palndromo Verdadeiro I Primeiro J ltimo Enquanto I < J e Palndromo faa Se os contedos das posies I e J forem letras, ento Se as letras so iguais ento Avana I e Recua J Seno Palndromo Falso Seno Se o contedo da posio I no for letra, Avana I Se o contedo da posio I no for letra, Recua J

38

TEXTO String X // Texto Booleano Palndromo // Se ou no palndromo Verifica_Palndromo ( ) // Objetivo: Verificar se uma palavra ou frase palndromo Inteiro I, J // Ponteiros Booleano LetraI, LetraJ // Se ou no uma letra na posio Palndromo Verdadeiro // Comea dizendo que palndromo I1 // Primeiro caractere J tamanho (X) // ltimo caractere Enquanto I < J e Palndromo faa LetraI X [I] A e X [I] Z LetraJ X [J] A e X [J] Z Se LetraI e LetraJ ento // Posies I e J tm letras Se X [I] = X [J] ento // Letras so iguais II+1 // Avana I JJ1 // Recua J Seno Palndromo Falso Fim-se Seno Se no LetraI ento I I + 1 // Posio I no tem letra Se no LetraJ ento J J 1 // Posio J no tem letra Fim-se Fim-enquanto Outra soluo seria criar um string Y apenas com as letras de X. Se Y for igual ao inverso de Y ento X palndromo. Seno, no . S letras X SOCORRAM-ME EM MARROCOS Y string nulo Para cada caractere de X, Se caractere letra ento concatenar em Y Se Y = Inverso (Y) ento Palndromo Verdadeiro seno Palndromo Falso Y SOCORRAMMEEMMARROCOS

2.8 Romano para arbico


Dado um nmero inteiro, positivo, menor que 1000, escrito em algarismos romanos, convert-lo para algarismos arbicos. Pr-condio: O dado de entrada est correto. Exemplo: Dado LXXIV, Obter 74

39

Soluo Os valores dos algarismos romanos so: I = 1; V = 5; X = 10; L = 50; C = 100; D = 500 e M = 1000. Vamos varrer o string com os algarismos romanos do fim para o comeo e acumular os valores dos algarismos romanos na varivel com o nmero em arbico. O critrio para acumular depende do valor do algarismo romano e da posio que ele ocupa. Se o valor de um algarismo romano for maior que o valor do algarismo seguinte a ele, devemos somar seu valor. Seno, devemos subtrair seu valor do nmero em arbico. A varivel Seguinte comea com 0, ou seja, o valor do primeiro algarismo romano sempre somado no acumulador. Exemplos: XI O valor de X maior que o seguinte (= I), portanto somamos 10 com 1 XC O valor de X menor que o seguinte (= C), portanto subtramos 10 de 100 LXXIV 0 + 5 = 5; 5 1 = 4; 10 + 4 = 14; 10 + 14 = 24; 50 + 24 = 74 NMEROS String Rm // Nmero em algarismos romanos Inteiro Ar // Nmero em algarismos arbicos Rom2Arab ( ) // Objetivo: Converter nmero em romano para arbico // Pr-condio: O nmero romano est escrito corretamente Inteiro I, Valor, Seguinte Ar 0 Seguinte 0 Para I de tamanho (R) at 1 passo -1 Caso R [I] seja // Determinar valor do algarismo I : Valor 1 V : Valor 5 X : Valor 10 L: Valor 50 C: Valor 100 D : Valor 500 M : Valor 1000 Fim-caso Se Valor Seguinte ento Ar Ar + Valor Seno Ar Ar Valor Fim-se Seguinte Valor Fim-para

40

2.9 Exerccios propostos


1. Contar quantas vogais existem em um dado string. Exemplo: Dado PRATELEIRAS, Obter 4. 2. Dado um nome, obter a soma das letras do nome, conforme a posio da letra no alfabeto: A=1, B=2, C = 3 etc. Exemplo: Dado BILL GATES, Obter 87, pois B = 2, I = 9, L = 12 etc. e 2 + 9 + 12 + 12 + 7 + 1 + 20 + 5 + 19 = 87 3. Dado um nome, obter a soma das letras, de acordo com o valor da letra na tabela ASCII: A=65, B=66, ..., Z = 90. Exemplo: Dado WINDOWS, Obter, pois ASC (W) = 87, ASC (I) = 73 etc. e 87 + 73 + 78 + 68 + 79 + 87 + 83 = 555 4. Dado o n de um ms, obter seu nome, sem utilizar uma pergunta para cada ms. Exemplo: Dado 2, Obter FEVEREIRO. 5. Obter a primeira e a ltima palavra de um texto normalizado , ou seja, sem espaos desnecessrios. Exemplo: Dado ESTE TEXTO UM EXEMPLO, Obter ESTE e EXEMPLO 6. Procurar uma palavra num dado string. Se encontrou, retornar a posio no string. Seno, retornar 0. Exemplo: Dado a palavra RIT e o texto ALGORITMO, Obter 5. 7. Dado um string, calcular o tamanho mdio das palavras. O string j est normalizado, ou seja, sem espaos desnecessrios. Exemplo: Dado ISTO APENAS UM EXEMPLO, Obter 4, pois ( 4 + 1 + 6 + 2 + 7 ) / 5 = 4 8. Dado um string normalizado, obter a quantidade de palavras desse string que comeam por vogal. Exemplo: Dado ESTE STRING EST NORMALIZADO, Obter 2

41

9. Dado uma palavra P, que ocorre exatamente uma vez em um string X, localizar esta palavra e coloc-la entre parnteses. Exemplo: Dada P = MELHOR e X = MEU MELHOR ALGORITMO, Obter X = MEU (MELHOR) ALGORITMO 10. Dado um string X e um string Y, verifique se X ocorre em Y, tanto da esquerda para a direita, como vice-versa. Exemplo: Dado X = BOM Obter Sim Y = ABCBOMOBAKL,

11. Dado um string S, normalizado, mostrar quantas palavras tm mais de 3 caracteres. Exemplo: Dado ISTO APENAS UM EXEMPLO, Obter 3 12. Dado um string, qual a palavra que contem a maior quantidade de A. Exemplo: Dado VAMOS PARA AIURUOCA OU CAXAMBU, Obter AIURUOCA 13. Dado um string, qual a maior seqncia de vogais existente. Exemplo: Dado VAMOS PARA AIURUOCA OU CAXAMBU, Obter AIU 14. Dado um texto, localizar a letra que mais se repete no texto. Se houver mais que uma, considerar a primeira, da esquerda para a direita. Exemplo: Dado VAMOS TESTAR TODO O TEXTO, Obter O 15. Dado um nome, criar um string com o sobrenome seguido por vrgula e cada letra do nome seguida por um ponto. Exemplo: Dado JOS CARLOS SILVA, Obter SILVA, J.C. 16. Dado um string X e um string Y, criar um string Z com os caracteres de X que no pertencem a Y Exemplo: Dado X = ALGORITMO, Y = ARTE Obter Z = LGOIMO 17. Dada uma letra maiscula, criar um string que contenha uma letra A, duas letras B, trs letras C etc, at a letra dada Exemplo: Dado E, Obter ABBCCCDDDDEEEEE

42

18. Dado um string, criar um novo string contendo, na ordem em que aparecem no string dado, as vogais no comeo e as consoantes no final. Exemplo: Dado AGULHAS NEGRAS, Obter AUAEAGLHS NGRS 19. Dado um string X, criar um novo string, de acordo com a seguinte regra de criptografia: trocar cada letra A pela letra M, cada M por A, cada T por I e cada I por T. Exemplo: Dado MATEMATICA, Obter AMIEAMITCM 20. Dado um string S, normalizado, e uma letra, mostrar quantas palavras de S tm a letra dada. Exemplo: Dado S = CONTAR PALAVRAS COM UMA LETRA DADA, Obter 5. 21. Dado um string S, normalizado, criar um texto numa lngua fictcia, substituindo as vogais, respectivamente, por AINS, ENTER, INS, OMBER e UNFTER. Exemplo: Dado S = CRIAR NOVA LNGUA Obter: CRINSAINSR NOMBERVAINS LNSNGUNFTERAINS 22. Dado um nmero inteiro, positivo, menor que 1000, escrito em algarismos arbicos, converte-lo para algarismos romanos. Pr-condio: O dado de entrada est correto. Exemplo: Dado 123, Obter CXXIII 23. Calcular uma distribuio de freqncia de letras de um string. Exemplo: Dado AIURUOCA, Obter A C I O R U 2 1 1 1 1 2

24. Dado um nmero inteiro, mostr-lo por extenso. Exemplo: Dado 123, Obter CENTO E VINTE E TRS

43

25. Dada uma data de nascimento de uma pessoa e sua hora de nascimento, obtenha seu signo e o seu ascendente. SIGNO ries Touro Gmeos Cncer Leo Virgem Libra Escorpio Sagitrio Capricrnio Aqurio Peixes NASCIMENTO 21/03 21/04 21/05 21/06 22/07 23/08 23/09 23/10 22/11 22/12 21/01 20/02 a a a a a a a a a a a a 20/04 20/05 20/06 21/07 22/08 22/09 22/10 21/11 21/12 20/01 19/02 20/03

Para o clculo do signo ascendente (em funo do horrio de nascimento), usa-se a seguinte regra prtica: Das 6:00 s 8:00 horas da manh, o ascendente o prprio signo solar. Das 8:00 s 10:00 o seguinte, e assim por diante. Se houve horrio de vero no perodo, deve-se considerar a hora de nascimento como se no tivesse havido. Exemplo: Uma pessoa que tenha nascido s 15:30 horas de um dia 16/11, seria do signo de Escorpio, e seu ascendente seria Peixes. 6:00 s 8:00 Escorpio 8:00 s 10:00 Sagitrio 10:00 s 12:00 Capricrnio 12:00 s 14:00 Aqurio 14:00 s 16:00 Peixes

Das könnte Ihnen auch gefallen