éliminer les doublons ! [Résolu]

jekburn 26 Messages postés jeudi 11 novembre 2004Date d'inscription 29 octobre 2009 Dernière intervention - 29 oct. 2009 à 00:30 - Dernière réponse : jekburn 26 Messages postés jeudi 11 novembre 2004Date d'inscription 29 octobre 2009 Dernière intervention
- 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) ) );
}
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
cs_Lucky92 180 Messages postés mercredi 22 décembre 2004Date d'inscription 16 août 2012 Dernière intervention - 29 oct. 2009 à 08:15
3
Merci
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.

Merci cs_Lucky92 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Lucky92
Meilleure réponse
cs_Lucky92 180 Messages postés mercredi 22 décembre 2004Date d'inscription 16 août 2012 Dernière intervention - 29 oct. 2009 à 08:31
3
Merci
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.

Merci cs_Lucky92 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Lucky92
Meilleure réponse
cptpingu 3808 Messages postés dimanche 12 décembre 2004Date d'inscription 24 septembre 2018 Dernière intervention - 29 oct. 2009 à 10:04
3
Merci
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 :)

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cptpingu
Meilleure réponse
cptpingu 3808 Messages postés dimanche 12 décembre 2004Date d'inscription 24 septembre 2018 Dernière intervention - 29 oct. 2009 à 10:44
3
Merci
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;
}

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cptpingu
Meilleure réponse
jekburn 26 Messages postés jeudi 11 novembre 2004Date d'inscription 29 octobre 2009 Dernière intervention - 29 oct. 2009 à 11:44
3
Merci
Merci pour votre aide !
Je vais essayé sur ces solutions.
Bonnes continuations

Merci jekburn 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de jekburn

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.