[ Foro de retos de programación ]
Hola,
Necesito hacer un programa que busque en una matriz los números de 1 a n*n (no se pueden repetir los numeros)
esto es lo que tengo de momento, no se como hacer que una vez que encuentre uno pase directamente a buscar el siguiente.
while (k<=(sqr(n))) do
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
(k=matriz[i,j])
end;
end;
end;
Gracias
No entiendo. ¿Qué tienes que hacer con esos números? ¿decir si están o no en el array? ¿Tienes que rellenar el array con ellos?
Porque tu explicación es poco detallada, y tu fuente lee datos del array, pero no hace nada con ellos. El "while" exterior quizá fuera más simple si lo planteas como un "for". También podrías hacer el fuente más legibles si usas funciones (¿las has estudiado ya?)
Dada una matriz n*n solo puede estar rellenada con numeros que van del 1 a n*n y no se pueden repetir , por tanto lo que quiero es hacer que vaya buscando por todo el array esos numeros y para ver si estan todos, no se si me explico,
la idea es hacer esto en una sola funcion que devuelva un boolean
un saludo
Hola, la cosa es que tengo una matriz n*n llena de numeros y quiero recorrerla entera para comprobar si estan llena de los numeros del 1 a n*n
El pseudocódigo podría ser algo como
Para numero = 1 hasta n*n hacer:
-- contador = 0
-- Para fila = 1 hasta numeroDeFilas
---- Para columna = 1 hasta numeroDeColumnas
------ Si dato[fila,columna] = numero entonces
-------- Incrementar( contador )
------ Fin si
---- Fin para (columna)
-- Fin para (fila)
-- Si contador <> 1 entonces
---- Devolver Falso
-- Fin si
Fin para (numero)
Devolver Verdadero
(suponiendo que se deba devolver Falso cuando la matriz no es correcta, porque algún número exista 0 veces o más de una, y que deba devolver Verdadero cuando cada dato exista exactamente una vez).
Es decir, para cada uno de los n*n números, cuentas la cantidad de veces que aparece en el array. Si no es exactamente 1, el array no cumple la condición pedida.
Se puede plantear de otras formas más rápidas (y que a cambio consumen más memoria), pero esa es sencilla, que suele ser algo vital cuando uno empieza a programar.
Prueba a implementarla y pregunta las dudas.
for num:=1 to n*n do begin
contador:=0;
for i:=1 to n do begin
for j:=1 to n do begin
if mat[i,j]=num then contador:=contador+1;
end;
end;
if contador<>1 then encontrado:=false;
end;
{No me que da muy claro la ultima parte de devolver el verdadero}
Entendido y si ahora quiero que me mire si la suma de las filas sea igual ¿como completo esto?
suma:=0;
for i:=1 to n do begin
for j:=1 to n do begin
suma:=suma+matriz[i,j];
end;
suma:=0;
end;
Hola , con resècto a este ejercicio y la solucion en seudocodigo que planteas profesor tengo la duda en
que caso la matriz seria incorrecta porque algun numero exista 0 veces o mas de una, pues no se supone que al hacer el primer for numero:=1 to n*n esto no ocurriria en ningun momento, asi tampoco entiendo si el seudocodigo que planteas profesor nacho es el contenido de una funcion pues no veo parametros si no que envias directamente el resultado como si de una funcion se tratase, si pudieras profesor explicarme un poco mas mis dudas te lo agradezco inmensamente.
Para Juan: el esqueleto de la suma es ese, efectivamente. Sólo te falta, para ver si todas suman lo mismo, guardar las sumas en un array, o al menos conservar la suma anterior, para comparar con ella (en tu ejemplo, calculas una única suma, que destruyes en cada pasada, sin llegar a comparar con ninguna otra).
Para Oscar: lo de "for numero:=1 to n*n" es para probar todos los números posibles, y ver si todos ellos aparecen una vez y sólo una vez. Y efectivamente, no se trata de una función completa, sólo de un esqueleto para que ayudara un poco a Juan a saber por dónde probar. Una función completa recibiría como parámetro el array que debe comprobar.
¿Como la puedo comparar sin usar un array?
Gracias
cordial saludo gracias por responder, quisiera me indicaras que supongo es asi, que la matriz en mension de dimension (nxn) es una matriz dada?, siendo asi comprendo tu explicacion que me das:
Para Oscar: lo de "for numero:=1 to n*n" es para probar todos los números posibles, y ver si todos ellos aparecen una vez y sólo una vez.
Ahora bien profesor podrias indicarme un poco mejor la estructura de la funcion que mencionas y los parametros recividos por la misma?
mil gracias profesor.
Nuevamente, os respondo a los dos.
Para Juan, si no quieres usar una matriz para memorizar las sumas de cada fila, necesitarás al menos una variable auxiliar llamada (por ejemplo) "sumaAnterior". En cada pasada, antes de hacer "suma=0" memorizas el valor actual para compararlo más tarde: "sumaAnterior := suma;"
Lógicamente, antes de guardar ese valor deberías haber comprobado si la suma es igual que la anterior, porque si no es así, no es necesario seguir.
if suma <> sumaAnterior then
{... avisar y terminar ...}
Para Óscar: yo también supongo que se trata de una matriz cuyo valor está dado de antes. Yo os puedo ayudar con la lógica, pero completar eso para que sea un "función real" en Pascal o en cualquier otro lenguajes... debería ser trabajo vuestro... ;-)
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)