Utilizar o Operador Modulo em C++

Jinku Hu 12 outubro 2023
  1. Utilizar o % Operador para calcular o resto em Divisão
  2. Utilizar o operador % para gerar números inteiros aleatórios inferiores a um determinado número máximo em C++
  3. Utilizar objectos de função definidos pela biblioteca para substituir o operador % em C++
Utilizar o Operador Modulo em C++

Este artigo irá introduzir como utilizar o operador do módulo em C++.

Utilizar o % Operador para calcular o resto em Divisão

A característica padrão do operador do modulo (%) é calcular o restante de uma divisão. O valor de retorno da declaração - x % y representa o restante após x é dividido por y. O operador do modulo é definido de modo a que ambos os operandos sejam inteiros e um divisor não seja zero. O exemplo seguinte demonstra o operador do modulo utilizado com diferentes pares de números inteiros assinados. Note-se que, para imprimir o carácter % para a consola utilizando a função printf, devemos utilizar %.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};

  for (size_t i = 0; i < ivec1.size(); ++i) {
    printf("% -d %% % -d = % -d\n", ivec1[i], ivec2[i], ivec1[i] % ivec2[i]);
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

 24 %  7 =  3
 24 %  8 =  0
-24 % -8 =  0
-24 % -7 = -3
 24 % -6 =  0

Utilizar o operador % para gerar números inteiros aleatórios inferiores a um determinado número máximo em C++

A utilização alternativa do operador do módulo é controlar o gerador de números aleatórios para fornecer apenas números inferiores a um número inteiro específico. Um programador é responsável pela escolha do array de ferramentas de geração de números aleatórios dependendo da necessidade de qualidade da aleatoriedade, mas ambos os métodos podem ser combinados com % para especificar o limite superior dos números gerados. Neste caso, utilizamos a função rand, cujo valor de retorno é emparelhado com o valor máximo desejado utilizando o operador modulo.

#include <ctime>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

constexpr int MAX = 1000;
constexpr int NUMS_TO_GENERATE = 10;

int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};

  std::srand(std::time(nullptr));
  for (int i = 0; i < NUMS_TO_GENERATE; i++) {
    cout << rand() % MAX << "; ";
  }
  cout << endl;
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

98; 194; 398; 190; 782; 550; 404; 557; 509; 945;

Utilizar objectos de função definidos pela biblioteca para substituir o operador % em C++

A biblioteca padrão C++ define múltiplas classes que representam operadores aritméticos, relacionais e lógicos tradicionais. Estes são chamados objectos de função e têm nomes como std::plus<Type>, std::modulus<Type> e etc. Type especifica o tipo de parâmetro do operador de chamada. A seguinte amostra de código mostra o objecto de função std::modulus utilizado em vectores de números inteiros.

#include <ctime>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};

  std::modulus<> intMod;
  int mod_of_nums = intMod(ivec1[1], ivec2[1]);
  printf("%d %% %d = %d\n", ivec1[1], ivec2[1], mod_of_nums);

  return EXIT_SUCCESS;
}

Resultado:

24 % 8 = 0
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook