Utiliser l'opérateur Modulo en C++

Jinku Hu 12 octobre 2023
  1. Utiliser l’opérateur % pour calculer le reste dans la division
  2. Utiliser l’opérateur % pour générer des entiers aléatoires inférieurs à un nombre maximum donné en C++
  3. Utiliser des objets de fonction définis par la bibliothèque pour remplacer l’opérateur % en C++
Utiliser l'opérateur Modulo en C++

Cet article présente l’utilisation de l’opérateur modulo en C++.

Utiliser l’opérateur % pour calculer le reste dans la division

La fonction standard de l’opérateur modulo (%) est de calculer le reste d’une division. La valeur de retour de l’instruction - x % y représente le reste restant après que x ait été divisé par y. L’opérateur modulo est défini de telle sorte que les deux opérandes doivent être des entiers et qu’un diviseur est différent de zéro. L’exemple suivant montre l’opérateur modulo utilisé avec différentes paires d’entiers signés. Notez que, pour imprimer le caractère % sur la console en utilisant la fonction print, nous devons utiliser %%.

#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;
}

Production :

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

Utiliser l’opérateur % pour générer des entiers aléatoires inférieurs à un nombre maximum donné en C++

Une autre utilisation de l’opérateur modulo consiste à contrôler le générateur de nombres aléatoires pour ne fournir que les nombres inférieurs à un nombre entier spécifique. Un programmeur est chargé de choisir la boîte à outils de génération de nombres aléatoires en fonction du besoin de qualité du caractère aléatoire, mais les deux méthodes peuvent être combinées avec le % pour spécifier la limite supérieure des nombres générés. Dans ce cas, nous utilisons la fonction rand, dont la valeur de retour est couplée à la valeur maximale souhaitée à l’aide de l’opérateur 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;
}

Production :

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

Utiliser des objets de fonction définis par la bibliothèque pour remplacer l’opérateur % en C++

La bibliothèque standard C++ définit plusieurs classes qui représentent les opérateurs arithmétiques, relationnels et logiques traditionnels. Ces classes sont appelées objets de fonction et portent les noms suivants : std::plus<Type>, std::modulus<Type> et etc. Le Type spécifie le type de paramètre de l’opérateur d’appel. L’exemple de code suivant montre l’objet fonction std::modulus utilisé sur des vecteurs d’entiers.

#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;
}

Production :

24 % 8 = 0
Auteur: 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