PDA

Ver la Versión Completa : funcion de conjuntos,interseccion, union...


sakuragi
05-09-2005, 16:54:34
hola que tal

alguien sabe si delphi tiene una funcion para sacar la interseccion, union, diferencia etc. de los conjuntos, de matematicas discretas?


gracias

saludos

roman
05-09-2005, 16:58:05
Delphi tiene el tipo de datos set. Busca en la ayuda acerca de él. También busca "set operators" y verás listados todos los operadores que puedes usar para este tipo de datos, incluidos los que mencionas.

// Saludos

sakuragi
05-09-2005, 17:03:07
muchas gracias roman lo investigare

sakuragi
06-09-2005, 17:11:15
estube leyendo la ayuda

dice que el signo "+" es union,"-" diferencia, "*" interseccion,

entonses acto seguido pase a probar.


con tres edit



Er.text:=Ea.text + Eb.text;

este que es la union si funciona bien

ahora pase a probar la diferencia y la interseccion


// diferencia
Er.text:=Ea.text - Eb.text;

//interseccion

Er.text:=Ea.text * Eb.text;



es hambos casos me decia que la operacion no era el tipo

entonses decidi pasarlos a una bariable string.


var
a,b:string;
begin
a:=Ea.text;
b:=Eb.text;

Er.text:=a - b;
// esta dos lineas estan en botones diferentes
Er.text:=a * b;

end;


y me sigui marcando el mismo error. =S

despue sintente pasarlos a integer pero eso ya no es compatible.

o ahi un tipo especial para conjuntos?

saludos

gracias

roman
06-09-2005, 17:27:13
o ahi un tipo especial para conjuntos?


Estee...


Delphi tiene el tipo de datos set. Busca en la ayuda acerca de él.


Ahora, no te emociones mucho porque el tipo de datos set únicamente sirve para conjuntos cuyos elementos son enteros o de un tipo escalar. Por ejemplo,


type
TDia = (Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado);
TDias = set of TDia;


Aquí TDia es un tipo escalar- que básicamente es un rango de enteros con un nombre apropiado para usar en código: Domingo - 0, Lunes - 1, Martes -2, etc.

TDias es un tipo de datos que puede almacenar conjuntos de días:


var
DiasLaborales: TDias;
FinDeSemana: TDias;

begin
DiasLaborales := [Lunes..Viernes];
FinDeSemana := [Sabado, Domingo];

Assert(DiasLaborales*FinDeSemana = []);
end;


Los conjuntos los especificas listando sus elementos entre corchetes [] o indicando un rango (como en DiasLaborales).

En el ejemplo ves que la intersección de DiasLaborales y FinDeSemana es el conjunto vacío que representas en código por [].

Puedes declarar tipos de conjuntos (set of) para cualquier tipo escalar.

// Saludos

sakuragi
09-09-2005, 06:29:25
hola que tal de nuevo

ahi forma de pasar lo que tengo en un edit.text a un set?


a:=[strtoint(Ea.text)];


asi lo puse y no me marco erro

ala hora de haser la operacion si =S

no se como regresar e resultado de los set's para mostrarlos en un edit

alguna sugerencia?

gracias

saludos

sakuragi
09-09-2005, 08:39:35
bueno resumiendo
el problema que tengo es como pasarle los datos a un dato set

ya se mediante un edit, combo o memo


y bisebersa

alguna idea?


de hante mano gracias

saludos

jmariano
09-09-2005, 14:06:01
Para hacer lo que pides, tendrás que basarte en el valor del Edit o Combo para ir asignando valores al conjunto o ver que valores tiene el conjunto para rellenar el Edit o el Combo. Lo que no puedes hacer es una asignación tan "directa" entre un conjunto y un Edit, como pusiste más arriba.

Por ejemplo, siguiendo con el ejemplo de roman, imaginemos que queremos rellenar un Memo con los días laborales:


type
TDia = (Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado);
TDias = set of TDia;

var
DiasLaborales: TDias;
begin
DiasLaborales := [Lunes, Martes, Miercoles, Jueves, Viernes, Sabado];
Memo1.Clear;

if Lunes in DiasLaborales then
Memo1.Append('Lunes');

if Martes in DiasLaborales then
Memo1.Apeend('Martes');

// Y así seguiríamos con los demás dias
end;


Verás que el Memo se irá rellenando según el contenido del conjunto "DiasLaborales" (es más, te sugiero jugar un poco con el contenido de "DiasLaborales" para que vayas viendo el resultado). Tambien, puedes hacerlo a la inversa, rellenar el conjunto según el Memo.


DiasLaborales := []; // Vaciamos el conjunto

if Memo1.Lines[0] = 'Lunes' then
DiasLaborales := DiasLaborales + [Lunes];
...


Espero haberme explicado bien! (cualquier cosa vuelve a preguntar)

Saludos!

roman
09-09-2005, 21:19:22
Quizá les interesen este par de funciones:


uses TypInfo;

function StrToDia(S: String): TDia;
begin
Result := TDia(GetEnumValue(TypeInfo(TDia), S))
end;

function DiaToStr(Dia: TDia): String;
begin
Result := GetEnumName(TypeInfo(TDia), Ord(Dia));
end;


Por ejemplo:


var
Dia: TDia;

begin
Dia := StrToDia(Edit1.Text);

// ó

Edit1.Text := DiaToStr(Dia);
end;


Se puede rellenar un combo con


var
Dia: TDia;

begin
for Dia := Domingo to Sabado do
if Dia in DiasLaborales then
ComboBox1.Items.Add(DiaToStr(Dia));
end;


// Saludos

sakuragi
09-09-2005, 21:23:26
muchas gracias

me ta sirviendo


una duda mas

como le hago para que no ponga
lunes y martes en lineas separadas

lunes
martes

asi me los pone en el memo

ahi forma de ponerlos seguidos

"lunes martes"

if Lunes in DiasLaborales then
Memo1.Append('Lunes');

if Martes in DiasLaborales then
Memo1.Apeend('Martes');


en ves de poner una constante strgin como en el codigo

DiasLaborales := []; // Vaciamos el conjunto

if Memo1.Lines[0] = 'Lunes' then
DiasLaborales := DiasLaborales + [Lunes];


enves de lunes poner una variable, por que si tengo un conjunto de numero
que pueden ir de 0 hasta 300

para compararlos todos, vas ser mucho mucho codigo por tantos
posibles conparaciones.

bueno todo esto lo quiero haser para

por ejemplo

tener dos edir o combobox o memos
para insertar los conjuntos por ejemplo

conjnto a " 2 3 4 5 3"
conjunto b " 3 4 5 6 7 "
eso numero insertarlos como ya dije hanteriormente

pasar ese conjunto a y b

a una variable que creamos de dato set

para haser la operaciones que se puden haser con set

ya teniendo el resultado

desplegarlo en un edit,combo o memo

espero haver sido claso

saludos

gracias



...

sakuragi
09-09-2005, 21:30:59
gracias roma

te me delantaste

saludos

roman
09-09-2005, 21:46:38
Ya veo por donde vas. A las dos funciones anteriores agrégale estas dos:


// Convierte lista separada por comas en variable de tipo TDias
function StrToDias(S: String): TDias;
var
Lista: TStrings;
I: Integer;

begin
Lista := TStringList.Create;
Result := [];

try
Lista.CommaText := S;
for I := 0 to Lista.Count - 1 do
Include(Result, StrToDia(Lista[I]));
finally
Lista.Free;
end;
end;

// Convierte variable de tipo TDIas en lista separada por comas
function DiasToStr(Dias: TDias): String;
var
Lista: TStringList;
Dia: TDia;

begin
Lista := TStringList.Create;

try
for Dia := Domingo to Sabado do
if Dia in Dias then
Lista.Add(DiaToStr(Dia));

Result := Lista.CommaText;
finally
Lista.Free;
end;
end;


Pero aquí estoy suponiendo que vas a escribir en los edit tus conjuntos separando los elementos con comas y no espacios. Aunque a fin de cuentas así es como se escriben los conjuntos ¿no?

// Saludos

jmariano
09-09-2005, 22:08:14
Muy bueno roman! Me gustaron tus funciones para convertir entre cadenas y conjuntos (gracias a ti acabo de estrenar la herramienta "Code Librarian" de las GExperts ;))

Saludos!

sakuragi
09-09-2005, 23:01:52
muchas gracias

les debo una cena


:cool:

saludos.

una pregunta roman, donde aprendiste tanto? o como?

gracias