Matriz nxn

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
oriolrama
Mensajes: 6
Registrado: 28/07/2019 4:10 am

Matriz nxn

#1 Mensaje por oriolrama » 28/07/2019 4:15 am

Hola, soy nuevo en este foro!

Tengo una duda acerca la declaración de una matriz nxn.
Quiero que el usuario inserte coeficiente a coeficiente una matriz que, anteriormente, se ha escogido su tamaño n. Pero a la hora de escribir todos los elementos de la matriz solo me aparecen los últimos 3 coeficientes escritos en columna.
El cógido es el siguiente:

Código: Seleccionar todo

int main (void){
	
	//Variables:
	int i, j, k, n; //n és el tamany de la variable
	float a[n][n], b[n][n];
	
	
	//Declarar tamany de les matrius quadrades A i B (iguals):
	
	printf ("Escrigui el tamany de les matrius quadrades:\n ");
	scanf ("%d", &n);
	printf ("\nLes matrius tindran tamany %d", n);
	
	//Declarar coeficients de les matrius:
	
			//Matriu A: 
			
	printf ("\n\nEscrigui els coeficients de la matriu A:\n");
	
	for (i=0; i<n; i++){
		for (j=0; j<n; j++){
			a[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i, j);
			scanf ("%f", &a[i][j]);
		}
			
	}
	
	printf ("\n\nLa matriu A es:\n\n");
	for (i=0; i<n; i++){
		for (j=0; j<n; j++){
			printf ("%.3f\t", a[i][j]);
		}
		printf ("\n");
	}
	return 0;
}
Me podeis decir donde esta el error¿?

Muchas gracias!
Última edición por mollok el 28/07/2019 8:19 am, editado 1 vez en total.
Razón: Los códigos deben ir entre etiquetas 'code', botón </>

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Matriz nxn

#2 Mensaje por mollok » 28/07/2019 8:31 am

Código: Seleccionar todo

//Variables:
int i, j, k, n; //n és el tamany de la variable
float a[n][n], b[n][n];
	
//Declarar tamany de les matrius quadrades A i B (iguals):	
printf ("Escrigui el tamany de les matrius quadrades:\n ");
scanf ("%d", &n);
printf ("\nLes matrius tindran tamany %d", n);
Aquí tienes un primer problema: dimensionas las matrices antes de conocer el tamaño de n. En el momento que lo haces aloja un número desconocido así que tus matrices pueden ser de cualquier cosa.

Código: Seleccionar todo

for (i=0; i<n; i++){
	for (j=0; j<n; j++){
		a[i][j]=0;
		printf ("Digiti la posicio (%d, %d):\t", i, j);
		scanf ("%f", &a[i][j]);
	}		
}
Llevar el coeficiente a 0 antes de conseguir su valor es perder ciclos de máquina ya que después lo vas a machacar con el valor de obtenido de scanf.

Pero haciendo la prueba de recolocar la declaración de la matriz el programa funciona correctamente.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

dehm
Mensajes: 300
Registrado: 29/04/2011 7:31 am

Re: Matriz nxn

#3 Mensaje por dehm » 29/07/2019 2:10 am

Por matizar un poco la respuesta de @mollok, aunque se le hubiera asignado primero un valor a n, tampoco sería correcto declarar el array de esa forma.

Esa forma de construir un array se llama VLA (Variable length array) y sólo fue válida en el estándar C99. Todavía hay discusiones sobre si es o no apropiado permitir esta forma de crearlos, pero parece que tiene más inconvenientes que ventajas

Si no conoces previamente el tamaño del array, tendrás crearlo de forma dinámica.
Aprendiendo

oriolrama
Mensajes: 6
Registrado: 28/07/2019 4:10 am

Re: Matriz nxn

#4 Mensaje por oriolrama » 04/08/2019 1:12 am

Hola! Muchas gracias, ya veo el error. Poco a poco aprendiendo!
Tengo otra duda, estoy trabajando haciendo el producto de matrices nxm por pxk, donde m=p para poder hacer el producto (files iguales a columnas). Pero en el primer for, donde pido al usuario que digite la posición (1,1) de la matriz el programa me finaliza y se cierra.
No se porque me pasa. Este es el código:

Código: Seleccionar todo

#include<stdio.h>
#include<stlib.h>
int main (void){
	eti:
	int n=0, m=0, l=0, k=0; 
	int i, j, z; 
	
	//El tamany de la matriu A es nxm i el tamany de la matriu B es mxk.  A= n files, m columnes. B=l files, k columnes.
	//Demanem al usuari que digiti el tamany de les matrius:
	printf ("\nDigiti el nombre de files de la matriu A:\n");
	scanf ("%d", &n);
	printf ("\nDigiti el nombre de columnes de la matriu A:\n");
	scanf ("%d", &m);
	printf ("\nDigiti el nombre de files de la matriu B:\n");
	scanf ("%d", &l);

	if (l==m){
		printf ("\nEl producte es pot realitzar (mateixes files que columnes)\n");
	} 
	else {
		printf ("No es pot realitzar el propucte degut a que la matriu B no te el mateix nombre de columnes que la matriu A.\n");
		
		goto eti;
	}
	
	printf ("\nDigiti el nombre de columnes de la matriu B:\n");
	scanf ("%d", &k);
	
	//MATRIU 
	float a[n][m], b[l][k];
	//Matriu A:
	printf ("La matriu A te tamany %dx%d\n\n", n, m);
	printf ("Digiti els coeficients de la matriu A:\n");
	
	for (i=1; i<=n; i++){
		for (j=1; j<=m; j++){
			printf ("Escrigui el coeficient de la posicio (%d, %d):\t", i, j);
			scanf ("%f", a[i][j]);
		}
	}
	
	
	
	

	return 0;
} [\code]

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Matriz nxn

#5 Mensaje por mollok » 04/08/2019 9:29 am

Código: Seleccionar todo

for (i=1; i<=n; i++){
	for (j=1; j<=m; j++){
Cuidado con esto: los índices de los arrays empiezan por 0 y terminan en su tamaño-1, en tu caso sería:

Código: Seleccionar todo

for (i=0; i<n; i++){
	for (j=0; j<m; j++){ 
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

oriolrama
Mensajes: 6
Registrado: 28/07/2019 4:10 am

Re: Matriz nxn

#6 Mensaje por oriolrama » 14/08/2019 10:16 am

mollok escribió:
04/08/2019 9:29 am

Código: Seleccionar todo

for (i=1; i<=n; i++){
	for (j=1; j<=m; j++){
Cuidado con esto: los índices de los arrays empiezan por 0 y terminan en su tamaño-1, en tu caso sería:

Código: Seleccionar todo

for (i=0; i<n; i++){
	for (j=0; j<m; j++){ 
Hola!
Si, lo sé.
Pero lo he hecho así para seguir las "coordenadas" de las matrices para cada coeficiente, es decir, posición fila 1 columna 1 (1,1), posición fila 1 columna 2 (1,2)... Una matriz no tiene posición (0,0) ni (0,1)...
Pero, en el lenguaje hay algun problema formal o lógico que esté mal empezar por 1 y acabar en n?

Muchas gracias!

oriolrama
Mensajes: 6
Registrado: 28/07/2019 4:10 am

Re: Matriz nxn

#7 Mensaje por oriolrama » 14/08/2019 10:22 am

Hola de nuevo!
Quería hacer otro programa que me multiplicara matrices de diferente tamaño, el usuario debe triar cuantas filas y columnas tiene cada matriz, sólo hay dos: A y B. A pertenece a nxm sobre R y B pertenece a lxk sobre R.
En el caso que B no tenga las mismas filas que columnas de A el programa se reinicia (m=l). El programa almacena correctamente cada coeficiente.
El problema es que no se me multiplican bien, aqui esta la parte del codigo:
Me parece que no utilizo bien las filas o columnas;

Código: Seleccionar todo

for (i=1; i<=n; i++){
			for (j=1; j<=m; j++){
				for (z=1; z<=m; z++){
							p[i][j]=0;
							p[i][j]+=a[i][k]*b[k][j];
						}
						printf ("%.3f\t", p[i][j]);
					}
					printf ("\n");
		} 
Muchas gracias!

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Matriz nxn

#8 Mensaje por mollok » 15/08/2019 10:03 am

Como sabrás un array es muy parecido a un puntero, los dos devuelven una dirección de memoria.

Para moverse dentro de estos objetos se usa una base, la dirección, y un offset, los números que comentamos.

Existen dos notaciones para ello: notación de array y notación de puntero.

La notación de puntero es del tipo:
puntero + offset => devuelve la dirección
*(puntero + offset) => devuelve el contenido

La notación de array es del tipo:
array[offset] => devuelve el contenido
&array[offset] => devuelve la dirección

La dirección de inicio en ambos es puntero y array respectivamente por tanto la dirección de su primer elemento es indicada por el nombre mismo. Y como X+0 = X el primero elemento...
... en notación puntero es: puntero+0 o simplemente puntero
... en notación array es: array[0]

Cómo el primer elemento está en offset 0 el último estará en n-1, siendo n la cantidad de elementos alojados.

Si alguna vez debes escribir el índice matemático suma 1 cuando escribas la salida. Por ejemplo:

Código: Seleccionar todo

for(int i=0; i<n_elem; ++i)
   printf("%d: %d\n", i+1, array[i]);
Aunque si te va mejor puedes usar:

Código: Seleccionar todo

for(int i=1; i<=n_elem; ++i)
   printf("%d: %d\n", i, array[i-1]);
Pero deberías acostumbrarte a hacerlo como en el primer ejemplo.

Un código de producto entre dos matrices podría ser:

Código: Seleccionar todo

#include <stdio.h>

int main() {
    int A[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    int B[3][2] = {
        {5, -1},
        {1, 0},
        {-2, 3}
    };

    int C[2][2] = {{0, 0}};

    /*
    11*11 + 12*21 + 13*31    11*12 + 12*22 + 13*32
    21*11 + 22*21 + 23*31    21*12 + 22*22 + 23*32
    i -> j -> k
    i => número de filas
    j => número de columnas
    k => común (columnas de A | filas de B)
                    j                        j+1
            k      k+1     k+1        k      k+1     k+2
    i     ik*kj + ik*kj + ik*kj     ik*kj + ik*kj + ik*kj
    i+1   ik*kj + ik*kj + ik*kj     ik*kj + ik*kj + ik*kj
    */

    for(int i=0; i<2; ++i) {
        for(int j=0; j<2; ++j) {
            for(int k=0; k<3; ++k) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    for(int i=0; i<2; ++i) {
        for(int j=0; j<2; ++j) {
            printf("%2d ", C[i][j]);
        }
        puts("");
    }
}
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

oriolrama
Mensajes: 6
Registrado: 28/07/2019 4:10 am

Re: Matriz nxn

#9 Mensaje por oriolrama » 17/08/2019 8:16 am

Hola de nuevo!
En mi código para multiplicar matrices nxm por mxl cuando le pido al programa que me muestre el resultado del producto me sale todo ceros. Me podeis ayudar?

Código: Seleccionar todo

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

int main (void){
	
	eti:
		
	int n=0, m=0, l=0; //n nombre de files matriu A. m nombre de columnes de la matriu A, a més, nombre de files de la matriu B. l es el nombre de columnes B.
	
	printf ("Digiti el nombre de files de la matriu A:\n");
	scanf ("%d", &n);
	printf ("\nDigiti el nombre de columnes de la matriu A (tambe nombre de files de la matriu B):\n");
	scanf ("%d", &m);
	printf ("\nDigiti el nombre de columnes de la matriu B:\n");
	scanf ("%d", &l);
	
	float a[n][m], b[m][l];
	int i, j, k;
	
	//MATRIU A:
	printf ("\n\nDigiti els coeficients de la matriu A:\n\n");
	
	for (i=0; i<n; i++){
		for (j=0; j<m; j++){
			a[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i+1, j+1);
			scanf ("%f", &a[i][j]);
		}
	}
	//Ens mostra la matriu digitada
	for (i=0; i<n; i++){
		for (j=0; j<m; j++){
			printf ("%.3f\t", a[i][j]);
		}
		printf ("\n");
	}
	
	//MATRIU B
	printf ("\n\nDigiti els coeficients de la matriu B:\n\n");
	
	for (i=0; i<m; i++){
		for (j=0; j<l; j++){
			b[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i+1, j+1);
			scanf ("%f", &b[i][j]);
		}
	}
	//Ens mostra la matriu digitada
	for (i=0; i<m; i++){
		for (j=0; j<l; j++){
			printf ("%.3f\t", b[i][j]);
		}
		printf ("\n");
	}
	
	printf ("\n\n-------------------------------------------------------------------------------------------\n\n");
	//Producte de les matrius
	
	float p[n][l];
	
	for (i=0; i<m; i++){
		for (j=0; j<m; j++){
			for (k=0; k<l; k++){
				p[i][j]=0;
				p[i][j]+=a[i][k]*b[k][l];
			}
		}
	}
	for (i=0; i<n; i++){
		for (j=0; j<l; j++){
			printf ("%.3f\t", p[i][j]);
		}
		printf ("\n");
	}
	
	
	
	
	//Preguntem al usuari si vol tornar al inici
	
	int opc=0;;
	
	printf ("\nSi desitja tornar al inici pulsi 1.\nSi desitja sortir del programa pulsi qualsevol altre tecla.\n\n");
	scanf ("%d", &opc);
	
	switch (opc){
		case 1: goto eti;
				break; 
		default: system ("CLS");
				 break; 
	}
	
	
	
	
	system ("PAUSE");
	return 0;
}
[\code]

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Matriz nxn

#10 Mensaje por mollok » 17/08/2019 8:42 am

Tu código con las correcciones necesarias para que funcione:

Código: Seleccionar todo

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

int main (void){

	//eti:

	int n=0, m=0, l=0; //n nombre de files matriu A. m nombre de columnes de la matriu A, a més, nombre de files de la matriu B. l es el nombre de columnes B.

	printf ("Digiti el nombre de files de la matriu A:\n");
	scanf ("%d", &n);
	printf ("\nDigiti el nombre de columnes de la matriu A (tambe nombre de files de la matriu B):\n");
	scanf ("%d", &m);
	printf ("\nDigiti el nombre de columnes de la matriu B:\n");
	scanf ("%d", &l);

	float a[n][m], b[m][l];
	int i, j, k;

	//MATRIU A:
	printf ("\n\nDigiti els coeficients de la matriu A:\n\n");

	for (i=0; i<n; i++){
		for (j=0; j<m; j++){
			a[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i+1, j+1);
			scanf ("%f", &a[i][j]);
		}
	}
	//Ens mostra la matriu digitada
	for (i=0; i<n; i++){
		for (j=0; j<m; j++){
			printf ("%.3f\t", a[i][j]);
		}
		printf ("\n");
	}

	//MATRIU B
	printf ("\n\nDigiti els coeficients de la matriu B:\n\n");

	for (i=0; i<m; i++){
		for (j=0; j<l; j++){
			b[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i+1, j+1);
			scanf ("%f", &b[i][j]);
		}
	}
	//Ens mostra la matriu digitada
	for (i=0; i<m; i++){
		for (j=0; j<l; j++){
			printf ("%.3f\t", b[i][j]);
		}
		printf ("\n");
	}

	printf ("\n\n-------------------------------------------------------------------------------------------\n\n");
	//Producte de les matrius

	float p[n][l];
    
	for (i=0; i<n; i++){ // original j<m
		for (j=0; j<l; j++){ // original j<m
            p[i][j]=0;
			for (k=0; k<m; k++){ // original k<l
				// p[i][j]=0; // esta instrucción debe estar dos líneas más atrás, tal y como te la he dejado
				p[i][j]+=a[i][k]*b[k][j]; // original b[k][l]
			}
		}
	}
	for (i=0; i<n; i++){
		for (j=0; j<l; j++){
			printf ("%.3f\t", p[i][j]);
		}
		printf ("\n");
	}




	// Esto no puede funcionar nunca porque redefines muchas variables
	//Preguntem al usuari si vol tornar al inici

//	int opc=0;;
//
//	printf ("\nSi desitja tornar al inici pulsi 1.\nSi desitja sortir del programa pulsi qualsevol altre tecla.\n\n");
//	scanf ("%d", &opc);
//
//	switch (opc){
//		case 1: goto eti;
//				break;
//		default: system ("CLS");
//				 break;
//	}




	system ("PAUSE");
	return 0;
}
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

oriolrama
Mensajes: 6
Registrado: 28/07/2019 4:10 am

Re: Matriz nxn

#11 Mensaje por oriolrama » 18/08/2019 8:12 am

mollok escribió:
17/08/2019 8:42 am
Tu código con las correcciones necesarias para que funcione:

Código: Seleccionar todo

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

int main (void){

	//eti:

	int n=0, m=0, l=0; //n nombre de files matriu A. m nombre de columnes de la matriu A, a més, nombre de files de la matriu B. l es el nombre de columnes B.

	printf ("Digiti el nombre de files de la matriu A:\n");
	scanf ("%d", &n);
	printf ("\nDigiti el nombre de columnes de la matriu A (tambe nombre de files de la matriu B):\n");
	scanf ("%d", &m);
	printf ("\nDigiti el nombre de columnes de la matriu B:\n");
	scanf ("%d", &l);

	float a[n][m], b[m][l];
	int i, j, k;

	//MATRIU A:
	printf ("\n\nDigiti els coeficients de la matriu A:\n\n");

	for (i=0; i<n; i++){
		for (j=0; j<m; j++){
			a[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i+1, j+1);
			scanf ("%f", &a[i][j]);
		}
	}
	//Ens mostra la matriu digitada
	for (i=0; i<n; i++){
		for (j=0; j<m; j++){
			printf ("%.3f\t", a[i][j]);
		}
		printf ("\n");
	}

	//MATRIU B
	printf ("\n\nDigiti els coeficients de la matriu B:\n\n");

	for (i=0; i<m; i++){
		for (j=0; j<l; j++){
			b[i][j]=0;
			printf ("Digiti la posicio (%d, %d):\t", i+1, j+1);
			scanf ("%f", &b[i][j]);
		}
	}
	//Ens mostra la matriu digitada
	for (i=0; i<m; i++){
		for (j=0; j<l; j++){
			printf ("%.3f\t", b[i][j]);
		}
		printf ("\n");
	}

	printf ("\n\n-------------------------------------------------------------------------------------------\n\n");
	//Producte de les matrius

	float p[n][l];
    
	for (i=0; i<n; i++){ // original j<m
		for (j=0; j<l; j++){ // original j<m
            p[i][j]=0;
			for (k=0; k<m; k++){ // original k<l
				// p[i][j]=0; // esta instrucción debe estar dos líneas más atrás, tal y como te la he dejado
				p[i][j]+=a[i][k]*b[k][j]; // original b[k][l]
			}
		}
	}
	for (i=0; i<n; i++){
		for (j=0; j<l; j++){
			printf ("%.3f\t", p[i][j]);
		}
		printf ("\n");
	}




	// Esto no puede funcionar nunca porque redefines muchas variables
	//Preguntem al usuari si vol tornar al inici

//	int opc=0;;
//
//	printf ("\nSi desitja tornar al inici pulsi 1.\nSi desitja sortir del programa pulsi qualsevol altre tecla.\n\n");
//	scanf ("%d", &opc);
//
//	switch (opc){
//		case 1: goto eti;
//				break;
//		default: system ("CLS");
//				 break;
//	}




	system ("PAUSE");
	return 0;
}
Hola! Muchas gracias, han sido errores "tontos" pero me ha servido para aprender. Muchas gracias de nuevo, por cierto, no entiendo cuando me dices que redefino muchas variables, que me quieres decir?

Gracias!

mollok
Mensajes: 492
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Matriz nxn

#12 Mensaje por mollok » 19/08/2019 7:02 am

A principio del programa tienes una etiqueta para regresar con goto y después empiezas con definiciones de variables. Cuando con el goto regreses a la etiqueta volverás a definirlas. Crea las variables y pon la etiqueta justo después y a partir de allí ya podrás darles valores.

Código: Seleccionar todo

int a;
char b;
etiqueta:
a=3;
b=5;
Además un etiqueta debe ser seguida por una instrucción, no puede ser una definición (una asignación, cómo es en este caso, es legal).
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 5 invitados