1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : juin 2017
    Messages : 9
    Points : 10
    Points
    10

    Par défaut Rotation 90 degré d'un tableau 2D de caractères

    Bonjour,

    J'aimerais savoir ou se trouve le problème dans ce code ?

    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
     int main()
        {
        printf("\n[Sens dessus dessous]\n");
        printf("Taille du tableau : ");
        int n;
        scanf("%d", &n);
        printf("Cases : \n");
        char **CDC = (char**)malloc(n * sizeof(char));
        for (i = 0; i < n; i++)
            CDC[i] = (char*)malloc(n * sizeof(char));
        int j;
        // Saisie des mots
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j < n; j++)
            {
                scanf("%c", &CDC[i][j]);
            }
        }
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j < n; j++)
            {
                printf("%c", CDC[i][j]);
            }
        }
        printf("\n\n");
     
        // Transpose le tableau
        for (i = 0; i <= n; i++ )
        {
            for (j = i + 1; j < n; j++ )
            {
                char tmp = CDC[i][j];
                CDC[i][j] = CDC[j][i];
                CDC[j][i] = tmp;
            }
        }
     
        // Affiche la transpose
        printf("Transpose \n");
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j < n; j++)
            {
                printf("%c", CDC[i][j]);
            }
        }
        printf("\n");
        printf("\n");
        // Swap les colonnes
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j < n / 2; j++)
            {
                char tmp = CDC[i][j];
                CDC[i][j] = CDC[i][n - 1 - j];
                CDC[i][n - 1 - j] = tmp;
            }
        }
        // Affichage apres rotation
        printf("Apres rotation\n");
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j < n; j++)
            {
                printf("%c", CDC[i][j]);
            }
        }
        printf("\n");
        return 0;
    }
    Merci

  2. #2
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    6 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 6 988
    Points : 22 024
    Points
    22 024

    Par défaut

    Bonjour, c'est vraiment une rotation de 90° que tu veux faire, ou c'est une simple transposée comme les commentaires semblent l'indiquer (et ce qui serait beaucoup plus courant) ?

    La confusion est fréquente, mais une transposée de matrice consiste à permuter les colonnes et les lignes de chacun des termes, ce qui se traduit en réalité par une sorte de symétrie autour de la diagonale.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    5 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 849
    Points : 16 117
    Points
    16 117
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par FoolBar Voir le message
    J'aimerais savoir ou se trouve le problème dans ce code ?
    Bonjour

    Si tu veux qu'on trouve des erreurs dans l'algorithme, alors j'en sais rien. Et ce n'est d'ailleurs pas notre rôle. Essaye de poser une matrice réduite (style [3][3]) sur une feuille, effectue ensuite les swap que tu as écrit dans ton code et regarde si le résultat correspond à ce que tu devrais avoir.

    Si tu veux qu'on trouve des erreurs dans le langage, alors je n'en vois qu'une seule principale ici char **CDC = (char**)malloc(n * sizeof(char)). En effet, ici théoriquement uu ne veux pas allouer des "char" mais des "pointeurs" donc des "char*". Donc le code devrait être char **CDC = (char**)malloc(n * sizeof(char *)). D'aileurs ça doit être un réflexe obligatoire, dans l'allocation, que de mettre une étoile de moins que le type de l'objet alloué.

    Ensuite on trouve des maladresses comme par exemple oublier de vérifier les allocations ; ou libérer la mémoire à la fin. Pour un simple petit code rapide c'est pas important mais si tu veux plus tard coder des trucs fiables et pérennes alors tu devras aussi gérer ces étapes. Et il existe aussi un vaste débat sur les avantages et inconvénients à caster ou ne pas caster malloc (perso je ne préfère pas caster mais je ne le reproche pas à ceux qui le font) donc pour ça, si tu as bien en tête les susdits avantages et inconvénients quand tu castes, alors tu restes seul juge.

    Accessoirement, tu peux remplacer un tableau 2D alloué comme tu l'as fait (allouer d'abord la matrice puis allouer ensuite chaque ligne) par un tableau 1D. A ce moment là, tu écriras char *CDC = (char*)malloc(n * n * sizeof(char)). Ca allège l'opération d'allocation, de tests et de libération (surtout que dans la version 2D, quand tu testes chaque allocation de lignes, tu dois surtout prévoir le cas où une ligne ne s'alloue pas alors que l'allocation a réussi pour toutes les précédentes et gérer alors la libération en conséquence !!!) ... mais ça complexifie ensuite l'adressage car tu dois remplacer dans ton algo chaque adresse [x][y] 2D de l'algo par une adresse [z] du tableau mémoire 1D. Donc un avantage dans un cas qui se paye dans l'autre...
    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

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 477
    Points : 38 213
    Points
    38 213

    Par défaut

    Au passage, si tu as besoin des casts du retour de malloc(), c'est que tu compiles en C++. Supprime ces casts, tu n'en as pas besoin en C.
    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.

Discussions similaires

  1. Tableau chaine de caractères
    Par bobfile dans le forum Général Algorithmique
    Réponses: 1
    Dernier message: 12/12/2011, 13h03
  2. tableau chaine de caractères
    Par calimero80 dans le forum Débuter
    Réponses: 3
    Dernier message: 17/02/2011, 20h05
  3. [FPDF] Faire une rotation de 90° a un tableau
    Par discogarden dans le forum phpToPDF
    Réponses: 4
    Dernier message: 06/02/2008, 14h42
  4. Rotation de case dans un tableau 2D
    Par Oberown dans le forum Général Algorithmique
    Réponses: 20
    Dernier message: 23/08/2006, 16h58

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