Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 01-04-2018 17:34:19

aiki
Membre
Inscription : 04-06-2017

Exercice penser en C++

Bonjour,

je suis à l'exercice 3 du premier chapitre du livre : compter le nombre de mots dans un fichier texte.

j'ai modifier un des code d'exemple pour faire ça :


//: C02:GetWords.cpp
// Break a file into whitespace-separated words
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
int main() {
  vector<string> words;
  ifstream in("GetWords.cpp");
  string word;
  while(in >> word)
    words.push_back(word);
  for(int i = 0; i < words.size(); i++);
  cout << i << endl;
} ///:~
 



et j'ai l'erreur :


~/Programmation/C++/Exercices> g++ exo3.cpp -o exo3
exo3.cpp: In function 'int main()':
exo3.cpp:16:11: error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
   cout << i << endl;
           ^
exo3.cpp:16:11: note: (if you use '-fpermissive' G++ will accept your code)
~/Programmation/C++/Exercices>
 



ou est-je fait une erreur, ou qu'est ce que je ne connais pas sur le cpp pour que ce code ne compile pas ?
je suis sur une haiku 64bits.

cordialement,
Aiki Zen.

Hors ligne

#2 01-04-2018 18:09:45

raleur
Membre
Inscription : 03-10-2014

Re : Exercice penser en C++

Je suppose que le compilateur veut dire que d'un point de vue strict la variable locale i a été définie dans la construction for () et sa visibilité est limitée à cette construction, or ton code l'utilise dans l'instruction suivante et cela ne lui plaît pas.

Essaie de définir i en dehors du for.
Ou bien tu veux que l'instruction soit exécutée à chaque tour de boucle et il faut supprimer le ; à la fin de la ligne for.

Je n'aime pas le C++.

Hors ligne

#3 01-04-2018 18:32:22

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.16.2
(G)UI : openbox
Inscription : 26-08-2010

Re : Exercice penser en C++

aiki a écrit :



//: C02:GetWords.cpp
// Break a file into whitespace-separated words
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
int main() {
  vector<string> words;
  ifstream in("GetWords.cpp");
  string word;
  while(in >> word)
    words.push_back(word);
  for(int i = 0; i < words.size(); i++);
  cout << i << endl;
} ///:~
 



Remarque, tu pourrais compter le nombres de mots à l'intérieur de ta boucle
while et déclarer ta variable i avant celle-ci, comme cela :


#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
int main() {
  vector<string> words;
  ifstream in("GetWords.cpp");
  string word;
  int i=0;
  while(in >> word) {
    words.push_back(word);
    i++;
  }
  cout << i << endl;
} ///:~
 


Disons que c'est une façon de faire, l'autre c'est d'utiliser
la méthode de vector qui permet de connaître son nombre d'éléments.
Mais je ne connais pas le C++ et donc je ne sais pas si cette
façon d'utiliser <vector> est bien correct…

Dernière modification par enicar (01-04-2018 19:06:46)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

En ligne

#4 02-04-2018 10:11:22

aiki
Membre
Inscription : 04-06-2017

Re : Exercice penser en C++

non ça ne marche pas, j'obtient 0 quand j'essai de déclarer i à l'exterieur de for.

Hors ligne

#5 02-04-2018 10:15:52

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.16.2
(G)UI : openbox
Inscription : 26-08-2010

Re : Exercice penser en C++

aiki a écrit :

non ça ne marche pas, j'obtient 0 quand j'essai de déclarer i à l'exterieur de for.


Montre le code exact que tu as utilisé. Là c'est impossible de se rendre compte. Mais comme je le disais
précédemment, une seule boucle suffit et on n'a même pas besoin de les compter vu qu'il existe une
méthode pour connaître le nombre d'éléments d'un « vector ».


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

En ligne

#6 03-04-2018 11:50:32

aiki
Membre
Inscription : 04-06-2017

Re : Exercice penser en C++

Voici un code fonctionnel :


//: C02:GetWords.cpp
// Break a file into whitespace-separated words
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main() {
  int nbWord = 0;
  vector<string> words;
  ifstream in("compte-word.cpp");
  string word;
  while(in >> word)
    words.push_back(word);
  for(int i = 0; i < words.size(); i++)
    nbWord = i;
  cout << nbWord + 1 << endl;
} ///:~
 



merci à captfab pour le débuggage... des espace insécable apparemment quand j'ai cc depuis le forum sur une autre machine.

captfab nous postera une solution sans variable dès qu'il pourra...

cdlt,
Aiki.

Hors ligne

#7 03-04-2018 12:28:18

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.16.2
(G)UI : openbox
Inscription : 26-08-2010

Re : Exercice penser en C++

Remarque plutôt que de déclarer ta variable i dans la portée du for tu peux le déclarer à l'extérieur.


//: C02:GetWords.cpp
// Break a file into whitespace-separated words
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main() {
  int i = 0;
  vector<string> words;
  ifstream in("compte-word.cpp");
  string word;
  while(in >> word)
    words.push_back(word);
  for(i = 0; i <= words.size(); i++)
    ;
  cout << i << endl;
} ///:~
 



De cette façon, le code fonctionnera, sauf qu'il est vraiment tordu.
Pourquoi ne pas incrémenter i dans la première boucle (while(in >> word)).

J'ai vu aussi que quelqu'un t'avait donné la solution avec words.size()
qui permet de récupérer le nombre d'éléments d'un vector… ce qui constitue
la bonne solution wink

EDIT: Remarque bien j'ai écrit for(i=0; i < words.size(); i++) et non
for(int i = 0; i < words.size(); i++). Dans le deuxième on déclare une variable i
locale au for et qui masque une éventuelle déclaration précédente d'une autre variable i.
Quand même c'est bête de juste incrémenter une variable en ayant comme limite la valeur de la taille du
vector (words.size()) pour juste connaître cette taille qu'on connaît déjà… mais bon ça fait parti
de l'apprentissage wink

Dernière modification par enicar (03-04-2018 12:40:06)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

En ligne

#8 06-04-2018 10:06:30

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.16.2
(G)UI : openbox
Inscription : 26-08-2010

Re : Exercice penser en C++

J'ai une autre idée pour compter les mots d'un fichier, mais qui ne répond pas
forcément à la question de l'exercice car ici on n'utilise pas de vector
Voici le code :


#include <string>
#include <iostream>
#include <fstream>
using namespace std;
 
int main() {
  ifstream in("GetWords.cpp");
  string word;
  int i=0;
  while(in >> word) {
    i++;
  }
  cout << i << endl;
} ///:~
 


On utilise juste le découpage en mot de l'opérateur d'entrée >>.


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

En ligne

#9 07-04-2018 18:37:47

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.16.2
(G)UI : openbox
Inscription : 26-08-2010

Re : Exercice penser en C++

Bon comme je l'ai plus ou moins suggéré dans un post précédent, on peut aussi
utiliser words.size() pour obtenir la taille du vector words comme ceci :


#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
int main() {
  vector<string> words;
  ifstream in("count-word.c++");
  string word;
  while(in >> word) {
    words.push_back(word);
  }
  cout << words.size() << endl;
} ///:~
 



En espérant que je n'ai pas commis de bévues wink


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

En ligne

Pied de page des forums