Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CORRECTEUR DE PONCTUATION


Information sur la source

Catégorie :Chaîne de caractères Classé sous : correcteur, pointeur, switch Niveau : Débutant Date de création : 03/05/2008 Date de mise à jour : 19/05/2008 20:31:20 Vu : 4 892

Note :
Aucune note

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Mon petit programme corrige les fautes de ponctuation telleque un espace avent un poin, la virgule, poin virgule, deux poins etc...
ou le menque d'espace après la vigule, le point etc...
 

Source

  • #include <windows.h>
  • #include <fstream>
  • using namespace std;
  • bool bMaj=false;
  • const char*PtCcin;
  • int u;
  • string cCint;
  • int param(int u);//déclaration de param (fonction pour les testes voir plus bas)
  • main(int argc,char**argv)
  • {
  • ofstream Fichier;
  • ifstream fStr;
  • /*déclaration des constantes*/
  • const char CcTestVir=',';
  • const char CcTestPoin='.';
  • const char CcTestDbPoin=':';
  • const char CcTestPoinVir=';';
  • const char CcTestExclam='!';
  • const char CcTestIntero='?';
  • const char CcTestParent=')';
  • fStr.open(argv[1], fstream::in);//ouverture du texte qui a ouvert le programme
  • if(fStr)
  • {
  • /*Création d'une copy de chemin d'accès pour ne pas toucher au texte originale*/
  • char*teste=argv[1];//récupération du chemin d'accès qui a ouvert le programme
  • int ilongChemin=strlen(teste);//récupération de la longueur du chemin
  • char suit[ilongChemin+10];//création d'un tableau pour stoquer le chemin
  • strncpy(suit,teste,ilongChemin-4);//copy du chemin sans le .txt
  • strcat(suit,"_corriger.txt");//rajout de "_corriger.txt" dans le chemin d'accès
  • /*************************************************************************/
  • Fichier.open(suit);//ouverture du texte en mode écriture
  • while(getline(fStr, cCint) ){//boucle sur le numbre de ligne
  • PtCcin=cCint.c_str();
  • int ii=strlen(PtCcin);
  • u=0;
  • for(int i=0;i<=ii;i++){//boucle sur le numbre de lettre dans une ligne
  • if(*PtCcin==' ')
  • {
  • PtCcin++;
  • if(*PtCcin==CcTestVir)
  • {PtCcin--;cCint.erase(u,1);}else
  • if(*PtCcin==CcTestPoin)
  • {PtCcin--;cCint.erase(u,1);}else
  • if(*PtCcin==' ')
  • {PtCcin--;cCint.erase(u,1);}else
  • if(*PtCcin==CcTestParent)
  • {PtCcin--;cCint.erase(u,1);}else
  • {PtCcin--;}
  • }
  • /*un switch pour voir quel lettre/signe nous avons*/
  • switch(*PtCcin)
  • {
  • case ',':
  • PtCcin++;
  • if(*PtCcin!=' '){
  • u++;cCint.insert(u," ");
  • *PtCcin--;u--;
  • }
  • else{PtCcin--;}
  • break;
  • case '.':
  • bMaj=true;
  • PtCcin++;
  • if(*PtCcin==CcTestPoin)
  • {PtCcin--; break;}else
  • if(*PtCcin!=' '){
  • ii++; u++;cCint.insert(u," ");
  • *PtCcin--;u--;
  • }
  • else{PtCcin--;}
  • break;
  • case':':
  • PtCcin++;
  • if(*PtCcin==CcTestParent)
  • {
  • PtCcin--;
  • break;
  • }else{PtCcin--;
  • param(u);}
  • break;
  • case';':
  • param(u);
  • break;
  • case'!':
  • param(u);
  • bMaj=true;
  • break;
  • case'?':
  • param(u);
  • bMaj=true;
  • break;
  • default:
  • {
  • if(bMaj==true && islower(*PtCcin)) {
  • bMaj=false;
  • char temp[2];
  • temp[0] = (char)((*PtCcin)&0xDF);
  • temp[1]=0;
  • cCint.replace(u,1,&temp[0]);
  • }
  • bMaj=false;
  • break;
  • }
  • }
  • u++; PtCcin++;
  • }
  • Fichier << cCint<<"\n";//écriture du texte dans le fichier _corriger.txt
  • }
  • //on ferme
  • Fichier.close();
  • fStr.close();
  • MessageBox(NULL,"Correction terminé","Fin",MB_OK);//message de fin
  • }else
  • {
  • MessageBox(NULL,"FICHIER ERREUR","ERREUR",MB_ICONERROR);
  • MessageBox(NULL,
  • "Ce progamme a besoin d'un fichier texte (.txt) pour fonctionner\nOuvrez le avec un fichier !",
  • "Info",MB_OK|MB_ICONASTERISK);
  • return 0;
  • }
  • }
  • int param(int u)
  • {
  • /*vérifiquation de l'espace avant notre signe*/
  • PtCcin--;
  • if(*PtCcin==' ')
  • {*PtCcin++;}else{
  • cCint.insert(u," ");
  • PtCcin++;
  • u++;
  • }
  • /*vérifiquation de l'espace après notre signe*/
  • PtCcin++;
  • if(*PtCcin==' ')
  • {
  • *PtCcin--;
  • }else{
  • u++;cCint.insert(u," ");
  • PtCcin--;
  • }
  • }
#include <windows.h>
#include <fstream>
using namespace std;
bool bMaj=false;
const char*PtCcin;
int u;
string cCint;
int param(int u);//déclaration de param (fonction pour les testes voir plus bas)

main(int argc,char**argv)
{        
         
         ofstream Fichier;
         ifstream fStr;
         /*déclaration des constantes*/
         const char CcTestVir=',';   
         const char CcTestPoin='.';
         const char CcTestDbPoin=':';
         const char CcTestPoinVir=';';
         const char CcTestExclam='!';
         const char CcTestIntero='?';
         const char CcTestParent=')';
         
         fStr.open(argv[1], fstream::in);//ouverture du texte qui a ouvert le programme
         if(fStr)
         {
            /*Création d'une copy de chemin d'accès pour ne pas toucher au texte originale*/   
                 char*teste=argv[1];//récupération du chemin d'accès qui a ouvert le programme
                 int ilongChemin=strlen(teste);//récupération de la longueur du chemin
                 char suit[ilongChemin+10];//création d'un tableau pour stoquer le chemin
                 strncpy(suit,teste,ilongChemin-4);//copy du chemin sans le .txt
                 strcat(suit,"_corriger.txt");//rajout de "_corriger.txt" dans le chemin d'accès
            /*************************************************************************/
                       Fichier.open(suit);//ouverture du texte en mode écriture 
                
                        while(getline(fStr, cCint) ){//boucle sur le numbre de ligne
                                        PtCcin=cCint.c_str();
                                 int ii=strlen(PtCcin);
                                 u=0;
                                 for(int i=0;i<=ii;i++){//boucle sur le numbre de lettre dans une ligne
                                  
                                         if(*PtCcin==' ') 
                                         {
                                                       PtCcin++;
                                                       if(*PtCcin==CcTestVir)
                                                       {PtCcin--;cCint.erase(u,1);}else
                                                       if(*PtCcin==CcTestPoin)
                                                       {PtCcin--;cCint.erase(u,1);}else
                                                       if(*PtCcin==' ')
                                                       {PtCcin--;cCint.erase(u,1);}else
                                                       if(*PtCcin==CcTestParent)
                                                       {PtCcin--;cCint.erase(u,1);}else
                                                       {PtCcin--;}
                                                       }      
                                                       
                                                       
                                                     
                         /*un switch pour voir quel lettre/signe nous avons*/
                                        switch(*PtCcin)
                                        {
                                                       case ',':
                                                             PtCcin++;
                                             if(*PtCcin!=' '){
                                                          u++;cCint.insert(u," ");
                                                          *PtCcin--;u--; 
                                                         }
                                                          else{PtCcin--;}
                                                          break;
                                                            
                                                       
                                                       case '.':
                                             bMaj=true;
                                             PtCcin++;
                                             if(*PtCcin==CcTestPoin)
                                             {PtCcin--; break;}else
                                             if(*PtCcin!=' '){
                                                          ii++; u++;cCint.insert(u," ");
                                                          *PtCcin--;u--; 
                                                         }
                                                          else{PtCcin--;}
                                                          break;   
                                                       case':':     
                                                            PtCcin++; 
                                                            if(*PtCcin==CcTestParent) 
                                                            { 
                                                            PtCcin--; 
                                                            break; 
                                                            }else{PtCcin--; 
                                                            param(u);}
                                                            break;
                                                       case';':     
                                                            param(u);
                                                            break;
                                                       case'!':    
                                                            param(u);
                                                            bMaj=true;
                                                            break;
                                                       case'?':     
                                                            param(u);
                                                            bMaj=true;
                                                            break;    
                                                  
                                                     default: 
                                                     { 
                                                     if(bMaj==true && islower(*PtCcin)) { 
                                                      bMaj=false; 
                                                      char temp[2]; 
                                                      temp[0] = (char)((*PtCcin)&0xDF); 
                                                      temp[1]=0;
                                                      cCint.replace(u,1,&temp[0]); 
                                                      }
                                                      bMaj=false; 
                                                      break; 
                                                        }  
                                                         }
                                                            
                                         
          u++;  PtCcin++;
              }
                Fichier << cCint<<"\n";//écriture du texte dans le fichier _corriger.txt 
                  }
                  //on ferme   
                 Fichier.close();
                 fStr.close(); 
 MessageBox(NULL,"Correction terminé","Fin",MB_OK);//message de fin
   }else 
    {
    MessageBox(NULL,"FICHIER ERREUR","ERREUR",MB_ICONERROR);
    MessageBox(NULL,
    "Ce progamme a besoin d'un fichier texte (.txt) pour fonctionner\nOuvrez le avec un fichier !",
    "Info",MB_OK|MB_ICONASTERISK);
     return 0;
     }	
}
int param(int u)
{
 /*vérifiquation de l'espace avant notre signe*/       
         PtCcin--;
         if(*PtCcin==' ')
         {*PtCcin++;}else{
                              cCint.insert(u," ");
                              PtCcin++; 
                              u++;
                              }
 /*vérifiquation de l'espace après notre signe*/        
         PtCcin++;
         if(*PtCcin==' ')
         {
                       *PtCcin--;
                        }else{
                             u++;cCint.insert(u," ");
                             PtCcin--; 
                              }

}

Historique

03 mai 2008 09:00:03 :
lol dsl trompé de boutton
03 mai 2008 10:51:27 :
correction des fautes d'orthographe
03 mai 2008 10:52:49 :
...
03 mai 2008 11:14:40 :
omg les fautes la honte
03 mai 2008 11:27:21 :
omg les fautes la honte
03 mai 2008 11:28:51 :
omg les fautes la honte
03 mai 2008 11:30:25 :
omg les fautes la honte
03 mai 2008 11:34:16 :
c'est bon je crois
05 mai 2008 15:36:47 :
mis à jour des fautes d'orthographe si il y en a encors me le dire et mis à jour de la source elle peut désormais corriger des textes de taille indéfini et elle ne touche plus au fichier source donc plus de risque de perte de donner. voila j'espère que sa serra mieu comme ça ^^
05 mai 2008 15:37:52 :
...
05 mai 2008 15:41:09 :
...
07 mai 2008 23:47:44 :
cette fois c'est bon il est pour une ponctuation française le mode graphique est en route.
07 mai 2008 23:49:38 :
une ptite faute
19 mai 2008 20:31:21 :
correction d'un petit bug pour le mode graffique : http://www.cppfrance.com/codes/BOOK-MON-CORRECTEUR-WIN32_46711.aspx

Commentaires et avis

signaler à un administrateur
Commentaire de jfrancois le 03/05/2008 10:27:25

Bonjour,

1) Celà n'est pas de la PONCTUALITE mais de la PONCTUATION !!!
2) Et s'il pouvait corriger les fautes d'orthographe !!!

signaler à un administrateur
Commentaire de PCPT le 03/05/2008 10:45:17 administrateur CS

salut,
sûr qu'un code permettant de remonter le temps pour être à l'heure aurait été intéressant ^^

titre corrigé

signaler à un administrateur
Commentaire de snpier wolf le 03/05/2008 10:50:17

merci et dsl j'avais pas fait gaffe je sais que mon orthographe est médiocre et se n'est que le nom ^^ mais à par sa mon code est il bien?

signaler à un administrateur
Commentaire de PCPT le 03/05/2008 11:06:58 administrateur CS

des messages en français, d'autres en anglais...., il faut vraiment faire "ATTANTION" :)

signaler à un administrateur
Commentaire de snpier wolf le 03/05/2008 11:18:01

^_^' oups je suis grave bon je vais tous corriger et remettre en place

signaler à un administrateur
Commentaire de SAKingdom le 03/05/2008 15:18:37

salut ->sa<- va?Et tu ->est<- ->la<-?
Oui...Je mange!
ok,mais tu ->vien<- après (au cinéma)avec ->julie<-?
oui.->ect<-...

Les fautes d'orthographes qui sont la dedans sont-elles supposées être corrigées aussi ?
Aussi, une phrase commence, normalement, par une majuscule.

signaler à un administrateur
Commentaire de SAKingdom le 03/05/2008 16:38:57

"qui sont la dedans"
qui sont là dedans

signaler à un administrateur
Commentaire de vecchio56 le 04/05/2008 17:43:57 administrateur CS

"qui sont là dedans"
qui sont là-dedans
:)

signaler à un administrateur
Commentaire de vecchio56 le 04/05/2008 17:44:29 administrateur CS

La valeur 80000 apparait à 2 endroits, il faut définir une constante et l'utiliser à la place
Tu alloues 80000 statiquement, du coup ton programme ne gère pas les fichiers de plus de 80000 octets, ce qui est dommage.
Il faudrait que tu alloues une certaine taille et que tu lises ton fichier par bloc.

Je ne comprends pas pourquoi Ccout fait 1000000 caractères?? Même remarque que pour la lecture, il faut écrire par bloc.

Tes commentaires sont carrément inutiles, exemple:
ifstream fStr;//déclaration de fStr

Ton programme est illisible, l'indentation n'a aucune logique

La description de ton programme est très vague, du coup on ne sait même pas ce qu'il est censé faire (par exemple moi je ne mets pas d'espace devant mes points et virgules)
"les fautes de ponctualitoin telleque un espace avent un poin, la virgule"

Enfin, merci de faire un minimum d'effort sur l'orthographe

signaler à un administrateur
Commentaire de mallack le 05/05/2008 09:35:11

presque 500 ko pour 138 lignes de code.Tu tiens une bonne moyenne!:-)
T'inquiete j'ai les memes soucis!Mais pas jusqu'a ce point quand m...
Sinon bonne idée de prog.A remanier je pense et une petite interface en plus pour contrôler de suite le résultat.
Bonne continuation.

signaler à un administrateur
Commentaire de snpier wolf le 05/05/2008 09:47:30

comment je pourai faire pour lire par bloc?
j'ai essayé ceci :
for(int i=0;i<=iNombreBoucle;i++)
{
fStr.readsome(cCint, 500);
for(int i=0;i<=iLongMaxTexte;i++)
                 {
                        
                        
                        
                         for(int y=0;y<=iNumChrs;y++){
                                
                                 if(*PtCcin==' ')
                                 {
                                               PtCcin++;
                                               if(*PtCcin!=','&&*PtCcin!='.'&&*PtCcin!=':'
                                               &&*PtCcin!=';'&&*PtCcin!='!'&&*PtCcin!='?'
                                               &&*PtCcin!=')'&&*PtCcin!=' ')
                                               { *PtCcin--;}
                                               }      
                        
                         switch(*PtCcin)
                         {
                                        case',':                              
                                                      {param(CcTestVir);}
                                                      break;
                                        
                                        
                                        case'.':                                
                                                      {
                                                      PtCcin++;
                                                      if(*PtCcin==CcTestPoin){PtCcin--;
                                                      break;
                                                      }
                                                      else
                                                      {
                                                      PtCcin--;
                                                      param(CcTestPoin);
                                                      }
                                                      } break;
            
                                        case ':':                                
                                                      {param(CcTestDbPoin);}
                                                      break;
                                                                              
                                        case';':                                
                                                      {param(CcTestPoinVir);}
                                                      break;
            
                                        case'!':                                
                                                      {param(CcTestExclam);}
                                                      break;
              
                                        case'?':                                
                                                      {param(CcTestIntero);}
                                                      break;
              
                                        case')':                                
                                                      {  
                                                      PtCcin++;
                                                      if(*PtCcin==' '||*PtCcin==CcTestPoin
                                                      ||*PtCcin==CcTestPoinVir||*PtCcin==CcTestDbPoin
                                                      ||*PtCcin==CcTestVir||*PtCcin==CcTestParent)
                                                      { *PtCcin--;}else
                                                      {*PtCcout=CcTestParent;
                                                      PtCcout++;
                                                      *PtCcout=' ';
                                                      PtCcout++;}
                                                      }
                                                      break;
              }
              *PtCcout=*PtCcin;  
              PtCcout++;PtCcin++;
         }
        
                  //on écrie dedans    
                 Fichier << Ccout;
}
mais sa ne marche pas car il prend le promier bloc et le copy par le nombre de boucle
comment fair pour lire un bou du texte, le modifier(ça c'est bon), le réécrire(ça aussi)
et reprendre un bou du texte?

signaler à un administrateur
Commentaire de jfrancois le 05/05/2008 10:08:03

Bonjour,

On peut lire et écrire dans un même fichier que s'il est à accès direct (un fichier contenant une liste de structures par exemple) mais pas dans un fichier texte dont on modifie la longueur au gré des modifications !

- Ecrire dans un fichier temporaire (on lit "toto.txt" et on écrit "~toto.txt.tmp" par exemple, un nom assez tarabiscoté pour ne pas exister, à moins de tester son inexistence, dans le même répertoire)
- A la fin du traitement :
  - Si tout c'est bien passé :
    - Effacer le fichier de départ argv[1] (ou le renommer en ".bak" pour conserver l'original !)
    - Renommer le fichier temporaire en argv[1].
  - Si ça c'est pas bien passé :
    - Effacer le fichier temporaire !

signaler à un administrateur
Commentaire de snpier wolf le 05/05/2008 10:19:43

ok mais mon problème est comment prendre le fichier toto.txt en plusieur foix?

signaler à un administrateur
Commentaire de LeFauve42 le 05/05/2008 16:40:04

Salut,

C'est une bonne idee de programme, vu le nombre de personnes qui ignorent les regles de ponctuation, mais c'est plus complique que ce que ca en a l'air :o)

C'est dommage que ton programme n'implemente que la ponctuation anglaise.
En francais, pour les caracteres !?: et ;, il faut en effet mettre une espace AVANT et une APRES (et oui, en typographie, espace est au feminin :op ).

Sinon pour la gestion des majuscules, tu pourrais remplacer tous tes case 'a' ... case 'z' par

default:
{
  if(bMaj==true && islower(*PtCcin)) {
    bMaj=false;
    cCint.replace(u,1,(*PtCcin)&0xDF);
  }
  break;
}  

islower() te renvoie vrai si le caractere passe en argument est une minuscule et faire &0xDF a une minuscule la transforme en majuscule (attention, ca ne marche que si le caractere est une minuscule (resultat hasardeux sinon)).

signaler à un administrateur
Commentaire de snpier wolf le 05/05/2008 18:51:32

ton idée est sympa mais elle me retourne une erreur d'invalidité de converstion ent un int et const char* je vais regardé ou ça bloc

signaler à un administrateur
Commentaire de snpier wolf le 05/05/2008 19:23:21

heu dans ce que tu nous dis il y a une faute on met pas d'espace avant une virgule ! ?

signaler à un administrateur
Commentaire de LeFauve42 le 06/05/2008 10:54:40

Heu, desole... la virgule, c'etait juste une virgule dans la phrase :o)
Il ne faut bien sur pas d'espace avant la virgule !

Les caracteres qui ont une espace avant et apres sont ! ? : ;

Mais en tappant cette reponse, je viens de me rendre compte que ton programme peut poser des problemes avec les smiley:  ":)" ne doit pas etre change en ": )".
Comme je disais, tu t'attaques a un probleme plus complique que ce qu'il en a l'air :o)

Pour l'erreur, il faut que tu castes le resultat du & arithmetique en char (ou const char) et ca devrait passer (si la methode replace() de string est surchargee pour les chars:
cCint.replace(u,1,(const char)((*PtCcin)&0xDF));

Cela est du a la "promotion entiere" que pratiquent les compilateurss modernes (google t'expliquera les details si ca t'interesse, mais en gros tout ce qui est plus petit qu'un entier (y compris les chars) est caste en entier.


Si ca ne marche pas (string::replace() ne prend que des const char* comme troisieme argument) le plus simple est de declarer un char et d'utiliser son adresse:

char temp;
temp = (char)((*PtCcin)&0xDF);
cCint.replace(u,1,&temp);

Voila,
Bonne chance !

signaler à un administrateur
Commentaire de snpier wolf le 06/05/2008 11:32:09

top ça marche merci pour l'info, je vais regarder tous ça :)
pour les smiley dans un texte normal personne ne les fais
au pire des cas je rajoute dans case ':':
PtCcin++;
if(*PtCcin==CcTestParent)
{
         PtCcin--;
         break;
}

et pour ce smiley xD rien besoin de fair ^^

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Pointeur et référence [ par kawazaki ] Bonjour je commence a programmer en c++ je voudrais comprendre quand j'utilise les pointeurs et les références ainsi que les déclarations:*var**var&va Pointeur qui fait planter Windows !!! [ par coyito ] Salutquand je défini moi même une addresse pour un pointeur (exemple pour lire n'importe ou dans la mémoire) j'ai une erreur windows "access violation Switch et char [ par Stoomm ] Bonjour,Si j'ai :char test[10];strcpy (test, "monchar ";Si je souhaite faire un switch : Je fais comment ???switch (test){...}Il aime pas ! Quelqu'un Pointeur sur methodes avec parametre [ par Kinamstrong ] Salut a toi,Je cherche à savoir comment marche les pointeurs sur les methodes avec parametres.Qu'est ce qui va differencier deux meme methodes en cour tableau et pointeur [ par cognac ] Bonjour,Je tente de faire apparaitre les mois de l'année (simple mais pour un débutant....). Bon il y a toujours "cout"12 fois mais j'ai pensé à un ta je comprend plus rien(pointeur) [ par bidules ] Bonjour,Pour moi on utilise les pointeur pour creer des tableau dynamiquement.or j'ai reussi a en declarer un avec une taille entrer a l'aide d'une va Probleme de Débutant [ par Dorgendubal ] Hello à tous,j'ai déjà programmé en C++ et même avec des envirronements graphiques (comme QT sous linux) mais jamais avec Visual C++.Alors j'ai un pro !! URGENT : Correcteur orthographique [ par Ricpperso ] Bonjour @ tous,je suis en train de créer un traitement de texte style Word Pad, mais en amélioré, en fait je transcrive le logiciel que j'avais déjà f Probleme complique sur pointeur mais reponse simple surement [ par MrKribou ] Un probleme de pointeur je pense.Je vous expose la situation :Dans une Classe (ClassEx) voila je fais un truc du genre :char* pChar = this-&gt;getInfo le pointeur de souris. [ par Pyou ] Bonjour ! J'aimerais savoir comment faire pour ne pas afficher le pointeur la de souris par defaut dans ma fenetre opengl, puisque je veux en afficher


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,608 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.