• Aucun résultat trouvé

IFT 1179 : Programmation en C# A) Instructions de contrôle avec C# : I) La sélection

N/A
N/A
Protected

Academic year: 2022

Partager "IFT 1179 : Programmation en C# A) Instructions de contrôle avec C# : I) La sélection"

Copied!
16
0
0

Texte intégral

(1)

IFT 1179 : Programmation en C#

A) Instructions de contrôle avec C# : I) La sélection

1. Avec if : c’est pareil en C, C++, Java

if ( condition )

instruction A

else

instruction B

2. Avec switch : c’est assez pareil en C, C++, Java

La fin des instructions sous une clause, même

default

, devrait se terminer avec

break;

Exemple : Saisir le rang d’un mois et afficher le nombre de journées dans le mois.

using System;

class Selection {

static int LireEntier(string message) { Console.Write("{0} ", message);

return int.Parse( Console.ReadLine());

}

static void AfficherAvecIf(int rang) {

if (rang >= 1 && rang <= 12)

{

Console.Write("Pour le mois de rang {0}.", rang);

if (rang == 1 || rang == 3 || rang == 5 || rang == 7

|| rang == 8 || rang == 10 || rang == 12)

(2)

else {

int annee = LireEntier(

"\nQuelle est l'annee ? (ex 1996) ");

int siecle = annee / 100;

int an = annee % 100;

bool bissextile = (an != 0 && an % 4 == 0) ||

(an == 0 && siecle % 4 == 0);

if (bissextile)

Console.Write("On a 29 ");

else

Console.Write("On a 28 ");

}

Console.WriteLine(" jours ");

}

else Console.WriteLine("Le rang {0} est errone", rang);

Console.WriteLine("\nFin de selection avec if ...\n");

}

static void AfficherAvecSwitch(int rang) {

switch(rang)

{ case 1: case 3: case 5: case 7: case 8: case 10: case 12:

Console.Write("Pour le mois du rang {0}, on a 31 jours", rang);

break;

case 4: case 6: case 9: case 11:

Console.Write("Pour le mois du rang {0}, on a 30 jours", rang);

break;

case 2 :

int annee = LireEntier("\nQuelle est l'annee ? (ex 1996) ");

int siecle = annee / 100;

int an = annee % 100;

bool bissextile = (an != 0 && an % 4 == 0) ||

(an == 0 && siecle % 4 == 0);

Console.Write("Le moid de fevrier {0} on a ", annee);

if (bissextile)

Console.WriteLine("29 jours ");

else

Console.WriteLine("28 jours");

break;

default :

Console.WriteLine("Le rang {0} est errone", rang);

break;

}

Console.WriteLine("\nFin de selection avec switch ...\n");

}

(3)

static void Main(string[] args) {

string reponse;

do

{ int rang = LireEntier("Entrez le rang d'un mois entre 1 et 12 ");

AfficherAvecIf(rang);

AfficherAvecSwitch(rang);

Console.Write("\nVoulez-vous continuer (o/n) ? ");

reponse = Console.ReadLine();

} while (reponse.ToUpper()[0] == 'O');

} }

/* Exécution:

Entrez le rang d'un mois entre 1 et 12 5 Pour le mois de rang 5. On a 31 jours Fin de selection avec if ...

Pour le mois du rang 5, on a 31 jours Fin de selection avec switch ...

Voulez-vous continuer (o/n) ? o

Entrez le rang d'un mois entre 1 et 12 2 Pour le mois de rang 2.

Quelle est l'annee ? (ex 1996) 2004 On a 29 jours

Fin de selection avec if ...

Quelle est l'annee ? (ex 1996) 1996 Le moid de fevrier 1996 on a 29 jours Fin de selection avec switch ...

Voulez-vous continuer (o/n) ? n Press any key to continue

*/

(4)

II) Les boucles

1. répéter : c’est pareil en C, C++, Java

do

instruction

while (condition pour continuer);

2. tant que : c’est pareil en C, C++, Java

while (condition pour continuer) instruction

3. pour : c’est pareil en C, C++, Java

for( initialisation; condition pour continuer; ajustement) instruction

À cause de la flexibilité des déclarations, on rencontre plus souvent la forme suivante :

for ( int i = 0; i < nbPers ; i++)

Console.WriteLine ( age[i] );

Ou

for ( int i = 0, j = nbPers -1 ; i < j ; i++, j -- ) . . .

4. pour chaque : c’est une nouveauté vs C, C++, Java

foreach ( type elément in une collection) instruction

pour chaque (élément qui fait partie d’une collection)

. . .

Dans les premières semaines, on utilise aussi foreach avec des

tableaux.

(5)

Exemple : estimer une valeur de PI avec 3 boucles

/** Fichier Boucles1.cs (1er exemple pour les boucles) *

* Par LVN pour IFT 1179 *

*/

using System;

class Boucles1 {

static void estimerPIAvecWhile(int borne) {

Console.WriteLine("Estimation de PI avec la boucle while :");

const int LE_PAS = 2;

int signe = 1, deno = 1;

double piSur4 = 0.0;

while (deno <= borne) {

piSur4 += signe / (double) deno ;

signe = -signe;

deno += LE_PAS;

}

Console.WriteLine("Avec while : PI = {0, 10:f8}", 4 * piSur4);

Console.WriteLine(" --- Fin de while ... ----\n");

}

static void estimerPIAvecDoWhile(int borne) {

Console.WriteLine("Estimation de PI avec la boucle do ... while :");

const int LE_PAS = 2;

int signe = 1, deno = 1;

double piSur4 = 0.0;

do {

piSur4 += signe / (double) deno ;

signe = -signe;

deno += LE_PAS;

} while (deno <= borne);

Console.WriteLine("Avec do ... while : PI = {0, 10:f8}", 4 * piSur4);

Console.WriteLine(" --- Fin de do ... while ... ----\n");

}

(6)

static void estimerPIAvecFor(int borne) {

Console.WriteLine("Estimation de PI avec la boucle for ... :");

const int LE_PAS = 2;

int signe = 1;

double piSur4 = 0.0;

for (int deno = 1 ; deno <= borne ; deno += LE_PAS) {

piSur4 += signe / (double) deno ;

signe = -signe;

}

Console.WriteLine("Avec for ... : PI = {0, 10:f8}", 4 * piSur4);

Console.WriteLine(" --- Fin de for ... ----\n");

}

static void Main(string[] args) {

const int MAX_DENO = 555555;

estimerPIAvecWhile(MAX_DENO);

estimerPIAvecDoWhile(MAX_DENO);

estimerPIAvecFor(MAX_DENO);

Console.WriteLine("Valeur PI de Math.PI = {0, 10:f8}", Math.PI);

} }

/* Exécution:

Estimation de PI avec la boucle while : Avec while : PI = 3,14158905

--- Fin de while ... ----

Estimation de PI avec la boucle do ... while : Avec do ... while : PI = 3,14158905

--- Fin de do ... while ... ----

Estimation de PI avec la boucle for ... : Avec for ... : PI = 3,14158905 --- Fin de for ... ----

Valeur PI de Math.PI = 3,14159265 Press any key to continue

*/

Voir les exemples sur les tableaux pour l’instruction foreach

(7)

B) Les tableaux à un seul indice :

1. Déclaration et initialisation :

a) déclaration suivie d’initialisation:

int[] age;

age = new int[]{ 18, 25, 20, 36, 15, 42 } ; b) déclaration suivie d’affectations:

int[] nbCafe = new int[3]; // chaque élément vaut 0 au début

nbCafe[0] = 2; // 2 tasses par jour nbCafe[1] = 0;

nbCafe[2] = 1;

c) déclaration et initialisation:

int[] age = new int[] { 18, 25, 20, 36, 15, 42 } ; d) forme raccourcie de c) :

int[] age = { 18, 25, 20, 36, 15, 42 } ;

age

est un tableau de 6 éléments. Chacun est une variable de type entier :

age[0], age[1], . . ., age[4], age[5]

La longueur (son nombre d’éléments) du tableau des âges est obtenue avec

: age.Length

2. Traitement : on utilise très souvent la boucle for ou foreach

Calculer l’âge moyen du tableau des âges suivants :

int[] age = { 18, 25, 20, 36, 15, 42 } ;

(8)

Solution 1 (avec for)

double somAge = 0.0 ;

for (int i = 0 ; i < age.Length ; i++) somAge += age[i];

double moyAge = somAge / age.Length;

Solution 2 (avec foreach)

double somAge = 0.0 ; foreach (int valeur in age) somAge += valeur;

double moyAge = somAge / age.Length;

On aura plusieurs exemples après avoir étudié la transmission de paramètres.

C) La transmission de paramètres

1. Par valeur ( paramètre d’entrée seulement )

static void echanger ( int a, int b) { int tempo = a;

a = b ; b = tempo;

}

ne fournit que l’information

. . .

int age1 = 18, age2 = 25;

echanger (age1, age2);

Malgré que les valeurs des deux paramètres a et b ont été

bien permutés dans la fonction echanger, on a modifié

sur les copies de age1 et age2 et ces modifications ne sont

pas retenues après cet appel. age1 et age2 sont inchangés

après cet appel. c’est une transmission par valeur.

(9)

2. Par référence ( mot clé ref ) : paramètre d’entrée-sortie

À l’entrée : c’est une donnée

À la sortie : c’est un résultat retourné à l’appel

static void permuter ( ref int a, ref int b) { int tempo = a;

a = b ; b = tempo;

}

fournir de l’information et attendre le résultat

. . .

int age1 = 18, age2 = 25;

permuter (ref age1, ref age2);

Après cet appel, age1 vaut 25 et age2 vaut 18 (la permutation est faite). Veuillez vous assurer qu’avant l’appel, les paramètres disposent déjà de valeurs (ils sont déjà initialisés).

3. Par sortie seulement ( mot clé out )

Avant l’appel, on ne connaît pas sa valeur. Après l’appel, le résultat sera renvoyé.

static void calculer ( int a, out int leDouble, out double laMoitie) { leDouble = 2 * a ;

laMoitie = a / 2.0;

}

transmettre de résultat après cet appel

. . .

int age = 25, doubleAge;

double ageSurDeux;

calculer (age, out doubleAge, out ageSurDeux);

Après cet appel, doubleAge vaut 50 et ageSurDeux vaut 12.5

On utilise cette transmission dans le cas de calcul des résultats dont leurs valeurs sont inconnues avant le calcul.

Réflexion : peut-on programmer la fonction permuter avec le mot clé

(10)

Exemple de constatation (attention au changement de ligne de Word)

/* Fichier Parametre.cs

* (1er exemple sur la transmission de paramètres) * Préparé par LVN, pour IFT 1179

*/

using System;

class Parametre {

// les deux paramètres sont transmis par valeur static void permuter1(int a, int b)

{

Console.WriteLine("--- Dans la methode permuter1 --- : \n");

Console.WriteLine(" au debut a = {0} et b = {1}", a, b);

int tempo = a;

a = b;

b= tempo;

Console.WriteLine(" avant de quitter permuter1, a = {0} et b = {1}", a, b);

Console.WriteLine("--- Fin de methode permuter1 ---\n");

}

// paramètres transmis par référence

// paramètres d'entrée/sortie (données à l'entrée, résultats à la // sortie)

static void permuter2(ref int a,ref int b) {

Console.WriteLine("--- Dans la methode permuter2 --- : \n");

Console.WriteLine(" au debut a = {0} et b = {1}", a, b);

int tempo = a;

a = b;

b= tempo;

Console.WriteLine("avant de quitter permuter2, a = {0} et b = {1}", a, b);

Console.WriteLine("--- Fin de methode permuter2 ---\n");

}

// paramètres transmis par "out"

// paramètres de sortie SEULEMENT (pas de données à l'entrée, // résultats à la sortie)

static void calculer(int a, int b, out int plusPetit,

out int plusGrand, out double moy) { moy = (a + b) / 2.0;

if (a < b) {

plusPetit = a;

plusGrand = b;

} else

(11)

{

plusPetit = b;

plusGrand = a;

} }

static void Main(string[] args) {

int age1 = 18, age2 = 20;

Console.WriteLine("Avant d'appeler permuter1, age1 = {0} et age2 = {1}", age1, age2);

permuter1(age1, age2);

Console.WriteLine("Apres avoir appele permuter1, age1 = {0}

et age2 = {1}", age1, age2);

Console.WriteLine("=> Pas de permutation! (parametres transmis par valeur)\n\n");

age1 = 18; age2 = 20;

Console.WriteLine("Avant d'appeler permuter2, age1 = {0} et age2 = {1}",age1, age2);

permuter2(ref age1,ref age2);

Console.WriteLine("Apres avoir appele permuter2, age1 = {0}

et age2 = {1}", age1, age2);

Console.WriteLine("=> permutation faite! (parametres transmis par reference)\n\n");

int mini, maxi; // 3 valeurs a calculer double moyenne;

calculer(age1, age2, out mini, out maxi, out moyenne);

Console.WriteLine("\nResultats calcules :");

Console.WriteLine("\n - age minimal : {0} ans", mini);

Console.WriteLine("\n - age maximal : {0} ans", maxi);

Console.WriteLine("\n - age moyen : {0} ans", moyenne);

}

}

/* Exécution:

Avant d'appeler permuter1, age1 = 18 et age2 = 20 --- Dans la methode permuter1 --- :

au debut a = 18 et b = 20

avant de quitter permuter1, a = 20 et b = 18 --- Fin de methode permuter1 ---

(12)

--- Dans la methode permuter2 --- :

au debut a = 18 et b = 20

avant de quitter permuter2, a = 20 et b = 18 --- Fin de methode permuter2 ---

Apres avoir appele permuter2, age1 = 20 et age2 = 18

=> permutation faite! (parametres transmis par reference)

Resultats calcules : - age minimal : 18 ans - age maximal : 20 ans

- age moyen : 19 ans Press any key to continue

*/

4. Cas de tableau

Si on effectue de modification du contenu d’un paramètre de type tableau, le contenu du tableau sera changé après l’appel.

Observez la partie du codage suivant et son exécution :

static void Afficher(double[] tab, string message) { Console.WriteLine("\nContenu du tableau des poids " + message + " l'ajout :");

foreach (double valeur in tab)

Console.WriteLine("{0,6:F1}", valeur);

Console.WriteLine();

}

static void Ajouter(double[] poids, double quantite) {

for (int i = 0; i < poids.Length; i++)

poids[i] += quantite;

}

static void Main(string[] args) {

double[] poids = { 65.2, 56.8, 70.3, 65.5 };

Afficher(poids, "avant");

Ajouter(poids, 0.5); // ajouter 0.5 kg à tout le monde Afficher(poids, "apres");

}

(13)

Contenu du tableau des poids avant l'ajout : 65,2

56,8 70,3 65,5

Contenu du tableau des poids apres l'ajout : 65,7

57,3 70,8 66,0

Press any key to continue

On dit souvent que la transmission d’un tableau est par référence (avant l’appel on dispose de son contenu, après l’appel, son contenu puisse modifié).

E) Tableaux et paramètres

Vous trouverez dans cette partie un exemple concernant les notions de base du langage C# y compris les tableaux à un seul indice.

Exemple 1 :

Réaliser un projet en C# permettant de déclarer et initialiser un tableau de 7 tailles suivantes :

1.72, 1.78, 1.68, 1.70, 1.62, 1.65, 1.75

On affiche le contenu de ce tableau, détermine et affiche la taille minimale, la taille maximale et la taille moyenne. On permute la première et la dernière taille puis réaffiche le contenu du tableau des tailles.

Une solution possible :

using System;

class Exemple1 {

(14)

for (int i = 0 ; i < nbElem ; i++)

Console.WriteLine("{0, 2:D}) {1, 8:f2}", i, tableau[i]);

Console.WriteLine();

}

static void Permuter(ref double a, ref double b) {

double tempo = a;

a = b;

b = tempo;

}

static void Main(string[] args) {

double[] taille = { 1.72, 1.78, 1.68, 1.70, 1.62, 1.65, 1.75 };

int nbPers = taille.Length;

Afficher(taille, nbPers, "original");

double tailleMax, tailleMin, tailleMoy;

determiner(taille, nbPers, out tailleMax, out tailleMin, out tailleMoy);

Console.WriteLine("La taille :");

Console.WriteLine(" - minimale : {0, 8:f2}", tailleMin);

Console.WriteLine(" - maximale : {0, 8:f2}", tailleMax);

Console.WriteLine(" - moyennee : {0, 8:f2}", tailleMoy);

Console.WriteLine();

Permuter(ref taille[0], ref taille[nbPers-1]);

Afficher(taille, nbPers, "apres avoir permute la premiere et la derniere taille");

}

static void determiner(double[] tableau, int nbElem, out double maxi, out double mini, out double moyenne)

{

double somme;

somme = mini = maxi = tableau[0];

for (int i = 1; i < nbElem ; i++) {

somme += tableau[i];

if (tableau[i] < mini) mini = tableau[i];

if (tableau[i] > maxi) maxi = tableau[i];

}

moyenne = somme / nbElem;

} }

/* Exécution:

Contenu du tableau original de 7 tailles :

0) 1,72 1) 1,78 2) 1,68

(15)

4) 1,62 5) 1,65 6) 1,75

La taille :

- minimale : 1,62 - maximale : 1,78 - moyennee : 1,70

Contenu du tableau apres avoir permute la premiere et la derniere taille de 7 ta

illes :

0) 1,75 1) 1,78 2) 1,68 3) 1,70 4) 1,62 5) 1,65 6) 1,72

Press any key to continue

*/

Exercice :

Réaliser un projet en C# permettant de déclarer et initialiser le tableau de 7 tailles suivantes :

1.72, 1.78, 1.68, 1.70, 1.62, 1.65, 1.75

et le tableau de sexes de ces personnes :

'F', 'M', 'M', 'F', 'F', 'F', 'M'

On affiche le contenu de ces deux tableaux selon le modèle suivant :

Informations des personnes apres les declarations:

0) 1,72 feminin 1) 1,78 masculin 2) 1,68 masculin 3) 1,70 feminin 4) 1,62 feminin 5) 1,65 feminin 6) 1,75 masculin

On trie selon les tailles et réaffiche le contenu de ces deux tableaux.

On détermine et affiche aussi :

- la taille maximale des femmes - la taille minimale des hommes

On verra plus tard le type

System.Array

de C#

(16)

La signature params :

Le mot clé params signale qu’un dernier paramètre peut recevoir une liste des arguments , à l’appel de type tableau ou des expressions de même type séparées par une virgule. Plus tard, on parlera de paramètres par défaut qui utilisent cette signature params.

static double Somme(params double[] donnee) { double s = 0.0;

foreach (double valeur in donnee) s += valeur;

return s;

}

static void Main(string[] args) {

double x = 6.4, y = 8.1;

double[] taille = { 1.72, 1.78, 1.80, 1.75, 1.70 };

// liste des arguments de type réels à l’appel :

Console.WriteLine("Somme(x, y, x + 2* y) vaut : {0, 6:F2}", Somme(x, y, x + 2* y));

// tableau de réels à l’appel :

Console.WriteLine("La taille moyenne : {0, 6:F2} metre", Somme(taille) / taille.Length);

} . . .

/* Exécution:

Somme(x, y, x + 2* y) vaut : 37,10 La taille moyenne : 1,75 metre Press any key to continue

*/

Références

Documents relatifs

Ce cours a pour objectif d’approfondir les connaissances de HTML des participants et de les familiariser avec la création de sites dynamiques et

Dans un langage de programmation sans orientée objet (Pascal, C, … ), il est interdit d'utiliser le même nom pour deux sous-programmes différents. Les langages C#, C++, JAVA,

/* cette méthode permet de déterminer et de retourner le cercle ayant le rayon le plus grand entre le cercle courant et un autre cercle */. public Cercle plusGrand

Dans object, cette méthode compare selon la référence car les auteurs de cette méthode ne savent rien sur les classes créées plus tard pour comparter le contenu de deux objets.

CopyTo() Copier tous les éléments d’un tableau à une seule dimension à partir d’un indice donné.. B) Surcharge des opérateurs :.. Le Java ne permet pas la surcharge

le constructeur de la classe RectangleVisible appelle le constructeur à deux paramètres de sa classe de base (Rectangle) pour construire un rectangle visible, d’abord comme

Ces deux données sont à exprimer analytiquement et vont fournir les deux relations requises pour pouvoir calculer les deux paramètres... PanaMaths

S’il semble assez naturel de dériver la fonction f, il convient de choisir une expression pratique de f ' ( ) x pour en étudier facilement le signe.. En définitive, la fonction f