martes, 7 de septiembre de 2021

Método de selección en C++

 Consiste en lo siguiente:

  • Buscas el elemento más pequeño de la lista.
  • Lo intercambias con el elemento ubicado en la primera posición de la lista.
  • Buscas el segundo elemento más pequeño de la lista.
  • Lo intercambias con el elemento que ocupa la segunda posición en la lista.
  • Repites este proceso hasta que hayas ordenado toda la lista.

Pseudocódigo en C++


for (i=0; i<TAM - 1; i++)
pos_men = Menor(lista, i);
temp = lista[i];
lista[i] = lista [pos_men];
lista [pos_men] = temp;

Nota: Menor(lista, i) es una función que busca el menor elemento entre las posiciones i y TAM-1. 

Ejemplo:


Vamos a ordenar la siguiente lista (la misma del ejemplo anterior):
4 - 3 - 5 - 2 - 1
Comenzamos buscando el elemento menor entre la primera y última posición. Es el 1. Lo intercambiamos con el 4 y la lista queda así:
1 - 3 - 5 - 2 - 4
Ahora buscamos el menor elemento entre la segunda y la última posición. Es el 2. Lo intercambiamos con el elemento en la segunda posición, es decir el 3. La lista queda así:
1 - 2 - 5 - 3 - 4
Buscamos el menor elemento entre la tercera posición y la última. Es el 3, que intercambiamos con el 5:
1 - 2 - 3 - 5 - 4
El menor elemento entre la cuarta y quinta posición es el 4, que intercambiamos con el 5:
1 - 2 - 3 - 4 - 5


Código en C++


#include <iostream>

#include <time.h>//librería ara usar random

#define TAM 10 //se define una variable global

 

int main()

{

    //declaración de las variables a utilizar

    //  temp:para almacenar temporalmente un número

    //  lista:los elementos a ordenar

    //  TAM:tamaño de la lista

    // i, j:para usarse en los ciclos

    int temp, i, j;

    int lista[TAM];

    srand(time(NULL));

    //llenar vector con valores aleatorios

    for (i = 0; i < TAM; i++)

    {

        lista[i] = rand() % 100;//generación de números aleatorios

    }

 

    //imprimir arreglo desordenado, \n para el salto de línea

    printf("Vector desordenado\n");

    for (i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

    }

 

    //ciclos anidados para ordenar los elementos con inserción

    for (i = 1; i < TAM; i++)

    {

        temp = lista[i];//se almacena el número en temp

        j = i - 1;//asignamos a j el valor de i menos 1 para comparar con el elemento anterior

        while ((lista[j] > temp) && (j >= 0))//mientras los elementos sean mayores a temp y todavía tengamos elementos

        {

            lista[j + 1] = lista[j];//al ser mayor lo almacenamos en la posición j+1

            j--;//decrementamos j

            lista[j + 1] = temp;//almacenamos temporal en j+1

        }

    }

 

    //imprimir vector ordenado

    printf("\n");

    printf("Vector ordenado\n");

    for (int i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

 

    }

 

    //detener la pantalla pidiendo un caracter de entrada

    int flag = getchar();

}

 

Ventajas:

  • Fácil implementación.
  • Requerimientos mínimos de memoria.

Desventajas:

  • Lento.
  • Realiza numerosas comparaciones.

lunes, 6 de septiembre de 2021

Método burbuja en C++

 

Descripción

Consiste en ciclar repetidamente a través de la lista, comparando elementos adyacentes de dos en dos. Si un elemento es mayor que el que está en la siguiente posición se intercambian. 

Pseudocódigo en C++


for (i=1; i<TAM; i++)
    for j=0 ; j<TAM - 1; j++)
if (lista[j] > lista[j+1])
temp = lista[j];
lista[j] = lista[j+1];
lista[j+1] = temp;


Ejemplo

Tenemos la siguiente lista:
4 - 3 - 5 - 2 - 1
Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos comparando el primero con el segundo elemento. 4 es mayor que 3, así que intercambiamos. Ahora tenemos:
3 - 4 - 5 - 2 - 1
Ahora comparamos el segundo con el tercero: 4 es menor que 5, así que no hacemos nada. Continuamos con el tercero y el cuarto: 5 es mayor que 2. Intercambiamos y obtenemos:
3 - 4 - 2 - 5 - 1
Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos nuevamente:
3 - 4 - 2 - 1 - 5
Repitiendo este proceso vamos obteniendo los siguientes resultados:
3 - 2 - 1 - 4 - 5
2 - 1 - 3 - 4 - 5
1 - 2 - 3 - 4 - 5

Código


#include <iostream>

#include <time.h>//librería ara usar random

#define TAM 10 //se define una variable global

using namespace std;//para usar strings

 

int main()

{

    //declaración de las variables a utilizar

    //  temp:para almacenar temporalmente un número

    //  lista:los elementos a ordenar

    //  TAM:tamaño de la lista

    int temp;

    int lista[TAM];

    srand(time(NULL));

    //llenar vector con valores aleatorios

    for (int i = 0; i < TAM; i++)

    {

        lista[i]=rand()%100;//generación de números aleatorios

    }

 

    //imprimir arreglo desordenado, \n para el salto de línea

    printf("Vector desordenado\n");

    for (int i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

    }

 

    //ciclos anidados para ordenar los elementos con método burbuja

    for (int i = 1; i < TAM; i++)

    {

        for (int j = 0; j < TAM - 1; j++)

        {

            if (lista[j] > lista[j + 1])//se compara el elemento actual con el elemento siguiente

            {

                temp = lista[j];//se almacena temporalmente el elemento actual

                lista[j] = lista[j + 1];//al elemento actual lo reemplazamos por el siguiente

                lista[j + 1] = temp;//reemplazamos al elemento siguiente por el elemento almacenado en el valor temporal

            }

        }

    }

 

    //imprimir vector ordenado

    printf("\n");

    printf("Vector ordenado\n");

    for (int i = 0; i < TAM; i++)

    {

        printf("%d\t", lista[i]);//\t da la tabulación o con \n para salto de línea

 

    }

 

    //detener la pantalla pidiendo un caracter de entrada

    int flag = getchar();

}


Ventajas:

Fácil implementación.

No requiere memoria adicional.

Desventajas:

Muy lento.

Realiza numerosas comparaciones.

Realiza numerosos intercambios.


martes, 5 de enero de 2021

Autómata en C#

 

using System;

 

namespace ej_automata

{

    class Program

    {

        static void Main(string[] args)

        {

            //mostrar en pantalla que inserte la cadena a validar

            Console.WriteLine("Inserte una cadena");

            //leer la cadena escrita y almacenarla en una variable

            string cadena = Console.ReadLine();

            //estado inicial del autómata

            int estado_inicial=1;

            //estado final del autómata

            int estado_final = 1;

            //asignar el esatdo en el que inicia el autómata

            //la variable estado actual servirá para ir almacenando el estado en

            //el que está el autómata

            int estado_actual = estado_inicial;

 

            //con un ciclo for recorremos cada uno de los elementos de la cadena

            for (int i = 0; i < cadena.Length; i++)

            {

                //mediante el switch case podemos recorrer cada uno de los estados del autómata

                //y con los if podemos evaluar que pasa de acuerod al caracter que entra (letra)

                switch (estado_actual)

                {

                    case 1:

                        if (Equals(cadena[i], '1'))

                        {

                            estado_actual = 1;

                         }

                        if (Equals(cadena[i], '0'))

                        {

                            estado_actual = 2;

                        }

                        break;

                    case 2:

                        if (Equals(cadena[i], '1'))

                        {

                            estado_actual = 2;

                        }

                        if (Equals(cadena[i], '0'))

                        {

                            estado_actual = 1;

                        }

                        break;

                }

            }

 

            //se valida si el autómata quedó en el estado final

            if (estado_actual == estado_final)

            {

                Console.WriteLine("Cadena válida");

            }

            else

            {

                Console.WriteLine("Cadena inválida");

            }

 

            Console.ReadKey();

        }

    }

}

sábado, 12 de diciembre de 2020

Sistema de registro e inicio de sesión con HTML,PHP y MySQL

Este sistema de usuarios está elaborado con HTML y php, la base de datos para registra usuarios se creó en MySQL. Para el host local se utilizó wampserver.  Los archivos del sistema están en el siguiente enlace.

Los archivos son: 

config.php

index.php

login.php

logout.php

register.php

reset-password.php

y el script de la tabla users es:

users.sql


No tiene agregado CSS para mejor comprensión del código.


config.php

<?php

/* Credenciales de la base de datos. Suponiendo que está ejecutando MySQL

 con configuración predeterminada (usuario 'root' sin contraseña) */

define('DB_SERVER', 'localhost');//nombre del servidor

define('DB_USERNAME', 'root');//nombre de usuario del servidor

define('DB_PASSWORD', '');//contraseña del servidor

define('DB_NAME', 'db_usuarios');//nombre de la base de datos

 

/* Prueba de conexión a la base de datos MySQL*/

$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

 

// Se verifica la conexión, si no se puede realizar se indica el error

if($link === false){

    die("ERROR: Could not connect. " . mysqli_connect_error());

}

?>




index.php


<?php

// Se inicializa la sesión

session_start();

 

/* Se comprueba si el usuario ha iniciado sesión, si no, se redirecciona

 a la página de inicio de sesión (login.php)*/

if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){

    header("location: login.php");

    exit;

}

?>


<!DOCTYPE html>

<html lang="es">

<head>

<meta charset="UTF-8">

<title>Bienvenido</title>  

</head>

<body>

<h1>Hola, <b><?php echo htmlspecialchars($_SESSION["username"]); ?></b>. Has ingresado al sitio.</h1>

   

<p>

<a href="logout.php">Cerrar sesión</a><br>

<a href="reset-password.php" >Cambiar contraseña</a>

</p>

<p>

Nuestro sistema cuenta con ....

</p>

</body>

</html>


login.php

<?php

// Inicializa la sesión

session_start();

 

/* Verifique si el usuario ya ha iniciado sesión, si es así, 

rediríjalo a la página de bienvenida (index.php)*/

if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){

  header("location: index.php");

  exit;

}

 

// Incluir el archivo de configuración

require_once "config.php";

 

// Definir variables e inicializar con valores vacíos

$username = $password = $username_err = $password_err = "";

 

// Procesamiento de datos del formulario cuando se envía el formulario

if($_SERVER["REQUEST_METHOD"] == "POST"){

 

    // Comprobar si el nombre de usuario está vacío

    if(empty(trim($_POST["username"]))){

        $username_err = "Por favor ingrese su usuario.";

    } else{

        $username = trim($_POST["username"]);

    }

    

    // Comprobar si la contraseña está vacía

    if(empty(trim($_POST["password"]))){

        $password_err = "Por favor ingrese su contraseña.";

    } else{

        $password = trim($_POST["password"]);

    }

    

    // Validar información del usuario

    if(empty($username_err) && empty($password_err)){

        // Preparar la consulta select

        $sql = "SELECT id, username, password FROM users WHERE username = ?";

        

        if($stmt = mysqli_prepare($link, $sql)){

            /* Vincular variables a la declaración preparada como parámetros, s es por la

variable de tipo string*/

            mysqli_stmt_bind_param($stmt, "s", $param_username);

            

            // Asignar parámetros

            $param_username = $username;

            

            // Intentar ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                // almacenar el resultado de la consulta

                mysqli_stmt_store_result($stmt);

                

                /*Verificar si existe el nombre de usuario, si es así,

verificar la contraseña*/

                if(mysqli_stmt_num_rows($stmt) == 1){                    

                    // Vincular las variables del resultado

                    mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);

//obtener los valores de la consulta

                    if(mysqli_stmt_fetch($stmt)){

/*comprueba que la contraseña ingresada sea igual a la 

almacenada con hash*/

                        if(password_verify($password, $hashed_password)){

                            // La contraseña es correcta, así que se inicia una nueva sesión

                            session_start();

                            

                            // se almacenan los datos en las variables de la sesión

                            $_SESSION["loggedin"] = true;

                            $_SESSION["id"] = $id;

                            $_SESSION["username"] = $username;                            

                            

                            // Redirigir al usuario a la página de inicio

                            header("location: index.php");

                        } else{

                            // Mostrar un mensaje de error si la contraseña no es válida

                            $password_err = "La contraseña que ha ingresado no es válida.";

                        }

                    }

                } else{

                    // Mostrar un mensaje de error si el nombre de usuario no existe

                    $username_err = "No existe cuenta registrada con ese nombre de usuario.";

                }

            } else{

                echo "Algo salió mal, por favor vuelve a intentarlo.";

            }

        }

        

        // Cerrar la sentencia de consulta

        mysqli_stmt_close($stmt);

    }

    

    // Cerrar laconexión

    mysqli_close($link);

}

?>

 

<!DOCTYPE html>

<html lang="es">

<head>

<meta charset="UTF-8">

<!link href="CSS/estilo_form.css" rel="stylesheet" type="text/css">

<title>Inicio de sesión</title>

</head>

<body>

    

        <h2>Inicio de sesión</h2>

        <p>Por favor, introduzca usuario y contraseña para iniciar sesión.</p>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">

                <label>Usuario</label>

                <input type="text" name="username"  value="<?php echo $username; ?>">

                <span ><?php echo $username_err; ?></span><br>

              

                <label>Contraseña</label>

                <input type="password" name="password">

                <span ><?php echo $password_err; ?></span><br>

            

            

                <input type="submit"  value="Ingresar"><br>

                <p>¿No tienes una cuenta? <a href="register.php">Regístrate ahora</a>.</p>

        </form>

     

</body>

</html>



logout.php

<?php

// Se inicia la sesión

session_start();

 

// se desasignan todas las variables de sesión

$_SESSION = array();

 

// se destruye la sesión

session_destroy();

 

// se redirecciona a la página de inicio de sesión (login.php)

header("location: login.php");

//se sale del archivo

exit;

?>




register.php

<?php

// se incluye el archivo de configuración

require_once "config.php";

 

// Definir variables e inicializar con valores vacíos

$username = $password = $confirm_password = "";

$username_err = $password_err = $confirm_password_err = "";

 

// Procesamiento de datos del formulario cuando se envía el formulario

if($_SERVER["REQUEST_METHOD"] == "POST"){

 

    // Validar el nombre de usuario

    if(empty(trim($_POST["username"]))){

        $username_err = "Por favor ingrese un usuario.";

    } else{

        // Preparar la consulta

        $sql = "SELECT id FROM users WHERE username = ?";

        

        if($stmt = mysqli_prepare($link, $sql)){

            // Vincular variables a la declaración preparada como parámetros

            mysqli_stmt_bind_param($stmt, "s", $param_username);

            

            // asignar parámetros

            $param_username = trim($_POST["username"]);

            

            // Intentar ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                /* almacenar resultado*/

                mysqli_stmt_store_result($stmt);

                

                if(mysqli_stmt_num_rows($stmt) == 1){

                    $username_err = "Este usuario ya fue tomado.";

                } else{

                    $username = trim($_POST["username"]);

                }

            } else{

                echo "Al parecer algo salió mal.";

            }

        }

         

        // Declaración de cierre

        mysqli_stmt_close($stmt);

    }

    

    // Validar contraseña

    if(empty(trim($_POST["password"]))){

        $password_err = "Por favor ingresa una contraseña.";     

    } elseif(strlen(trim($_POST["password"])) < 6){

        $password_err = "La contraseña al menos debe tener 6 caracteres.";

    } else{

        $password = trim($_POST["password"]);

    }

    

    // Validar que se confirma la contraseña

    if(empty(trim($_POST["confirm_password"]))){

        $confirm_password_err = "Confirma tu contraseña.";     

    } else{

        $confirm_password = trim($_POST["confirm_password"]);

        if(empty($password_err) && ($password != $confirm_password)){

            $confirm_password_err = "No coincide la contraseña.";

        }

    }

    

    // Verifique los errores de entrada antes de insertar en la base de datos

    if(empty($username_err) && empty($password_err) && empty($confirm_password_err)){

        

        // Prepare una declaración de inserción

        $sql = "INSERT INTO users (username, password) VALUES (?, ?)";

         

        if($stmt = mysqli_prepare($link, $sql)){

            // Vincular variables a la declaración preparada como parámetros

            mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);

            

            // Establecer parámetros

            $param_username = $username;

$param_password = password_hash($password, PASSWORD_DEFAULT); // Crear una contraseña hash

            

            // Intentar ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                // Redirigir a la página de inicio de sesión (login.php)

                header("location: login.php");

            } else{

                echo "Algo salió mal, por favor inténtalo de nuevo.";

            }

        }

         

        // claración de cierre

        mysqli_stmt_close($stmt);

    }

    

    // Cerrar la conexión

    mysqli_close($link);

}

?>

 

<!DOCTYPE html>

<html lang="es">

<head>

    <meta charset="UTF-8">

<!link href="CSS/estilo_form.css" rel="stylesheet" type="text/css">

    <title>Registro</title>

</head>

<body>

    

        <h2>Registro</h2>

        <p>Por favor complete este formulario para crear una cuenta.</p>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">

                <label>Usuario</label>

                <input type="text" name="username"  value="<?php echo $username; ?>">

                <span><?php echo $username_err; ?></span><br>

            

                <label>Contraseña</label>

                <input type="password" name="password"  value="<?php echo $password; ?>">

                <span><?php echo $password_err; ?></span><br>

            

            

                <label>Confirmar contraseña</label>

                <input type="password" name="confirm_password"  value="<?php echo $confirm_password; ?>">

                <span><?php echo $confirm_password_err; ?></span><br>

            

                <input type="submit"  value="Ingresar">

                <input type="reset"  value="Borrar"><br>

            

            <p>¿Ya tienes una cuenta? <a href="login.php">Ingresa aquí</a>.</p>

        </form>

    

</body>

</html>


reset-password.php

<?php

// inicializa la sesión

session_start();

 

/* Compruebe si el usuario ha iniciado sesión; 

de lo contrario, redirija a la página de inicio de sesión (login.php)*/

if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){

    header("location: login.php");

    exit;

}

 

// incluir el archivo de configuración

require_once "config.php";

 

// Definir variables e inicializar con valores vacíos

$new_password = $confirm_password = "";

$new_password_err = $confirm_password_err = "";

 

// Procesamiento de datos del formulario cuando se envía el formulario

if($_SERVER["REQUEST_METHOD"] == "POST"){

 

    // Validar la nueva contraseña

    if(empty(trim($_POST["new_password"]))){

        $new_password_err = "Por favor, introduzca la nueva contraseña.";     

    } elseif(strlen(trim($_POST["new_password"])) < 6){

        $new_password_err = "La contraseña debe tener al menos 6 caracteres.";

    } else{

        $new_password = trim($_POST["new_password"]);

    }

    

    // Validar la confirmación de contraseña

    if(empty(trim($_POST["confirm_password"]))){

        $confirm_password_err = "Por favor confirme la contraseña.";

    } else{

        $confirm_password = trim($_POST["confirm_password"]);

        if(empty($new_password_err) && ($new_password != $confirm_password)){

            $confirm_password_err = "Las contraseñas no coinciden.";

        }

    }

        

    // Verifique los errores de entrada antes de actualizar la base de datos

    if(empty($new_password_err) && empty($confirm_password_err)){

        // Prepare la declaración de actualización

        $sql = "UPDATE users SET password = ? WHERE id = ?";

        

        if($stmt = mysqli_prepare($link, $sql)){

            // Vincular variables a la declaración preparada como parámetros

            mysqli_stmt_bind_param($stmt, "si", $param_password, $param_id);

            

            // Asignar parámetros

            $param_password = password_hash($new_password, PASSWORD_DEFAULT);

            $param_id = $_SESSION["id"];

            

            // Intente ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                /* Contraseña actualizada exitosamente. 

Destruye la sesión y redirige a la página de inicio de sesión (login.php)*/

                session_destroy();

                header("location: login.php");

                exit();

            } else{

                echo "Algo salió mal, por favor vuelva a intentarlo.";

            }

        }

        

        // Declaración de cierre

        mysqli_stmt_close($stmt);

    }

    

    // Cerrar conexión

    mysqli_close($link);

}

?>

 

<!DOCTYPE html>

<html lang="es">

<head>

    <meta charset="UTF-8">

<!link href="CSS/estilo_form.css" rel="stylesheet" type="text/css">

    <title>Cambio de contraseña</title>

</head>

<body>

        <h2>Cambio contraseña</h2>

        <p>Complete este formulario para restablecer su contraseña.</p>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> 

        

                <label>Nueva contraseña</label>

                <input type="password" name="new_password" value="<?php echo $new_password; ?>">

                <span><?php echo $new_password_err; ?></span><br>

            

                <label>Confirmar contraseña</label>

                <input type="password" name="confirm_password" >

                <span><?php echo $confirm_password_err; ?></span><br>

            

                <input type="submit" value="Enviar"><br>

                <a class="btn btn-link" href="index.php">Cancelar</a>

           

        </form>

  

</body>

</html>



users.sql

CREATE TABLE IF NOT EXISTS `users` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(50) NOT NULL,

  `password` varchar(255) NOT NULL,

  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;




Si se utiliza wampserver solamente copiamos los archivos en una carpeta  dentro de la carpeta www de la ruta de instalación. Por ejemplo en C:\wamp64\www\

Ahí creamos una carpeta con el nombre que deseemos, por ejemplo sistema_2_es

Ahora en la carpeta alias (C:\wamp64\alias) copiamos cualquiera de los archivos con extensión .conf y le cambiamos el nombre por el de nuestra carpeta de archivos: sistema_2_es.conf 


Si realizamos bien los pasos despues de abrir el local host veremos en your aliases el nombre de nuestra carpeta y al dar clic se abrirá la página de inicio (index.php) pero como es necesario estar iniciar sesión se abre el archivo de login (login.php).









La base de datos la podemos crear en phpmyadmin.