éliminer les doublons ! [Résolu]

Signaler
Messages postés
26
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
29 octobre 2009
-
Messages postés
26
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
29 octobre 2009
-
Bonsoir,

J'ai demandé de l'aide y'a 2 semaines, mais là je suis toujours bloqué !
Please help !
Je cherche à supprimer les doublons que me sort mon programme par n'importe quelle méthode.

Merci de votre aide

windows vista, dev c++




#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.c>

#define FileName "mail.txt" //fichier 65500 ligne max
#define FileName2 "ordre.txt"

char mail[1024];
int randi(int Min, int Max);

int main(int argc, char *argv[], char *envp[]){
int Number;
int Longueur=7;
int i,j;
char *temp;

printf("Nombre de Mail a generer: ");
scanf("%d", &Number);

FILE *File;File=fopen(FileName,"w");
FILE *File2;File2=fopen(FileName2,"w");

for (i=1; i<=Number; i++){
for (j=0; j<Longueur; j++){
switch(randi(1,2)){
case 1 : mail[j]=(char)randi(45,46); break;// symbole négatif
case 2 : mail[j]=(char)randi(95,122);break;
}

}
printf("%s\n",mail);// affiche à l'écran en désordre
//fprintf(File, "%s%s\%s\n", mail);// enregistre dans le fichier en désordre
}
fclose(File);fclose(File2);
system("sort mail.txt>>ordre.txt");//classe par ordre alpha
getch();

}

int randi(int Min, int Max){
return ( Min + ( rand() % (Max - Min+1) ) );
}

5 réponses

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Salut,

J'ai dû modifier les lignes suivantes pour faire marcher ton programme sur mon pc :

#include <conio.h> //au lieu de #include <conio.c>

fprintf(File, "%s\n%s\n", mail , mail );// enregistre dans le fichier en désordre

//l'option -u permet de gérer l'unicité
system("sort -u mail.txt>>ordre.txt");//classe par ordre alpha


Bonne continuation.
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Attention le "sort" n'est pas celui de windows, c'est la commande gnu.
Tu peux le récupérer dans une "install" de cygwin par exemple.
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
Plutôt que de faire des trucs gores à coup de "system", il te suffit de coder une fonction sort() qui tri une liste.
Coder une fonction sort n'est pas super dur (regarde tri à bulle, tri insertion, quick sort).
Pour supprimer les doublons, il suffit de mettre chacun des mails générés dans un tableau à chaque fois, et lorsque tu génères un mail, tu vérifies au préalable qu'il n'existe pas dans la liste.

Ne met pas tout dans le fichier, mais génère tes mail dans un tableau. Une fois le tableau trié (il n'y aura pas de doublons si tu vérifies à chaque fois), tu recopies les informations du tableau dans un fichier.

Tu dis développer sous dev-c++, tu fais du C ou du C++ ? En C++, les conteneurs de la STL feraient ce travail pour toi :)
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 janvier 2021
114
En C++ ça donnerais ça:

- Utilisations du conteneur std::set (qui ne fait pas de doublons et tris automatiquement)
- Génération de mail et insertion dans le set
- Recopie du set dans un fichier

Le code (compilé avec gcc sous linux, a peut être adapter légèrement pour windows):
#include 
#include 
#include <set>
#include <cstdlib>
#include <fstream>

/*!
** Get a random number between min and max
**
** @param min The lower limit
** @param max The upper limit
**
** @return A random number
*/
int randi(int min, int max)
{
  return (min + (rand() % (max - min + 1)));
}

/*!
** Generate mail with a given size
**
** @param longueur The size of the mail
**
** @return A random mail
*/
std::string generateMail(int longueur)
{
  char mail[32] = {0};

  for (int j = 0; j < longueur; ++j)
    switch (randi(1, 2))
    {
      case 1:
mail[j] = randi('-', '.');
break;
      case 2:
mail[j] = randi('a', 'z');
break;
    }

  return mail;
}

/*!
** Fill a set with random mails
**
** @param mail The mail list
** @param nb Number of mail to add
** @param longueur Size of each mail
*/
void genMails(std::set<std::string>& mail, int nb, int longueur)
{
  for (int i = 1; i <= nb; ++i)
    mail.insert(generateMail(longueur));
}

/*!
** Display mails
**
** @param mail The mail list
*/
void displayMail(const std::set<std::string>& mail)
{
  typedef std::set<std::string>::const_iterator iter;
  for (iter it = mail.begin(); it != mail.end(); ++it)
    std::cout << *it << std::endl;
}

/*!
** Copy each mail into a file
**
** @param filename The file where to copy mail
** @param mail The mail list
*/
void copyMailIntoFile(const std::string& filename,
      const std::set<std::string>& mail)
{
  typedef std::set<std::string>::const_iterator iter;
  std::ofstream file(filename.c_str(), std::ios::out | std::ios::trunc);

  if (!file)
  {
    std::cerr << "Impossible d'écrire dans le fichier" << std::endl;
    return;
  }

  for (iter it = mail.begin(); it != mail.end(); ++it)
    file<< *it << std::endl;

  file.close();
}

/*!
** The entry point :)
**
** @return 0
*/
int main()
{
  int number = 0;
  std::set<std::string> mail;
  const std::string filename = "mail.txt";

  srand(time(NULL));
  std::cout << "Nombre de mail à générer" << std::endl;
  std::cin >> number;
  genMails(mail, number, 7);

//   displayMail(mail);
  copyMailIntoFile(filename, mail);

  return 0;
}
Messages postés
26
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
29 octobre 2009

Merci pour votre aide !
Je vais essayé sur ces solutions.
Bonnes continuations