Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con matrices que no logro resolver (https://www.clubdelphi.com/foros/showthread.php?t=32844)

galmacland 17-06-2006 23:37:47

Problema con matrices que no logro resolver
 
Hola,

recien me paso un amigo unos problemas en los que tenia dudas, y hay uno particularmente que no he logrado resolver. es algo sencillo pienso, lo que ya mi cabeza parece que no genera mas por el dia de hoy y no logro que salga...

dice asi:

Declare 2 matrices para:
1 - en la primera se almacenen los 10 primeros numeros naturales, empezando desde 0.

2 - en la segunda se almacene el valor del factorial del numero incluido en la misma posicion de la primera matriz.

ej:

si tenemos que en la posicion 3 de la primera matriz se guarda el valor 3, en la posicion 3 de la segunda matriz estara el factorial de 3 que es 6

factorial(5):= 1*2*3*4*5= 120

Obviamente pienso que hay que usar los valores de la primera matriz en la segunda, pero ocurre un error en los resultados por como estoy usando el bucle, pero no encuentro como hacerlo.. a lo mejor hay un error en el enunciado.. espero puedan ayudarme con esto... gracias por las sugerencias..:confused: :confused: :confused:

bpesoj 18-06-2006 00:02:27

Hola, galmacland.

Creo que este código hace lo que indicas:

El uso del tipo double es por si el valor del factorial se hace mayor que
el mayor valor admitido a un entero.

Function Factorial(n:Integer): Double;
var
k:Integer;
f: Double;
begin
f:=1;
for k:=1 to n do
f:=f*k;
Result:=f;
end;

procedure Calcular;
var
m1:Array[0..9] of integer;
m2:Array[0..9] of Double;
k:Integer;
begin
for k:=0 to 9 do
begin
m1[k]:=k;
m2[k]:=Factorial(k);
end;
end;

Saludos.

galmacland 18-06-2006 00:30:14

Graciaspor tu ayuda, se como hacerlo con funciones, el caso es que no me funciona usando las 2 matrices, sin usar las funciones, el caso es que es un manual con ejercicios y no ha llegado a la parte de las funciones....

D-MO 18-06-2006 00:54:29

Código Delphi [-]
program factorial; var
i,i:Integer; f : Double; m1 : Array[0..9] of integer; m2 : Array[0..9] of Double;
begin
for i:=0 to 9 do
begin
m1[i]:=i;
end;
for i:=0 to 9 do
begin
m2[j]:=1; for j:=0 to m1[i] do
m2[j]:=m2[j]*j;
end;
end;


supongo que algo asi te podria funcionar, no lo he provado pero me parece que si funciona. Aunque creo que por el hecho de iniciar de "0" es posible que todos los resultados sena "0"

saludos.

seoane 18-06-2006 01:40:55

No lo probe pero deberia ser algo asi:
Código Delphi [-]
var
  i: integer;
  m1, m2: array[1..10] of Cardinal;
begin
  m1[1]:= 1;
  m2[1]:= 1;
  for i:= 2 to 10 do
  begin
     m1[i]:= i;
     m2[i]:= m2[i-1] * i;
  end;
end;

OSKR 18-06-2006 16:59:03

galmacland:
Cita:

en la primera se almacenen los 10 primeros numeros naturales, empezando desde 0
Veo q no se ha tomado en cuenta el "0" y q su factorial es 1
Modificando el código de seoane
Código Delphi [-]
var
  i: integer;
  m1, m2: array[0..10] of Cardinal;
begin
  for i:= 0 to 10 do
  begin
     m1[i]:= i;
     m2[i]:=1;
     if(i>1)then
       m2[i]:= m2[i-1] * i;
  end;
end;
//Nota: No lo he probado

Innovacl 18-06-2006 19:22:35

Una pequeña modificación al algoritmo de galmacland

var
i: integer;
m1, m2: array[0..10] of Cardinal;
begin
m1[0]:=0;
m2[0]:=1;
for i:= 1 to 10 do
begin
m1[i]:= i;
m2[i]:= m2[i-1] * i;
end
end;

... no requiere el if y ahorra un ciclo. Con recursividad es un poco más elegante.

OSKR 18-06-2006 20:05:56

Innovacl:
Cita:

no requiere el if y ahorra un ciclo
Pues si...aunqe reqiere 2 instrucciones mas :cool: y además el algoritmo es de seoane.

seoane 18-06-2006 20:32:05

Cita:

Empezado por OSKR
Pues si...aunqe reqiere 2 instrucciones mas :cool: y además el algoritmo es de seoane.

:D Si parece que me ignoran ... En cuanto a lo de que son dos instrucciones mas, no hay que ver quien escribe mas si no quien ejecuta menos instrucciones. Me explico, en mi algoritmo ejecuto 2 instrucciones fuera del bucle y 2 dentro. En el que pones tu con el "if" ejecutas 4 instrcciones dentro del bucle (3 si no consideras el if una instruccion) eso multiplicalo por las 10 veces que se repite el bucle y veras que es mas rapido de la forma que yo digo. :D Pero para la tonteria de problema que es creo que le estamos dando muchas vueltas.

OSKR 20-06-2006 01:16:21

seoane:
Cita:

En cuanto a lo de que son dos instrucciones mas, no hay que ver quien escribe mas si no quien ejecuta menos instrucciones.
Sip, lo sé, a simple vista se ve, solo hago imcapié en q el algoritmo la faltaba el factorial de 0 y q es tuyo no de gamacland.

raulmm26 20-06-2006 14:02:13

lo que sucede con lo que haceis con el factorial es que lo haceis mal no se pone un for despues sino un while y multiplicar quitando a la posicion en que se encuentra hasta que sea uno,quedaria algo asi:
var
i,fact,n: integer;
m1, m2: array[1..10] of Cardinal;
begin
m1[1]:= 1;
m2[1]:=1;
fact:=1;
for i:= 2 to 10 do
begin
m1[i]:= i;
n:=i;
while n>=1 do
begin
fact:=fact*n;
n:=n-1;
end;
m2[i]:= fact;
fact:=1;
end;
end;

OSKR 20-06-2006 19:03:45

raulmm26:
Cita:

lo que sucede con lo que haceis con el factorial es que lo haceis mal no se pone un for despues sino un while y multiplicar quitando a la posicion en que se encuentra hasta que sea uno,quedaria algo asi
Pero ....a qién le dices esto?...
Estás usando 2 ciclos..los anteriores algoritmos funcionan al pelo (eso creo)
y además....:
Código:

m1[1]:= 1;
recuerda q empieza de 0.
Mejor hago caso a lo q dijo seoane:
Cita:

Pero para la tonteria de problema que es creo que le estamos dando muchas vueltas.
y tiene toda la razón.


La franja horaria es GMT +2. Ahora son las 07:30:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi