You are on page 1of 31

AGREGADOS HOMOGNEOS

At agora, trabalhamos com identificadores que podiam ser associados a um nico valor de dado compatvel com o seu tipo. Estes identificadores tambm so conhecidos como identificadores de tipos simples ou primitivos. Um agregado homogneo um conjunto de dados do mesmo tipo, organizados de tal forma que podem ser associados a um nico identificador. Para que o identificador seja capaz de aceitar esta associao, ele deve ser declarado como sendo de um tipo estrutura de dados. Existem vrios tipos de dados estruturados, como conjuntos (vetores e matrizes), registros (agregado heterogneo) e arquivos. Iniciaremos o nosso estudo com o tipo conjunto.

7.1. CONJUNTOS UNIDIMENSIONAIS


O identificador que for declarado como sendo de um tipo estruturado conjunto pode ser associado a uma certa quantidade de dados que pertenam a um mesmo tipo base. Isto , se ns definirmos um conjunto capaz de armazenar valores do tipo inteiro, somente podemos atribuir a este conjunto valores de dados que sejam numricos e inteiros. A quantidade de dados que pode ser associado ao conjunto, deve ser definida atravs de um dimensionamento prvio. Este dimensionamento feito pela pessoa que constri o algoritmo. O dimensionamento serve para informar que naquele conjunto o nmero mximo de dados que pode, a ele ser associado, j foi definido, e que nunca podemos associar mais dados do que aquela quantidade que foi prevista no dimensionamento da estrutura, e nem modific-lo durante a execuo do algoritmo. Note que temos sempre que respeitar o limite mximo do conjunto, mas por outro lado no proibido utilizar um limite mnimo, ou seja, associar ao conjunto uma quantidade menor de dados do que aquela prevista no dimensionamento. Devido a este fato, definiremos dois atributos de um conjunto Tamanho fsico (TF), que representa o nmero mximo de dados que podem ser associados ao conjunto; Tamanho lgico (TL), que representa o nmero de dados que esto associados com o conjunto. Devemos observar que sempre teremos TL <= TF.

Ilustramos isto com o seguinte exemplo: ConjuntoX 8 7 4 TL TF -22 444 -55

Neste exemplo temos o conjuntoX, que tem capacidade para armazenar 11 elementos do tipo inteiro, e no entanto, existem somente 7 elementos associados. Assim, temos que TF vale 11 e TL vale 7. O conjunto de operaes e aes que podem manipular um conjunto estruturado de dados depender da estrutura de dados utilizada e do tipo do elemento componente da estrutura. Para efeito de simplicidade, assumiremos que existe uma ao que comum para todas as estruturas de dados, a atribuio, ou seja, um identificador estruturado pode sofrer a ao de atribuio, fazendo com que os elementos do conjunto atribudo sejam copiados para o conjunto que recebe a atribuio. Para implementar esta ao em uma linguagem computacional qualquer, necessrio verificar se a linguagem computacional escolhida d suporte para este tipo de operao. conjunto1 conjunto2; Neste exemplo, conjunto1 recebe uma cpia de todos os elementos que compe conjunto2, ou os elementos que compe conjunto2 esto sendo copiados e atribudos ao conjunto1. Mas para fazermos uso da ao de atribuio temos que certificar as seguintes propriedades entre o conjunto que est sendo atribudo e o conjunto que est recebendo a atribuio 1 - ambos os conjuntos devem ser compatveis quanto ao tipo de seus componentes. Ou seja, se o conjunto2 for composto de elementos numricos inteiros, ento o conjunto1 deve ser definido para receber elementos numricos inteiros. E tambm, deve haver a compatibilidade entre a estrutura de dados. No podemos atribuir uma estrutura matriz (agregado homogneo bidimencional) a um vetor (agregado homogneo unidimencional), por haver incompatibilidade entre estes dois tipos de estruturas de dados; 2 - o conjunto1 dever ter tamanho fsico (TF) maior ou no mximo igual ao tamanho fsico do conjunto2, para que seja possvel conjunto1 receber todos os elementos que compe o conjunto2. As estruturas de dados de um tipo conjunto possuem os seguintes atributos

- nome do identificador, pelo qual pode-se referenciar a estrutura; - o tamanho fsico da estrutura, que determina a quantidade mxima de dados que podem ser associados ao identificador; - o tamanho lgico da estrutura, que determina a quantidade de dados que esto associados ao identificador; - o tipo de dado que pode ser associado ao identificador; O mapeamento, ou ndices da estrutura, atravs do qual podemos acessar um determinado elemento ou posio da estrutura; - valor de dado associado em cada ndice da estrutura; - a dimenso da estrutura, que determina a forma de organizao dos dados na estrutura.

ILUSTRAO 1
Valor de dado do tipo inteiro Identificador da estrutura

Conjunto X 8
1

7
2

4
3

-22
4

0
5

444 -55
6 7 8 9 10 11

estrutura unidimencional

TL TF
mapeamento de ndices

ILUSTRAO 2 ConjuntoY 1 4 8 bidimensional, dois 2 3 coluna), e 3


1 2 3 4

O conjuntoY um agregado homogneo composto por elementos do tipo inteiro. Possui

-4

mapeamentos, um para cada dimenso (linha e para cada dimenso devemos ter um TL e um TF.

ndices ou mapeamentos

Note que as duas estruturas das ilustraes so compatveis quanto ao tipo do componente, mas no existe compatibilidade quanto ao tamanho fsico e as dimenses das mesmas. J falamos que a nica ao que uma estrutura de dados pode sofrer, a atribuio, mas isto somente se quisermos manipular toda a estrutura de uma nica vez.

Podemos fazer operaes individuais com os elementos que compe a estrutura. As operaes que podem ser feitas, so as mesmas permitidas ao tipo do elemento componente, ou seja, se o elemento for de um tipo numrico, ele poder sofrer operaes aritmticas, por exemplo. Consideraremos a existncia de duas estruturas homogneas unidimensionais. Uma a cadeia de caracteres, que uma estrutura que armazena somente dados do tipo caracter, e a outra, conjunto, que uma estrutura mais genrica que pode armazenar qualquer tipo de dado.

7.2. CONJUNTO ( ARRAY, VETORES )


A cadeia de caracteres uma estrutura da dados que permite aos identificadores definidos com este tipo, serem associados somente com dados do tipo caracter. Mas a idia de conjunto mais abrangente. Na verdade podemos construir conjuntos de qualquer tipo de informao (inteiro, real, caracter, lgico), inclusive conjunto de conjuntos. 7.2.1. Sintaxe de Definio para o Tipo Conjunto Unidimencional A sintaxe geral de definio de identificadores do tipo estruturado conjunto dada da seguinte forma: Algoritmo ident : conjunto[li..ls] de TpElemento; onde: ident : representa um identificador ou um conjunto de identificadores separados por vrgulas; conjunto: a palavra que define a estrutura de dados conjunto; li : uma constante numrica inteira que define o valor inicial dos ndices que mapearo a estrutura de dados. Este o valor do ndice da primeira clula da estrutura ident. ls : uma constante numrica inteira que define o valor final dos ndices que mapearo a estrutura de dados. Este o valor do ndice da ltima clula da estrutura ident. A expresso li..ls indica que esto compreendidos todos os valores inteiros entre li e ls, inclusive. Logo, devemos sempre ter li <= ls. O tamanho fsico da estrutura pode ser obtido com a operao: TF = ls -li + 1. Note que se li for 1, TF ser ls TpElemento: um identificador de tipo que serve para definir o tipo de elemento componente, tipo do valor que dever ser armazenado na clula da estrutura. Exemplos de uso Algoritmo bingo : conjunto[1..75] de inteiro; vetor : conjunto[1..20] de real; arranjo: conjunto[-4..3] de real; Pascal bingo : array[1..75]of integer; vetor : array[1..20] of real; arranjo : array[-4..3] of real; Pascal ident : array[li..ls] of type;

7.2.2. Estrutura fsica das estruturas conjunto Quando definimos que um determinado identificador ser do tipo conjunto unidimencional, necessitamos informar dois atributos: limites inferior e superior do mapeamento e o tipo do elemento componente da estrutura. Os limites inferior e superior do mapeamento servem a dois propsitos. O primeiro se refere ao dimensionamento da estrutura, ou seja, determina o nmero de clulas de memria que efetivamente sero reservadas para a estrutura criada (Tf = ls - li + 1). O segundo, determina a forma de acesso s clulas de memria, atravs da faixa de ndice criada entre os limites inferior e superior, ou seja, determina tambm, o mapeamento da estrutura. A definio do tipo do elemento componente necessrio, para podermos definir o tamanho de cada clula para que seja possvel o armazenamento de dados e, tambm, para definir, claramente, as operaes que podero manipular estes dados. Assim, quando fazemos a seguinte definio bingo : conjunto[1..75] de inteiros; estamos informando que deve ser associado ao identificador bingo 75 clulas de memrias, onde a primeira clula ser mapeada com o ndice 1, a segunda com o ndice 2,... e a ltima com o ndice 75, como ilustrado a seguir bingo 1 2 3 4 5 6 7 8
indicador da estrutura clula de memria

..... 9 10 11 73 74 75

ndices do mapeamento

onde cada clula de memria poder armazenar um valor do tipo inteiro. J para a definio arranjo: conjunto[-4..3] de inteiro; estamos informando que deve ser associado ao identificador arranjo 8 clulas de memrias, onde a primeira clula ser mapeada com o ndice -4, a segunda com o ndice -3,... e a ltima com o ndice 3. A organizao desta estrutura ter a seguinte forma: nome -4 -3 -2 -1 0 1 2
indicador da estrutura clula de memria

ndices do mapeamento

onde cada clula de memria poder armazenar um valor do tipo inteiro.

7.2.3 Operaes com as clulas da estrutura conjunto Para particularizar uma clula de uma estrutura de dados unidimencional, devemos utilizar o identificador da estrutura e o ndice do mapeamento referente clula que desejamos manipular. Isto deve ser feito da seguinte forma: identificador[ndice] cuja semntica definida como: acessar a clula mapeada com o valor ndice da estrutura de dados unidimensional;, representada por identificador. A individualizao de uma clula de uma estrutura de dados s tem sentido se quisermos praticar alguma ao ou operao com a mesma. As aes e operaes que podem ser praticadas sobre uma clula da estrutura de dados depende nica e exclusivamente do tipo de dado que compe a estrutura. Desta forma, podemos fazer as seguintes operaes com o conjunto bingo: bingo[1] 10; {a clula 1 de bingo recebe o valor 10} bingo[2] 5; bingo[3] 65; bingo[4] bingo[1] + bingo[3]; bingo[6] bingo[4] - (bingo[1] + bingo[2]); A organizao das informaes na estrutura bingo, ser: bingo 10 1 5 2 65 3 75 4 5 60 6 ..... 7 8 9 10 11 73 74 75

As clulas 5 e, 7 a 75 da estrutura conjunto bingo armazenam um dado cujo valor indeterminado, isto , pode ser qualquer um pertencente ao conjunto do tipo elemento componente. Devido a este fato, devemos ter mximo de cuidado para no acessar os valores de clulas que no receberam um valor especfico para armazenamento. Assim, se tivssemos a seguinte instruo informe(bingo[1], bingo[6], bingo[9]); o resultado produzido seria 10 60 qualquer

Assim, para um melhor controle da estrutura conjunto, adote uma forma bem definida para armazenar e recuperar as informaes da estrutura. A forma de armazenamento mais consistente a seqencial, onde a primeira informao

armazenada na primeira clula, a segunda informao na segunda clula, e assim por diante. Existem formas de armazenamento no seqencial mas, para estes casos, existe um comportamento padro bem definido que permite saber, atravs de clculos ou mtodos determinsticos, se em determinada clula existe ou no informao armazenada.

7.2.4 Clculo do tamanho lgico da estrutura conjunto O valor lgico, TL, de uma estrutura conjunto, no pode ser definido to facilmente como o da cadeia de caracteres. Este valor deve ser determinado por algum clculo no momento da execuo do algoritmo, ou ser conhecido antes da execuo do mesmo. Mas lembramos, que o valor do TL nunca poder ser superior ao valor do TF. Vejamos alguns exemplos: a) Faa um algoritmo que seja capaz de conhecer e armazenar 10 valores inteiros quaisquer, em um conjunto unidimencional. Program Valores
{ ae(ConjVal) } { as( ) }

var i, tf : integer; ConjVal : array[1..10] of integer; begin tl := 10; for i := 1 to tl do read(ConjVal[ i ] ); end. b) Faa um algoritmo que seja capaz de conhecer e armazenar N valores inteiros quaisquer, em um conjunto unidimencional, com capacidade de armazenamento para 50 elementos. O valor de N conhecido. Program Vetor; { ae(ConjVal) } { as() } var i, tf, n : integer; ConjVal : array[1..50] of integer; begin tf := 50; read ( n ); {N representa tl} if n <= tf then begin for i := 1 to n do read ( ConjVal[ i ] ); end; end.

c) Faa um algoritmo que seja capaz de conhecer e armazenar N valores inteiros positivos quaisquer, em um conjunto unidimencional, com capacidade mxima de armazenamento para 100 elementos. O valor de N desconhecido. refinamento 1 Pelo enunciado dado no podemos concluir com exatido, qual o nmero de elementos que efetivamente devero ser armazenados na estrutura. Sabemos que este nmero est entre 0 e 100. Mas no enunciado dada uma restrio: no conjunto de valores s existem elementos inteiros positivos. Assim, podemos formular condies para o armazenamento de informaes na estrutura dada. S poderemos armazenar uma informao na estrutura se ela for inteira positiva, e tambm, se houver espao na estrutura para alocar esta informao ( se ainda no forem ocupadas as 100 clulas da estrutura). Program Vetor;
{ ae(ConjVal) } { as(tl) }

var i, tf, valor : integer; ConjVal : array[1..100] of integer; begin tf := 100; tl := 0; read ( valor ); while (existir clula livre) and (existir valores vlidos) do begin tl := tl + 1; ConjVal[tl] := valor; read ( valor ); end; end. refinamento 2 Como as informaes sero armazenadas de forma seqencial, comeando pela primeira clula, a condio existir clula livre implica em saber, se o valor tl no superior ao valor do tf, pois, se for, teremos a indicao de que no existe mais clulas livres na estrutura. J a condio existir valores vlidos, servir para interromper o armazenamento de informaes, caso o nmero de informaes seja inferior a capacidade de armazenamento da estrutura. Dentro do enunciado do problema, um valor vlido um valor inteiro positivo. Program Vetor;
{ ae(ConjVal) as(tl) }

var i, tf, valor : integer; ConjVal : array[1..100] of integer; begin

tf := 100; tl := 0; read(valor) while (tl < tf) and (valor > 0) do begin tl := tl + 1; ConjVal[ tl ] := valor; read ( valor ); end; end.

7.2.5 EXERCCIOS RESOLVIDOS R-7.5 Faa um algoritmo que tenha como dados de entrada 10 valores reais que calcule a mdia aritmtica entre os mesmos, e que seja possvel saber quantos elementos so superiores mdia calculada. Soluo refinamento 1 Note que este tipo de problema pode ser resolvido de uma forma mais elegante e mais operacional, se armazenarmos os valores em um conjunto. Pois, se for de outra forma, utilizando identificadores comuns, precisamos conhecer todos os valores do conjunto para o clculo da mdia, e depois, precisamos conhecer todos os valores novamente para verificar quais so superiores mdia. Agora, se estes valores forem armazenados em um conjunto, basta percorrer as clulas do mesmo para recuperar os valores que foram armazenados. Program Freq;
{ ae(ConjVal) } { as(media, freq) }

var ConjVal : array[1..10] of real; i, freq, tl : integer; media, soma : real; begin freq := 0; tl := 10; soma := 0; - conhea os 10 valores, armazene-os no conjunto ConjVal, e acumule-os em soma; - calcule a mdia entre os valores; - conte quantos elementos do conjunto so superiores mdia calculada; informe(media, freq); end. refinamento 2 Program Freq;

{ ae(ConjVal) } { as(media, freq) }

var ConjVal : array[1..10] of real; i, freq, tl : integer; media, soma : real; begin tl := 10; freq := 0; soma := 0; for i := 1 to tl do begin read( ConjVal[ i ] ); soma := soma + ConjVal[i]; end; media := soma / tl; for i := 1 to tl do begin if ConjVal[i] > media then freq := freq + 1; end; write(media, freq); end.

R-7.6 Faa um algoritmo que seja capaz de conhecer os valores de dois conjuntos com elementos inteiros, tendo os seus respectivos TLs conhecidos, e que construa um terceiro conjunto composto somente com os elementos que esto tanto no primeiro como no segundo conjunto. soluo Refinamento 1 Program Dois;
{ ae(tl1, tl2, conj1, conj2) } { as(conj3) }

var Conj1, conj2, conj3 : array[1..100] of integer; i, j, tl1, tl2, tl3, tf: integer; begin tf := 100; read(tl1, tl2); if (tl1 <= tf) and (tl2 <= tf) then inicio - conhea os elementos de conj1; - conhea os elementos de conj2; para todos os elementos pertencentes ao conj1 faa

se o i-simo elemento de conj1 pertencer a conj2 ento, armazene este elemento na 1a. clula livre de conj3; - informar os elementos de conj3 fim; end. Refinamento 2 Program Dois;
{ ae(tl1, tl2, conj1, conj2) } { as(conj3) }

var Conj1, conj2, conj3 : array[1..100] of integer; i, j, tl1, tl2, tl3, tf: integer; begin tf := 100; read(tl1, tl2); if (tl1 <= tf) and (tl2 <= tf) then begin for i := 1 to tl1 do conhea (conj1[i]); for i := 1 to tl2 do conhea ( conj2[i] ); tl3 := 0;
{ como ainda no sabemos o total de elementos que iro compor o conjunto Conj3, assumimos que ele seja vazio, inicialmente }

for i := 1 to tl1 do begin procurar o elemento conj1[i] em conj2; se o i-simo elemento de conj1 pertence ao conj2 ento inicio tl3 := tl3 + 1; conj3[ tl3 ] := conj1[ i ]; fim; end; for i := 1 to tl3 do informe( conj3[ i ] ); end. sub-refinamento 2.1: procurar o elemento conj[i] em conj2 enquanto no encontrar o elemento conj1[i] em conj2 e ainda existir elementos em conj2 faa passe para o prximo elemento de conj2; sub_refinamento 2.2: procurar o elemento conj1[i] em conj2 j := 1; { j ser utilizado como ndice de conj2 para podermos acessar os seus elementos}

enquanto (conj1[i] <> conj2[j]) e (j < tl) faa j := j + 1; Observe que existem somente duas situaes que podem provocar a interrupo da execuo desta parte do algoritmo. Ou o elemento i de conj1 foi encontrado em conj2, fazendo com que a condio conj1[i] <> conj2[j] tenha o valor falso, ou j foi percorrido toda a estrutura conj2 ( j >= tl), fazendo com que a pesquisa seja interrompida. refinamento 3 Program Dois;
{ ae(tl1, tl2, conj1, conj2) } { as(conj3) }

var Conj1, conj2, conj3 : array[1..100] of integer; i, j, tl1, tl2, tl3, tf: integer; begin tf := 100; read (tl1, tl2); if (tl1 <= tf) and (tl2 <= tf) then begin for i := 1 to tl1 do read (conj1[ i ]); for i := 1 to tl2 do read ( conj2[ i ] ); tl3 := 0; { como ainda no sabemos o total de elementos que iro compor o
conjunto Conj3, assumimos que ele seja vazio, inicialmente }

for i := 1 to tl1 do begin j := 1; while (conj1[i] <> conj2[j]) and (j < tl) do j := j + 1; if conj1[i] = conj2[j] then begin tl3 := tl3 + 1; conj3[ tl3 ] := conj[ i ]; end; end; for i := 1 to tl3 do write( conj3[ i ] ); end; end. 7.2.6. EXERCCIOS PROPOSTOS 1) No exerccio R-7.6 no se leva em considerao se um elemento em comum entre conj1 e conj2 j est inserido em conj3, ou seja, se

conj1 = [3,4,6] e conj2 = [3,7,4,3] ento, conj3 ser [3,4], onde o elemento 3 est repetido. Refaa este exerccio, mas que o mesmo seja capaz de evitar a duplicidade de elementos em conj3. 2) Faa um algoritmo que capaz de fazer a soma de dois vetores de dimenses N. Os valores dos dois vetores, bem como os do vetor resultado devem ser armazenados em conjuntos. Os vetores tm no mximo 50 coeficientes. 3) Um armazm comercializa 100 diferentes mercadorias, identificadas por nmeros inteiros de 1 a 100. A quantidade de mercadorias em estoque e o preo de cada mercadoria devem ser armazenadas em conjuntos distintos. Ao fim de cada dia de trabalho, o comerciante fornece um conjunto com o total de cada mercadoria que foi vendida. Faa um algoritmo que seja capaz de: a) conhecer os valores de cada conjunto; b) calcular e informar a situao do estoque do comerciante ao fim do dia para cada mercadoria; c) calcular e informar o faturamento do dia com a venda das mercadorias. 4) Faa um algoritmo que receba como entrada dois conjuntos de elementos inteiros e seus respectivos tamanhos lgicos, com no mximo 100 elementos cada um, que seja capaz construir um terceiro conjunto que contenha a unio dos elementos entre os dois conjuntos dados. No conjunto unio no poder existir elementos repetidos.

7.3. CONJUNTOS MULTIDIMENSIONAIS ( Matrizes )


No item 7.3 verificamos a utilidade da estrutura de dados homognea unidimencional conjunto na soluo de vrios problemas. Vimos que os dados podem ser agrupados em uma nica estrutura, evitando assim a declarao de inmeros identificadores, de tipo simples, para representar todos os dados pertencentes ao conjunto. Vimos tambm, que para particularizarmos um determinado elemento da estrutura, bastava especificar qual a posio que este elemento ocupava dentro da estrutura, e que esta posio era dada pelo valor do ndice do mapeamento da estrutura. Mas comum surgirem problemas, que para serem resolvidos de forma mais fcil, devem ter seus dados armazenados em estruturas com mais de uma dimenso. O exemplo mais clssico so as matrizes da matemtica. As matrizes so estruturas homogneas bidimensionais, isto elas possuem linhas e colunas (ou altura e largura). Dentro do nosso contexto, trabalhamos com exerccios que envolvam no mximo duas dimenses. Mas, as convenes que forem aqui tratadas podem ser estendidas para estruturas de quais quer dimenses.

7.3.1.

SINTAXE DE DEFINIO MULTIDIMENSIONAL

PARA

TIPO

CONJUNTO

A sintaxe geral de definio de identificadores do tipo estruturado conjunto multidimensional dada da seguinte forma: Algoritmo Pascal ident: conjunto[li1.. ls1, li2.. ls2, ..., liN.. lsN] de TpElementos ident: array[li1..ls1, li2..ls2,...,liN..lsN] of type

onde: : representa um identificador ou um conjunto de identificadores separados por vrgulas; conjunto: a palavra que define a estrutura de dados conjunto; li : uma constante numrica inteira que define o valor inicial dos ndices que mapearo a estrutura de dados. ls : uma constante numrica inteira que define o valor final dos ndices que mapearo a estrutura de dados. li1..ls1 : representa a faixa de variao dos ndices do mapeamento para a dimenso 1 da estrutura. li2..ls2 : representa a faixa de variao dos ndices do mapeamento para a dimenso 2 da estrutura. liN..lsN : representa a faixa de variao dos ndices do mapeamento para a n-sima dimenso da estrutura. A expresso lii..lsi indica que esto compreendidos todos os valores inteiros entre li e ls para i-sima dimenso. Logo, devemos sempre ter li <= ls. O tamanho fsico de cada dimenso da estrutura pode ser obtido com a operao: TFi = lsi - lii + 1. Note que se lii, for 1, TFi ser lsi. importante ressaltar que em cada dimenso haver TFi, clulas disponveis para o armazenamento de dados. Portanto, o total de clulas disponvel em toda a estrutura dado pelo produto dos TF's de cada dimenso TF1 x TF2 x ... x TFN. TpElemento: um identificador de tipo que serve para definir o tipo do elemento componente, tipo do valor que dever ser armazenado em cada clula da estrutura. ident

Exemplos de uso Algoritmo matriz: conjunto[1..10, 1..5] de real; Pascal Matriz : array[1..10, 1..15] of real;

matriz um agregado homogneo bidimencional com capacidade mxima para 10 elementos para a sua primeira dimenso e 5 elementos para a segunda, perfazendo um total de 50 (10x5) clulas disponveis em toda a estrutura. Em cada clula disponvel, podemos armazenar um valor do tipo real.

Algoritmo Pascal

LoteriaEsportiva : conjunto[1..13, 1..3] de caracter; LoteriaEsportiva : array[1..13, 1..3] of char;

LoteriaEsportiva um agregado homogneo bidimensional com capacidade para 39 elementos do tipo caracter, sendo 13 elementos para a primeira dimenso e 3 para a segunda.

7.3.2. ESTRUTURA BIDIMENSIONAIS

FSICA

DAS

ESTRUTURAS

CONJUNTOS

Quando definimos que um determinado identificador ser do tipo conjunto bidimensional, necessitamos informar dois atributos: os limites inferior e superior do mapeamento para cada uma das dimenses e o tipo do elemento componente da estrutura. Os limites inferior e superior do mapeamento de cada dimenso servem a dois propsitos. O primeiro se refere ao dimensionamento da estrutura, ou seja determina o nmero de clulas de memria que efetivamente sero reservadas para a estrutura criada. O segundo, determina a forma de acesso s clulas de memria, atravs da faixa de ndices criada entre os limites inferior e superior de cada dimenso, ou seja determina, tambm, o mapeamento da estrutura. A definio do tipo do elemento componente necessrio, para podermos definir o tamanho de cada clula para que seja possvel o armazenamento de dados e, tambm, para definir, claramente, as operaes que podero manipular estes dados. Assim, quando fazemos a seguinte definio Algoritmo Pascal LoteriaEsportiva : conjunto[1..13, 1..3] de caracter; LoteriaEsportiva : array[1..13, 1..3] of char

estamos informando que deve ser associado ao identificador LoteriaEsportiva 39 clulas de memrias, distribudas em duas dimenses. A primeira dimenso contm 13 clulas e a segunda 3 clulas. A primeira clula da primeira dimenso ser mapeada com o ndice 1, a segunda com o ndice 2, ... e a ltima com o ndice 13. A primeira clula da segunda dimenso ser mapeada com o ndice 1 e a ltima com o ndice 3. Como ilustra a figura a seguir:

Mapeamento da primeira dimenso

1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3

Mapeamento da segunda dimenso

onde cada clula de memria poder armazenar um valor do tipo caracter. J para a definio Algoritmo Pascal matriz : conjunto[1..10, 1..5] de real; matriz : array[1..10, 1..5] of real;

estamos informando que deve ser associado ao identificador matriz 50 clulas de memrias em duas dimenses. Para a primeira dimenso devem ser reservadas 10 clulas, onde a primeira clula, da primeira dimenso, ser mapeada com o ndice 1, a segunda com o ndice 2, ... e a ltima com o ndice 10, e para a segunda dimenso devem ser reservadas 5 clulas, onde a primeira clula deve ser mapeada com o ndice 1 e a ltima com o ndice 5, como ilustra a figura a seguir. Matriz 1 2 3 4 5 Mapeamento 6 da primeira 7 dimenso 8 9 10 1 2 3 4 5

Mapeamento da segunda dimenso

onde cada clula de memria poder armazenar um valor do tipo real. 7.3.3 OPERAES COM AS CLULAS DA ESTRUTURA CONJUNTO BIDIMENSIONAL Para particularizar uma clula de uma estrutura de dados bidimencional, devemos utilizar o identificador da estrutura e um valor de ndice para cada dimenso do mapeamento da estrutura. identificador[ndice1, ndice2] Cuja semntica definida como: acessar a clula mapeada com os valores ndice1 na primeira dimenso e ndice2 na segunda dimenso da estrutura de dados bidimensional, representada por identificador. A individualizao de uma clula de uma estrutura de dados s tem sentido se quisermos praticar alguma ao ou operao que podem ser praticadas sobre uma clula da estrutura de dados depende nica e exclusivamente do tipo de dado que compe a estrutura. Desta forma, podemos fazer a seguintes operaes com o conjunto matriz: matriz[1,1] := 10; matriz[1,2] := matriz[1,1] + 5; matriz[1,3] := 6; matriz[2,4] := matriz[1,3] + matriz[1,1]; matriz[3,1] := matriz[1,1] - (matriz[1,2] + matriz[1,3]; A organizao das informaes na estrutura matriz, ser: Matriz 6 16

Mapeamento da primeira dimenso

1 10 2 3 -11 4 5 6 7 8 9 10 1

15

Mapeamento da segunda dimenso

As clulas de memria que no receberam nenhum contedo possuem um valor indeterminado logo, o uso destas clulas em expresses pode provocar resultados inesperados. Para se ter um controle mais fcil sobre os dados que esto armazenados na estrutura, os mesmos devem ser armazenados de forma seqencial de

acordo com as dimenses da estrutura. No caso de uma estrutura bidimensional, este armazenamento seqencial pode ser feito em linha ou em coluna. Para o armazenamento em linha, deve-se fixar um valor de ndice de linha e variar seqencialmente os ndices de coluna. Aps o trmino do mapeamento de coluna para a linha fixada, fixa-se a prxima, se houver uma, linha e novamente, percorre-se em coluna e variar as linhas. 7.3.4 DEFINIO DO TAMANHO LGICO DA ESTRUTURA CONJUNTO BIDIMENSIONAL O valor do tamanho lgico, TL, de uma estrutura conjunto com mais de uma dimenso, no pode ser avaliado apenas por um valor. Devemos ter no mnimo um controle para cada dimenso da estrutura. No caso de uma estrutura de duas dimenses, precisamos ter um controle sobre o total de linhas e sobre o total de colunas que esto sendo efetivamente utilizadas para o armazenamento de dados. Assim, necessitamos de um identificador TLl, tamanho lgico das linhas e de um TLc, tamanho lgico das colunas. matriz
1 2 3 4 5 1 2 3 4 5 10 3 15 -3 15 8 1 4 6 -2 0 7

Neste exemplo, como o nmero de informaes em cada linha sempre o mesmo, para controlar os tamanhos lgicos de cada dimenso bastam dois identificadores TLl = 4, indicando que esto sendo utilizadas 4 linhas da estrutura, e: TLc = 3, indicando que esto sendo utilizadas 3 colunas da estrutura. Os casos mais drsticos podem exigir um controle do tamanho lgico de cada linha e de cada coluna da estrutura. Estes casos podem ser resolvidos com a adoo de uma estrutura conjunto unidimensional para cada uma das dimenses da estrutura com mais de uma dimenso. Cada clula do conjunto unidimensional controlaria o tamanho lgico de uma linha ou de uma coluna do conjunto bidimensional, por exemplo. A situao que pode provocar este tipo de controle ser quando o nmero de informaes contidas em uma linha ou em uma coluna da estrutura seja diferente das demais. TL 1
1 2 3 3 2 1 1 2 3 10 3 15 15 8

matriz
6

4 5

4 1

4 5

-3

TLc 5
1

3
2

2
3

1
4

0
5

Por esta ilustrao podemos observar que cada clula de TLl indica o total de elementos que esto armazenados em cada linha da estrutura matriz, e que cada clula de TLl indica o total de elementos armazenados em cada coluna de matriz. a) Faa um algoritmo que seja capaz de conhecer e armazenar 10 valores inteiros quaisquer, em um conjunto bidimensional com dimenses de 2 linhas e 5 coluna. Program Matriz;
{ ae(ConjVal) } { as( ) }

var i, j, Tll, Tlc : integer; ConjVar : array[1..2, 1..5] of integer; begin Tll := 2; Tlc := 2; for i := 1 to Tll do begin for j := 1 to Tlc do read (ConjVal [ i, j ] ); end; end. Note que neste tipo de problema devemos ter o controle das clulas de cada uma das dimenses (linhas e colunas). Para efetivar este controle, usamos dois identificadores I e J para representarem as clulas disponveis nas linhas e colunas, respectivamente. Lembramos ainda, que o valor de I, neste exemplo, no pode referenciar uma clula de memria com valor superior a 2, e J no pode ser superior a 5, devido o tamanho fsico da estrutura ser de 2x5.

7.3.5 EXERCCIOS RESOLVIDOS R-7.9 Faa um algoritmo que tendo como dados de entrada uma matriz com 4 linhas e 4 colunas, composta de elementos reais, que calcule a soma da diagonal principal da matriz fornecida. soluo A matriz que vai ser conhecida ter, sempre, a seguinte estrutura: a a a a
11 12 13 14

21

22

23

24

a a

31 41

a a

32

33 43

34 44

42

neste caso os elementos da diagonal principal so: a a a a


11 22 33 44

ou seja, todo elemento aij, com i = j, um elemento da diagonal principal. Logo o que ns estamos querendo so todos os elementos aii ou, todos os ajj Program Matriz;
{ ae(matriz) } { as(soma) }

var matriz : array[1..4, 1..4] of real; i, j, tll, tlc : integer; soma : real; begin soma := 0; tlc := 4; tll := 4; for i := 1 to tll do for j := 1 to tlc do read(matriz[ i, j ] ); for i := 1 to tll do soma := soma + matriz[ i, i ]; write(soma); end.

R-7.10 Faa um algoritmo que seja capaz de conhecer os valores de uma matriz qualquer, com no mximo 10x10 elementos reais, e monte uma outra matriz que seja transposta da matriz fornecida. soluo Para se obter a matriz transposta de uma matriz A basta trocar as linhas pelas colunas desta matriz. Ou seja, At = A
ji

ij

para a matriz a a a sua transposta ser: a


11 11 21

a a

12

a a

13

22

23

21

a a

12 13

a a

22 23

Program Trans;
{ ae(tll, tlc, matriz) } { as(MatrizTrans) }

var matriz, MatrizTrans : array[1..10, 1..10] of real; i, j, tll, tlc : integer; begin read(tll, tlc);
{ lembrando que Tlc e Tll no podem ser superiores a 10 (e nem inferiores a 1) }

for i := 1 to tll do for j := 1 to tlc do begin read ( matriz[ i, j ] ); MatrizTrans[ j, i ] := matriz[ i, j ]; end; for J:=1 to tl1 do for i := 1 to tll do write(MatrizTrans[ i, j ] ); end.

Note que para a matriz transposta o total de linhas existentes dado pelo valor de TLc e o total de colunas TLl.

7.3.6 EXERCCIOS PROPOSTOS 1) Faa um algoritmo que seja capaz de conhecer e armazenar TLlxTLc elementos reais em uma matriz com capacidade para no mximo 20x20 elementos e, que tenha como argumento de sada a soma dos elementos dispostos em cada linha da estrutura. SUGESTO: use um conjunto unidimensional para armazenar a soma dos elementos de cada linha. matriz 1 3 3 0 5 -2 soma 12 7 18

10 0 4

-2 4 11

2) Faa um algoritmo que seja capaz de conhecer duas matrizes quadradas (5x5) compostas de elementos inteiros. Como argumento de sada, o algoritmo dever produzir o valor 0 se ambas as matrizes no forem simtricas, ou o valor 1 se elas forem simtricas.

Duas matrizes A e B so simtricas se ,e somente se, todos os elementos Aij forem iguais aos elementos Bji. 3) Faa um algoritmo que receba como entrada uma matriz com TLlxTLc elementos reais (a capacidade mxima da estrutura de 10x10 elementos). Aps a entrada dos elementos, localize a posio (linha e coluna) do maior elemento que compe a estrutura. 4) Faa um algoritmo que receba como entrada duas matrizes, ambas com TLlxTLc elementos reais (a capacidade mxima de cada estrutura de 10x10 elementos), que seja capaz de calcular a soma entre os elementos dessas estruturas, armazenando os resultados em uma terceira matriz. A soma de duas matrizes A e B feita da seguinte forma: Cij = Aij + Bij

7.4. CADEIA DE CARACTERES


A cadeia de caracteres uma estrutura de dados que permite aos identificadores definidos com este tipo, serem associados com dados do tipo caracter. Uma cadeia de caracteres uma seqncia de caracter, que formam palavras, frases e textos, ou simplesmente permitem a formao de um conjunto de caracteres qualquer. Os elementos que formam o conjunto de caracteres so: as letras maisculas e minsculas, os dgitos de 0 (zero) a 9 (nove), e os caracteres especiais (pontuao (?, ., ;), espao em branco, os caracteres (*, /, %, #, ...), ...). A combinao desses caracteres seqencialmente, forma os dados cadeias de caracteres. Como por exemplo: 'quem o rei?' 'rua: Felicidade, 1441' 'Joo da Silva Xavier' Como nos dados do tipo simples caracter, os dados do tipo estruturado cadeia de caracteres, devem ser delimitados por apstrofes(''). As apstrofes no fazem parte do dado, elas simplesmente indicam onde comea e onde termina o valor do dado.

7.4.1 SINTAXE DE DEFINIO PARA O TIPO CADEIA DE CARACTERES A sintaxe geral de definio de identificadores do tipo estruturado cadeia de caracteres dada da seguinte forma:

Algoritmo ident : cadeia[TF]; onde:

Pascal ident : string[TF]

ident : representa um identificador ou um conjunto de identificadores separados por vrgulas; cadeia: a palavra que define a estrutura de dados cadeia de caracteres; TF : uma constante numrica que defina a quantidade mxima de caracteres que podero ser associados com o identificador (es) ident.

Exemplos de uso Algoritmo nome : cadeia[30]; cidade, rua : cadeia[20]; frase, texto: cadeia[50]; Pascal nome : string[30]; cidade, rua : string[20]; frase, texto : string[50];

7.4.2 ESTRUTURA FSICA DAS CADEIAS DE CARACTERES Quando definimos que um determinado identificador ser do tipo cadeia de caracteres, necessitamos informar o nmero mximo (TF) de caracteres que podero ser associados ao identificador. Este nmero se refere ao dimensionamento da estrutura, e o mesmo tem duas funes. A primeira se refere ao nmero mximo de clulas de memria que sero necessrias para a criao da estrutura. E a segunda se refere ao mapeamento das clulas da estrutura. Assim, quando fazemos a seguinte definio Algoritmo nome : cadeia[30]; Pascal nome : string[30];

estamos informando que deve ser associado ao identificador nome 30 clulas de memria, onde a primeira clula ser mapeada com o ndice 1, a segunda com ndice 2,... e a ltima com o ndice 30, como ilustrado a seguir nome 1 2 3 4 5 6 7 8
indicador da estrutura clula de memria

..... 9 10 11 28 29 30

ndices do mapeamento

onde cada clula de memria poder armazenar apenas um caracter. Assim, se atribuirmos ao identificador nome o valor de dado 'Joo Pedro'

nome := 'Joo Pedro'; a organizao do dado na estrutura ser feita da seguinte forma: nome P 5 6

J 1

o 2

o 4

e 7

d 8

r 9

o 10

..... 11 28 29 30

Neste exemplo, a estrutura de dados criada tem os seguintes atributos: - a estrutura de dados est associada com o identificador nome; - o tipo de dado que pode ser associado com as clulas de memria da estrutura deve ser do tipo caracter; - a estrutura unidimencional, contendo 30 clulas, as quais so mapeadas por ndices de 1 a 30, respectivamente; - o tamanho fsico (TF) da estrutura 30; - o tamanho lgico (TL) da estrutura 10;

7.4.3 OPERAES COM AS CLULAS DA ESTRUTURA Para particularizar uma clula de uma estrutura de dados unidimencional, devemos utilizar o identificador da estrutura e o ndice do mapeamento referente clula que desejamos manipular. Isto deve ser feito da seguinte forma: identificador[ndice] cuja semntica definida como: acessar a clula mapeada com o valor ndice da estrutura de dados unidimencional, representada por identificador. A individualizao de uma clula de uma estrutura de dados s tem sentido se quisermos praticar alguma ao ou operao com a mesma. As aes e operaes que podem ser praticadas sobre uma clula da estrutura de dados depende nica e exclusivamente do tipo de dado que compe a estrutura. Para a estrutura cadeia de caracteres as operaes e aes que podem ser praticadas sobre uma clula so as mesmas permitidas para o tipo caracter. Ou seja, a atribuio, e as construes de relaes. Assim, se tivermos a seguinte estrutura nome P e 6 7

J 1

o 2

o 4

d 8

r 9

o 10

..... 11 28 29 30

e praticarmos as seguintes aes nome[3] := 's'; {atribua clula 3 de nome o valor 's'} nome[4] := ''; {atribua clula 4 de nome o valor ''}

o resultado obtido ser nome J


1

o
2

s
3

4 5

P
6

e
7

d
8

r
9

o
10 11

.....
28 29 30

7.4.4 CLCULO DO TAMANHO LGICO DA ESTRUTURA O valor do tamanho lgico, TL, de uma cadeia de caracteres deve ser calculado. Para efetuarmos este clculo, assumiremos que todas as clulas que sobrarem aps a alocao do dado cadeia de caracter sero ocupadas por espaos em branco ( ). Desta forma, para obter o valor de TL basta apenas descontar o nmero de espaos em branco existentes direita da cadeia de caracteres do valor de TF. Vejamos o seguinte exemplo: Program TamLogico;
{ ae( ) as(tl) }

var tl, tf : integer; nome : string[30]; begin nome := 'Jose pedro'; tf := 30; tl := tf; {supondo que toda estrutura esteja preenchida}
{enquanto existir um espao em branco no final da estrutura e no estivermos no comeo da mesma, verifique o valor da clula anterior e decremente uma unidade no valor atual de TL}

while (nome[tl] = ' ') and (tl > 0) do tl := tl - 1; write(tl); end. Este um exemplo de como o problema do clculo do TL de uma cadeia de caracteres pode ser resolvido. Para efeito de simplicidade adotaremos a existncia de uma funo que possibilitar este clculo de forma mais simples. Esta funo tem a seguinte sintaxe: Algoritmo comprimento(Ident) Pascal length( ident )

onde: Ident representa o identificador da estrutura cadeia de caracteres que pode ser resolvido. comprimento a funo que permite o clculo do tamanho lgico de uma cadeia de caracteres. Assim, o nosso algoritmo para clculo do TL da cadeia de caracteres nome, poderia resumir-se em: Program TamLogico;

{ ae( ) as(tl) }

var tl : integer; nome : string[30]; begin nome := 'Jose pedro'; tl := length(nome); write(tl); end.

7.4.5 EXERCCIOS RESOLVIDOS R-7.1 Faa um algoritmo que tenha como dados de entrada um texto com no mximo 50 caracteres e uma letra, que seja capaz de calcular a freqncia desta letra no texto. soluo problema pode ser resolvido facilmente se percorrermos todo o texto, caracter a caracter, e para cada caracter do texto verificar se ele igual letra fornecida. Se for, devemos incrementar um contador de freqncia de uma unidade. O valor inicial do contador de freqncia deve ser zero.

Program Igual;
{ ae( ) as(freq) }

var texto : string[50]; i, freq, tl: integer; letra : char; begin {contador de freqncia da letra} freq := 0; read(texto, letra); tl := length(texto) ; i := 1; {aponta para o 1 caracter do texto} {enquanto existir caracter} while i <= tl do begin if texto[i] = letra then {O caracter i do texto igual a letra?} begin freq := freq + 1; end; i := i + 1; {aponte para o prximo caracter do texto, se existir} end; write(freq); end.

R-7.1 Faa um algoritmo que seja capaz de inverter uma cadeia de caracteres. A cadeia dever conter no mximo 50 caracteres. soluo Program Inverte;
{ae(texto) texto normal} {as(TextoInv) texto invertido}

var texto, TextoInv: string[50]; i, j, tl : integer; begin read( texto ); tl := length(texto); j := tl; {ltimo caracter do texto} {1 posio do TextoInv } i := 1;
{ p/ inverter uma cadeia de caracteres, devemos "pegar" o seu ltimo caracter e guardar na 1 posio da cadeia invertida, pegar o penltimo caracter e guardar na 2 posio da cadeia invertida, e assim consecutivamente}

while i <= tl do begin TextoInv[i] := texto[j]; i := i + 1; j := j - 1; end; write(TextoInv); end.

7.4.6 OPERAO DE CONCATENAO Uma operao interessante que pode ser aplicado sobre a estrutura cadeia de caracteres a concatenao de cadeias de caracteres. A concatenao, uma operao que junta duas ou mais cadeias de caracteres em uma nica estrutura. O operador que permitir a concatenao de cadeias ser o operador +. Note que, quando este operador estiver sendo aplicado em estruturas cadeias de caracteres o seu significado semntico ser o de concatenao, e quando aplicado sobre dados numricos, significar a adio. Como o operador + serve a dois propsitos distintos, quando usado em situaes distintas, ele definido como operador sobrecarregado. Devido as situaes distintas, mas bem definidas, em que o operador + pode ser empregado, podemos assumir que no existe ambigidade em seu uso. Um exemplo de concatenao ilustrado a seguir ....... nome1 := 'Mari'; nome2 := 'ana'; nome3 := nome1 + nome2; O resultado armazenado no identificador nome3 'Mariana'.

7.4.7 EXERCCIOS RESOLVIDOS R-7.3 Resolver o exerccio R-7.2 utilizando a concatenao Program Concatena;
{ ae(texto) texto normal} { as(TextoInv) texto invertido}

var texto, TextoInv: string[50] ; i, j, tl : integer; begin read (texto); tl := length(texto); j := tl; TextoInv := ;
{ como vamos fazer a concatenao caracter a caracter, temos que ter um valor inicial para o identificador textoInv que no interferir no resultado final. Este valor inicial um valor nulo () }

while J >= 1 do begin TextoInv := TextoInv + texto[ j ]; j := j - 1; end; write(TextoInv); end. R-7.4 Faa um algoritmo que elimine todos os espaos em branco no necessrios em uma frase. Como por exemplo texto ' antes s do que mal acompanhado '; Tcompacto 'antes s do que mal acompanhado'; soluo refinamento 1 A soluo deste problema consiste em eliminar os espaos em branco existentes entre as palavras, no incio e no final do texto. - eliminar espaos em branco no incio do texto; - enquanto existir texto elimine espaos em branco extras entre as palavras, se existir; - se este o ltimo caracter do texto e um espao em branco ento ignore este caracter seno concatene este caracter refinamento 2 Para eliminar os espaos do incio mais fcil. Basta fazer um contador comear de um e increment-lo de uma unidade para cada espao em branco encontrado no incio do texto. I := 1;

enquanto o i-simo caracter do texto for um espao em branco e ainda existir texto faa aponte para o prximo caracter; Agora para eliminar os espaos em branco entre as palavras necessrio localizar o fim de uma palavra para poder eliminar os espaos extras que a separa da prxima palavra, se existir uma prxima - para localizar o fim de uma palavra enquanto o i-simo caracter do texto no for um espao em branco e ainda existir texto faa concatene este caracter e aponte para o prximo caracter; - para eliminar os espaos em branco entre as palavras enquanto o i-simo + 1 caracter do texto for um espao em branco e ainda existir texto faa aponte para o prximo caracter; refinamento 3 - elimine os espaos extras I := 1; enquanto o i-simo caracter do texto for um espao em branco e ainda existir texto faa aponte para o prximo caracter; - elimine os espaos extras entre as palavras enquanto existir texto faa inicio localizar o fim de uma palavra enquanto o i-simo caracter do texto no for um espao em branco e ainda existir texto faa concatene este caracter e aponte para o prximo caracter;

- eliminar os espaos em branco entre as palavras enquanto o i-simo caracter do texto for um espao em branco e ainda existir texto faa aponte para o prximo caracter; se ainda existir texto ento concatene um espao em branco em Tcompacto para separar a prxima palavra fim - eliminar ou no o ltimo caracter se este o ltimo caracter do texto e um espao em branco ento ignore este caracter seno concatene este caracter

refinamento 4 Program Compacta;


{ ae(texto) } { as(Tcompacto) }

var texto, Tcompacto: string[50]; i, tl : integer; begin read (texto); tl := length(texto); {aponta para o 1 caracter do texto} i := 1; Tcompacto := ; {eliminando espaos em branco no incio do texto} while (texto[i] = ) and (i < tl) do i := i + 1; {aponte para o prximo caracter}
{ o contador i est apontando para uma letra, ou para o ltimo caracter do texto (posio tl) } {eliminando espaos em branco entre as palavras} {enquanto no aponta para o fim do texto} { concatene os caracteres da palavra }

while i < tl do begin

while (texto[i] <> ) and (i < tl) do begin Tcompacto := Tcompacto + texto[i]; { aponte para o prximo caracter} i := i + 1; end; while (texto[i] = ) and (i < tl) do { eliminando espaos entre as
palavras }

i := i + 1; { aponte para o prximo caracter} { se existem mais palavras, ento separe-as com espao em Tcompacto } if i <= tl then { se parou no meio do texto ento, foi achado o incio de mais uma palavra} Tcompacto := Tcompacto + ; end; if texto[i] <> then { se o ltimo caracter do texto for uma letra ento, concatene-a} Tcompacto := Tcompacto + texto[i]; write(Tcompacto); end.

7.4.8 EXERCCIOS PROPOSTOS 1) Refaa o exerccio R-7.4 sem utilizar uma cadeia auxiliar para eliminar os espaos em branco em excesso no texto. 2) Faa um algoritmo que tendo como dado de entrada um nmero inteiro positivo inferior a 4.000, que seja capaz de transformar este nmero no seu equivalente em algarismos romanos. I=1 C = 100 V=5 D = 500 X = 10 L = 50 M = 1000

Lembrando que em algarismos romanos existe uma regra que no permite a mesma letra seja repetida mais de trs vezes seguidamente. Exemplo 4 = IIII est errado. A letra I est repetida seguidamente mais de 3 vezes. A forma correta IV (cinco com um a menos) 9 = IX (dez com um a menos) 40 = XL (cinqenta com dez a menos) 90 = XC (cem com dez a menos) 400 = CD (quinhentos com cem a menos) 900 = CM (mil com cem a menos) 6 = VI (cinco com um a mais) assim, 1998 equivalente a MCMXCVIII em romano sugesto: enquanto o nmero for maior que 1000 subtraia este valor do nmero dado e concatene a letra 'M' em uma cadeia de caracteres. Aps, verifique se o que restou do nmero cai na exceo do 900, se cair, retire 900 do valor atual e concatene na cadeia as letras 'CM', e assim por diante at o valor do nmero dado seja zero. 3) Faa um algoritmo que receba um valor numrico, mas em forma de uma cadeia de caracteres, no formato americano (somente com o ponto decimal separando a parte fracionria), que seja capaz de adequar este nmero para o padro nacional. Considere apenas duas casas decimais. Padro americano '1234.23', ou '1,234.23' (considere apenas uma entre estas duas formas do padro americano). Padro nacional '1.234,23' 4) Faa um algoritmo que receba como entrada uma cadeia com no mximo 50 caracteres, e dois valores numricos inteiros e positivos, que indicam duas posies da cadeia de caracteres fornecida, e que seja capaz de eliminar todos os caracteres que estiverem entre estas duas posies, inclusive. Texto := 'Em casa de ferreiro, espeto de pau'; pos1 := 8; pos2 := 19; resultado := 'Em casa, espeto de pau';

You might also like