• Nenhum resultado encontrado

exercicioAula27Bgabarito

N/A
N/A
Protected

Academic year: 2021

Share "exercicioAula27Bgabarito"

Copied!
7
0
0

Texto

(1)

Exercícios sobre matrizes especiais e matrizes multidimensionais

1) MATRIZES MULTIDIMENSIONAIS

São matrizes mais complexas que as unidimensionais, pois necessitam de vários índices para serem manipuladas. A maneira de utilizarmos este tipo de matriz segue a mesma lógica das matrizes bidimensionais, diferenciando apenas no número de índices.

Na figura, temos uma matriz multidimensional de dimensões 4x4x4, cujo elemento representado pela cor amarela pode ser encontrado através do índice 2x2x4 (supondo indexação começando em 1).

Exemplo de uso de Matriz Multidimensional:

Exercício: Faça um programa que armazene numa matriz as seguintes informações:  a primeira dimensão armazena o código dos produtos vendidos (suponha 5 produtos);  a segunda dimensão armazena o dia da venda (suponha 2 dias);

 a terceira dimensão armazena o código da loja em que foi feita a venda (suponha 2 lojas)

 a intersecção das 3 dimensões armazena o valor recebido pela venda de um determinado produto numa determinada loja num determinado dia.

Ao final, mostre:

- todos os valores armazenados na matriz.

- o valor recebido pela venda de certo produto em certa data em certa loja (estes parâmetros são informados pelo usuário.

Faça o programa usando inicialmente alocação estática e depois o resolva novamente, usando alocação dinâmica.

(2)

Solução 1: arquivo único com alocação estática #include <stdio.h>

#include <stdlib.h> main(){

int vendas[5][2][2]; int prod, dia, loja; int p,d,l;

for (prod=0;prod<5;prod++) for (dia=0;dia<2; dia++) for (loja=0; loja<2; loja++) {

printf ("\nDigite o valor da venda do prod %d no dia %d na loja %d ", prod, dia, loja); scanf ("%d", &vendas[prod][dia][loja]);

}

for (prod=0;prod<5;prod++) for (dia=0;dia<2; dia++) for (loja=0; loja<2; loja++)

printf ("\nO valor da venda do prod %d no dia %d na loja %d eh %d", prod, dia, loja, vendas[prod][dia][loja]);

printf ("\n\n\nInforme o codigo do produto a buscar: "); scanf ("%d", &p);

printf ("\nInforme a loja a buscar: "); scanf ("%d", &l);

printf ("\nInforme o dia a buscar: "); scanf ("%d", &d);

printf ("\nO valor da venda do prod %d no dia %d na loja %d eh %d\n", p, d, l, vendas[p][d][l]); system("pause");

}

Solução 2: arquivo único com alocação dinâmica #include <stdio.h>

#include <stdlib.h> main(){

int ***vendas;

int prod=2, dia=2, loja=1; int p,d,l;

int i,j;

vendas=(int***)malloc(prod*sizeof(int**)); //aloca um vetor de m ponteiros

for (i=0; i<prod;i++) //prod linhas

vendas[i]=(int**)malloc(dia*sizeof(int*)); //aloca vetor (dias vetores)

for (i=0; i<prod;i++) //m linhas for (j=0; j<dia;j++) //m linhas

vendas[i][j]=(int*)malloc(loja*sizeof(int)); //aloca vetor (m vetores)

for (prod=0;prod<2;prod++) for (dia=0;dia<2; dia++) for (loja=0; loja<1; loja++) {

printf ("\nDigite o valor da venda do prod %d no dia %d na loja %d ", prod, dia, loja); scanf ("%d", &vendas[prod][dia][loja]);

}

for (prod=0;prod<2;prod++) for (dia=0;dia<2; dia++) for (loja=0; loja<1; loja++)

(3)

printf ("\nO valor da venda do prod %d no dia %d na loja %d eh %d", prod, dia, loja, vendas[prod][dia][loja]);

printf ("\n\n\nInforme o codigo do produto a buscar: "); scanf ("%d", &p);

printf ("\nInforme a loja a buscar: "); scanf ("%d", &l);

printf ("\nInforme o dia a buscar: "); scanf ("%d", &d);

printf ("\nO valor da venda do prod %d no dia %d na loja %d eh %d\n", p, d, l, vendas[p][d][l]); system("pause");

}

Solução 3: vários arquivos com alocação dinâmica multidimensional.h

int*** aloca_matriz (int prod, int dia, int loja);

void preenche_matriz (int prod, int dia, int loja, int*** vendas); void mostra_matriz (int prod, int dia, int loja, int*** vendas); int busca_vendas (int*** vendas);

multidimensional.cpp #include <stdio.h> #include <stdlib.h>

#include "multidimensionais.h"

int*** aloca_matriz (int prod, int dia, int loja) {

int i,j;

int*** vendas=(int***)malloc(prod*sizeof(int**)); //aloca um vetor de m ponteiros for (i=0; i<prod;i++) //prod linhas

vendas[i]=(int**)malloc(dia*sizeof(int*)); //aloca vetor (dias vetores) for (i=0; i<prod;i++) //m linhas

for (j=0; j<dia;j++) //m linhas

vendas[i][j]=(int*)malloc(loja*sizeof(int)); //aloca vetor (m vetores) return (vendas);

}

void preenche_matriz (int prod, int dia, int loja, int*** vendas) { int i, j, k; for (i=0;i<prod;i++) for (j=0;j<dia;j++) for (k=0;k<loja;k++) {

printf ("\nDigite o valor da venda do prod %d no dia %d na loja %d ", i, j, k); scanf ("%d", &vendas[i][j][k]);

} }

void mostra_matriz (int prod, int dia, int loja, int*** vendas) {

int i, j, k;

for (i=0;i<prod;i++) for (j=0;j<dia;j++) for (k=0;k<loja;k++)

printf ("\nO valor da venda do prod %d no dia %d na loja %d eh %d", i, j, k, vendas[i][j][k]);

(4)

}

int busca_vendas (int*** vendas) {

int p, l,d;

printf ("\n\n\nInforme o codigo do produto a buscar: "); scanf ("%d", &p);

printf ("\nInforme a loja a buscar: "); scanf ("%d", &l);

printf ("\nInforme o dia a buscar: "); scanf ("%d", &d); return vendas[p][d][l]; } main.cpp #include <stdio.h> #include <stdlib.h> #include "multidimensionais.h" main() { int*** vendas; int prod, dia, loja; int p,d,l;

int i,j;

printf ("\nInforme numero de produtos: "); scanf ("%d", &prod);

printf ("\nInforme numero de dias: "); scanf ("%d", &dia);

printf ("\nInforme numero de lojas: "); scanf ("%d", &loja);

vendas = aloca_matriz(prod, dia, loja); preenche_matriz(prod, dia, loja, vendas); mostra_matriz(prod, dia, loja, vendas);

int total = busca_vendas (vendas);

printf ("\nO valor da venda eh %d\n", total);

system("pause"); }

2) MATRIZES TRIANGULARES

Na matemática, uma matriz é triangular quando os elementos acima ou abaixo da diagonal principal são zero. Mais especificamente:

uma matriz triangular superior é aquela em que os elementos abaixo da diagonal são zero: uma matriz triangular inferior é aquela em que os elementos acima da diagonal são zero: Exemplo de matriz triangular inferior:

(5)

Exemplo de matriz triangular inferior:

Neste caso, pode-se usar um vetor para armazenar os valores significativos. Para isso, precisamos de uma função de mapeamento para posicionar os valores significativos da matriz triangular no vetor.

Exemplo de função de mapeamento:

Para uma Matriz Triangular Inferior (como a do exemplo acima) temos a função: M[I,J] = VET [ (J + 1 + ((I+1) * I) / 2 ) - 1]

Onde:

I = índice que representa a coordenada linha na matriz triangular M; J = índice que representa a coordenada coluna na matriz triangular M; e VET = vetor que armazena os dados significativos da matriz triangular M. Após aplicarmos a função de mapeamento, teremos:

i j M[I,J] = VET [ (J + 1 + ((I+1) * I) / 2 ) - 1]

0 0 0 0 1 1 0 2 2 0 3 3 1 0 1 1 1 2 1 2 3 1 3 4 2 0 3 2 1 4 2 2 5 2 3 6 3 0 6 3 1 7 3 2 8 3 3 9

Faça um programa em C que armazene uma matriz triangular inferior em um vetor, conforme descrito acima. Faça as funções:

(6)

int* aloca_matriz (int tamanho);//na verdade aloca somente o vetor para armazenar os valores não nulos void preenche_matriz (int i, int j, int* vet); //na verdade preenche soh os valores no vetor, q são os não nulos void mostra_matriz (int m, int n, int* vet); //mostra a matriz completa, nulos e não nulos. Se for um valor não nulo (i>=j), mostre o valor q estah no vetor; caso contrario, mostra 0

No main, teste as seguintes funcionalidades: - alocação da matriz

- preenchimento da matriz - impressão da matriz

OBS: o programa pode perguntar ao usuário o valor do tamanho do vetor a ser alocado

multidimensionais.h

int* aloca_matriz (int tamanho);

void preenche_matriz (int i, int j, int* vet); void mostra_matriz (int m, int n, int* vet); multidimensionais.cpp

#include <stdio.h> #include <stdlib.h>

#include "multidimensionais.h" int* aloca_matriz (int m) {

int i; int* mat;

mat=(int*)malloc(m*sizeof(int)); //aloca vetor (dias vetores) return (mat);

}

void preenche_matriz (int m, int n, int* vet) {

int i, j, k;

for (i=0;i<m;i++) for (j=0;j<n;j++) {

if (i>=j)//valores nao nulos {

printf ("\nDigite o valor [%d][%d]: ", i, j); k = (j + 1 + ((i+1) * i) / 2 ) - 1;

printf ("Serah inserido na posicao %d\n", k); scanf ("%d", &vet[k]);

} } }

void mostra_matriz (int m, int n, int* vet) {

int i, j,k;

for (i=0;i<m;i++) for (j=0;j<n;j++) {

if (i>=j)//valores nao nulos {

k = (j + 1 + ((i+1) * i) / 2 ) - 1;

(7)

} else

printf ("\nValor [%d][%d] = %d", i,j, 0); } } main.cpp #include <stdio.h> #include <stdlib.h> #include "multidimensionais.h" main() { int* vet; int i, j; int p,d;

printf ("\nInforme numero linhas: "); scanf ("%d", &i);

printf ("\nInforme numero de colunas: "); scanf ("%d", &j);

int tamanho;

printf ("\nInforme o tamanho do vetor: "); scanf ("%d", &tamanho); vet = aloca_matriz(tamanho); preenche_matriz(i,j,vet); mostra_matriz(i,j,vet); system("pause"); }

Referências

Documentos relacionados

Potencial = Todos os produtos de mesma CT4 trabalhados pelo ABRADIMEX no canal durante o MATNOV 19;

Composição específica da ictiofauna na Gamboa do Perequê nos meses amostrados, com as freqüências absolutas observadas em número de exemplares (Obs), porcentagens

· Indicações sobre cuidados médicos urgentes e tratamentos especiais necessários Não existe mais nenhuma informação relevante disponível.. 5 Medidas de combate

Resultados: Os subtipos mais comuns de TBEB, classificados pelas características na broncoscopia, foram tumoral e granular (em 22,2% para ambas) A baciloscopia de escarro

O luxuoso Contur design da DORMA abriga a avançada tecnologia eletromagnética do operador CS 80 MAGNEO para portas deslizantes, que opera com baixo consumo de energia..

Parece assim que os cardiologistas portugueses têm uma percec¸ão globalmente adequada da utilidade clínica da angio-TC, identificando os doentes que mais beneficiam da

estação de referência coletando dados, enquanto um outro percorre as estações de interesse, onde permanece parado entre 5 a 20 min para coletar dados. Método

78 Figura 3.27 Padrão de difração de pós obtido para o complexo ácido nalidíxico:Zn através (a) de síntese por solução, em comparação com os difractogramas