Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - 2Fac3R

#121
C / C++ / [Métodos de ordenamiento] QuickSort [C++]
Octubre 17, 2014, 04:15:59 PM
Buenas!.

El método de ordenamiento You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login es un método muy eficaz a la hora de ordenar datos, les comparto un código que implemente en un proyecto escolar, está basado para ordenar fechas de salida de vuelos, pero ustedes pueden implementarlo para ordenar cualquier otro tipo de dato.

Código: cpp

void QuickSortF( N_Vuelo** arr, int izq, int der ){
int g, h, medio;
N_Vuelo *pivote, *aux;
medio = ( izq + der )/2;
pivote = arr[medio];
g = izq;
h = der;

while( g <= h ){

while ( arr[g]->getDato()->getFS(1) < pivote->getDato()->getFS(1) ) { g++; }
while ( pivote->getDato()->getFS(1) < arr[h]->getDato()->getFS(1) ) { h--; }

if( g <= h ){
aux = arr[g];
arr[g] = arr[h];
arr[h] = aux;
g++;
h--;
}
}

if ( izq < h ) { QuickSortF(arr, izq, h); }
if ( g < der ) { QuickSortF(arr, g, der); }
}


En los condicionales if iría la condición de ordenamiento de el tipo de dato que quieras implementar, cualquier duda y/o comentario hazmelo saber!.

Zalu2
#122
C / C++ / [ESTRUCTURA DE DATOS] Árbol binario [C++]
Octubre 17, 2014, 04:06:25 PM
Buenas!.

Otro tema muy importante en la estructura de datos son el manejo de árboles binarios, les comparto un ejemplo que hice para la escuela del tema, está hecho para un sistema de vuelos, por lo tanto uso la clase Pasajeros , pero ustedes pueden usar el tipo de dato que quieran almacenar en el árbol.

Código: cpp

#include <iostream>

using namespace std;

#include "Pasajero.h"

#ifndef __arbolbinario_H_INCLUDED__
#define __arbolbinario_H_INCLUDED__


class Nodo
{
private:
    Pasajero *dato;
    Nodo *izq; //enlace izquierdo
    Nodo *der; //enlace derecho

public:
    Nodo(Pasajero *info); // CONSTRUCTOR
    ~Nodo(); // DESTRUCTOR

    // METODOS GET
    Pasajero *getPasajero() { return dato;}
    Nodo *getIzq() { return izq;}
    Nodo *getDer() { return der;}

    // METODOS SET
    void setIzq(Nodo *i) { izq = i;}
    void setDer(Nodo *d) { der = d;}

};

Nodo::Nodo(Pasajero *info)
{
    dato = info;
    izq = NULL;
    der = NULL;
}

Nodo::~Nodo()
{ }

class ArbolBinario
{
    private:
        Nodo *raiz;
        Nodo *Insertar(Nodo*,Pasajero*);
        Nodo *Borrar(Nodo*, Pasajero*);
        void preOrden(Nodo*);
        void inOrden(Nodo*);
        void postOrden(Nodo*);
    public:
        ArbolBinario();
        Nodo *getRaiz() { return raiz;} // testing method
        void Crear(Pasajero*);
        void Recorridos(int);
        void Eliminar(int);
        Pasajero *Buscar(string, Nodo*);

        ~ArbolBinario();
};

ArbolBinario::ArbolBinario(){
    raiz = NULL;
}

Nodo* ArbolBinario::Insertar(Nodo *p, Pasajero *q){
    if(p == NULL){
        p = new Nodo(q);
    }
    else{
        string a = p -> getPasajero()-> getApellido(); // Primera letra del apellido que esta en la raiz

        if(q->getApellido()[0] <= a[0])
        {
            p->setIzq( Insertar(p->getIzq(),q) );

        }
        else{
            p->setDer( Insertar(p->getDer(),q) );
        }
    }

    return p;
}

void ArbolBinario::Crear(Pasajero *q)
{
     raiz = Insertar(raiz,q);
}

void ArbolBinario::preOrden(Nodo *p){
    if(p != NULL){
        cout << "\n " << p->getPasajero()->getApellido();
        preOrden(p->getIzq());
        preOrden(p->getDer());
    }
}

void ArbolBinario::inOrden(Nodo *p){
    if(p != NULL){
        inOrden(p->getIzq());
        cout << "\n " << p->getPasajero()->getApellido();
        inOrden(p->getDer());
    }
}

void ArbolBinario::postOrden(Nodo *p){
    if(p != NULL){
        cout << " \n " << p->getPasajero()->getApellido();
        postOrden(p->getIzq());
        postOrden(p->getDer());
    }
}

void ArbolBinario::Recorridos(int tipo){
    switch(tipo){
        case 1:
            preOrden(raiz);
        break;

        case 2:
            inOrden(raiz);
        break;

        case 3:
            postOrden(raiz);
        break;

        default:
            cout << " - Error! opcion invalida!. -" << endl;
  break;
    }
}


Espero que les sea de utilidad!.

Para más información véase -> You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Zalu2!
#123
Buenas!

Hace poco cree un tema sobre un You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login en C++, pues quería compartirles otro código que no lo hice para la escuela y por lo tanto me dió más tiempo de currarmelo más y agregarle más métodos  ;D .

Código: cpp

#include <iostream>
using namespace std;

#define ASCENDENTE 1
#define DESCENDENTE 0

class nodo
{
private:
    int valor;
    nodo *siguiente;
    nodo *anterior;

    friend class lista;

public:
    nodo(int v, nodo *sig = NULL, nodo *ant = NULL) // CONSTRUCTOR
    {
        valor = v;
        siguiente = sig;
        anterior = ant;
    }
    // SETTERS
    void setAnterior(nodo *ant) { anterior = ant; }
    void setSiguiente(nodo *sig) { siguiente = sig; }

    // GETTERS
    int getValor() { return valor; }
    nodo *getSiguiente() { return siguiente; }
    nodo *getAnterior() { return anterior; }
};


class lista
{
private:
    nodo  *plista; // ANCLA

public:
    lista(){ plista = NULL; } // CONSTRUCTOR

    ~lista(); // DESTRUCTOR

    // METODOS DE LA LISTA
    void Insertar(int v);
    void Borrar(int v);
    bool ListaVacia() { return plista == NULL; }
    void Mostrar(int);

    // METODOS DE POSICION
    void Siguiente() { if(plista) plista = plista->getSiguiente(); }
    void Anterior() { if(plista) plista = plista->getAnterior(); }
    void Primero() {  while(plista && plista->getAnterior()) plista = plista->getAnterior(); }
    void Ultimo() {  while(plista && plista->getSiguiente()) plista = plista->getSiguiente(); }
    int ValorActual() { return plista->valor; }

};

lista::~lista() // VACIAMOS LA LISTA
{
   nodo *aux;

   Primero();
   while(plista) {
      aux = plista;
      plista = plista->getSiguiente();
      delete aux;
   }
}

void lista::Insertar(int v)
{
    nodo *nuevo;

    Primero();
    // Si la lista está vacía
    if(ListaVacia() || plista->getValor() > v)
    {
      nuevo = new nodo(v, plista);
      if(!plista) plista = nuevo;
      else plista->setAnterior(nuevo);
    }
    else
    {
      while(plista->getSiguiente() && plista->getSiguiente()->getValor() <= v) Siguiente();
      // Creamos un nuevo nodo después del nodo actual
      nuevo = new nodo(v, plista->getSiguiente(), plista);
      plista->setSiguiente(nuevo);
      if(nuevo->getSiguiente()) nuevo->getSiguiente()->setAnterior(nuevo);
    }
}

void lista::Borrar(int v)
{
   nodo *nodo;

   nodo = plista;
   while(nodo && nodo->getValor() < v) nodo = nodo->getSiguiente();
   while(nodo && nodo->getValor() > v) nodo = nodo->getAnterior();

   if(!nodo || nodo->getValor() != v) return;
   // Borrar el nodo

   if(nodo->getAnterior()) // no es el primer elemento
      nodo->getAnterior()->setSiguiente(nodo->getSiguiente());
   if(nodo->getSiguiente()) // no el el último nodo
      nodo->getSiguiente()->setAnterior(nodo->getAnterior());
   delete nodo;
}

void lista::Mostrar(int orden)
{
    nodo *nodo;
    if(orden == ASCENDENTE)
    {
        Primero();
        nodo = plista;
        while(nodo)
        {
        cout << nodo->getValor() << "-> ";
        nodo = nodo->getSiguiente();
        }
    }
    else
    {
        Ultimo();
        nodo = plista;
        while(nodo)
        {
            cout << nodo->getValor() << "-> ";
            nodo = nodo->getAnterior();
        }
    }
    cout << endl;
}

int main(void) {
    lista Lista;

    Lista.Insertar(20);
    Lista.Insertar(10);
    Lista.Insertar(40);
    Lista.Insertar(30);

    Lista.Mostrar(ASCENDENTE);
    Lista.Mostrar(DESCENDENTE);

    Lista.Primero();
    cout << "Primero: " << Lista.ValorActual() << endl;

    Lista.Ultimo();
    cout << "Ultimo: " << Lista.ValorActual() << endl;

    Lista.Borrar(10);
    Lista.Borrar(15);
    Lista.Borrar(45);
    Lista.Borrar(40);

    Lista.Mostrar(ASCENDENTE);
    Lista.Mostrar(DESCENDENTE);

    return 0;
}


Espero que les guste y les sirva, cualquier duda y/o comentario me lo hacen saber  ::).

Zalu2!
#124
Buenas!

Resulta que he estado estudiando en la universidad las estructuras de datos en C++, y me gustaría compartirles algunos códigos que he estado haciendo en este tiempo, son códigos más que nada de la escuela. He buscado información al respecto en internet, y la mayoria (por no decir todos) están hechos en C (los que he visto en español), utilizan estructuras con struct y no objetos en C++, así que sirve que alimentamos el internet y el foro  ;D .

No les voy a mostrar teoría sobre el tema, eso se los dejo a su búsqueda.

listas.h
Código: cpp

#include <iostream>

using namespace std;

#ifndef __LISTAS_H_INCLUDED__
#define __LISTAS_H_INCLUDED__

class Nodo{

private:
    int dato;
    Nodo *sig;
    Nodo *ant;
public:
    Nodo(void) { sig = ant = NULL; }

    Nodo( int x , Nodo* s = NULL , Nodo* a = NULL )
    {
        dato = x;
        sig = s;
        ant = a;
    }

    // SETTERS
    void setDato(int x) { dato = x; }
    void setAnt(Nodo *a) { ant = a; }
    void setSig(Nodo *s) { sig = s; }

    // GETTERS
    int getDato()  { return dato;}
    Nodo *getAnt() { return ant; }
    Nodo *getSig() { return sig; }

};

class Lista
{
private:
    Nodo *lista; // ancla
public:
    Lista(void) { Inicializar(); } // CONSTRUCTOR

    // METODOS BASICOS

    Nodo *Primero() { return lista; }
    Nodo *Siguiente(Nodo *pos) { return pos->getSig(); }
    Nodo *Anterior(Nodo *pos) { return pos->getAnt(); }

    Nodo *Ultimo() {
        Nodo *aux = lista;

        if ( !Vacia() ) { while ( aux->getSig() ) { aux = aux->getSig(); } }
        return aux;
    }

    // METODOS DE LA LISTA
    void Inicializar() { lista = NULL; }
    bool Vacia() { return lista==NULL; }
    void Mostrar();
    void Insertar(int x, Nodo* pos = NULL);
};


void Lista::Insertar(int x, Nodo* pos)
{
    Nodo* aux;
Nodo* temp_n = new Nodo(x);

if ( Vacia() ){
lista = temp_n;

}else{
if ( pos == Primero() ){
aux = Primero();
aux->setAnt(temp_n);

temp_n->setSig(aux);
lista = temp_n;

}else if ( pos == NULL ){

aux = Ultimo();
aux->setSig(temp_n);
temp_n->setAnt(aux);

}else{
aux = Primero();

while ( aux ){
if ( aux == pos ){
Anterior(aux)->setSig( temp_n );

temp_n->setAnt( Anterior(aux) );
temp_n->setSig( aux );

aux->setAnt( temp_n );

}else {
    aux = aux->getSig();
                }
}
}
}
}

void Lista::Mostrar()
{
    Nodo* aux;

    Primero();
    aux = lista;
if ( !Vacia() ){
while ( aux ){
            cout << aux ->getDato();
            cout << "\n";
            aux = aux ->getSig();
}
}
}

#endif



main.cpp
Código: cpp

#include <iostream>
#include "listas.h"

using namespace std;

int main(void)
{
    Lista numeros; // Mi lista
    char opc; // Opcion del menu
    int n; // dato a insertar

    do{
        cout << "\n \n  LISTAS DOBLEMENTE LIGADAS: ";
        cout << "\n *- MENU -* ";
        cout << "\n 1. AGREGAR A LA LISTA . ";
        cout << "\n 2. MOSTRAR LOS DATOS . ";
        cout << "\n 3. SALIR . ";
        cout << "\n         _> ";
        cin >> opc;

        switch(opc){
        case '1':
            cout << "\n AGREGANDO DATOS A LA LISTA . ";
            cout << "\n INGRESE EL VALOR NUMERICO . ";
            cout << "\n         _> ";
            cin >> n;
            numeros.Insertar(n);
            cout << " --> < Guardado correctamente > " << endl;
            break;
        case '2':
            if(numeros.Vacia())
            {
                cout << "\n < No hay registros!. > ";
                break;
            }

            cout << "\n \n DATOS GUARDADOS EN LA LISTA: \n ";
            numeros.Mostrar();
            break;
        case '3':
            cout << " - < Saliendo!...... >" << endl;
            break;
        default:
            cout << " - < Opcion incorrecta!, intente de nuevo. >" << endl;
            break;

        }

    }while(opc!='3');

    cin.ignore();
    return 0;
}



Espero que les sea de utilidad, y son bienvenidas sus criticas y/o comentarios  8)
Zalu2!
#125
Back-end / Re:Manual Sockets en PHP (PHPSocketMaster)
Octubre 16, 2014, 08:47:48 PM
La verdad es que está muy bueno el manual, no suelo comentar un tema solo para decirlo, pero te felicito por el gran aporte, y no está de más también por el genial blog que tienes ;D .
Sigue así brot.
Zalu2!
#126
Dudas y pedidos generales / Re:[Consulta] Ezines
Octubre 15, 2014, 12:22:56 PM
Dando una mirada rápida por los que te paso snifer, no encontré una que te recomiendo bastante Hackers & Developers Magazine , dale una checkada y me cuentas!.

Zalu2
#127
Off Topic / Re:Una perdida muy grande para Underc0de
Octubre 15, 2014, 11:42:33 AM
Solo hablé con ella 1 vez en el staff, sin embargo se notaba que era una persona que quería llevar a cabo el crecimiento del foro, es una lastima :( , apenas me entero, mi más sincero pésame a sus familiares y a todos los miembros de UnderC0de.

Que descance en paz.
Zalu2
#128
Si no hay de otra tendré que hacer eso, aunque si alguien sabe de alguna forma de hacerlo sería mejor.

Gracias por responder!

PD: Que no puse el post en el subforo de C/C++?

Zalu2
#129
Hola a todos!

Resulta que me gustaría mostrar un estilo "Graffiti" en un trabajo que tengo que entregar, sería simplemente un titulo o un mensaje de bienvenida al programa. En PHP existe la sintaxis heredoc que simplemente no he encontrado similar en C++.

La página donde saco el graffiti es esta You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Para quien no conosca la sintaxis heredoc
Código: php

<?php
$graffiti = <<<EOF

Aqui mensajes de
muchas
lineas, en donde iría
la "imagen"

EOF;

?>


Probé también, metiendolo en un archivo txt y leyendolo mediante c++, pero no se muestra correctamente.
He buscado y he visto que simplemente no existe en C/C++ heredoc, me gustaría saber si alguien sabe alguna forma de hacerlo y que aparezca correctamente el "dibujo".

Gracias! ;D

#130
Hacer algo sin querer joder a los demás (?)
#131
Off Topic / Re:Convocatoria a CO-ADMIN 2014
Mayo 15, 2014, 09:56:13 PM
Si esperabas una convocatoria real de co-administradores por supuesto eres un iluso.
Si sabías que era una broma y entraste igual estás muy aburrido y tu tiempo te sobra.
Si algo te molestó del post, en principio es problema tuyo por entrar sabiendo que era broma, y luego pido disculpas porque la intención del post era alegrar el día.
Si te parece que este post no debería existir, te felicito, eres un amargado.
Si tampoco te gusta el color violeta del foro te aviso que es azul.

Luego ví el video y me alegró el dia jajaja :D

Zalu2
#132
Postea lo que llevas hecho, y tu duda en el código.

Zalu2
#133
Puedes empezar a crear tu página web, no necesitaras mucho más que un poco de PHP y HTML.

Zalu2
#134
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
muchas gracias me sirvio mucho.

Sería bueno que publicaras tu código, así los demás también aprendemos ;D

Zalu2
#135
Hace tiempo hice uno: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

supongo que te puede servir para guiarte.

Zalu2
#136
CitarBueno pues la vdd puede que sea una pregunta tonta pero tengo esa duda           ¿en todos los lenguajes de programacion se pueden hacer virus, troyanos, etc?

::)

No sé si es mi primer mensaje, estaba registrado en otro foro antes (CUH - Comunidad Underground Hispana) pero ya no está On.  ;D

edito:

Ahora que lo veo la comunidad está de nuevo On  :o pero no puedo publicar el primer mensaje, tenía otro nick  ::)

Zalu2
#137
Dudas y pedidos generales / Re:Como empezar
Diciembre 30, 2013, 04:51:27 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Zalu2
#138
Soy otro de los que votó que SI.

Primero que nada es mi lenguaje favorito, las alternativas que conosco no son muchas, pero me parece que PHP cumple con todos los requerimientos de una buena programación web, sin mencionar que cualquiera puede utilizarlo sin pagar un centavo, hay una increible cantidad de temas de seguridad e inseguridad que retan al programador y lo hacen crecer dia a dia, y como bien dicen, la gran comunidad que se ha creado tanto en inglés como habla hispana.

Aparte es bastante completo (a mi punto de vista), poder "combinarlo" con lenguajes de diseño, manejo de bases de datos, en CLI (Command Line), Frameworks, POO, étc...

Para mi, sin duda es el mejor lenguaje de programación web.

Zalu2


#139
Back-end / Re:Conversor de textos By 2Fac3R v3.0
Noviembre 30, 2013, 10:48:30 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Los siguientes comentarios son en base a que la idea de tu código es que lo utilicen diferentes personas en diferentes ámbitos o contextos.

El primer punto que deberías arreglar es el hecho de no generar dependencias ¿A que me refiero? si tu idea es que la función pueda ser utilizados en diferentes lugares, no deberías tener cosas como un die, porque lo más probable es que no todo el mundo quiera emitir un die si la función falla.

en vez de hacer por ejemplo die("Ha habido un error <a href=''> Regresar! </a>"); deberías devolver FALSO, para que a la hora de utilizar dicha función si yo quiero mandar un díe de esa forma o de otra no tengo que modificar la función.

Quizá parezca una estupidez, pero si te pones a pensar el problema es que esto a esta escala no es un problema porque da igual si tengo que cambiar la funcion una linea para que haga lo que quiero, pero si son muchisimas funciones y resultara que tu función fuera más grande puede significar cambios mayores que podrían ser evitados desde una decición simple de diseño tal como es, lo que propongo.

En otras palabras si tu código tiende a ser reusable o puesto en varios lugares diferentes o por varias personas, lo mas razonable es no asumir que hacer cuando por ejemplo no se solicita una encriptación válida.

En este caso como el código es exageradamente simple, no hay muchas otros puntos donde tengas fallas de este tipo, no obstante si no te haces la costumbre de hacerlo en las cosas chicas, cuando realmente sea necesario, te olvidarás más de una vez, o te dará muchos problemas.

En segunda instancia, debes dejar de utilizar php en formato de etiqueta (para códigos grandes que incluyan funciones y otras cosas que no deberían estar en el mismo archivo), debes empezar a pensar en separar diseño, control y abstracción de la base de datos (obviamente el último punto no aplica a este código, pero si lo digo en general para futuros códigos)

Cuando el código se empieza a poner razonable (más de 2mil lineas de código) tener una mezcla de cosas termina complicando todo, es mejor tener todo bien separado, como dice el dicho, divide y vencerás.

esto es a nivel estructura, en un código tan pequeño como éste no te puedo dar más ejemplos de mejoras estructurales porque no es posible.

dejando esto de lado, también te comento la existencia de una función llamda You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

quizá te interese.

Saludos!

Buenas!

Sobre lo del die() estoy deacuerdo, quizá a modo de ver esto un poco más "grande" es una buena recomendación, en este caso creo que no es necesario, otra cosa (aparte del FALSE) que se puede regresar, es guardar el mensaje de error en una constante, y el usuario solo debería modificar la constante.

En un proyecto que hice con unos amigos hace poco, lo que hacíamos era crear un "capturador de errores" y de ahí nos basabamos, un poco más "profesional".

En el segundo caso claro que lo hago así, modularizar es bastante importante en códigos grandes, incluso mejor si es POO, también lo recomiendo  ;D

Ando checando la función que me pasaste, es interesante lo único que veo es que no tiene tantos algorítmos de cifrado, prefiero usar funciones específicas jeje

Gracias por los comentarios y recomendaciones brot 8)
Zalu2
#140
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Bastante interesante el ejemplo, mi idea era "generar" un switch un poco más compacto, pero la verdad esta idea me ha gustado bastante, me has puesto a pensar bastante xD (me costó entender la sintaxis, creo que estoy un poco oxidado jaja) y no encontré mucha información por papi google.

Ups, lo siento bro, te explico:

locals() te regresa un diccionario con los elementos locales, globals() te regresa un diccionario con los elementos globales. Al regresar un diccionario, puedes acceder a cualquier valor con [] en nuestro caso con [switch("encode")] (que nos regresa: quote) y también le puedes pasar parametros como a una función normal ("You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login")

Así que quedaría algo así: locals()["quote"](parametros) y lo que haría es llamar a la función quote pasándole como parametro "You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login"

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Siempre tienes algo bajo la manga once :P

Zalu2!

Yo culpo a Python, cada día descubres algo nuevo :p

Saludos bro y que bueno verte de nuevo

Si, al parecer lo entendí bien, que bueno que me lo confirmas, la verdad es que python es un lenguaje sorprendente en todos sus sentidos, tambien he visto algunas maravillas con perl  ::)

PD: Por ahí tengo el proyecto que estabamos realizando (el wargame), a ver cuando nos topamos en el skype  :P

Zalu2