In order to fulfill the basic functions of our service, the user hereby agrees to allow Xiaomi to collect, process and use personal information which shall include but not be limited to written threads, pictures, comments, replies in the Mi Community, and relevant data types listed in Xiaomi's Private Policy. By selecting "Agree", you agree to Xiaomi's Private Policy and Content Policy .
Agree

Jeux/Détente

[Détente] [JeudiProg] [C] Cours 7 : Tableaux et matrices

2020-07-23 18:00:00
411 3
Bonjour à tous,

Si vous avez manqué les cours précédents, commencez par ceux-ci et revenez ici ensuite :

Cours 0 : Pré-requis et premier programmeConsulter
Cours 1 : DialogueConsulter
Cours 2 : Types de données et appels de fonctionsConsulter
Cours 3 : Opérateur ternaire et masquageConsulter
Cours 4 : Switch et premiers tableauxConsulter
Cours 5 : Incrémentation, boucles et tri de tableauConsulter
Cours 6 : Les fichiersConsulter
Cours 7 : Tableaux et matricesEn cours
Cours 8 : Chaînes de caractèresConsulter
Cours 9 : Introduction à la programmation objetConsulter




Attention : Du fait des limitations actuelles la communauté, il n'est pas possible d'afficher un code correct, c'est pourquoi je vous fournis ce fichier ZIP contenant l'ensemble des codes de ce cours. Décompressez le dans votre dossier MinGW/code/.

Cours7.zip (1.98 KB, Downloads: 1)

Rappel : Pour pouvoir compiler les fichiers, utilisez l'instruction suivante dans votre Invite de commandes où vous remplacerez bien sûr les 2 ''nom de fichier''.

  1. gcc -ansi -Wall -pedantic -o nomdefichier.exe nomdefichier.c
Copy the Code


Exercice 1/2 - Trouver la valeur minimale

Après un petit détour par les fichiers, on revient sur les tableaux et quoi de mieux que directement se mettre au travail. Nous allons avoir un tableau contenant des entiers, je vous demande d'écrire la fonction qui va trouver la valeur la plus faible dans le tableau.

Et, comme cela devrait être assez rapide, vous pourrez m'écrire une autre fonction de votre choix qui retournera :
  • la valeur maximale ;
  • la position dans le tableau de la valeur minimale ;
  • la position dans le tableau de la valeur maximale ;
  • la somme des valeurs du tableau ;
  • ou tout autre fonction ...


Je ne vous laisse pas sans rien, voici le code de départ ... A vous de jouer !

maniptableau.c
  1. #include ˂stdio.h˃

  2. int min_tableau(int *tab, int dimension)
  3. {

  4. }

  5. int main(void)
  6. {
  7.    int min;
  8.    int tab[6] = {24,9,1,15,13,9};
  9.    min = min_tableau(tab,6);
  10.    printf(ʺValeur minimale du tableau : %d\nʺ,min);
  11.    return 0;
  12. }
Copy the Code


Constantes de préprocesseurs

Avant d'aller plus loin dans les tableaux, nous allons voir ce qui se cache derrière le nom de constantes de préprocesseurs. Grâce à ces constantes nous allons pouvoir adapter facilement un code à différents besoins. Voici l'exemple d'une constante de préprocesseur :

  1. #define LONGUEUR (6)
Copy the Code


Alors pour faire simple, nous allons pouvoir utiliser dans tout notre code la constante LONGUEUR et avant la compilation, le préprocesseur va remplacer cette constante par la valeur définie, ici 6. Vous comprenez donc qu'on va pouvoir, par exemple, écrire un code pour des tableaux d'une quelconque dimension. Imaginez que vous écrivez un code de plusieurs centaines de ligne et que tout à coup, on vous dit qu'il faut une information de plus dans les tableaux et que la longueur est de 7 au lieu de 6. Vous allez me dire c'est assez facile à modifier tous les 6 en 7 mais qu'arrive-t-il si vous oubliez d'en modifier un ? C'est par exemple une mise à jour du téléphone qui va boguer suite à un simple oubli dans un code non optimisé. Alors, même si l'exemple est simple, voyons comment intégrer cette constante dans notre précédent code :

preproc.c
  1. #include ˂stdio.h˃
  2. #define LONGUEUR (6)

  3. int min_tableau(int *tab, int dimension)
  4. {

  5. }

  6. int main(void)
  7. {
  8.    int min;
  9.    int tab[LONGUEUR] = {24,9,1,15,13,9};
  10.    min = min_tableau(tab, LONGUEUR);
  11.    printf(ʺValeur minimale du tableau : %d\nʺ,min);
  12.    return 0;
  13. }
Copy the Code


Avez-vous bien compris le concept ? Sinon n'hésitez pas à le dire en commentaires.

Tableaux à 2 dimensions

Nous voici arrivé aux tableaux à 2 dimensions. Qu'est-ce que c'est ? C'est très simple, un tableau d'entiers contient plusieurs entiers, un tableau à 2 dimensions contient plusieurs tableaux.

Pour que cela soit plus parlant, imaginons que nous ayons un tableau téléphone qui représente les différents téléphones Xiaomi et que pour chaque téléphone on veuille lister leurs caractéristiques, par exemple hauteur, largeur et épaisseur.

tableau2d.c
  1. #include ˂stdio.h˃
  2. #define NBTELEPHONES (2)
  3. #define NBCARACTERISTIQUES (3)

  4. void affiche(int tab[][NBCARACTERISTIQUES], int dimension1, int dimension2)
  5. {
  6.         int i,j;
  7.         printf(ʺ(Hauteur x Largeur x Epaisseur)\nʺ);
  8.         for(i=0;i˂dimension1;i++)
  9.         {
  10.                 printf(ʺTéléphone %d : ʺ,i);
  11.                 for(j=0;j˂dimension2;j++)
  12.                 {
  13.                         printf(ʺ%d ʺ,tab[i][j]);
  14.                 }
  15.                 printf(ʺ\nʺ);
  16.         }
  17. }

  18. int main(void)
  19. {
  20.         int caracteristiques[NBTELEPHONES][NBCARACTERISTIQUES] = {{158,74,10}, {163,75,9}};
  21.         affiche(caracteristiques, NBTELEPHONES, NBCARACTERISTIQUES);
  22.         return 0;
  23. }
Copy the Code


Vous voyez alors que pour déclarer un tableau à 2 dimensions il nous faut préciser les 2 dimensions entre crochets après le nom du tableau. Les valeurs des tableaux ''internes'' sont déclarés entre accolades et d'autres accolades vont encadrer alors tous les ensembles d'accolades. J'espère que vous comprenez c'est difficile de mettre des mots mais l'exemple devrait parler de lui-même.

De plus, j'ai volontairement ajouté un appel à une fonction pour bien vous montrer qu'avec le langage C, nous avons une petite contrainte dans la déclaration de nos paramètres lorsque nous transmettons un tableau à 2 dimensions : il faut préciser la dimension des tableaux internes dans la déclaration. C'est pourquoi vous voyez ce paramètre :

  1. int tab[][NBCARACTERISTIQUES]
Copy the Code


Comme toujours, n'hésitez pas si vous avez des questions !

Tableaux multi-dimensionnel

Alors, juste à titre informatif, nous pouvons bien sûr faire des tableaux de tableaux de tableaux ... de tableaux. Il ne me semble pas qu'il y ait de limite (sauf votre espace mémoire). Personnellement je n'ai que très rarement utilisé des tableaux à 3 dimensions, jamais au delà mais si vous avez des idées d'applications avec plus de dimensions nous pouvons discuter et échanger du code dans les commentaires !

Matrices

Pour que vous puissiez faire quelques exercices, on va s'intéresser à des tableaux à 2 dimensions particuliers : les matrices. C'est en fait des tableaux dont les 2 dimensions sont égales : 2x2, 3x3, 4x4, 5x5, etc... Cela nous permet de faire des opérations mathématiques.

Voici un programme qui va définir une matrice identité puis l'afficher. Une matrice identité est une matrice qui ne contient que des 0 sauf sur sa diagonale où il y a des 1, par exemple pour une matrice 4x4 :

(1 0 0 0)
(0 1 0 0)
(0 0 1 0)
(0 0 0 1)

matriceidentite.c
  1. #include ˂stdio.h˃
  2. #define N (4)

  3. void identite(int matrice[][N],int dimension)
  4. {
  5.    int i,j;
  6.    for(i=0;i˂dimension;i++)
  7.       for(j=0;j˂dimension;j++)
  8.          matrice[i][j] = (i == j) ? 1 : 0;
  9. }

  10. void ecrireMatrice(int matrice[][N],int dimension)
  11. {
  12.    int i,j;
  13.    for(i=0;i˂dimension;i++)
  14.       for(j=0;j˂dimension;j++)
  15.       {
  16.          printf(ʺ%2d ʺ,matrice[i][j]);
  17.          if(j == dimension-1)
  18.             printf(ʺ\nʺ);
  19.       }
  20. }

  21. int main(void)
  22. {
  23.    int mat[N][N];
  24.    identite(mat,N);
  25.    ecrireMatrice(mat,N);
  26.    return 0;
  27. }
Copy the Code


Exercice 2/2 - Initialisation et addition de matrices

A vous maintenant d'ajouter deux fonctions au précédent programme.

1) Ajoutez la fonction initialisation qui aura 3 paramètres : la matrice, sa dimension et une valeur entière. Il faudra qu'après l'exécution de cette fonction, l'intégralité des valeurs de votre matrice aient la même valeur que celle transmise en paramètre. Par exemple, si je choisis 3, ma matrice devra ressembler à cela :

(3 3 3 3)
(3 3 3 3)
(3 3 3 3)
(3 3 3 3)

2) Ajoutez la fonction addition qui va additionner la matrice initialisé à la matrice identité. Cette fonction aura 3 paramètres : la matrice initialisé, la matrice identité et leur dimension.

(3 3 3 3) + (1 0 0 0) = (4 3 3 3)
(3 3 3 3)   (0 1 0 0)   (3 4 3 3)
(3 3 3 3)   (0 0 1 0)   (3 3 4 3)
(3 3 3 3)   (0 0 0 1)   (3 3 3 4)

A vous de jouer !

Pour aller plus loin - Carré magique

Un carré magique est une matrice très particulière puisque la somme des valeurs de chaque colonne, de chaque ligne et des 2 diagonales doivent toutes être égales.

La matrice identité est-elle un carré magique ?

On pourrait presque dire oui, puisque la somme de chaque ligne et chaque colonne vaut 1 ! Mais je vous ai bien précisé que la somme des diagonales doivent également être égales et ce n'est malheureusement pas le cas : la diagonale vaut la dimension et la diagonale inverse 0. Donc, non, la matrice identité n'est pas un carré magique !

Et une matrice initialisé à une valeur ?

Il est facile de répondre oui ici puisque l'on ne rencontre que les mêmes valeurs dans toute la matrice, c'est donc bien un carré magique.

Je me suis alors lancé dans l'écriture d'un algorithme de génération de carrés magiques de dimension N (où N est un nombre impair) mais ai-je fait une erreur ? Pour cet exercice facultatif, j'ai besoin de vous pour écrire la fonction de vérification du carré magique que j'ai généré ! Faites moi des captures d'écran de votre code et du résultat de votre exécution ! Vous pouvez bien sûr modifier la dimension des matrices afin de vérifier que le code fonctionne pour toutes les dimensions impaires. Merci d'avance pour vos vérifications ;)

carremagique.c
  1. #include ˂stdio.h˃
  2. #define N (9)

  3. void initialisation(int matrice[][N], int dimension, int valeur)
  4. {

  5. }

  6. void afficher(int matrice[][N],int dimension)
  7. {
  8.    int i,j;
  9.    for(i=0;i˂dimension;i++)
  10.       for(j=0;j˂dimension;j++)
  11.       {
  12.          printf(ʺ%2d ʺ,matrice[i][j]);
  13.          if(j == dimension-1)
  14.             printf(ʺ\nʺ);
  15.       }
  16. }

  17. void calculerCarreMagique(int matrice[][N],int dimension)
  18. {
  19.    unsigned int indice;
  20.    int milieu,compteur,ligne,colonne,insere;
  21.    milieu = dimension/2;
  22.    compteur = 2;

  23.    ligne = milieu+1;
  24.    colonne = milieu;

  25.    matrice[ligne][colonne] = 1;

  26.    for(indice = 1;indice ˂ dimension*dimension;indice++)
  27.    {
  28.       insere = 0;
  29.                
  30.       while(!insere)
  31.       {
  32.          ligne = (ligne+1 == dimension) ? 0 : ligne+1;
  33.          colonne = (colonne+1 == dimension) ? 0 : colonne+1;
  34.         
  35.          while(!insere)
  36.          {
  37.             if(matrice[ligne][colonne] == 0)
  38.             {
  39.                matrice[ligne][colonne] = compteur++;
  40.                insere = 1;
  41.             }
  42.             else
  43.             {
  44.                ligne = (ligne+1 == dimension) ? 0 : ligne+1;
  45.                colonne = (colonne == 0) ? dimension-1 : colonne-1;
  46.             }
  47.          }
  48.       }
  49.    }
  50. }

  51. int verifierCarreMagique(int matrice[][N],int dimension)
  52. {

  53. }

  54. int CarreMagique[N][N];

  55. int main(void)
  56. {
  57.    initialisation(CarreMagique,N,0);
  58.    calculerCarreMagique(CarreMagique,N);
  59.    if(verifierCarreMagique(CarreMagique,N))
  60.       afficher(CarreMagique,N);

  61.    else
  62.       fprintf(stderr,ʺLe carré généré n'est pas magique.\nʺ);
  63.                
  64.    return 0;
  65. }
Copy the Code





Si vous n'avez pas compris quelque chose n'hésitez pas à poser vos questions en commentaires, entraidez-vous !

Note : pour partager vos codes, utilisez des captures d'écran car malheureusement la communauté n'est pas encore totalement apte à partager facilement du code !

2020-07-23 18:00:00
Favorites1 RateRate

Master Bunny

jpbal | from app

#1

toujours aussi bien fait. juste une petite remarque des béotiens en C pourraient se demander à quoi sert *tab  par exemple
très bon cours en tout cas bravo
2020-07-24 01:52:03

Moderator

GuillaumeMi Author |

#2

jpbal a posté en 2020-07-23 19:52:03
toujours aussi bien fait. juste une petite remarque des béotiens en C pourraient se demander à quoi sert *tab  par exemple
très bon cours en tout cas bravo

En fait, il y a des pointeurs ''cachés'' depuis le premier cours, je vais en parler dans le prochain cours. Je ne voulais pas trop m'attarder sur le concept car les langages de plus haut niveau qu'on pourra éventuellement évoquer lors de prochains cours ont, pour la plupart, une gestion automatique de la mémoire.

Et puis j'attendais éventuellement une question dessus :)
2020-07-24 02:41:30

Master Bunny

jpbal | from app

#3

je suis d'accord pour pratiquer plein d'autres langages cette notion devient transparente..plus ou moins. mais c'est vraiment une spécificité du C qui d'ailleurs peut devenir très très compliquée.
2020-07-24 13:23:32
please sign in to reply.
Sign In Sign Up

GuillaumeMi

Moderator

Check-in 3 jours
Check-in 7 jours
Check-in 21 jours
Check-in 40 jours
Check-in 70 jours
Check-in 100 jours
MiA2
SBM teaser
Mi band 3
25K
X-Men
Photography contest
30K
Tech Talent
MI9T
MIUI Geek
Three's A Party
Happy July
App Maniac
MIUI 9th Birthday
Global Community
Medalla Encuesta Mi Phone
better together slogan
Global Community
2020
Médaille des 50K
100K abo
Mi Community Üçüncü Anket Madalyası
Mi 10th Birthday Medal
Medalla #GradientsInLife
Window View
বাংলা নববর্ষ ১৪২৭
Android One
Answer Mi #3
Ulang Tahun Xiaomi ke-10
3 Tahun Mi Community
Mobile Game
App Star
Redmi 8
Bookworm
23 Nisan Kutlu Olsun!
Sondage gaming
MIUI Fan
Favorite Goalkeeper
Ramadan Kareem
Meetings from Home
Mi2U April
Lefty Star
Favorite Author
redminote8series
Streaming Geek
Favorite Actor
Favourite Football Team
200mila Mi Fans
Osneip
Redmi Note 8
Mail Lover
Radio
Super Thursday
Redmi Note 8 Series
Redmi Note 8 Pro
Coin
Chipset
Corona Awareness
Map
Redmi 8A
MIUI 12
First Smartphone
Phone Finder
2 anni insieme
Eid Mubarak
TV Series Freak
BougLo Challenge I
Mi to You May
MIUI12
Neues Zuhause
MIUI Boot Animation
200 Mil Mi Fans En México
Favorite Singer
Gadget
Favorite YouTube Channel
Art Challenge
Father's Day
Redmi Note 9S
Mother's Day
UK Community 300K Users Medal
Redmi Note 9
Cloud Storage
30 Million Redmi Note 8 Series
Redmi Note 9 Pro Feature
ContributeTogether
10 years
K2K #3
Redmi 9 Colors
200K Registered Users
2nd Anniversary
MFF2020
Nepal "Happy New Year&amp
Emoji Day
Mi To You July
Redmi Note 9S Feature
Navigation System
Médaille 6
First Anniversary
10th mi fan stories
K2K #4
Favorite Bangladeshi Food
Redmi 9A
Redmi Note 9 Pro Camera
Material Expert
Redmi 9A Feature
MIUI 12 Dark Mode
10 years
Battery Survey
Mi to You September
Agosto Cometas
Moderadores
Mi10 espacio
Facebook Reviewer
Tín đồ Poco
Display Expert
Favorite Radio Station
Top photo France
Mi UK Treasure Hunt
Captain Mitu, Treasure Finder

Read moreGet new

Mi Comm APP

Stay updated on Mi Products and MIUI

Copyright©2010-2020 Xiaomi.com, All Rights Reserved
Content Policy
Quick Reply To Top Return to the list