Solución a la práctica de Algoritmos I – Grupo A

Estándar

La práctica tomada por el profesor el día de hoy nos sorprendió un poco con el tiempo dado para resolverla. Aún así, logré ver que la mayoría logró resolverla en una escala media.

El trabajo que ahora tenemos consta en desarrollar la práctica. Y como es una oportunidad para mejorar lo que hicimos durante el tiempo dado, pues aquí expongo la mejora de mi código (el que hice en clase me lo reservo).

Codificación

public class Fraccion {
    
    private int num;
    private int den;
    
    /**
     * Crea una nueva Fraccion.
     */
    public Fraccion() {
        num = 0;
        den = 1;
    }
    
    /**
     * Copia la Fraccion en f a esta Fraccion.
     * @param f Fraccion a copiar
     */
    public Fraccion(Fraccion f) {
        num = f.num;
        den = f.den;
    }
    
    /**
     * Inicializa los valores de esta Fraccion.
     * @param num numerador
     * @param den denominador
     */
    public Fraccion(int num, int den) {
        this.num = num;
        this.den = den;
    }
    
    /**
     * Obtiene el numerador de esta Fraccion.
     * @return numerador
     */
    public int getNum() {
        return num;
    }
    
    /**
     * Obtiene el denominador de esta Fraccion.
     * @return denominador
     */
    public int getDen() {
        return den;
    }
    
    /**
     * Asigna el numerador de esta Fraccion.
     * @param num numerador a asignar
     */
    public void setNum(int num) {
        this.num = num;
    }
    
    /**
     * Asigna el denominador de esta Fraccion.
     * @param den denominador a asignar
     */
    public void setDen(int den) {
        this.den = den;
    }
    
    /**
     * Suma dos Fracciones.
     * @param f segunda Fraccion a sumar
     * @return Fraccion suma
     */
    public Fraccion sumar(Fraccion f) {
        return new Fraccion(num * f.den + f.num * den, den * f.den);
    }
    
    /**
     * Multiplica dos Fracciones.
     * @param f segunda Fraccion a multiplicar
     * @return Fraccion producto
     */
    public Fraccion multiplicar(Fraccion f) {
        return new Fraccion(num * f.num, den * f.den);
    }
    
    /**
     * Simplifica una Fraccion.
     * @return Fraccion simplificada
     */
    public Fraccion simplificar() {
        int n = num;
        int d = den;
        int res;
        // Calculamos el MCD
        while (d != 0) {
            res = n % d;
            n = d;
            d = res;
        }
        return new Fraccion(num / n, den / n);
    }
    
    /**
     * Compara fracciones.
     * @param f Fraccion a comparar
     * @return true si esta Fraccion es mayor a f.
     */
    public boolean esMayor(Fraccion f) {
        if (num * f.den > f.num * den) {
            return true;
        }
        return false;
    }
    
    /**
     * Devuelve la Fraccion como cadena.
     * @return Fraccion como String
     */
    public String toString() {
        return num + "/" + den;
    }
    
}
import java.util.Random;
import java.util.Scanner;

public class PruebaFraccion {
    
    private static void generar(Fraccion[] v) {
        Random r = new Random();
        for (int i = 0; i < v.length; i++) {
            int num = r.nextInt(10);
            int den = r.nextInt(10);
            // El denominador no puede ser 0
            while (den == 0) {
                den = r.nextInt(10);
            }
            v[i] = new Fraccion(num, den);
        }
    }
    
    private static void mostrar(Fraccion[] v) {
        System.out.println();
        for (int i = 0; i < v.length; i++) {
            // No es necesario llamar a toString()
            // pues lo llama de manera automatica
            System.out.println(v[i]);
        }
        System.out.println();
    }
    
    private static Fraccion mayor(Fraccion[] v) {
        Fraccion mayor = new Fraccion(v[0]);
        // i = 1 porque ya asignamos arriba
        // la fraccion mayor a 0
        for (int i = 1; i < v.length; i++) {
            if (v[i].esMayor(mayor)) {
                mayor = new Fraccion(v[i]);
            }
        }
        return mayor;
    }
    
    private static Fraccion suma(Fraccion[] v) {
        Fraccion suma = new Fraccion(v[0]);
        // i = 1 tambien
        for (int i = 1; i < v.length; i++) {
            suma = suma.sumar(v[i]);
        }
        return suma;
    }
    
    private static Fraccion producto(Fraccion[] v) {
        Fraccion producto = new Fraccion(v[0]);
        // i = 1 tambien
        for (int i = 1; i < v.length; i++) {
            producto = producto.multiplicar(v[i]);
        }
        return producto;
    }
    
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        System.out.print("Numero de elementos: ");
        int n = sc.nextInt();
        sc.close();
        
        Fraccion[] v = new Fraccion[n];
        
        generar(v);
        mostrar(v);
        
        // Tener en cuenta que el toString()
        // ya no debe ser llamado porque Java
        // automaticamente sabe llamarlo
        System.out.println("Fraccion mayor: " + mayor(v));
        System.out.println("Suma: " + suma(v).simplificar());
        System.out.println("Producto: " + producto(v).simplificar());
        
    }
    
}

Espero sus comentarios, observaciones, y otros 🙂

¿Por qué aprender a programar?

Estándar

Posiblemente hayas escuchado alguna vez hablar acerca de programación. Y también es probable que te hayas preguntado qué era eso, en qué consiste, o como otros usuarios, que te importa lo que sea, si al fin y al cabo no lo vas a usar.

Pues la intención de este artículo es explicar, como el título lo dice, el porqué aprender a programar. Y es que no podemos vivir en este siglo sin saber algo tan simple que implica programar.

Antes que nada, veamos a nuestro alrededor. Desde el momento en que estás leyendo este artículo, debes estar usando un dispositivo con conexión a Internet. ¿Y adivina qué? Tu dispositivo tiene un sistema operativo, sea de escritorio, móvil o propietario.

Y si te diste cuenta, ¡el sistema operativo viene programado! Sino, reflexiona unos segundos acerca de la pregunta: ¿cómo es que funciona mi dispositivo, respondiendo a las órdenes que le hago?. La respuesta es inmediata: programación.

Tal vez el sistema operativo nunca nos hable y diga: “soy un sistema operativo, y estoy programado en el lenguaje X”. Sé que no lo hará. Y es que los que los fabrican (si usas Windows, Microsoft; Android, Google; iOS, Apple; FirefoxOS, Mozilla, entre otros) saben que tú nunca lo querrás saber, y así les ahorras un gran trabajo de poner una opción más en su sistema que te informe en qué lenguaje de programación fue diseñado el sistema.

Algo que olvidé decir: un lenguaje de programación es un conjunto ordenado de instrucciones, que realizan tareas específicas de acuerdo a qué sea necesario hacer. En pocas palabras, usando un lenguaje de programación puedes crear programas, los que pueden ir desde muy simples, hasta la creación de grandes sistemas. Ejemplo de éstos tenemos: PHP (mi preferido), JavaScript (uno de los lenguajes más usados para web), HTML (no sé qué de lenguaje tenga esto además de un modelo de documento, pero según dicen, con el auge de HTML5, se ha convertido en un lenguaje de programación), CSS (muchos dirán que es similar a HTML, pero para mí despliega tu creatividad, y eso es algo esencial de un lenguaje de programación), Python (el mejor para los que desean iniciarse en programación, pero te acostumbra a malas prácticas), Ruby (uno de los más poderosos y potentes del mundo), C (el padre de todos los lenguajes), C++ y C# (variantes ligeras de C), Java (uno de los mejores en programación orientada a objetos, luego de SmallTalk), ASP (propiedad de Microsoft), entre otros.

Siguiendo con el tema de los sistemas operativos, ¿ahora crees que sea útil decir en qué lenguaje de programación fue programado algo? Si tu respuesta aún es no, no te preocupes, acaba de leer el artículo y de inmediato cambiarás de opinión 🙂

Todo en los ordenadores, en lo que nos rodea, se basa en lenguajes de programación. Incluso las aplicaciones que usamos casi a diario: Microsoft Word, Excel, Internet Explorer (mi más sentido pésame si aún lo usas), Mozilla Firefox (digno de admirar, en otro artículo explicaré el por qué), tu juego de Buscaminas (si lo jugaste alguna vez, sino ¡qué esperas!), y otras aplicaciones de uso diario. Ahora ¿ya crees que es útil saber en qué lenguaje están programados?

Bueno, si aún dices “no, pues: ¿qué pasaría si algún día quieres mejorar tus aplicaciones, dotarlas de funcionalidades propias que te hagan la vida más fácil de lo que ya es con los ordenadores, si quisieras crear algún virus para obtener las contraseñas de tu amigo (no tomes en cuenta esto, fue a modo de ejemplo)? Si no sabes programar, pues paga a un “especialista” que lo haga. Cuando lo hagas, comenta sólo cuánto te cobró, y si te desmayaste o no. ¡Merecemos aprender por nuestros propios medios! ¡Necesitamos hacer trabajar a los ordenadores para nosotros, no nosotros para ellos!

Ahora, piensa en esto: ¿no crees que sería un buen complemento para ti saber a programar? Sino piensa en las ventajas: dile  a tu amiga(o) que sabes programar y mañana tienes una boda. Sé que puedes estar más adelante de los que te rodean. Dichas personas “normales” que se pasan la vida usando programas ya hechos, y que cuando quieren una nueva característica, tienen que pedir soporte técnico para lograrlo.

Programar es algo muy bonito, te lo aseguro. Llevo 4 años de mi vida programando (desde mis 13), y la verdad es que me he quitado muchos problemas de encima fácilmente. ¿Cómo? Usando la lógica y la programación.

Mencioné “lógica” porque no puedes programar algo sin lógica. Sino ¿qué sería Word sin que sepa que cuando tú presiones la gran “N” es que quieres un texto en negrilla (o negrita, como le quieras llamar)? La lógica y la programación van completamente de la mano. Aprender a programar es fácil. Aprender a pensar lógicamente no. Esto implica un proceso más largo, el cual debes haberlo venido desarrollando desde que naciste, sin darte cuenta de ello.

¿Ya estás asustándote con lo tanto que parlo? Pues no te preocupes, aún te falta leer el triple de lo que llevas leído, aumentado en 2 palabras. Okay, no más lógica por hoy 🙂 No hay de qué temer, un ordenador nunca se levantará y te llevará de la nada a otro lugar. A menos que trabajes en inteligencia artificial.

Continuando con el tema de la programación, puedes ver mis experiencias como programador en esta página. Pregunto por tercera vez: ¿aún sigues creyendo que aprender a programar no te servirá de nada? ¡Pues pongamos un ejemplo! Estás en tu hogar, sin nadie de compañía. La luz se apaga. ¿Qué es lo primero que piensas? Si pensaste “se quemó la bombilla”, al igual que yo, pues estás a un paso de poder programar. Si pensaste algo más avanzado, no te preocupes, siempre hay personas raras, y son ellas las que más rápido pueden aprender a programar. ¿Otro ejemplo? Creo que ya eso fue suficiente.

Bien. Después de toda la introducción, pasemos a ver qué maravillas podrías hacer al programar. Si trabajas con programas de oficina, ¿no sería más fácil agregar un formato predefinido para cada tipo de documento que redactes? Si vas jugando todo el día, ¿y si crearas tu propio juego, el que tenga lo que tú deseas, en lugar de adaptarte a lo que te brinda determinado juego? Si estudias matemáticas, ¿influiría en algo que tuvieras un programa listo que graficara todas las funciones que desees, y así copiar o imprimir las gráficas hechas a tu manera? Si vendes productos, ¿sería mejor crear un programa que administrara eficientemente tus ventas? Si eres adicto a las redes sociales, ¿estoy en lo cierto que tener tu propia aplicación con las redes sociales que usas a diario sería lo mejor que podrías tener? Y así, puedo seguir dando muchos ejemplos.

Ahora, tengo otra buena noticia: ¡yo no crearé estos programas por ti! Y si lo hago, pues te cobro, pero no porque sepa más que tú, sino porque tu pereza no te deja hacerlo, y la pereza se paga de alguna manera. La información es gratis. Y si tampoco me crees, ¿por qué no buscas en Google (o en tu buscador favorito, yo recomiendo DuckDuckGo) información acerca de “Java”“iniciación a la programación”? Verás muchos resultados 🙂

Y para no hacer más larga la situación, te invito a que al menos intentes buscar información acerca de todo lo hablado aquí. Sería gratificante para mí que me comentaras qué lenguaje de programación hizo posible que estés leyendo este artículo. Que supieras que puedes crear juegos para móviles usando Java.

Espero haberte convencido de la importancia que tiene el aprender a programar. Y si no lo hice, pues pido disculpas por haberte hecho perder el tiempo leyendo esto. Aunque al menos agradece que se te fue la pereza.

Por cierto, si esto quedó muy corto, puedes contactarme directamente. Si deseas, en una próxima edición hago una iniciación a determinado lenguaje, o quizás ya me hayas ganado en la carrera del aprendizaje y quieras contribuir con esta página. ¡Buen día!