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 3 : Opérateur ternaire et masquage (Gagnez une médaille)

2020-06-25 18:00:00
831 23
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 masquageEn cours
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 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/.

Cours3.zip (2.13 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


Résolution d'équations du second degré

On va revenir sur le dernier exercice de la semaine dernière et aller un peu plus loin. Je vous propose la solution pour résoudre rapidement les équations du second degré, c'est-à-dire les équations du type ax² + bx + c = 0. De quoi impressionner vos camarades de classe ou vos enfants ;)

La résolution de ces équations se fait en plusieurs étapes :

  • Étape 1 : Calcul du discriminant Δ (delta) avec la formule Δ=b²−4ac.
  • Étape 2 : Déterminer le signe du discriminant : positif, nul ou négatif.
  • Étape 3.1 : si Δ˃0 (positif), il y a deux solutions  (−b−√Δ)/(2a) et (−b+√Δ)/(2a).
  • Étape 3.2 : si Δ=0 (nul), il y a une solution : −b/(2a).
  • Étape 3.3 : si Δ˂0 (négatif), il n'y a pas de solution réelle.
  • Étape 4 : Afficher les résultats.


Note : √Δ désigne la ''racine carrée'' du discriminant.

Rien de bien compliqué, si ? Voyons comment nous allons coder cela.

eq2d.c
  1. #include ˂stdio.h˃
  2. #include ˂math.h˃

  3. double discriminant(double a, double b, double c)
  4. {
  5.         return b*b-4*a*c;
  6. }

  7. void resoudre(double a, double b, double c)
  8. {
  9.         double delta;

  10.         delta = discriminant(a, b, c);
  11.         
  12.         if(delta ˃ 0)
  13.         {
  14.                 double solution1, solution2;
  15.                
  16.                 solution1 = (-b-sqrt(delta))/(2*a);
  17.                 solution2 = (-b+sqrt(delta))/(2*a);
  18.                
  19.                 printf(ʺL'équation a deux solutions : x = %lf et x = %lf\nʺ, solution1, solution2);
  20.         }
  21.         else if(delta == 0)
  22.         {
  23.                 double solution;
  24.                
  25.                 solution = -b/(2*a);
  26.                
  27.                 printf(ʺL'équation a une solution : x = %lf\nʺ, solution);
  28.         }
  29.         else
  30.         {
  31.                 printf(ʺL'équation n'a pas de solution réelle !\nʺ);
  32.         }
  33. }

  34. int main(void)
  35. {
  36.    double a, b, c;

  37.    printf(ʺProgramme de résolution d'une équation du second degré\nax²+bx+c=0\n\nʺ);
  38.    printf(ʺEntrez la valeur de a : ʺ);
  39.    scanf(ʺ%lfʺ,&a);
  40.    printf(ʺEntrez la valeur de b : ʺ);
  41.    scanf(ʺ%lfʺ,&b);
  42.    printf(ʺEntrez la valeur de c : ʺ);
  43.    scanf(ʺ%lfʺ,&c);
  44.    resoudre(a, b, c);

  45.    return 0;
  46. }
Copy the Code


Bon, vous vous doutez que je n'ai pas fait ça juste pour le plaisir. Grâce à ce programme nous introduisons déjà quelques nouveautés :

1. La fonction sqrt est la fonction mathématique qui calcule une racine carrée, nous n'avons donc pas à réinventer cette fonction et devons inclure la librairie math.h qui définie déjà cette fonction.

2. Nous appelons la ''fonction'' resoudre mais celle-ci ne nous retourne rien, le type de retour étant ''void''. Plutôt qu'une fonction on préfère alors parler de ''procédure''. Pourquoi aie-je fais ce choix ? Lorsque notre discriminant est positif, il y a deux solutions, hors jusqu'à présent, nous n'avons vu que des fonctions qui pouvait nous retourner qu'une seule valeur. Il se pourrait donc qu'on revienne sur des solutions alternatives lors de prochains cours.

3. Nous voyons également les fonctions de comparaisons avec ''˃'' (est supérieur à) ou ''=='' (est égal à). Notez bien qu'il y a bien deux symboles égal pour la comparaison alors que lorsque l'on utilise un seul ''='' c'est une affectation. Par exemple x=0 attribue la valeur 0 à x, mais x==0 vérifie que x est égal à 0 ou non !

4. Nous introduisons la structure conditionnelle ''si ... sinon si ... sinon'' (''if ... else if ... else''). Ces conditions sont exécutés dans l'ordre d'écriture et dès qu'une condition est remplie alors on exécute les instructions de cette condition et on oublie toutes les suivantes. On peut bien sûr imbriquer des structures encore plus longues : ''si ... sinon si ... sinon si ... sinon si ... (...) sinon si ... sinon''.

L'opérateur ternaire

Nos codes s'allongent facilement mais il existe différentes façons de les optimiser pour pouvoir gagner en clarté et raccourcir le code. On va ici s'attaquer à notre structure conditionnelle ''si ... sinon'' (if ... else). Comparons par exemple le prix du M365 Pro chez deux vendeurs :

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

  2. int main(void)
  3. {
  4.    int prix_m365pro_micom = 450;
  5.    int prix_m365pro_xiaomistore = 470;
  6.    int prix_minimum;

  7.    if(prix_m365pro_micom ˂ prix_m365pro_xiaomistore)
  8.    {
  9.       prix_minimum = prix_m365pro_micom;
  10.    }
  11.    else
  12.    {
  13.       prix_minimum = prix_m365pro_xiaomistore;
  14.    }
  15.    printf(ʺLe prix minimum est %d€\nʺ, prix_minimum);

  16.    return 0;
  17. }
Copy the Code


Dans ces cas relativement simple, on va pouvoir faire une première simplification au niveau des accolades. Les accolades servent à regrouper les instructions mais ici après la condition ''if'' ou la condition ''else'', nous n'avons qu'une seule instruction. Lorsque c'est le cas, nous pouvons supprimer les accolades et donc gagner un peu de place.

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

  2. int main(void)
  3. {
  4.    int prix_m365pro_micom = 450;
  5.    int prix_m365pro_xiaomistore = 470;
  6.    int prix_minimum;

  7.    if(prix_m365pro_micom ˂ prix_m365pro_xiaomistore) prix_minimum = prix_m365pro_micom;
  8.    else prix_minimum = prix_m365pro_xiaomistore;
  9.    printf(ʺLe prix minimum est %d€\nʺ, prix_minimum);

  10.    return 0;
  11. }
Copy the Code


Et si je vous disais que l'on peut encore mieux faire, regardez plutôt :

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

  2. int main(void)
  3. {
  4.    int prix_m365pro_micom = 450;
  5.    int prix_m365pro_xiaomistore = 470;
  6.    int prix_minimum;

  7.    prix_minimum = (prix_m365pro_micom ˂ prix_m365pro_xiaomistore) ? prix_m365pro_micom : prix_m365pro_xiaomistore;
  8.    printf(ʺLe prix minimum est %d€\nʺ, prix_minimum);

  9.    return 0;
  10. }
Copy the Code


Nous voilà donc avec un code de 8 lignes résumé en 1 seule ligne grâce à l'opérateur ternaire ''c ? a : b'' : si la condition ''c'' est remplie alors ''a'' sinon ''b'' !

Exercice 1/2 - Calculer le minimum de 3 valeurs

A votre tour de jouer maintenant, c'est à vous de trouver l'algorithme permettant d'afficher le minimum des 3 prix dans la variable pm  !
J'ai réduit le nom des variables volontairement pour vous permettre une écriture plus rapide.
Essayez alors de trouver la version la plus condensée possible ;)

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

  2. int main(void)
  3. {
  4.    int p1 = 450;
  5.    int p2 = 470;
  6.    int p3 = 449;
  7.    int pm;

  8.    
  9.    printf(ʺLe prix minimum est %d€\nʺ, pm);

  10.    return 0;
  11. }
Copy the Code


Les masquages

Que vous ayez des connaissances en informatique ou que vous ayez vu un film comme Matrix, vous savez probablement que l'informatique est actuellement faite d'une succession de 1 et de 0 : un monde binaire. Ainsi, toutes les informations qui transitent via les fils ou via des ondes sont une succession de 1 et de 0. Alors comment extraire uniquement les informations qui nous intéressent, on va notamment réaliser des masquages. En clair, on ne va garder que les nombres souhaités et masquer tout le reste !

Avant de passer directement au masquage, on va passer par un peu de théorie. Les nombres telles qu'on les connaît tous sont des nombres dits en base 10. Alors pourquoi une base 10 ? Tout simplement car on peut décomposer un nombre de la manière suivante, prenons 1998, une année plutôt importante pour le football français :

1998 = 1000 + 900 + 90 + 8
1998 = 1 x 1000 + 9 x 100 + 9 x 10 + 8 x 1
1998 = 1 x 10^3 + 9 x 10^2 + 9 x 10^1 + 8 x 10^0

Pour précision, le symbole ''^'' signifie ''puissance''. Par exemple ''10^3'' signifie ''10 puissance 3'', ce qui équivaut à ''10 x 10 x 10'' soit ''1000''. A noter le cas particulier de la ''puissance 0'' qui donne toujours ''1'' : 10^0 = 1.

Vous voyez donc qu'on a décomposé notre nombre suivant les puissances de 10 et on obtient donc une suite de 4 chiffres, 4 chiffres qui sont compris entre 0 et 9. Nous sommes donc bien dans la base 10. Estimons que notre système informatique permette d'envoyer des nombres en base 10, on enverrait alors le 1, puis le 9, puis l'autre 9 et finalement le 8.

Malheureusement ceci n'est pas encore possible et nous devons envoyer des données binaires c'est à dire que des 1 ou des 0. Nous travaillons alors en base 2.

(base 10) 1998 = (base 2) 11111001110

Pourquoi ? Eh bien repartons de la décomposition à la manière de la base 10 :

(base 2) 11111001110

1 x 2^10 + 1 x 2^9 + 1 x 2^8 + 1 x 2^7 + 1 x 2^6 + 0 x 2^5 + 0 x 2^4 + 1 x 2^3 + 1 x 2^2 + 1 x 2^1 + 0 x 2^0
= 1 x 1024 + 1 x 512 + 1 x 256 + 1 x 128 + 1 x 64 + 0 x 32 + 0 x 16 + 1 x 8 + 1 x 4 + 1 x 2 + 0 x 1
= 1024 + 512 + 256 + 128 + 64 + 0 + 0 + 8 + 4 + 2 + 0
= 1998 (base 10)

Est-ce bien clair pour vous ? Sinon n'hésitez pas à utiliser les commentaires pour poser toutes vos questions.

Allons maintenant un peu plus loin, nous avons vu dans le cours précédent que les ''short int'' sont codés sur 2 octets. Chaque octet est une succession de 8 bits. Et qu'est-ce qu'un bit ? C'est tout simplement un 0 ou un 1 !

Avec ceci, vous comprenez peut être pourquoi, on nous vend des mémoires de 256 Go ou 512 Go alors qu'il serait tellement plus simple de dire 250 Go ou 500 Go !

Une autre information, on symbolise un bit par la lettre ''b'', vous l'avez certainement vu lorsque vous parlez de débits. Par exemple, le débit théorique maximal en WiFi 4 est de 600Mb/s, 600 Mega bits par seconde, 600 millions de bits par seconde. Il ne faut surtout pas le confondre avec le ''B'' majuscule qui lui signifie Bytes en anglais et correspond à notre octet ''o''. Pour le WiFi 4, on a donc un débit théorique maximal de 75 Mo/s (Mega octets par seconde) ou 75 MBps (Mega Bytes per second). Faites donc attention, les commerciaux s'amusent souvent à jouer sur cette ambiguïté pour vous promettre de meilleurs débits !

Revenons donc aux ''short int'', ils sont codés sur 2 octets et donc sur 16 bits. Donc à priori la valeur maximale pourrait être :

(base 2) 1111 1111 1111 1111

1 x 2^15 + 1 x 2^14 + 1 x 2^13 + 1 x 2^12 + 1 x 2^11 + 1 x 2^10 + 1 x 2^9 + 1 x 2^8 + 1 x 2^7 + 1 x 2^6 + 1 x 2^5 + 1 x 2^4 + 1 x 2^3 + 1 x 2^2 + 1 x 2^1 + 1 x 2^0
= 1 x 32 768 + 1 x 16 384 + 1 x 8 192 1 x 4 096 + 1 x 2 048 + 1 x 1 024 + 1 x 512 + 1 x 256 + 1 x 128 + 1 x 64 + 1 x 32 + 1 x 16 + 1 x 8 + 1 x 4 + 1 x 2 + 1 x 1
= 65 535 (base 10)

Oui mais souvenez vous, un ''short int'' peut également prendre une valeur négative donc comment indiquer que le nombre est positif ou négatif ... Eh bien, le premier bit va être réservé pour le signe, si c'est un 1 alors le nombre est négatif, si c'est un 0 alors le nombre est positif. La valeur maximale sera alors réduite à 32 767 !

Nous en arrivons alors enfin aux masques. Nous avons un nombre codé sur 16 bits et c'est ce bit le plus à gauche qui détermine le signe, il n'y a donc que celui-ci qui nous intéresse si l'on veut savoir si un nombre est positif ou négatif. Nous allons donc conserver que ce bit et effacer tous les autres. Reprenons 1998 codé sur 2 octets.

   0000 0111 1100 1110 (1998 en base 2)
& 1000 0000 0000 0000 (notre masque)
= 0000 0000 0000 0000

Pour réaliser ce masquage et ne conserver que le premier bit, nous utilisons l'opérateur ''ET bit à bit'' symbolisé par ''&'' qui compare donc chaque bit. Lorsqu'un bit de notre masque est à 0 alors on efface la valeur (elle ne nous intéresse pas), mais lorsqu'un bit de notre masque est à 1 alors on conserve simplement la valeur du bit du nombre : si c'était à 0 alors cela reste 0, si c'était 1 alors cela reste à 1.

Ainsi notre masque 1000 0000 0000 0000 (en base 2) équivaut à la valeur 32 768 (en base 10) nous pouvons alors l'utiliser de la façon suivante :

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

  2. int main(void)
  3. {
  4.    short int n1 = 100;
  5.    short int n2 = -100;
  6.    short int n3 = 101;

  7.    if(n1 & 32768) printf(ʺ%d est un nombre négatif\nʺ, n1);
  8.    else printf(ʺ%d est un nombre positif\nʺ, n1);
  9.    
  10.    if(n2 & 32768) printf(ʺ%d est un nombre négatif\nʺ, n2);
  11.    else printf(ʺ%d est un nombre positif\nʺ, n2);
  12.    
  13.    if(n3 & 32768) printf(ʺ%d est un nombre négatif\nʺ, n3);
  14.    else printf(ʺ%d est un nombre positif\nʺ, n3);
  15.    
  16.    return 0;
  17. }
Copy the Code


Exercice 2/2 - Déterminer la parité

Bon, étant donné que selon les architectures la dimension des données n'est pas toujours la même, on ne va pas souvent utiliser un masquage pour déterminer le signe d'un nombre, on préférera une comparaison if(n ˃ 0) par exemple. Mais s'il y a bien un masquage qui est très utilisé c'est celui pour déterminer la parité d'un nombre : est-il pair (nombre qui termine par 0, 2, 4, 6 ou 8) ou est-il impair (nombre qui termine par 1, 3, 5, 7 ou 9) ? Je vous donne une autre solution ci-dessous mais elle est bien plus gourmande en ressources qu'un masquage donc à vous de m'apporter la solution avec masquage pour avoir un programme qui consommera moins !

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

  2. int main(void)
  3. {
  4.    short int n1 = 100;
  5.    short int n2 = -100;
  6.    short int n3 = 101;

  7.    if(n1 % 2 == 0) printf(ʺ%d est un nombre pair\nʺ, n1);
  8.    else printf(ʺ%d est un nombre impair\nʺ, n1);
  9.    
  10.    if(n2 % 2 == 0) printf(ʺ%d est un nombre pair\nʺ, n2);
  11.    else printf(ʺ%d est un nombre impair\nʺ, n2);
  12.    
  13.    if(n3 % 2 == 0) printf(ʺ%d est un nombre pair\nʺ, n3);
  14.    else printf(ʺ%d est un nombre impair\nʺ, n3);
  15.    
  16.    return 0;
  17. }
Copy the Code




Si vous n'avez pas compris quelque chose n'hésitez pas à poser vos questions en commentaires, entraidez-vous ... et toutes les réponses correctes et originales aux 2 exercices recevront une médaille !




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-06-25 18:00:00
Favorites12 RateRate

Master Bunny

SRB Denis | from app

#1

merci 👍🏻. olala les déterminants le vieux souvenir 😅
2020-06-26 00:34:29

Moderator

GuillaumeMi Author |

#3

BougLo a posté en 2020-06-26 11:22:09
Oulala, déjà que je galère sur le cours 1 et 2. Soit, il faut que je me débarrasse des enfants pour avoir plus de temps soit arrêter le rhum à chaque fois que je lis une ligne.

Mais on va réussir à sortir qq chose

Courage, ça va le faire :)
2020-06-26 19:23:58

Master Bunny

Wolrix | from app

#4

Je vais essayer de commencer ta série mais il faut prendre le temps !
2020-06-26 22:22:08

Mi10 - Mi9 - Amazfit GTS - Mi Band 3 - Redmi Note 8

Moderator

GuillaumeMi Author |

#5

Wolrix a posté en 2020-06-26 16:22:08
Je vais essayer de commencer ta série mais il faut prendre le temps !

Promis, ce post ne s'autodétruira pas dans 5 secondes ! ;)
2020-06-26 22:47:22

Pro Bunny

sahines | from app

#6

2020-06-27 18:12:00

Pro Bunny

Llorç | from app

#7

😃
2020-06-28 04:50:05

Master Bunny

jpbal | from app

#8

pas très compliqué ça mais je ferai tout ça quand je serai devant mon PC
2020-06-28 06:36:15

Master Bunny

raoulteigneux | from app

#9

👍🏻🤪
super complet, bravo
2020-06-28 10:47:07

Pro Bunny

muammer.arslan | from app

#10

merci olala
2020-06-28 17:10:14
please sign in to reply.
Sign In Sign Up

GuillaumeMi

Moderator

  • Followers

    972

  • 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