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 9 : Introduction à la programmation objet

2020-08-06 18:00:00
329 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 matricesConsulter
Cours 8 : Chaînes de caractèresConsulter
Cours 9 : Introduction à la programmation objetEn cours




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/.

Cours9.zip (1.52 KB, Downloads: 2)

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


C'est quoi la programmation objet ?

En réalité, on dit la Programmation Orientée Objet (POO). Ces objets peuvent être des concepts, des idées, des modélisations du réel. Vous vous souvenez peut être qu'on avait résumé un smartphone à sa hauteur, sa largeur et son épaisseur mais un smartphone ce n'est pas que des entiers, on peut aussi avoir besoin de texte pour le décrire donc on ne peut plus utiliser un seul tableau pour pouvoir ranger toutes les caractéristiques. Et, même si l'on le pouvait, il est assez peu pratique de devoir se souvenir en quelle position dans le tableau est situé la largeur. Il serait alors bien d'avoir un type de données Smartphone.

Et c'est exactement cela la programmation orientée objet, notre objet sera le téléphone, on va lui attribuer différentes variables pour le décrire et on va définir les fonctions nécessaires pour pouvoir manipuler notre objet.

Mais ceci ce n'est pas moi qui vais le faire, je vais plutôt partir d'un autre objet, une date avec des fonctions qu'on avait déjà abordées dans un précédent cours.

Etape 1 - Définir l'objet

Une date est décrite avec 3 variables : le jour, le mois et l'année. 3 entiers suffiraient mais je décide d'écrire le mois en lettres pour varier un peu. Je vais alors définir 3 fonctions indispensable : l'initialisation, l'affichage et la suppression de notre objet. Et je décide de rajouter 3 fonctions annexes que nous avions déjà vu : une première pour savoir si l'année est bissεxtile, une autre pour convertir le mois en lettre vers un entier et une dernière pour calculer le nombre de jours dans le mois.

Pour structurer nos programmes, on va déclarer notre objet dans un fichier séparé qu'on va appeler date.h. Il faudra ensuite l'inclure dans notre fichier date.c mais on y reviendra.

date.h
  1. #ifndef _DATE_H
  2. #define _DATE_H

  3. typedef struct date *pdate;

  4. struct date
  5. {
  6.    int jour;
  7.    char *mois;
  8.    int annee;
  9. };

  10. extern void date_affiche(pdate d);
  11. extern pdate date_init(int jour,int mois,int anneee);
  12. extern void date_free(pdate d);
  13. extern int est_bissεxtile(pdate d);
  14. extern int mois_vers_entier(char *mois);
  15. extern int jours_dans_le_mois(pdate d);

  16. #endif
Copy the Code


Les 3 lignes commençant par un # sont ici comme une protection dans notre code au cas où on inclurait le fichier date.h plusieurs fois et ainsi éviter des problèmes. Ici ce n'est pas forcément utile mais il est bon de prendre l'habitude. _DATE_H est bien sûr modifiable par ce que vous souhaitez.

Vous voyez donc qu'on défini notre objet grâce au mot clé struct qui va nous permettre de regrouper plusieurs variables.

Puis, nous en profitons pour définir un pointeur ''pdate'' sur notre objet ''struct date'' afin de pouvoir le manipuler plus facilement.

Enfin, nous précisons déjà toutes les fonctions et procédures qui seront définies dans notre fichier date.c.

Etape 2 - Définir les fonctions associés à l'objet

On commence par notre fonction d'affichage, il faut que l'on choisisse comment afficher nos objets de type date.

  1. void date_affiche(pdate d)
  2. {
  3.    printf(ʺ%d %s %d\nʺ,d-˃jour,d-˃mois,d-˃annee);
  4. }
Copy the Code


Ici on affiche simplement la date sous la forme ''6 aout 2020''. Vous voyez que pour accéder aux différentes variables de notre objet, on va utiliser une ''flèche'' : notre pointeur de type pdate, la flèche et le nom de la variable voulue. Ici d-˃jour va nous retourner 6.

On continue alors avec la fonction d'initialisation, cette fonction va nous permettre d'affecter des valeurs aux variables de notre objet.

  1. pdate date_init(int jour,int mois,int annee)
  2. {
  3.    pdate temp = malloc(sizeof(struct date));

  4.    temp-˃jour = jour;

  5.    switch(mois)
  6.    {
  7.       case 1: temp-˃mois = "janvier"; break;
  8.       case 2: temp-˃mois = "fevrier"; break;
  9.       case 3: temp-˃mois = "mars"; break;
  10.       case 4: temp-˃mois = "avril"; break;
  11.       case 5: temp-˃mois = "mai"; break;
  12.       case 6: temp-˃mois = "juin"; break;
  13.       case 7: temp-˃mois = "juillet"; break;
  14.       case 8: temp-˃mois = "aout"; break;
  15.       case 9: temp-˃mois = "septembre"; break;
  16.       case 10: temp-˃mois = "octobre"; break;
  17.       case 11: temp-˃mois = "novembre"; break;
  18.       default: temp-˃mois = "decembre";
  19.    }

  20.    temp-˃annee = annee;

  21.    return temp;       
  22. }
Copy the Code


Je crée alors un pointeur sur mon objet date et j'attribue les différentes variables jour, mois (que je convertis en lettres) et l'année. Vous noterez juste à la première ligne de ma fonction que j'utilise la fonction malloc, cette fonction va nous permettre de réserver dynamiquement un espace mémoire suffisant pour pouvoir regrouper l'intégralité des informations de mon objet date. Cette espace suffisant est déterminé par la fonction ''sizeof(struct date)'', en français ''taille de mon objet date''.

Justement comme on réserve dynamiquement un espace en mémoire, il faut penser à le libérer une fois qu'on a terminé de l'utiliser car ce n'est pas l'interpréteur qui va s'en charger, si on exécutait trop souvent notre programme sans libérer la mémoire on risquerait de la remplir et de bloquer l'utilisation de notre ordinateur, notre téléphone. C'est d'ailleurs ce qui arrive assez souvent dans des programmes codés à la va-vite. Voici donc cette fonction :

  1. void date_free(pdate d)
  2. {
  3.    free(d);
  4.    d = NULL;
  5. }
Copy the Code


C'est aussi simple que cela, on utilise une fonction prédéfinie free qui libère l'espace et on attribue NULL au pointeur pour être certain qu'il ne bloque plus la mémoire.

Passons maintenant aux autres fonctions que nous avons choisi de définir. Vous vous êtes peut être arraché les cheveux à définir la fonction qui détermine si une année est bissεxtile, la voici.

  1. int est_bissεxtile(pdate d)
  2. {
  3.    return ((d-˃annee % 4 == 0) && (d-˃annee % 100 != 0)) || (d-˃annee % 400 == 0);
  4. }
Copy the Code


Ensuite on a besoin d'une fonction qui convertit notre mois en toutes lettres vers un entier afin de pouvoir faire des opérations sur nos dates.

  1. int mois_vers_entier(char *mois)
  2. {
  3.    if(mois == ʺjanvierʺ) return 1;
  4.    if(mois == ʺfevrierʺ) return 2;
  5.    if(mois == ʺmarsʺ) return 3;
  6.    if(mois == ʺavrilʺ) return 4;
  7.    if(mois == ʺmaiʺ) return 5;
  8.    if(mois == ʺjuinʺ) return 6;
  9.    if(mois == ʺjuilletʺ) return 7;
  10.    if(mois == ʺaoutʺ) return 8;
  11.    if(mois == ʺseptembreʺ) return 9;
  12.    if(mois == ʺoctobreʺ) return 10;
  13.    if(mois == ʺnovembreʺ) return 11;
  14.    return 12;
  15. }
Copy the Code


Et enfin notre fonction qui calcule le nombre de jours dans le mois.

  1. int jours_dans_le_mois(pdate d)
  2. {
  3.    int mois = mois_vers_entier(d-mois);

  4.    if(mois == 4 || mois == 6 || mois == 9 || mois == 11)
  5.       return 30;

  6.    if(mois == 2)
  7.       return (est_bissεxtile(d)) ? 29 : 28;

  8.    return 31;
  9. }
Copy the Code


Voilà, mon objet est défini. Je peux le tester en ajoutant deux fonctions ''demain'' et ''hier'' puis ma fonction principale (''main'').

  1. void demain(pdate d)
  2. {
  3.    int num_jour = d-˃jour;
  4.    int num_mois = mois_vers_entier(d-˃mois);
  5.    int num_annee = d-˃annee;
  6.                
  7.    num_jour++;
  8.                
  9.    if(num_jour ˃ jours_dans_le_mois(d))
  10.    {
  11.       num_jour = 1;
  12.       num_mois++;
  13.    }
  14.        
  15.    if(num_mois ˃ 12)
  16.    {
  17.       num_mois = 1;
  18.       num_annee++;
  19.    }
  20.                
  21.    date_free(d);
  22.    d = date_init(num_jour,num_mois,num_annee);
  23. }

  24. void hier(pdate d)
  25. {
  26.    int num_jour = d-˃jour;
  27.    int num_mois = mois_vers_entier(d-˃mois);
  28.    int num_annee = d-˃annee;
  29.                
  30.    num_jour--;
  31.                
  32.    if(num_jour ˂ 1)
  33.    {
  34.       num_jour = jours_dans_le_mois(d);
  35.       num_mois--;
  36.    }
  37.                        
  38.    if(num_mois ˂ 1)
  39.    {
  40.       num_mois = 12;
  41.       num_annee--;
  42.    }
  43.                
  44.    date_free(d);
  45.    d = date_init(num_jour,num_mois,num_annee);
  46. }

  47. int main(void)
  48. {
  49.    pdate aujourdhui;
  50.    aujourdhui = date_init(6,8,2020);
  51.    date_affiche(aujourdhui);

  52.    demain(aujourdhui);
  53.    date_affiche(aujourdhui);
  54.        
  55.    hier(aujourdhui);
  56.    date_affiche(aujourdhui);
  57.        
  58.    date_free(aujourdhui);
  59.                
  60.    return 0;
  61. }
Copy the Code


Vous trouverez l'intégralité du code dans le fichier zip du cours : date.h et date.c.

Exercice - Réaliser une structure smartphone

C'est à votre tour de jouer, vous avez quartier libre, à vous de remplir vos 2 fichiers smartphone.h, smartphone.c :

1) Commencez par définir les variables, quelles sont les caractéristiques essentielles d'un téléphone ?
2) Quel fonctions peuvent être utiles ? (par exemple calculer le volume à partir des 3 dimensions, etc...)
3) Tester votre objet et ses fonctions.

Fin de ce cours

Voilà qui termine notre cours sur le C ANSI. Il resterait encore quelques concepts à voir et certains à approfondir mais si vous avez réussi les exercices des différents cours, vous connaissez déjà 80% des possibilités de ce langage, ce qui est plutôt pas mal en à peine 2 mois. J'espère en tout cas que ces cours vous auront plus et n'hésitez pas à me dire si vous souhaitez aborder d'autres langages. Aussi, si vous êtes un professionnel ou passionné, et que vous souhaiteriez tenter l'expérience de passer de l'autre côté de l'écran, partager ses connaissances avec notre belle communauté, je vous assisterai avec plaisir !

Bonne continuation à tous et peut être à un autre cours très bientôt !



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-08-06 18:00:00
Favorites RateRate

Photography Team

Addy Chowdary | from Redmi Note 8 Pro

#1

nice programming code  but I am not aware of it!
2020-08-08 22:59:34
Invalid floor, the posts have been deleted #2

Advanced Bunny

DaMi Hg | from app

#3

Merci pour les cours !
2020-08-14 21:58:57
please sign in to reply.
Sign In Sign Up

GuillaumeMi

Moderator

  • Followers

    971

  • Threads

    575

  • Replies

    6734

  • Points

    26132

3 Days Check-In
7 Days Check-In
21 Days Check-In
40 Days Check-In
70 Days Check-In
100 Days Check-In
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
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

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