Post on 06-Feb-2018
Unesp – Campus de Guaratinguetá
16 16 -- MatrizesMatrizes
Curso de Programação ComputadoresProf. Aníbal Tavares
Profa. Cassilda RibeiroMinistrado por: Prof. André Amarante
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
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
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.
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]
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
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.
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
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]
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]
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]
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
Unesp – Campus de Guaratinguetá
17 17 -- StringsStrings
Curso de Programação ComputadoresProf. Aníbal Tavares
Profa. Cassilda RibeiroMinistrado por: Prof. André Amarante
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.
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
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.
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’
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’
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);
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 &
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 !”
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