Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau à deux dimensions

Matrice

    14 mai 2024 à 4:40:59

    Avez-vous inclu les matrices dans les chapitres du cours "Apprenez à programmer en C" ?
    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2024 à 10:16:48

      LemuelAthlaïKisDésiré a écrit:

      Avez-vous inclu les matrices dans les chapitres du cours "Apprenez à programmer en C" ?

      Le plus simple, c'est d'aller voir par toi même.

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        14 mai 2024 à 12:56:37

        Bonjour,

        Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
        Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

        Pour plus d'informations, nous vous invitons à lire les règles générales du forum

        Manque de Politesse

        Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?

        Liens conseillés

        • Partager sur Facebook
        • Partager sur Twitter
          14 mai 2024 à 16:40:32

          A savoir : les auteurs des cours C n'éclairent pas ce forum de leur lumineuse présence.

          • Partager sur Facebook
          • Partager sur Twitter
            15 mai 2024 à 1:26:03

            Je me demande même si on utilise le mot "matrice" dans ce genre de cours.

            Je ne crois pas avoir vu un produit matriciel comme exemple.

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              15 mai 2024 à 12:16:46

              D'un autre côté c'est un peu dommage de ne pas tartiner un peu sur les tableaux à plusieurs dimensions.

              Ça serait peut être un moyen de mieux comprendre la notion de tableau vue par C.

              Genre pourquoi on peut déclarer

              void f(int t[][4]) { .... }

              mais pas

              void f(int u[3][]) { .... }

              Spoiler,

              - dans le premier, t représente (*) l'adresse du début d'une séquence de tableau de 4 entiers.

              Le premier tableau est t[0], le second t[1] se trouve 4*sizeof(int) octets plus loin etc.

              On ne sait pas combien il y a de tableaux de 4 entiers, mais bon, on s'en passe.

              Autrmeent dit, c'est comme si on avait déclaré int (*t)[4]) {
                  sizeof(t);  that is t pointeur vers des int[4]

              - le second n'a pas de sens parce que ça serait une séquence de 3 machins de type int[], dont on ne connaît pas la taille, donc où ira-t-on chercher  u[1] ?

              Si on avait voulu déclarer une séquence de 3 pointeurs vers des entiers (logés ailleurs) on aurait écrit int *t[3].

              Last words, si vous connaissez les dimensions du tableau, c'est le cas des matrices, utilisez-les dans les déclarations :

              voir remplir_identite(const int N, 
                                    double matrix[N][N]);
              


              Une découverte au passage, si on a une matrice à plusieurs dimensions, on peut les grouper dans une structure

              struct Dims3d { int n, m, p; };
              
              

              que peut apparemment utiliser dans les déclarations

              voir remplir_zeros(const struct Dims3d DIMS,
                                 double mat[DIMS.m][DIMS.n][DIMS.p])
              {
                 ...
              }




              ce qui évite de déclarer des tas de paramètres. Le truc est qu'entre les [], il y a une expression qui retourne un entier, qu'on est capable d'évaluer parce que DIMS est reçu en paramètre.

              Ça en fait un VLA, mais pas alloué automatiquement (sur la pile), donc tout à fait permis et raisonnable, n'en déplaise aux esprits chagrins.

               (*) enfin, se ramène à.

              --- comme il faut bien se distraire, voila le résultat

              cc -std=c17 -Wall -Wextra -pedantic -Werror -Wno-unused -D_XOPEN_SOURCE=700 -g    prog.c   -o prog
              ./prog
              Hello, world
              => zero
              /       0       0       0       \
              |       0       0       0       |
              \       0       0       0       /
              => identity
              /       1       0       0       \
              |       0       1       0       |
              \       0       0       1       /
              => ones
              /       1       1       1       \
              |       1       1       1       |
              \       1       1       1       /
              => ones + identity 
              /       2       1       1       \
              |       1       2       1       |
              \       1       1       2       /

              de la compilation + exécution de ce code :

              #include <stdio.h>
              #include <stdlib.h>
              #include <stdbool.h>
              
              // Exemple, matrices carrées
              
              void fill_matrix(const int N, int mat[N][N], int value)
              {
                  for (int r = 0; r < N; r++) {
                      for (int c = 0; c < N; c++) {
                          mat[r][c] = value;
                      }
                  }
              }
              
              void set_diagonal(const int N, int mat[N][N], int value)
              {
                  for (int i = 0; i < N; i++) {
                      mat[i][i] = value;
                  }
              }
              
              void add(const int N, int a[N][N], int b[N][N])
              {
                  for (int r = 0; r < N; r++) {
                      for (int c = 0; c < N; c++) {
                          a[r][c] += b[r][c];
                      }
                  }
              }
              
              void print_matrix(const int N, int mat[N][N])
              {
                  for (int r = 0; r < N; r++) {
                      printf("%c", r == 0 ? '/' : r == N-1 ? '\\': '|');
                      for (int c = 0; c < N; c++) {
                          printf("\t%d", mat[r][c]);
                      }
                      printf("\t%c\n", r == 0 ? '\\' : r == N-1 ? '/' : '|');
                  }
              }
              
              
              int main()
              {
                  printf("Hello, world\n");
              	int id[3][3];                   // matrice identité
              	
              	printf("=> zero\n");
              	fill_matrix(3, id, 0);
              	print_matrix(3, id);
              
              	printf("=> identity\n");
              	set_diagonal(3, id, 1);
              	print_matrix(3, id);
              
              	printf("=> ones\n");
              	int m[3][3];
              	fill_matrix(3, m, 1);
              	print_matrix(3, m);
              
              	printf("=> ones + identity \n");
              	add(3, m, id);
              	print_matrix(3, m);
              
              
                  return EXIT_SUCCESS;
              }
              






              -
              Edité par michelbillaud 15 mai 2024 à 19:13:06

              • Partager sur Facebook
              • Partager sur Twitter

              Tableau à deux dimensions

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown