Code Blocks C

Un souci ou au contraire envie d'aider ? Venez partager ça.

Modérateur : L'équipe

Répondre
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Code Blocks C

Message par Locface »

Hey,


Je débute en programmation en C, je travaille avec CodeBlocks et j'ai voulu faire une console avec mot de passe si le mot de passe est bon le programme dit: "Bien joué la console se fermera dans 5 secondes". Si ce n'est pas le cas elle dit: " Non ce n'est pas le bon mot de passe, Bye !"

Le mot de passe est CocaCola et dans les deux cas le programme me dit : "Bien joué la console se fermera dans 5 secondes".

Je ne comprend pas pourquoi...

Je voudrais que tant qu'il n'y ai pas le mot de passe correct la boucle se répète jusqu'à que le mot de passe soit rentrer

Je vous passe le code:
Spoiler :
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <windows.h>

int main()
{
int mdp,dormir,CocaCola;
mdp = CocaCola;
dormir = 1500;
while (mdp !=CocaCola);
{

printf("Bonjour,\n\n");
printf("Quel est le mot de passe ?:\n");
scanf("%d",&mdp);
if
(mdp == CocaCola)

{
printf("\nBien joue ! La console se fermera dans 5 secondes.");
Sleep (dormir);
printf("\n\n5");
Sleep (dormir);
printf("\n4");
Sleep (dormir);
printf("\n3");
Sleep (dormir);
printf("\n2");
Sleep (dormir);
printf("\n1");
Sleep (dormir);

}
else
{
printf("Non ce n'est pas le bon mot de passe");
Sleep(dormir);
Sleep(dormir);
printf ("\nReessais !");
Sleep(dormir);
Sleep(dormir);
}

}

return 0;
}

Voilà, si quelqu'un si connait en programmation et si quelqu'un développe un peu et qu'il me trouve une solution, qu'il me le fasse savoir !
Ou encore si quelqu'un à trouver un autre code pour faire ce que je veux. ;)
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
djidane535
Messages : 1975
Inscription : 31 juil. 2012, 11:54
Sexe : ♂ Masculin

Re: Code Blocks C

Message par djidane535 »

Un peu compliqué de faire ça sur le forum mais je vais quand même essayer :p.

Tu as besoin de 3 variables, une pour le temps que tu souhaites attendre entre chaque décompte ('dormir', exprimé en millisecondes et qui est stocké dans un 'int'), une qui va contenir le bon mot de passe ('vraiMdp', une chaîne de caractère, de type 'char*') et une qui va contenir le mot de passe saisi par l'utilisateur ('mdp', une chaîne de caractère, de type 'char*'). Le temps d'attente est fixé ici à 1,5 secondes, soit 1500 ms. Le bon mot de passe est "CocaCola", ce qui nous donne:

Code : Tout sélectionner

int dormir = 1500;
char vraiMdp[] = "CocaCola";
char mdp[100];
Ici ta première erreur était au niveau des types ('int' au lieu de 'char*' pour stocker tes mots de passe) et de déclarer une variable 'CocaCola' au lieu de stocker la chaîne de caractère "CocaCola" dans une variable.

Ensuite, tu vas entrer dans une boucle. Puisque tu comptes au moins faire 1 itération de la boucle, on va donc utiliser une boucle 'do { ... } while(...);'.

Code : Tout sélectionner

do
{
...
}
while (...);
A l'intérieur de la boucle on doit:
  • :arrow: Demander à l'utilisateur d'entrer un mot de passe.
  • :arrow: Si le mot de passe est correct, lancer un décompte.
  • :arrow: Si le mot de passe est incorrect, attendre et l'inviter à réessayer.
On reste dans la boucle tant que le mot de passe entré est mauvais.

1) Demander à l'utilisateur d'entrer un mot de passe.
Note: ne pas oublier d'utiliser '%s' pour lire une chaîne de caractère ('%d' étant réservé aux entiers).

Code : Tout sélectionner

printf("Quel est le mot de passe ?:\n");
scanf("%s",&mdp);
printf("\n");
2) Si le mot de passe est correct, lancer un décompte.
Pour vérifier que deux chaînes de caractères sont égales, utiliser '==' ou '!=' n'est pas suffisant (car il s'agit de pointeurs sur des tableaux, si tu n'as pas encore vu les pointeurs ce n'est pas grave tu peux continuer à lire ^^).

On va devoir utiliser une fonction pour pouvoir le faire. Il faut inclure 'string.h' pour pouvoir s'en servir. La fonction 'strcomp' prend en entrée 2 chaînes de caractères et renvoie '0' si celles-ci sont identiques.

Code : Tout sélectionner

#include <string.h>
...
if (strcomp(mdp, vraiMdp) == 0) // 'mdp' == 'vraiMdp'
{
     ...
}
Maintenant, il ne nous reste plus qu'à faire le décompte. On peut simplement faire une boucle de 5 itérations qui va afficher "5 .. 4 .. 3 ..." et attendre 1,5s à chaque itération.

Code : Tout sélectionner

printf("Bien joue ! La console se fermera dans 5 secondes.\n\n");

int i = 5;
while (i > 1)
{
     printf("%d\n", i);
     Sleep(dormir);
     --i;
}
3) Si le mot de passe est incorrect, attendre et l'inviter à réessayer.
Si le mot de passe entré est incorrect, on doit attendre un moment et l'inviter à réessayer:

Code : Tout sélectionner

else
{
     printf("Non ce n'est pas le bon mot de passe\n");
     Sleep(dormir);
     printf ("Reessaie !\n\n");
     Sleep(dormir);
}

Code complet:

Code : Tout sélectionner

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h> 
#include <windows.h>

int main()
{
     int dormir = 1500;
     char vraiMdp[] = "CocaCola",
     char mdp[100];

     do
     {
          printf("Quel est le mot de passe ?:\n");
          scanf("%s",&mdp);
          printf("\n");

          if (strcomp(mdp, vraiMdp) == 0) // 'mdp' == 'vraiMdp'
          {
               printf("Bien joue ! La console se fermera dans 5 secondes.\n\n");

               int i = 5;
               while (i > 1)
               {
                    printf("%d\n", i);
                    Sleep(dormir);
                    --i;
               }
          }

          else
          {
               printf("Non ce n'est pas le bon mot de passe\n");
               Sleep(dormir);
               printf ("Reessaie !\n\n");
               Sleep(dormir);
          }
     } while (strcomp(mdp, vraiMdp) != 0); // 'mdp' != 'vraiMdp'

     return 0;
}
Voilà voilà ;).
Dernière modification par djidane535 le 19 déc. 2013, 19:25, modifié 1 fois.
Image
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

Pour la petite info:
Je suis enfin en stage de 3 ème pour la première fois vu que j'ai redoublé (ce n'est pas le sujet), et j'ai bien cherché une heure avec un chef de projet en informatique pour essayer de trouver la solution.
On a trouver des similitudes avec ce que tu as trouvé pendant les 1 heures ou j'ai travailler avec lui, comme le fait:

Qu'il fallait comparé deux chaines de caractère et pas des nombres entiers. x)
la librairie string.h qu'il fallait inclure.
On avait trouver la fonction strcmp au lieu de strcomp. :lol:
La fonction scanf("%s",&mdp);
La boucle marchait très bien mais la fonction scanf était sauter une fois la boucle activée du coup le truc se répété à l'infini avec la fonction Sleep, pourquoi ça ? J'en ai aucune idée.
Et on avait mis la fonction char sans l'étoile par contre du coup sa devait marcher un peu moins bien ! :$

On y était presque ! :)

Et oui on fait de la programmation sur le site qu'on programme bien dedans.
Dernière modification par Locface le 19 déc. 2013, 17:28, modifié 1 fois.
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

J'analyse le tout de façon à mettre des commentaires et à y penser la prochaine fois que j'ai un problème avec ce genre de code.
Et merci beaucoup de m'avoir aider tu m'as tout de même retiré une épine du pied.
Car je suis tombé sur des sites ou les personnes disait fallait décomposer les chaînes de caractère en une dizaine de ligne avec des fonctions que je connaissais même pas en vérifiant chaque lettre de mes deux chaînes de caractère. T-T

C'est très appréciable, car tout le monde à beau avoir un ordinateur tout le monde ne s'est pas forcément programmer, surtout comme tu l'as dit "sur un forum" :$
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
djidane535
Messages : 1975
Inscription : 31 juil. 2012, 11:54
Sexe : ♂ Masculin

Re: Code Blocks C

Message par djidane535 »

Pas de soucis, content de pouvoir aider ;).

Pour l'histoire des chaînes de caractères, c'est parce qu'en C, elles sont stockées dans des tableaux (je ne sais pas si tu les as déjà vus ?). Donc quand tu veux comparer 2 chaînes de caractères, tu es obligé de les comparer caractère par caractère (en parcourant les 2 tableaux en parallèle). Sauf qu'évidemment, pour une tâche aussi basique, il existe déjà des fonctions toutes faites qui le font déjà pour toi ^^.
Image
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

Locface a écrit : Car je suis tombé sur des sites ou les personnes disait fallait décomposer les chaînes de caractère en une dizaine de ligne avec des fonctions que je connaissais même pas en vérifiant chaque lettre de mes deux chaînes de caractère. T-T
Voilà c'est ce que je voulais dire quand je parlais des "lignes" il m'avait aussi parlait des tableaux mais c'est encore inconnu pour moi...
Si tu veux m'expliquer je veux bien.
Et si tu veux bien je veux bien que tu m’explique la fonction:
(strcomp(mdp, vraiMdp) == 0) // 'mdp' == 'vraiMdp'
Car c'est un truc que j'ai découvert aujourd'hui et j'ai un peu de mal à l'assimiler... De façon à ce que je puisse assimiler et noter tout ça.
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
djidane535
Messages : 1975
Inscription : 31 juil. 2012, 11:54
Sexe : ♂ Masculin

Re: Code Blocks C

Message par djidane535 »

Un tableau, c'est une structure qui te permet de stocker plusieurs éléments du même type. Par exemple, si je veux stocker 10 entiers, je vais déclarer un tableau de 10 entiers comme ceci:

Code : Tout sélectionner

int tab[10];
Pour accéder au 1er entier du tableau, je dois aller "à la case 0":

Code : Tout sélectionner

tab[0] // Premier élément du tableau 'tab'
Le dernier élément de ce tableau se trouve donc à la case "9":

Code : Tout sélectionner

tab[9] // Dernier élément du tableau 'tab'
Une chaîne de caractère, c'est un tableaux qui contient ... des caractères. Un caractère est représenté par le type 'char'. Ce qui différencie un tableau classique d'une chaîne de caractère, c'est que celui-ci contient toujours le caractère spécial '\0', qui indique que les autres cases du tableau sont inutilisées.

Par exemple, je peux créer une chaîne de caractère 'str' qui contiendra le mot 'hedg.fr' comme ceci:

Code : Tout sélectionner

char str[10];
str[0] = 'h';
str[1] = 'e';
str[2] = 'd';
str[3] = 'g';
str[4] = '.';
str[5] = 'f';
str[6] = 'r';
str[7] = '\0';
Mon tableau peut contenir jusqu'à 9 caractères (car il faut réserver une place pour le '\0'), mais ici je n'en ai utilisé que 7, parce que 'hedg.fr' ne contient que 6 caractères.

Si on faisait ça comme ça, ça serait très chiant (mettre les caractère 1 par 1, c'est pas pratique). Du coup, on a ajouté une manière plus commode de le faire:

Code : Tout sélectionner

char str[] = "hedg.fr";
L'ordinateur va automatiquement créer un tableau de caractères assez grand pour contenir la chaîne "hedg.fr" et le caractère '\0'.

Mais les tableaux ont un gros défaut: tu dois en fixer la taille à l'avance. Tu ne peux par exemple pas faire

Code : Tout sélectionner

int n = 10;
int tab[n]; // Erreur
parce que 'n' est une variable. Si la taille de ton tableau peut varier d'une exécution à l'autre, il faudra alors l'allouer dynamiquement (mais ça, tu le verras quand tu aborderas les pointeurs).

Ca me fait penser qu'il y a une petite faute dans le code que je t'ai donné:

Code : Tout sélectionner

int dormir = 1500;
char* vraiMdp = "CocaCola";
char* mdp;
devient

Code : Tout sélectionner

int dormir = 1500;
char vraiMdp[] = "CocaCola";
char mdp[100];
Sinon l'ordinateur ne comprendra pas qu'il doit créer un tableau pour stocker "CocaCola". Quant à "char mdp[100]", il faut que tu te donnes initialement un tableau suffisamment grand que pour pouvoir stocker le mot de passe saisi par l'utilisateur (ici, l'utilisateur ne pourra pas saisir un mot de passe de plus de 99 caractères).

J'ai édité mon post pour corriger cette erreur ;).
Image
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

Merci beaucoup !
Cela me parait plus clair maintenant. :)
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
djidane535
Messages : 1975
Inscription : 31 juil. 2012, 11:54
Sexe : ♂ Masculin

Re: Code Blocks C

Message par djidane535 »

Np ;).
Image
Avatar de l’utilisateur
perchu
Meilleur détective hedg.fr
Meilleur détective hedg.fr
Messages : 1860
Inscription : 18 déc. 2012, 21:08

Re: Code Blocks C

Message par perchu »

Djidane, tu devrais faire prof :D .
J'y arrive plus perso, je complique tout à force de vérifier tout les cas merdiques et je perds tout le monde à force :lol: .

Par contre, pourquoi utilisez-vous windows.h et unistd.h? Je ne vois aucune fonction utile pour ce travail (Oui je sais je suis pointilleux de merde).
Image
TimeSpinner: Castlevania DS :o
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

perchu a écrit :Djidane, tu devrais faire prof :D .
J'y arrive plus perso, je complique tout à force de vérifier tout les cas merdiques et je perds tout le monde à force :lol: .

Par contre, pourquoi utilisez-vous windows.h et unistd.h? Je ne vois aucune fonction utile pour ce travail (Oui je sais je suis pointilleux de merde).
La librairie windows.h sert pour la fonction Sleep.
Et unistd.h je sais plus je crois que je l'avais mis car je l'avais trouver nécessaire dans une fonction que j'avais enlever par la suite.
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
perchu
Meilleur détective hedg.fr
Meilleur détective hedg.fr
Messages : 1860
Inscription : 18 déc. 2012, 21:08

Re: Code Blocks C

Message par perchu »

Mmm ok j'ai plus l'habitude de travailler avec time.h.

Par contre Locface, si tu t'interesses beaucoup au C, je te conseille cette bible:
http://www.dunod.com/informatique-multi ... -langage-c
J'en ai un qui tombe en ruine tellement que je l'ai potassé, Ce livre est très dense, donc tu es vite lâché mais si tu codes beaucoup en C, tu as plein d'idées dedans. Ritchie est l'inventeur du langage C et Kernighan est juste le mec qui a eu l'idée du programme hello world. C'est pas l'ouvrage que tu lis par obligation, il est très complexe mais quelques exercices du livre t'ouvre des portes à du langage C très poussé.
Image
TimeSpinner: Castlevania DS :o
Avatar de l’utilisateur
Atobe
Messages : 39
Inscription : 21 janv. 2013, 12:58

Re: Code Blocks C

Message par Atobe »

AH du langage C le bonheur !!! :D
Et moi qui dois taffer sur le python car j'ai un projet de jeu a faire pour l'école ...
HI-MIT-SU
Image
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

perchu a écrit :mmm ok j'ai plus l'habitude de travailler avec time.h.

Par contre Locface, si tu t'interesses beaucoup au C, je te conseille cette bible:
http://www.dunod.com/informatique-multi ... -langage-c
J'en ai un qui tombe en ruine tellement que je l'ai potassé, Ce livre est très dense, donc tu es vite lâché mais si tu codes beaucoup en C, tu as plein d'idées dedans. Ritchie est l'inventeur du langage C et Kernighan est juste le mec qui a eu l'idée du programme hello world. C'est pas l'ouvrage que tu lis par obligation, il est très complexe mais quelques exercices du livre t'ouvre des portes à du langage C très poussé.
C'est intéressant, je verrais.
Je vais sans doute l'acheter ça me sera sans doute indispensable par la suite !
Merci Perchu !
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
djidane535
Messages : 1975
Inscription : 31 juil. 2012, 11:54
Sexe : ♂ Masculin

Re: Code Blocks C

Message par djidane535 »

@perchu: Merci ^^. En fait, je suis assistant pour un cours de programmation de C depuis quelques mois justement, du coup c'est de la matière que j'ai du bien potasser pour arriver à l'expliquer clairement (d'ailleurs en ce moment les étudiants défilent dans mon bureau :p).

Je recommande aussi ce bouquin, je connais beaucoup de programmeur qui n'en disent que du bien même si je ne le possède pas moi-même ;).
Image
Avatar de l’utilisateur
Locface
Champion Into The Dead & Blindtest
Champion Into The Dead & Blindtest
Messages : 391
Inscription : 09 sept. 2013, 01:27
Sexe : ♂ Masculin
Localisation : Lansargues

Re: Code Blocks C

Message par Locface »

Je up ce topic et en donnant la correction pour le code final pour les gens que cela intéresse avec mes modifications personnels mais le code de Djidane est correct aussi.
Spoiler :
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <windows.h>

int main()
{
int dormir = 1500;
char vraiMdp[] = "CocaCola";
char mdp[100]; //char chaîne de caractère et [] le nombre de caractère maximum du tableau ne rien mettre veut dire qu'on peut en mettre
//autant que l'on veut.

printf("Bonjour !\n");

do

{
Sleep(dormir);
printf("Quel est le mot de passe ?:\n");
scanf("%s",&mdp);
printf("\n");

if (strcmp(mdp, vraiMdp) == 0) // 'mdp' == 'vraiMdp'
{
printf("Bien joue ! La console se fermera dans 5 secondes.\n\n");
Sleep (dormir);
printf("\n\n5");
Sleep (dormir);
printf("\n4");
Sleep (dormir);
printf("\n3");
Sleep (dormir);
printf("\n2");
Sleep (dormir);
printf("\n1");
Sleep (dormir);

}

else
{
printf("Non ce n'est pas le bon mot de passe\n");
Sleep(dormir);
printf ("Reessaie !\n\n");
Sleep(dormir);
}
} while (strcmp(mdp, vraiMdp) != 0); // 'mdp' != 'vraiMdp'

return 0;
}
Tabouret + Chaise
Spoiler :
Image
J'aime le beurre de cacahuète.
Avatar de l’utilisateur
perchu
Meilleur détective hedg.fr
Meilleur détective hedg.fr
Messages : 1860
Inscription : 18 déc. 2012, 21:08

Re: Code Blocks C

Message par perchu »

Une boucle for serait plus propre pour le décompte, et après il ne te restera qu'à créer des fonctions pour refaire le même programme ;).
Image
TimeSpinner: Castlevania DS :o
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 7 invités