Bueno, en esta ocasión vamos a ayudarle a un comentarista de este blog con sus problemas, el me ha pedido un programa que cuente la cantidad de números primos que hay en un rango, no se ha conformado con saber si un número es primo o no o con saber cómo mostrar los números primos en un rango, asà que le vamos a ayudar con la única parte de su programa que le falta: saber cómo contar el número de veces que sucede algo.
Para esto vamos a usar una variable tipo int (entero) que va a ir aumentando una unidad cada vez que ocurra ese ‘algo’ que queremos contar. Veamos como funcionarÃa un contador dentro de un ciclo:
#include<iostream>
using namespace std;
int main()
{
int contador=0;
for(int i=0; i<10; i++)
contador++;
cout << contador;
}
Obviamente esto muestra un 10 en pantalla. Porque la variable ‘contador’ aumenta una unidad cada vez que el ciclo da una vuelta.
contador++; es lo mismo que contador = contador + 1;
Ahora veamos como funciona si agregamos una condición:
#include<iostream>
using namespace std;
int main()
{
int contador=0;
for(int i=0; i<10; i++)
{
if(i==5)
contador++;
}
cout << contador;
}
Esto obviamente muestra en pantalla un 1, porque solo una vez i vale 5. Ahora con una condición más complicada:
#include<iostream>
using namespace std;
int main()
{
int contador=0;
for(int i=0; i<10; i++)
{
if(i%2==0)
contador++;
}
cout << contador;
}
Con el operador % se obtiene el residuo de la división de los dos números entre los que está. Si la condición es que i/2 tenga residuo un de 0, significa que estamos dejando pasar sólo los números pares, por lo que deberá mostrarse en pantalla un 5.
Qué fácil no?, ahora nuestro amigo ya tiene todo lo necesario para armar su programa.
Una función a veces útil a veces no mucho es el delay(), sirve para hacer una pausa de ‘n’ segundos. En algunos compiladores Borland esta función se incluye en la librerÃa conio.h pero como aquà estamos del lado del software libre vamos a hacer nosotros mismos esta función. Primero veamos cómo se usa:
delay(variable_tipo_int);
es decir:
int secs=10;
delay(secs);
o
delay(numero_entero);
es decir:
delay(12);
Y claro, la función es esta:
void delay(int secs) {
for(int i = (time(NULL) + secs); time(NULL) != i; time(NULL));
}
- La función time(NULL) nos devuelve el segundo exacto en que estamos.
- Si le sumamos cierta cantidad de segundos obtenemos una fecha en el futuro.
- En cada vuelta del ciclo se checa si esa fecha en el futuro es diferente a la fecha actual.
- En cuanto las dos fechas son iguales el ciclo acaba y el programa continúa.
Veamos como se usa en un programa en c++:
#include<time.h>
#include<iostream>
using namespace std;
void delay(int secs) {
for(int i = (time(NULL) + secs); time(NULL) != i; time(NULL));
}
int main()
{
int sec;
cout << "Segundos a pausar?: "; cin >> sec;
delay(sec);
}
Para poder usar la función delay de esta forma es necesario ponerla en todos los programas en donde necesitemos usarla (ahora me doy cuenta que no he escrito mucho sobre funciones) e incluir siempre la librerÃa #include<time.h> o #include<ctime>.
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.