Lógica de programação

Prof. Jonas de Araújo Luz Junior http://jonasluz.com.br jonasluz@gmail.com

Variáveis Indexadas e Registros

Motivação

Algumas vezes, pode-se querer que uma única variável armazene mais de um valor.

As variáveis indexadas armazenam mais de um valor do mesmo tipo e, por isto, são também chamadas variáveis compostas homogêneas. Os registros são tipos definidos pelo programador que mantém uma estrutura de dados com sub-variáveis, que podem ser de tipos diferentes. Por isto, são chamadas também de variáveis compostas heterogêneas.

Variáveis Indexadas

Diversos problemas computacionais requerem a declaração de um grande número de variáveis com a mesma semântica.

Exemplos:
● ●

obter a média de 100 números, exibindo-os no final. ordenar 500 nomes ou valores.

Podem-se declarar variáveis indexadas, ou seja, com o mesmo identificador (portanto, declaradas somente uma vez), mas com que armazenam diferentes valores em diferentes índices.

– Em linguagens fracamente tipadas. os valores podem ser de tipos diferentes. Bidimensionais: possuem duas dimensões de índice. Também conhecidas como matrizes. Conhecidas também por arranjos. ou seja. vetores ou arrays. N-dimensionais: algumas linguagens permitem a declaração de variáveis com n dimensões. do mesmo tipo. ● Classificam-se. Unidimensionais: apenas uma dimensão de índice. quanto ao número de dimensões: – – – .Variáveis Indexadas ● Representam conjuntos ordenados de valores homogêneos.

....<lf> ] de <tipo> ● Representação na memória do computador: .... 74 75 76 77 78 79 -10 VI 56 1 0 VS 10 MEMÓRIA . . Sintaxe: <nome_var>: vetor[ <li>. ● VI é uma variável indexada de 4 posições... MEMÓRIA . 80 81 82 83 84 85 Ao lado: ● VS é uma variável simples de valor 10 ocupando a posição 76 da memória. ocupa 4 posições na memória..Vetores ● ● São as variáveis indexadas unidimensionais.

Vetores ● Notas importantes: – A indexação do vetor com n elementos não precisa ser de 1 a n.1 ou de 5 a n + 4. . podendo ser. ● Algumas linguagens de programação permitem que se indique apenas o tamanho do vetor e não seus índices limites. de 0 a n . Deve-se portanto ter cuidado pra se verificar se a linguagem inicia a indexação pelo 0 ou pelo 1. – Tentar acessar um elemento com índice fora dos limites do vetor constitui um erro de programação. por exemplo.

● Exemplo: estrutura para vasculhar um vetor: // i varia do limite inicial (li) até o limite final (lf)  para i <­ li até lf faca valor <­ variavelIndexada[i] // faça algo com o valor  fimpara // Algumas linguagens possuem uma estrutura própria:  foreach foreach (valor in variavelIndexada) {  // faça algo com valor  } . pode-se usar uma variável inteira para referenciá-lo.Vetores ● Notas importantes: – O índice de um vetor é inteiro e. portanto.

 i. ..Vetores ● Exemplo: média aritmética de 10 números. . .10] de real    i: inteiro    ac: real inicio    para i <­ 1 ate 10 faca       escreva ("Informe o ". "º valor: ")       leia (valores[i])       ac <­ ac + valores[i]    fimpara . algoritmo "MediaValoresVetor" var    valores: vetor [1.

Vetores ● Exemplo: média aritmética de 10 números. . . (ac / 10)) fimalgoritmo . .    escreval("­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­")    escreval("O cálculo da média é determinado por: ")    escreva ("( ")    para i <­ 1 ate 10 faca       escreva (valores[i])       se i < 10 entao          escreva (" +")       fimse    fimpara    escreva (" ) / 10 = ".

5] de caracter    procura: caracter    i.. ..Vetores ● Exemplo: pesquisa em vetor algoritmo "ProcuraNome" var    nomes: vetor[1. ": ")       leia (nomes[i])    fimpara    escreval  ("­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­")    escreva ("Escreva parte do nome de quem procura: ")    leia (procura) . resposta: inteiro inicio    para i <­ 1 ate 5 faca       escreva("Escreva o nome do aluno nº ".. i.

.Vetores ● Exemplo: pesquisa em vetor . nomes[i]) <> 0 entao          resposta <­ i       fimse       i <­ i + 1    ate (i > 5) ou (resposta <> 0)    se resposta = 0 entao       escreval ("Nome não encontrado!")    senao       escreval ("Nome encontrado: ". nomes[resposta])    fimse fimalgoritmo .    i <­ 1    repita       se pos(procura..

3] V[2.3] V[3.1] 2 V[1.2] V[4.5] V[4.5] .3] V[4..<lf1>..2] V[3. Sintaxe: <nome_var>: vetor[ <li1>.3] 4 V[1.4] V[3.5] V[3.<lf2> ] de <tipo> ● Representação em matriz de uma variável V: Índices 1 2 3 4 1 V[1.4] V[2.2] V[2.  <li2>.5] V[2.4] V[4.Matrizes ● ● São as variáveis indexadas bidimensionais.1] V[2.1] V[3.4] 5 V[1.1] V[4.2] 3 V[1.

2] M[5.2] M[3. -10 56 1 0 21 O espaço total ocupado da matriz de tamanho M : [1.2] ... .. 1.1] M[2.2] M[4.1] M[1.Matrizes ● Representação na memória do computador – .1] M[5.1] M[3.2] M[2.5.2] M por N (M linhas e N colunas) é igual a M×N MEMÓRIA .. 49 56 1 0 -10 86 87 88 89 90 91 91 92 93 94 95 96 M[1....1] M[4..

100..100] de caracter   nota  : vetor[1. n  : inteiro .3] de real   nome  : caracter   a.Matrizes ● Exemplo: Grade de notas algoritmo "GradeNotas" var   aluno : vetor[1.. 1..

 n])         ate (nota [a. 3] <­ (nota[a. n.   a <­ 1   enquanto (a <= 100) e (nome <> "­") faca     escreval ("Nome do aluno (sinal ­ encerra a leitura): ")     leia (nome)     se nome <> "­" entao       aluno[a] <­ nome       // faz a leitura das notas       para n <­ 1 ate 2 faca         repita           escreva ("Informe a ". 1] + nota[a. n] >= 0) e (nota [a. 2]) / 2     fimse     a <­ a + 1   fimenquanto .inicio   // faz a leitura de até 100 alunos. n] <= 10)       fimpara       // calcula a média       nota[a. "ª nota (de 1 a 10): ")           leia (nota[a.

2])     escreval (" | ".3])   fimpara   escreval ("­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­") fimalgoritmo . nota[n. nota[n.1]. nota[n.  // Ajusta a para marcar total de alunos informados.   se a > 100 entao     a <­ 100   senao     a <­ a ­ 2   fimse      // exibe grade   limpatela   escreval ("GRADE DE NOTAS")   escreval ("­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­")   escreval (" ALUNO                        |N­1|N­2|MEDIA")   escreval ("­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­")   para n <­ 1 ate a faca     escreva (aluno[n]. " | ". " | ".

.<lf1>] de vetor [<li2>.. sendo: n∈ℕ . uma matriz é contruída como um vetor bidimensional. ..Vetores multidimensionais ● Como visto.<lf1>.. <li2>...... <lin>.<lf2>.<lf2>] . Vetores podem ter n dimensões..<lfn>] de <tipo> <nome_var> :  vetor [<li1>.<lfn>] de tipo ● ● . de  vetor[<lin>. n≥1 São duas construções possíveis: <nome_var> :  vetor [<li1>..

  begin setLength(<nome_var>. por uma função específica.  . num_elem : integer... var  <nome_var>  : array of <tipo>.  // vasculha o vetor: for i := low(<nome_var>) to high(<nome_var>) do .  // retorna o número de elementos do vetor: num_elem := length(<nome_var>).Vetores dinâmicos ● Um vetor dinâmico não possui um tamanho fixo. <tamanho>). i. seu tamanho pode ser definido e alterado após sua declaração.

na verdade. => "".  => array(0. mapas de dispersão. tabela ou mapa de dispersão. tabela ou mapa de espalhamento – em inglês.  => "". 0). todos os arrays são. hash map ou hash table – associa os valores a chaves únicas. ou ainda.Vetores associativos ou tabelas de dispersão ● Um vetor associativo. => 0 . – Exemplo: em PHP. $mapaAluno = array( "numero"  "nome"  "notas" "media" ).

. // Em Portugol: (abstração: limini e limfim dão os limites do vetor) para i <­ limini(<var_vetor>) ate limfim(<var_vetor>) faca . // Em Pascal: (funciona no Free Pascal – freepascal.. i++) { . na maioria das linguagens). } ● As linguagens mais modernas apresentam já uma estrutura específica que evita o uso de uma variável de controle para o índice...org) for i := low(<var_vetor>) to high(<var_vetor>) do ..  // Em Java:  for (int i = 0.foreach – estrutura para varrer vetores ● Tradicionalmente..length. . i < <var_vetor>. um vetor é varrido por uma estrutura para (for.

foreach – estrutura para varrer vetores ● As linguagens mais modernas já apresentam uma estrutura específica que evita o uso de uma variável de controle para o índice: o foreach... } . ficaria: (estrutura não existe na literatura) paracada <var_item> em <var_vetor> faca . } // ou: foreach (<var_vetor> as <var_item_chave> => <var_item_valor>) { . // Em Java:  for (<tipo> <var_item> : <var_vetor>) { .. // onde <var_item> deve ser do mesmo tipo dos elementos de <var_vetor> // Em Pascal. a estrutura não existe. // Em Portugol.. } // Em PHP:  foreach (<var_vetor> as <var_item>) { .....

nome.Registro ● Às vezes. . há a necessidade de se integrar uma estrutura de dados. Os dados de um formulário a ser preenchido no programa. disciplinas). – Exemplos: ● ● A ficha de um aluno (matrícula. notas. ● Uma estrutura de dados que integra dados de tipos diferentes e pode ser usada para atender à necessidade anterior é o registro.

– As sub-variáveis do registro podem ser de quaisquer tipos nativos. . ou mesmo outro tipo registro.Registro ● O registro é a uma estrutura de dados que agrupa. ● A estrutura de dados comumente usada por sistemas gerenciadores de banco de dados relacionais (SGBDR) é uma espécie de registro. em um tipo definido pelo programador. vetores. subvariáveis de diferentes tipos relacionadas entre si.

Registro ● Sintaxe: – Declaração do tipo: tipo <tipo_registro> = registro   <declaração de tipos e variáveis> .<nome_subvariavel> ← <valor> . fim tipo – Declaração de variável: var <variavel> : <tipo_registro> – Uso: <variavel>...

  nome      : string. end. type recAluno = record   matricula : string. type recTurma = record   codigo : string.2] of single. // Tipo definido para o registro (a ficha) do aluno.   nota      : array[1. end.   nome   : string.   aluno  : array[1. . // Tipo definido para o registro (a ficha) da turma..   sexo      : char.. // Note o uso de um vetor de alunos para os integrantes da turma.   media     : single.50] of recAluno. program ControleNotas.Registro ● Exemplo em Pascal: Controle de notas.

.   writeln( '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­').   write( 'Nome: ').nome). j      : integer.codigo).   continuar : string.   write( 'Codigo: ').   turma     : recTurma.   // LEITURA DOS DADOS DA TURMA:   writeln( 'Informe os dados da turma:' ).Registro ● Exemplo em Pascal: Controle de notas (continuação) var   i.   readln( turma. begin   writeln( 'CONTROLE DE NOTAS' ).   // o acesso aa subvariavel e´ feito pela sintaxe de ponto:   readln( turma.

 j.' ). i.aluno[i].sexo = 'F').     readln(turma.       readln( turma.nome ). '.aluno[i].matricula ). continuar := ''.nota[j] ).aluno[i].     write( 'Matricula: ' ).     for j := 1 to 2 do begin       write( 'Nota '.aluno[i].     write( 'Nome: ' ).sexo = 'M') or                (turma.     end.     end until (turma.     // note o acesso ao registro aninhado em outro por um vetor:     readln(turma.sexo ). ': ' ). .Registro ● Exemplo em Pascal: Controle de notas (continuação)   // LEITURA DOS DADOS DOS ALUNOS:   i := 1.     repeat begin       write( 'Sexo (M ou F): ' )..   while (i <= 50) and (continuar = '') do begin     writeln( 'Informe os dados do aluno nº '..aluno[i].       readln(turma.aluno[i].

  writeln( '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­').nota[1] + turma. turma.     turma. turma.       'ou apenas [ENTER] para ler os dados de outro aluno.     i := i + 1.      // EXIBIÇAO DA FICHA DE NOTAS:   writeln( '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­').   end.aluno[i].'     ).     writeln(       'Digite algo seguido de [ENTER] para parar a leitura '.     readln( continuar ).aluno[i].codigo.aluno[i].     // Pergunta se continua a ler alunos. ' ­ '. .   writeln( ' ALUNO                    NOTA 1 ­ NOTA 2 ­ MEDIA ').   writeln( ' TURMA: '.   writeln( '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­').media :=       ( turma.Registro ● Exemplo em Pascal: Controle de notas (continuação)     // calcula a media deste aluno durante a leitura.nota[2] ) / 2.nome ).

aluno[i].aluno[i].   end.     if ( length(turma. 1.nota[2]      ). 40 – length(turma.Registro ● Exemplo em Pascal: Controle de notas (continuação)   for i := 1 to i ­ 1 do begin     write( Copy(turma.aluno[i].aluno[i]. end.nome.       write(          StringOfChar(' '. 40) ).     write(        turma. ' ­ '.media ).     writeln( turma.nome) < 40 ) then       // nao requer begin ou end porque executa apenas uma  instruçao. .   writeln( '­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­').nota[1].nome))        ). turma.aluno[i].aluno[i].

et. Marco Antônio Furlan de.wikipedia. al. André Luiz Villar. 2005.org (3) SOUZA.wikipedia.al. et.Bibliografia (1) Wikipedia. 2005. Em: http://en. Em: http://pt. São Paulo: Pearson Prentice-Hall. . Lógica de Programação. São Paulo: Thomson Learning.org (2) Wikipédia. (4) FORBELLONE. Algoritmo e Lógica de Programação.

Sign up to vote on this title
UsefulNot useful