Signaler

Problème avec la boucle while [Résolu]

Posez votre question enigman0001 23Messages postés samedi 30 avril 2016Date d'inscription 12 juillet 2017 Dernière intervention - Dernière réponse le 12 juil. 2017 à 16:09 par YCN-
bonjour

je suis actuellement entrain de faire un tp du cours de programmation en langage c,et j'ai été amené a faire une fonction partie() qui prend en paramètre une lettre et renvoie un nombre, cette fonction doit cherche une lettre dans une chaine et donner le numéro de de son emplacement dans la chaine, par ex : si la chaîne est " tarte " , et que je tape "r", la fonction doit me renvoyer 3, parce que la lettre r se trouve a l'emplacement n3

voila , mais le problème est que quelque soit le mot, quelque sot ça longueur, elle revoie le numéro 4230, toujours !

j'ai essayé d’afficher le numéro avant ( quand il est initialisé a 0 ) et après ( après le passage de la boucle while )

on dirait que la boucle ce répète 4230 fois.

je n'arrive pas a comprendre pour quoi , je vous envoi le code en espérant que quelqu'un puisse me donner une explication

ps : je dit renvoie mais je sais que c'est pas très juste puisque la fonction est de type void, je veut dire qu'elle nous donne le nombre dans un printf

   
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include "les prototypes.h"



char mot_mystere[30] = "";

int main()
{
int mode_de_jeu = 0, niveau_de_jeu = 0, nombre_de_coups = 0;
char lettre = 0;

FILE* test = NULL;

test = fopen("base_de_donnees.txt", "r+");

if (test != 0)
{
fclose(test);

printf("=============== bienvenue au jeu de pendu ================\n\n\n");

do
{
printf("choisissez le mode de jeu\n\n");
printf("1. mode solo\n");
printf("2. mode deux joueurs\n\n");
scanf("%d", &mode_de_jeu);

switch (mode_de_jeu)
{
case 1:
do
{
printf("\nvous avez choisi le mode solo, choisissez le niveau de jeu\n\n");
printf("1. facile\n");
printf("2. normal\n");
printf("3. difficile\n\n");
scanf("%d", &niveau_de_jeu);

switch (niveau_de_jeu)
{
case 1:
printf("\nvous avez choisi le niveau facile\n\n");
printf("il vous reste . coups\n");
printf("quel est le mot secret ?\n");
printf("tappez une lettre : ");
choisir_mot();
printf("%s", mot_mystere);
partie();
break;
case 2:
printf("\nvous avez choisi le niveau normal\n\n");
printf("il vous reste . coups\n");
printf("quel est le mot secret ?\n");
printf("tappez une lettre : ");
break;
case 3:
printf("\nvous avez choisi le niveau difficile\n\n");
printf("il vous reste . coups\n");
printf("quel est le mot secret ?\n");
printf("tappez une lettre : ");
break;
default:
printf("il faut tapper le numero 1, 2 ou 3\n\n");
}
} while (niveau_de_jeu < 1 || niveau_de_jeu > 3);
break;
case 2:
do
{
printf("\nvous avez choisi le mode deux joueurs, choisissez le niveau de jeu\n\n");
printf("1. facile\n");
printf("2. normal\n");
printf("3. difficile\n\n");
scanf("%d", &niveau_de_jeu);

switch (niveau_de_jeu)
{
case 1:
printf("\nvous avez choisi le niveau facile\n\n");
printf("il vous reste . coups\n");
printf("quel est le mot secret ?\n");
printf("tappez une lettre : ");
break;
case 2:
printf("\nvous avez choisi le niveau normal\n\n");
printf("il vous reste . coups\n");
printf("quel est le mot secret ?\n");
printf("tappez une lettre : ");
break;
case 3:
printf("\nvous avez choisi le niveau difficile\n\n");
printf("il vous reste . coups\n");
printf("quel est le mot secret ?\n");
printf("tappez une lettre : ");
break;
default:
printf("il faut tapper le numero 1, 2 ou 3\n\n");
}
} while (niveau_de_jeu < 1 || niveau_de_jeu > 3);
break;
default:
printf("il faut taper le numero 1 ou 2\n\n");
}
} while (mode_de_jeu < 1 || mode_de_jeu > 2);
}
else
{
printf("impossible d'ouvrir le fichier 'base_de_donnees'\n\n\n");
}

return 0;
}

char lire_caractere()
{
char caractere = 0;

getchar();
caractere = toupper(getchar());

while(getchar() != '\n');

return caractere;
}

void choisir_mot()
{
int nombre_aleatoire = 0, i = 0;
const int MAX = 10, MIN = 1;

FILE* fichier = NULL;

srand(time(NULL));
nombre_aleatoire = (rand() % (MAX - MIN + 1)) + MIN;

fichier = fopen("base_de_donnees.txt", "r+");

if (fichier != NULL)
{
while (i < nombre_aleatoire)
{
fgets(mot_mystere, 100, fichier);
i++;
}
fclose(fichier);
}
else
{
printf("operation impossible");
}
}

void partie()
{
char lettre = 0;
int n = 0;

lettre = lire_caractere();

while (mot_mystere[n] != lettre)
{
n++;
}
printf("%d", n);
}




merci a tous pour votre aide
Afficher la suite 
Utile
+0
plus moins
Bonjour !

Voilà je te laisse le soin de comprendre comment mon implémentation fonctionne :

void tarte (char * str , char my_char, int * whr){
 int i;
 int q=0;
 for (i=0;i<strlen(str);i++){
  if (str[i] == my_char){
   whr[q+1]=i;
   q++;
  }
 }
 whr[0] = q;
}


Pour tester :

int main(void)
{
    int tab [126];
    tarte("tarte",'t',tab);
    printf("%s contient %c %d fois, à la place %d , %d \n", "tarte" , 't' , tab[0],tab[1],tab[2]);
    tarte("peripatetitienne",'t',tab);
    printf("peripatetitienne contient %c %d fois, à la place %d , %d , %d \n", 't' ,tab[0],tab[1],tab[2],tab[3]);
    
    return 0;   
}



ça fait ce que tu as demandé dans tes specs. Quote : cette fonction doit cherche une lettre dans une chaine et donner le numéro de de son emplacement dans la chaine, par ex : si la chaîne est " tarte " , et que je tape "r", la fonction doit me renvoyer 3, parce que la lettre r se trouve a l'emplacement n3
Donnez votre avis
Utile
+0
plus moins
Bonjour,
Regarde ta fonction lire_caractere() et le caractère qui est retournée n'est pas le premier tapé (il y a une ligne de trop).
Ta fonction partie() devrait aussi gérer le cas où le caractère n'est pas dans le mot. C'est le cas si on rencontre le caractère '\0' avant le caractère cherché.
Donnez votre avis
Utile
+0
plus moins
bonjour et merci pour vos réponses

j'ai finalement trouvé le d'ou vient problème :
moi je tape un caractère en majuscule, mais dans ma base de donnée les caractères sont en minuscule, et pour l'ordinateur E et e c'est pas la même chose, donc il cherche et il cherche mais sans rien trouver.

reste maintenant a savoir pour quoi 4320 fois, puisque normalement la boucle devrait se répéter a l'infini.

et non Dalfab il n'y as pas de ligne de trop justement, j'appelle la fonction getchar une fois pour vider du buffer le "\n" tapé par l'utilisateur,puis une deuxième fois pour récupérer les caractère.
YCN- 145Messages postés mercredi 24 juin 2015Date d'inscription 13 juillet 2017 Dernière intervention - 12 juil. 2017 à 16:09
Salut :),

Si tu veux faire une comparaison sans prendre en compte la casse tu peux ajouter à ma fonction :

  if (str[i] == my_char || ((int) str[i] == (int) (my_char - 32)) ){
    ...
  }
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !