16 - matrizes - unesp: câmpus de guaratinguetá · pdf filena realidade em c, uma...

50
Unesp – Campus de Guaratinguetá 16 16 - - Matrizes Matrizes Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante

Upload: nguyenkiet

Post on 06-Feb-2018

217 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Unesp – Campus de Guaratinguetá

16 16 -- MatrizesMatrizes

Curso de Programação ComputadoresProf. Aníbal Tavares

Profa. Cassilda RibeiroMinistrado por: Prof. André Amarante

Page 2: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 2

Matrizes - Definição

Também chamadas conjuntos bidimensionais, contém:– um número fixo de elementos;– todos são do mesmo tipo;– arranjados na forma de tabela de 2 dimensões;

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: Matrizes

Page 3: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 3

Matrizes - Definição

Ex.: Uma matriz chamada MAT que tenha melementos (horizontal) e n elementos (vertical)

0 1 2 3 4 n-101234

m-1...

...

*MatMat[2][3][2][3]

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: Matrizes

Page 4: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 4

Matrizes ou Array bidimesionais são estruturas de dados que organizam informações; de mesmo tipo e mesmo nome; em tabelas.

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: Matrizes

Para se acessar ou modificar um elemento da matriz deve-se especificar o nome da matriz seguido de dois números entre colchetes ([ ]), sendo que o primeiro corresponde a linha e o segundo corresponde a coluna relativa a posição que o elemento ocupa na Tabela.

Para tanto, são utilizados dois índices, que correspondem a linhas e colunas.

Page 5: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 5

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: Matrizes

int a[ 3 ][ 2 ];DeclaraçãoDeclaração e Atribuição de Matrizes Uma matriz nada mais é que um vetor de duas

dimensões, logo a atribuição de valores a uma matriz éfeita de modo semelhante atribuição de valores a um vetor.

A declaração de um vetor com n dimensões é feita do seguinte modo:

tipo nome_do_vetor [dim1][dim2][dim3] ... [dimn]

Page 6: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 6

Ex: Declaração de uma matriz de inteiro de dimensão 3x2.

main()int mat[3][2]; //3 linhas, cada uma delas com 2 posições

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: Matrizes

mat[2][1]mat[2][0]Linha 2mat[1][1]mat[1][0]Linha 1mat[0][1]mat[0][0]Linha 0

Coluna 1Coluna 0

Page 7: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 7

Atribuição Automática Inicial A atribuição inicial é feita da mesma maneira que para

vetores de uma só dimensão.

Ex: int a[ 3 ][ 2 ] = {1, 1, 2, 2, 3, 3};Neste exemplo, o vetor tem 3 linha e duas colunas, logo está sendo feita a seguinte atribuição:

16.1 Dados Estruturados: Matrizes 16.1 Dados Estruturados: Matrizes -- Atribuição Inicial

a[2][1]=3a[2][0]=3

a[1][1]=2a[1][0]=2

a[0][1]]=1a[0][0]=1

Observe que os dois primeiros números da chave estão sendo atribuídos a 1ª. linha, os dois seguintes são atribuídos àsegunda linha e os dois últimos são atribuídos a terceira linha.

Page 8: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 8

A atribuição inicial também pode ser feita da seguinte maneira

Ex: int a[ 3 ][ 2 ] = { {1, 1}, {2, 2}, {3, 3} };

Observe que agora existe uma separação por linhas, sendo: {1,1} relativa a 1ª. linha; {2,2} relativa a 2ª. linha e {3,3}relativa a 3ª. linha.

16.1 Dados Estruturados: Matrizes 16.1 Dados Estruturados: Matrizes -- Atribuição Inicial

Vetor de tamanho 2x1

Na realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima:

a – É um vetor com 3 elementos (cada elemento é um vetor de 2 inteiros)

a[i] – É um vetor de 2 inteiroa[i][j] – É um inteiro que está colocado na posição i, j do vetor a

Page 9: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 9

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: Matrizes

Acesso e Modificação de valores de uma Matriz

1 1

2 2

3 3

a[0][1]=a[0][1]+2 1 3

4 2

12 3

Matriz Inicial Matriz FinalOperações

a[1][0]=a[0][1]+1

a[2][0]=a[2][0]*a[1][0]

Page 10: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 10

16.1 Dados Estruturados: Matrizes16.1 Dados Estruturados: MatrizesProblema 1: Criar programa com uma matriz 3 x 3 de inteiroscujos elementos são da forma a[i][j] = i + j + 1. Imprimir a matriz.# include <stdio.h># include <stdio.h>main() { int i, j;

int a[3][3];// Colocando valores em a.for (i=0; i < 3; i++)

for (j=0; j < 3; j++) a[i][j] = i + j + 1;

// Mostra elementos de a-> a[i][j].for (i=0; i < 3; i++){ for (j=0; j < 3; j++)

printf(“ %d ", a[i][j]); puts(“”);}

} // fim programa

a [ i ] [ j ] = i + j + 1;

1 2 3

2 3 4

3 4 5

a[0][0] a[0][1] a[0][2]

a[2][0] a[2][1] a[2][2]

a[1][0] a[1][1] a[1][2]

Page 11: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 11

16.1 Matrizes 16.1 Matrizes -- Problemas

Problema 2: Criar um programa que dado um valor n construa o triângulo de Pascal correspondente até a n-ésima linha.

0 1 2 3 4 5 6

0

1

2

3

4

5

6

11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 1

O Triângulo de Pascal pode ser calculado usando uma matriz tal que cada elemento é dado por : a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ]

0 1 2

0

1

2

1

1 1

1 2 1

0 0

0

01 0 a[1][1]

a[0][0]

a[0][1]

Page 12: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 12

16.1 Matrizes 16.1 Matrizes -- Problemas

Para gerar o triângulo basta seguir os seguintes passos:

Passo 1:

Construir umamatriz nxn

de zeros

Passo 2:

Preencher a primeira

coluna com 1

Passo 3:

Obter os demaiselementos utilizando:

a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ]

0 1 2

0

1

2

0 00 0 0

000 0

0 1 2

0

1

2

111 0 0

0 000

0 1 2

0

1

2

1 11 2 1

0 00

1 0

2

0

2

0

21

2

0

212 122222

Page 13: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 13

#include <stdio.h>const int n = 10;main() {int i, j, a[n][n]; // Inicializando os elementos de a.// Passos 1 e 2.for (i=0; i < n; i++)

for (j=0; j < n; j++) if (j == 0)a[i][j] = 1;

elsea[i][j] = 0;

// Demais elementos de a. Passo 3.for (i=1; i < n; i++)

for (j=1; j <= i; j++) a[i][j] = a[i-1][j-1]+a[i-1][j];

Problema 2 – Pascal

16.1 Matrizes 16.1 Matrizes –– Problemas : Problema 2 – Pascal

// Mostrando os elementos de a.for (i=0; i < n; i++) {

for (j=0; j < n; j++) printf(“ %4d ”,a[i][j]);

printf(“\n”);}} // fim programa

Problema 2 – Continuação

Page 14: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 14

Problema 3: As notas de uma turma são armazenadas em uma matriz de forma que a i-ésima linha contém todas as 4notas bimestrais de um aluno. Supondo que o 1, 2, 3 e 4 bimestre possuem pesos 1, 2, 1 e 2, respectivamente, calculare mostrar a média de cada aluno.

16.1 Matrizes 16.1 Matrizes -- Problemas

Idéia do Programa

17.0 3.5 4.0 8.5

2.0 5.5 17.0 9.5

* =5.8

6.5

Matriz alunos x notas Vetor pesos

Vetor médias

M1

Mm

5.8

6.5

1212

P1

P2

P3

P4

1212

Aluno 1

Aluno m

B1 B2 B3 B4

17.0 3.5 4.0 8.5

2.0 5.5 17.0 9.5

Page 15: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 15

16.1 Matrizes 16.1 Matrizes -- Problemas

Como multiplicar uma matriz por um vetor ?

a11 a12

a21 a22

am1 am2

v11

v21

a1n

a2n

amn vn1

= r11

r21

rm1

Matriz m x nVetor n x 1

Vetor m x 1

a11 a12 a1n

Page 16: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 16

16.1 Matrizes 16.1 Matrizes -- Problemas

Como é calculado o i-ésimo elemento do vetor r ?

ri1 ai1 ai2 ain v11

v21

vn1

=

11

1 k

n

kiki var

i = 1, ..., m

Primeiro laço

Segundo laço

Page 17: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 17

#include <stdio.h>// Supondo uma classe com 10 alunos.const int m = 10;main() {

int i, j, k; float soma;float a[m][4], r[m], p[4] = {1,2,1,2}; // Armazenando as notas.for (i=0; i < m; i++){

printf(“Aluno %d: ”, i+1); for (j=0; j < 4; j++) {

printf(“\n Nota %d: ”,j+1);scanf(“%f”, &a[i][j]);

}}

Problema 3 – Notas// Calculo da media e resultado em r.for (i=0; i < m; i++) {

soma = 0.0;// Media do aluno i: armazenar a // soma das k notas vezes k pesos.for (k=0; k < 4; k++)

soma = soma + a[i][k]*p[k]; // Calculo da media do aluno i.r[i] = soma/6;

}// Mostrando a media de cada aluno.printf(“ Aluno Media \n“);for (i=0; i < m; i++)

printf(“ %4d %4.2f \n”,i+1,r[i]);} // fim programa

Problema 3 – Notas

16.1 Matrizes 16.1 Matrizes -- Problemas

Page 18: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 18

Problema 4: Uma fazenda foi dividida em 3 regiões e para cada uma delas é armazenada em uma matriz a informação da produção, em toneladas de 4 tipos de culturas: milho, soja, feijão e arroz. Os dados de 1 ano são registrados em uma matriz A. Construir um programa que realize as seguintes tarefas:

(1) Ler os dados de produção de cada cultura em cada uma das regiões da fazenda.(2) Calcular a produção de grãos de cada região.(3) Calcular a produção de grãos de cada cultura.(4) Calcular o total de grãos produzidos pela fazenda.

16.1 Matrizes 16.1 Matrizes -- Problemas

Page 19: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 19

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Idéia do Programa

Região 1

Região 2

Região 3

Milho Soja Feijão Arroz

3.01.02.0

4.05.06.0

2.04.03.0

3.02.05.0

Uma matriz 3x4 para os dados

Região 1

Região 2

Região 3

Milho Soja Feijão Arroz

Total cultura

Total região

12.0

12.0

16.0

6.0 16.0 9.0 10.0

3.01.02.0

4.05.06.0

2.04.03.0

3.02.05.0

Page 20: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 20

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

#include <stdio.h>const int m = 3; const int n = 4;main() { int i, j, k;

float a[m][n], r[m], c[n]; // Armazenando a produção em a.for (i=0; i < m; i++) {

printf(“Regiao %d: ”, i+1); for (j=0; j < n; j++) {

printf(“\n Cultura %d: ”,j+1);scanf(“%f”, &a[i][j]); } }

// Calculo do total para cada região.for (i=0; i < m; i++) {

r[i] = 0.0; // Valor inicial.// Soma das culturas da região i. for (k=0; k < n; k++)

r[i] = r[i] + a[i][k]; printf(“Regiao %d: %4f\n”,i+1,r[i]); }

Problema 4 – Fazenda // Calculo do total para cada cultura.for (j=0; j < n; j++) {

c[j] = 0.0; // Valor inicial.// Soma da regiões da cultura i. for (k=0; k < m; k++)

c[j] = c[j] + a[k][j]; printf(“Cultura %d: %4f\n”,j+1,c[j]);

}} // fim programa

Problema 4 – Fazenda

Page 21: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 21

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

ValorCobertura VegetalEntre 80% e 100%Entre 60% e 80%

54

Entre 40% e 60% 3Entre 20% e 40% 2Entre 0% e 20% 1

Problema 5: Para monitorar o desmatamento de uma determinada área são utilizadas imagens produzidas por um satélite. Para tanto, é necessário dividir a área a ser monitorada em sub-áreas e depois atribuir um valor que indica o grau de cobertura vegetal existente em cada sub-área de acordo com a seguinte tabela

Page 22: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 22

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Ou seja, associa-se uma imagem a uma matriz de valores:

Assim, o cálculo do desmatamento de uma área, que consiste em se comparar as diferenças entre duas imagens da área

para anos diferentes, pode ser obtido com a soma das diferenças dos elementos de duas matrizes.

5

5

5

4

5

5

4

4

5

4

3

2

5

5

3

1

Page 23: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 23

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

5554

5543

5422

5421

Ano de 2007

5554

5544

5432

5531

Ano de 2006

- =0000

000-1

00-10

0-1-10

Matriz devariação dacobertura

vegetal

No caso acima pode-se dizer que o desmatamento entre 2006 e 2007

foi da ordem de 4 unidades.- 4 unidades

Page 24: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 24

Problema 5: Utilizando as informações anteriores, construir um programa que, dadas duas matrizes A e B correspondentes

aos dados de cobertura vegetal de uma área em dois anos consecutivos, imprime uma matriz C de variação da cobertura

vegetal, bem como o total de unidades desmatadas. Supor A e B como dadas no exemplo abaixo:

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

5554

5543

5422

5421

5554

5544

5432

5531

- =0000

000-1

00-10

0-1-10

- 4 unidadesMatriz A Matriz B

Page 25: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 25

16.1 Matrizes 16.1 Matrizes –– Problemas

#include <stdio.h>const int m = 4; const int n = 4;main() {int i, j, soma, c[m][n];

int a[m][n] = {{5,5,5,5}, {5,5,4,4}, {5,4,2,2}, {4,3,2,1}};

int b[m][n] = {{5,5,5,5}, {5,5,4,5}, {5,4,3,3}, {4,4,2,1}};

// Contabilizando desmatamento em c.for (i=0; i < m; i++)

for (j=0; j < n; j++) c[i][j] = a[i][j] - b[i][j];

// Mostrando a matriz c.for (i=0; i < m; i++) {

for (j=0; j < n; j++) printf(“ %4d ”,c[i][j]);

printf(“\n”); }

Problema 5 – Desmatamento

// Totalizando n. unidades//desmatadas.soma = 0;for (i=0; i < m; i++)

for (j=0; j < n; j++) soma = soma + c[i][j];

// Exibindo n. unidades desmatadas.printf(“Cobertura Veg. = %d\n”,soma); } // fim programa

Problema 5 – Desmatamento

Resolvidos

Page 26: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 26

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Problema 6: Construir um programa que simule um jogo davelha. O programa deve cumprir os seguintes requisitos:(i) Permitir movimentos alternados de dois jogadores A e B.(ii) Identificar se um movimento pode ser realizado ou não.(iii) Identificar o término de um jogo, indicando as 3 possíveissituações: (1) A ganhou, (2) B ganhou, (3) Empate.(iv) Construir um tabuleiro que permita a representação dasjogadas tal como dado abaixo.

xo

Espaço livreJogada de A

Jogada de B

Page 27: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 27

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

x

Requisito (i): Movimentos alternados de A e B.

0 x oo o xx x o

1

2 3

4

6

78

5

if (cont%2 == 0)// Movimento de A

else// Movimento de B

if (cont == 9)// Empate !

Requisito (iii): Identificar empate.

Variável contadora de jogadas válidas: cont.

Page 28: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 28

Requisito (iv): Representação das jogadas.

. x .o . .. . .

Matriz de caracteres

Coordenadas: 0 1 Coluna 0

Linha 0

Linha 1

Linha 2

Coluna 1 Coluna 2

00

Coordenadas: 1 01

Caractere ‘.’1

Requisito (ii): Se a jogada pode ser realizada.

if (m[i][j] == ‘.’)Pode fazer jogada

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 29: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 29

Requisito (iii): Situações de jogadas vencedoras.

x x xx x x

x x x

xx

x

xxx

xxx

xxx

xx

x

if (m[0][0] == ‘X’ && m[1][0] == ‘X’ && m[2][0] == ‘X’)

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 30: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 30

// Algoritmo Simples do Jogo da Velha.Passo 1: Criar matriz m de caracteres 3 x 3 cujos elementos são ‘.’.Passo 2: Mostrar estado atual da matriz.Passo 3: Enquanto (True) faça

Passo 3.1: Verificar se jogador A fez jogada vencedora. Se sim, pare. O jogador A venceu.

Passo 3.2: Verificar se jogador B fez jogada vencedora. Se sim, pare. O jogador B venceu.

Passo 3.3: Verificar se a jogada atual é a nona. Se sim, pare. Ocorreu empate.

Passo 3.4: Capturar coordenadas i (linha) e j (coluna) da jogada. Se i e j foram válidos então ( ou seja m[i][j]== ‘.’)

Passo 3.4.1: Se (jogada de A) preencher a casa com a marca de ‘x’.Senão preencher a casa com a marca ‘o’.

Passo 3.4.2: Incrementar uma variável contadora de jogadas.

Problema 6 – Jogo da Velha – Algoritmo Simples

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 31: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 31

#include <stdio.h>#include <stdlib.h>main() {char m[3][3]; int i, j, ci,cj,cont =0; const int TRUE = 1;const char O = 'o', X = 'x';printf("Digite lin col \n");// Inicializando a matriz m com ‘.’. for (i=1; i <= 3; i++)for (j=1; j <=3; j++)m[i][j] = '.';

while (TRUE) // Laço infinito.{// Mostrando a matriz m.for (i=1; i <= 3; i++) {

for (j=1; j <= 3; j++) printf(" %c ",m[i][j]);

printf("\n");}

Problema 6 – Jogo da Velha // Verificando se o jogador A ganhou.

if ((m[1][1]==X && m[1][2]==X && m[1][3]==X) ||(m[2][1]==X && m[2][2]==X && m[2][3]==X) ||(m[1][1]==X && m[2][1]==X && m[3][1]==X) ||(m[1][2]==X && m[2][2]==X && m[3][2]==X) || (m[1][3]==X && m[2][3]==X && m[3][3]==X) || (m[3][1]==X && m[2][2]==X && m[1][3]==X) ||(m[1][1]==X && m[2][2]==X && m[3][3]==X) )

{printf("Jogador A ganhou !!! \n"); break;}// Verificando se o jogador B ganhou.if ((m[1][1]==O && m[1][2]==O && m[1][3]==O) ||

(m[2][1]==O && m[2][2]==O && m[2][3]==O) ||(m[3][1]==O && m[3][2]==O && m[3][3]==O) ||(m[1][1]==O && m[2][1]==O && m[3][1]==O) ||(m[1][2]==O && m[2][2]==O && m[3][2]==O) || (m[1][3]==O && m[2][3]==O && m[3][3]==O) || (m[1][1]==O && m[2][2]==O && m[3][3]==O) ||(m[1][3]==O && m[2][2]==O && m[3][1]==O) )

{printf("Jogador B ganhou !!! \n\n"); break;}

Problema 6 – Jogo da Velha

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 32: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 32

if (cont == 9) // Sem jogadas.{ printf("\a Empatou !!! \n\n"); break;}

// Capturando nova jogada.printf("Digite as Coordenadas: ");scanf("%d %d",&ci,&cj);if (m[ci][cj] == '.') // Verifica se Casa está livre ?{

if (cont % 2 == 0) // O jogador A é quem jogou.m[ci][cj] = X;

else // O jogador B é quem jogou. m[ci][cj] = O;

// Contado o n. de jogadas.cont++;

} // Fim if que verifica casa livre.} // Fim do while.

} // Fim programa

Problema 6 – Jogo da Velha (Cont.)

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 33: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 33

Problema 7: Construir um programa que simule o jogo YuckyChoccy. O programa deve cumprir os seguintes requisitos:(i) Permitir movimentos alternados de dois jogadores A e B.(ii) Identificar se um movimento pode ser realizado ou não.(iii) Identificar o término de um jogo, indicando as 2 possíveissituações: (1) A ganhou, (2) B ganhou.(iv) Construir um tabuleiro que permita a representação dasjogadas tal como dado abaixo.

Barra de sabão

Jogada de A

Jogada de B

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 34: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 34

Requisito (iv): Representação das jogadas.

. x x

. x x

. x x

Matriz de caracteres

Coordenadas: 0 1 Coluna 0

Linha 0

Linha 1

Linha 2

Coluna 1 Coluna 2

00

Coordenadas: 1 01

Caractere ‘.’1

Requisito (ii): Se a jogada pode ser realizada.

if (m[i][j] == ‘.’)Pode fazer jogada

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 35: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 35

#include <stdio.h>main() {const int m = 4;

char A[m][m]; int i, j, lin, col, cont =0; const char O = ‘o’, X = ‘x’;printf(“Digite linha e coluna \n”);// Inicializando a matriz m com ‘.’.for (i=0; i < m; i++)

for (j=0; j < m; j++)A[i][j] = ‘.’;

while (1) // Laço infinito.{// Mostrando a matriz m.for (i=0; i < m; i++) {

for (j=0; j < m; j++) printf(“ %c ”, A[i][j]);

printf(“\n”);}

Problema 7 – Yucky Choccy Problema 7 – Yucky Choccy// Capturando nova jogada.if (cont%2 == 0) printf(“Jogada de A: ”);else printf(“Jogada de B: ”);scanf(“%d %d”,&lin,&col);// Casa livre ?if (A[lin][col] == ‘.’ &&(lin == 0||col == 0) ) {

// É a vez do jogador A.if (cont % 2 == 0) { // Verificando se A perdeu e B ganhou.

if (lin == 0 && col == 0){printf(“ B ganhou ! \n”); break;} }

else{ // Verificando se B perdeu e A ganhou.

if (lin == 0 && col == 0){printf(“ A ganhou ! \n”); break;} }

// Contado o n. de jogadas.cont++; // Modificar elementos da matriz A para ‘x’.

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 36: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 36

// Apenas os seguintes elementos serão // modificados: da linha de i até m e da // coluna de i até m. for (i=lin; i < m; i++)

for (j=col; j < m; j++)A[i][j] = ‘x’;

} // Fim if que verifica casa livre.} // Fim do while.

} // Fim main.

Problema 7 – Yucky Choccy (Cont.)

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 37: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 37

Figura 1 Tabela 1

G QAV Nafta

117.4 4.3 2.117.1 12.3 8.22.1 0.3 35.6

Solo

Tabela 2

G

Insumo Valor

4.12QAV 8.74Nafta 3.78

Problema 8: Um veículo submarino autônomo é utilizado para realizar o mapeamento do leito oceânico de uma certa área e a mesma é dividida nas sub-áreas, dada na Figura 1. Cada subárea pode fornecer uma quantidade de insumos (Tabela 1), e cada insumo tem um valor (Tabela 2). Construir um programa que calcula o lucro que pode ser obtido em cada sub-área.

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 38: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 38

Passo 1:

23

1 1 21 2 2

31 3 3

23

1 1 21 2 2

31 3 3

Passo 2: Se área = 1:

117.4 4.3 2.1

6.1 12.3 8.22.1 0.3 35.6

* 4.128.743.78

Indíce da linha: 0

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 39: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 39

#include <stdio.h>const int m = 3; const int n = 4;main() { int i, j, k;

float s, C[m][n], v[m] = {4.12, 8.74, 3.78};

int A[m][n] = {{1,1,2,2}, {1,2,3,2}, {1,3,3,3}};

float B[m][m] = {{117.4, 4.3, 2.1}, {6.1, 12.3, 8.2}, {2.1, 0.3, 35.6}};

// Varrendo a matriz A e de acordo// com o valor A[i][j], calcular o valor// com B*v e guardar em C[i][j].for (i=0; i < m; i++)

for (j=0; j < n; j++) { s = 0.0;

for (k=0; k < m; k++) s = s + B[A[i][j]-1][k]*v[k];

C[i][j] = s; }

Problema 8 – Petróleo // Mostrando a matriz C com os lucros.printf(“Matriz de lucros \n”);for (i=0; i < m; i++) {

for (j=0; j < n; j++) printf(“ [%17.2f] ”,C[i][j]);

printf(“\n”);

}

} // fim programa

Problema 8 – Petróleo

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 40: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 40

23

1 1 21 2 2

31 3 3

Resultado da Execução

16.1 Matrizes 16.1 Matrizes –– Problemas Resolvidos

Page 41: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Unesp – Campus de Guaratinguetá

17 17 -- StringsStrings

Curso de Programação ComputadoresProf. Aníbal Tavares

Profa. Cassilda RibeiroMinistrado por: Prof. André Amarante

Page 42: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 42

17.1 Strings 17.1 Strings -- Definições

A linguagem C apresenta algumas limitações no que diz respeito ao tratamento da string, pois diferentemente das outras linguagem, em C a string não é um tipo básico

Logo, em C não é possível atribuir uma string a uma variável ou concatenar uma string a outra utilizando os sinais de atribuição (=) e soma (+) como é possível nas outras linguagens

Definição: Na linguagem C uma string é um conjunto de caracteres armazenados num vetor.

Page 43: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 43

17.1 Strings 17.1 Strings -- Definições

Em C, as strings são representadas usando aspas, enquanto que os caracteres são representados entre aspas simples

Exemplos de strings Exemplos de caracteres“Luis Carlos” ‘L’“Pedro Henrique” ‘>’“Receita de Bolo de Chocolate ” ‘B’

Em C, declaração de strings obedece à sintaxe de declaração de vetores de caracteres.

Para marcar o fim da string , é colocado na ultima posição do vetor, um marcador de final de string

Page 44: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 44

Então, em C, strings são seqüências de caracteres adjacentes na memória. O caractere ‘\0’ (= valor inteiro zero) indica o fim da seqüência.

17.1 Strings 17.1 Strings -- Definições

OBS: No exemplo acima o caractere de fim de seqüência ‘\0’ocupa a primeira posição do vetor, porque ainda não foi atribuído nenhum caractere ao mesmo.

str: \00 12

aluno

Exemplo 1: char aluno[13];• define um string de nome “aluno” e reserva para ele um

espaço de 13 (12 + ‘\0’) bytes na memória.

Page 45: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 45

Exemplo 2: char nome[16] = “Pindamonhangaba”;

define uma string de nome “nome”, reserva para ele um espaço de memória de 16 (15 + ‘\0’) bytes e o inicia com o texto indicado

0 15P i n d a m o n h a n g a b a \0nome:

17.1 Strings 17.1 Strings -- Definições

Os caracteres podem ser individualmente acessados porindexação:

Exemplo 3: nome[0] = ‘P’; nome[10] = ‘n’

Page 46: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 46

A função printf pode ser utilizada para imprimir cada caractere da string s, ou verificando se n caracteres foram percorridos, ou verificando se o caractere ‘\0’ foi encontrado.

17.1 Strings 17.1 Strings –– Leitura e Impressão de Strings

#include <stdio.h>const int n = 100;main() { int i; char s[n] = “Uma string tipica.”;// Varrendo cada componente do

//vetor e imprimindo até que i < n.

for (i=0; i < 18; i++) printf(“%c”,s[i]);

}

Exemplo 4 – Usando n#include <stdio.h>const int n = 100;main() { int i; char s[n] = “Uma string tipica.”;// Varrendo cada componente do

// vetor e imprimindo até// que s[i] == ‘\0’.for (i=0; s[i] != ‘\0’; i++)

printf(“%c”,s[i]); }

Exemplo 5 – Usando ‘\0’

Page 47: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 47

17.1 Strings 17.1 Strings –– Entradas e Saídas de Strings

A função printf pode também utilizar a tag %s que éválida para imprimir strings. A função puts também pode ser utilizada para imprimir o conteúdo de strings.

#include <stdio.h>const int n = 100;main() { int i; char s[n] = “Uma string tipica.”;// Usando a tag %s e printf.printf(“%s”, s);

}

Exemplo 6 – Printf + %s

printf(“%s”,s);

#include <stdio.h>const int n = 100;main() { int i; char s[n] = “Uma string tipica.”;// Impressão usando puts.puts(s);

}

Exemplo 7 – Puts

puts(s);

Page 48: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 48

17.1 Strings 17.1 Strings –– Entradas e Saídas de Strings

A função scanf pode ser usada com a tag %s, mas se ela encontrar <TAB>, <ESPAÇO> ou <ENTER> a leitura seráinterrompida.

#include <stdio.h>const int n = 100;main() { int i; char s[n];printf(“Entre com uma string:”);scanf(“%s”,s);printf(“\n String digitada: %s”,s);

}

Exemplo 8 – Scanf

Palavra Digitada é:“a vida eh bela !”

Só armazenou:“a”

OBS: Na leitura das variáveis string com a função scanf não se utiliza o &

Page 49: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 49

17.1 Strings 17.1 Strings –– Entradas e Saídas de Strings

A função gets pode ser empregada sem se utilizar a tag%s e só ao encontrar <ENTER> a leitura da string seráinterrompida.

#include <stdio.h>const int n = 100;main() {

int i; char s[n];printf(“Entre com uma string:”);gets(s);printf(“\n String digitada: %s”,s);

}

Exemplo 9 – gets

Palavra Digitada:“a vida eh bela !”

Armazenou:“a vida eh bela !”

Page 50: 16 - Matrizes - UNESP: Câmpus de Guaratinguetá · PDF fileNa realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos

Vetores, Matrizes e Strings 50

Unesp-Campus de Guaratinguetá

FIM

Aula 16Referências dos slides

Curso de Programação de ComputadoresProf. Aníbal Tavares

Profa. Cassilda RibeiroProf. Décio MourãoProf. Galeno Sena

16 16 –– Matrizes e Matrizes e StringsStrings