Code source de main.cpp

Retour accueil

Colorisation syntaxique par GeSHi

Retour à la ligne : désactivé
PROGRAMME DE CALCUL DE NOMBRES PREMIERS © Yannvag 2008
  1. // PROGRAMME DE CALCUL DE NOMBRES PREMIERS
  2. // (c) YANNVAG 2008
  3. // http://nombrespremiersliste.free.fr/
  4.  
  5. // ATTENTION !
  6. // Le code n'est pas très propre, ça peut être pour vous un grand fouillis
  7. // Je n'ai pas non plus créé de fonctions pour calculer les nombres premiers pour une raison de rapidité
  8. // En effet le programme mettra moins de temps à les calculer si les instructions de calcul sont intégrées directement, sans passer par de fonctions
  9. // Donc si je n'ai pas fait un programme standard POO ou je ne sais trop quoi, c'est bien volontairement
  10. // ===========
  11.  
  12.  
  13.  
  14. #include <iostream>
  15. #include <vector>
  16. #include <fstream>
  17. #include <cmath>
  18. #include <sstream>
  19.  
  20.  
  21. using namespace std;
  22.  
  23.  
  24. template<typename T>
  25. bool from_string( const string & Str, T & Dest )
  26. {
  27.         // créer un flux à partir de la chaîne donnée
  28.         istringstream iss( Str );
  29.         // tenter la conversion vers Dest
  30.         return iss >> Dest != 0;
  31. }
  32.  
  33.  
  34. int main(int argc, char *argv[])
  35. {
  36.         vector<unsigned long> nombrespremiers;
  37.         // Le tableau (vecteur) contenant tous les nombres premiers
  38.  
  39.         unsigned long nombreencours = 5;
  40.         // Le dernier nombre premier trouvé
  41.  
  42.         unsigned long minlimit=0;
  43.         // Limite minimum (servira par la suite)
  44.  
  45.         bool newfile = true;
  46.         // Créer un nouveau fichier ? (servira par la suite)
  47.  
  48.         cout << "Bienvenue dans le programme de generation de nombres premiers" <<endl;
  49.         cout << "(c) Yannvag 2007" <<endl <<endl;
  50.  
  51.         cout << "Vous pourrez arreter le programme a touts moments, il suffit de faire CTRL+C" <<endl <<endl;
  52.         cout << "Demarrage du systeme de fichier..." <<endl;
  53.  
  54.         char response_loadfic;
  55.         cout << "Voulez-vous reprendre une ancienne sauvegarde ? (o ou n) : ";
  56.         cin >> response_loadfic;
  57.  
  58.         string nomfic;
  59.  
  60.         _Ios_Openmode ios_config; // Le mode d'ouverture du fichier
  61.  
  62.         if(response_loadfic == 'o') // Si la personne veux reprendre depuis un ancien fichier...
  63.         {
  64.                 newfile = false; // On ne créera pas un nouveau fichier pour la sauvegarde
  65.                 cout << "Entrez le nom du fichier a charger : ";
  66.                 cin >> nomfic;
  67.  
  68.                 ifstream lfichier(nomfic.c_str());
  69.  
  70.                 if(!lfichier || lfichier == NULL) // Si le fichier n'a pas pu être ouvert...
  71.                 {
  72.                         cout << "Le programme n'a pas reussit a charger le fichier...\nFin du programme" <<endl;
  73.                         cin.ignore();
  74.                         cin.ignore();
  75.                         return 0; // On arrete tout
  76.                 }
  77.  
  78.                 cout << "Fichier ok en ouverture\nChargement du fichier... (cette operation peut prendre du temps)" <<endl;
  79.  
  80.  
  81.                 // On met en memoire les nombres premiers inscrits dans le fichier de sauvegrade
  82.                 string  linebuffer;
  83.                 unsigned long linebufferlong;
  84.                 while(getline(lfichier,linebuffer))
  85.                 {
  86.                         from_string(linebuffer,linebufferlong);
  87.                         if(linebufferlong != 0)
  88.                         {
  89.                                 nombrespremiers.push_back(linebufferlong);
  90.                                 //cout << "\rLigne " << ++minlimit;
  91.                         }
  92.                 }
  93.                 // ==============================================================================
  94.                 cout << "\nFichier en memoire : operation reussie !" <<endl;
  95.  
  96.                 nombreencours = nombrespremiers[nombrespremiers.size()-1]+1;
  97.                 if(nombreencours%2 == 0)
  98.                         nombreencours++;
  99.  
  100.                 ios_config = ios_base::app; // Mode : continuer le fichier
  101.         }
  102.         else // Si la personne ne veux pas utiliser une ancienne sauvergarde
  103.         {
  104.                 nombrespremiers.push_back(2);
  105.                 nombrespremiers.push_back(3);
  106.                 cout << "Entrez le nom du fichier d'ecriture (ou vont etre inscrit les nombres premiers) : "; // On lui demande quel fichier il faut utiliser
  107.                 cin >> nomfic;
  108.                 ios_config = ios::out; // Mode : écraser le fichier
  109.         }
  110.  
  111.         ofstream fichier(nomfic.c_str(), ios_config); // On ouvre le fichier de sauvegarde
  112.  
  113.         if(!fichier || fichier == NULL) // Si le fichier ne peut être créé, alors on arrete tout
  114.         {
  115.                 cout << "Fichier erronne, reessayez" <<endl;
  116.                 cin.ignore();
  117.                 cin.ignore();
  118.                 return 0;
  119.         }
  120.  
  121.         if(newfile) fichier << "2\n3\n"; // Si on a commencé un nouveau fichier, alors on y ajoute les 2 premiers nombres premiers (vous me suivez ? ;) )
  122.  
  123.         cout << "\nLe fichier a ete ouvert correctement\nSysteme de fichier operationnel, tout est ok" <<endl <<endl;
  124.  
  125.         cout << "Entrez la limite (min : " << nombrespremiers[nombrespremiers.size()-1]+1 << ") : 0 pour aucune limite : "; // On demande la limite
  126.         unsigned long limit;
  127.         cin >> limit;
  128.  
  129.         if(limit<1) limit = 0;
  130.  
  131.         if(limit==0) // Si la limite est nul, ça veut tout simplement dire qu'il n'y en a pas : vers l'infini et au delà !
  132.         {
  133.                 cout << "Rappel : CTRL+C pour arreter" <<endl << "Calcul en cours des nombres premiers..." <<endl;
  134.                 while(1)
  135.                 {
  136.                         bool estnombrepremier = true;
  137.                         unsigned long vectorsize = nombrespremiers.size();
  138.                         unsigned long i=0;
  139.  
  140.                         while(i*i<vectorsize) // On calcul...
  141.                         {
  142.                                 if(nombreencours%nombrespremiers[i] == 0) // Si le nombre en cours de test est divisible par un des autres nombres premiers, alors c'est qu'il n'est pas premier
  143.                                 {
  144.                                         estnombrepremier = false;
  145.                                         break; // On arrête le while
  146.                                 }
  147.  
  148.                                 i++; // Sinon, on continu
  149.                         }
  150.  
  151.                         if(estnombrepremier) // Si il est premier
  152.                         {
  153.                                 nombrespremiers.push_back(nombreencours); // On l'inscrit dans la mémoire
  154.                                 fichier << nombreencours << endl; // Et on l'enregistre
  155.                                 cout << "\rDernier nombre premier trouve : " << nombreencours << " - Testes : " << vectorsize; // Et on le dit !
  156.                         }
  157.  
  158.                         nombreencours+=2; // Pas la penne de tester les nombres pairs...
  159.                 }
  160.         }
  161.  
  162.         else // Mais si il y a une limite...
  163.         {
  164.                 while(limit < nombrespremiers[nombrespremiers.size()-1]+1)
  165.                 { // On regarde d'abord si elle n'est pas inférieure aux nombre de nombres premiers déjà trouvés
  166.                         cout << "La limite est trop petite, entrez-en une autre plus grande ou egale a " << nombrespremiers[nombrespremiers.size()-1]+1 << " : ";
  167.                         cin >> limit;
  168.                 }
  169.  
  170.                 // Dans cette partie, on va demander le type d'interface voulue
  171.                 int avancement;
  172.                 cout << "Que voulez-vous ?\n1 : Affichage normal (vitesse normale, on peut se situer par rapport a l'avancement, pas d'economie du processeur)\n\n2 : Sans aucun affichage (rapide, economie du processeur, mais pas pratique) " << endl << "Votre choix : ";
  173.                 cin >> avancement;
  174.                 if(avancement < 2)
  175.                         avancement = 1;
  176.                 else
  177.                         avancement = 0;
  178.                 // ============================================================
  179.                
  180.                 if(avancement == 1) // Si on a choisi le mode normal, c'est comme avant...
  181.                 {
  182.                         cout << "\nRappel : CTRL+C pour arreter" <<endl;
  183.                         while(nombreencours<=limit)
  184.                         {
  185.                                 bool estnombrepremier = true;
  186.                                 unsigned long vectorsize = nombrespremiers.size();
  187.                                 unsigned long i=0;
  188.  
  189.                                 while(i*i<vectorsize)
  190.                                 {
  191.                                         if(nombreencours%nombrespremiers[i] == 0)
  192.                                         {
  193.                                                 estnombrepremier = false;
  194.                                                 break;
  195.                                         }
  196.  
  197.                                         i++;
  198.                                 }
  199.  
  200.                                 if(estnombrepremier)
  201.                                 {
  202.                                         nombrespremiers.push_back(nombreencours);
  203.                                         fichier << nombreencours << endl;
  204.                                         cout << "\rDernier nombre premier trouve : " << nombreencours << "/" << limit << " - Testes : " << vectorsize;
  205.                                 }
  206.  
  207.                                 nombreencours+=2;
  208.  
  209.                         }
  210.                 }
  211.  
  212.                 else // Sinon, on fait comme avant, mais on n'affiche rien
  213.                 {
  214.                         cout << "\nRappel : CTRL+C pour arreter" <<endl << "Calcul en cours des nombres premiers..." <<endl;
  215.                         while(nombreencours<=limit)
  216.                         {
  217.                                 bool estnombrepremier = true;
  218.                                 unsigned long vectorsize = nombrespremiers.size();
  219.                                 unsigned long i=0;
  220.  
  221.                                 while(i*i<vectorsize)
  222.                                 {
  223.                                         if(nombreencours%nombrespremiers[i] == 0)
  224.                                         {
  225.                                                 estnombrepremier = false;
  226.                                                 break;
  227.                                         }
  228.                                        
  229.                                         i++;
  230.                                 }
  231.  
  232.                                 if(estnombrepremier)
  233.                                 {
  234.                                         nombrespremiers.push_back(nombreencours);
  235.                                         fichier << nombreencours << endl;
  236.                                 }
  237.  
  238.                                 nombreencours+=2;
  239.  
  240.                         }
  241.                 }
  242.         }
  243.  
  244.         // Voilà, c'est terminé !!!
  245.         // OUF !
  246.         cout << "\nTermine !!!\nLe dernier nombre premier ayant ete trouve est " << nombrespremiers[nombrespremiers.size()-1] << "\nAppuyez sur une touche pour arreter le programme" <<endl;
  247.         cin.ignore();
  248.         cin.ignore();
  249.         return EXIT_SUCCESS; // On dit au revoir au programme
  250. }
  251.  
  252. // J'espere que vous avez tout compris !
  253.  
 

Retour accueil