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 5 : Incrémentation, boucles et tri de tableau (Gagnez une médaille)

2020-07-09 18:00:00
300 2
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 tableauEn cours
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/.

Cours5.zip (2.11 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


Incrémentation et décrémentation

Actuellement si je vous demandais d'augmenter le prix d'un Mi A3 de 30€ et de diminuer le prix d'un Mi 10 Pro de 50€, vous procéderiez certainement de la façon suivante :

  1. prixMiA3 = prixMiA3 + 30;
  2. prixMi10Pro = prixMi10Pro - 50;
Copy the Code


Il y a ici encore la possibilité de simplifier les écritures, gagner du temps, voici l'équivalent simplifié :

  1. prixMiA3 += 30;
  2. prixMi10Pro -= 50;
Copy the Code


J'en profite pour vous préciser que ces opérations fonctionneront également avec les opérateurs multiplier (*), diviser (/) ou modulo (%).

Mais que signifient ces deux mots incrémenter et décrémenter ? Il s'agit en fait d'ajouter ou retirer 1 à une variable. Donc on pourrait tout à fait procéder de façon équivalente :

  1. prixMiA3 += 1;
  2. prixMi10Pro -= 1;
Copy the Code


Et c'est une façon tout à fait correcte de faire mais l'incrémentation et la décrémentation sont des opérations très très courante en informatique, il fallait donc bien de nouveaux opérateurs : pour l'incrémentation ce sera ++ et pour la décrémentation ce sera --. Pas très compliqué, il suffit de doubler le signe et on les place avant ou après la variable :

  1. prixMiA3 = prixMiA3 + 1;
  2. prixMiA3 += 1;
  3. prixMiA3++;
  4. ++prixMiA3;

  5. prixMi10Pro = prixMi10Pro - 1;
  6. prixMi10Pro -= 1;
  7. prixMi10Pro--;
  8. --prixMi10Pro;
Copy the Code


Les 4 premières instructions ont exactement le même effet : si le Mi A3 avait un prix de 249€, le prix sera désormais de 250€. De même, si le prix du Mi 10 Pro était de 999€, il sera désormais de 998€ !

Mais vous vous doutez bien qu'il doit y a une différence entre placer ces opérateurs avant ou après la variable et, effectivement, c'est le cas. Dans l'exemple précédent nous ne faisions qu'incrémenter ou décrémenter la valeur de la variable mais si on place cette variable avec son opérateur dans une autre expression du type :

  1. prixRemise1 = prixMi10Pro++ - 50;
  2. prixRemise2 = ++prixMi10Pro - 50;
Copy the Code


En estimant que prixMi10Pro a été initialisé à 999, que l'on exécute l'une ou l'autre des lignes, la variable prixMi10Pro prendra la valeur 1000. Pourtant si on affiche prixRemise1 et prixRemise2, la valeur ne sera pas la même ! prixRemise1 équivaut à 949 alors que prixRemise2 équivaut à 950 ! Lorsque l'opérateur est placé après la variable, on va d'abord exécuter l'instruction puis ajouter 1 à la variable. Et lorsque l'opérateur est placé avant la variable, on commence par ajouter 1 puis on exécute l'instruction !

Voici le code, si besoin, pour vérifier mes dires :)

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

  2. int main(void)
  3. {
  4.    int prix1, prix2, prixRemise1, prixRemise2;

  5.    prix1 = 999;
  6.    prixRemise1 = prix1++ - 50;
  7.    prix2 = 999;
  8.    prixRemise2 = ++prix2 - 50;

  9.    printf(ʺPrix = %d et Prix Remise 1 = %d ! \nʺ, prix1, prixRemise1);
  10.    printf(ʺPrix = %d et Prix Remise 2 = %d ! \nʺ, prix2, prixRemise2);

  11.    return 0;
  12. }
Copy the Code


Si vous avez des interrogations sur ces opérateurs n'hésitez pas à poser des questions en commentaires !

La boucle for

La boucle for, en français pour tout, va nous permettre d'exécuter un même code un nombre de fois bien défini. On va partir d'un exemple et ensuite décomposer pour comprendre. Estimons que sur Mi.com il soit possible de cumuler plusieurs coupons de réduction 10€, que va me coûter mon Mi 10 Pro une fois appliqué ces 5 coupons ?

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

  2. int main(void)
  3. {
  4.    int nombreUtilisation, nombreCoupons, valeurCoupon, prix;

  5.    prix = 999;
  6.    valeurCoupon = 10;
  7.    nombreCoupons = 5;

  8.    for(nombreUtilisation=0 ; nombreUtilisation ˂ nombreCoupons ; nombreUtilisation++)
  9.    {
  10.       prix -= valeurCoupon;
  11.    }

  12.    printf(ʺPrix final = %d €\nʺ, prix);

  13.    return 0;
  14. }
Copy the Code


On aurait bien sûr pu faire l'opération de tête mais il s'agit ici de comprendre le principe. Vous voyez que l'écriture de la boucle for ressemble un peu à une fonction avec 3 instructions, chacune de ces instructions est séparée par un point virgule ; ...

La première instruction est l'initialisation, elle est exécutée une seule fois avant de démarrer la boucle.

La deuxième instruction est la condition à remplir pour que la boucle continue ou s'arrête. Si la condition est vraie, on boucle, si la condition est fausse, la boucle s'arrête et on poursuit le code après les accolades de la boucle for.

La dernière instruction est une instruction à exécuter à chaque fin de tour de boucle. Dans notre cas on va à chaque fin de tour incrémenter la valeur du nombre d'utilisation qui a été initialisé à 0. Vous comprenez donc qu'après 5 tours de boucle, le nombre d'utilisation ne sera plus strictement inférieur au nombre de coupons et la boucle va donc s'arrêter.

Entre les accolades, c'est le code que l'on va exécuter à chaque tour. Comme pour les instructions if...else, les accolades ne sont pas nécessaires s'il n'y a qu'une ligne d'instruction, on aurait donc pu simplifier le code de cette manière :

  1. for(nombreUtilisation=0 ; nombreUtilisation ˂ nombreCoupons ; nombreUtilisation++)
  2.    prix -= valeurCoupon;
Copy the Code


La boucle while

Une autre boucle existe, c'est la boucle while, en français tant que. On va exécuter des instructions, tant qu'une condition se vérifie ! Xiaomi a été fondé en 2010, quelle âge a donc Xiaomi en 2020 ? (bon d'accord c'est facile mais si vous préférez prenez l'année de naissance d'un de vos parents ou grand parents).

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

  2. int main(void)
  3. {
  4.    int anneeNaissance, annee, anneeActuelle;

  5.    anneeNaissance = 2010;
  6.    annee = anneeNaissance;
  7.    anneeActuelle = 2020;
  8.    age = 0;

  9.    while(annee ˂ anneeActuelle)
  10.    {
  11.       printf(ʺEn %d, Xiaomi avait %d ans\nʺ, annee++, age++)
  12.    }

  13.    printf(ʺAujourd'hui, Xiaomi a %d ans !\nʺ, age);

  14.    return 0;
  15. }
Copy the Code


Vous voyez donc que la structure est très simple, après while on ouvre les parenthèses pour insérer la condition à remplir pour exécuter le code qui suit dans les accolades (comme toujours on peut supprimer les accolodes s'il n'y a qu'une instruction). Une fois le code exécuté, on test à nouveau la condition et si elle est toujours vraie alors on boucle encore une fois, etc...

A noter que si la condition n'est pas remplie dès le début, la boucle ne sera jamais exécutée.

La boucle do while

La raison pour laquelle j'ai précisé cette dernière note est qu'il existe une variante à la boucle while, c'est la boucle do...while qui se traduit en fait...tant que. Pour cette boucle, même si la condition n'est pas remplie, les instructions sont tout de même exécutées au moins une fois car le test de la condition est fait à la fin de la boucle.

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

  2. int main(void)
  3. {
  4.    int anneeNaissance, annee, anneeActuelle;

  5.    anneeNaissance = 2010;
  6.    annee = anneeNaissance;
  7.    anneeActuelle = 2020;
  8.    age = 0;

  9.    do
  10.    {
  11.       printf(ʺEn %d, Xiaomi avait %d ans\nʺ, annee++, age++)
  12.    } while(annee ˂ anneeActuelle);

  13.    printf(ʺAujourd'hui, Xiaomi a %d ans !\nʺ, age);

  14.    return 0;
  15. }
Copy the Code


Exercice 1/2 - Utilisation de la boucle while

Souvenez vous des problèmes de CM2, voici le moment d'en résoudre un grâce à une fonction informatique.

Un Mi 10 Pro coûte 999€, combien de jours seront nécessaires à Yan pour acheter ce téléphone sachant qu'il dispose de 645€ dans sa tirelire et qu'il arrive à mettre de côté 5€ par jour.

La contrainte est d'utiliser une boucle while et d'utiliser l'opérateur d'incrémentation ++ pour compter les jours, bon courage !

Parcourir un tableau

Un autre intérêt des boucles c'est de pouvoir parcourir toutes les valeurs d'un tableau. Prenons par exemple, un tableau qui regroupe le prix de tous les téléphones de la gamme Mi du site Mi.com.

  1. int tableau[] = {380, 1000, 800, 550, 300, 430, 250, 330, 370, 500, 330, 600, 350, 270, 190, 270, 270, 330, 500, 230};
Copy the Code


Il y a 16 téléphones de la gamme Mi, je vais alors utiliser une boucle pour afficher les prix :

  1. int i;

  2. for(i=0; i˂16; i++)
Copy the Code


La variable i sert d'indice pour parcourir les éléments du tableau : tableau[0], tableau[1], ..., tableau[15].

Que pouvons nous faire avec tout ça ? On peut par exemple calculer combien va nous coûter l'achat de ces 16 téléphones.

  1. int i, cumul;

  2. cumul = 0;

  3. for(i=0; i˂16; i++)
Copy the Code


Trop facile ! Si on passait à quelques choses de plus ''intéressant'' ?

Echange de valeurs dans un tableau

Disons que le classement des téléphones du site Mi.com ne me plaît pas, je souhaite par exemple inverser la place du Mi 10 et du Mi 10 Pro qui sont respectivement aux places 2 et 3 dans la liste. En terme informatique je voudrais que tableau[1] devienne tableau[2] et tableau[2] devienne tableau[1]. Est-ce que je peux alors faire la chose suivante ?

  1. tableau[1] = tableau[2];
  2. tableau[2] = tableau[1];
Copy the Code


L'exécution des lignes de code n'est pas simultané, chaque ligne s'exécute à la suite donc après la première ligne la valeur de tableau[1] a changé, je ne peux plus l'utiliser telle quelle dans la ligne 2 ... On va devoir utiliser une variable tampon afin de garder la valeur en mémoire et procéder à l'échange.

  1. int temp;

  2. temp = tableau[1];
  3. tableau[1] = tableau[2];
  4. tableau[2] = temp;
Copy the Code


Vous avez bien compris le principe ? Sinon n'hésitez pas à demander plus d'explications en commentaires !

Comme on pourrait utiliser souvent cet échange, on pourrait en faire une procédure et la tester :

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

  2. void echange(int *tableau, int i, int j)
  3. {
  4.    int temp;

  5.    temp = tableau[i];
  6.    tableau[i] = tableau[j];
  7.    tableau[j] = temp;
  8. }

  9. void afficher(int *tableau, int taille)
  10. {
  11.    int i;

  12.    for(i=0; i˂taille; i++)
  13.    {
  14.       printf(ʺ[%d] : %d\nʺ, i, tableau[i]);
  15.    }
  16. }

  17. int main(void)
  18. {
  19.    int tableau[] = {380, 1000, 800, 550, 300, 430, 250, 330, 370, 500, 330, 600, 350, 270, 190, 270, 270, 330, 500, 230};
  20.    int tailleTableau = 16;

  21.    printf(ʺAffichage des valeurs du tableau\nʺ);
  22.    afficher(tableau, tailleTableau);
  23.    printf(ʺ\nEchange des valeurs 1 et 2\n\nʺ);
  24.    echange(tableau, 1, 2);
  25.    printf(ʺAffichage des valeurs du tableau après échange\nʺ);
  26.    afficher(tableau, tailleTableau);
  27.    
  28.    return 0;
  29. }
Copy the Code


Est-ce que cela fait bien le travail demandé ?

Exercice 2/2 - Tri complet du tableau

Et si maintenant, j'ai envie de trier mes téléphones par ordre croissant de prix, c'est plutôt une bonne idée ?

On va donc introduire ici un tri de tableau, c'est une opération qui peut s'avérer très utile dans vos futurs programmes informatiques. Il existe beaucoup de tris possibles avec chacun ses avantages et ses inconvénients. Pour nous, j'ai choisi le ''tri à bulles'', tout simplement car après ce cours d'aujourd'hui (plutôt long il faut le dire), je vous sais capable de transcrire l'algorithme en procédure. Voici donc l'algorithme de notre tri à bulles :

Algorithme TriABulles
   Paramètre tableau (notre tableau des prix)
   Paramètre n (la longueur de notre tableau, le nombre d'éléments)
   Variables i, j (deux entiers qui vont nous servir d'indices dans le tableau)

   Début de la procédure
      pour tout i décroissant de (n-1) jusqu'à 1, faire
         pour tout j croissant de 1 jusqu'à i, faire
            si tableau[j-1] ˃ tableau[j] alors
               échanger tableau[j-1] et tableau[j]
            fin si
         fin pour tout
      fin pour tout
   fin Procédure
fin TriABulles

Ce n'est pas si compliqué, si ? Pour vous aiguiller il s'agit ici de 2 boucles for imbriquées avec un test if à l'intérieur. En plus, je vous donne le programme à compléter pour que vous n'ayez vraiment que à vous soucier de l'algorithme de tri :

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

  2. void echange(int *tableau, int i, int j)
  3. {
  4.    int temp;

  5.    temp = tableau[i];
  6.    tableau[i] = tableau[j];
  7.    tableau[j] = temp;
  8. }

  9. void afficher(int *tableau, int taille)
  10. {
  11.    int i;

  12.    for(i=0; i˂taille; i++)
  13.    {
  14.       printf(ʺ[%d] : %d\nʺ, i, tableau[i]);
  15.    }
  16. }

  17. void TriABulles(int *tableau, int n)
  18. {

  19. }

  20. int main(void)
  21. {
  22.    int tableau[] = {380, 1000, 800, 550, 300, 430, 250, 330, 370, 500, 330, 600, 350, 270, 190, 270, 270, 330, 500, 230};
  23.    int tailleTableau = 16;

  24.    printf(ʺAffichage des valeurs du tableau\nʺ);
  25.    afficher(tableau, tailleTableau);
  26.    printf(ʺ\nTri du tableau\n\nʺ);
  27.    TriABulles(tableau, 16);
  28.    printf(ʺAffichage des valeurs du tableau après le tri\nʺ);
  29.    afficher(tableau, tailleTableau);
  30.    
  31.    return 0;
  32. }
Copy the Code


N'hésitez pas à faire des tests et parlez en en commentaires !



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-07-09 18:00:00
Favorites2 RateRate

Master Bunny

Abdullaherolmeb | from Redmi Note 8 Pro

#1

👍👍👍
2020-07-14 02:47:48

Moderator

GuillaumeMi Author |

#2

Une solution possible



2020-08-19 23:21:04
please sign in to reply.
Sign In Sign Up

GuillaumeMi

Moderator

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
MFF2020
Nepal "Happy New Year"
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