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 :

probleme de chaines


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut probleme de chaines
    Mon projet est de faire un programme écrivant dans un fichier une suite de chaines de caracteres bien précises:
    liste de 4 caracteres composés de toutes les lettres de l'alphabet plus les chiffres, bref
    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
     
    0000
    0001
    0002
    0003
    0004
    0005
    0006
    0007
    0008
    0009
    000A
    000B
    000C
    ...
    000Z
    0010
    0011
    ...
    009Z
    0100
    ...
    ZZZZ
    j'ai commencé, seulement je bute sur la manipulation de chaines:
    petites explications pour comprendre mon code fouilli:
    en fait je fait un tableau de caracteres (chlist)
    et un tableau determinant chaque caractere de la chaine (chcount)
    (pour chcount = {5,13, 2,14}, la chaine produite sera: 5C2D)
    la premiere boucle sert juste a limiter le nombre de chaines produites (ici 20), normalement il faudrai que le programme boucle jusqu'a ce que la chaine soit ZZZZ (ce n'est pas un probleme pour l'instant)

    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
     
    int main( void )
    {
        char chlist[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    	char ch[ 5 ] = ""; // la chaine finale
    	char ch2cpy[1] = ""; // une chaine intermediaire (cf plus bas)
    	int chcount[] = {0,0,0,0};
    	int i,gli;
     
    	for(gli=0; gli<20; gli++){
    	chcount[0] += 1 ;
     
    // il me faudrai ici une instruction me permettant de réinitialiser la chaine ch
     
    	for(i=0; i<4; i++){
                 if(chcount[i]==26){ 
                                    chcount[i]=0;
                                    chcount[i+1] += 1;
                                    } // cette condition me permet de passer de 000Z à 0010
                 }
        for(i=0;i<4;i++){
                          ch2cpy[0] = chlist[chcount[i]];
                          strcpy(ch, ch2cpy);
                          }
        printf( Mot donné: %s", ch );
     
        }
    	getch( );
     
    	return 0;
    }
    il manque encore la partie ou le programme écrit dans le fichier, mais j'ai du code dont je suis sur du bon fonctionnement

    Merci d'avance

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Pour initialiser une chaîne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(ch,0,sizeof ch);

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Rien compris à ton problème :
    Citation Envoyé par cellimo
    j'ai commencé, seulement je bute sur la manipulation de chaines:
    C'est à dire : : : :
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: probleme de chaines
    Citation Envoyé par cellimo
    il manque encore la partie ou le programme écrit dans le fichier, mais j'ai du code dont je suis sur du bon fonctionnement
    Et la marmotte...
    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
     
    Compiling: main.c
    main.c: In function `main_':
    main.c:22: error: implicit declaration of function `strcpy'
    main.c:22: warning: nested extern declaration of `strcpy'
    <internal>:0: warning: redundant redeclaration of 'strcpy'
    main.c:22: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
    main.c:24: error: implicit declaration of function `printf'
    main.c:24: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:24: error: `Mot' undeclared (first use in this function)
    main.c:24: error: (Each undeclared identifier is reported only once
    main.c:24: error: for each function it appears in.)
    main.c:24: error: syntax error before "donn"
    main.c:24: error: stray '\233' in program
    main.c:24: error: missing terminating " character
    main.c:27: error: implicit declaration of function `getch'
    main.c:27: warning: nested extern declaration of `getch'
    Process terminated with status 1 (0 minutes, 0 seconds)
    Si tu veux qu'on te croit, essaye de poster du code compilable...
    Ca, c'est bien (si on te demande des minuscules...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main( void )
    {
       char const chlist[] = "0123456789abcdefghijklmnopqrstuvwxyz";
     
       return 0;
    }
    La suite demande de mettre au point un algorithme. Il n'est pas nécessaire d'utiliser des tableaux. Une écriture directe dans le fichier (ou à l'écran) suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       FILE *fp = stdout;
     
       fprintf (fp, "%c", chlist[i]);
     
       fprintf (fp, "\n");
     
       if (fp != stdout)
       {
          fclose (fp);
       }
    Il suffit maintenant d'écrire le bon algorithme autour de ces lignes pour avoir le résultat escompté. (aide : boucles imbriquées...)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut
    j'ai effectivement oublié les include du début
    (comme include <strings.h> )

    mais mon probleme vient surtout de la manipulation de chaines:
    -copier un caractere à une chaine
    -et pouvoir réinitialiser la chaine

    merci tout de meme de vos réponses

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cellimo
    mais mon probleme vient surtout de la manipulation de chaines:
    -copier un caractere à une chaine
    -et pouvoir réinitialiser la chaine
    et
    Mais c'est inutile si tu écris le bon algo.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut
    le bon algo serai de faire 4 boucles for...
    mais j'ai pensé a pouvoir étendre mon programme a plus de 4 caracteres

    (pour 200 caracteres, faudrai 200 boucles for :S )

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cellimo
    le bon algo serai de faire 4 boucles for...
    mais j'ai pensé a pouvoir étendre mon programme a plus de 4 caracteres
    C'est sûr que les boucles imbriquées, c'est pas très souple, c'est de la brute force, mais ça marche. Mais il y a aussi des solutions récursives qui risquent de consommer énormément de mémoire automatique. Danger...

    Mais il faut voir que tu es de toutes façons limité par le temps d'exécution.
    (pour 200 caracteres, faudrai 200 boucles for :S )
    Précisément. Calcule le temps nécessaire, avant de dire des aneries... Au-delà de 8 à 9 caractères, ça devient ingérable...

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est sûr que les boucles imbriquées, c'est pas très souple, c'est de la brute force, mais ça marche. Mais il y a des solutions récursives qui risque de consommer énormément de mémoire automatique. Danger...
    Dans ce cas là, on dérécursive avec une pile ou une file, et là, on utilise la mémoire globale.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Avec une seule boucle on y arrive
    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
     
    int ind0 = 0;
    int ind1 = 0;
    int ind2 = 0; 
    int ind3 = 0;
    char mot[5];
     
    memset(mot, 0, sizeof(mot));
    // initialisation
    mot[0] = chlist|ind0];
    mot[1] = chlist|ind1];
    mot[2] = chlist|ind2];
    mot[3] = chlist|ind3];
    do
    {
    	puts(mot);
    	ind0++;
    	if (ind0 == 20)
    	{
             	ind0 = 0;
             	ind1++;
             	if (ind1 == 20)
    		{
    			ind1 = 0;
    			ind2++;
    			if (ind2 == 20)
    			{
    				ind2 = 0;
    				ind3++;
    				if (ind3 == 20)
    				{
    					ind3 = 0;
    				}
    				mot[3] = chlist|ind3];
    			}
    			mot[2] = chlist|ind2];
    		}
    		mot[1] = chlist|ind1];             
    	}
    	mot[0] = chlist|ind0];
    }
    while (!(ind1 == 0 && ind2 == 0 && ind3 == 0 && ind4 == 0);
    En cherchant un peu et en utilisant un tableau d'indices, tu peux éviter d'avoir une succession de if !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. [MySQL] probleme decoupage chaine de caractere
    Par mahfout_i dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/03/2006, 18h57
  2. probleme de chaine connexion
    Par bousghiri dans le forum Access
    Réponses: 1
    Dernier message: 09/12/2005, 13h48
  3. Probleme liste chainée
    Par Raton dans le forum C++
    Réponses: 8
    Dernier message: 15/11/2005, 19h25
  4. [C#] [Oracle] Problème de chaine de connexion
    Par didoboy dans le forum ASP.NET
    Réponses: 9
    Dernier message: 08/01/2005, 11h32
  5. Probleme de chaine de caractéres et Insert
    Par Revan012 dans le forum ASP
    Réponses: 5
    Dernier message: 21/06/2004, 10h28

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