thinkabout Posted April 6, 2013 at 03:24 PM Report #501961 Posted April 6, 2013 at 03:24 PM (edited) Boas Pessoal, Sei correr a matriz na horizontal e na vertical, contudo tenho que correr a matriz em "quadrados", não estou a ver como. Agradeço ideias. #include <stdio.h> #define M 8 /* 19. Pretende-se reduzir uma imagem a metade do seu tamanho original. A imagem inicial consiste num array bidimensional com M×M valores inteiros onde cada pixel (ponto na imagem) pode tomar um valor inteiro entre 0 e 9 (tonalidades de cinza). A imagem reduzida é armazenada num array bidimensional com M/2×M/2 valores reais onde cada elemento (pixel) corresponde á média dos 4 elementos que substitui. Para melhor compreensão do enunciado veja o exemplo apresentado de seguida (neste caso, para M=8): Imagem original 0 4 9 3 6 7 2 9 9 4 7 8 3 4 7 2 5 1 2 6 3 8 6 2 7 1 4 8 7 2 0 7 4 9 3 5 2 1 5 7 5 3 4 7 8 9 1 0 2 3 5 6 7 9 2 4 2 3 4 5 6 7 8 9 Imagem reduzida 4.3 6.8 5.0 5.0 3.5 5.0 5.0 3.8 5.3 4.8 5.0 3.3 2.5 5.0 7.3 5.8 Escreva uma função em C que efectue esta operação. A função recebe 3 argumentos: endereço do primeiro elemento da matriz original, endereço do primeiro elemento da matriz reduzida e o valor M */ void calculamedia(int *matriz, float *matrizmedia, int m) { for (i = 0; i < M; i++) { } } int main() { int matriz[M][M] = {{0, 4, 9, 3, 6, 7, 2, 9}, {9, 4, 7, 8, 3, 4, 7, 2}, {5, 1, 2, 6, 3, 8, 6, 2}, {7, 1, 4, 8, 7, 2, 0, 7}, {4, 9, 3, 5, 2, 1, 5, 7}, {5, 3, 4, 7, 8, 9, 1, 0}, {2, 3, 5, 6, 7, 9, 2, 4}, {2, 3, 4, 5, 6, 7, 8, 9}}; float matrizmedia[M/2][M/2] = {0.0}; calculamedia(matriz[0], matrizmedia[0], M); // Falta função para impressão da matriz. return 0; } Edited April 6, 2013 at 03:29 PM by thinkabout
HappyHippyHippo Posted April 6, 2013 at 03:29 PM Report #501963 Posted April 6, 2013 at 03:29 PM void calculamedia(int *matriz, double *matrizmedia, int m) // <--- double { int i, j; int sum; for (i = 0; i < m; i += 2) { for (j = 0; j < m; j += 2) { sum = /* matriz[i][j] */ sum += /* matriz[i][j+1] */ sum += /* matriz[i+1][j] */ sum += /* matriz[i+1][j+1] */ /* matrizmedia[i][j] = (double)sum / 4; */ } } } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
thinkabout Posted April 6, 2013 at 07:53 PM Author Report #501997 Posted April 6, 2013 at 07:53 PM (edited) 😉 Se existir forma de simplificar agradeço ideias 🙂 . void calculamedia(int *matriz, double *matrizmedia, int tamanho) { int i, j,z=0,y=0; int sum; // Imprimir a matriz original printf("\n Matriz Original \n"); for (i = 0; i < m*8; i ++) { printf(" %d" , *(matriz+i)); z++; if (z==tamanho) { puts(""); z=0; } } puts(""); // Faz a soma dos numeros depois a devisão para calcular media e insere na matrizmedia for (i = 0; i < tamanho*tamanho; i += tamanho*2) { for (j = 0; j < tamanho; j += 2) { sum = *(matriz + i + j); /* matriz[i][j] -> 0 */ printf("Estou a comecar no indice %d %d",i,j); // Debug sum += *(matriz + i+1 + j); /* matriz[i+1][j] -> 4 */ sum += *(matriz + i + j+tamanho); /* matriz[i][j+1] -> 9 */ sum += *(matriz + i+1 + j+tamanho); /* matriz[i+1][j+1] -> 4 */ printf(" ---- O valor total da e soma %d \n", sum); // Debug // Passar os valores para a matrizmedia *(matrizmedia + y) = (double)sum / 4; y++; } } // Imprimir a matriz reduzida printf("\n Matriz Reduzida \n"); for (i = 0; i < m*2; i++) { printf(" %.1lf" , *(matrizmedia+i)); z++; if (z==tamanho/2) { puts(""); z=0; } } } Edited April 6, 2013 at 07:56 PM by thinkabout
HappyHippyHippo Posted April 7, 2013 at 08:04 AM Report #502009 Posted April 7, 2013 at 08:04 AM vi agora que tinha os índices errados na atribuição à matriz reduzida 😄 ao menos viste isso e corrigiste 😉 simplificar ? simples : mete a impressão da matriz numa função e tira da função redução isso não é passo para ser feito dentro da função redução IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now