Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/05/2020, à 16:28

chris7522

Difficultés de comprehension ifstream C++

Bonjour a toutes et a tous ,
  J'ai du mal a comprendre la progréssion de ce code dans les détails . Quelq'un pour m'expliquer ?
smile

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{
    ifstream flux { "phrase.txt" };
    string ligne;

    int total_lignes { 0 };
    int total_caracteres { 0 };
    int total_mots { 0 };

    bool espace_caractere_precedent { false };
    while (getline(flux, ligne))
    {
        ++total_lignes;
        
        for (char c : ligne)
        {
            if (isspace(c))
            {
                if (!espace_caractere_precedent)
                {
                    ++total_mots;
                }

                espace_caractere_precedent = true;
            }
            else
            {
                ++total_caracteres;
                espace_caractere_precedent = false;
            }
        }
        if (!espace_caractere_precedent)
        {
            ++total_mots;
            espace_caractere_precedent = true;
        }
    }

    cout << "Total de caractères : " << total_caracteres << endl;
    cout << "Total de lignes : " << total_lignes << endl;
    cout << "Total de mots : " << total_mots << endl;

    return 0;
}

Hors ligne

#2 Le 27/05/2020, à 17:34

Vobul

Re : Difficultés de comprehension ifstream C++

Déjà le code en franglais c'est une mauvaise idée. Toujours tout coder en anglais c'est bien mieux.

Ensuite ce code provient clairement d'un débutant mais là n'est pas la question.

- prends le contenu de phrases.txt
- pour chaque ligne:
  - incrémente le nombre total de lignes
    - pour chaque charactère:
      - si c'est un espace et que le caractère précédent n'en est pas un, ajoute 1 un nombre total de mots
     - mets la variable espace_caractere_precedent à true si c'est un espace
     - sinon compte le nombre de caractères
  - si le char précédent n'est pas un espace, increment le total_mots et mets la var espace_car_prec à true

J'ai pas cherché à le compiler ou quoi, mais il me semble qu'il y a au moins un gros bug là-dedans et de toute façon c'est une approche naïve qui ne fonctionnera pas dans tous les cas.


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#3 Le 27/05/2020, à 18:21

chris7522

Re : Difficultés de comprehension ifstream C++

Merci de ton aide Vobul .
D'une facon générale , j'ai compris meme si j'ai encore du mal avec l'utilisation des booléens , mais je suppose que ca va finir par rentrer .

Hors ligne

#4 Le 27/05/2020, à 18:54

Vobul

Re : Difficultés de comprehension ifstream C++

Ici tu peux imaginer les bool comme un drapeau qui est levé ou baissé. Un interrupteur qui est soit OFF soit ON. Car un bool est True ou False et c'est tout.

Sinon je t'invite à le réécrire en python. Je pense que pour un débutant python est vraiment super (même pour quelqu'un d'avancé c'est super d'ailleurs).


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#5 Le 27/05/2020, à 20:38

chris7522

Re : Difficultés de comprehension ifstream C++

Ok .

bool espace_caractere_precedent { false };

  Ici , "espace_caractere_precedent "prend la valeur false .

Dans :

for (char c : ligne)
        {
            if (isspace(c))
            {
                if (!espace_caractere_precedent)
                {
                    ++total_mots;
                }

On peut donc remplacer : if (!espace_caractere_precedent ) par if (true) , non ?
roll

Hors ligne

#6 Le 27/05/2020, à 21:17

Vobul

Re : Difficultés de comprehension ifstream C++

non


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#7 Le 28/05/2020, à 08:06

chris7522

Re : Difficultés de comprehension ifstream C++

Merci de ta réponse .
Toi qui est expérimenté , aurai tu des exemples d'utilisation de type booleen  pour que cela puisse etre profitable a des débutants comme moi ?
D'avance merci pour le partage .
bonne journée

Hors ligne

#8 Le 28/05/2020, à 23:39

NicoApi73

Re : Difficultés de comprehension ifstream C++

Bonsoir,

Le besoin est de pouvoir faire des actions conditionnelles. C'est le cas pour les instructions comme if, while, for...

La seule comparaison qui soit faite est par rapport à 0. Par conséquent tout ce qui est différent de 0 est considéré comme vrai (true), et 0 est considéré comme faux (false).

Il existe maintenant un type bool, pour lequel la valeur false vaut 0 et la valeur true vaut 1. Maintenant, si tu déclares une variable de type bool et que tu lui affectes la valeur 3, la plupart des compilateurs (gcc y compris) ne diront rien du tout et tu pourras même faire des opérations avec...

L'exemple que tu réclames, tu l'as dans le code que tu as fourni. espace_caractere_precedent mémorise si le caractère lu est une espace ou pas et est utilisé pour des comparaisons (if)

Hors ligne

#9 Le 29/05/2020, à 11:07

chris7522

Re : Difficultés de comprehension ifstream C++

Merci a tous les deux de votre aide .
  C'est vrai que cet exemple en particulier me pose quelques difficultés de comprehension , en revanche, ce petit code tout simple me parle beaucoup plus et m'aide a comprendre .

#include <iostream>
using namespace std;

bool is4digits(string pin)
{
  bool status=true;
 if(pin.length() != 4){
 status false;
 }
 return status;
}
int main()
{
 string PIN;
 cout << " Enter a 4 digit PIN number : ";
 cin >> PIN;

 if(is4digits(PIN)==1)
  cout << "PIN accepted ";
 else
  cout << "PIN denied ";
  cout << endl;
  return 0;
}

Hors ligne

#10 Le 29/05/2020, à 12:26

grigouille

Re : Difficultés de comprehension ifstream C++

chris7522 a écrit :
bool is4digits(string pin)
{
  bool status=true;
 if(pin.length() != 4){
 status false;
 }
 return status;
}

Plus clair :

bool is4digits(string pin)
{
 return pin.length() == 4;
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#11 Le 29/05/2020, à 14:56

chris7522

Re : Difficultés de comprehension ifstream C++

Oui c'est plus concis . Merci

Hors ligne

#12 Le 29/05/2020, à 15:14

grigouille

Re : Difficultés de comprehension ifstream C++

chris7522 a écrit :
 if(is4digits(PIN)==1)

is4digit renvoit un bool pas un int donc :

 if(is4digits(PIN))

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#13 Le 29/05/2020, à 22:49

chris7522

Re : Difficultés de comprehension ifstream C++

Dans la meme veine :

#include <iostream>
using namespace std;

bool prime(int n)
{
 int i;
 for(i=2;i<n;i++)
 {
  if(n % i ==0)
  {
   return false;
  }
 }
 return true;
}

int main()
{
 int a,j;
 cout << "Please enter a number :";
 cin >> a;
 
 cout << "Prime number up to " << a << " :" << endl;
 for(j=1;j<a;j++)
 {
  if(prime(j))
  {
   cout << j << endl;
  }
 }
 return 0;
}
 

Hors ligne

#14 Le 30/05/2020, à 06:41

chris7522

Re : Difficultés de comprehension ifstream C++

#include <iostream>
using namespace std;

int main()
{
 bool pizzaIsHealthy;
 int temp;
 cout << "Do you believe in the power of pizza ? 1 is true and 0 is false :";
 cout << endl;
 cin >> temp;
 pizzaIsHealthy=temp;
 if(pizzaIsHealthy)
  cout << "Welcome to my pizza App !" << endl;
  
 return 0;
}

Hors ligne

#15 Le 30/05/2020, à 08:14

NicoApi73

Re : Difficultés de comprehension ifstream C++

Pourquoi passer par un bool :

#include <iostream>
using namespace std;

int main()
{
 int pizzaIsHealthy;
 cout << "Do you believe in the power of pizza ? 0 is false and everything else is true:";
 cout << endl;
 cin >> pizzaIsHealthy;
 if(pizzaIsHealthy)
  cout << "Welcome to my pizza App !" << endl;
  
 return 0;
}

Hors ligne

#16 Le 30/05/2020, à 08:32

chris7522

Re : Difficultés de comprehension ifstream C++

C'est inutile en effet , ton exemple le montre bien .
J'essaie de trouver des trucs interessant a faire avec le type bool , mais pour le moment mes exemples sont bien pourri .

Hors ligne

#17 Le 30/05/2020, à 09:23

NicoApi73

Re : Difficultés de comprehension ifstream C++

Tes exemples ne sont pas pourris. Je ne comprends pas pourquoi tu focalises sur le type booléen.

Il n'y a qu'un besoin à adresser : faire un choix logique vrai/faux. Ca a été codé en considérant 0 comme faux et tout le reste comme vrai. La taille minimale d'une donnée est l'octet (8 bits), soit 256 valeurs possibles (0 à 255), alors qu'un seul bit est nécessaire pour répondre à ce besoin, soit 2 valeurs possibles (0 ou 1). En assembleur, c'est souvent un flag dans un registre qui est monitoré après une opération.

Si on prend l'exemple de if :
if (ok) regarde si ok est non nul. Si c'est le cas, l'instruction suivante (ou bloc d'instruction) est exécutée. Si ok est nul, l'instruction (ou bloc d'instruction) suivant else est exécuté (s'il existe).

Tu peux remplacer ok par ce que tu veux, qui renvoie une valeur numérique. Par exemple, tu peux le remplacer par a == b, qui n'est qu'un opérateur qui compare a à b. Si a et b sont différents, a == b retourne 0, ce qui est interprété par if comme faux. Ca retourne 1 dans le cas contraire...

Dernière modification par NicoApi73 (Le 30/05/2020, à 09:24)

Hors ligne

#18 Le 30/05/2020, à 16:15

chris7522

Re : Difficultés de comprehension ifstream C++

Ok cette fois ci le declic a eu lieu . Les bretons ont la tete dur , ca met parfois du temps a rentrer smile

Hors ligne

#19 Le 31/05/2020, à 19:39

chris7522

Re : Difficultés de comprehension ifstream C++

Une derniere question si je peux me le permettre .
Est il possible d'utiliser push_back avec un tableau array ?

Hors ligne

#20 Le 31/05/2020, à 19:46

NicoApi73

Re : Difficultés de comprehension ifstream C++

Tu ne peux utiliser une méthode que si elle a été défini. Hormis si array est une classe dans laquelle a été défini push_back, ce n'est pas possible.

Il faut que tu utilises vector, list ou deque

Hors ligne

#21 Le 31/05/2020, à 20:02

chris7522

Re : Difficultés de comprehension ifstream C++

Ok merci .
En fait j'avais ce code :

#include <iostream>
#include <vector>
using namespace std;
vector<int> distributeur(int total,vector<int> coupures_disponibles)
{
    vector<int> resultat {};

    for (auto coupure : coupures_disponibles)
    {
        resultat.push_back(total / coupure);
        total %= coupure;
    }

    return resultat;
}

int main()
{
    vector<int> const coupures_disponibles { 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    auto const resultat { distributeur(285, coupures_disponibles) };
    
    int i=0;
    for (auto result : resultat)
    {
        std::cout << result << " x "<< coupures_disponibles[i] << endl;
        i++;
    }
    
    return 0;
}

Je me suis dit que ce serai mieux avec un tableau array dans la mesure ou je connais par avance le nombre d'entier de mon tableau , donc j'ai fait ca mais ca coince avec push_back .
Qu'aurai je pu faire ?

#include <iostream>
#include <array>
using namespace std;

array<int,9> distributeur(int total,array<int,9> coupures_disponibles)
{
    array<int,9> resultat;

    for (auto coupure : coupures_disponibles)
    {
        resultat.push_back(total / coupure);
        total %= coupure;
    }

    return resultat;
}

int main()
{
    array<int,9> coupures_disponibles={ 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    auto const resultat { distributeur(285, coupures_disponibles) };
    
    int i=0;
    for (auto result : resultat)
    {
        cout << result << " x "<< coupures_disponibles[i] << endl;
        i++;
    }
    
    return 0;
}

Hors ligne

#22 Le 31/05/2020, à 20:16

grigouille

Re : Difficultés de comprehension ifstream C++

push_back n'est pas défini pour std::array tout simplement.

Dernière modification par grigouille (Le 31/05/2020, à 20:23)


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#23 Le 31/05/2020, à 20:22

chris7522

Re : Difficultés de comprehension ifstream C++

Il n'y a pas l'équivalent de push_back pour array ?

Hors ligne

#24 Le 31/05/2020, à 20:22

grigouille

Re : Difficultés de comprehension ifstream C++

#include <iostream>
#include <array>
using namespace std;

array<int,9> distributeur(int total, const array<int,9> & coupures_disponibles)
{
	array<int,9> resultat;

	for(unsigned i{} ; i < resultat.size() ; ++i) {
		auto coupure = coupures_disponibles[i];
		resultat[i] = total / coupure;
		total %= coupure;
	}

	return resultat;
}

int main()
{
	array<int,9> coupures_disponibles={ 500, 200, 100, 50, 20, 10, 5, 2, 1 };
	auto const resultat { distributeur(285, coupures_disponibles) };

	int i=0;
	for (auto result : resultat)
	{
		cout << result << " x "<< coupures_disponibles[i] << endl;
		i++;
	}

	return 0;
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#25 Le 31/05/2020, à 20:41

chris7522

Re : Difficultés de comprehension ifstream C++

Merci beaucoup smile

Hors ligne