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 :

Simuler le jeu des chiffres et des lettres


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 31
    Points
    31
    Par défaut Simuler le jeu des chiffres et des lettres
    On s’intéresse dans ce projet uniquement à la partie des lettres
    ************
    Le programme consiste à choisir 9 lettres (des consonnes et
    des voyelles)
    Si l’utilisateur choisis une consonne la machine doit choisir au hasard une consonnes
    De même pour les voyelles. Evidemment les consonnes et les voyelles n’ont pas la même probabilité d'apparaître et à vous de réfléchir à ce problème.
    Après le tirage des 9 lettres la machine va donner un temps de réflexion à l’utilisateur (40 secondes )
    L’utilisateur doit taper ensuite le mot le plus long qu’il peut trouver. Evidemment la machine doit :
    - Vérifier si les lettres figures parmi le tirage ( on ne peut pas utiliser deux fois la même lettre sauf si elle figure une autre fois dans le tirage )
    - Vérifier si le mot figure dans le dictionnaire français.


    ****
    j'ai commencé par ce code ( juste l'affichage des 9 lettres - mélange des voyelles et consonnes)
    mais il y a une erreur dans l'affichage


    merci de m'aider

    je suis débutant


    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
    int main()
     
    {
     
    char lettre=0;
     
    char tab[9];
    int i=0;
    do {
     
    printf("Entrez une lettre\n");
    scanf("%c", &tab[i]);i++;
    if (lettre == 'a' || lettre == 'e' || lettre == 'i' || lettre == 'o' || lettre == 'u' || lettre == 'y')
    {
    do
    {
    srand(time(NULL));
    tab[i] = (rand() % ('z' - 'a'+ 1)) + 'a';
    }
    while (lettre == 'a' || lettre == 'e' || lettre == 'i' || lettre == 'o' || lettre == 'u' || lettre == 'y');
     
    }
    else
    {
    do
    {
    srand(time(NULL));
    tab[i] = (rand() % ('z' - 'a'+ 1)) + 'a';
    }
    while (lettre == 'b' || lettre == 'c' || lettre == 'd' || lettre == 'f' || lettre == 'g' || lettre == 'h');
        i++;
     
    }
      getchar();
    }
    while (i<9);
    return 0;
     
     
     
     for (i=0;i<9;i++)
     
        printf("%c", tab[i]);
     
    return 0;
     
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ton indentation ! J'espère pour toi que c'est juste une erreur de copier/coller, sinon tu as beaucoup de soucis de lisibilité à te faire...

    Concernant l'affichage, c'est normal que tu aies un "problème"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    return 0;
     
     
     
     for (i=0;i<9;i++)
     
        printf("%c", tab[i]);
     
    return 0;
     
    }
    Il y a un return 0; en trop, ce qui fait que jamais tu ne rentres dans ta boucle d'affichage.

    Petite remarque concernant le srand(time(NULL));, il s'agit ici de la fonction servant d'amorce à la fonction rand(). Tu n'as pas besoin de le réinitialiser à chaque fois, le faire une seule fois en début de programme est amplement suffisant dans ton cas.

    Pense aussi éventuellement à blinder tes saisies, vérifie que l'on te rendre bien une lettre, et non un chiffre (ou tout autre caractère non voulu).

    J'espère que tu vas faire évoluer le code encore, car là il y a au moins une belle boucle infinie, à hauteur du while (lettre == 'a' || lettre == 'e' || lettre == 'i' || lettre == 'o' || lettre == 'u' || lettre == 'y');.

    Fait attention aussi car tu ne rentres dans aucune de tes conditions, jamais tu n'assignes de valeur à lettre.
    Si tu veux aussi, tu pourrais aussi alléger ton code en créant une fonction du genre int isvoyelle(const char test); qui te renverrais 0 ou 1 suivant que le caractère rentré en paramètre est une voyelle ou non.

    Je suppose que toute la partie des if est pour le moment optionnel ?
    Dernière modification par Invité ; 03/12/2014 à 22h48.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Tu aimes faire des calculs inutiles ? Pourquoi écrire rand() % ('z' - 'a' + 1) et pas simplement rand() % 26 ???

    Sinon quand une lettre n'est pas une voyelle c'est alors forcément une consonne. Donc plutôt que de commencer à regarder si lettre = 'b' ou 'c' ou 'd' ou..., autant regarder si ce n'est pas une voyelle. Accessoirement créer une fonction isVoyelle() te faciliterait ensuite tous ces tests...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    Je vous remercie

    je suis un très débutant en C ; c'est pour ça je n'ais pas utilisé les fonctions

    si vous le permettez veuillez me guider pour améliorer cette partie
    comment je crée la fonction isVoyelle et surtout comment l'appeler

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par iMech Voir le message
    Je vous remercie

    je suis un très débutant en C ; c'est pour ça je n'ai pas utilisé les fonctions
    si vous le permettez veuillez me guider pour améliorer cette partie
    comment je crée la fonction isVoyelle et surtout comment l'appeler
    Est-ce un projet de cours ? Si c'est le cas, avez-vous déjà vu les fonctions ? Ou simplement avez-vous "peur" de les utiliser ?

    Si ce n'est point un projet de cours, et que vous apprenez en autodidacte, je vous conseille de lire de la documentation, ceci par exemple.

    Si c'est un projet de cours, et que vous n'avez pas encore vu les fonctions... Sauf si c'est demandé explicitement par votre professeur (ou que c'est sous-entendu), n'essayez pas d'aller trop vite et concentrez-vous sur le but de l'exercice (manipulation de caractères, à première vue). Une fois la logique acquise, il sera bien assez temps pour vous plonger dans de nouvelles choses.

    Si c'est plutôt que vous n'êtes pas à l'aise avec les fonctions d'une manière générale, je vous conseille de vous entraîner, faites un petit programme de test utilisant des fonctions, apprenez et comprenez la logique qu'il y a derrière. Plus vous les utiliserez, plus vite vous serez en confiance. C'est le meilleur moyen pour se lancer dans le grand bain.

    Si c'est un projet de cours ET que vous les avez déjà vues.. Relisez votre cours !
    Toute les informations nécessaires à la création et à l'utilisation d'une fonction devraient être dedans.

    Sinon, pour répondre à la question...
    "Il suffit" alors de transférer le test if((lettre == 'a' || lettre == 'e' || lettre == 'i' || lettre == 'o' || lettre == 'u' || lettre == 'y') vers la fonction, et le tour est joué.
    Avec un prototype du genre int isVoyelle(const char test);, je pense que vous avez toutes les cartes en main pour réaliser ce dont vous avez besoin.
    Dernière modification par Invité ; 04/12/2014 à 18h16.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    bonjour, ce travail est dans le cadre d'un mini projet
    le prof nous a laissé la liberté de choisir la méthode chacun selon son niveau et il a dis de se documenter du NET en attendant quand commence à étudier le C dans 5 jours.

    j'ai corrigé un peux suivant vos conseils
    j'ai un affichage mais un peux bizarre " une lettre puis un caractère spéciaux puis une lettre puis un caractère spéciaux ( 8 fois...)

    le problème dans la boucle while je pense

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
    int main()
     
    {
     
    char lettre=0;
     
    char tab[9];
    int i=0;
    do {
     
    printf("Entrez une lettre\n");
    scanf("%c", &tab[i]);i++;
    if (lettre == 'a' || lettre == 'e' || lettre == 'i' || lettre == 'o' || lettre == 'u' || lettre == 'y')
    {
    do
    {
    srand(time(NULL));
    tab[i] = (rand() % 26);
    }
    while (lettre == 'a' || lettre == 'e' || lettre == 'i' || lettre == 'o' || lettre == 'u' || lettre == 'y');
    return 0;
    }
    else
    {
    do
    {
    tab[i] = (rand() % 26);
    }
    while (lettre == 'b' || lettre == 'c' || lettre == 'd' || lettre == 'f' || lettre == 'g' || lettre == 'h');
        i++;
     
    }
      getchar();
    }
    while (i<9);
     
     
     for (i=0;i<9;i++)
     
        printf("%c", tab[i]);
     
     
    }

    merci d'avoir un peux de patience avec moi

    je veux corrigé l'affichage puis lundi je vais refaire le travail en utilisant les fonctions.

    merci encore une fois

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iMech Voir le message
    j'ai un affichage mais un peux bizarre " une lettre puis un caractère spéciaux puis une lettre puis un caractère spéciaux ( 8 fois...)
    Vérifie ton rand(). Compare cette ligne avec celle qui était dans ton code précédent.

    Quand je t'ai dit de simplifier, je ne parlais que d'une petite partie de l'instruction et pas de l'instruction entière...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    bonjour

    voilà j'ai corrigé mon code en plus j'ai utilisé les fonctions

    avant que je passe à la dernière étape j'attend vos critiques ( propositions des simplification ou d'amélioration) avant de passer à la dernière étape
    celle :
    la vérification d’existence du mot taper par l'utilisateur dans un dictionnaire ( donner par le prof ou les mots sont écrits chacune dans une ligne)

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    # include "stdio.h"
    # include "stdlib.h"
    # include "time.h"
    # include "dos.h"
    # include "string.h"
     
     
    int Computec ( int freqc[] )
    {
    	int x, i ;
    	x= rand ()% 541 ;
    		i=0 ;
        for (i=0 ; x>0; i++)
    	   x-= freqc [i] ;
        i-- ;
    	return (i);
     
    }
     
    int Computev ( int freqv[] )
    {
    	int x, i ;
    	x= rand ()% 373 ;
    		i=0 ;
        for (i=0 ; x>0; i++)
    	   x-= freqv [i] ;
        i-- ;
    	return (i);
     
    }
     
    void main ()
    {
     
    	//int Computec ( int []);
        //int computev (int []) ;
        time_t t1, t2;
    	char chaine [20 ];
    	char voyelle [6]= {'e','a','i','o','u','y'} ;
    	char consomne [21]= "bcdfghjklmnpqrstvwxz";
    	int freqv [6]={140,70,50,50,60,3};
    	int freqc [20]= {9,32,36,10,8,7,5,1,54,29,70,30,13,65,79,72,16,1,3,1};
    	char lettre [9];
    	int tab[9] ;
        int i,j,c ;
        srand (time (NULL)) ;
     
     
    for (i=0 ;  i < 9 ; i++)
    {
    	printf (" Tapez C ou V\n\n ") ;
    	fflush (stdin ) ;
    	c= getchar () ;
    	if ( c=='V' || c== 'v')
    	{
    		j= Computev (freqv)  ;
    			 printf ("%c\n" ,voyelle [j]) ;
    			 lettre [i]= voyelle[j] ;
    	}
     
    	else if ( c=='C' || c== 'c')
    	{
    		j= Computec (freqc)  ;
             printf ("%c\n" ,consomne [j]) ;
    		 lettre [i]= consomne[j] ;
    	}
     
     
    }
     
    printf ("\n\n") ;
    for (i=0 ; i < 9 ; i ++)
      printf ("  %c  ", lettre [i]) ;
      printf ("\n\n") ;
    time(&t1);
    //printf ("%d %d", t1.tm_hour, t1.tm_min) ;
    printf (" entrez votre chaine\n ") ;
    scanf ("%s", chaine ) ;
    time(&t2);
    if (difftime(t2,t1) >40)
     printf (" vous avez dépasser le temps\n ") ;
     
     
    for (i=0 ; i < 9 ; i++)
     tab[i]=1 ;
     
     
     
     
    for (i=0 ;i < strlen (chaine ); i++)
    {
    	for (j=0; j <9; j++)
    		if ( chaine [i]== lettre [j])
    			 if (tab[j]==1)
    			 {
    				 tab[j]=0 ;
    				 break ;
                 }
         if (j==9)
    		 printf ("lettre %c non trouvée\n ", chaine [i]) ;
    }
     
     
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iMech Voir le message
    en plus j'ai utilisé les fonctions
    Certes... mais écrire deux fonctions identiques (computev() et computec()) c'est pas super efficient comme approche...

    Citation Envoyé par iMech Voir le message
    avant que je passe à la dernière étape j'attend vos critiques ( propositions des simplification ou d'amélioration) avant de passer à la dernière étape
    Ok, quelques remarques en vrac
    • main() n'est pas de type void
    • on ne flusshe pas stdin (à toi de gérer correctement ce buffer et ce qu'il contient)
    • si on n'a pas tapé 'V' alors c'est que fatalement (hormis une erreur de saisie qui doit se gérer lors de la saisie) on a tapé 'C'. Donc inutile de vérifier if (c == 'C')
    • inutile d'écrire deux fois i=0 dans tes fonctions
    • ta gestion du jeu pourrait être aussi déportée dans des fonctions
    • appeler strlen() à chaque itération n'est pas optimisé (mais si on n'a pas envie de créer une variable pour stocker sa valeur on a tout à fait le droit de boucler tant que chaine[i] != '\0')
    • tu mets beaucoup beaucoup trop de commentaires
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour reprendre et compléter les quelques remarques de sieur Sve@r...

    • main() n'est pas de type void

    La bonne pratique veut que le main() ai toujours un type de retour. Le main() standard est défini dans la norme comme étant de type int.

    • on ne flusshe pas stdin (à toi de gérer correctement ce buffer et ce qu'il contient)

    fflush(stdin) n'est pas standard, elle provoque un comportement indéfini dès que l'on sort de l'environnement windows. Il faut vider le buffer d'entrée "à la main", et pour cela comprendre de quoi il en retourne. La faq C donne un exemple concret sur la manière de procéder : http://c.developpez.com/faq/?page=Ge...buffer-clavier
    ( Je t'invite au passage de parcourir cette faq. Bon nombre de question que tu pourrais te poser auront éventuellement leur réponse dedans. )


    Pour le reste, je pense que Sve@r te donne de bon élément pour prendre la suite.

    Si je peux te conseiller, "construit" ton programme brique par brique. On a l'impression que tu essayes de tout faire d'une traite, et seulement ensuite tu te décides à tester, pour au final "patatra y'a tout cassé".
    Commence simple : blinde ta saisie, récupère les valeurs que tu souhaites de celle-ci, fait le traitement pour une valeur particulière, et ainsi de suite. Rome ne c'est pas construite en un jour.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    bonjour ;
    voilà j'ai avancer un peut en suivant vos conseils :
    mais mon programme ne m'affiche plus le résulta que je veux :

    les printf de chaque traitement ne s'affiche plus
    en plus lors de l’affichage final j'ai que 2 caractères au lieu de 9
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    # include "stdio.h"
    # include "stdlib.h"
    # include "time.h"
    # include "dos.h"
    # include "string.h"
     
    void clean_stdin (void)
    {
      int c;
     
      do {
        c = getchar();
      } while (c != '\n' && c != EOF);
    }  /* clean_stdin*/
     
    int Computec ( int freqc[] )
    {
    	int x, i ;
    	x= rand ()% 541 ;
    		i=0 ;
        for (i=0 ; x>0; i++)
    	   x-= freqc [i] ;
        i-- ;
    	return (i);
     
    }
     
    int Computev ( int freqv[] )
    {
    	int x, i ;
    	x= rand ()% 373 ;
    		i=0 ;
        for (i=0 ; x>0; i++)
    	   x-= freqv [i] ;
        i-- ;
    	return (i);
     
    }
     
    int main ()
    {
     
    	//int Computec ( int []);
        //int computev (int []) ;
        time_t t1, t2;
    	char chaine [20 ];
    	char voyelle [6]= {'e','a','i','o','u','y'} ;
    	char consomne [21]= "bcdfghjklmnpqrstvwxz";
    	int freqv [6]={140,70,50,50,60,3};
    	int freqc [20]= {9,32,36,10,8,7,5,1,54,29,70,30,13,65,79,72,16,1,3,1};
    	char lettre [9];
    	int tab[9] ;
        int i,j,c ;
        srand (time (NULL)) ;
     
     
    for (i=0 ;  i < 9 ; i++)
    {
    	printf (" Tapez C ou V\n\n ") ;
        scanf("%c",&c);
    	clean_stdin();
     
    		if ( c=='V' || c== 'v')
                {
                j= Computev (freqv)  ;
    			 printf ("%c\n" ,voyelle [j]) ;
    			 lettre [i]= voyelle[j] ;
                }
     
    	else if ( c=='C' || c== 'c')
                {
                j= Computec (freqc)  ;
                printf ("%c\n" ,consomne [j]) ;
                lettre [i]= consomne[j] ;
                }
     
     
    }
     
    printf ("\n\n") ;
    for (i=0 ; i < 9 ; i ++)
      printf ("  %c  ", lettre [i]) ;
      printf ("\n\n") ;
    time(&t1);
    //printf ("%d %d", t1.tm_hour, t1.tm_min) ;
    printf (" entrez votre chaine\n ") ;
    scanf ("%s", chaine ) ;
    time(&t2);
    if (difftime(t2,t1) >40)
     printf (" vous avez dépasser le temps\n ") ;
     
     
    for (i=0 ; i < 9 ; i++)
     tab[i]=1 ;
     
     
     
     
    for (i=0 ;i < strlen (chaine ); i++)
    {
    	for (j=0; j <9; j++)
    		if ( chaine [i]== lettre [j])
    			 if (tab[j]==1)
    			 {
    				 tab[j]=0 ;
    				 break ;
                 }
         if (j==9)
    		 printf ("lettre %c non trouvée\n ", chaine [i]) ;
    }
     
     
    }

  12. #12
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    J'ai brièvement lu les messages de cette discussion et j'ai une chose à ajouter:
    -Est ce que tu crois vraiment que le fait d'inviter ton utilisateur à taper C OU V l'obligera à le faire?je crois que non!!
    En effet celui ci pourrais taper F et dans tes tests ce ne sera ni C ni V donc une itération de perdue dans ta boucle for!!dommage!
    ce qui se fait pour l'obliger à saisir ce que tu veux est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    do
    {
         printf (" Tapez C ou V\n\n ") ;
        scanf("%c",&c);
    }while(c != 'V' || c != 'C' );
    //sortie lorsque la saisie est valide!
    Reste à voir si il y a un besoin de formater ou non donc utilisation de scanf() ou getchar()! par contre je ne comprends pas très bien ta fonction clean_stdin!
    Enfin ton code n'est pas très compréhensible donc tu devrais utiliser les fonction affiche() et verifie().

    Bon courage

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iMech Voir le message
    voilà j'ai avancer un peut en suivant vos conseils :
    Euh non pas vraiment. T'as toujours ces deux fonctions identiques, qui contiennent toutes deux cette double initialisation i=0. C'est pas que ça soit gênant en soi, mais quelque part ça montre que tu n'essayes pas de te faire des bases bien solides pour avoir un code ensuite facile à écrire. Or il se trouve que le temps qu'on passe à écrire ses bases, et qu'on croit à tort perdre, on le regagne ensuite au centuple !!!

    C'est pas mal ce tableau de consonnes créé sous forme de chaine (t'as bien pensé au '\0' mais t'étais pas obligé d'écrire "21", tu pouvais laisser un vide dans les crochets, le compilo aurait lui-même complété). Pourquoi ne pas avoir écrit le tableau des voyelles de la même façon ? Quand deux choses identiques ne sont pas gérées de la même façon ça traduit de nouveau un certain manque de recul. On a l'impression que tu écris ton code un peu à l'arrache sans avoir réfléchi aux actions à faire...

    Citation Envoyé par johnlobs Voir le message
    Est ce que tu crois vraiment que le fait d'inviter ton utilisateur à taper C OU V l'obligera à le faire?je crois que non!!
    En effet celui ci pourrais taper F et dans tes tests ce ne sera ni C ni V donc une itération de perdue dans ta boucle for!!dommage!
    Oui, c'est ce que je dis quand je parle "d'erreur de saisie qui doit se gérer dans la saisie"...

    Citation Envoyé par johnlobs Voir le message
    par contre je ne comprends pas très bien ta fonction clean_stdin!
    Là en revanche c'est super bien vu. C'est une fonction destinée à purger stdin de tout ce qu'il pourrait contenir de résiduel (issu par exemple d'une précédente saisie mal gérée). C'est une boucle qui récupère à chaque itération un caractère dans stdin et qui boucle tant qu'il reste des caractères et que le caractère lu n'est pas '\n' (le <return>)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    bonsoir

    j'ai fais deux fonctions l'une compte les fréquences d'apparitions des voyelles et l'autre pour les consonnes parce que mon programme doit être simple le max et lisible puisque je vais l'exposer devant mes collègues.

    si j'ai bien compris je peux faire une seule fonction qui compte les fréquences d’apparitions des lettres et rassembler les voyelles et consonnes dans un seul tableau.

    une chose que vous m'avez pas répondu

    le programme affiche une lettre puis 7 espace puis une lettre et ceci depuis que j'ai suivi ton conseil pour la fonction clean_stdin

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iMech Voir le message
    j'ai fais deux fonctions l'une compte les fréquences d'apparitions des voyelles et l'autre pour les consonnes parce que mon programme doit être simple le max et lisible puisque je vais l'exposer devant mes collègues.
    Je crois que tu n'as pas bien compris le sens du mot "simple"...

    Exemple

    Code 1
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int carre2()
    {
        return 4;
    }
     
    int carre3()
    {
        return 9;
    }
     
    int main()
    {
        printf("Le carre de 2 est %d\n", carre2());
        printf("Le carre de 3 est %d\n", carre3());
    }

    Code2
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int carre(int n)
    {
        return n*n;
    }
     
    int main()
    {
        printf("Le carre de 2 est %d\n", carre(2));
        printf("Le carre de 3 est %d\n", carre(3));
    }

    Lequel des deux est le plus "simple" ? Lequel des deux permettra le plus facilement d'afficher le carré de 18 ???

    Citation Envoyé par iMech Voir le message
    si j'ai bien compris je peux faire une seule fonction qui compte les fréquences d’apparitions des lettres et rassembler les voyelles et consonnes dans un seul tableau.
    C'est possible mais je pensais plutôt à une fonction à laquelle on lui passerait
    • le tableau des lettres
    • la valeur 541 ou 373 qui sont finalement les seuls éléments variables. Ou alors un flag 'V'/'C' et la fonction utiliserait ce flag pour prendre au choix 541 ou 373 (à ce propos je ne pige pas leur signification).


    Citation Envoyé par iMech Voir le message
    une chose que vous m'avez pas répondu
    le programme affiche une lettre puis 7 espace puis une lettre et ceci depuis que j'ai suivi ton conseil pour la fonction clean_stdin
    Oui, c'est vrai, ce code est véreux de partout mais bien entendu s'il ne fait pas ce que tu veux c'est évidemment de la faute à la seule fonction bien écrite (que t'as probablement récupéré dans la faq du forum)...

    Donc j'ai testé ton code. C'est vrai, j'ai bien cherché pendant 5mn en mettant des printf() de partout pour comprendre. J'affichais "c", c == 'C', etc. Et c'était bon sauf que malgré tous mes efforts, c n'était jamais égal à 'c' (ou 'C' ou 'v' ou' V'). J'en devenais fou !!!
    Puis c'est quand j'ai affiché le code ascii de "c" que j'ai compris. Au fait, super tes noms de variable; explicites, clairs, on sait de suite ce qu'on manipule surtout quand on écrit if (c == 'c'). Heureusement que tu veux un programme max "lisible" pour montrer à tes collègues !!!
    Donc enfin j'ai compris: Si "c" est de type "int", alors ce n'est pas un caractère !!!. Certes si on tape 'V' alors les 8 bits de poids faible contiennent bien 'V' mais les 8 autres bits, eux, ils ne sont pas vides !!!!!! Et donc "c" n'est jamais égal à 'c' ni 'C' ni 'v' ni 'V' !!!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    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
    "c" est une chaine de caractère, c'est à dire une (const) char*, contenant la suite de char suivante : {'c', '\0'}

    avec des warnings à la compilation, tu devrais avoir un "making integer from pointer".

    De manière amusante, ("c")[0]=='c' est vraie.
    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

  17. #17
    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
    Citation Envoyé par Sve@r Voir le message
    Donc enfin j'ai compris: Si "c" est de type "int", alors ce n'est pas un caractère !!!. Certes si on tape 'V' alors les 8 bits de poids faible contiennent bien 'V' mais les 8 autres bits, eux, ils ne sont pas vides !!!!!! Et donc "c" n'est jamais égal à 'c' ni 'C' ni 'v' ni 'V' !!!!
    Euh, tu sais que tu dis là tout le contraire du principe de getchar(), qui retourne un caractère dans un int? (parce que EOF n'est pas un char).
    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.

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par leternel Voir le message
    "c" est une chaine de caractère, c'est à dire une (const) char*, contenant la suite de char suivante : {'c', '\0'}
    Euh non, dans le code que j'ai testé (qui se trouve ici, c est déclaré comme int. Et donc il n'y a pas de warning mais scanf("%c") lui, il ne remplit que la partie "char" de l'int...

    Citation Envoyé par leternel Voir le message
    De manière amusante, ("c")[0]=='c' est vraie.
    J'ai pas testé mais je pense que (c&0xff) =='c' aurait fonctionné

    Citation Envoyé par Médinoc Voir le message
    Euh, tu sais que tu dis là tout le contraire du principe de getchar(), qui retourne un caractère dans un int? (parce que EOF n'est pas un char).
    J'étais sûr qu'il y aurait une remarque sur getchar(). Mais je ne pensais pas qu'elle viendrait de toi.
    getchar() renvoie un int parce que cette fonction est prévue pour renvoyer toute la plage des caractères (donc de 0x00 à 0xff) plus EOF (-1 soit 0xffff ou 0xffffffff selon les implémentations). Mais pour ne pas qu'on confonde (char)EOF avec un 0xff correctement récupéré, cette fonction ne peut pas se contenter de renvoyer un char mais un type capable de stocker ce "EOF". Mais elle est spécialement prévue pour ça !!! Donc si elle renvoie un caractère, elle mettra proprement tous les bits de l'entier qui ne sont pas du char à 0 pour que (char)getchar() == getchar(). Et si elle renvoie EOF, alors la valeur sera 0xffff qu'on ne pourra pas confondre avec 0x00ff.
    Donc avec getchar() ça fonctionne mais pas avec scanf() qui, lui, se contente de stocker exactement ce qu'on lui dit de stocker sans rien faire d'autre (8 bits si on a demandé un "%c" et qui laisse le reste de l'entier tel qu'il était à sa définition). Je ne vois donc pas en quoi mon discours précédent allait à l'encontre de getchar() qui renvoie peut-être un int mais cet int, lui, il équivaut réellement au caractère lu...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    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
    En effet, un scanf("%c", &unInt) n'altère que les huit bits les plus bas en adresse. Ce qui en plus de ne pas initialiser le reste, dépend de l'endianness...
    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.

  20. #20
    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
    @Sve@r, j'ai répondu à un message qui a disparu, j'ai l'impression.
    Dans lequel, il y avait int c = "c";.

    Je ne contestais pas le problème du scanf, même si dernièrement, j'ai des warnings de gcc pour les incohérence de format de scanf
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Le jeu des chiffres et des lettres
    Par shayw dans le forum Contribuez
    Réponses: 0
    Dernier message: 22/05/2014, 22h56
  2. [Sources] Jeu des chiffres et des lettres
    Par User dans le forum Contribuez
    Réponses: 29
    Dernier message: 29/11/2008, 13h19
  3. Ecrire des chiffres en toutes lettres
    Par ali_Imouzzer dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/02/2007, 18h44
  4. remplacer des chiffres par des lettres, & vis versa
    Par Argorate dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/08/2006, 19h36

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