Código C++

  • Blog
  • Acerca
  • Autor
  • Contacto
  • Generar un string aleatorio en C++

    No sé, es algo que se me ocurrió y que es muy fácil de hacer. Lo único que tenemos que hacer es ver a un string no como una frase, sino como un conjunto de caracteres; y además ver a los caracteres no como letras, sino números del código ASCII.

    Teniendo esto claro, es muy fácil generar un números aleatorios (que representas letras) para llenar cada elemento del arreglo que es nuestro string. Veamos:

    #include<stdlib.h>
    #include<time.h>
    #include<iostream>
    using namespace std;
     
    int main()
    {
        char strrnd[10];
        srand(time(NULL));
        for(int i=0; i <= 9; i++)
            strrnd[i] = 33 + rand() % (126 - 33);
        cout << strrnd;
        cin.get();
    }
    1. Primero declaramos un string de nombre strrnd.
    2. Luego inicializamos nuestro random.
    3. Con un ciclo recorremos cada elemento del string.
    4. Y cada elemento lo llenamos con un número aleatorio entre 33 y 126, que en el código ASCII representan todos las símbolos letras y números normales.
    5. Y listo, ya hemos creado un string aleatorio en c++.

    Si tienen duda con los números aleatorios pueden checar este post: Obtener número aleatorios en c++. Aquí pueden ver el código ASCII.

    Si quieren que muestre, por ejemplo, solo letras minúsculas, tendrían que modificar la fórmula del random para que generara números entre el 97 y 122.

    Cada tres días

    No creo que nadie se haya fijado, pero desde el regreso de este blog, las entradas han estado apareciendo cada tres días. Y este post es para hacérselos notar.

    ¿Porqué tres días? Bueno pues porque en los blogs de este tipo es muy bueno tener regularidad con respecto a la frecuencia de los posts; comprometerme a publicar todos los días sería demasiado, dos días estaría bien, pero tres días me queda mucho más adecuado.

    Así que ya saben, si no quieren desperdiciar tiempo, sólo chequen el blog cada tres días o suscríbanse por mail o por feed (allá en la sidebar están los links, soy un flojo).

    Como usar cin.getline en C++

    Bueno, siguiendo con la línea de los posts sobre la librería string.h les traigo esta función que no está en esa librería pero que es muy útil al trabajar con strings. Ya dijimos que un/una string es una variable que puede contener 0, uno o más caracteres.

    Ya vimos en nuestra introducción a string.h cómo declarar un string, hacerle algunas modificaciones y cómo mostrarlo. Ahora veremos como pedir un string (que el usuario la introduzca por medio del teclado).

    Esto es muy sencillo si usamos la función cin.getline(); Esta función necesita tres datos o parámetros:

    1. Nombre. El nombre de la variable que va a contener el string
    2. Longitud. La cantidad de caracteres que queremos que se puedan introducir (nunca mayor que la longitud del string).
    3. Caracter de fin. El caracter que el usuario va usar como final de la cadena. Por lo general es el ‘enter‘ que se representa como ‘\n’ (diagonal n).

    Por ejemplo, supongamos que tenemos un arreglo char de 500 elementos llamado str (nuestra string) y queremos pedirle al usuario que la “llene”, la función cin.getline quedaría así:

    cin.getline(str, 500, '\n');

    Como ven, los parámetros van separados por comas (,), y el caracter de fin está entre comillas simples (‘). Pero bueno, dejemos de suponer y empecemos a programar.

    #include<iostream>
    using namespace std;
     
    int main()
    {
        char str[500];
        cout << "Introduce una frase: ";
        cin.getline(str, 500, '\n');
        cout << "Tu frase es: " << str;
        cin.get();
    }

    Mas sencillo no podría ser.

    Triángulo de Pascal en C++

    ¿Han escuchado eso de que en el triángulo de pascal cada número es la suma de los dos que están sobre él? ¡PUES LES HAN MENTIDO!, eso no es más que una coincidencia y la forma mas fácil de escribirlo en el pizarrón. En realidad el triángulo de pascal es una matriz donde cada elemento es el coeficiente binomial o combinación de sus coordenadas. Las pruebas.

    El caso es que para obtener el triángulo de pascal en c++ hay muchas formas, pero la que está a continuación yo la considero especial porque está basada en su propia definición.

    #include<iostream>
    using namespace std;
     
    int factorial(int n)
    {
        if(n<2)
            return 1;
        else
            return n * factorial(n-1);
    }
     
    int combinacion(int n, int r)
    {
        if(r==1)
            return n;
        else
        {
            if(n==r)
                return 1;
            else
                return factorial(n) / (factorial(r) * factorial(n - r));
        }
    }
     
    int main()
    {
        for(int i=0; i<=6; i++)
        {
            for(int ii=0; ii<=i; ii++)
                cout << combinacion(i, ii) << "  ";
            cout << endl;
        }
        return 0;
    }

    Vamos analizándolo:

    1. La primera función es para obtener el factorial de forma recursiva.

    2. La segunda es para obtener el coeficiente binomial o combinación de dos números, es en esencia esta fórmula:
    C(n,r) = n! / r!(n-r)!
    Mas información sobre coeficientes binomiales.

    3. En el main hay dos ciclos que se encargan de armar una matriz para obtener el coeficiente binomial de cada uno de ellos.

    • La primera pareja de numeros es (0,0) y su combinación es 1. Nuestro primer numero del triangulo de pascal.
    • La siguiente es (1,0) y luego (1,1) cuyas combinaciones son 1 y 1. Segunda línea.
    • Luego tenemos (2,0) (2,1) y (2,2) cuyas combinaciones son 1, 2 y 1. Tercera linea
    • Y así seguimos obteniendo nuestras líneas.

    Y pues así es, el que me diga que no tiene forma de triángulo está ciego, porque si es triángulo, lo que pasa es que no es isósceles.

    Primo o no ¡SIN CICLOS! en C++

    Me preguntaban en los comentarios de este post: Primo o no, que si habría alguna forma de hacer ese mismo programa pero sin ciclos. Mmmm…

    Pues mi primera respuesta es no. Pero hay una forma muy burda de aproximarse a él. El siguiente programa es para calcular si un número es primo o no sin ciclos y es infalible hasta el 168, a partir de ahí puede que le atine o puede que no.

    #include<iostream>
    using namespace std;
     
    int main()
    {
        int n;
        cout << "Introduce un numero: "; cin >> n;
        if(n!=2 & n%2==0)
            cout << "No es primo";
        else
        {
            if(n!=3 & n%3==0)
                cout << "No es primo";
            else
            {
                if(n!=5 & n%5==0)
                    cout << "No es primo";
                else
                {
                    if(n!=7 & n%7==0)
                        cout << "No es primo";
                    else
                    {
                        if(n!=11 & n%11==0)
                            cout << "No es primo";
                        else
                        {
                            cout << "Es primo";
                        }
                    }
                }
            }
        }
    }
    • Como vemos, primeramente checa si n es igual a 2; si no, checa si el residuo de n/2 es cero. Si si, no es primo; si no, sigue.
    • Luego checa si n es igual a 3; si no, checa si el residuo de n/3 es cero. Si si, no es primo; si no, sigue.
    • Lo mismo con el 5, el 7 y el 11.

    Con eso obtenemos un buen número de números en los que estamos seguros que no fallaremos. Si agregamos el 13, agrandamos esa cantidad; y aún mas con el 17, el 19, … como en esta versión optimizada, que tiene su primer error con el 1681 (que no es primo)

    #include<iostream>
    using namespace std;
     
    int main()
    {
        int n;
        cout << "Introduce un numero: "; cin >> n;
        if((n!=2 & n%2==0)||(n!=3 & n%3==0)||(n!=5 & n%5==0)||(n!=7 & n%7==0)||
           (n!=11 & n%11==0)||(n!=13 & n%13==0)||(n!=17 & n%17==0)||(n!=19 & n%19==0)||
           (n!=23 & n%23==0)||(n!=29 & n%29==0)||(n!=31 & n%31==0)||(n!=37 & n%37==0))
            cout << "No es primo";
        else
            cout << "Es primo";
    }

    Pero pues de eso no se trata, los ciclos son para evitar las cantidades interminables de ifs, así que usémoslos.

    Ah y recuerden que si corren un programa y su compilador no se pausa solo, tienen que agregar cin.get();cin.get(); al final del programa, antes de la llave de cierre del main.

    Si llegaste aquí buscando un programa para saber si un número es primo o no, sigue el link que está al principio del post.

    Introducción a string.h

    string.h es una librería de c++ que contiene funciones que nos facilitan la vida al trabajar con cadenas o strings. Una cadena es un conjunto de caracteres almacenados en una variable.

    Deberíamos saber que char es un tipo de dato que almacena un caracter, por lo tanto un arreglo lineal de caracteres es una cadena:

    char str[100];

    Ahora podemos llenar nuestra cadena..

    str ="Soy una cadena";

    …y mostrarla

    cout << str;

    Pero recuerden que no podemos hacer nada de esto si no tenemos incluida la librería string.h. Vamos a ver un programa de ejemplo:

    #include<string.h>
    #include<iostream>
    using namespace std;
     
    int main()
    {
        char esunacadena[100] = "Soy una cadena", esunacopia[100];
        strcpy(esunacopia, esunacadena);
        strcat(esunacopia, " - copia");
        cout << esunacadena << endl << esunacopia;
        cin.get();
        return 0;
    }
    1. Primero declaramos dos cadenas (‘esunacadena’ y ‘esunacopia’) que pueden tener hasta 100 caracteres, ‘esunacadena’ la llenamos con el texto “Soy una cadena“.
    2. Luego con la función strcpy copiamos el contenido de ‘esunacadena’ a ‘esunacopia’. Ahora las dos cadenas tienen el mismo texto.
    3. Ahora con la función strcat agregamos el texto ” - copia” al final de’esunacopia’.
    4. Al final solo mostramos las dos cadenas.

    Bastante fácil ¿no? En los próximos días voy a postear otros programas muy sencillos para seguir checando las funciones mas comunes para trabajar con cadenas.

    Centrar texto automáticamente sin gotoxy

    Pues si, en este post vamos a hacer un programa en c++ que lee una frase y luego la muestra centrada en la pantalla, todo eso ¡sin usar gotoxy! wow.

    Bueno, usando gotoxy sería mas fácil, pero este blog promueve el no uso de la librería conio.h (Cómo dejar de usar conio.h) así que lo vamos a hacer como les dije.

    #include<iostream>
    #include<string.h>
    using namespace std;
     
    int main()
    {
        char str[100];
        cout << "Una frase: "; cin.getline(str, 100, '\n');
        int numofch = strlen(str);
        for(int i=1; i<(40-(numofch/2)); i++)
            cout << " ";
        cout << str;
        cin.get();
        return 0;
    }

    A la consola le caben 80 caracteres a lo largo, su mitad son 40; enseguida tenemos que averiguar el numero de caracteres que tiene la frase que se acaba de introducir y dividirlo entre dos. Supongamos que la frase es “hola”:

    1. ‘Hola’ tiene 4 caracteres.
    2. La mitad de la consola es 40.
    3. Si a los 40 le restamos la mitad de los caracteres de la frase, obtenemos el punto en donde debe comenzar la frase para quedar centrada. 40 – (4/2) = 38
    4. Ahora con un ciclo damos 38 espacios y luego imprimimos la frase.

    Si quieren utilizar gotoxy, el proceso es el mismo hasta el último paso, donde guardarían el valor obtenido en una variable y luego lo pondrían en el lugar adecuado de la función.

    La función strlen está en la librería string.h y nos devuelve el número de caracteres que tiene una cadena, viene de string length.

    A propósito me he dado cuenta que no he hablado casi nada de la librería string.h, voy a ver si hago unos cuantos posts sobre ella.

    Declarar variable dentro de un ciclo for

    En el programa anterior use la “técnica” de declarar una variable dentro de un ciclo for y luego de publicarla me di cuenta de que algunas personas podrían encontrar eso algo confuso.

    Es casi exactamente lo mismo escribir esto:
    int i=0;
    for(i=0; i<=10; i++)
    {
    printf("%i", i);
    }

    …que esto:
    for(int i=0; i<=10; i++)
    {
    printf("%i", i);
    }

    La única diferencia es que en el primero ‘i’ es una variable como cualquier otra y en el segundo ‘i’ solo sirve dentro del ciclo for. Esto mas que ser una desventaja es una ventaja, ya que te permite usar la misma variable en todos lo ciclos que quieras en el mismo programa. Yo en lo personal siempre uso ‘i’ como la variable que controla cualquier ciclo, si llegara a haber un ciclo dentro de otro, uso ‘ii’.

    Páginas: Anterior 1 2 3 4 5 6 7 8 9 Siguiente