Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Computação
1
Escola Nacional de Ciências Estatísticas
Introdução
Dessa vez os comandos C1 e C2 serão executados nada menos do que 50000 vezes!
Isso ocorre por que o comando for I:=1 to 100 está mandando o comando abaixo
dele ser executado 100 vezes. E o comando abaixo dele é for J:=1 to 500 do, que está
mandando C1 e C2 serem executados 500 vezes. O resumo disso tudo é: o computador
repetirá 100 vezes um comando que manda repetir 500 vezes C1 e C2! O que significa que
C1 e C2 serão executados 100 x 500 vezes = 50000 vezes.
É possível utilizar mais de dois comandos for-do aninhados, caso isto seja desejado.
Se um problema requer o uso de três (ou mais) comandos for aninhados para ser resolvido,
você pode fazer isso sem qualquer problema.
1
Para maiores esclarecimentos, consulte a primeira seção da Unidade VII.
2
Escola Nacional de Ciências Estatísticas
IX.2 Matrizes
| 10 42 2 |
| 5 90 25 |
| 80 7 44 |
| 35 3 6 |
Onde:
• li1 .. lin representam os limites da dimensão linha.
• col1 .. coln representam os limites da dimensão coluna2.
2
Nos livros de Pascal você verá que também é possível declarar matrizes com 3 ou mais dimensões. Mas este
tipo de matriz não será abordada neste curso.
3
Escola Nacional de Ciências Estatísticas
Exemplo IX.1: Declare uma matriz chamada M1, do tipo char, com 2 linhas e 5 colunas.
1 2 3 4 5
1
2
Exemplo IX.3: Declare uma matriz chamada NOTAS, do tipo real, com 60 linhas e 3 colunas.
Esta matriz pode ser utilizada, por exemplo, para armazenar notas de 3 provas de uma turma
com 60 alunos.
1 2 3
1
2
3
4
5
6
7
8
... ... ... ...
58
59
60
Para acessar uma posição (ou célula) da matriz, devemos especificar a linha e a
coluna correspondente à posição desejada entre colchetes. O exemplo abaixo demonstra a
atribuição de diferentes valores para diferentes células da matriz M (após a execução destes
12 comandos, a matriz ficaria com o conteúdo igual ao apresentado na Figura IX.1,
mostrada na página 3).
4
Escola Nacional de Ciências Estatísticas
- Para acessar uma posição da matriz, é preciso especificar uma linha e uma coluna.
- Para acessar uma posição do vetor, só é preciso especificar a linha. O vetor nada
mais é do que uma matriz que possui uma só coluna (matriz-coluna).
5
Escola Nacional de Ciências Estatísticas
writeln (‘M1 eh igual a M2’); {ERRADO: para comparar duas matrizes é
preciso construir um laço }
IGUAIS:=true;
for I:= 1 to 3 do
for J:= 1 to 2 do
if M1[I,J] <> M2[I,J] then {CERTO: aqui as matrizes estão sendo }
IGUAIS:=false; { comparadas em um laço, que verifica
seus elementos individualmente }
Exemplo IX.3 - Escrever um programa que: (a) crie uma matriz 5 x 6 de inteiros e armazene o
valor 0 em todas as suas posições; (b) imprima a matriz no vídeo.
program Ex3;
var MAT: array[1..5,1..6] of integer; {declara a matriz 5x6}
I, J: integer;
begin
{ PASSO 1: preenche a matriz com 0 em todas as posições }
for I:= 1 to 5 do
for J:=1 to 6 do
MAT[I,J] := 0;
No exemplo anterior, a variável “I” foi usada para controlar a posição da linha,
enquanto a variável “J” foi usada para controlar a posição da coluna, tanto no PASSO 1,
6
Escola Nacional de Ciências Estatísticas
como no PASSO 2. No PASSO 1, a matriz é preenchida linha por linha. Inicialmente todas
as células da linha 1 são preenchidas; depois todas as células da linha 2; e assim por diante,
até a linha 5. No PASSO 2 a matriz é exibida na tela da mesma forma: primeiro todas as
células da linha 1, depois todas as células da linha 2, até chegar a linha 5. Veja que, para
poder manipular uma matriz corretamente, o aluno deve dominar o comando for.
Embora MAT seja uma matriz de inteiros, foi utilizado o comando
write(MAT[I,J]:2), que usa o parâmetro “:2”. Este parâmetro faz com que sejam
reservados dois “espacinhos” na tela para a impressão do valor de MAT[I,J]. Com isto a
visualização dos elementos matriz fica mais agradável (experimente retirar o parâmetro :2
para ver o que acontece).
Exemplo IX.4 - Escrever um programa que: crie uma matriz 5 x 5 de inteiros, armazene o
valor 1 na diagonal principal e o valor 0 nas demais células. Em seguida, imprima a matriz.
program Ex4;
const N=5;
var MAT: array[1..N,1..N] of integer;
I, J: integer;
begin
{ PASSO 1: preenche a matriz }
for I:= 1 to N do
for J:=1 to N do
if I=J then
MAT[I,J] := 1 {se I=J, certamente estou em um elemento da}
else {diagonal principal}
MAT[I,J] := 0;
Nesse exemplo, basta modificar o valor da constante N de 5 para outro valor (tente
10 ou 20, por exemplo) para que o Pascal mude o tamanho da matriz quadrada
automaticamente.
Exemplo IX.5 - Elaborar um programa que: crie duas matrizes M1 e M2, ambas do tipo 3 x 3
de reais. Em seguida implemente as seguintes rotinas:
7
Escola Nacional de Ciências Estatísticas
program Ex5;
const N=3;
var M1, M2: array[1..N,1..N] of real;
I, J: integer;
begin
writeln; writeln('M2');
for I:= 1 to N do
8
Escola Nacional de Ciências Estatísticas
begin
for J:=1 to N do
write(M2[I,J]:15:2);
writeln;
end;
readln;
end.
Não é possível multiplicar (ou somar, subtrair e dividir) todos os elementos de uma
matriz com um comando simples como M2 := M1 * 2. Ao invés disso, é necessário
programar um laço para percorrer todas as células da matriz e multiplicar o valor
armazenado em cada uma delas por 2.
Exemplo IX.6 - Escrever um programa que leia uma matriz responsável por armazenar notas
de 3 provas (P1, P2 e P3) de uma turma de Computação formada por 12 alunos. A seguir,
para cada aluno, imprima a nota de suas 3 provas e a média destas notas.
program Ex6;
var NOTAS: array[1..12,1..3] of real;
I, J: integer;
SOMA, MEDIA: real;
begin
{ PASSO 1: Carrega matriz com as 3 notas de cada aluno }
for I:= 1 to 12 do
for J:=1 to 3 do
begin
write('Digite o valor da nota ', J, ' do aluno ', I, ' = ');
readln(NOTAS[I,J]);
end;
{ PASSO 2: - imprime as notas de cada aluno.
- calcula e imprime a média de cada aluno }
readln;
end.
9
Escola Nacional de Ciências Estatísticas
Exemplo IX.7 - Escrever um programa que leia e depois imprima uma matriz MxN do tipo
char, onde o tamanho máximo de M e N deve ser 100.
program Ex7;
const MAX = 100;
var MAT: array[1..MAX,1..MAX] of char;
I, QTD_LIN, J, QTD_COL: integer;
begin
repeat
write('Digite a quantidade de colunas da matriz (MAX = ', MAX, '): ');
readln(QTD_COL);
until (QTD_COL <= MAX);
readln;
end.
10
Escola Nacional de Ciências Estatísticas
nas variáveis QTD_LIN e QTD_COL e estas variáveis são utilizadas como limite superior
em todos os comandos for subseqüentes.
Exemplo IX.8 - Faça um programa que leia uma matriz A de inteiros 2x3. A seguir, obtenha e
imprima tA (a matriz transposta de A).
Exemplo: Se
A = | 2 0 3 |
| 1 -1 2 |
então tA = | 2 1 |
t | 0 -1 |
t | 3 2 |
program Transposta;
var A: array[1..2,1..3] of integer; {matriz original}
tA: array[1..3,1..2] of integer; {matriz transposta}
I, J: integer;
begin
11
Escola Nacional de Ciências Estatísticas
writeln;
end;
readln;
end.
Exemplo IX.9 - Elabore um programa que carregue uma matriz quadrada 5x5 de números
reais. Altere a matriz digitada da seguinte forma: multiplique cada elemento de uma linha
pelo elemento da diagonal principal da linha em questão. Mostre a matriz após as
multiplicações.
program Ex9;
var M: array[1..5,1..5] of real;
I, J: integer;
D: real; {elemento da diagonal principal}
begin
12
Escola Nacional de Ciências Estatísticas
PAÍS CAPITAL
Nigéria Abuja
Somália Mogadíscio
Quênia Nairóbi
Argélia Argel
Moçambique Maputo
Madagascar Antananarivo
Mongólia Ulan Bator
Uganda Campala
Zâmbia Lusaca
program Ex10;
var I: integer;
{ matriz de 9 linhas e 2 colunas do tipo string[12] }
{ (pode armazenar uma palavra de até 12 caracteres em cada célula }
achou: boolean; {usado para que seja possível saber se o país foi
achado na matriz}
begin
13
Escola Nacional de Ciências Estatísticas
writeln('Digite o nome de um pais (use apenas letras maiusculas)');
readln(busca);
readln;
end.
1) DE ONDE VEIO?
(A) Rio de Janeiro (B) Minas Gerais (C) Espírito Santo
Faça um programa que leia os dados desta pesquisa via teclado e armazene numa matriz de
1000 x 3 do tipo char (“1000” representa a quantidade máxima de questionários. O sistema
deve perguntar ao usuário quantos questionários serão processados antes de iniciar o
recebimento de dados).
14
Escola Nacional de Ciências Estatísticas
14.3) A porcentagem de veículos movidos a Gasolina, Álcool e Gás que têm como origem
Rio de Janeiro.
14.4) A quantidade de veículos que têm Rio de Janeiro como origem e Espírito Santo como
Destino.
14.5) A quantidade de veículos que têm Espírito Santo como origem, Minas Gerais como
Destino e são movidos a Gás.
program PesqMatriz;
const TOT_QUEST = 1000; {aqui eu defino uma constante que indica o número
de linhas da minha matriz... isso facilita testes no programa}
begin
15
Escola Nacional de Ciências Estatísticas
readln(M[I,3]);
end;
{PASSO 2: computação dos resultados}
QTD_ORIG_MG :=0;
QTD_ORIG_RJ :=0;
QTD_ORIG_RJ_ALC := 0;
QTD_ORIG_RJ_GASOL := 0;
QTD_ORIG_RJ_GAS := 0;
QTD_RJ_ES :=0;
QTD_ES_MG_GAS := 0;
{exibe os resultados}
writeln;
writeln('Quant. Origem "MG" = ',QTD_ORIG_MG);
writeln('Porcent. Origem "RJ" = ',(QTD_ORIG_RJ / TOT_QUEST)*100:3:2);
writeln('Porcent. Origem "RJ" + Gasolina = ',(QTD_ORIG_RJ_GASOL /
TOT_QUEST)*100:3:2,'%');
writeln('Porcent. Origem "RJ" + Alcool = ',(QTD_ORIG_RJ_ALC /
TOT_QUEST)*100:3:2,'%');
writeln('Porcent. Origem "RJ" + Gas = ',(QTD_ORIG_RJ_GAS /
TOT_QUEST)*100:3:2,'%');
writeln('Quant. Origem "RJ" e Destino "ES" = ',QTD_RJ_ES);
writeln('Quant. Origem "ES" + Destino "MG" + Gas = ',QTD_ES_MG_GAS);
readln;
end.
16
Escola Nacional de Ciências Estatísticas
Por motivos didáticos, nesse programa a contabilização dos resultados foi feita após
a carga da matriz via teclado (desse jeito o programa fica com dois blocos distintos: um que
só faz a carga e outro que só faz contabilizações).
A maneira mais eficiente de contar os resultados seria com o uso de IF’s-ELSE’s,
conforme ilustrado a seguir. O código fica um pouco mais complicado de entender, porém
mais eficiente.
QTD_ORIG_RJ_GASOL := QTD_ORIG_RJ_GASOL + 1
else
if (M[I,3] = 'B') then {origem = RJ e combustivel = Alcool}
QTD_ORIG_RJ_ALC := QTD_ORIG_RJ_ALC + 1
17
Escola Nacional de Ciências Estatísticas
QTD_ORIG_RJ_GAS := QTD_ORIG_RJ_GAS + 1;
end
end;
Exercícios Propostos
(1) Faça um programa que carregue uma matriz 2x3 de inteiros, calcule e mostre a
quantidade de elementos da matriz que não pertencem ao intervalo [5,15].
(2) Faça um programa que gere automaticamente (sem ler do usuário) uma matriz 5x5
cujos elementos são:
| 1 2 3 4 5|
| 6 7 8 9 10|
|11 12 13 14 15|
|16 17 18 19 20|
|21 22 23 24 25|
(3) Faça um programa que carregue uma matriz 4x4 de inteiros, e que depois imprima
apenas os elementos localizados acima da diagonal principal.
(4) Construir um programa que calcule e mostre a média dos elementos da diagonal
principal de uma matriz 10x10 de reais.
(5) Elabore um programa que carregue uma matriz 5x5 de números reais. Altere a matriz
digitada da seguinte forma: divida cada elemento de uma linha pelo elemento da diagonal
secundária da linha em questão. Mostre a matriz após a modificação.
(6) Elabore um programa que carregue uma matriz quadrada A de reais, de ordem 3. Em
seguida calcule e imprima o valor do determinante de A. Para o cálculo do determinante,
obtenha o valor da multiplicação de todos os elementos da diagonal principal e subtraia do
valor da multiplicação de todos os elementos da diagonal secundária.
18
Escola Nacional de Ciências Estatísticas
(7) Faça um programa que carregue duas matrizes A e B de dimensão 4x5 com números
inteiros; depois calcule e mostre: (a) a soma das duas matrizes, resultando também em uma
terceira matriz C de dimensão 4x5; (b) a diferença das duas matrizes, resultando em uma
quarta matriz D de dimensão 4x5.
(8) Elabore um programa que carregue uma matriz 6x3 de inteiros. Altere a matriz digitada
da seguinte forma: cada elemento de uma linha deve ter o seu valor multiplicado pelo valor
do maior elemento da linha em questão. Mostre a matriz resultante.
(9) Foi realizada uma pesquisa envolvendo 200 alunos de escolas de segundo-grau. De cada
aluno foram coletados os seguintes dados: idade, altura (em cm), peso (em kg). Faça um
programa que leia esses dados, armazenando-os em uma matriz de inteiros. Em seguida
calcule e mostre:
(10) Faça um programa que leia uma matriz A de inteiros com M linhas e N colunas (onde
o valor máximo tanto para M como para N deve ser igual a 50). Obtenha e imprima a
matriz transposta de A.
(12) Faça um programa que leia uma matriz quadrada real A, de dimensão MxM (M ≤ 50).
A seguir, verifique se a matriz é simétrica, ou seja, se A[I,J] = A[J,I] para todo I, J ≤ M.
Imprima na tela a palavra “SIMÉTRICA” se a matriz A for simétrica e “NÃO-
SIMÉTRICA” caso contrário.
(13) Dada uma matriz real A com m linhas e n colunas e um vetor real V (de tamanho n),
escreva o trecho de código que determina o produto de A por V e armazena o resultado em
um outro vetor, chamado R (de tamanho M).
(14) Dizemos que uma matriz quadrada inteira é um quadrado mágico se a soma dos
elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das
diagonais principal e secundária são todas iguais. Exemplo:
|8 0 7|
|4 5 6|
|3 10 2|
19
Escola Nacional de Ciências Estatísticas
Escreva o trecho de código Pascal capaz de identificar se uma matriz quadrada de ordem M
é um quadrado mágico.
(15) Dizemos que uma matriz inteira Amxm é uma matriz de permutação se em cada linha e
em cada coluna houver m-1 elementos nulos e um único elemento igual a 1. Exemplo:
|0 1 0 0|
|0 0 0 1|
|1 0 0 0|
|0 0 1 0|
Escreva o trecho de código Pascal capaz de identificar se uma matriz quadrada de ordem M
é uma matriz de permutação.
(16) Escreva o trecho de código Pascal que consiga descobrir se uma matriz MAT com 20
linhas e 15 colunas possui algum elemento repetido.
(17) Considere um programa que mantenha em memória uma matriz 7x7, de números reais,
denominada DIST, cujo conteúdo é apresentado abaixo:
DIST 1 2 3 4 5 6 7
1 0 20.8 5.6 7.8 14.3 6.5 9.2
2 20.8 0 15.1 12.9 20.1 10 8
3 5.6 15.1 0 1.5 7 12 27
4 7.8 12.9 1.5 0 6.2 7.9 4.1
5 14.3 20.1 7 6.2 0 2 3.3
6 6.5 10 12 7.9 2 0 11
7 9.2 8 27 4.1 3.3 11 0
Esta matriz armazena as distâncias (em km) entre 7 cidades. Tem-se, por exemplo, que
DIST[1,2] armazena a distância entre as cidades 1 e 2. O valor desta distância é igual a
20.8km.
Escreva um trecho de programa Pascal que receba como entrada um percurso entre cidades
e, como saída, imprima a quilometragem que será percorrida.
20