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.

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

. MEMÓRIA . ocupa 4 posições na memória.Vetores ● ● São as variáveis indexadas unidimensionais...... Sintaxe: <nome_var>: vetor[ <li>... ● VI é uma variável indexada de 4 posições. . 80 81 82 83 84 85 Ao lado: ● VS é uma variável simples de valor 10 ocupando a posição 76 da memória.<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 ...

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

● 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. portanto.Vetores ● Notas importantes: – O índice de um vetor é inteiro e.

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

.    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 = ". . (ac / 10)) fimalgoritmo . .Vetores ● Exemplo: média aritmética de 10 números.

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

.. 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: ".Vetores ● Exemplo: pesquisa em vetor .    i <­ 1    repita       se pos(procura. nomes[resposta])    fimse fimalgoritmo .

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

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

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

 "ª nota (de 1 a 10): ")           leia (nota[a.   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 ".inicio   // faz a leitura de até 100 alunos. n. n] >= 0) e (nota [a. 3] <­ (nota[a. n] <= 10)       fimpara       // calcula a média       nota[a. n])         ate (nota [a. 2]) / 2     fimse     a <­ a + 1   fimenquanto . 1] + nota[a.

 nota[n.   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].3])   fimpara   escreval ("­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­") fimalgoritmo .  // Ajusta a para marcar total de alunos informados. nota[n. " | ".2])     escreval (" | ".1]. nota[n. " | ".

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

por uma função específica. <tamanho>).  begin setLength(<nome_var>.  // vasculha o vetor: for i := low(<nome_var>) to high(<nome_var>) do . var  <nome_var>  : array of <tipo>.  // 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.. i.  .. seu tamanho pode ser definido e alterado após sua declaração. num_elem : integer.

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

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

.. // Em Portugol... ficaria: (estrutura não existe na literatura) paracada <var_item> em <var_vetor> faca . } // Em PHP:  foreach (<var_vetor> as <var_item>) { . } .. // onde <var_item> deve ser do mesmo tipo dos elementos de <var_vetor> // Em Pascal.. // Em Java:  for (<tipo> <var_item> : <var_vetor>) { .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... a estrutura não existe. } // ou: foreach (<var_vetor> as <var_item_chave> => <var_item_valor>) { .

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

. – As sub-variáveis do registro podem ser de quaisquer tipos nativos.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. ou mesmo outro tipo registro. em um tipo definido pelo programador. vetores. subvariáveis de diferentes tipos relacionadas entre si.

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful