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();
}
- Primero declaramos un string de nombre strrnd.
- Luego inicializamos nuestro random.
- Con un ciclo recorremos cada elemento del string.
- 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.
- 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.
Guardado en: Blog el 18 de septiembre del 2010
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).
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:
- Nombre. El nombre de la variable que va a contener el string
- Longitud. La cantidad de caracteres que queremos que se puedan introducir (nunca mayor que la longitud del string).
- 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.
¿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.
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.
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;
}
- Primero declaramos dos cadenas (‘esunacadena’ y ‘esunacopia’) que pueden tener hasta 100 caracteres, ‘esunacadena’ la llenamos con el texto “Soy una cadena“.
- Luego con la función strcpy copiamos el contenido de ‘esunacadena’ a ‘esunacopia’. Ahora las dos cadenas tienen el mismo texto.
- Ahora con la función strcat agregamos el texto ” - copia” al final de’esunacopia’.
- 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.
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”:
- ‘Hola’ tiene 4 caracteres.
- La mitad de la consola es 40.
- 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
- 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.
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’.