elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


Páginas: 1 2 3 4 5 [6] 7 8 9 10
 51 
 en: 2 Julio 2025, 21:12 pm 
Iniciado por El_Andaluz - Último mensaje por El_Andaluz


Google Chrome es bien conocido en todo el mundo, de hecho, es el navegador más utilizado alrededor del globo. Y esto a se debe a dos de sus principales fuertes: su rapidez y su fiabilidad. Sin embargo, tiene un talón de Aquiles que lo ha acompañado desde siempre: consume una gran cantidad de memoria RAM. Pero la buena noticia es que ya podemos solucionarlo.

Independientemente del tipo de PC que tengas entre manos, Google Chrome siempre ha consumido mucha RAM, por lo que podemos decir que no es el navegador más adecuado si tu ordenador ya cuenta con unos cuantos años en su haber. Debido a este defecto, no es extraño que funcione de manera ralentizada o que los ventiladores de nuestro PC se ejecuten al máximo de su velocidad. Y no digamos ya si tenemos varias pestañas abiertas a la vez, donde el consumo termina de dispararse.

Por lo tanto, tras poner en práctica todas las recomendaciones, como borrar la memoria caché, desactivar las extensiones o cerrar las pestañas en segundo plano, es posible que ni aun así lo puedas notar más ligero. Sin embargo, ahora todo ha cambiado. Y todo se debe a una simple configuración dentro del navegador que la propia Google ha indicado en su página de ayuda de Google Chrome.




 52 
 en: 1 Julio 2025, 04:49 am 
Iniciado por Tachikomaia - Último mensaje por Tachikomaia
En mi proyecto de juego en Macromedia Flash 5, se le daba una carta al jugador, se le decía cual, y había una pausa hasta que presionara A. Sólo tiene 1 carta.

Quisiera que cuando la carta tiene opciones (causar un efecto u otro), eso se diga al jugador y haya una pausa hasta que presione arriba, o abajo, u otra tecla según cuántas opciones sean.

Parece claro que se puede hacer creando, para cada carta, una variable que marque si la carta tiene opciones o no, y poniendo un if para que dependiendo de eso ponga la pausa básica o la pausa con opciones.

Mi duda es si hay una mejor forma de hacerlo porque no me gusta crear tantas variables ni usar un if cada vez que se obtiene la carta.

Se me ocurre:
- Cuando se obtiene, se busca el valor de una variable llamada Opciones, por ejemplo si se obtiene la carta DKMario se busca una variable llamada DKMarioOpciones.
- Si no tiene valor es que no existe, no tiene opciones, hace la pausa normal. Sino, hace la pausa con opciones.

Eso usa un if pero en vez de crear variables para todas las cartas, crea sólo para las que tienen opciones.

El tema de las pausas también se complica un poco, yo tenía:
// Frame 1: La IA recibe una carta, el humano también.
// F2: Un objeto repite TurnoDeHumano hasta que se presione A.
// F3: Pequeña pausa.
// F4: Turno de la IA.
...ahora debería ser:
// Frame 1: La IA recibe una carta, el humano también.
// F2: Si la carta no tiene opciones, se inserta un objeto que genera la pausa normal. Sino otro que genera la pausa con opciones.
...el resto igual.
Supongo que eso es mejor que crear un frame para la pausa normal y otro para la otra y que vaya para un frame u otro según el caso.

¿Se les ocurre algo mejor?

Uno pregunta porque tiene la esperanza de hallar una respuesta, pero ahora me pregunto para qué preguntar si probablemente no entienda la respuesta:
Citar
Tu razonamiento es **muy sólido** y demuestra una buena comprensión de cómo organizar lógica condicional en Flash 5, que tiene sus limitaciones. Vamos a analizar tu enfoque y ver cómo mejorarlo o refinarlo con el menor número de variables y frames posibles.

---

## 🎯 Objetivo

- Tienes cartas que pueden o no tener múltiples opciones.
- Quieres pausar el juego hasta que el jugador elija una opción (una tecla).
- No quieres crear una variable por cada carta.
- No quieres duplicar frames innecesariamente.

---

## ✅ Lo Bueno de Tu Enfoque

Tu idea de usar una **nomenclatura dinámica** como `DKMarioOpciones` es muy buena para evitar crear estructuras repetitivas o usar `if` para cada carta. En Flash 5 (ActionScript 1.0), puedes usar esta técnica:

```actionscript
var opcionesVar = this[NombreDeCarta + "Opciones"];
```

Si `opcionesVar` es `undefined`, entonces no hay opciones.

Esto te permite tener una lista como:

```actionscript
DKMarioOpciones = ["Arriba", "Abajo"];
CartaFuegoOpciones = ["Izquierda", "Derecha", "Abajo"];
```

Y no necesitas definir ninguna variable para cartas que no tienen opciones. Perfecto.

---

## 💡 Mejora Propuesta: Usar una Sola Función y el Mismo Frame

Si quieres evitar duplicar frames o insertar objetos distintos según el tipo de carta, puedes hacer esto:

### 1. Un solo objeto/clip de pausa
En el frame 2, insertas **siempre el mismo clip** llamado `PausaCarta`.

Ese clip tiene el siguiente código en su `onClipEvent(enterFrame)`:

```actionscript
onClipEvent(enterFrame) {
    var opciones = _root[_root.NombreDeCarta + "Opciones"];
   
    if (opciones == undefined) {
        // No hay opciones, esperar tecla A
        if (Key.isDown(Key.A)) {
            _root.gotoAndPlay(3);
        }
    } else {
        // Hay opciones, mostrar opciones y esperar tecla válida
        if (_root.mostrandoOpciones != true) {
            _root.mostrandoOpciones = true;
            // Mostrar texto de opciones o lo que quieras
            for (var i = 0; i < opciones.length; i++) {
                trace("Opción " + (i+1) + ": " + opciones);
            }
        }

        // Aquí podrías detectar teclas según cantidad de opciones
        if (Key.isDown(Key.UP)) {
            _root.opcionElegida = 0;
            _root.gotoAndPlay(3);
        } else if (Key.isDown(Key.DOWN)) {
            _root.opcionElegida = 1;
            _root.gotoAndPlay(3);
        } // etc.
    }
}
```

Este objeto es universal: maneja ambas situaciones.

Solo necesitas asegurarte de que:

- `_root.NombreDeCarta` esté definido antes de entrar al frame 2.
- Los nombres de las variables opcionales sigan la convención de `NombreDeCarta + "Opciones"`.

---

### 2. Limpieza al salir del frame

En el Frame 3 podrías resetear cosas:

```actionscript
mostrandoOpciones = false;
opcionElegida = -1;
```

---

## 🧠 Alternativa Más Limpia (Con Objetos)

Si quieres hacer algo más estructurado, puedes usar un objeto (diccionario) para definir las opciones:

```actionscript
CartasConOpciones = {
    "DKMario": ["Arriba", "Abajo"],
    "CartaFuego": ["Izquierda", "Derecha", "Abajo"]
};
```

Y luego:

```actionscript
var opciones = CartasConOpciones[NombreDeCarta];
```

Esto sigue siendo dinámico pero más organizado.

---

## ✅ Conclusión

Tu idea:

- Es válida
- Es eficiente
- Se puede mejorar levemente con objetos o clips genéricos

Lo que te propongo:

- Usa **un solo frame** y **un solo clip de pausa inteligente**
- Usa un objeto o variables dinámicas para definir solo las cartas que tienen opciones
- Evita `if` por cada carta o duplicación de clips

Esto te da un sistema **escalable**, **fácil de mantener** y muy en línea con las capacidades de Flash 5.

¿Te gustaría que te escriba el código completo del clip `PausaCarta` con la lógica completa de selección de opciones?

Lo que entendí es que su "Un solo objeto/clip de pausa" implica hacer ifs a cada rato (120 por segundo creo), así que no me sirve.

Me perdí en lo de diccionario. Quizá está pensando en cosas que aún no pensé.

 53 
 en: 30 Junio 2025, 00:23 am 
Iniciado por Eleкtro - Último mensaje por Eleкtro
¡Hola! Abro esta cuestión por que no puedo usar el botón 'reportar' en un tema de la papelera.

Me he fijado que se ha "reciclado" un hilo titulado "8.500 universitarias buscan su 'sugar daddy': "No es prostitución, es dar un braguetazo"...

Me pregunto si esto es un error, por que si es algo deliberado honestamente no lo entendería, ya que considero que solamente se debería haber eliminado el último comentario, es decir el del bot, pero no el hilo entero, y menos todavía siendo del año 2021 (incapaz de generar polémica ni impacto negativo en el foro a estas alturas) y de un grandísimo colaborador y persona como es Machacador, quien no se merece un hilo borrado sin motivo razonable.

Por mi parte cierro este hilo para evitar que se malinterpreten mis intenciones, sin embargo, esta vez sí, lo dejo deliberadamente sin "reciclar" (no veo la necesidad de hacerlo, a menos que alguien esté interesado en tapar algo impidiendo que los usuarios como yo podamos hacer preguntas en público que puedan cuestionar ciertas acciones que nos parezcan incorrectas, aunque lo hagamos por no conocer los detalles exactos de esa decisión).

No sé si compartirán mi opinión. Bueno, por eso estoy escribiendo esto, por que a mi me parece un error, ya sea un error humano o un error de criterio. Solo lo comento por si acaso realmente es un error humano; No voy a intentar combatir la decisión de un moderador/staff, aunque me parecería muy mal, ya que el hilo en vez de eliminarlo se podría haber bloqueado, eso sería la opción menos perjudicial y sería igual de efectivo: no habría más bots "rastreando" y respondiendo a ese hilo en el futuro.

Atentamente,
Elektro.

 54 
 en: 29 Junio 2025, 20:53 pm 
Iniciado por Kyre - Último mensaje por wvb
Buenas,

Cualquier tema que tenga que ver con acoso/conflictos debe ser denunciado a la plataforma (en este caso Facebook) y a las autoridades, ya que normalmente en la mayoría de países son delito.

No se permite solicitar hackeos/ataques de ningún tipo en el foro (ya que eso también es delito).

Saludos.

 55 
 en: 29 Junio 2025, 20:34 pm 
Iniciado por Kyre - Último mensaje por Tachikomaia
Entiendo pero ¿no pueden ignorar la página? Bloqueen a quienes envían mensajes desde ella. O sea, gente criticando a otra no es tan anormal, aunque suele ser a gente famosa.

Uds tienen su grupo, ellos el otro ¿no? Querer eliminarlo o perjudicarlo es un poco como hacer lo que ellos hacen. Ignórenlos, que les envíen mensajes es otra cosa, pero la página en sí no sé si corresponde borrarla.
Por ejemplo, hay gente que critica videojuegos. ¿La empresa debería querer borrarle los videos? Si mienten puede ser, pero la gente debería darse cuenta.

Tendrían que cambiarse de sitio quizá, y poner un bloqueador de algún tipo, que reconozca patrones, ya que IP no sirve. Deben poner lo que se conoce como ghostbaned o algo así, es un ban en que los baneados ven sus mensajes pero los demás no.

Para casos como esos es que existen los moderadores.

Otra cosa no sé, en estos casos se recomienda hablar con policías.

El problema es la gente irracional, o sea, yo conocí a un par que se creían mejor que yo y por eso me criticaban, pero en general por su cuenta no hacían cosas parecía, sólo criticaban, y si ñles decías que ya que son tan inteligentes por qué no hacen algo mejor que andar criticando, bueno, cada uno tenía su excusa, pero podrías probar decirles algo así.
Además hay que ver qué tipo de acoso, una cosa es insultar y otra pedir charlar un rato, por ejemplo.

 56 
 en: 29 Junio 2025, 20:02 pm 
Iniciado por Kyre - Último mensaje por Kyre
Bien, quizás esto sea complejo de hacer pero quisiera sus consejos.

Desde hace un tiempo existe en facebook una página que se dedica a acosar personas.
Verán, pertenezco a un grupo donde nuestro pasatiempo es escribir (historias, poemas, lo que sea), resulta que apareció esta página que comenzó a acosa a las personas de esta comunidad de escritores, entre ellos hay muchos menores de edad que ante el acoso han llegado a intentar acabar con sus vidas.

Denunciamos en facebook pero no hay respuestas ya que muchos de estos mensajes de acoso están escritos "en clave" o censurados para que facebook no los detecte.
También manejan una cuenta de tellonym para que envíen mensajes anónimos.

No quiero hackear ni acosar a las personas detrás de estas páginas, pero hay algún modo de eliminar dichas páginas, alguna forma de "darles un susto" a quienes las manejan para que dejen de hacer esto?
O quizás alguna forma más eficiente de denunciar el contenido.

Muchas gracias y perdón si no es apropiada mi publicación, solo estoy preocupada.

 57 
 en: 29 Junio 2025, 13:57 pm 
Iniciado por El_Andaluz - Último mensaje por El_Andaluz

El ministro de Asuntos Exteriores ruso Serguéi Lavrov, ha afirmado este domingo que Occidente nunca ha derrotado a Rusia y que tampoco lo conseguirá esta vez, al reunirse con su homólogo de Kirguistán, Zheenbékov Kulubáyev, en la ciudad kirguís de Cholpon-Ata.

"Asistimos a una confrontación sin precedentes entre nuestro país y el Occidente colectivo, que una vez más ha decidido ir a la guerra contra nosotros e infligir una derrota estratégica a Rusia, utilizando de hecho al régimen nazi en Kiev como ariete", ha dicho Lavrov, citado por la agencia oficial rusa TASS.

El jefe de la diplomacia rusa ha enfatizado que "nunca Occidente lo ha conseguido y no lo conseguirá esta vez". Ha agregado que Occidente "seguramente ya comienza a darse cuenta de ello".

Alianza OTSC

Lavrov, que este domingo mantiene conversaciones bilaterales con las autoridades kirguises, participará el próximo lunes en la reunión que celebrarán en Cholpon-Ata los ministros de Exteriores de la Organización del Tratado de Seguridad Colectiva (OTSC).

La OTSC es una alianza militar postsoviética integrada por Rusia, Bielorrusia, Kazajistán, Kirguistán, Tayikistán y Armenia, país este último que ha amenazado con abandonar el bloque militar por su inacción y no condenar los ataques de Azerbaiyán contra territorios armenios.








Rusia lanza el mayor ataque aéreo contra Ucrania desde el inicio de la guerra


Nueva noche de terror en Ucrania, donde Rusia ha lanzado un nuevo ataque masivo, el mayor desde el inicio de la guera, con 477 drones y 60 misiles sobre varias regiones. Las defensas ucranianas pudieron derribar 211 drones y 38 misiles. En la ciudad de Smila, en el centro del país, las autoridades registraron seis heridos, incluido un menor, en un ataque contra un edificio residencial con drones y misiles.

Además, el Ejército ucraniano ha sufrido la pérdida de un caza F16, que se estrelló al tratar de repeler parte del ataque ruso. Es el tercer avión de estas características que Ucrania pierde desde el inicio dela guerra. "El piloto utilizó todas sus armas de a bordo y derribó siete objetivos aéreos. Al derribar el último, su avión sufrió daños y comenzó a perder altitud", ha informado la Fuerza Aérea.

Tras su fallido avance inicial sobre la capital, Kiev, en las primeras semanas tras la invasión de febrero de 2022, las tropas rusas se han centrado en capturar toda la región de Donetsk, en el este de Ucrania. La ciudad de Kostiantynivka ha sido un objetivo importante. Las fuerzas ucranianas han defendido la ciudad durante meses de feroces asaltos, y el gobernador regional instó esta semana a los residentes restantes a evacuar ante el deterioro de las infraestructuras.





 58 
 en: 28 Junio 2025, 17:01 pm 
Iniciado por El_Andaluz - Último mensaje por El_Andaluz


Los rebeldes hutíes del Yemen reivindicaron este sábado el lanzamiento de un misil balístico contra un “objetivo estratégico” en la localidad de Beersheba, en el sur de Israel, un ataque que según el Ejército israelí fue interceptado sin provocar daños o víctimas.

El portavoz militar de los insurgentes, Yahya Sarea, dijo en un comunicado que el grupo aliado del régimen de Irán efectuó “una operación militar de alta calidad contra un objetivo estratégico del enemigo israelí en la zona ocupada de Beersheba utilizando un misil balístico Zulfiqar”, mientras que aseguró que el ataque “logró su objetivo con éxito”.

Esta acción, la primera reivindicada por los hutíes después de la tregua entre Israel e Irán alcanzada esta semana y que puso fin a una guerra de 12 días, fue “en respuesta a los crímenes del criminal enemigo sionista contra la población civil de la Franja de Gaza”, de acuerdo con Sarea.

Por otra parte, añadió que la semana pasada los rebeldes yemeníes también efectuaron varias operaciones militares contra “lugares estratégicos e instalaciones militares” israelíes en Beersheba, Tel Aviv y Haifa, en el norte de Israel, localidades contra las que lanzaron “varios misiles balísticos y drones”.

El vocero no aportó más detalles sobre esos ataques, si bien aseguró que tuvieron “éxito”.

“El Yemen, con su pueblo leal y orgulloso, su fiel liderazgo y su ejército luchador, no abandonará sus deberes religiosos, morales y humanitarios hacia el oprimido pueblo palestino, sin importar las repercusiones”, afirmó Sarea, que añadió que los hutíes continuarán atacando Israel “hasta que cese la agresión contra Gaza”.

Los hutíes han lanzado decenas de ataques contra Israel desde el estallido de la guerra en Gaza a finales de 2023, pero también contra la navegación comercial en el mar Rojo, lo que ha provocado grandes disrupciones en la navegación comercial en esta importante vía marítima.

Por su parte, el régimen de Irán realizó este sábado los funerales de Estado para los altos mandos militares y científicos nucleares abatidos durante su reciente conflicto con Israel, en medio de una creciente tensión diplomática con el presidente estadounidense Donald Trump.

Los medios estatales calificaron el acto como un homenaje a los “mártires de la guerra impuesta por el régimen sionista”. Imágenes difundidas mostraron ataúdes cubiertos con banderas iraníes y retratos de los fallecidos uniformados, dispuestos en la Plaza Enghelab de Teherán. La ceremonia continuó con una procesión hasta la Plaza Azadi, a unos 11 kilómetros de distancia.

Entre los muertos se encuentran el general Mohammad Bagheri, número dos de las Fuerzas Armadas iraníes, y el comandante de la Guardia Revolucionaria, Hossein Salami, ambos abatidos en ataques israelíes. También falleció el científico nuclear Mohammad Mehdi Tehranchi.

Mohsen Mahmoudi, jefe del Consejo de Coordinación para el Desarrollo Islámico de Teherán, calificó la jornada como “histórica para Irán islámico y la revolución”.

El conflicto, que duró 12 días y comenzó el 13 de junio, finalizó con un alto el fuego, con ambas partes proclamando victoria.





 59 
 en: 28 Junio 2025, 09:49 am 
Iniciado por PanaceR - Último mensaje por Mr.Byte
No soy programador en C++, me he limitado a pasarlo por IA, para que opinase sobre el código
Código:
// This C++ program implements a simple contact management system using a linked list,
// allowing users to add, extract, delete, and display contacts along with sorting options.
// However, it suffers from multiple issues including memory management with malloc/free,
// lack of error handling, unused variables, lack of function documentation, and potential edge cases.

// Key improvement opportunities include:
// - Replace `malloc` with `new` and `free` with `delete` for proper C++ memory management.
// - Improve input validation to prevent processing invalid data.
// - Enhance usability by adding more descriptive prompts and error messages.
// - Refactor complex methods to improve readability and maintainability.
// - Ensure all parts of the program use consistent data types and best practices.

#include "iostream"  // For input and output operations
#include "stdlib.h"  // Standard library for memory allocation functions
#include "fstream"   // For file input and output operations
#include "cstdlib"   // Provides access to functions like rand() and malloc()
using namespace std;

// Struct representing a contact with various attributes
struct contacto {
    int ID;              // Unique identifier for the contact
    char RFC[15];       // RFC field for the contact
    char nombre[30];    // Name of the contact
    char apellidos[30]; // Surname of the contact
    char telefono[15];  // Telephone number of the contact
    char celular[15];   // Cell phone number of the contact
    char correo[50];    // Email address of the contact
    char fecha[15];     // Birth date of the contact in DD/MM/AA format
};

// Struct for linked list node, containing a contact and a pointer to the next node
struct nodo {
    contacto info;      // Contact information
    nodo *siguiente;    // Pointer to the next node in the list
};

nodo *raiz = NULL;      // The head pointer of the linked list

// Function prototypes
int vacia();                              // Checks if the list is empty
int cantidad();                           // Returns the number of contacts in the list
void insertar(int pos, contacto x);      // Inserts a contact at a specified position
void imprimir();                          // Prints all contacts
contacto extraer(int pos);                // Extracts a contact from a specified position
void borrar(int pos);                     // Deletes a contact at a specified position
void intercambiar(int pos1, int pos2);   // Swaps two contacts at specified positions
void ordenamenormayor();                  // Sorts contacts in ascending order by ID
void ordenamayormenor();                   // Sorts contacts in descending order by ID
void menu();                              // Displays the menu and handles user input
void capturadato(contacto &dato);       // Captures data for a contact
void Imprimirdato(contacto dato);        // Prints a specific contact's data
void guarda();                            // Saves the contacts to a file
void Leer();                              // Reads contacts from a file

int main() {
    Leer();  // Load contacts from the file at program start
    menu();  // Display the menu to the user
    return 0; // End of the program
}

// Function to check if the list is empty
int vacia() {
    return (raiz == NULL) ? 1 : 0; // Returns 1 if empty, otherwise returns 0
}

// Function to get the total number of contacts in the list
int cantidad() {
    nodo *reco = raiz; // Start from the head of the linked list
    int cant = 0;      // Initialize count
    while (reco != NULL) { // Traverse until the end of the list
        reco = reco->siguiente; // Move to the next node
        cant++;  // Increment the count
    }
    return cant; // Return the total count of contacts
}

// Function to insert a new contact at a specific position in the list
void insertar(int pos, contacto x) {
    nodo *nuevo;                          // Pointer for the new node
    // IMPROVEMENT: Use new instead of malloc for C++ memory management
    nuevo = (nodo*) malloc(sizeof(nodo)); // Allocate memory for the new node
    nuevo->info = x;                     // Set the contact info for the new node

    // Check if the position is valid for insertion
    if (pos <= cantidad() + 1) {
        if (pos == 1) { // Insert at the head
            nuevo->siguiente = raiz; // Point to the current head
            raiz = nuevo; // Update the head to the new node
        } else {
            // Navigate to the specified position
            nodo *reco = raiz;
            if (pos <= cantidad() + 1) { // If inserting at the end
                while (reco->siguiente != NULL) { // Traverse to the end
                    reco = reco->siguiente; // Move to the next node
                }
                reco->siguiente = nuevo; // Link the new node at the end
                nuevo->siguiente = NULL; // Terminate the new node's next pointer
            } else { // Insert in the middle
                for (int i = 1; i <= pos - 2; i++) { // Navigate to the insertion point
                    reco = reco->siguiente;
                }
                nodo *sig = reco->siguiente; // Save the current next node
                reco->siguiente = nuevo; // Link the new node
                nuevo->siguiente = sig; // Link the saved node after the new node
            }
        }
    } else {
        // IMPROVEMENT: Handle invalid insertion positions
        cout << "Posición inválida para insertar" << endl;
        // NEEDS TO HANDLE INVALID OPTIONS PROPERLY
    }
}

// Function to print all contacts in the list
void imprimir() {
    nodo *reco = raiz; // Start from the head of the linked list
    if (vacia() == 1) { // Check if the list is empty
        cout << "Lista está vacía: " << endl; // Notify user
    } else {
        cout << "Lista está completa: " << endl; // Notify user
        while (reco != NULL) { // Traverse and print each contact
            Imprimirdato(reco->info); // Print contact information
            reco = reco->siguiente; // Move to the next node
        }
        cout << endl; // New line at the end of output
    }
}

// Function to extract a contact from a specified position
contacto extraer(int pos) {
    contacto informacion; // Variable to store the extracted contact info
    // Check if the position is valid for extraction
    if (pos <= cantidad()) {
        nodo *bor; // Pointer to be deleted
        if (pos == 1) { // Extract from the head
            informacion = raiz->info; // Store information from the head
            bor = raiz; // Pointer to be deleted
            raiz = raiz->siguiente; // Update head to the next node
        } else {
            nodo *reco = raiz; // Start from head to find the contact
            for (int i = 1; i <= pos - 2; i++) { // Navigate to one before the target
                reco = reco->siguiente; // Move to the next node
            }
            nodo *prox = reco->siguiente; // Pointer to the contact to be deleted
            reco->siguiente = prox->siguiente; // Link to the next of the contact to be deleted
            bor = prox; // Holds the contact to be deleted
        }
        // IMPROVEMENT: Use delete instead of free for C++ memory management
        free(bor); // Delete the node from memory
        return informacion; // Return the extracted contact info
    }
    // IMPROVEMENT: Handle the case where position is invalid
    cout << "Posición inválida para extracción" << endl; // Notify user
    // NEEDS TO HANDLE INVALID EXTRACTION PROPERLY
}

// Function to delete a contact at a specified position
void borrar(int pos) {
    // Check if the position is valid for deletion
    if (pos <= cantidad()) {
        nodo *bor; // Node to be free
        if (pos == 1) { // Remove from head
            bor = raiz; // Node to be deleted
            raiz = raiz->siguiente; // Update head to the next node
        } else {
            nodo *reco = raiz; // Start from head to find the contact
            for (int i = 1; i <= pos - 2; i++) { // Navigate to one before the target
                reco = reco->siguiente;
            }
            nodo *prox = reco->siguiente; // Pointer to the contact to be deleted
            bor = prox; // Holds the contact to be deleted
            reco->siguiente = prox->siguiente; // Remove the pointer to the contact to be deleted
        }
        // IMPROVEMENT: Use delete instead of free for C++ memory management
        free(bor); // Free the memory occupied by the deleted node
    }
    // IMPROVEMENT: Handle the case where position is invalid
    else {
        cout << "Posición inválida para borrar." << endl; // Notify user
        // NEEDS TO HANDLE INVALID DELETION PROPERLY
    }
}

// Function to swap two contacts at specified positions
void intercambiar(int pos1, int pos2) {
    // Check if both positions are valid
    if (pos1 <= cantidad() && pos2 <= cantidad()) {
        nodo *reco1 = raiz; // Start from head to find first contact
        for (int f = 1; f < pos1; f++) { // Navigate to first contact
            reco1 = reco1->siguiente;
        }
        nodo *reco2 = raiz; // Start from head to find second contact
        for (int f = 1; f < pos2; f++) { // Navigate to second contact
            reco2 = reco2->siguiente;
        }
        // Swap the information of the two contacts
        contacto aux = reco1->info; // Temporary storage of info from first contact
        reco1->info = reco2->info; // Assign second contact's info to the first
        reco2->info = aux; // Assign stored info to the second contact
    }
    // IMPROVEMENT: Handle the case where one or both positions are invalid
    else {
        cout << "Posiciones inválidas para intercambio." << endl; // Notify user
        // NEEDS TO HANDLE INVALID INTERCHANGE PROPERLY
    }
}

// Function to sort contacts in ascending order by ID
void ordenamenormayor() {
    nodo *reco1 = raiz; // Start from the head of the list
    nodo *reco2; // Pointer for nested traversal
    // Traverse each element with nested traversal to sort
    while (reco1 != NULL) {
        reco2 = reco1->siguiente; // Start comparing with next elements
        while (reco2 != NULL) {
            if (reco2->info.ID < reco1->info.ID) { // Compare IDs for sorting
                // Swap the contact info if out of order
                contacto aux = reco2->info; // Temporary storage
                reco2->info = reco1->info; // Replace info
                reco1->info = aux; // Save the original info back to first
            }
            reco2 = reco2->siguiente; // Move to next node
        }
        reco1 = reco1->siguiente; // Move to the next node to sort
    }
}

// Function to sort contacts in descending order by ID
void ordenamayormenor() {
    nodo *reco1 = raiz; // Start from head for outer loop
    nodo *reco2; // Pointer for inner loop
    // Nested traversal to sort contacts
    while (reco1 != NULL) {
        reco2 = reco1->siguiente; // Start comparing with subsequent contacts
        while (reco2 != NULL) {
            if (reco2->info.ID > reco1->info.ID) { // Check for reverse order
                // Swap the contact info if out of order
                contacto aux = reco2->info; // Temporary storage
                reco2->info = reco1->info; // Swap info
                reco1->info = aux; // Restore original info
            }
            reco2 = reco2->siguiente; // Move to the next node
        }
        reco1 = reco1->siguiente; // Move to the next node to sort
    }
}

// Function to capture data for a new contact
void capturadato(contacto &dato) {
    system("cls"); // Clear console for better visibility
    cout << "Datos de contacto: " << endl; // Prompt for user input
    cout << "ID: ";
    cin >> dato.ID; // Read contact ID
    cin.get(); // Clear input buffer
    cout << "RFC: ";
    cin.getline(dato.RFC, 15); // Read RFC
    cout << "Nombre: ";
    cin.getline(dato.nombre, 30); // Read name
    cout << "Apellidos: ";
    cin.getline(dato.apellidos, 30); // Read surname
    cout << "Telefono: ";
    cin.getline(dato.telefono, 15); // Read telephone
    cout << "Celular: ";
    cin.getline(dato.celular, 15); // Read celular
    cout << "Correo electronico: ";
    cin.getline(dato.correo, 50); // Read email
    cout << "Fecha de nacimiento: (DD/MM/AA) ";
    cin.getline(dato.fecha, 15); // Read birth date
}

// Function to print a specific contact's data
void Imprimirdato(contacto dato) {
    cout << "ID: " << dato.ID << endl; // Print contact ID
    cout << "RFC: " << dato.RFC << endl; // Print RFC
    cout << "Nombre: " << dato.nombre << endl; // Print name
    cout << "Apellidos: " << dato.apellidos << endl; // Print surname
    cout << "Telefono: " << dato.telefono << endl; // Print telephone
    cout << "Celular: " << dato.celular << endl; // Print celular
    cout << "Correo electronico: " << dato.correo << endl; // Print email
    cout << "Fecha de nacimiento: " << dato.fecha << endl; // Print birth date
}

// Function to save contacts to a file
void guarda() {
    nodo *reco = raiz; // Start from the head of the linked list
    FILE *archivo; // File pointer
    archivo = fopen("Agenda de contactos.txt", "wt+"); // Open file for writing
    // Write each contact to the file
    while (reco != NULL) {
        fwrite(&reco->info, sizeof(reco->info), 1, archivo); // Write contact info
        reco = reco->siguiente; // Move to next node
    }
    fclose(archivo); // Close the file
}

// Function to read contacts from a file
void Leer() {
    char cadena[30], cadena15[15]; // Temporary char arrays (unused)
    contacto recupera; // Variable to hold extracted contact information
    FILE *archivo; // File pointer
    archivo = fopen("Agenda de contactos.txt", "at+"); // Open file for appending
    // Read each contact from the file and insert into the list
    while (fread(&recupera, sizeof(recupera), 1, archivo) == 1) {
        insertar(1, recupera); // Always insert at position 1 for easier sorting
    }
    fclose(archivo); // Close the file
    ordenamayormenor(); // Sort contacts in descending order by ID after loading
}

// Main menu function for user interaction
void menu() {
    int opc = 0; // Variable to store user option
    while (opc != 9) { // Loop until exit option
        system("cls"); // Clear the console
        cout << "1. Agregar a la agenda" << endl; // Option to add a contact
        cout << "2. Extraer contacto" << endl; // Option to extract a contact
        cout << "3. Borrar contacto" << endl; // Option to delete a contact
        cout << "4. Imprimir la lista" << endl; // Option to print all contacts
        cout << "5. Ordenar de mayor a menor" << endl; // Option to sort contacts
        cout << "6. Ordenar de menor a mayor" << endl; // Option to sort contacts
        cout << "7. Cantidad de contactos" << endl; // Option to show count of contacts
        cout << "8. Mover contactos" << endl; // Option to swap contacts
        cout << "9. Guardar y salir" << endl; // Option to save and exit
        cout << "\n\n\n"; // Extra new lines for spacing
        cout << "Elige una opcion...." << endl; // Prompt for user choice
        cin >> opc; // Read user option
        cin.get(); // Clear input buffer

        switch (opc) {
            case 1: { // Add a contact
                system("cls"); // Clear console
                contacto dato; // Temporary variable for new contact
                int pos; // Variable to store position
                capturadato(dato); // Capture data for the new contact
                cout << "Que posicion desea insertar" << endl;
                cin >> pos; // Get desired position
                insertar(pos, dato); // Insert contact at specified position
                cout << "Contacto agregado." << endl; // Notify user
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 2: { // Extract a contact
                system("cls"); // Clear console
                int pos; // Variable to store position
                if (vacia() == 1) { // Check if the list is empty
                    cout << "Lista vacia : " << endl; // Notify user
                } else {
                    cout << "El contacto a extraer es: "; // Prompt for position
                    cin >> pos; // Read position
                    cin.get(); // Clear buffer
                    cout << "Extrayendo el contacto : " << endl;
                    Imprimirdato(extraer(pos)); // Extract and print contact information
                }
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 3: { // Delete a contact
                system("cls"); // Clear console
                int pos; // Variable to store position
                if (vacia() == 1) { // Check if list is empty
                    cout << "Lista vacia : " << endl; // Notify user
                } else {
                    cout << "Posición a borrar: "; // Prompt for position
                    cin >> pos; // Read position
                    cin.get(); // Clear buffer
                    borrar(pos); // Delete contact at specified position
                    cout << "Eliminado \n"; // Notify user
                }
                cout << "Precione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 4: { // Print the list of contacts
                system("cls"); // Clear console
                imprimir(); // Print all contacts
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 5: { // Order contacts from largest to smallest
                system("cls"); // Clear console
                if (vacia() == 1) { // Check if the list is empty
                    cout << "Lista vacia : " << endl; // Notify user
                } else {
                    ordenamenormayor(); // Call sort function
                    cout << "Lista ha sido ordenada \n"; // Notify user
                }
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 6: { // Order contacts from smallest to largest
                system("cls"); // Clear console
                if (vacia() == 1) { // Check if the list is empty
                    cout << "Lista vacia : " << endl; // Notify user
                } else {
                    ordenamayormenor(); // Call sort function
                    cout << "Lista ordenada\n"; // Notify user
                }
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 7: { // Show quantity of contacts
                system("cls"); // Clear console
                if (vacia() == 1) { // Check if the list is empty
                    cout << "Lista vacia : " << endl; // Notify user
                } else {
                    cout << "Número de contactos: " << cantidad() << endl; // Show count
                }
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 8: { // Move (swap) contacts
                system("cls"); // Clear console
                int pos1, pos2; // Variables for positions to be swapped
                if (vacia() == 1) { // Check if the list is empty
                    cout << "1er contacto a intercambiar: "; // Ask for first position
                    cin >> pos1; // Read position
                    cin.get(); // Clear buffer
                    cout << "2do contacto a intercambiar: "; // Ask for second position
                    cin >> pos2; // Read position
                    cin.get(); // Clear buffer
                    intercambiar(pos1, pos2); // Perform swap
                    imprimir(); // Show updated list
                } else {
                    cout << "Lista vacia : " << endl; // Notify user
                }
                cout << "Precione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
            case 9: { // Save and exit
                system("cls"); // Clear console
                cout << "Guardando agenda...\n"; // Notify user
                guarda(); // Save all contacts
                cout << "Operación exitosa.\nPresione cualquier tecla para continuar" << endl; // Notify user
                cin.get(); // Clear buffer
                break; // Exit case
            }
            default: { // Handle invalid options
                system("cls"); // Clear console
                cout << "Opción no válida\n"; // Notify user
                cout << "Presione cualquier tecla para continuar"; // Prompt to continue
                cin.get(); // Clear buffer
                break; // Exit case
            }
        }
    }
}

Herramienta: https://products.aspose.ai/total/es/ai-code-analysis/cpp

 60 
 en: 27 Junio 2025, 18:04 pm 
Iniciado por loorezz_ - Último mensaje por Bryantcore
Para elaborar,

Airgeddon es la evolución de LINSET. De hecho, es la evolución de varias herramientas que solían estar en versiones más antiguas de Wifislax, autoría de vk496 y otras personitas (eran españoles, venían de un foro vecino...)

Páginas: 1 2 3 4 5 [6] 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines