IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Bug sur les type string


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Bug sur les type string
    Bonjour,

    Nouveau venu sur ce forum et sur le C++ (je commence aujourd'hui) :

    Alors j'ai un problème de compilation que je n'arrive pas à résoudre avec la fonction "transco" :
    erreur sur les lignes d'initialisation de A B C D et également sur la comparaison de chaine dans la fonction transco.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <iostream>
    #include <string>
    using namespace std;
    // test
    int longueurChaine(string container){
        return container.size();
    }
    bool formeValide(string container){
        int compteur(0);
        while (compteur <= 3){
            if (isdigit(container[compteur])){return false;}
            ++compteur;
        }
        while (compteur <= 10){
            if (isdigit(container[compteur])==false){return false;}
            ++compteur;
        }
        return true;
    }
    int transco(string lettre){
        If (lettre == "A"){return 10;}
        If (lettre == "B"){return 12;}
        If (lettre == "C"){return 13;}
        If (lettre == "D"){return 14;}
        If (lettre == "E"){return 15;}
        If (lettre == "F"){return 16;}
        If (lettre == "G"){return 17;}
        If (lettre == "H"){return 18;}
        If (lettre == "I"){return 19;}
        If (lettre == "J"){return 20;}
        If (lettre == "K"){return 21;}
        If (lettre == "L"){return 23;}
        If (lettre == "M"){return 24;}
        If (lettre == "N"){return 25;}
        If (lettre == "O"){return 26;}
        If (lettre == "P"){return 27;}
        If (lettre == "Q"){return 28;}
        If (lettre == "R"){return 29;}
        If (lettre == "S"){return 30;}
        If (lettre == "T"){return 31;}
        If (lettre == "U"){return 32;}
        If (lettre == "V"){return 34;}
        If (lettre == "W"){return 35;}
        If (lettre == "X"){return 36;}
        If (lettre == "Y"){return 37;}
        If (lettre == "Z"){return 38;}
        return 0;
    }
    bool cleContainer(string container){
        int a,b,c,d,reste;
        a = transco(container[0]);
        b = transco(container[1]);
        c = transco(container[2]);
        d = transco(container[3]);
        int e(container[4]),f(container[5]),g(container[6]),h(container[7]),i(container[8]),j(container[9]),k(container[10]);
        reste = (a + b*2 + c*4 + d*8 + e*16 + f*32 + g*64 + h*128 + i*256 + j*512) % 11;
        if (reste == 10){reste = 0;}
        if (reste == k){
            return true;
        }
        else{
            return false;
        }
    }
     
    int main()
    {
        string container;
        cout << "Bonjour," << endl;
        cout << "Merci entrer un numero de conteneur :" << endl;
        cin >> container;
        if (longueurChaine(container)== 11)
            {cout << endl << "chaine de caractere = 11" << endl;}
        else{cout << endl<<"chaine de caractere different de 11" << endl;}
        if (formeValide(container)){
            cout << "Forme valide" << endl;
        }
        else{
            cout << "Forme invalide" << endl;
        }
        if (cleContainer(container)){
            cout << "Cle Valide" << endl;
        }
        else{
            cout << "Cle Invalide" << endl;
        }
     
        return 0;
    }
    Merci de votre aide,

    Ps : avant que vous le demandiez je vais allez faire la prez (faut juste que je trouve où )

    Gloutoni

  2. #2
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    ayez de l'indulgence sur l'écriture c'est également mon premier programme en c++, mais si vous avez la moindre remarque de fond et de forme je suis preneur :-)

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour et bienvenue!

    Puisque tu débute sur le C++, autant commencer tout de suite avec les bonnes manières.

    Tout d'abord, histoire d'être dans le bain:
    Mes principes de bases du codeur qui veut pouvoir dormir:
    Une variable de moins est une source d'erreur en moins.
    Un pointeur de moins est une montagne d'erreurs en moins.
    Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    "Jamais" signifie "sauf si j'ai passé trois jours à prouver que je peux".
    La plus sotte des questions est celle qu'on ne pose pas.
    A cela se rajoute quelques petits et grands principes pour le C++:
    "Raii d'abord, const toujours"
    c'est à dire: si quelque chose est délicat, utiliser RAII dessus.
    Pour ton exercice, ca signifie utiliser std::string plutôt que char*, ce que tu fais très bien

    Quant a "const toujours", c'est précisément cela: toujours utiliser const, chaque fois que c'est possible.
    Le pendant, c'est que justement, tu pourras alors utiliser les références (de) constantes, qui sont le meilleur moyen de ne pas copier des objets lourds, comme une string, quand tu les passent en argument.
    Ainsi, en première pensée, tes fonctions devraient avoir pour signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int longueurChaine(std::string const& container);
    bool formeValide(std::string const& container);
    int transco(std::string const& lettre);
    bool cleContainer(std::string const& container);
    En second réflexion, longueurChaine ne devrait pas retourner un int, mais un std::string::size_type, ou tout simplement un auto (du moins en C++14).

    SOLID
    Tu n'en es pas encore là (ca parle de classes), mais comme ça, tu auras déjà vu le mot, et comme tu es curieux, tu iras voir ce que c'est.
    Le S désigne le SRP (Single Responsibility Principle): principe qui dit qu'une chose (fonction, classe) ne s'occupe que d'une seule chose.
    Tu sembles le respecter, et c'est bien.

    Ca, c'était histoire de placer un peu de préparation.

    D'une manière générale, si tu veux de l'aide sur de la compilation, il faut nous donner les messages d'erreurs.
    Bon, là, j'ai trouvé quand même

    Concernant ton problème, c'est juste que, sur une string, l'appel de l'opérateur [] retourne une lettre (en char&), pas une autre string.
    Du coup, il faut que transco soit écrite ainsi: int transco(char lettre);Je rajoute une chose, les lettres sont adjacentes dans les codes ascii.
    Ainsi, si tu as une lettre majuscule dans un char c, c-'A' est un entier, compris entre 0 (pour A) et 25 (pour Z).
    ta fonction transco deviendrait facilement proche de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int transco(char lettre){
        if (lettre = 'A') return 10;
        if (lettre >= 'B' && lettre <= 'K') return 12 + (lettre -'B');
        if (lettre >= 'L' && lettre <= 'U') return 23 + (lettre -'L');
        if (lettre >= 'V' && lettre <= 'Z') return 34 + (lettre -'V');
        return 0;
    }
    A priori, c'est là ton bug.

    Quant à clecontaineur, tu commets plusieurs erreurs qui peuvent sembler anodine:
    1. tu déclare des variables avant de leur donner une première valeur
    2. tu déclares plein de variables sans nom significatif
    3. et ce sur la même ligne

    La première erreur fait que tu appelles un constructeur puis l'opérateur d'affectation.
    Ce n'est rien pour des int, mais ca peut couter cher sur d'autres types (comme string)
    De plus, cela crée le risque d'utiliser une variable non initialisée

    La second fait que ton code est peu compréhensible. Et en général, cela signifie aussi que tu pourrais utiliser une boucle.
    La troisième, enfin, n'améliore pas la lisibilité

    En corrigeant les 1 et 3, ainsi qu'un if (...) return true ;else return false, ca donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    bool cleContainer(string container){
        int a = transco(container[0]);
        int b = transco(container[1]);
        int c = transco(container[2]);
        int d = transco(container[3]);
        int e(container[4]);
        int f(container[5]);
        int g(container[6]);
        int h(container[7]);
        int i(container[8]);
        int j(container[9]);
        int k(container[10]);
        int reste = (a + b*2 + c*4 + d*8 + e*16 + f*32 + g*64 + h*128 + i*256 + j*512) % 11;
     
        if (reste == 10) {reste = 0;}
        return (reste == k)
    }
    Au passage, tu pourrais écrire, int reste = ( (<pareil>) % 11 ) %10, cela supprimerait le if (reste == 10) {reste = 0;}.

    Maintenant, le jeu, c'est d'utiliser une boucle for, pour n'avoir besoin que dee reste comme variable.
    Je te laisse essayer
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Oui code caca mais tu vas apprendre

    Pourquoi if avec I majuscule?

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    même pas vu
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Voici :
    Perso j'ai un doute sur ma formule avec exposant car je sais que le programme ne fonctionne pas :
    clé valide : ACCU2043920
    clé invalide : ACCU2043921

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <iostream>
    #include <string>
    #include <math.h>
    using namespace std;
     
    int longueurChaine(std::string const& container){
        return container.size();
    }
    bool formeValide(std::string const& container){
        int compteur(0);
        while (compteur <= 3){
            if (isdigit(container[compteur])){return false;}
            ++compteur;
        }
        while (compteur <= 10){
            if (isdigit(container[compteur])==false){return false;}
            ++compteur;
        }
        return true;
    }
    int transco(char lettre){
        if (lettre == 'A'){return 10;}
        if (lettre >= 'B' && lettre <= 'K'){return 12 + (lettre -'B');}
        if (lettre >= 'L' && lettre <= 'U'){return 23 + (lettre -'L');}
        if (lettre >= 'V' && lettre <= 'Z'){return 34 + (lettre -'V');}
        return 0;
    }
    bool cleContainer(std::string const& container){
        int reste = transco(container[0]);
        for (int cpt = 1; cpt <= 9;++cpt){
            if (cpt<=3){
                reste = transco(container[cpt])*pow(2,cpt);
            }
            else{
                reste = container[cpt]*pow(2,cpt);
            }
        }
        if (reste == container[10]){
            return true;
        }
        else{
            return false;
        }
    }
     
    int main(){
        string container;
        cout << "Bonjour," << endl;
        cout << "Merci entrer un numero de conteneur :" << endl;
        cin >> container;
        if (longueurChaine(container)== 11)
            {cout << endl << "chaine de caractere = 11" << endl;}
        else{cout << endl<<"chaine de caractere different de 11" << endl;}
        if (formeValide(container)){
            cout << "Forme valide" << endl;
        }
        else{
            cout << "Forme invalide" << endl;
        }
        if (cleContainer(container)){
            cout << "Cle Valide" << endl;
        }
        else{
            cout << "Cle Invalide" << endl;
        }
        return 0;
    }
    Alors à la base je bosse sur Excel VBA, appris "tout seul" (forum + tuto) et est-il possible de suivre les évolutions de valeur de variable comme en VBA pour le débogage ? Si non alors comment faire vous ?

    Et je n'ai pas très bien compris pourquoi on écrivait : std::string const& alors que l'on a écrit char lettre pour l'autre fonction.

    Et merci beaucoup pour votre aide, j'ai essayé de modifier "presque" tout ce que vous m'avez dit.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et je n'ai pas très bien compris pourquoi on écrivait : std::string const& alors que l'on a écrit char lettre pour l'autre fonction.
    Une string contient plusieurs char; la fonction est appelée dans une boucle qui parcoure la string.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    bool cleContainer(std::string const& container){
        int reste = transco(container[0]);
        for (int cpt = 1; cpt <= 9;++cpt){
            if (cpt<=3){
                reste = reste + transco(container[cpt])*pow(2,cpt);
            }
            else{
                reste = reste + container[cpt]*pow(2,cpt);
            }
        }
        if (((reste % 11) % 10) == container[10]){
            return true;
        }
        else{
            return false;
        }
    }
    j'avais oublié un bout de formule mais cela ne fonctionne toujours pas

  9. #9
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <iostream>
    #include <string>
    #include <math.h>
    using namespace std;
     
    int longueurChaine(std::string const& container){
        return container.size();
    }
    bool formeValide(std::string const& container){
        int compteur(0);
        while (compteur <= 3){
            if (isdigit(container[compteur])){return false;}
            ++compteur;
        }
        while (compteur <= 10){
            if (isdigit(container[compteur])==false){return false;}
            ++compteur;
        }
        return true;
    }
    int transco(char lettre){
        if (lettre == 'A'){return 10;}
        if (lettre >= 'B' && lettre <= 'K'){return 12 + (lettre -'B');}
        if (lettre >= 'L' && lettre <= 'U'){return 23 + (lettre -'L');}
        if (lettre >= 'V' && lettre <= 'Z'){return 34 + (lettre -'V');}
        return 0;
    }
    bool cleContainer(std::string const& container){
        int reste = transco(container[0]);
        cout << container[0] << endl;
        cout << reste << endl;
        for (int cpt = 1; cpt <= 10;++cpt){
            if (cpt<=3){
                reste = reste + transco(container[cpt])*pow(2,cpt);
            }
            else{
                reste = reste + (container[cpt]*pow(2,cpt));
            }
            cout << container[cpt] << endl;
            cout << reste << endl;
        }
        if (((reste % 11) % 10) == container[10]){
            return true;
        }
        else{
            return false;
        }
    }
     
    int main(){
        string container;
        cout << "Bonjour," << endl;
        cout << "Merci entrer un numero de conteneur :" << endl;
        cin >> container;
        if (longueurChaine(container)== 11)
            {cout << endl << "chaine de caractere = 11" << endl;}
        else{cout << endl<<"chaine de caractere different de 11" << endl;}
        if (formeValide(container)){
            cout << "Forme valide" << endl;
        }
        else{
            cout << "Forme invalide" << endl;
        }
        if (cleContainer(container)){
            cout << "Cle Valide" << endl;
        }
        else{
            cout << "Cle Invalide" << endl;
        }
        return 0;
    }
    alors là, je ne comprends pas car il y a 2 fois (quand container[cpt] = 0) ou reste de devrait pas augmenter et pourtant en multipliant par 0 il augmente ...

    Je ne comprend pas :
    reste = reste + transco(container[cpt])*pow(2,cpt);
    reste = reste + (container[cpt]*pow(2,cpt));

    Merci

  10. #10
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    la suite devrait être :
    10
    36
    88
    344
    376
    376
    632
    1016
    3320
    4344

  11. #11
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Je ne comprends pas dans l'écriture comment en multipliant par zéro cela n'est pas égal à 0

  12. #12
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <iostream>
    #include <string>
    #include <math.h>
    using namespace std;
     
    int longueurChaine(std::string const& container){
        return container.size();
    }
    bool formeValide(std::string const& container){
        int compteur(0);
        while (compteur <= 3){
            if (isdigit(container[compteur])){return false;}
            ++compteur;
        }
        while (compteur <= 10){
            if (isdigit(container[compteur])==false){return false;}
            ++compteur;
        }
        return true;
    }
    int transco(char lettre){
        if (lettre == 'A'){return 10;}
        if (lettre >= 'B' && lettre <= 'K'){return 12 + (lettre -'B');}
        if (lettre >= 'L' && lettre <= 'U'){return 23 + (lettre -'L');}
        if (lettre >= 'V' && lettre <= 'Z'){return 34 + (lettre -'V');}
        return 0;
    }
    bool cleContainer(std::string const& container){
        int reste = transco(container[0]);
        for (int cpt = 1; cpt <= 10;++cpt){
            if (cpt<=3){
                reste = reste + transco(container[cpt])*pow(2,cpt);
                cout << transco(container[cpt]) << endl << pow(2,cpt) << endl << (transco(container[cpt]))*pow(2,cpt) << endl << reste << endl << endl;
            }
            else{
                reste = reste + (container[cpt])*pow(2,cpt);
                cout << container[cpt] << endl << pow(2,cpt) << endl << (container[cpt])*pow(2,cpt) << endl << reste << endl << endl;
            }
        }
        return (((reste % 11) % 10) == container[10]);
    }
     
    int main(){
        string container;
        cout << "Bonjour," << endl;
        cout << "Merci entrer un numero de conteneur :" << endl;
        cin >> container;
        if (longueurChaine(container)== 11)
            {cout << endl << "chaine de caractere = 11" << endl;}
        else{cout << endl<<"chaine de caractere different de 11" << endl;}
        if (formeValide(container)){
            cout << "Forme valide" << endl;
        }
        else{
            cout << "Forme invalide" << endl;
        }
        if (cleContainer(container)){
            cout << "Cle Valide" << endl;
        }
        else{
            cout << "Cle Invalide" << endl;
        }
        cout << 0*25;
        return 0;
    }

  13. #13
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    problème résolu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <iostream>
    #include <string>
    #include <math.h>
    using namespace std;
     
    int longueurChaine(std::string const& container){
        return container.size();
    }
    bool formeValide(std::string const& container){
        int compteur(0);
        while (compteur <= 3){
            if (isdigit(container[compteur])){return false;}
            ++compteur;
        }
        while (compteur <= 10){
            if (isdigit(container[compteur])==false){return false;}
            ++compteur;
        }
        return true;
    }
    int transco(char lettre){
        if (lettre == 'A'){return 10;}
        if (lettre >= 'B' && lettre <= 'K'){return 12 + (lettre -'B');}
        if (lettre >= 'L' && lettre <= 'U'){return 23 + (lettre -'L');}
        if (lettre >= 'V' && lettre <= 'Z'){return 34 + (lettre -'V');}
        return 0;
    }
    bool cleContainer(string container){
        int reste = transco(container[0]),cle;
        for (int cpt = 1; cpt < 10;++cpt){
            if (cpt<=3){
                reste = reste + (transco(container[cpt]))*pow(2,cpt);
            }
            else{
                reste = reste + (container[cpt]-48)*pow(2,cpt);
            }
        }
        cle = container[10]-48;
        return (((reste % 11) % 10) == cle);
    }
     
    int main(){
        string container;
        cout << "Bonjour," << endl;
        cout << "Merci entrer un numero de conteneur :" << endl;
        cin >> container;
        if (longueurChaine(container)== 11)
            {cout << endl << "chaine de caractere = 11" << endl;}
        else{cout << endl<<"chaine de caractere different de 11" << endl;}
        if (formeValide(container)){
            cout << "Forme valide" << endl;
        }
        else{
            cout << "Forme invalide" << endl;
        }
        if (cleContainer(container)){
            cout << "Cle Valide" << endl;
        }
        else{
            cout << "Cle Invalide" << endl;
        }
        return 0;
    }
    mon premier programme fonctionne ^^, pas simple pour un premier

  14. #14
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Version finale : Si vous avez des commentaires ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <iostream>
    #include <string>
    #include <math.h>
    using namespace std;
     
    int longueurChaine(std::string const& container){
        return container.size();
    }
    bool formeValide(std::string const& container){
        int compteur(0);
        while (compteur <= 3){
            if (isdigit(container[compteur])){return false;}
            ++compteur;
        }
        while (compteur <= 10){
            if (isdigit(container[compteur])==false){return false;}
            ++compteur;
        }
        return true;
    }
    int transco(char lettre){
        if (char(lettre >= 97)){lettre = lettre - 32;}
        if (lettre == 'A'){return 10;}
        if (lettre >= 'B' && lettre <= 'K'){return 12 + (lettre - 'B');}
        if (lettre >= 'L' && lettre <= 'U'){return 23 + (lettre - 'L');}
        if (lettre >= 'V' && lettre <= 'Z'){return 34 + (lettre - 'V');}
        return 0;
    }
    bool cleContainer(std::string const& container){
        if ((longueurChaine(container) != 11) || (formeValide(container) == false)){return false;}
        int reste = transco(container[0]),cle;
        for (int cpt = 1; cpt < 10;++cpt){
            if (cpt<=3){
                reste = reste + (transco(container[cpt]))*pow(2,cpt);
            }
            else{
                reste = reste + (container[cpt]-48)*pow(2,cpt);
            }
        }
        cle = container[10]-48;
        return (((reste % 11) % 10) == cle);
    }
     
    int main(){
        string container;
        cout << "Bonjour," << endl;
        do{
            cout << "Merci entrer un numero de conteneur (1 pour sortir) :" << endl;
            cin >> container;
            if (cleContainer(container)){
                cout << "CLE VALIDE" << endl << endl;
            }
            else{
                cout << "CLE INVALIDE" << endl << endl;
            }
        } while(char(container[0]) != '1');
        return 0;
    }

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    - Pourquoi using namespace std; si c'est pour répéter std:: à chaque fois ?
    - Le switch initial était intéressant, un switch case c'est une unique instruction, alors que tes successions de if else non
    - Je trouve l'utilisation du ! plus élégante qu'un == false;
    - reste = reste + ... => reste += ...;
    - Ta fonction cleContainer commence à 1 et fais un genre de cas particulier pour le 0 alors que ce n'en est pas un et devrait être factorisé dans la boucle comme le reste
    - De même un if pour <= 3 et faire une soustraction, autant avoir une fonction qui gère ça à appeler sur tous les éléments. Et à partir de là tu pourras utiliser std::accumulate
    - cleContainer gagnerait à être renommée en isValid ou assimilée
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    transport maritime
    Inscrit en
    Février 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : transport maritime
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour vos commentaires et pour vos conseils.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Recherche documentation récente sur les types de String
    Par Invité dans le forum Lazarus
    Réponses: 9
    Dernier message: 30/10/2010, 17h44
  2. [SQL 2000] Question sur les types de données
    Par Angath dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/11/2006, 14h05
  3. [NTFS]explication sur les type de droits
    Par arnolem dans le forum Sécurité
    Réponses: 6
    Dernier message: 19/04/2006, 12h52
  4. [VBS]Bug sur les boucles for.
    Par méphistopheles dans le forum VBScript
    Réponses: 7
    Dernier message: 24/03/2006, 22h17
  5. Renseignement sur les "types" d'asm
    Par Coussati dans le forum Assembleur
    Réponses: 4
    Dernier message: 10/01/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo