Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   funcion de conjuntos,interseccion, union... (https://www.clubdelphi.com/foros/showthread.php?t=24878)

sakuragi 05-09-2005 16:54:34

funcion de conjuntos,interseccion, union...
 
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

Código Delphi [-]
 
 Er.text:=Ea.text + Eb.text;
este que es la union si funciona bien

ahora pase a probar la diferencia y la interseccion

Código Delphi [-]
 // 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.

Código Delphi [-]
 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

Cita:

Empezado por sakuragi
o ahi un tipo especial para conjuntos?

Estee...

Cita:

Empezado por yo mismo
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,

Código Delphi [-]
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:

Código Delphi [-]
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?

Código Delphi [-]
 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:

Código Delphi [-]
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.

Código Delphi [-]
  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:

Código Delphi [-]
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:

Código Delphi [-]
var
  Dia: TDia;

begin
  Dia := StrToDia(Edit1.Text);

  // ó

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

Se puede rellenar un combo con

Código Delphi [-]
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"
Código Delphi [-]
 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
Código Delphi [-]
  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:

Código Delphi [-]
// 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


La franja horaria es GMT +2. Ahora son las 17:42:50.

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