Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: miguelc++ en 21 Noviembre 2021, 22:36 pm



Título: Creacion Matriz nxn Automatica
Publicado por: miguelc++ en 21 Noviembre 2021, 22:36 pm
Hola, necesito ayuda para poder entender que es lo que estoy haciendo mal.

Tengo que hacer que mi programa imprima automaticamente una matriz nxn de la dimension que el usuario introduzca. No obstante, no logro que me de mas de un numero por fila.

Adjunto código:
Código:
//proyecto
#include <stdio.h>

int main(){

int i, j, filas;

printf("Ingrese diemension de matriz: ");
scanf("%i",&filas);

for(i = 1;i <= filas;i++)
{

printf("%02d ", i);

printf("\n");
}


return 0;
}


Se supone debo lograr que me imprima algo como esto:
(https://imagizer.imageshack.com/v2/xq90/924/vBtf8Y.jpg) (https://imageshack.com/i/povBtf8Yj)


Estoy muy seguro que en lo que estoy fallando son los for.


Título: Re: Creacion Matriz nxn Automatica
Publicado por: BloodSharp en 21 Noviembre 2021, 23:30 pm
Estoy muy seguro que en lo que estoy fallando son los for.

El código está casi completo, solamente te falta un for por columnas y una condición que verifique si está en la diagonal invertida...
Como medida adicional para evitar que la matriz no sea cuadrada podrías meter un do while extra al principio.

EDIT: Acabé de probarlo tu código con las recomendaciones de arriba y funciona correctamente
(https://i.imgur.com/vTo8AGq.png)


B#


Título: Re: Creacion Matriz nxn Automatica
Publicado por: miguelc++ en 22 Noviembre 2021, 17:17 pm
Hola, logré arreglar lo de las columnas y ya me da las matrices de la dimensión que quiera.

¿Cómo implemento lo de la diagonal para que me de asteriscos(**)?  



Código:
//proyecto
#include <stdio.h>

int main(){

int i, j, filas;

printf("Ingrese dimension de matriz: ");
scanf("%i",&filas);

for(i=1;i<=filas;i++)
{
    for(j=1;j<=filas;j++)

    
printf("%02d ", j);

printf("\n");
}


return 0;
}

(https://i.imgur.com/cQ9edtI.jpg)



Título: Re: Creacion Matriz nxn Automatica
Publicado por: BloodSharp en 22 Noviembre 2021, 21:55 pm
Hola, logré arreglar lo de las columnas y ya me da las matrices de la dimensión que quiera. ¿Cómo implemento lo de la diagonal para que me de asteriscos(**)?

Bien, añadiste el for que te mencioné para las columnas ahora solo falta la condición ( if else ) que verifica si el elemento de la matriz pertenece a la diagonal principal, prestá mucha atención a la tabla de 5x5 que mostraste hace un momento, si te fijás bien hay una operación matemática elemental que se cumple si encaja justo en la posición de la tabla por filas y columnas y dicha operación equivale a la dimensión total de las filas o columnas ingresadas al principio, vale aclarar que a la operación matemática se le tiene que restar 1 porque el primer elemento de la matriz comienzan con el valor 01...


B#


Título: Re: Creacion Matriz nxn Automatica
Publicado por: miguelc++ en 23 Noviembre 2021, 05:16 am
Lo he intentado se todas las formas que se me ocurre, pero todavía no consigo entender bien.


Título: Re: Creacion Matriz nxn Automatica
Publicado por: MAFUS en 23 Noviembre 2021, 08:19 am
Sabiendo que los asteriscos van se colocan en (hablamos de una matriz de 5x5):
Fila 1, columna 5;
Fila 2, columna 4;
Fila 3, columna 3;
Fila 4, columna 2;
Fila 5, columna 1.

¿Qué podrían tener en común los pares
(5, 1)
(4, 2)
(3, 3)
(2, 4)
(1, 5)?

Esa respuesta es la que necesita el if para dibujar el número o los asteriscos.


Título: Re: Creacion Matriz nxn Automatica
Publicado por: fzp en 23 Noviembre 2021, 11:17 am
MAFUS y BloodSharp: creo que vuestras indicaciones van en el sentido de relacionar -calcular- la posicion de los asteriscos (para el if de la j) a partir de n y de i; con una fórmula ciertamente sencilla. Pero quizá eso despiste un poco a miguelc++.

Otra forma de verlo (quizá más asequible a miguelc++) sería no buscar la posición de los astericos en función del valor de n y de i, sino con una variable distinta: esa variable empieza en n para i=1 y disminuye en 1 en cada fila (cada ciclo de i). Es menos elegante quizá pero vale igual.
----------------------------------------------------------------------
También creo que la forma de representar la matriz no es adecuada al concepto matemático de los elementos de una matriz. Lo suyo sería imprimir las parejas i-j que representarían los subíndices de los distintos elementos de la matriz. Aunque claro si lo que le piden es que lo haga de esa manera, pues es lo que hay. Supongo que el ejercicio está pensado para lo de los asteriscos mayormente.


Título: Re: Creacion Matriz nxn Automatica
Publicado por: miguelc++ en 23 Noviembre 2021, 17:32 pm
Siento que no puedo lograr lo que se me pidió. Mi cabeza no logra comprender sus explicaciones para la implementación de esos asteriscos. Igualmente agradezco por el tiempo que se tomaron en responder mis dudas.

Como pudieron notar no soy muy avanzado en programación, pero se hace lo que se puede .  Intentaré buscar ejercicios mas básicos  y acordes a mi nivel para entonces ir subiendo el nivel progresivamente.


Título: Re: Creacion Matriz nxn Automatica
Publicado por: MAFUS en 24 Noviembre 2021, 10:13 am
Te lo explico para el ejemplo de 5x5.
Dije:
Citar
¿Qué podrían tener en común los pares
(5, 1)
(4, 2)
(3, 3)
(2, 4)
(1, 5)?

Si te das cuenta:
5+1 = 6
4+2 = 6
3+3 = 6
2+4 = 6
1+5 = 6

Sabiendo que tu vas desde 1 hasta 5, siendo este caso filas = 5
en tu if, dentro del for de j debería poner:
Código:
if(i+j == filas+1) {
    printf("** ");
} else {
    printf("%02d ", j);
}


Título: Re: Creacion Matriz nxn Automatica
Publicado por: BloodSharp en 24 Noviembre 2021, 15:52 pm
Ya que MAFUS puso su solución muestro mi solución al problema, mi solución también controla que la dimensión ingresada sea una matriz cuadrada como puede verse en la imagen:

(https://i.imgur.com/zPWx9IS.png)

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i, j, filas, columnas;
  6.  
  7.    do
  8.    {
  9.        printf("Ingrese la dimension de matriz: ");
  10.        scanf("%i*%i", &filas, &columnas);
  11.    } while (filas != columnas);
  12.  
  13.    for(i = 1; i <= filas; i++)
  14.    {
  15.        for(j = 1; j <= columnas; j++)
  16.        {
  17.            if ((i + j -1) == columnas)
  18.                printf("** ");
  19.            else
  20.                printf("%02d ", j);
  21.        }
  22.  
  23.        printf("\n");
  24.    }
  25.  
  26.    return 0;
  27. }


B#


Título: Re: Creacion Matriz nxn Automatica
Publicado por: Serapis en 24 Noviembre 2021, 15:54 pm
Intenta conseguir primero imprimir el array de nxn... Si lo consigues entonces podrás centrarte luego en resolver la cuestión de los asteriscos.

Inicialmente necesitarás dos bucles anidados.
El primer bucle recorrer las filas (actúa verticalmente)
El bucle interno recorre las columnas (actúa horizontalmente).
Es este último el que hace el trabajo de impresión.
Hay dos formas elementales de resolverlo: Primero conviene centrarse en la más simple:

- El bucle externo recorre  las n filas desde 1 (ó desde 0 a n-1).
- Internamente, la solución más sencilla-evidente es escribir dos bucles.
---- El primer de esos internos escribe los valores hasta el asterisco.
------- Cuántos valores debe escribir entonces este bucle?. La primera fila 1 menos de 'n', las siguientes filas 1 menos que la fila anterior... es decir hay una resta, entonces qué tal si antes de entrar a ese bucle, calculamos ese valor?.
---- Cuando sales del bucle, imprime los asteriscos.
---- el segundo bucle interno escribe los valores que vienen a continuación de los asteriscos.
------- Cuántos valores debe escribirse tras los asterisocs?. La primera fila 0, las siguientes filas uno más que la anterior... es decir es una suma, entonces que tal si al salir de este bucle (puesto que empieza en 0), calculas ese valor para la próxima vez?.
Para no incurrir en equívocos, usa 3 variables contadores (n,j,k) uno para cada bucle, como límite del recorrido así no te confundes...

Esta es la forma más simple para un principiante. Una vez que lo logres, puedes intentar meter en el primer bucle lo que le sigue. Pero si no lo logras, al menos el previo podrás entregarlo en clase.

...es decir imprimir los asteriscos y los valores a su derecha eliminando así el segundo bucle (interno), se resuelve en solo uno interno con la sentencia if...else... aunque sigas teniendo las variables n,j,k.