Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Cruz_25869

Declaração de elementos de uma matríz

Recommended Posts

Olá,

 

Criei um programa para multiplicar matrizes quadradas e me deparei com o seguinte problema:

 

Como o programa roda em loop (até que a ordem da matriz seja igual a zero) eu preciso que os elementos da matriz C zerem em cada loop. Para isso tive que criar um "for" e zerar cada elemento, um por um. Gostaria de saber se tem um jeito mais prático de zerar um matriz todo (todos os seus elementos) sem ter que usar o "for" para isso. Aqui vai o código:

 

#include <stdio.h>

int main(void)
{
int a[100][100], b[100][100], c[100][100], i, j, k, n=1;

while (n!=0)
{
	scanf("%d", &n);
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			scanf("%d", &b[i][j]);
		}
	}
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			c[i][j] = 0;
		}
	}
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			for (k=0; k<n; k++)
			{
				c[i][j] = c[i][j] + a[i][k]*b[k][j];
			}
		}
	}
	printf("\n");
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			printf("%d ", c[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
return 0;
}	

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim.

 

Sugiro que mova a declaração da matriz que você atualmente percorre com fors aninhados para dentro do loop. Assim, você pode se aproveitar do fato de ser muito fácil inicializar vetores ou tipos agregados com determinados valores (no caso de tipos inteiros, 0). Ao invés de visitar cada elemento, você inicializa um novo objeto com {{0}}, o que faz com que todos os seus elementos tenham valor inicial 0. {{0}} é uma initializer list, que especifica o valor do primeiro elemento do primeiro vetor do vetor de vetores que representa sua matriz. Como C define que a inicialização a partir destas listas se aplica de forma recursiva, e que elementos cujos valores não foram especificados são inicializados como se o objeto em questão tivesse static storage duration, todos os demais elementos recebem 0 (já que o tipo dos elementos dos vetores que são elementos do vetor de vetores é int).

 

O programa a seguir realiza NTES testes, em que, para cada teste, uma 'linha' 'aleatória' de uma matriz TAM por TAM (TAM >= 100) tem seus primeiro, vigésimo-quinto, quinquagésimo e centésimo elementos exibidos, modificados e reexibidos. Note que a primeira exibição, antes da modificação dos elementos, sempre resulta em '0 0 0 0'.

 

// matriz_zeros.c
// Compilação: gcc -std=c99 -Wall -Wextra -pedantic -Werror matriz.c -o matriz

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

#define NTES 200
#define TAM  99

unsigned int uirndrng(unsigned int low, unsigned int high)
{
   static char randomized;

   if (randomized == 0)
   {
       srand(time(NULL));
       randomized = 1;
   }

   return low + rand() / (RAND_MAX / (high - low + 1) + 1);
}

int main(void)
{
   printf("\n\tExecutando %d testes pseudoaleatorios.\n", NTES);

   for (size_t i = 0; i < NTES; i++)
   {
size_t linha = uirndrng(0, 99);

int    matriz[TAM][TAM] = { { 0 } },
       *plinha          = matriz[linha];

printf("\n Teste %zu (linha %zu) - inicial:\n\t%d %d %d %d",
	i, linha,
	plinha[0], plinha[24], plinha[49], plinha[99]);

if (TAM < 100)
{
    exit(EXIT_FAILURE);
}

plinha[0]  = uirndrng(0, INT_MAX);
plinha[24] = uirndrng(0, INT_MAX);
plinha[49] = uirndrng(0, INT_MAX);
plinha[99] = uirndrng(0, INT_MAX);

printf("\n Teste %zu (linha %zu) - modificados:\n\t%d %d %d %d",
	i, linha,
	plinha[0], plinha[24], plinha[49], plinha[99]);

puts("\n\n----------- Pressione [enter] para o proximo teste.");
getchar();
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.