El operador módulo en C++

En este artículo quiero mostrarte un operador básico y la resolución de un ejemplo en c++ usando este operador.  Si eres capaz de comprender su funcionamiento y de comprender al 100% el ejemplo, conseguirás abrir tu abanico de visión para la resolución de problemas.

El operador módulo, % en lenguaje C++,  es un operador binario y tiene sentido solo para números enteros. Se utiliza de la siguiente manera; sean A y B dos números enteros, si realizamos la operación A%B el resultado que obtenemos será el resto de la división entre A y B.

A primera vista parece que este operador no va a ser muy utilizado en programación, pero resuelve infinidad de problemas. Un ejemplo de un problema que resuelve este operador es, la devolución del cambio en una máquina expendedora de latas de refresco o de tabaco. Piensa en cómo podríamos calcular el cambio con este operador. Antes de eso vamos a usarlo en un ejemplo más sencillo:

Realiza un programa que te diga si un número es par o impar. Vamos a analizar este problema. Vamos a imaginar un número cualquiera, imaginemos que es un par, ¿que características tienen los números pares?. Los números pares si los dividimos entre 2 siempre son exactos, por tanto, el resto es cero.  Con este análisis y con el uso del operador %. Hemos resuelto el problema. El programa pedirá un número al usuario por la salida estándar y comprobará si el módulo de ese número es cero, si es esi, devolverá por pantalla PAR, en caso de ser falso devolverá IMPAR. La implementación es la siguiente:

Espero que hayas comprendido este problema. Voy a plantearte otro problema y quiero que intentes solucionarlo siguiendo las pautas de análisis, diseño e implementación.

Imagina que tenemos una máquina de refrescos que admite monedas de 1 euro, 50 centimos de euro, 10 centimos de euro y 1 centimo de euro, crea un programa que muestre un producto y un precio, por ejemplo, fnata————–2,2o €, y que permita al usuario teclear un importe exacto o superior. El programa deberá calcular el cambio en el menor número de monedas posibles.

Intenta la solución del problema propuesto, me gustaría que me comentaras si lo has conseguido implementar. También me gustaría que si te surge alguna duda me la expusieses en la zona de comentarios. YO personalmente contestare a las mismas.

Un saludo,

Javi Pizarro

Acerca de Javi Pizarro

Ingeniero informático dedicado a la docencia, con experiencia en creación de programas de gestión y desarrollo de aplicaciones web.
Esta entrada fue publicada en Programacion y etiquetada , , , , , , , , , , , , . Guarda el enlace permanente.

39 respuestas a El operador módulo en C++

  1. Samu dijo:

    como se haria el programa de la maquina de refrescos?? no se como hacerlo

    • raul galvez cachairo dijo:

      socio hola yo no se nada pero creo que deverias de empezar por un voceto de tu codigo ;declara las librerias declara las variables y luego intenta buscar una solucion al problema(ahi es donde no te puedo ayudar por que tampoco tengo la respuesta a mi no me a salido)pero no se por que me da que la solucion es mas facil de lo que parece
      ADEW

  2. raul galvez cachairo dijo:

    wenas Javi
    mira e conseguido hacer un programa que hace la mitad de lo que tu pides: me pide el dinero,reconoce si falta,si esta justo,si hay que dar cambio y te cal el cambio bien, pero sigo sin ver donde utilixar el operador% ni como puedo utilizarlo, aver si me pudieras dar algun cosejillo.
    Gracias.

    • Javi Pizarro dijo:

      ok, tu tienes el cambio que hay que devolver. Piensa en las monedas que tienes. Te voy hablar en € por que estoy en Europa. En euros tenemos monedas de 1€ de 0,50€ de 0,20€ de 0,10€ y de 0,01€. Entonces piensa, imagínate que tienes que devolver 0,30 €.

      Yo divido 0,30 / 1 y el cociente me da 0, por tanto no tengo que devolver nada de 1€
      si divido 0,30/0,50 también el cociente es cero por tanto no tengo que devolver ninguna moneda de 0,50€
      si divido 0,30 / 0,20 el cociente es 1—-> por tanto tengo que devolver una de 0,20 € ¿Cual es el nuevo cambio ahora? el nuevo cambio será el resto de la última división, o sea, el resto de 0,30/0,20 y el resto de una división se optiene con el operador %.

      Piensa esto que te he dicho e intenta realizar el programa. Coméntame todas tus dudas.
      Un saludo.

  3. raul galvez cachairo dijo:

    otra cosilla perdona en el codigo aqui expuesto declaras tres librerias las dos primeras se mas o menos lo que son pero la string no.Bueno mas o menos si para las cadenas ¿no?
    ¿string es para el operador %?

    • Javi Pizarro dijo:

      La librería es para el tipo de dato string, por ello la pongo. Aunque no use ese tipo de dato siempre la pongo, es una costumbre. El operador % esta predefinido en el código c++ y no es necesario introducir ninguna librería para su uso.
      Un saludo.

  4. raul galvez cachairo dijo:

    javi wenas
    no e conseguido implementar el codigo de la maquina de refresco
    creo que todavia no domino lo que hemos ido aprendiendo en capitulos anteriores lo estoi repasando a ver que me e dejado atras de todo lo que nos as enseñado
    no te comento esto esperando la solucion,te lo comento por que estoi frustraillo con el operador%,lo unico que voi a hacer es dejarlo pendiente y todos los dias le dedicare un rato asta que vea la solucion al problema, cuando tenga un poco mas de conocimiento del lenguaje ,ahora eso si cuando lo consiga te lo pondre en los comentarios para que veas que lo e conseguido,y que quiero aprender y terminar lo que he empezado.
    GRACIAS javi.

    • Javi Pizarro dijo:

      Piensa lo siguiente. Vas a tener el Cambio y las monedas que utilizas. Entonces debes de jugar con el cociente de la división (este es el numero de monedas de ese tipo a devolver) y el nuevo valor del cambio que es el resto de esa división. Os doy una pista

      Cambio / MONEDA = numero de MONEDA a devolver;
      Cambio/ MONEDA= nuevo cambio; // Este es el nuevo cambio que surgirá, ten en cuenta que no necesitas una variable distinta si no que puedes ir actualizando laq variable cambio

  5. raul galvez cachairo dijo:

    wenas otra vez
    con cuantas variables tendriamos que hacer el programa??
    yo he calculado una variable pora cada moneda, otra para el cambio , otra con el precio y otra para guardar el dinero con «cin>>»
    crees que me sobran o me faltan variables solo eso por que cuantas mas vueltas le doi creo que me arian falta cuatro mas por lo menos para los resutados
    puede ser?? toi to verde
    GRACIAS

    • Javi Pizarro dijo:

      correcto, necesitas una con el precio inicial del tabaco, ese precio lo marcas tu por ejemplo 2,5€
      otra con el precio que introduce el usuario (puedes comprobar si el usuario a introducido un precio menor o igual) si el precio del usuario es mayor pues entonces hay que calcular el cambio (otra variable) entonces cambio=preciousuario-precioproducto
      y luego tienes que tener una por cada moneda que utilices. puedes elegir el cambio en la moneda que quieras siempre que uses la mas pequeña que en € sería 1 centimo. Ánimo que ya casi lo tienes.

  6. raul galvez cachairo dijo:

    wenas
    muchas GRACIAS lo he conseguido
    aqui te dejo el codigo por si no te importa echarle un vistazo
    asi era mas o menos no??
    #include
    #include
    #include

    using namespace std;

    int main()
    {
    int lata=220, dinero=0, cambio=0;
    int euro1=0, euro2=0, euro3=0, euro4=0, euro5=0, euro6=0;

    cout<<" precio 220 "<>dinero;

    cambio=dinero-lata;
    if(lata>dinero){
    cout<<" falta dinero "<<endl;
    }
    else
    if(lata==dinero){
    cout<<" su lata gracias "<lata)
    cout<<"total ha devolver "<<cambio<<endl;
    if(cambio/400==1){
    cambio=cambio%400;
    euro1=4+euro1;}
    if(cambio/300==1){
    cambio=cambio%300;
    euro1=3+euro1;}
    if(cambio/200==1){
    cambio=cambio%200;
    euro1=2+euro1;}
    if(cambio/100==1){
    cambio=cambio%100;
    ++euro1;}

    if(cambio/50==1){
    cambio=cambio%50;
    ++euro2;}
    if(cambio/20==1){
    cambio=cambio%20;
    ++euro3;}
    if(cambio/10==1){
    cambio=cambio%10;
    ++euro4;}
    if(cambio/5==1){
    cambio=cambio%5;
    ++euro5;}

    if(cambio/4==1){
    cambio=cambio%4;
    euro6=4+euro6;}
    if(cambio/3==1){
    cambio=cambio%3;
    euro6=3+euro6;}
    if(cambio/2==1){
    cambio=cambio%2;
    euro6=2+euro6;}

    if(cambio%2==1){
    cambio=1-cambio;
    ++euro6;}

    cout<<"monedas de 1 Euro "<<euro1<<endl;
    cout<<"monedas de 50 cnts "<<euro2<<endl;
    cout<<"monedas de 20 cnts "<<euro3<<endl;
    cout<<"monedas de 10 cnts "<<euro4<<endl;
    cout<<"monedas de 5 cnts "<<euro5<<endl;
    cout<<"monedas de 1 cnts "<<euro6<<endl;

    cout<<"comprobacion de resto del cambio "<<cambio<<endl;
    getch();
    return 0;
    }

  7. raul galvez cachairo dijo:

    muchas gracias javi
    estoi ansioso de aprender y poderlo hacer mas simple y mejor
    gracias

  8. PANCHITO dijo:

    Bueno ya despues de 2 dias me salio mas o menos jejeje, mi maquina de refrescos da muy bien el cambio, pero el problema es que si deposito el doble o mas del doble, se cobra 2 refrescos, o bien los que se puedan comprar con el deposito.
    Use 3 variables: el deposito, el precio y el cambio.
    Para obtener el cambio fue asi:
    Ejemplo:
    1) El refresco cuesta 5.20 euros (cabe aclarar que en el programa tuve que multiplicarlo por 10 al igual que el deposito que hiciera el comprador, ya que INT no acepta decimales)
    2) El comprador deposita 9 Euros
    3) se obtiene el residuo con 90%52=38 (el deposito de 9 euros lo multiplique por 10, ya que el precio 5.20 tambien estaba multiplicado por 10)
    4) De esos 38 hay que ver cuantas monedas de 10 se pueden devolver ( osea monedas de 1 euro (porque todo esta multiplicado por 10)), entonces:
    38/10=3 monedas
    5)Ahora con el residuo de la operacion anterior se obtienen las de 5 (0.5 euros), entonces: (38%10)/5 = 1 moneda
    6)Y asi con el residuo de la operacion anterior se obtienen las demas monedas de 0.20 y 0.10:
    ((38%10)%5)/2 =1 moneda
    (((38%10)%5)%2)/1 =1 moneda
    7)fin

    Por momentos me desesperé por no saber la solucion, pero hoy en la mañana me desperte pensando que mejor pensaria y pensaria el problema antes de prender el PC.
    Y lo logré.
    Ahora el programita:

    #include <iostream>
    #include <conio.h>
    #include <string.h>
    using namespace std;

    int main(){
    int numero, precio=52, cambio;

    cout<<«Quieres un refresco? El precio es de 5.20 Euros. Deposita tu moneda: «;
    cin>>numero;
    cambio=((numero*10)%precio);
    if((numero*10)<52)
    cout<<«Oops! Te falta dinero»;

    else {
    cout<<(cambio/10)<<» monedas de 1 Euros.\n»;

    cout<<((cambio%10)/5)<<» monedas de .50 Euros.\n»;

    cout<<(((cambio%10)%5)/2)<<» monedas de .20 Euros.\n»;

    cout<<((((cambio%10)%5)%2)/1)<<» monedas de .10 Euros.\n»;

    cout<<«\nGracias por comprar en C++, ahora imprima su refresco»;
    }

    getch();
    }

    El problema es que si deposito 52 euros, se cobra 10 refresco y no da cambio jajaja

    • Javi Pizarro dijo:

      Tu fallo es que el cambio lo calculas con el % por lo que cuando hay multiplo del precio te cobra muchas latas…. el cambio calculalo como el numero-precio, prueba a ver si asi te sale. Muy bien por la costancia, ese espiritu te hará llegar lejos.
      Un saludo

      • Daniel hdez dijo:

        ya le entendi al ejemplo que el puso, pero hay algo que aun no me cuadra y es que no puedo mostrar el cambio

  9. PANCHITO dijo:

    Muchas gracias Javi, solucioné el problema de mi maquina de refrescos.
    En vez sacar el residuo con el operador modulo %
    cambio=((numero*10)%precio);
    use ahora una resta
    cambio=((numero*10)-precio);

    y ahora con un deposito de 52 euros me da un refreco mas mi cambio (46.80 euros) y no 10 refrescos y nada de cambio jejeje

    Me gusto mucho este ejercicio, me hizo pensar mucho y me dio una vista en general para usar los operadores tanto basicos y relacionales como logicos.

    y ahora lo que sigue…..
    Saludos

    • Daniel hdez dijo:

      Eres grande segui tu ejempl y pues yo soy de Mexico, y lo maneje asi para mostrar el cambio:

      #include
      #include
      #include

      using namespace std;
      int main ()
      {
      int producto=52;
      int dinero;
      int cambio;
      cout<<"Chocolate: 5.20"<<endl;
      cout<<" Introduce el dinero"<>dinero;
      if((dinero*10)==producto)
      cout<<"Gracias por tu compra.."<<endl;
      if((dinero*10)<52)
      cout<<"Te falta dinero"<52)
      cambio=((dinero*10)-producto);
      cout<<"Tu cambio es: "<<(cambio*10)<<" Centavos"<<endl;
      cout<<(cambio/10)<<" Monedas de 1 peso"<<endl;
      cout<<((cambio%10)/5)<<" monedas de 50 centavos"<<endl;
      cout<<(((cambio%10)%5)/2)<<" Monedas de 20 centavos"<<endl;
      cout<<((((cambio%10)%5)%2)/1)<<" Monedas de 10 centavos"<<endl;

      getch ();
      }

      • wilson alfonso dijo:

        migo that code has an error in line cout << " chococolate : 5.20 " << endl ; the complidador shows me 9 errors,
        if you want to talk and discuss the program I just have my doubts that it is so then I write to your email

  10. PANCHITO dijo:

    vientos!que bueno que te haya servido de ayuda mi codigo, yo tambien soy de Mexico. Te recomiendo que uses el codigo sourcecode para mostrar correctamente tus codigos fuente.
    Es el siguiente , solo remplaza la X con un ]

    tu codigo fuente
    tu codigo fuente
    tu codigo fuente
     
    • PANCHITO dijo:

      Oops! no salio como lo esperaba jeje, va la buena:
      [sourcecode language=»cpp»]
      tu codigo fuente
      tu codigo fuente
      tu codigo fuente
      [/sourcecode]

      saludos

  11. anthony fabricio lanasa dijo:

    usando un metodo parecido como comprobar que un numero ingresado por el usuario es binario o no ? gracias

  12. marimen dijo:

    Como reconozco si un programa en c++ tiene 4 modulos

  13. caro dijo:

    oye como se haria para conjunto ejemplo hacer una lista de alumnos q por numero de lista q te diga si son par o son impar con la funcion mod y con for

  14. caro dijo:

    si m podrias ayduar

  15. leonardo plaza dijo:

    oye la verdad que no logre terminar este ejercicio. a mi punto de vista… nos explicas un modulo que funciona solo con numeros enteros pero nos pides encontrar un resultado con monedas que estan denominadas en numeros reales. es algo contradictorio. de resto todo excelente. me has ayudado mas que mi profesor de programacion de la uni

  16. help, dijo:

    ME podrian ayudar debo hacer un programa donde ingrese letras y me imprima solo vocales.

  17. aldo dijo:

    hola aqui les dejo mi codigo espero lo comenten soy de mexico y tengo tan solo 1.5 mes programando y mis monedas son pesos mexicanos de 1 , 2, 5 ,10 pesos, si me pudieran indicar correcciones en mis comentario se los agradeceria mucho, y quiero estudiar programacion de videojuegos ojala y me puedan dar algun consejo bonito fin.

    //Aldo Sanchez Garcia 20/05/14
    //Implementacion del operador «%» modulo
    //maquina expendidora de refrescos monedas (10 , 5 , 2 , 1 )

    #include
    using namespace std;

    int mdc ( int sdm , int refresco ); //funcion mdc

    int main(){

    int refresco(6); //valor del refresoco
    int moneda1; //valor de la moneda ingresada por el usuario
    int sdm; //suma de las monedas ingresadas por el usuario

    char letra;
    int letra1;

    cout< $6.00 pesos. \n acepto monedas de 10 , 5 , 2 , 1 Quieres? si Y no N \n \n \n \n»;
    cin>>letra;
    letra1=(int)letra; // cambio de variable de char a int.

    for (sdm = 0 ; sdm < refresco;){

    if (letra == 89 || letra == 121){

    if (sdm < refresco){

    for ( moneda1 = 0 ; moneda1 != 1 , moneda1 != 2 , moneda1 != 5 , moneda1 != 10;){ // siempre que moneda1 no sea == a 1 , 2 , 5 , 10 se repetira

    cout<>moneda1;
    cin.ignore();

    if (moneda1 != 1 && moneda1 != 2 && moneda1 != 5 && moneda1 != 10) {

    cout<< " denominacion invalida bro, unicamente manejo monedas de \n \n \n 1 , 2 , 5 , 10 \a " <<endl; // cuando moneda1 no sea == 1 , 2 , 5 ,10 me mostrara este cout
    }
    else {break;} // cuando moneda es == 1 o 2 o 5 o 10 se rompe con el ciclo for linea 36 y se pasa a la suma.
    }

    sdm=sdm+moneda1; //el valor ingresado por el usuario se guarda en moneda 1 y se suma con sdm el valor se guarda en sdm y se acumula con las demas monedas que ingrese el usuario.

    }

    }

    else{

    cout<:p «;
    cin.get();
    return 0;
    }

    if (sdm > refresco){ // se ejecuta el if cuando sdm es mayor que el valor de refresco

    cout<< "toma tu PiPicola y ";
    cin.get();
    sdm % refresco; // se realiza y se guarda la diferencia entre sdm y refreso gracias al operador modulo %
    mdc ( sdm , refresco ); // se llama la funcion mdc
    cin.get();
    }

    else if ( sdm == refresco){

    cout<< "deposito exacto, toma tu PiPiCola bro! ";
    cin.ignore();

    }

    }
    return 0;
    }

    int mdc ( int sdm , int refresco ){ // con la operacion declarada de modulo "%" se ejecuta switch

    switch(sdm % refresco){

    case 1:

    cout<< "tu cambio es $1.00 pesos en una moneda de un peso.";
    break;

    case 2:

    cout<< "tu cambio es de $2.00 pesos en una moneda de dos pesos ";
    break;

    case 3:

    cout<< "tu cambio es de $3.00 pesos en una moneda de un peso y una moneda de dos pesos ";
    break;

    case 4:

    cout<< "tu cambio es de $4.00 pesos en dos monedas de dos pesos ";
    break;

    }

    }

  18. Ivan dijo:

    «El operador módulo, % en lenguaje C++, es un operador binario y tiene sentido solo para números enteros. »
    EL operador módulo o residuo (%) NO es binario. La razón misma está en la afirmación anterior: tiene dominio y rango en los enteros. Por lo tanto, no puede ser binaria.

    • Javi Pizarro dijo:

      Hola Ivan, gracias por tu comentario. Con binario me refiero a que el operador se utiliza entre dos valores o argumentos, así es como se considera a este tipo de operadores en c++. Saludos.

  19. Eddie dijo:

    Hola, acabo de entrar y acabo de ver tu publicación, voy a tratar hacerlo, deseame suerte

  20. Andres Hernandez dijo:

    Muy buena explicacion, al comienzo estaba un poco confundido, pero al hacer los ejercicios entendi perfectamente el funcionamiento del operador modulo.
    Relacione mucho su funcionamiento a cuando queremos pasar un numero decimal a numero binario que dividimos y dividimos por %2, tanto que me puse a la tarea de hacer un programa para ello.
    Gracias por la explicacion.

  21. Andres Ramirez dijo:

    hola amigo, tengo una pregunta, bueno es mas un problema con un codigo y me preguntaba si me podias ayudar. La idea es que al ingresar dos numero, A y B el programa calcule y me muestre el maximo comun divisor y el minimo comun multiplo. el codigo es este

    #include
    using namespace std;

    int main() {
    float a;
    float b;
    float mcd;
    float mcm;
    float n;
    float q;
    float r;
    cout << "ingrese los valores enteros a calcular" <> a;
    cin >> b;
    if (b==0) {
    mcd = a;
    } else {
    n = b;
    r = a%n;
    if (r==0) {
    mcd = b;
    } else {
    do {
    q = n%r;
    if (q==0) {
    mcd = r;
    } else {
    n = r;
    r = q;
    }
    } while (r!=mcd);
    }
    }
    mcm = (a*b)/mcd;
    cout << "Valores ingresados a= " << a << " b= " << b << endl;
    cout << "Maximo comun multiplo " << mcm << endl;
    cout << "Minimo comun divisor " << mcd << endl;
    return 0;
    }

    pero al compilarlo me salta el siguiente error: [Error] invalid operands of types 'float' and 'float' to binary 'operator%' me gustaria que me ayudaras a arreglar el codigo y que me dijeras porque salta este error. Gracias

    P.D. la version del Dev c++ que tengo es la 5.1.1

  22. Yo hice uno mas sencilo, claro que es mas bien como una parte del programa pero vere como hacer lo demas. La publicacion ya es de hace mucho haber si revisas de vez en cuando jaja :v
    #include

    #define REF 10

    int main(){

    /*Declaracion de variables*/

    int din, cam, dif;
    float mod;

    /*Entrada de datos*/

    printf(«\n Deposite $%i pesos \n\n»,REF);

    scanf(«%i»,&din);

    /*Relacion para dar cambio*/

    mod=din /REF;

    dif=REF-din;

    cam=din-REF;

    /*Condiciones*/

    if(mod0){ printf(«Su cambio seria. $%i pesos», cam);

    printf(«\n\n Gracias por su compra. ¡DEBERIA TOMAR MAS AGUA!\n «);

    }

    getch();

    return 0;

    }

  23. RAFT dijo:

    Tengo una duda, por qué es que si es un operador binario, a veces me entrega como resultado un 2?

  24. JORGE RIVERA dijo:

    Hola saben, tengo un problemita, en la hora de prograr cuando es (par y impar,) sigo el ejemplo y de igual forma no me funcion el modulo, no se que hacer, ya probe de muchas forma y ninguna me funciona, me ayudan,,,? Saludos

  25. arito dijo:

    Hacéte un curso de diseño gráfico. Nuna se pone fondo oacuro y letra oscura, siempre debe ser en contraste, sino no se lee nada.

Replica a Ivan Cancelar la respuesta