Problème avec la boucle while

Résolu/Fermé
enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017 - 11 juil. 2017 à 12:27
YCN- Messages postés 116 Date d'inscription mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 - 12 juil. 2017 à 16:09
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

3 réponses

YCN- Messages postés 116 Date d'inscription mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
Modifié le 11 juil. 2017 à 17:05
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
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
11 juil. 2017 à 19:47
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é.
0
enigman0001 Messages postés 28 Date d'inscription samedi 30 avril 2016 Statut Membre Dernière intervention 28 décembre 2017
12 juil. 2017 à 13:48
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.
0
YCN- Messages postés 116 Date d'inscription mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
Modifié le 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)) ){
    ...
  }
0