sábado, 21 de marzo de 2015

MIPS: Como calcular la siguiente fila a una dada en la pirámide de Tartaglia.

Buenas gente. Hace una semana se me ocurrió plantear éste ejercicio para mis alumnos de Computadores. Ya lo hemos hecho bien y os lo traigo aquí.
Decir que lo hemos desarrollado en forma de función para poder utilizarlo más adelante en otras funciones más complejas.
La función toma en $3 la dirección donde comienza el array, en $7 el tamaño del array y en $2 la dirección de memoria donde guardaremos el resultado (sería algo así como pasar un parámetro por referencia en C o C++).

He de decir, por último, que para que funcione bien con el primer elemento no hay que pasarle un [1], sino un [1, 1]. Ésto lo hemos hecho por temas de simplicidad, pero si hiciera falta cambiarlo, sería muy simple.

Dicho ésto, os dejo aquí el código ;)

.data
array: .word 1 3 3 1
tam: .word 4
res: .word -1

.text

 lw $7, tam($0) #Tamaño
 la $3,array
 la $2,res
 jal Tar
 li $2,10
 syscall
 
Tar: add $8,$0,$2 #Indice Mem. Res
 add $5,$3,$0 #Índice Mem. Array
 addi $6,,$0,1  #Constante 1
 sw $6,0($8) #res[0]=1
 addi $10,$0,1  #i del For 
loop: slt $4,$10,$7
 beq $4,$0,FinFor
 lw $12,0($5) #Array +$8 
 addi $5,$5,4 
 addi $8,$8,4  #Sumamos 4 al Índice
 lw $13,0($5) #Array +$8
 add $21,$12,$13 #Guarda en $21 la suma $12+$13
 sw $21,0($8) #Guarda en $21 en res $8
 addi $10,$10,1 #i++
 j loop  #Bucle
FinFor: addi $8,$8,4  #Suma 4 a lo que hay en $8
 sw $6,0($8) 
 jr $31

No es complicado, ¿verdad? Si no lo entendéis del todo escribidme y subo el código que se usaría en C++ o Java con la misma función, para que lo entendáis mejor.

Saludos;)

domingo, 8 de marzo de 2015

HTML POST PHP Tablas de multiplicar

Hola gente :)
He estado haciendo un par de pruebas con PHP y quería compartirlas. Aviso desde ya que son cosas muy básicas.

Para montar mi lugar de trabajo he instalado XAMPP, que es una aplicación gratuita que te permite montar en tu máquina un servidor con PHP, MySQL y un montón más de funcionalidades que espero usar :)

Para programar he usado NetBeans, que aunque traga muchos recursos, mi ordenador lo soporta de sobra y me ha gustado el funcionamiento que tiene.

Pues he empezado haciendo un formulario simple a más no poder en HTML para pasarle un número al PHP. Éste PHP se encargará de tomar el número y calcular la tabla de multiplicar del 1 al 10 del mismo número.
Luego probé (con un for) a que imprimiera todas las tablas entre 1 y 20. De ésta forma practicamos tanto la recogida de datos (por medio del método POST) y los bucles y el uso de variables.

Si veis que os sale feo o que hay etiquetas que no conocéis en el HTML, es porque estoy usando Bootstrap. Si queréis saber más sobre ello, preguntad ;)

Aquí el código (demasiado simple) del index.php (también puede ser index.html pero por comodidad les he puesto a todos la misma extensión):

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Tablas de multiplicar</title>
    </head>
    <body>
        
        <form method="POST" name="tabla" role="form" action="tablas.php" enctype="multipart/form-data">
            <div class="form-group">
                <label for="exampleInputNombre">Introduzca un número</label>
                <input name="number" type="text" class="form-control" id="numero" placeholder="Escribe un numero">
                <button type="submit" class="btn btn-default">Enviar</button>
            </div>
        </form>
    </body>
</html>
La web resultante tendría únicamente un formulario tal que así:

Como veis, la complejidad es nula. Vamos ahora con el "tablas.php":

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Tablas de multiplicar</title>
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <script src="https://code.jquery.com/jquery.js"></script>
        <script src="js/bootstrap.min.js"></script>
    </head>
    
    <body>
        <!-- Botón para volver atrás -->
        <div class="row">
            <div class="col-md-12 well"><a href="index.php"><button class="btn btn-default">Atrás</button></a> </div>
        </div>
        <!-- Tabla del número elegido-->
        <table  class="table table-hover table-bordered ">
        <?php
        $num = $_POST["number"];
        echo ("<tr>");
        // Cabecera 
        for ($i = 1; $i < 11; $i++) {            
            echo ("<th>");
            echo "$i";
            echo ("</th>");
        }
        
        echo ("</tr>");
        
        // Resultados 
        echo ("<tr>");

        for ($i = 1; $i < 11; $i++) {            
            echo ("<td>");
            $aux = $num*$i;
            echo "$aux";
            echo ("</td>");
        }
        
        
        echo ("</tr>");
        
        
        ?>
            
            <!-- Tabla genérica, creada al ejecutar el php -->
        </table>
        <br><br>
        <p class="active"> 
            Ahora una tabla más genérica:
        </p>
        <br>
        <table  class="table table-hover table-bordered ">
        <?php
            
            echo ("<tr>");

            for ($i = 1; $i < 11; $i++) {            
                echo ("<th>");
                echo "$i";
                echo ("</th>");
            }

            echo ("</tr>");

            for($j=1; $j<21; $j++) {

            for ($i = 1; $i < 11; $i++) {            
                echo ("<td>");
                $aux = $j*$i;
                echo "$aux";
                echo ("</td>");
            }


            echo ("</tr>");
            }

        ?>
        </table>
    </body>
</html>

Espero que no lo veáis demasiado complejo. Si queréis imágenes de cómo queda o tenéis cualquier duda/sugerencia, no dudéis en escribirnos. Estaremos encantados de responderos.

Saludos y hasta otra ;)

viernes, 6 de marzo de 2015

Validación de formulario HTML5 con JavaScript

Os dejo un pequeño y simple formulario hecho mediante HTML5 con la correspondiente comprobación de sus campos mediante JavaScript.
Lo que se pretende hacer es que cuando el usuario pulse el botón de envío del formulario,se ejecute el código JavaScript que debe comprobar:

  1. que los campos nombre y apellidos no estén vacíos
  2. que la dirección de correo electrónico esté bien formada (aparece @ en un carácter que no es el primero, y tiene al menos un punto tras la arroba) 
  3. que la contraseña tiene al menos 8 caracteres y
  4. que la contraseña con su repetición.
Si no es así se muestra una alerta al usuario indicando el problema y se cancela el envío, limpiando los campos de contraseña. Si todo es correcto se procede con el envío.

Os dejo primero el código html (puede que haya algún error con el tema de formato por los < > y las etiquetas debido al copia y pega).

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <script src="codigo.js" type="text/javascript"></script> <!-- Para incluir el fichero JavaScript-->
  <title>Formulario</title> 
  <meta name="author" content="Aprendiendo a programar entre todos">
 </head>
 <body>
  <form method="post" action="mailto:aprendiendoaprogramarentretodo@gmail.com" name="formulario" enctype="text/plain" onsubmit="return validar();">
   <table>
    <tr>
     <td>Nombre</td>
     <td><input type="text" size="25" name="nombre"></td>
    </tr>
    
    <tr>
     <td>Apellidos</td>
     <td><input type="text" size="25" name="apellidos"></td>
    </tr>
    
    <tr>
     <td>Correo electrónico</td>
     <td><input type="text" size="25" name="email"></td>
    </tr>
    
    <tr>
     <td>Contraseña</td>
     <td><input type="password" size="25" name="pass"></td>
    </tr>
    
    <tr>
     <td>Repita contraseña</td>
     <td><input type="password" size="25" name="rpass"></td>
    </tr>

                                <tr>
                                        <td>Sexo (opcional) </td>
                                        <td>
                                             <input type="radio" name="sexo" value="mujer"> Mujer
                                                <input type="radio" name="sexo" value="hombre">Hombre<br>
                                        </td>
                                         
                                </tr>
                                <tr>
                                        <td><input type="checkbox" name="sesion" value="v_sesion">Deseo recibir ofertas</td>
                                        <td> </td>
                                </tr>                                                                

    
    <tr>
     <td><input type="reset" value="Reset"></td>
     <td><input type="submit" value="Enviar"></td>
    </tr>
    
   </table>
   
  </form>

 </body>
</html>


Y aquí el código JavaScript que valida los campos del formulario de la manera indicada anteriormente, comprobando de forma muy clara para que lo podáis ver bien cada una de las restricciones que se indican en el enunciado.
function resetPass (){
    document.formulario.pass.value = "";
    document.formulario.rpass.value = "";
    return false;
}

function validar (){
    var nombre = document.formulario.nombre.value;
    var apellidos = document.formulario.apellidos.value;
    var email = document.formulario.email.value;
    var pass =  document.formulario.pass.value;
    var rpass =  document.formulario.rpass.value;
    if(nombre === "" || apellidos === ""){
        alert("Error: nombre incompleto");
        return resetPass();
    }else if (email.indexOf('@') < 1){
        alert("Error en email (debe aparecer @)");
        return resetPass();
    }else if(email.lastIndexOf(".")  < email.indexOf('@') ){
        alert("Error en email (debe aparecer un .)");
        return resetPass();
    }else if(pass.length < 8){
        alert("Contraseña demasiado corta");
        return resetPass();     
    }else if(pass !== rpass){
       alert("Contraseñas no coinciden");
        return resetPass();
    }else{
       return true; 
    }
}

Está claro que es un ejemplo muy sencillo y realizado de forma muy básica, pero por algo se empieza ;)

jueves, 5 de marzo de 2015

LinkedArray en C

Hola gente, cuánto tiempo!! :)
Lo siento por mi desaparición pero estoy demasiado perdido entre estudiar y trabajar... Además estoy aprendiendo front-end en condiciones y.., le faltan horas a mi día. Creo que me voy a comprar un reloj de esos de 40 horas a ver...

Os traigo un código que les he puesto a mis alumnos de la academia. El enunciado es simple y tal que así:
Crea en C (con cabecera y código separados) una estructura de Array en Nodos, en la que cada Nodo tendrá
como atributos un entero (valor), un entero (tam) y un puntero al siguiente Nodo. Además debes crear las
siguientes funciones:
Crear(Primero* primero, int n) Crea todos los nodos inicializándolos a cero.
Destruir(Primero* primero) Borra todos los nodos, liberando el espacio de disco.
Obtener(Primero primero, int index, int *ok, int *valor) Devuelve en valor el valor de ese trozo de array. En
ok devuelve un 1 si se ha podido y un 0 en caso contrario.
Cambiar(Primero* primero, int index, int valor) Cambia el valor de la posición index por el nuevo valor
Mostrar(Primero primero) Imprime el array.

Aquí tenéis la cabecera:
#ifndef MAIN_H
#define MAIN_H

typedef struct Array* Primero;
struct Array {
    int valor;
    int tam;
    Primero sig;
};

void Crear(Primero* primero, int n);
void Destruir(Primero* primero);
void Obtener(Primero primero, int index, int *ok, int *valor);
void Cambiar(Primero* primero, int index, int valor);
void Mostrar(Primero primero);


#endif /* MAIN_H */


Y aquí os dejo el código:

#include <stdio.h>
#include <stdlib.h>
#include "main.h"

/*
 * 
 */

void Crear(Primero* primero, int n) {
     *primero = (Primero)malloc(sizeof(struct Array));
     (*primero)->tam = n;
     (*primero)->valor = 0;
     (*primero)->sig = NULL;
     Primero ant = *primero;
     int i;
     for(i=1; i<n; i++) {
         Primero nuevo;
         nuevo = (Primero)malloc(sizeof(struct Array));
         nuevo->valor=0;
         nuevo->tam = (*primero)->tam;
         nuevo->sig = NULL;
         ant->sig = nuevo;
         ant = ant->sig;
     }
     
}
void Destruir(Primero* primero) {
    Primero ptr;
    while (*primero != NULL) {
        ptr=(*primero)->sig;
        free((void *)*primero);
        *primero=ptr;
    }
}
void Obtener(Primero primero, int index, int *ok, int *valor) {
    
    if((*valor)<primero->tam) {
    int i;
    Primero aux = primero;
    for(i = 0; i < index; i++) {
        aux = aux->sig;
    }
    (*valor)=aux->valor;
    (*ok) = 1;
    } else {
        (*ok) = 0;
    }
}
void Cambiar(Primero* primero, int index, int valor) {
    int i;
    Primero aux = *primero;
    for(i = 0; i < valor; i++) {
        aux = aux->sig;
    }
    aux->valor = valor;
    
}
void Mostrar(Primero primero) {
    int ultimo = primero->tam;
    int i;
    printf("{");
    for(i=0; i < ultimo-1; i++) {
        printf("%d, ", primero->valor);
        primero = primero->sig;
    }
    printf("%d}", primero->valor);
    fflush(stdout);
}

int main() {
    printf("Vamos a crear un array\n");
    fflush(stdout);
    Primero p;
    Crear(&p, 5);
 //   int ok;
 //   int valor;
//    Obtener(p, 3, &ok, &valor);
//    printf("%d", valor);
 //   fflush(stdout);
   Cambiar(&p, 2, 1);
   Cambiar(&p, 3, 4);
    Mostrar(p);
    Destruir(&p);
    return (EXIT_SUCCESS);
}

Pues eso gente, si necesitáis ayuda con algo pedidla por aquí (no me metáis más de 2 faltas de ortografía por palabra por favor) y espero que os sigan sirviendo todas éstas cosillas ;)

Saludos