Algoritmos Aula 11: Portugol Studio - Vetores e Matrizes

Programa para armazenar dias da semana
Programa para armazenar dias da semana

 

Introdução ao uso de Vetores e Matrizes

    Até agora eu e você fizemos um programa que permite entrar com o nome de um alunos, entrar com suas notas de provas e frequência, calcular a média, verificar se o aluno foi ou não aprovado e ainda mostrar no final quantos alunos foram inseridos, certo? 

    E se agora eu pedisse para você no final de todo o processamento, em um único comando mostrar na tela todas essas informações que foram inseridas e processadas? Uma das soluções possíveis necessitaria do conceito de vetores e matrizes. Por isso vamos estudá-los.

Vetores

    Por definição um vetor é uma estrutura que serve para armazenamento de dados, assim como uma variável, mas diferente dela ele armazena mais de um valor. Por isso também é chamado de variável composta unidimensional. 

    A forma mais fácil de compreender um vetor é visualizá-lo como uma tabela possuindo uma única coluna, porém com várias linhas. O número de linhas representaria o número de elementos ou tamanho do vetor. 

    Assim como a variável, o vetor também precisa ser declarado para sua criação com um nome, mas seguido de abre a fecha colchetes [] com uma atribuição definindo o seu tamanho. Cada linha do vetor é identificada por um índice que começa de zero e para referenciá-la usa-se o nome do vetor seguido de um [] com o índice. 

    Vamos a um Exemplo:

    Imagine um vetor chamado Dias para armazenar os dias da semana na forma de cadeia de caracteres. Poderíamos imaginá-lo através dessa figura:

Representação didática do vetor Dias
Representação didática do vetor Dias

 Para sua criação usaríamos a instrução cadeia Dias[7] para definir seu tamanho e o tipo de dado a ser armazenado nas linhas. Assim teríamos Dias[0] seria "Segunda-feira", Dia[1] seria "Terça-feira" e assim por diante. Veja as instruções em Portugol para criar o vetor. A última linha imprime na tela todos os valores.

  1. programa {
  2.   funcao inicio() {
  3.     cadeia Dias[7] //declarando o vetor
  4.     Dias[0]="Segunda-feira" //atribuindo valores a cada elemento
  5.     Dias[1]="Terça-feira"
  6.     Dias[2]="Quarta-feira"
  7.     Dias[3]="Quinta-feira"
  8.     Dias[4]="Sexta-feira"
  9.     Dias[5]="Sábado"
  10.     Dias[6]="Domingo"
  11.     escreva(Dias)
  12.   }
  13. }

    A linha 11 irá gerar como resultado: "Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado","Domingo"

Utilizando laço para ler individualmente o Vetor.

    Ao invés de finalizar com um comando escreva(vetor), podemos usar um laço do tipo para() e ler individualmente cada elemento do vetor. Exemplo:

  1. programa {
  2.   funcao inicio() {
  3.     cadeia Dias[7] //declarando o vetor
  4.     inteiro contador
  5.     Dias[0]="Segunda-feira" //atribuindo valores a cada elemento
  6.     Dias[1]="Terça-feira"
  7.     Dias[2]="Quarta-feira"
  8.     Dias[3]="Quinta-feira"
  9.     Dias[4]="Sexta-feira"
  10.     Dias[5]="Sábado"
  11.     Dias[6]="Domingo"    
  12.     para (contador = 0; contador <= 6; contador++)  {
  13. escreva (Dias[contador]+" ")
  14.     }
  15.   }
  16. }

    Repare que introduzimos um contador variando de 0 que é o número do elemento inicial do vetor, até o número 6 que o tamanho do vetor menos uma unidade. Repare também que, com essa mudança, a saída final dos dados é Segunda-feira Terça-feira Quarta-feira Quinta-feira Sexta-feira Sábado Domingo  sem as "aspas".

Melhorando o código anterior

    Como o tamanho do vetor foi utilizado também no laço, é aconselhável criar uma variável para armazenar o tamanho, e usá-la no laço com a expressão tamanho-1. Veja como fica:

  1. programa {
  2.   funcao inicio() {
  3.     inteiro contador, tamanho
  4.     tamanho=7
  5.     cadeia Dias[tamanho] //declarando o vetor
  6.     Dias[0]="Segunda-feira" //atribuindo valores a cada elemento
  7.     Dias[1]="Terça-feira"
  8.     Dias[2]="Quarta-feira"
  9.     Dias[3]="Quinta-feira"
  10.     Dias[4]="Sexta-feira"
  11.     Dias[5]="Sábado"
  12.     Dias[6]="Domingo"    
  13.     para (contador = 0; contador <= tamanho-1; contador++)  {
  14. escreva (Dias[contador]+" ")
  15.     }
  16.   }
  17. }

Matrizes

    Assim como os Vetores, as Matrizes são estruturas de dados que armazenam várias informação, mas diferente dos vetores, ela poderia ser representada por uma tabela com várias colunas e linhas. Por isso também são chamadas de variáveis compostas multidimensionais.

    Nesse caso a declaração para criar a matriz vai exigir um nome e um par de abre e fecha colchetes [][] dentro dos quais estará os números de linhas e colunas que a matriz possuirá. Para atribuição de cada elemento, usamos o mesmo raciocínio dos vetores.

Exemplo:

    Digamos que eu precise de uma matriz chamada Agenda para armazenar nomes e números de telefones. Conforme a representação abaixo.

Representação de uma matriz para armazenar uma agenda
Representação de uma matriz para armazenar uma agenda

    Eis o programa em Portugol para criá-la

  1. programa {
  2.   funcao inicio() {
  3.     cadeia Agenda[3][2]
  4.     Agenda[0][0]="João"
  5.     Agenda[0][1]="99123-4567"
  6.     Agenda[1][0]="Maria"
  7.     Agenda[1][1]="99456-7890"
  8.     Agenda[2][0]="José"
  9.     Agenda[2][1]="99789-1234"
  10.     escreva(Agenda)
  11.   }
  12. }

    Repare que na linha 3 eu estou declarando a matriz como tendo três linhas e duas colunas, a partir desse ponto eu estou alimentando os elementos da matriz passando os índices de linha e colunas. A linha 10 irá gerar como resultado algo como "João","99123-4567","Maria","99456-7890","José","99789-1234"

Utilizando laço para ler a matriz

    No caso de matrizes são necessários dois laços do tipo para(): Uma para ler as linhas e outro para ler as colunas. Assim como no caso dos vetores, é aconselhável utilizar uma variável para armazenar o tamanho e outra para contador, mas como são duas grandezas distintas, utilizamos uma dupla de variáveis para linhas e outra para colunas. 

    Assim teremos as variáveis linha e coluna para usar como contador e linhas e colunas para definirem tamanhos. Assim temos o seguinte código:

  1. programa {
  2.   funcao inicio() {
  3.     inteiro linha, coluna, linhas, colunas
  4.     linhas=3
  5.     colunas=2
  6.     cadeia Agenda[linhas][colunas]
  7.     Agenda[0][0]="João"
  8.     Agenda[0][1]="99123-4567"
  9.     Agenda[1][0]="Maria"
  10.     Agenda[1][1]="99456-7890"
  11.     Agenda[2][0]="José"
  12.     Agenda[2][1]="99789-1234"
  13.     para (linha = 0; linha <= linhas-1; linha++)  {
  14.           para (coluna = 0; coluna <= colunas-1; coluna++)  {
  15.                escreva(Agenda[linha][coluna]+" ")
  16.           }
  17.           escreva("\n")
  18.    }
  19.   }
  20. }

Usando laços para entrar com dados

    Digamos que eu queira entrar como nomes e telefones de pessoas nessa agenda. Como seria o código? Para facilitar, vamos limitar nossa agenda com apenas três nomes. Como vou armazenar nomes e telefones, precisarei de duas variáveis a mais. Também precisarei de comandos de entradas. Assim temos o seguinte código possível:

  1. programa {
  2.   funcao inicio() {
  3.     inteiro linha, coluna, linhas, colunas
  4.     linhas=3
  5.     colunas=2
  6.     cadeia Agenda[linhas][colunas]
  7.     cadeia nome,fone
  8.     para (linha = 0; linha <= linhas-1; linha++)  {
  9.           para (coluna = 0; coluna <= colunas-1; coluna++)  {
  10.                  escreva("Digite o nome: ")
  11.                  leia(nome)
  12.                  escreva("Digite o Fone: ")
  13.                  leia(fone)
  14.                  Agenda[linha][coluna]=nome
  15.                  coluna=coluna+1 //isso faz e informação ir para a próxima coluna
  16.                  Agenda[linha][coluna]=fone
  17.           }
  18.           escreva("\n")
  19.    }
  20.     para (linha = 0; linha <= linhas-1; linha++)  {
  21.           para (coluna = 0; coluna <= colunas-1; coluna++)  {
  22.                escreva(Agenda[linha][coluna]+" ")
  23.           }
  24.           escreva("\n")
  25.    }
  26.   }
  27. }

Limitações do Portugol

    Diferente de outras linguagens de programação comerciais, o Portugol não permite alterar o tamanho do Vetor ou da Matriz após a sua criação. Sendo assim sendo assim somos obrigados a declará-los com o tamanho máximo de elementos que serão armazenados.

    Nesse caso específico do Portugol, o tamanho dos vetores e das matrizes podem ser passado por elementos para armazenamento de dados conhecidos como CONSTANTES que são declarados com a instrução const. Assim como as variáveis, elas armazenam dados porém não sofrem variação. Assim o início do código poderia ser escrito dessa forma:

  1. programa {
  2.   funcao inicio() {
  3.     inteiro linha, coluna
  4.     const inteiro linhas=3
  5.     const colunas=2
  6.     cadeia Agenda[linhas][colunas]
  7.     //daqui pra baixo não altera

    Outra limitação do Portugol é que as Matrizes não trabalham com diferentes tipos de dados, por isso, na maioria das vezes elas são criadas como cadeia de caracteres. Chamamos isso de matrizes homogêneas. 

    Existem também as chamadas matrizes heterogêneas que trabalham misturando diferentes tipos de dados, mas nesse caso preferimos chamá-las de ESTRUTURAS.


Próxima Aula                                                                                                                        Aula Anterior

Referências

MANZANO, J. A. N. G. Portugol Studio: Programação de Computadores em Português. São Paulo: Propes Vivens, 2017. 86p

NOSCHANG, LUIZ et all. Portugol Studio: Uma IDE para Iniciantes em Programação. In: XXXIV Congresso da Sociedade Brasileira de Computação - CSBC, 34º, 2014, Brasília, Anais Eletrônicos do Congresso da Sociedade Brasileira de Computação, Brasília, 2014. p. 1287 - 1296. Disponível em: <https://sol.sbc.org.br/index.php/wei/article/view/10954/10824>. Acesso em: 4 ago. 2024.

PORTUGOL WEBSTUDIO. Ajuda. Disponível em: <https://portugol.dev/> Acesso em 05 ago. 2024.

PORTUGOL WEBSTUDIO. Dúvidas e Perguntas. Disponível em: <https://portugol.dev/> Acesso em 05 ago. 2024.