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 :

Les variables


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Terminale S Si
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Terminale S Si

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Les variables
    Salut tout le monde!


    Voilà voilà, j'ai débuté la programmation en c++ le week-end dernier. J'ai appris avec les tutos vidéos de titotuto.fr.
    J'ai décidé d'essayer des programmes simples et de demander de l'aide en cas de soucis pour m'aider à développer mes compétences.

    Actuellement, je suis sur un programme de test de mot de passe. Tout simplement, on demande à l'utilisateur un mot de passe puis on vérifie sa validité.

    Voilà le code source:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        int vraipass(1234),userpass; // initialisation du vrai mot de passe, et de celui entré par l'utilisateur
     
        printf("Veuillez entrer votre mot de passe puis appuyez sur Enter :\n"); // demande du mot de passe
        scanf("%f",&userpass); // enregistrement du mot de passe entré par l'utilisateur
     
        if(userpass=vraipass) // vérification de la validité du mot de passe
                              { 
                              printf("\nLe mot de passe est correct.\n\n"); // le mot de passe est valide
                              }
        else
                              {
                              printf ("\n Le mot de passe entré est invalide.\n\n"); // le mot de passe n'est pas valide
                              }
     
     
        system ("pause");
        return 0;   
    }
    J'ai un petit problème : peu importe le mot de passe rentré, le programme me dit qu'il est correct. Donc il considère que userpass=vraipass. Comment cela se fait...?

    Ensuite, j'ai essayé de mettre une variable char (char vraipass(BlaBla),userpass;) pour avoir un mot de passe avec des lettres, mais le programme m'indique un problème sur cette ligne au moment de la compilation... Comment créer une variable en caractères? La ligne "if(userpass=vraipass)" fonctionnera-t-elle toujours?

    Et enfin, mais ça ce n'est qu'accessoire, y a-t-il un moyen pour que le programme revienne à la ligne 9 en cas de mot de passe éroné, donc après avoir indiqué la ligne 18.


    Voilà tout, merci d'avance pour votre aide! ;)

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Salut,

    Ici, c'est un forum C++ et en plus, tu débutes en C++ donc autant commencer par les bonnes habitudes.

    scanf() et printf(), c'est du C. En C++, il y a std::cin et std::cout.

    Maintenant, les erreurs :

    Le format %f attend l'adresse d'une variable de type float, tu lui donnes l'adresse d'une variable de type int. ==> Erreur, crash potentiel.

    L'affectation se fait un le signe "=", le test d'égalité se fait avec le signe "==". Cette erreur aurait dû se voir avec un compilateur bien réglé au niveau de la génération des warnings/erreurs.

    Au fait, une question, que se passe t'il (une fois que tu auras corrigé tous les bugs) si lors de la saisie du mot de passe (tu attends un nombre), l'utilisateur saisit "toto". Probablement pas ce que tu as prévu.

    En règle générale, il ne faut pas faire confiance à l'utilisateur et tout ce qui est saisi (au moins au clavier) devrait être validé et pour cela reçu dans un buffer de caractères pour analyse et validation par le programme.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 625
    Points : 30 674
    Points
    30 674
    Par défaut
    Salut,
    Citation Envoyé par Over703 Voir le message
    Et enfin, mais ça ce n'est qu'accessoire, y a-t-il un moyen pour que le programme revienne à la ligne 9 en cas de mot de passe éroné, donc après avoir indiqué la ligne 18.
    Oui, cela s'appelle les boucles
    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
     
        bool correct =false // pour pouvoir utiliser le résultat de la comparaison
                            // ailleurs que dans le text ailleurs que dans le texte
        while( ! correct )  // tant que ce n'est pas correct (on aurait pu écrire
                            //while(  correct == false )
        {
            printf("Veuillez entrer votre mot de passe puis appuyez sur Enter :\n"); 
            scanf("%d",&userpass); 
            correct = (userpass == vraipass)
            if(correct) 
            { 
                printf("\nLe mot de passe est correct.\n\n"); 
             }
            else
            {
                 printf ("\n Le mot de passe entré est invalide.\n\n"); 
            }
        }
    (je n'ai pas corrigé les erreurs de logique !!!)

    Deux remarques complémentaires :

    1- Il faut indenter son code, c'est une question de lisibilité, mais il faut essayer de le faire de manière intelligente !

    Le fait d'aligner les blocs sur la fin du test (comme tu l'as fait) risque de t'emmener très loin et de provoquer l'apparition d'une barre de défilement horizontale, ce qui nuira autant à la lisibilité du code que le fait de ne pas indenter du tout

    Utilise "simplement" un nombre fixe d'espaces (entre quatre et huit, c'est pas mal ) "suffisant" pour que l'on puisse clairement identifier les différents blocs

    2- Les commentaires c'est bien, à condition qu'ils aient un sens et ne se contentent pas de répéter ce que le code fait !

    On se doute que le if vérifie la validité du mot de passe (tu as eu l'intelligence d'utiliser des variables suffisamment explicite ) ou que printf("mot de passe incorrect") va afficher le message en question !

    Par contre, le fait d'indiquer le but d'une variable ou d'une instruction, pouvant être mal comprise rendra tes commentaires des plus utiles
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Terminale S Si
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Terminale S Si

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Ici, c'est un forum C++ et en plus, tu débutes en C++ donc autant commencer par les bonnes habitudes.

    scanf() et printf(), c'est du C. En C++, il y a std::cin et std::cout.
    Ah bon... oO

    Citation Envoyé par ram-0000 Voir le message
    Au fait, une question, que se passe t'il (une fois que tu auras corrigé tous les bugs) si lors de la saisie du mot de passe (tu attends un nombre), l'utilisateur saisit "toto". Probablement pas ce que tu as prévu.

    En règle générale, il ne faut pas faire confiance à l'utilisateur et tout ce qui est saisi (au moins au clavier) devrait être validé et pour cela reçu dans un buffer de caractères pour analyse et validation par le programme.
    Bah... Je n'y suis pas encore. x')


    @Koala01 : Merci pour le code, je testerais à partir de ça ce soir! Et merci aussi pour le cours sur les commentaires!

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Terminale S Si
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Terminale S Si

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Re bonjour tout le monde, j'ai un nouveau problème.

    En ayant marre des icônes en bazar sur le bureau, j'ai décidé de tout simplifier avec un programme permettant de charger une application, ou jeu, au choix.
    Pour le moment, j'en suis au choix entre lancer un jeu ou une application.

    Voilà le code:
    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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        char choixType(0), choixJeu(0), ChoixApp(0);
        int choixTypeCorrect(0), choixJeuCorrect(0), ChoixAppCorrect(0);
     
        while (choixTypeCorrect == 0 )
        {
            cout << "1. Lancer un jeu." << endl << "2. Lancer une application" << endl << endl;
            cout << "Rentre ton choix (1 ou 2) puis appuie sur Enter : ";
            cin >> choixType;
            cout << endl;
     
            if (choixType == 1)
            {
                choixTypeCorrect = '1';
            }
            else
            {
                if (choixType == 2)
                {
                    choixTypeCorrect = '1';
                }
                else
                {
                    choixType = '0';
                    cout << "Le choix n'est pas valide. Tu dois choisir 1 ou 2." << endl << endl << endl;
                }
            }
        }
     
        cout << endl << "Le choix est valide!" << endl << endl;
     
        /* maintenant que le choix est validé, le programme va afficher la liste correspondante
        C'est à dire celle des jeux si choixType==1, si non celle des applications. */
     
        return 0;
    }
    Pour ce qui est de mon problème, c'est qu'il considère toujours que mon choix n'est pas valide, donc ni que choixType == 1 ni que choixType == 2.

    Voilà un screen en essayant avec 1 ou 2:

    Comme vous pouvez le voir, on reste dans la boucle et il ne considère pas mes choix comme corrects, alors qu'ils le sont.

    Si j'essaie un autre chiffre, une lettre ou un caractère spécial:

    Là non plus le choix n'est pas validé, mais c'est normal car c'est ce que je veux.

    Et enfin, un problème un peu spécial:

    Comme vous pouvez le voir, si je mets deux caractères il me remet deux lignes. Si j'en mets 3 il me met trois lignes, ect...


    Quelqu'un a une idée de pourquoi ça ne fonctionne pas pour 1 et pour 2? Et pourquoi mettre plusieurs lignes quand le choix comporte plusieurs caractères?

    Et aussi, mais ça n'est qu'accessoire, est-ce possible de lancer un .exe depuis un programme en C++? Juste histoire de savoir si je pourrais concrétiser le projet ou s' il ne restera qu'un entraînement.


    Vous savez tout. Merci d'avance!

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pour commencer, tes variables choix ont le mauvais type.
    Etant en char, quand tu rentres sur la console le caractère 1, la valeur choixType == 41.

    Il faut que tu déclares tes variables comme des entiers.

    Je ne sais pa avec quoi tu code, mais un debugger t'aurais aidé.

    Pense également à utiliser un switch plutôt que des if/else.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Terminale S Si
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Terminale S Si

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Ah. Ok pour la variable entier. En fait j'avais mis char pour que les lettres soient refusées, je craignais qu'avec unsinged int les lettres fassent bugger le truc.

    J'utilise CodeBlocks.

    Je ne connais pas encore les switch. Je vais chercher sur google, merci de l'astuce!

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

Discussions similaires

  1. Effacer les variables de session
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 12/12/2003, 13h42
  2. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  3. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53
  4. [XSLT] les variables???
    Par Lydiane dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 09/08/2002, 16h17
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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