Tag Archives: while

Números aleatorios sin repetir en C++

Ya hemos visto cómo obtener número aleatorios en c++, pero tarde o temprano surge la necesidad de generar números aleatorios pero sin que se repitan. Podría ser útil para varias cosas como por ejemplo, ordenar de manera aleatoria elementos de una lista, formas grupos aleatorios, barajear cartas, etc. Así que en algoritmo quedaría algo así:

  1. Crear una matriz y dejarla vacía.
  2. Obtener un número aleatorio.
  3. Checar si ese número existe en la matriz. Si si, regresar al paso 2. Si no, guardar el numero en la matriz.

Así que el programa es este:

#include
#include
#include
using namespace std;

bool checkrep(int n, int num[])
{
    for(int i=0; i<10; i++)
        if(n == num[i])
            return true;
    return false;
}

int main()
{
    srand(time(NULL));
    int n, num[10];
    for(int i=0; i<10; i++)
    {
        do
            n = 1 + rand() % 10;
        while(checkrep(n, num));
        num[i] = n;
        cout << num[i] << "  ";
    }
}

Primero que nada, <cstdlib> es la forma correcta de incluir la librería <stdlib.h> en c++, igual con <ctime>.

Como ven, usamos una función bool (que retorna falso o verdadero) para checar si el número aleatorio ya existe en nuestra matriz. Si cualquiera de los números es igual a nuestro número aleatorio n, la función retorna true, por lo que el ciclo do-while desde el cual llamamos la función tendrá que repetirse una vez más y hasta que la función retorne false.

Cuando se logra salir del ciclo do-while, guardamos nuestra n en el lugar de la matriz que corresponda, lo mostramos en pantalla y continuámos con la siguiente posición de la matriz.

Otra cosa. Para decirnos si un número está repetido en la matriz, la función checkrep() necesita obviamente dos cosas, el número aleatorio y la matriz. Así que le enviámos como parámetros nuestra matriz y nuestro número aleatorio.

Advertisements

Devolver cambio en C++

¿Han pagado algún recibo en una máquina automática y se han preguntado cómo será el programa que les devuelve el cambio? Lo más seguro es que no, pero pues resulta que el profesor de Miguel Ángel le encargó un programa que simulara eso, en sus propias palabras:

Supón que una maquina de monedas de 10,5,2,1 y 50 centavos. Debes escribir un programa que decida cuantas monedas dará de cambio, dando prioridad las de mayor denominación. Debe recibir como entrada la cantidad de dar a cambio. Ejemplo: para $40.50 será 4 de 10, 0 de 5, 0 de 2, 0 de 1 y 1 de 50 centavos.
Cambio
Así que el primer problema se presenta con la entrada ¿cómo hacer que el usuario introduzca sólo cantidades como $50 o $43.50 y no cantidades como $23.45 o $9.70?

Lo que se me ocurrió es pedir la cantidad en una variable float (cambio), en otra variable convertir esa cantidad a tipo int (cambioint). En ese proceso se perderá la parte decimal del número, así que si la resta cambio – cambioint es igual a 0 o igual a 0.50, la cantidad que introdujo el usuario es correcta.

La otra parte es sencilla, sólo se necesita ver si la variable cambio es mayor que 10. Si si,  se le restan 10 a la variable y se aumenta un contador. Luego se hace lo mismo con las demás monedas.

Pero bueno, el programa es este:

#include
using namespace std;

int main()
{
    float cambio; int cambioint, m10=0, m5=0, m2=0, m1=0, m50c=0;
    do
    {
        cout <> cambio;
        cambioint = (int)cambio;
    }while((cambio - cambioint) != 0 && (cambio - cambioint) != 0.50);
    while(cambio != 0)
    {
        if(cambio>=10)
        {
            m10++;
            cambio-=10;
        }
        else if(cambio>=5)
        {
            m5++;
            cambio-=5;
        }
        else if(cambio>=2)
        {
            m2++;
            cambio-=2;
        }
        else if(cambio>=1)
        {
            m1++;
            cambio-=1;
        }
        else if(cambio>=0.5)
        {
            m50c++;
            cambio-=0.5;
        }
    }
    cout << m10 << ", " << m5 << ", " << m2 << ", " << m1 << ", " << m50c;
}

Solo le faltaría darle un poco de formato a la salida, pero pues ya es cuestión de gustos y ya saben, cualquier duda aquí están los comentarios abajo.

Saber si un número es primo o no

Anteriormente vimos como imprimir los números primos en un rango determinado por el usuario, ahora la idea es pedirle al usuario un número y decirle si es primo o no es primo.

#include<iostream>
using namespace std;

int main()
{
  int num,c,res,nc=0;
  cout<<"Introduce un número: "; cin>>num;
  for(c=1;c<=num;c++)
  {
    res=num%c;
    if(res==0)
      nc++;
    if(nc>2)
      break;
  }
  if(nc==2)
    cout<<"Es primo";
  else
    cout<<"No es primo";
  cin.get();cin.get();
}

En sí, es lo mismo que el anterior. Para darle mas presentación podemos hacer que no se salga a la primera, sino hasta que se introduzca, por ejemplo, un cero. Esto se hace con un ciclo do while.

#include<iostream>
using namespace std;

int main()
{
  int num=1,c,res,nc=0,rep=0;
  while(num!=0)
  {
    cout<<"Introduce un número: ";
    if(rep==1)
    {
      cout<<" --> Para salir oprime cero: ";
    }
    rep++;
    cin>>num;
    for(c=1;c<=num;c++)
    {
      res=num%c;
      if(res==0)
        nc++;
    }
    if(nc==2)
      cout<<"Es primonn";
    else
      cout<<"No es primonn";
    nc=0;
  }
}

¿Alguien sabe porqué la variable num empieza en 1 en este caso?

Como usar ciclo While en C++

Ya dijimos en el post anterior que los ciclos infinitos for son muy parecidos a los ciclos while, pero quedó en duda cómo es un ciclo while.

While” significa “mientras“, así que nuestro ciclo while se repetira mientras una cierta condición siga siendo verdadera.El ejemplo del post anterior quedaría así:

#include<stdio.h>
#include<conio.h>
 int main()
 {
  char end=0;
  while(end!='y')
  {
    gotoxy(5,5);printf("Ya quieres salir? (y/n): ");scanf("%c",&end);
    clrscr();
  }
}

En español el programa dice: “Mientras end sea diferente de y voy a seguir preguntando si quieres salir.

Mas adelante veremos más programas que utilicen ciclos while.