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 :

Insérer une chaîne de caractères dans une case d'un tableau bi-dimensionnel


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Amateur
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Insérer une chaîne de caractères dans une case d'un tableau bi-dimensionnel
    Bonjour à tous,

    Je me trouve face à un problème d'insertion d'une chaîne de caractères dans un tableau bi-dimensionnel.

    EXPLICATION DU PROBLEME

    Je souhaitais réaliser un jeu à base d'une matrice contenant une liste de caractères. Cependant, m'apercevant qu'il était plutôt difficile pour un joueur de s'y retrouver entre les différentes cases quand la matrice atteignait une certaine taille, je décidais d'indiquer le numéro des lignes et colonnes en haut et à gauche.
    Comme l'insertion d'éléments différents dans un tableau est impossible en C, j'ai transformé mes entiers en une chaîne de caractères. Problème : seule la première "lettre" est prise en compte (ce qui est en effet normal vu qu'on est dans un tableau de caractères). Cependant, je n'arrive pas à savoir comment faire en sorte d'avoir une chaîne de caractères affichées dans, par exemple, la case t[0][1].
    (Le tableau fonctionne si on choisit un chiffre entre 1 et 9)

    CODE ACTUEL

    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
    //Initialisation de la grille dynamique
    char** initialiser_grille(int* ligne,int* colonne, int* nb)
    {
        printf("Choisissez le nombre de lignes :");
        scanf("%d", ligne);
        printf("\nChoisissez le nombre de colonnes :");
        scanf("%d", colonne);
     
        do
        {
            printf("Choisissez le nombre de lettres:");
            scanf("%d", nb);
        }
        while(*nb<1 || *nb>26);
        //Creation du pointeur pour créer le tableau dynamique
        char** t = (char**)malloc((*ligne)*sizeof(char*));
            if (t==NULL)
        {
            fprintf(stderr,"erreur de malloc"); exit(1);
        }
        srand(time(NULL));
        int j;
        int i;
        //Creation de la première ligne //element corrige
        for (i=0;i<=(*ligne);i++)
        {
            t[i]=(char*)malloc((*ligne)*sizeof(char));
            if (t[i]==NULL)
            {
                fprintf(stderr,"erreur de malloc ligne "); exit(1);
            }
     
        }
        //Remplissage de la matrice
        for(i = 1;i<=(*ligne);i++)
        {
            for(j = 1;j<=(*colonne);j++)
            {
                t[i][j]=rand()%*nb+'a';
            }
        }
        for(i = 1;i<=(*ligne);i++)
        {
            //Transformation de l'entier en chaîne de caractères
            char str[ENOUGH];
            snprintf(str, sizeof str, "%d", i);
            t[i][0]=*str;
        }
        for(j = 1;j<=(*colonne);j++)
        {
            char str[ENOUGH];
            snprintf(str, sizeof str, "%d", j);
            t[0][j]=*str;
        }
        t[0][0]=' ';
        return t;
     
    }
     
    //Fonction qui affiche le tableau
    void affiche(int ligne,int colonne, char** t)
    {
        //Choix des variables
        int i;
        int j;
        //Regles pour le tableau
        for (i=0;i<=ligne;i++)
        {
            printf ("\n");
            for (j=0;j<=colonne;j++)
            //Affichage du tableau
                printf("%3c ",t[i][j]);
        }
     
    }
    LES TENTATIVES DE RESOLUTION EFFECTUEES

    J'ai essayé de trouver une solution et je m'excuse par avance si j'ai mal cherché sur le site et qu'elle se trouve déjà sur le forum. Voici ce que j'ai pu faire :
    - Créer un malloc au niveau des colonnes (j'ai pensé qu'en créant un tableau tri-dimensionnel, ceci pourrait marcher). Pas de changement.
    - Ajouter une astéristique sur le tableau t (pour signaler qu'il s'agissait d'un tableau de chaîne de caractère). Nombreux avertissements et lettres et chiffres apparaissant bizarrement.
    - Utiliser strcpy. Pas de changement.
    - Enlever l'astérisque devant le str. Les chiffres apparaissent comme des P.
    - Remplacer char par string dans l'énoncé de la première fonction (en désespoir de cause). Ca n'a évidemment pas marché.

    S'il vous plaît, serait-il possible de savoir si j'ai mal implémenté une solution, si elles sont incomplètes ou même si aucune ne correspond ?

    Merci par avance pour votre aide et bonne journée à tous !

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je n'ai pas compris exactement ce que tu souhaitais obtenir (je peux donc me tromper) mais j'ai la nette impression que ton problème actuel découle d'une complexification superflue de ta conception initiale, pour répondre à une difficulté rencontrée plus en amont, etc, etc... Bref, comme souvent : problème XY.

    Revenons si tu le veux bien à l'origine : l'implémentation du jeu. En quoi consiste ce jeu ? Quelle était ta première idée pour en écrire les règles en C ? Quelles difficultés as-tu rencontrées ?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Amateur
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir.

    Merci pour la réponse cependant le problème ne vient pas du jeu lui-même (lequel fonctionne et fait ce que je souhaite). Il s'agit essentiellement d'un problème d'affichage. (j'admets que mon explication était peu claire. Désolée ).

    Pour simplifier le problème, je souhaiterais obtenir quelque chose comme ceci :
    1 2 ... 15
    1 a b ... c
    ... ... ... ... ...
    12 d a b a

    (les lettres sont prises au hasard)

    Et pour le moment, je réussis à avoir :
    1 2 ... 1
    1 a b ... c
    ... ... ... ... ...
    1 d a b a


    (et pour en C : c'est un auto-entraînement à partir d'un exercice que j'ai trouvé)

    Merci par avance.

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ok, c'est clair. Pour être honnête ta première explication n'était pas si confuse mais je voulais te faire te mettre à la place de celui qui ne connait pas le contexte.

    Tu commets une erreur fréquente lorsque l'on débute le développement logiciel : tu veux modifier le traitement afin de répondre à un problème de présentation. Cela peut se justifier (de moins en moins) dans de très rares cas, mais en règle générale c'est une mauvaise pratique. On veut une couche d'abstraction entre les données et l'interface. Dit autrement : la manière dont tu formates le contenu de ta grille en vue de son affichage dans la console (le front end) n'a pas à influer sur sa gestion, le back end.

    Ce que tu veux modifier, c'est la fonction affiche et rien d'autre. Consulte avec attention le man des fonctions standard d'affichage formaté, certaines fonctionnalités pourraient t'être utiles.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Amateur
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour les explications cependant je dois être vraiment stupide mais d'après ce que j'ai compris, le seul changement à faire est dans la fonction afficher donc, je dois bien utiliser printf pour avoir une sortie imprimée.
    D'après ce que j'ai lu, j'avais cru comprendre qu'en fait, je devais mettre %s au lieu de %3c. Mais quand je fais ça, le programme ne me signale aucune erreur mais s'arrête au moment de l'affichage et si, comme dans l'exemple à la fin, je mets un astérisque, j'ai une mise en forme étrange avec ntf_p_1...
    Qu'ai-je mal compris ?
    Merci !

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Reviens à la version de ton programme qui fonctionnait (celle qui n'affiche pas les rangs) avec le format d'affichage qui convient, c'est amplement suffisant. Retire les couches inutiles de complexification.

    Ce que tu veux obtenir est en fin de compte très simple : afficher une ligne et une colonne en plus de la grille. Tu dois pouvoir y arriver en modifiant seulement la fonction d'affichage. Cette ligne et cette colonne n'ont rien à faire au sein de ta grille de jeu, et tu ne devrais donc pas avoir de chaîne de caractères à manipuler.


    Les deux petites remarques habituelles :

    • ne caste pas la valeur de retour de malloc ;
    • sizeof(char) vaut toujours 1, omets-le c'est plus lisible.

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Amateur
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re-bonsoir,

    Si je comprends correctement, tu me proposes de créer une ligne, puis une colonne et de mettre la matrice entre les deux.
    S'il s'agit bien de ceci, c'est malheureusement l'une des premières solutions à laquelle j'avais pensé mais j'y mets personnellement deux objections :
    - C'est assez facile pour la partie chiffres en ligne mais nettement plus difficile à réaliser pour la partie chiffres en colonne (comment faire pour que chaque chiffre corresponde à la bonne ligne ? Et si je crée un tableau à une dimension à chaque fois, ça implique une remise en forme complète de la fonction affichage. Sans compter très probablement une plus longue attente avant l'apparition de la matrice reconstituée)
    - Plus les chiffres augmenteront et plus il y aura un décalage entre les colonnes. Je risquerais d'obtenir ceci :
    1121 1122 1123
    a b c
    ...
    ou me retrouver à essayer de définir la taille des "cases" suivant la taille du plus grand chiffre (est-ce faisable ?) et de faire varier l'écart entre chaque chiffre suivant leur taille.

    Ou s'agit-il d'autre chose ?

    Que veux-tu dire par "ne pas caster la valeur de retour de malloc"" ?

    Encore merci pour ton aide

  8. #8
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu imagines la solution bien plus complexe qu'elle ne l'est.

    Il y a une chose contre laquelle tu ne peux rien : l'impression s'effectue de gauche à droite puis de haut en bas. Partant de ce constat, il te suffit simplement de déterminer l'ordre des paramètres à passer aux fonctions standard d'impression pour que tes données sortent dans le terminal de la manière désirée, à savoir : une ligne de numérotation pour les colonnes puis, pour chaque ligne de la grille, la numérotation de la ligne puis le contenu de cette ligne. Ca commence à ressembler à un algo ça, non ?

    En ce qui concerne l'alignement des colonnes, c'est un ajustement à faire dans un second temps. Les modificateurs de format standard t'y aideront.


    Citation Envoyé par Noper Voir le message
    Que veux-tu dire par "ne pas caster la valeur de retour de malloc"" ?
    Retire l'opérateur de conversion entre le symbole = et l'appel à malloc.

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Amateur
    Inscrit en
    Décembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ...

    Pourquoi faire simple quand on peut faire compliqué ?
    Merci beaucoup ! J'essaie de corriger le programme et si tout va bien, je reviendrai clôturer la discussion. (si je réussis à trouver comment faire...)

    Encore merci pour le temps que tu as pris !

Discussions similaires

  1. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  2. Insérer un espace dans 3 caractères dans une chaîne de caractère
    Par cashmoney dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 24/04/2009, 09h46
  3. Réponses: 7
    Dernier message: 14/12/2005, 09h53
  4. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/10/2005, 23h03
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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