éliminer les doublons !

Résolu
jekburn Messages postés 26 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 29 octobre 2009 - 29 oct. 2009 à 00:30
jekburn Messages postés 26 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 29 octobre 2009 - 29 oct. 2009 à 11:44
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

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 oct. 2009 à 08:15
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.
3
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
29 oct. 2009 à 08:31
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.
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
29 oct. 2009 à 10:04
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 :)
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
29 oct. 2009 à 10:44
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;
}
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jekburn Messages postés 26 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 29 octobre 2009
29 oct. 2009 à 11:44
Merci pour votre aide !
Je vais essayé sur ces solutions.
Bonnes continuations
3
Rejoignez-nous