ICT-319

Pierre Ferrari

ICT-319 PDF

Références

Référentiel

Identification du module

Matériels

La programmation, c’est quoi ?

La programmation comprend toutes les actions du codage de programmes informatiques destinés à une multitude de systèmes informatiques (logiciels, sites Web, applications mobiles et Web, modules d’extension, etc.). Lors de l’écriture d’un programme, vous devez utiliser un langage de programmation. En outre, un système (logiciels, sites internet, etc.) est un assemblage de programmes (généralement écrits dans différents langages informatiques) à destination des propriétaires de ce système.

De ce fait, la programmation renvoie à l’écriture du code source d’un système informatique. Il est préférable de parler de «développement» pour désigner toutes les opérations liées à la conception du système et aux étapes qui constituent le système. Dans cette optique, il est indispensable de considérer les différentes spécifications du système ainsi que sa création, sa maintenance, les tests de performances, la surveillance et les multitudes de possibilités d’un programme.

La programmation d’un système informatique comprend quatre étapes principales: la conception, l’implémentation, la conversion du code source et enfin les tests finaux du système. La plupart des programmes exécutés sur nos appareils digitaux (smartphones, ordinateurs, tablettes, smart TV, etc.) sont conçus à partir d’un langage de programmation appelé impératif. En d’autres termes, chaque ligne du programme est exécutée dans l’ordre. En fait, les lignes d’un programme exécutent des actions de base ou des fonctions spécifiques. Ce sont ces lignes de programme qui permettent de faire fonctionner les fonctionnalités d’un système.

source: https://sokeo.fr/programmation-informatique-definition/

La notion d’algorithme

Un algorithme est la description d’une suite d’étapes permettant d’obtenir un résultat à partir d’éléments fournis en entrée. Par exemple, une recette de cuisine est un algorithme permettant d’obtenir un plat à partir de ses ingrédients! Dans le monde de plus en plus numérique dans lequel nous vivons, les algorithmes mathématiques permettent de combiner les informations les plus diverses pour produire une grande variété de résultats : simuler l’évolution de la propagation de la grippe en hiver, recommander des livres à des clients sur la base des choix déjà effectués par d’autres clients, comparer des images numériques de visages ou d’empreintes digitales, piloter de façon autonome des automobiles ou des sondes spatiales, etc.

Pour qu’un algorithme puisse être mis en œuvre par un ordinateur, il faut qu’il soit exprimé dans un langage informatique, sous la forme d’un logiciel (souvent aussi appelé « application »). Un logiciel combine en général de nombreux algorithmes : pour la saisie des données, le calcul du résultat, leur affichage, la communication avec d’autres logiciels, etc.

Certains algorithmes ont été conçus de sorte que leur comportement évolue dans le temps, en fonction des données qui leur ont été fournies. Ces algorithmes « auto-apprenants » relèvent du domaine de recherche des systèmes experts et de l’« intelligence artificielle ». Ils sont utilisés dans un nombre croissant de domaines, allant de la prédiction du trafic routier à l’analyse d’images médicales.

Un problème et une solution

Lorsque nous nous trouvons devant notre poste afin de développer une application, nous aurons un problème (consigne, projet, etc…) et nous devrons proposer une solution. Afin de pouvoir proposer une solution, nous allons devoir analyser le problème qui nous est soumis, et développer notre application.

Plus le problème est complexe, plus le programme a réaliser sera long et fastidieux. Son analyse sera également compliquée.

Analogie

On peut faire une analogie avec la construction d’un meuble Ikea. Comme toutes les analogies, celle-ci à ces limites mais elle permet d’illustrer le propos.

La consigne (le problème)

La consigne pour le montage d’un meuble est très simple. Vous avez un ensemble de pièces et de panneaux. Vous devez les transformez en un meuble

Pièces Objectif Résultat
ikea_in_the_box ikea_result

L’analyse (algorithme)

Dans le cas des meubles Ikea, l’analyse à déjà été faite pour vous. C’est le fameux mode d’emploi. On y détail chaque instruction (action) à réaliser pour obtenir le résultat souhaité.

ikea_instructions

Un exemple de l’entrée à la piscine

La consigne (le problème)

C’est l’été et Anita, qui a douze ans, aimerait aller nager à la piscine. Elle prend avec elle son petit frère Jean de six ans. À l’entrée de la piscine est écrite la règle suivante

Qui a le droit d’entrer dans la piscine ?

  1. Anita et Jean
  2. Anita, mais pas Jean
  3. Jean mais pas Anita
  4. Ni Anita ni Jean

L’analyse (algorithme)

La règle de la piscine pose des conditions qui déterminent si quelque chose est permis ou interdit.

  1. Toutes les personnes qui ont 8 ans ou plus ont le droit d’entrer dans la piscine. Comme Anita a plus de 8 ans, elle a le droit d’entrer.
  2. Les personnes qui ont moins de 8 ans peuvent entrer dans la piscine si elles sont accompagnées d’une personne qui a plus de 10 ans. Comme Jean est accompagné d’Anita et qu’Anita a plus de 10 ans, Jean a aussi le droit d’entrer.

Dans ce cas, deux conditions sont posées qui déterminent si une personne à le droit d’entrer ou pas. Si la condition est remplie, alors la personne peut entrer dans la piscine.

On aurait donc aussi pu formuler la règle comme cela:

SI la personne a 8 ans ou plus
   ALORS elle a le droit d'entrer dans la piscine
SINON SI la personne est accompagnée d'une personne de plus de 10 ans
   ALORS elle a le droit d'entrer dans la piscine
SINON elle n'a pas le droit d'entrer

IPO (Input Process Output)

Un programme fonctionnant selon le modèle IPO reçoit une ou plusieurs données en entrée depuis l’utilisateur ou une autre source, effectue un ensemble d’opérations sur ces données et produit un ou plusieurs résultats en sortie.

On représente ce modèle à l’aide d’un schéma bloc d’entrées/sorties.

Exemple de programme

Reprenons l’exemple de la piscine ci-dessus. Le représentation IPO serait la suivante:

Comprendre ce qu’est un programme informatique

Un programme informatique est une liste d’ordres indiquant à un ordinateur ce qu’il doit faire. Il se présente sous la forme d’une ou plusieurs séquences d’instructions, comportant souvent des données de base, devant être exécutées dans un certain ordre par un processeur ou par processus informatique (cas des systèmes multitâches).

L’agent 089

L’agent secret 089 se voit confier la mission de trouver dans combien de jours un chef d’état important doit être assassiné. Son contact l’informe que cette information se trouve dans une série de casiers postaux. Pour empêcher quiconque de percer ce secret, on a dispersé l’information dans douze casiers différents. Son contact lui remet 12 clés et les consignes suivantes

  1. L’information cachée dans chaque casier est codée
  2. Ouvrez le casier 1 en premier, puis suivez les directives que vous y trouverez
  3. Ensuite, faites de même pour tous les autres casiers dans l’ordre, sauf indication contraire dans les consignes

ATTENTION : Un des casiers est piégé, si vous l’ouvrez il explose !

L’agent 089 muni de ses clés et de son guide de décodage se rend au bureau de poste. La figure ci-dessous nous montre le contenu décodé de chacun des 12 casiers postaux. Supposons que vous soyez l’agent 089

💬 Que contient le casier 12 à la fin de ces instructions ?

17

💬 Que pouvez-dire du contenu des casiers 1 à 6 ?

Ils contiennent une action, ce sont les instructions

💬 Que pouvez-dire du contenu des casiers 8 à 12 ?

Ils contiennent les informations

La notion de structogramme

Afin d’aider les développeur dans la conception de programme, c’est-à-dire dans la partie analyse, les développeurs peuvent créer des organigrammes ou des structogrammes.

Un structogramme, quesako ?

Un structogramme permet de représenter graphiquement le déroulement d’un programme. Comme son nom l’indique, le structogramme oblige à créer un programme structuré.

Le structogramme est composé de blocs

Il existe trois types de blocs structurels

Reprenons le suite d’instructions de notre agent secret 089

Voici le structogramme de ces instructions

Pour une personne habituée à lire des structogrammes, il est facile de comprendre ce qui se passe dans ce programme. Pour une personne novice en lecture de structogramme, il est quand même possible de comprendre ce qui se passe 🧐.

Voici un exemple de structogramme plus complexe

En partant de ce structogramme, un programmeur C# peut écrire le programme suivant:

private void Moyenne()
{
    int nbEleves = Convert.ToInt32(Console.ReadLine("Veuillez saisir le nombre d'élèves"));
    while(nbEleves > 0)
    {
        double somme = 0.0;
        int cpt = 0;
        note = Console.ReadLine("Veuillez saisir une note");
        while(note > 0)
        {
            somme = somme + note;
            cpt++;
            note = Console.ReadLine("Veuillez saisir une note");
        }
        double moyenne = somme / cpt;
        Console.WriteLine("La moyenne vaut: {0:f1}", moyenne);
        nbEleves--;
    }
}

Alors qu’un programmeur Javascript pourrait écrire le programme suivant:

const Moyenne = () => {
  let nbEleves = prompt("Veuillez saisir le nombre d'élèves")
  while (nbEleves > 0) {
    let somme = 0.0
    let cpt = 0
    let note = prompt("Veuillez saisir une note")
    while (note > 0) {
      somme = somme + note
      cpt++
      note = prompt("Veuillez saisir une note")
    }
    let moyenne = somme / cpt
    console.log(`La moyenne vaut: ${moyenne.toFixed(1)}`)
    nbEleves--
  }
}

Création de programme

Voici le contenu d’un fichier *.exe. Dans cet exemple c’est WINWORD.EXE ouvert dans Notepad++.

Si on vous demande de réaliser le programme WINWORD.EXE en langage machine (1/0) vous rencontrerez certainement quelques difficultés. Alors comment faire ?

En utilisant un traducteur.

Vous parlez un langage compréhensible et vous demandez au traducteur de traduire ce langage en langage machine.

Terminologie

Langage de programmation

Pour pouvoir faire traduire notre code source au compilateur, il faut que ce dernier puisse le comprendre. On ne peut malheureusement pas encore écrire dans un fichier

Connecte-toi au réseau de l’école et télécharge le fichier “Cours du module.docx”

Le compilateur ne le comprendrait pas ! On doit utiliser une langue (un langage) compris par ce dernier. Il existe beaucoup de langage

Langages de programmations

Chaque langage est associé à un compilateur spécifique. Je ne peux pas utiliser le compilateur associé au langage « A+ » pour compiler un code source écrit en « Boo ».

Chaque langage à ses avantages et ses inconvénients.

LE SUPER LANGAGE N’EXISTE PAS !

C’est quoi un langage de programmation ?

Pour répondre à cette question, on peut se demander c’est quoi un langage ?

Un langage, c’est un ensemble de mots respectant une syntaxe précise. L’agencement de ces mots se fait selon des règles. Il existe des structures permettant d’organiser les mots.

Français

Mots Règles
Bouger, voiture, patate, ma, des Le pluriel d’un nom prend un ‘s’.
Le sujet se place avant le verbe
Une phrase se termine par un ‘.’

Programmation

Mots clés (Keywords) Règles Des structures de contrôles (n’existe pas en français)
if, else, while,string, int L’affectation d’une valeur à une variable se fait avec un ‘=’
Une ligne d’instruction se termine par un ‘;’
Tant que, si/sinon, pour chaque

Du langage machine au langage de haut niveau

Remontons (ou descendons) les niveaux de programmation avec comme exemple un simple « Hello World ! ». Nous allons passer du langage machine en binaire composé de 1 et de 0 à une IA.

Langage machine, le binaire

Ci-dessous, le vrai code binaire pour un Hello World ! affiché dans une console sur Linux pour une architecture x64. Difficile de parler de langage même s’il s’agit du langage machine. C’est le langage de l’ordinateur.

01010101010010001000100111100101010010001000001111101100001100001000
10010111110111011100010010001000100101110101110100000110010001001000
10001011000001000010010100101000000000000000000000000000010010001000
10010100010111111000001100011100000001001000101110000100100001100101
01101100011011000110111100100000010101110110111101001000100010010100
01011110101111000111010001011111001101110010011011000110010000100001
11000110010001011111011100000000010010001000110101000101111010110100
10001000100111000111111010001000001111111110111111111111111110111000
00000000000000000000000000000000010010001000101101010101111110000110
01000100100000110011000101000010010100101000000000000000000000000000
01110100000001011110100001111010111111101111111111111111110010011100
00110000111100011111100001000000000000000000000000000000000000000000

Carte perforée

On est proche du langage machine. On peut interprété un trou comme un 1 et un non trou comme un 0.

Hexadécimale

C’est un présentation condensée du langage binaire. On est ici en base 16.

55 48 89 e5 48 83 ec 30 89 7d dc 48 89 75 d0 64 48 8b 04 25 28 00
00 00 48 89 45 f8 31 c0 48 b8 48 65 6c 6c 6f 20 57 6f 48 89 45 eb
c7 45 f3 72 6c 64 21 c6 45 f7 00 48 8d 45 eb 48 89 c7 e8 83 fe ff
ff b8 00 00 00 00 48 8b 55 f8 64 48 33 14 25 28 00 00 00 74 05 e8
7a fe ff ff c9 c3 0f 1f 84 00 00 00 00 00

Assembleur

Voilà un premier langage de programmation. Dans les années 1990, on programmait encore beaucoup dans ce langage. Maintenant c’est devenu un langage très spécifique dédié à des tâches particulières, notamment, des tâches où la performance est capitale.

On passe de ce langage à un langage machine binaire grâce à un assembleur. C’est l’assembleur qui est le traducteur.

push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x24(%rbp)
mov    %rsi,-0x30(%rbp)
mov    %fs:0x28,%rax

mov    %rax,-0x8(%rbp)
xor    %eax,%eax
movabs $0x6f57206f6c6c6548,%rax ← !dlroW olleH
mov    %rax,-0x15(%rbp)
movl   $0x21646c72,-0xd(%rbp)
movb   $0x0,-0x9(%rbp)
lea    -0x15(%rbp),%rax
mov    %rax,%rdi
callq  570 <puts@plt> ← puts
mov    $0x0,%eax
mov    -0x8(%rbp),%rdx
xor    %fs:0x28,%rdx

je     706 <main+0x5c>
callq  580 <__stack_chk_fail@plt>
leaveq
retq
nopl   0x0(%rax,%rax,1)

C

Issu des laboratoires Bell c’est le langage de base de beaucoup d’autres. C’est un peu le papa des langages modernes. Il nécessite une compilation pour obtenir le langage machine. Il est très performant et proche du matériel. Par contre, il demande au programmeur de bien savoir ce qu’il fait!

#include "stdio.h"

int main(int argc, char** argv)
{
   const char hello[] = "Hello World!";
   printf("%s\n", hello);
   return 0;
}

C#

L’histoire du C# est expliquée plus bas dans ce document. Ce langage nécessite également une compilation. C’est un langage fourre tout qui est parfaitement adapté à l’apprentissage.

using System;

namespace HelloWorld
{
    class Hello
    {
        static void Main()
        {
            string hello = "Hello World!";
            Console.WriteLine(hello);
        }
    }
}

LabView

C’est un langage 100% graphique. Il ressemble à de l’assemblage de Lego. On place des blocs qui ont chacun une fonctionnalité, et on fait transiter le signal d’un bloc à un autre grâce à des fils.

Dans cet exemple, le texte Hello, World est envoyé au terminal de sortie, en l’occurrence, l’écran.

Copilot

On pourrait penser qu’on est arrivé à l’apogée de la programmation avec un langage comme LabView. Et bien c’est sans compter l’IA.

Copilot est un IA qui est basée sur les milliards de lignes de codes présentent sur le site github. Le principe est simple.

On écrit un commentaire indiquant à l’IA ce qu’on souhaite et l’IA va nous donner le code qui fait le travail. Le code ne vous plaît pas, pas de problème, l’IA vous en propose un autre. Faite un tour sur le site pour voir comment ça fonctionne.

CoPilot

Dans Visual Studio, il y a un petit peu de CoPilot. Par exemple, lorsqu’on commence d’écrire un bout de code, CoPilot nous propose une suite de code en grisé. Si ça nous convient, il suffit alors de presser la touche TAB

ChatGPT

Qui n’a pas entendu parler de ChatGPT ? Est-ce que ChatGPT est adapté à créer du code ?

Bien qu’il puisse générer des solutions de codage simples avec une relative facilité, les tâches de programmation complexes peuvent donner lieu à des réponses erronées ou à des résultats inefficaces. Les programmeurs humains doivent superviser et affiner les résultats de ChatGPT avant de les mettre en œuvre.

Voici un exemple des erreurs que ChatGPT peut générer. La question de départ semble simple mais elle ne l’est pas.

ChatGPT

Dans le cas de l’apprentissage de la programmation, ChatGPT peut être un outil intéressant pour trouver des idées de solutions. Il ne faut pas oublier que ChatGPT est un outil d’aide à la décision et non un outil de décision. Il y a donc toujours un contrôle humain derrière.

Durant les travaux écrits vous n’aurez pas accès à ChatGPT

C# alias CSharp alias C++++

Historique

Jusqu’en 2000, la programmation d’application Windows passait soit par les MFC (Microsoft Fundation Class) totalement indigestes! Voyez plutôt un simple fenêtre

Hello World

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{

    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.
    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // All painting occurs here, between BeginPaint and EndPaint.
            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
            EndPaint(hwnd, &ps);
        }
        return 0;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Soit par l’utilisation de Delphi de la société Borland.

Pour rattraper son énorme retard, Microsoft engage Anders Hejlsberg, fondateur de Delphi, et développe Microsoft.NET et C#. Première sortie 2001. C# reprend les concepts extraordinairement faciles de Delphi dans un langage mélangeant les avantages du Java et du C++. C# est sans doute le meilleur langage actuel pour l’apprentissage de la programmation. Si vous pensez qu’il est difficile de programmer en C#, essayez de faire le même programme en C++. Cependant, ce n’est pas forcément le langage que vous utiliserez toujours. Le langage dépendra en grande partie du travail à effectuer.

Compilation et exécution via ligne de commande

Il est important de comprendre ce qui se passe quand on fait une compilation. Pour comprendre ce travail, nous allons le réaliser en ligne de commande.

Suivez précisément les étapes suivantes

  1. Ouvrez une invite de commande. Pour cela, dans la barre de recherche du menu démarrer, écrivez « cmd »

  1. Écrivez D: et pressez ENTER.
  2. Votre invite de commande est maintenant D:\>
  3. Écrivez dotnet -h pour voir l’aide de la commande
  4. Nous souhaitons créer un projet en mode console en choisissant un nom ainsi qu’un dossier de sortie. Quelles sont les options à utiliser ? Et bien -n et -o
D:\>dotnet new console -o HWProject -n HelloWorld
  1. Depuis un explorateur de fichier, vous devriez voir le dossier HWProject à la racine du disque D:\
  2. Dans ce dossier vous trouvez les fichiers HelloWorld.csproj, Program.cs et un sous-dossier obj
  3. Éditer le fichier Program.cs. Vous y trouvez ce contenu
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

On comprend que le programme va écrire une ligne grâce à la commande WriteLine dans la Console avec le texte "Hello, World!"

  1. Il nous reste à traduire ce programme, c’est-à-dire, à le compiler. On réalise l’étape de compilation avec la commande
D:\>cd HWProject
D:\HWProject>dotnet build
MSBuild version 17.3.1+2badb37d1 for .NET
Identification des projets à restaurer...
Tous les projets sont à jour pour la restauration.
HelloWorld -> D:\HWProject\bin\Debug\net6.0\HelloWorld.dll
La génération a réussi.
    0 Avertissement(s)
    0 Erreur(s)
  1. On peut maintenant démarrer le programme
D:\HWProject>dotnet run
Hello, World!

En résumé

Vous venez d’écrire votre premier programme dans un simple fichier texte et vous avez demandé au compilateur de transformer ce fichier texte en un programme exécutable, c’est-à-dire en une suite d’instructions que le processeur de votre machine à exécuté.

Cette méthode peut paraître compliquée mais elle a l’avantage de fonctionner également sur des postes qui n’ont pas d’écran, par exemple… des serveurs. Regardez plutôt ici Hello World tuto. Que se passe-t-il quand vous cliquez sur le bouton Run vert en haut à droite ?

IDE Visual Studio

Un environnement de développement intégré (IDE) est un programme riche en fonctionnalités qui prend en charge de nombreux aspects du développement logiciel. L’IDE Visual Studio est un pavé de lancement créatif que vous pouvez utiliser pour modifier, déboguer et générer du code, puis publier une application. Au-delà de l’éditeur standard et du débogueur fournis par la plupart des IDEs, Visual Studio inclut des compilateurs, des outils d’achèvement de code, des concepteurs graphiques et de nombreuses fonctionnalités supplémentaires pour améliorer le processus de développement logiciel.

L’image précédente montre Visual Studio avec un projet ouvert qui affiche les fenêtres clés et leurs fonctionnalités

Vous trouverez de plus ample détails sur l’IDE Visual Studio ici

Téléchargement. La version Communauté gratuite est suffisante pour nos besoins.

Créer une première application Console dans Visual Studio avec C#

Dans cette courte présentation de l’environnement de développement intégré (IDE) Visual Studio, vous allez créer une application C# simple qui dispose d’une interface utilisateur de type Console.

Source

Création d’un projet

Vous allez d’abord créer un projet d’application C#. Le type de projet inclut tous les fichiers de modèle dont vous aurez besoin au départ.

  1. Ouvrez Visual Studio.
  2. Dans la fenêtre de démarrage, choisissez Créer un projet.
  3. Dans la fenêtre Créer un projet , choisissez le modèle d’Application Console pour C#.
    Attention: si vous sélectionnez Application Console (.NET Framework) vous vous retrouverez à utiliser le mauvais framework! Vous ne devez pas faire ce choix.
  4. Dans la fenêtre Configurer votre nouveau projet, entrez HelloWorld dans la zone Nom du projet et choisissez D:\ pour l’emplacement de sauvegarde. Cocher la case Placer la solution dans le même répertoire. Cliquez sur le bouton Suivant.

Visual Studio ouvre votre nouveau projet. Dans la fenêtre centrale, vous voyez le contenu du fichier Program.cs qui contient le code source de votre application. Vous y trouvez actuellement le code suivant :

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Ce code est un raccourci du code complet suivant :

using System;

namespace HelloWorld;

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}

Exécution de l’application

  1. Cliquez sur le bouton Démarrer pour exécuter l’application.

Il se passe alors plusieurs choses. Dans l’IDE Visual Studio, la fenêtre Outils de diagnostic s’ouvre et une fenêtre Sortie s’ouvre également. En dehors de l’IDE, une Console s’affiche dans laquelle vous trouvez le texte Hello, World!.

Remarques

L’utilisation de Visual Studio se fera toujours par l’ouverture ou la création d’un fichier *.sln. Ce fichier est un fichier de solution. Il contient les informations sur le(s) projet(s), les fichiers, les références, etc.

Parmi tous les fichiers et dossiers générés par Visual Studio, on trouve:

Convention de nommage des variables : camelCase

Le camel case (de l’anglais, littéralement « casse de chameau ») est une notation consistant à écrire un ensemble de mots en les liant sans espace ni ponctuation, et en mettant en capitale la première lettre de chaque mot. La première lettre du premier mot peut être en bas ou haut de casse, selon la convention. Ce terme fait référence aux creux et bosses d’un dos de chameau que représente l’alternance de capitales et de bas-de-casse.

Cette notation est très utilisée en programmation informatique où il est souvent nécessaire de nommer lisiblement des concepts compliqués avec une suite de lettres sans espace ni ponctuation. Cette façon d’écrire est aussi devenue une mode, le marketing ayant généré de nombreuses marques de cette forme, comme MasterCard, PlayStation, iPhone, etc.

Exemple

double volumeCylindre;
int agePersonne;
string nomDeFamille;

Les variables et les constantes

Analogie

Pour comprendre la notion de variable, on peut prendre l’analogie suivante. Imaginons que l’enseignant dit à voix haute le chiffre 1’873’762,72884. Ensuite il vous demande de lire attentivement une partie du cours. Une fois que vous avez terminé la lecture, l’enseignant vous demande quel est le résultat du calcul suivant : Le chiffre donné à haute voix précédemment + 38.

Vous n’y parviendrez pas et c’est bien normal.

Analogie avec l’ordinateur

Un ordinateur effectue des milliards d’instruction à la seconde. Il met à jour l’heure système toutes les microsecondes, dialogue sur le réseau, met à jour l’affichage de l’écran, vérifie qu’aucune clé USB n’a été branchée, reçoit des informations de l’imprimante etc. S’il veut pouvoir faire le même calcul que vous, il aura le même problème que vous. Entre le moment où il reçoit l’information et le moment où on lui demande de faire le calcul, il aura fait tellement de choses qu’il ne se souviendra plus de la valeur !

Humains

Comment pouvez-vous résoudre ce problème ? Nous humains, nous stockons cette information sur un post-it par exemple. Si j’ai un bloc de 100 post-it et que j’écris au crayon, je pourrai stocker 100 valeurs et je pourrai réutiliser mon post-it après l’avoir effacé.

Ordinateur

L’ordinateur fait comme vous. Il a un aussi une sorte de bloc de post-it dans lequel il écrit au crayon. Son bloc est légèrement plus grand puisque de nos jours, les ordinateurs ont souvent plus de 16 milliards de post-it.

Ce bloc se nomme la RAM.

Humain

Prenez un post-it et recopier-y, au crayon, tout votre cours !? Est-ce possible ? Non bien sûr car le post-it à une limite de taille.

Ordinateur

L’ordinateur à le même problème. On ne peut pas mettre n’importe quoi dans n’importe quoi. C’est pourquoi les langages de programmation proposent des types.

Pour chaque type il y a une limite. Faite un tour sur cette page: Types numériques intégral

Voici quelques types de variables

char   c = 'c';         // Unicode 16-bit character soit tous les caractères possibles tels que 'a', 'A', 'µ', '¼', 'س', '彭'
string str = "string";  // N'importe quelle chaîne de caractère (pas de limite en théorie)
int    i = 1;           // Signed 32-bit integer soit -2,147,483,648 à 2,147,483,647
double dbl = 1.0;       // 15-16 digits soit ±5.0 × 10−324 à ±1.7 × 10308
bool   b = true;        // true ou false

L’importance du type

Si on vous montre ceci : 100

Vous arrivez intuitivement à dire qu’il s’agit de la valeur entière cent. On n’a pas besoin de vous préciser le type.

Si on vous montre ceci :

C’est peut-être

Mais aussi

Il est donc important de connaître le type. Si on vous montre un pouce levé en précisant le type valeur entière alors vous recevrez la bonne information à savoir 1.

L’ordinateur à le même problème. Il stock tout en binaire.

Ainsi, le code binaire 01000010 01001111 01000010 00100001 peut signifier :

Il est donc important d’indiquer au programme comment il doit interpréter cette suite binaire. En effet, si je dis au programme stock la valeur 01000010 01001111 01000010 00100001 + 1

Exercice sur les types

Soit les cases ci-dessous

Vous devez placer les valeurs suivantes dans une des cases

Déclarer des variables

En programmation, pour créer une variable, on commence par lui spécifié un type, ensuite on choisit un nom et on lui affecte une valeur

type variableName = value;

OU type est un type C# (tel que int, string …), variableName est le nom de la variable (tel que nomUtilisateur, valeurMoyenne) et le signe égal est utilisé pour attribuer des valeurs à la variable.

Exemples

Créez une variable appelée nom de type string et affectez-lui la valeur “John”

string nom = "John";

Créez une variable appelée nb de type int et affectez-lui la valeur 15

int nb = 15;

Vous pouvez également déclarer une variable sans affecter la valeur, et affecter la valeur plus tard

int nb;
nb = 15;

Notez que si vous affectez une nouvelle valeur 4 une variable existante, elle écrasera la valeur précédente

Remplacez la valeur de nb qui vaut actuellement 15 par 20

int nb = 15;
nb = 20; // nb vaut 20 maintenant

Les types de variables que nous allons utiliser et que vous devrez être en mesure d’utiliser dans vos programmes

int nb = 5;
double nbDecimal = 5.99;
char lettre = 'D';
bool booleen = true;
string texte = "Hello";

Constantes

Vous pouvez aussi déclarer des constantes. Une constante est une variable dont on ne peut pas changer son contenu après coup, cela veut dire qu’elle sera en lecture seule.

Exemple

const int AGE_CHAT = 15;
AGE_CHAT = 20; // !ERREUR
Les constantes seront toujours en MAJUSCULES! Tous les types peuvent être déclaré en constante (int, double, string, …)

Exercice sur les variables

  1. Dans un programme, vous rencontrez la variable moyenne. Rien que par son nom que pouvez-vous savoir sur cette variable ?

  2. Comment déclarer une variable contenant la position verticale d’un objet, représenté par un nombre entier et lui affecter la valeur 2 ?

  3. Déclarez une variable et affectez lui votre prénom :

  4. Placez dans la variable poids la valeur 4.58 :

  5. Placez dans la variable force le résultat du calcul issu de la multiplication de 9.81 par la masse d’une voiture contenu dans la variable masseVoiture :

  6. Écrire sur papier une petite application qui affiche le double d’une variable nombre à laquelle on affecte 1.2 au départ du programme:

Conversion de type

Lorsqu’un type de données est défini pour une variable lors de sa déclaration, la valeur contenue dans cette variable doit être conforme a ce type de données. Il existe cependant diverses situations où la valeur doit être convertie dans un autre type.

Dans la plupart des cas, il s’agit d’une conversion entre les types textes et numériques.

Par exemple, lorsqu’une saisie effectuée par l’utilisateur doit être enregistrée dans une variable numérique ou encore si une variable numérique doit être affichée à l’écran, une conversion est nécessaire.

Exemple

Imaginons le programme suivant

Si vous écrivez la valeur réelle 123.98 vous allez utiliser votre clavier sur lequel sont représentés des caractères et pour obtenir ce chiffre vous allez taper ces touches sur un clavier :

Hors un clavier, ça sert à écrire du texte et du texte, c’est une suite de caractères !

Le programme reçoit donc du texte, plus précisément, la suite de caractères :

'1' '2' '3' '.' '9' '8'

Si vous voyez le chiffre 123.98 comme 123.98 mètres ou 123.98€, l’ordinateur lui voit 1, 2, 3, ., 9, 8 qu’il place dans une chaîne de caractère "123.98".

Pour bien comprendre la différence entre une chaîne de caractères et un nombre réel, prenons la chaîne de caractères suivante :

"Bonjour les programmeurs"

Si je vous pose la question suivante : quel est le résultat de l’addition de cette chaîne de caractères avec 12.76 ?

"Bonjour les programmeurs" + 12.76 = ?

Impossible de répondre ! Et bien pour l’ordinateur, la question ci-dessous :

"123.98" + 12.76 = ?

Est également impossible à résoudre !

Pour qu’il puisse faire ce travail, il faut procéder à une conversion d’un type chaîne de caractères string à un type réel double. Pour afficher une valeur il faudra faire le même travail de conversion puisque l’ordinateur n’est capable d’afficher que du texte.

En programmation C#, il existe un outil qui permet de faire des conversions de type. En réalité on parle d’une classe. Cette classe se nomme Convert.

Les méthodes suivantes, de la classe Convert, permettent de convertir une donnée dans le type spécifié

Exemple de conversion

string texte;
int nb;

texte = "5"; //la variable texte contient la chaine de caractéres "5"
nb = Convert.ToInt32(texte); //la variable nb contient la valeur de type entière
string texte;
double nbDecimal;

texte = "5.6"; //la variable texte contient la chaine de caractéres "5.6"
nbDecimal = Convert.ToDouble(texte); //la variable nbDecimal contient la valeur de type réel
string texte;
double nbDecimal;

nbDecimal = 5.6;
texte = Convert.ToString(nbDecimal); //On peut aussi faire une conversion en string comme ceci
texte = nbDecimal.ToString() //ou comme ceci !

Éviter les conflits de type

Comme vous avez pu le voir dans les exemples précédents, la valeur d’une variable peut être transférée dans une variable d’un autre type grâce aux fonctions de conversion de données Convert.To...(). Il faut cependant que la valeur en question puisse effectivement être convertie dans le type souhaité

Par exemple, la chaine de caractères “5a” ne peut pas être convertie en une valeur entière à cause du “a” qui provoque un conflit de type.

string texte;
int nb;

texte = "5a";
nb = Convert.ToInt32(texte); //ERREUR!!!!!!
Attention au conversion implicite tel que double moyenne = 0. En effet, 0 est une constante entière!
Pour faire de la programmation correctement on doit écrire double moyenne = 0.0

Ex - Erreurs

Le programme ci-dessous contient des erreurs. Trouvez-les et corrigez-les

using system;

namespace Erreurs
{
    class Program
    {
        static void Main(string[] args)
        {
            int valeur = 12
            double age = 20.0;
            string nom = "Walace '¼' Johnson";
            bool bouton = true;
            char premiereLettre = 'W';
            const double PI = 3.141592653;

            age = -3;
            valeur = -2147483648;
            valeur = valeur - 1;
            PI = 3.14159265359;
            nom = "Johnson";
            premiereLettre = strNom;
            age = 1e-23;
            bouton = False;
            bouton = 0;
            Valeur = 0;
            valeur = valeur * age;
            age = age * valeur;
     }
}

Ex - Conversion

💬 Déclarez et initialisez une variable de type chaîne de caractères avec le texte “Hello”

string text = "Hello";

💬 Déclarez et initialisez une variable nommée largeur avec la valeur 23,45

double largeur = 23.45;

💬 Déclarez et initialisez une variable nommée arrondi de type entière avec le contenu de la variable largeur

int arrondi = Convert.ToInt32(largeur);

💬 Quelle est la valeur exacte contenue dans arrondi

23

💬 Un programme possède deux variables. La première se nomme texto et elle contient “123.98”. La seconde se nomme chf et elle contient 12 virgule 76 mètres. On aimerais placer dans texto le résultat de l’addition des deux variables. Comment faire ?

double tmp = Convert.ToDouble(texto);
tmp = tmp + chf;
texto = Convert.ToString(tmp);

Ex - Découverte de la Console

En vous aidant de la documentation officielle Console, répondez aux questions suivantes:

  1. Quelle est(sont) la(es) méthode(s) qui permet(tent) d’afficher du texte à l’écran ?

Console.Write("Texte sur une ligne");
Console.WriteLine("Texte avec retour à la ligne en fin de ligne");
  1. Quelle est la méthode pour faire une saisie d’une chaine de caractères dans la console ?

string texte = Console.ReadLine();
  1. Comment effacer l’écran ?

Console.Clear();
  1. Il y a une méthode qui nous permet de saisir un caractère quelconque. Utilisée pour faire une pause dans le programme en attendant que l’utilisateur presse une touche pour continuer. De quelle méthode s’agit-il ?

Console.ReadKey();

Ex - Saisie et affichage

En complétant le code ci-dessous, créez un programme qui demande à l’utilisateur de saisir la valeur du rayon d’un cercle et qui affiche ensuite la surface de ce cercle.

Veuillez saisir le diamètre du cercle : 10
La surface du cercle est de 78.53
namespace ExerciceCercle
{
    /*
       Program.cs
       But : Programme qui calcul la surface d’un cercle.
       Date : dd/mm/yyyy
       Auteur : Jean Seigne
    */
    class Program
    {
        const double PI = 3.1415;    // Constante PI

        static void Main(string[] args)
        {

            double diameter = 0.0;          // diamètre du cercle dont on calculera la surface
            double surface = 0.0;           // surface calculée du cercle
            string saisie = String.Empty;   // variable pour la saisie de l'utilisateur (on reçoit des caractères)

            /* Affichage de l'objectif du programme */
            Console.WriteLine("Programme qui calcul la surface d’un cercle.");
            Console.WriteLine("--------------------------------------------\n");

            /* Affichage d’un message à l'utilisateur */
            Console.Write("Veuillez saisir le diamètre du cercle : ");

            /* Récupération de la saisie */
            saisie = Console.ReadLine();

            /* Conversion de type */
            /* A VOUS DE FAIRE LE TRAVAIL */

            /* Calcul de la surface.
                La formule pour calculer la surface d'un cercle est :
                surface = rayon au carré multiplié par le nombre π (pi)
            */
            /* A VOUS DE FAIRE LE TRAVAIL */

            /* Affichage du résultat */
            Console.WriteLine("La surface du cercle est de {0:f2}", surface);

            /* On signal que le programme à terminé son travail */
            Console.WriteLine("\n\nAppuyez sur une touche pour terminer...");

            /* On attend que l'utilisateur appuie sur une touche */
            Console.ReadKey();
        }
    }
}

💬 À quoi sert le caractère \n ?

c’est un caractère de contrôle qui permet d’afficher un retour à la ligne (colonne C)

💬 Que signifie la suite de caractères {0:f2} ?

Il s’agit d’un format qui permet d’afficher un nombre réel avec 2 chiffres après la virgule

Ex - Cursor position

Dans la classe Console, il existe des méthodes (Methods) qui permettent de déplacer le curseur de la console. De même, il existe des propriétés (Properties) qui permettent de connaître la taille de la fenêtre en terme de lignes et de colonnes.

Par exemple, selon la documentation de la propriété Console.WindowWidth, on comprend qu’elle permet de connaître le nombre de colonnes de la fenêtre de la console.

Console.WindowWidth Property

Definition

Gets or sets the width of the console window.

Property Value

Int32

The width of the console window measured in columns.

On vous demande de réaliser un programme qui déplace le curseur aux 4 coins de la fenêtre de la console et qui affiche un caractère de votre choix à chaque fois.

En Pseudo-code ça donne ceci:

Récupère le nombre de colonnes de la fenêtre
Récupère le nombre de lignes de la fenêtre
Déplace le curseur en haut à gauche (première colonne, première ligne)
Affiche le caractère 'A'
Déplace le curseur en haut à droite (dernière colonne, première ligne)
Affiche le caractère 'B'
Déplace le curseur en bas à droite (dernière colonne, dernière ligne)
Affiche le caractère 'C'
Déplace le curseur en bas à gauche (première colonne, dernière ligne)
Affiche le caractère 'D'

Variable globale, qu’est-ce que c’est ? 🤨

Une variable globale est simplement une variable qui peut être utiliser dans toutes les méthodes de notre classe.

Voici comment on la déclare:

class Program
{ // <─────────────────────────────────────────────────────────────────────────┐
    int nb = 0; // Cette variable est utilisable partout depuis cette accolade ┘

    static void Main(string[] args)
    {
        nb = 12;// Elle existe ici
    }

    static void DoubleMoi()
    {
        nb = nb * 2;// Elle existe aussi ici
    }
} // <─ Jusqu'à celle-ci

Au contraire d’une variable locale qui n’existe que dans la portée de déclaration

class Program
{
    nb = 24;// ici elle n'existe pas et ça déclenche une exception 💥

    static void Main(string[] args)
    {// <────────────────────────────────────────────────────────────────────────────┐
        int nb = 0; // Cette variable est utilisable uniquement entre cette accolade ┘
    }// <─────────────────────────────────────────────────────────────── et celle-ci

    static void DoubleMoi()
    {
        nb = nb * 2;// ici elle n'existe pas et ça déclenche une exception 💥
    }
}

Ex - Addition de nombres entiers

Concevoir un programme qui permet l’addition de deux nombres entiers demandés par le programme et qui affiche le résultat.

Ex - Addition de nombres mixtes

Concevoir un programme qui permet l’addition d’un nombre entier avec un nombre réel, tous les deux demandés par le programme et qui affiche le résultat.

Les opérateurs

Il existe plusieurs types d’opérateurs.

Les opérateurs de comparaisons

Opérateur Description Utilisation
== Égalité a == b
!= Différent de a != b
> Plus grand que a > b
>= Plus grand ou égal à a >= b
< Plus petit que a < b
<= Plus ou petit ou égal à a <= b
! NOT (inverseur) !expr1
|| OR expr1 || expr2
&& AND expr1 && expr2

Ils seront expliqués plus tard dans ce document.

Les opérateurs arithmétiques

Opérateur Description Utilisation
++ Incrément a++, ++a
-- Décrément a--, --a
* / + - Opération arithmétique a + b, a / b
% Modulo fournit le reste (d): a / b = c reste d
= Affectation a = b
+= -= *= /= %= Affectation abrégée a += b équivalent de a = a + b

Priorité des opérateurs

Priorité Opérateurs Description Sens
1 () Parenthèses
2 ++ -- Incrément/décrément
2 ! Non unaire
2 (type) Conversion de type (cast)
2 - Moins unaire
2 * / % Opérations arithmétiques
2 + - Opérations arithmétiques
2 < <= > >= Opérateur relationnels
2 == != Opérateur relationnels
3 && Et logique
4 || Ou logique
5 = += -= *= /= %= Assignations

Sens se lit ainsi

A cause des priorités, le code suivant

if(val1 == 2 || val1 == 3 && val1 == 4)
{

}

revient au même que

if(val1 == 2 || (val1 == 3 && val1 == 4))
{

}
1.0 / 3 * 5 revient à faire (double) / (int) * (int) = 1.666 (double) alors que
1 / 3 * 5 revient à faire (int) / (int) * (int) = 0 (int)
Type Opération Type Type Exemple
int / int = int 2/3=0
double / double = double 3.0/2.0=1.5
int / double = double 1/2.0=0.5
double / int = double 3.0/2=1.5

Exercice sur les opérateurs

Réaliser sur papier les calculs suivants en précisant les types pour chaque valeurs.

Exemple: 3 * 3 / 2.0 = 4.5 (double)

💬 1.5 * 3 / 2.0 = __

2.25 (double)

💬 10 * 5 / 2 = __

25 (int)

💬 3 * 3.0 / 2.0 = __

4.5 (double)

💬 5 * 5 * 2.0 = __

50 (double)

💬 7 % 3 = __

1 (int)

💬 +3.0 / -2 * +6.0 - -2 = __

-7 (double)

💬 (9 - 3) / 2 = __

3 (int)

💬 (9 - 3) / 2.0 = __

3 (double)

💬 (2 * 5) * (9 / 4) = __

20 (int)

Ex - opérateurs

Transcrivez en C# les opérations suivantes :

💬 Incrémentez la variable entière valEntier de 1

valEntier++

💬 Décrémentez la variable entière valEntier

valEntier--

💬 Additionner 2 à la variable entière valEntier

valEntier+=2 OU valEntier=valEntier+2

💬 Soustraire 3 de la variable entière valEntier

valEntier-=3 OU valEntier=valEntier-3

💬 Multipliez par 3.0 la variable double valReel

valReel*=3.0 OU valReel=valReel*3

💬 Placez dans result le double de ce qu’il y a dans saisieEntier

result=saisieEntier*2

💬 x prend la valeur de x + 1

x++ OU x=x+1 OU x+=1

💬 xx divisé par 4

x=x/4 OU x/=4

💬 valy modulo 4

val=y%4

💬 Décrémentez compteur et placez son contenu dans result en une seule ligne de commande

result=--compteur

Structures de contrôles

Dans tous les langages de programmation, il existe des structures de contrôle permettant de définir le chemin parcourus par le programme. Au lieu d’avoir un chemin linéaire qui avance instruction par instruction, on peut lui faire faire des embranchements, des boucles de répétitions.

Ainsi, au lieu d’un simple programme linéaire

graph LR;
    A[instruction1]-->B;
    B[instruction2]-->C[instruction3];

On peut faire des programmes complexes tels que

graph LR;
    A[instruction1] --> B;
    B{condition}
    B -->|si condition vraie| C;
    B --si condition fausse--> D;
    D[instruction2] --> E;
    C[instruction2'] --> E;
    E[instruction3] --> F
    F[instruction4] --> G;
    G[instruction5] --> H;
    H{condition} -- tant que condition vrai--> F;
    H --> I[instruction7];

Parmi les structures abordées dans ce cours, on trouve

if/[else], switch, while, do-while, for, foreach, méthodes, try/catch/finally

Bloc d’aiguillage multiple (switch)

Le bloc d’aiguillage multiple est l’équivalent à plusieurs if imbriqués, lorsqu’il s’agit de tester toujours la même variable avec l’opérateur d’égalité.

Structogramme

Canevas

switch (variable)
{
    case valeur1:   instruction 1;
        break;
    case valeur2:   instruction 2;
        break;
    case ...
    default: instruction 5;
        break;
}

Exemple

switch (note)
{
    case 6: Console.WriteLine("Excellent !\n");
        break;
    case 5: Console.WriteLine("Très bien\n ");
        break;
    case 4: Console.WriteLine("Suffisant\n ");
        break;
    case 1:
    case 3:
    case 2: Console.WriteLine("Insuffisant\n ");
        break;
    default: Console.WriteLine("Erreur ! \n ");
        break;
}
En C#, le switch peut être utilisé avec des variables de type entier, caractère ou chaîne de caractères.

Bloc d’aiguillage à deux voies (if…else)

Le bloc d’aiguillage à deux voies nous permet d’effectuer un choix entre deux opérations ou un bloc d’opérations par rapport à une condition. Si la réponse posée dans la condition est vraie (ou oui), instruction 1 et suivantes sont effectuées, si la réponse est fausse (ou non) le programme passe par instruction 2. La branche de droite peut être éventuellement vide et un trait horizontal est alors placé dans la case correspondante. Il s’agit alors d’un if sans else et c’est pour cette raison que le else si dessous est entre []. Ces crochets signifient optionnel.

Structogramme

Canvas

if(condition)
{
    instructions 1;
}
[else
{
    instructions 2;
}]

Remarques

Tables de vérité

ET (&&)

Générique

Valeur Gauche && Valeur Droite => Sortie

G D Sortie
false false false
false true false
true false false
true true true

OU (||)

Générique

Valeur Gauche || Valeur Droite => Sortie

G D Sortie
false false false
false true true
true false true
true true true

Les instructions situées dans le bloc qui suit else sont les instructions qui seront exécutées si la ou les conditions du if ne sont pas remplies.

Exemple

int age = anneeActuelle - anneeNaiss;
if(age < 65)
{
    Console.WriteLine("Vive la jeunesse");
}
else
{
    Console.WriteLine("Vive la retraite");
}

Ex - IF imbriqué

Soit le structogramme suivant

Réalisez le programme, uniquement de la partie du structogramme ci-dessus, sur papier en respectant les indentations

int age = anneeActuelle - anneeNaiss;
if(age < 65 && age > 18)
{
    lblResultat.Text = "Vive la vie professionnelle";
}
else
{
    if (age > 65)
    {
        lblResultat.Text = "Vive la retraite";
    }
    else
    {
        lblResultat.Text = "Vive la jeunesse";
    }
}

Ex1 - Nombre positif

Écrire un programme qui demande un nombre à l’utilisateur et qui affiche si ce nombre est positif ou négatif. Pour rappel, un nombre est positif si il est supérieur à 0.

Ex2 - Nombre pair

Écrire un programme qui demande un nombre à l’utilisateur et qui affiche si ce nombre est pair ou impair. Pour rappel, un nombre est pair si le reste de sa division par deux est égale à 0 (modulo).

Ex3 - Billet pour le théâtre

On doit déterminer le prix d’un billet de théâtre selon l’âge de la personne. Faire un programme qui

Ex4 - Plage de valeurs

Écrire un programme qui demande un nombre à l’utilisateur et qui affiche « Nombre OK » si ce nombre est compris entre 10 (y.c) et 20 (y.c). Vous n’avez droit qu’à un seul if.

Ex5 - Scala

Soit le structogramme suivant qui détermine le prix d’un billet au Scala selon l’âge du spectateur.

Coder le programme. Quelles sont les valeurs de tests que vous allez entrer dans votre programme pour le tester ?

Ex6 - FunCar

L’utilisation de l’attraction FunCar est autorisée pour les personnes ayant une taille comprise entre 1.20m et 1.81m. Écrire un programme qui indique « Accès autorisé » ou « Accès refusé » selon la taille saisie.

Ex7 - Rabais

Créez un programme qui demande un prix et qui affiche le rabais.

Prix < 100 CHF : pas de rabais
Prix entre 100 et 150 CHF : rabais 20%
Prix plus grand que 150 CHF : rabais 30%

Ex - Opérateurs

Soit les codes suivants

Question 1

if (nouveauMembres > 225 && nbTelechargements > 10000 || nouveauMembres <= 100 && nbTelechargements > 25000)
{
    text = "Lancement de l'application réussi!";
}

💬 Quels sont les valeurs nécessaires dans nouveauMembres et nbTelechargements pour stocker le message dans la variable text ?

( (nbTelechargements 10001 et plus) ET (nouveauMembres 226 et plus) ) OU ( (nbTelechargement 25001 et plus) ET (nouveauMembres 100 et moins) )

Question 2

if (nouveauMembres > 225 || nbTelechargements > 10000 && nouveauMembres <= 100 || nbTelechargements > 25000)
{
    text = "On est pas content du lancement de l'application!";
}

💬 nouveauMembres = 225 et nbTelechargements = 25000. Est-ce qu’on passe dans le IF pour changer la valeur de la variable text ?

Non

Question 3

Soit le programme suivant

int commandesDuMois = 99;
int commandesDuMoisPasser = 111;
if (!(commandesDuMois > (commandesDuMoisPasser * 0.9)))
{
    text = "Nous somme en dessous de l'objectif.";
}

💬 Est-ce que la variable text contient le message “Nous somme en dessous de l’objectif.” ?

Oui

Itérations - les instructions d’itérations (boucles - répétitions)

Itération avec test à la fin (do..while)

L’itération avec test à la fin est une boucle qui nous permet d’y entrer dans tous les cas au moins une fois et tant que la condition est remplie, on continue dans la boucle.

Structogramme

Canevas

do
{
    instruction 1;
    ...
}
while(condition);

Exemple

do
{
    num = Convert.ToInt32(Console.ReadLine());
    resultat = num * num;
    Console.WriteLine("voici la valeur élevée au carré: {0:f2}", resultat);
}
while (num != 0);

Ex1 - Affichage multiple

Créez les programmes ci-dessous :

Ex2 - Livret

Réalisez le code qui permet d’affichez le livret entré par l’utilisateur et ceci jusqu’à jusqu’à 12.

Programme livret.
-----------------

Veuillez saisir le livret : 5
1 x 5 = 5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
7 x 5 = 35
8 x 5 = 40
9 x 5 = 45
10 x 5 = 50
11 x 5 = 55
12 x 5 = 60

Ex3 - Analyse de code

Soit le code suivant

result = 12.23;
compteur = 0;
do
{
    result = Math.Sqrt(result) + compteur * 5 % 3;
    compteur++;
    // quels sont les contenus des variables à ce moment ?
}
while (compteur < 5);
result compteur
 
 
 
 
 
 
Après la boucle
 

Ex4 - Analyse de code

Sans coder le programme, indiquer ce qui sera affiché à l’écran lorsque l’on exécute ce programme en saisissant les nombres suivants : -5, -1, 8, 3

static void Main(string[] args)
{
    int nb = 0;
    int essai = 0;
    do
    {
        essai++;
        Console.Write("Entrez un nombre positif - tentative {0} : ", essai);
        nb = Convert.ToInt32(Console.ReadLine());
    }
    while (nb < 0);
    Console.WriteLine("Saisie du nombre positif {1} après {0} essai{2}", essai, nb, essai > 1 ? "s" : "");

    Console.WriteLine("\n\nAppuyez sur une touche pour terminer...");
    Console.ReadKey();
}

💬 Que signifie ce bout de code essai > 1 ? "s" : "" ?

Si essai est plus grand que 1, alors on affiche un “s”, sinon on affiche rien opérateur ternaire

Ex5 - Analyse et structogramme

Soit le code ci-dessous:

static void Main(string[] args)
{
    int livret;
    int compteur;
    Console.WriteLine("Boucles - Exercice 5");
    Console.WriteLine("====================");
    do
    {
        Console.Write("Saisir un nombre entier compris entre 1 et 12 : ");;
        livret = Convert.ToInt32(Console.ReadLine());
    }
    while (livret < 1 || livret > 12);
    // while (!( (livret >= 1) && (livret <= 12) ));

    // Calcul et affichage du livret
    compteur = 1;
    Console.WriteLine("\nLivret de {0}", livret);
    Console.WriteLine("===============");
    do
    {
        Console.WriteLine("{0} * {1} = {2}", compteur, livret, compteur * livret);
        compteur++;
    }
    while (compteur <= 12);

    // Fin du programme
    Console.Write("\nPresser une touche pour terminer le programme ... ");
    Console.ReadKey();
}

Dessiner le structogramme correspondant.

💬 Que signifie cette chaîne de formattage {0, 2:d} * {1, 2:d} = {2, 3:d} ?

Il s’agit d’un format d’alignement

Itération avec test au début (while)

Quelle différence y a-t-il entre la boucle while et la boucle do..while ?

Si la condition est remplie, le programme entre dans la boucle et instruction 1 et suivante sont effectuée. Tant que la condition est remplie, on reste dans la boucle.

Structogramme

Canvas

while (condition)
{
    instruction 1
    ...
}

Exemple

while (num != 0)
{
    num = Convert.ToInt32(Console.ReadLine());
    resultat = num * num;
    Console.WriteLine("voici la valeur élevée au carré: {0:f2}", reslutat);
}

Ex1 - Affichage multiple

C’est le même exercice que celui avec l’autre boucle while. Ca permet de comprendre que ce qu’on peut faire avec une boucle, on peut aussi le faire avec l’autre.

Créez les programmes ci-dessous :

Ex2 - Plus Grand Diviseur Commun

Pour déterminer le Plus Grand Diviseur Commun à deux nombres, il faut soustraire le plus petit du plus grand tant que les deux nombres sont différents. Dès qu’ils sont égaux, l’un des deux nombres est alors le PGDC. Cette description conduit au structogramme suivant

Ex3 - Conditions

Soit le code suivant

int nombreA, nombreB;
bool test;
double nombreX;
nombreA = 12;
nombreB = -5;
test = true;
nombreX = 15.58;
if (CONDITION)

Comme vous pouvez le constater, il manque la condition. Complétez le tableau ci-dessous en déterminant si la condition serait vraie ou fausse.

Condition Résultat
(nombreA <= 15)  
(nombreA < nombreB)  
(nombreA == nombreB)  
(test)  
(nombreX >= 16.0)  
(nombreB <= nombreA - 17)  
(nombreA > nombreB && nombreA < 100)  
(!test)  
(nombreA > 12)  
(nombreA < -15 || nombreA > 15)  
(!((nombreA < -15 || nombreA > 15)))  
(nombreA >= -15 && nombreA <= 15)  
(!(nombreA <= 12))  
(nombreA == nombreB)  
(nombreA < nombreB || nombreB < 0)  
(nombreB != 0)  
(nombreX < 16.0)  

La boucle for

La boucle for permet de faire plusieurs fois une ou plusieurs instructions. Au premier passage val_début est affectée à variable. À la fin de chaque tour variable est augmenté d’un incrément (PPD signifie “par pas de”). Incrément vaut souvent 1, mais il peut être un nombre quelconque positif ou négatif. Par convention, on utilise généralement i comme nom de variable de contrôle. Le programme recommence la boucle tant que variable n’a pas atteint val_fin.

Structogramme

Canvas

for(variable = val_debut ; variable ?? val_fin ; incrémente variable)
{
    instruction 1;
    ...
}

Exemple

int total = 0;
for(int i=0; i < 4; i++)
{
    total += i;
}

En action

Regardez attentivement le fonctionnement de la boucle for et notamment les espions en bas de l’image.

Ex1 - Affichage multiple, le re-retour

C’est le même exercice que celui avec les boucles while. Ca permet de comprendre que ce qu’on peut faire avec une boucle, on peut aussi le faire avec l’autre.

Créez les programmes ci-dessous :

Ex2 - Boucles FOR

⚠️ ATTENTION: tout ces problèmes doivent être résolu par une ou plusieurs boucle for. Il n’est pas permis de faire:

Console.WriteLine("  1\n  2\n  3\n  4\n  5\n  6\n  7\n  8\n  9\n 10");

Problème A

Affichez les nombres de 1 à 10, chacun sur une ligne, sur 3 positions, complétée par des espaces à gauche. Le caractère ˽ symbolise un espace.

˽˽1
˽˽2
˽˽3
˽˽4
˽˽5
˽˽6
˽˽7
˽˽8
˽˽9
˽10

Une solution possible

for(int i = 1; i <= 10;i++)
{
    Console.WriteLine("{0,3}", i);
}

Problème B

Afficher les nombres allant de 10 à 1 complétés par des 0 à gauche.

010
009
008
007
006
005
004
003
002
001

Problème C

Afficher les nombres impaires compris entre 1 et 10.

1
3
5
7
9

Problème D

Afficher ceci.

1
22
333
4444
55555
666666
7777777
88888888
999999999

Ex3 - Notes

Créer un programme qui demande de saisir des notes (le nombre de notes devra être renseigné par l’utilisateur en début de programme). Le programme devra calculer et afficher la moyenne de ces notes ainsi que le nombre de notes insuffisantes (en dessous de 4) saisies par l’utilisateur.

Les notes ne seront valables que si elles se trouvent entre 1 et 6 compris. Ces deux valeurs doivent être des constantes.

Programme de calcul de moyenne.
-------------------------------

Veuillez saisir le nombre de notes : 5
Veuillez saisir la note 1 : 7
Veuillez saisir la note 1 : -4
Veuillez saisir la note 1 : 5
Veuillez saisir la note 2 : 0
Veuillez saisir la note 2 : 4
Veuillez saisir la note 3 : 5
Veuillez saisir la note 4 : 2
Veuillez saisir la note 5 : 6
La moyenne est de 4.40

Les tableaux

Vous pouvez stocker plusieurs variables du même type dans une structure de données de type tableau. Vous déclarez un tableau en spécifiant le type de ses éléments. Après avoir déclaré un tableau, vous pouvez l’initialiser en utilisant une liste d’initialisation ou en utilisant des valeurs d’index individuelles.

Un tableau possède les propriétés suivantes :

Syntaxe générale

Déclaration

type[] nomDuTableau;

Initialisation

nomDuTableau = new type[taille];

Initialisation avec valeurs

type[] nomDuTableau = new type[taille] {valeur1, valeur2, valeur3, ...};

Exemple

// Déclaration d'un tableau à une dimension contenant 5 entiers.
// Les 5 entiers sont initialisés à 0 par défaut
int[] tableau1 = new int[5];

// Déclaration d'un tableau avec initialisation des 5 valeurs.
int[] tableau2 = new int[] { 1, 3, 5, 7, 9 };

// Syntaxe simplifiée possible.
int[] tableau = { 1, 2, 3, 4, 5, 6 };

// Accès à la première variable du tableau3
int copiePremiere = tableau[0];

// Accès à la dernière variable du tableau3
int copieDerniere = tableau[5];

// On peut changer la valeur d'une variable du tableau
tableau[2] = -100;
// Maintenant, tableau contient les valeurs 1, 2, -100, 4, 5, 6

La boucle for est particulièrement bien adaptée au parcours des tableaux.

int[] tableau = { 1, 2, 3, 4, 5, 6 };
for(int i = 0; i < tableau.Length; i++)
{
    Console.WriteLine("la variable {0} contient la valeur {1}", i, tableau[i]);
}

Parfois, une image vaut milles mots

Ex1 - Bâteaux

Créer un programme qui demande à l’utilisateur le nombre de passager de cinq bateaux, qui stock ces valeurs dans un tableau et qui affiche ensuite la moyenne des passagers.

Déclarer un tableau de int de cinq éléments

int[] bateau = new int[5];

L’utilisateur remplit le nombre de passager des cinq bateaux. Le programme place les valeurs de l’utilisateur dans le tableau déclaré auparavant.

for(...)
{
    Console.WriteLine("Combien de passagers pour le bateau {0} ?", i + 1);
    bateau[i] = Convert.ToInt32(Console.ReadLine());
}
...

Ex2 - Affichage, Min, Max, Moyenne

Un programme contient la déclaration globale suivante

int[] tab = new int [] {4,12,-53,19,-11,60,-24,12,-89,19};

Réalisez un programme qui:

Ex3 - Affichage, Min, Max, Moyenne (bis)

C’est le même exercice que le précédent mais cette fois, le tableau est remplit avec des valeurs aléatoires comprises entre -100 et 100.

const int SIZE = 10;
Random rnd = new Random(DateTime.Now.Millisecond);
int[] tab = new int[SIZE];
for(int i = 0; i < tab.Length; i++)
{
    tab[i] = rnd.Next(-100, 101);
}

Ex4 - Groupe de personnes

Soit un groupe de personnes, par exemple, un groupe What’s app. Créez un programme qui demande un nom à l’utilisateur et qui affiche si ce nom fait partie du groupe ou non.

string[] groupeWhatsapp = new string[] { "John", "Maria", "Hiroshi","Sofia", "Ahmed", "Lena", "Pablo", "Anika", "Matteo", "Léa" };
int[] nbMessages = new int[] {10, 34, 2, 50, 12, 4, 81, 42, 52, 3};
Programme de recherche de nom.
------------------------------

Veuillez saisir un nom : Sofia
Sofia fait partie du groupe elle a envoyé 50 messages

Ex5 - Modification de chaine

Réalisez un programme qui demande à l’utilisateur de saisir une chaine de caractère et qui affiche cette chaine de caractère en remplaçant les lettres par la lettre suivante dans l’alphabet. Tous les ‘a’‘A’ par des ‘b’‘B’, tous les ‘b’‘B’ par des ‘c’‘C’ etc…

Programme de modification de chaine.
-----------------------------------

Veuillez saisir une chaine de caractère : Bonjour les pinguins
Cpokvps mft qjohjhot

Remarques

Pensez à la table ascii

Gestion des erreurs try…catch

La structure de récupération d’erreur try-catch permet de récupérer une erreur générée par le code. Plus précisément cela nous permet de traiter l’exception qui a été levée.

Cela se produit généralement lors des opérations de conversion telles que:

int valeur = Convert.ToInt32("123abc");

Lorsqu’une erreur survient dans la partie try, l’exécution continue directement dans le catch. Dans le cas où aucune erreur n’est survenue le contenu du catch n’est pas exécuté.

int valeur;
try
{
    valeur = Convert.ToInt32("123abc");
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

Imaginons une application qui permet de saisir deux nombres et qui affiche le résultat de l’addition de ces deux nombres.

Programme d'addition.
---------------------

Veuillez saisir le premier nombre : 12
Veuillez saisir le second nombre : 34
Le résultat de l'addition est : 46

Voici le code:

int nb1 = 0;
int nb2 = 0;
int resultat = 0;

nb1 = Convert.ToInt32(Console.ReadLine());
nb2 = Convert.ToInt32(Console.ReadLine());
resultat = nbl + nb2;
Console.WriteLine("Le résultat de l'addition est : {0}", resultat);

Imaginez, maintenant, que l’utilisateur saisisse autre chose que des caractères numériques, par exemple “123a1”. Que va-t-il se passer ?

Pour se protéger de ce genre d’erreur, il existe la structure try-catch qui permet d’essayer (try) d’exécuter un bloc d’instructions et en cas d’erreur (exception), se faire attraper (catch).

Si on met en place un seul bloc try-catch, on sera en mesure de traiter l’Exception qui aurait fait planter le programme. Par contre, il sera difficile de savoir où se situe l’erreur. En effet, dans le code ci-dessus, on saura que l’utilisateur à entré un valeur erronée mais on ne saura pas lequelle. Pour le savoir, il faut mettre en place plusieurs try-catch.

Gestion globale

int nb1 = 0;
int nb2 = 0;
int resultat = 0;

try
{
    nb1 = Convert.ToInt32(Console.ReadLine());
    nb2 = Convert.ToInt32(Console.ReadLine());
    resultat = nbl + nb2;
    Console.WriteLine("Le résultat de l'addition est : {0}", resultat);
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

Gestion plus fine

int nb1 = 0;
int nb2 = 0;
int resultat = 0;

try
{
    nb1 = Convert.ToInt32(Console.ReadLine());
}
catch(Exception ex)
{
    Console.WriteLine("Le premier nombre est incorrect");
}

try
{
    nb2 = Convert.ToInt32(Console.ReadLine());
}
catch(Exception ex)
{
    Console.WriteLine("Le second nombre est incorrect");
}

resultat = nbl + nb2;
Console.WriteLine("Le résultat de l'addition est : {0}", resultat);

Ex1 - Gestion des erreurs

Créez un programme qui permet de diviser deux nombres de type double et qui affiche le résultat dans la console.

Si le nombre à diviser ne peut pas être convertit en double (erreur de frappe), faite en sorte que le programme gère l’erreur avec un message indiquant à l’utilisateur que sa saisie est fausse sinon le programme effectue le calcul.

⚠️ Respectez le format d’affichage du résultat !

Programme de division.
----------------------

Veuillez saisir le premier nombre : 12
Veuillez saisir le second nombre : 34
Le résultat de la division est : 0.35
Programme de division.
----------------------

Veuillez saisir le premier nombre : 12
Veuillez saisir le second nombre : 0B

Erreur de saisie

Ex2 - Gestion des erreurs

Soit un programme qui demande l’année de naissance de l’utilisateur et qui affiche son âge.

Programme de calcul d'âge.
--------------------------

Veuillez saisir votre année de naissance : 1980
Vous avez 40 ans
Programme de calcul d'âge.
--------------------------

Veuillez saisir votre année de naissance : 1980A

Erreur de saisie

Pour obtenir l’année courante, vous pouvez utiliser le code ci-dessous:

int annenCourante = DateTime.Now.Year;

Introduction aux méthodes

Une méthode est un bloc de code qui contient une série d’instructions. On peut l’assimiler à une fonction d’une machine à calculer. D’ailleurs, dans certains langages comme par exemple le PHP, on parle de fonctions et pas de méthodes.

Prenons l’exemple de l’élévation au carré . La fonction correspond alors à un ensemble d’instruction qui nous permettrons d’élevé au carré une valeur.

void AuCarre()
{
    int n = 3;
    int powTwo = n * n;
}

La méthode se nomme AuCarre. Elle ne retourne aucune valeur et élève au carré la valeur 3.

Pour notre machine à calculer ce n’est pas idéale car on souhaite pouvoir élever n’importe quelle valeur au carré et pas seulement 3.

On va donc ajouter un paramètre. Le paramètre est en réalité, une variable locale à la méthode. Elle n’existe que dans la méthode. On peut lui donner le nom que l’on veut. On respectera la notation de type camelCase.

static void AuCarre(int v)
{
    int powTwo = v * v;
}

Cette fois, notre méthode est capable d’élever au carré la valeur contenue dans la variable v. Oui mais… comment est-ce qu’on met une valeur dedans ? Et bien on le fait lors de l’appel de la méthode.

static void AuCarre(int v)
{
    int powTwo = v * v;
}

static void Main(string[] args)
{
    int valeur = Convert.ToInt32(Console.ReadLine());
    AuCarre(valeur);
}

On voit dans cet exemple que le programme récupère la valeur de l’utilisateur, la convertit en valeur entière et la passe comme paramètre à la méthode AuCarre. Ainsi, si l’utilisateur entre le texte “6”, la méthode recevra dans sa variable locale v la valeur entière 6. Elle fera le calcul 6 * 6 égale 36 et elle placera le résultat dans powTwo. Oui mais comment est-ce qu’on fait pour récupérer le résultat du calcul ? Et bien on utilise un canal de retour.

static int AuCarre(int v)
{
    int powTwo = v * v;
    return powTwo;
}

static void Main(string[] args)
{
    int valeur = Convert.ToInt32(Console.ReadLine());
    AuCarre(valeur);
}

Voilà ! C’est près… enfin, pas tout à fait. En effet, l’utilisateur peut vouloir élever au carré la valeur 3.5. Il faut donc qu’on change les types!

static double AuCarre(double v)
{
    double powTwo = v * v;
    return powTwo;
}

static void Main(string[] args)
{
    double valeur = Convert.ToDouble(Console.ReadLine());
    AuCarre(valeur);
}

Quelques remarques

Les méthodes permettent de créer du code réutilisable, ce qui représente une approche intéressante. De plus, elles permettent d’associer un nom à une partie du code, nom qui idéalement doit décrire au mieux le traitement effectué.

Nous pouvons toujours essayer d’écrire un programme sans utiliser de méthodes, c’est possible… mais si le programme devient long, le code va devenir ingérable.

Syntaxe générale

canal_retour identificateur([[type parametre[,...]])
{
    instructions…
    [return;]
}

Les méthodes sur le site de Microsoft

Ex1 - Les méthodes

Nous allons créer un programme qui donnera le nombre de lettre choisie par l’utilisateur contenu dans notre prénom.

Il est impératif d’utiliser un méthode pour faire cela. Nous pourrions nous en passer, mais l’exercice est fait pour comprendre comment déclarer et utiliser une méthode.

Voici le code permettant de faire le travail sans méthode :

int nbLettre = 0;
prenom = prenom.ToLower();
for (int i = 0;i < prenom.Length;i++)
{
     if (prenom[i] == lettre)
     {
        nbLettre++;
     }
}
Console.WriteLine("Le prénom contient {0} fois la lettre {1}", nbLettre, lettre);

A vous de transformer ce code en méthode.

Ex2 - Comptage de voyelles

Soit un programme qui contient une chaîne de caractères contenant un lorem ipsum.

string loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.";

Réalisez les méthodes suivantes:

/// Cette méthode recoit une chaine de caractères contenant un lorem ipsum.
/// Elle retourne une valeur entière indiquant le nombre de 'aA' qu'il y a dans la chaine reçue en paramètre
int CompteLesA(string loremIpsum)
/// Cette méthode recoit une chaine de caractères contenant un lorem ipsum.
/// Elle retourne une valeur entière indiquant le nombre de voyelles qu'il y a dans la chaine reçue en paramètre
int CompteLesVoyelles(string loremIpsum)
/// Cette méthode recoit une chaine de caractères contenant un lorem ipsum.
/// Elle retourne un tableau de valeurs entières indiquant le nombre de voyelles qu'il y a dans la chaine reçue en paramètre.
/// Dans la cellule 0, il y a le nombre de 'aA'
/// Dans la cellule 1, il y a le nombre de 'eE'
/// Etc.
int[] CompteLesVoyelles(string loremIpsum)

Ex3 - La trigonométrie

Réalisez un programme qui demande à l’utilisateur les valeurs de a et de b. Ces valeurs sont des valeurs réelles. Une fois en possession de ces valeurs, le programme calcul l’hypoténuse avec la célèbre formule

c=(a2+b2) c=\sqrt(a^2+b^2)

Cette formule traduite en C# correspond à

double c = Math.Sqrt(a * a) + (b * b));

Le calcul se déroule dans la méthode ayant pour signature

double hypo(double a, double b)

En cas d’erreur, le programme affiche un message indiquant quelle est l’erreur. Par exemple, le message indiquera si c’est a ou b qui est faux.

Débogage

Les codes fournit ci-dessous ne fonctionnent pas correctement. A vous de trouver les erreurs et de les corriger.

Ex1

static void Main(string[] args)
{
    // Déclaration du tableau
    int[] tab;
    // Déclaration du compteur de boucle
    int i;

    // On remplit le tableau avec des valeurs aléatoires
    Random rnd = new Random(DateTime.Now.Millisecond);

    // On commence à la fin et on revient jusqu'à la première case
    for(i = tab.Length; i < 0; --i)
    {
        tab[i++] = rnd.Next(-100, 101);
    }

    // Affichage du tableau
    do
    {
        Console.WriteLine("Tableau[{0}] : {1}", i, tab[i]);
    }
    while(i < tab.Length)

    // On attend que l'utilisateur presse une touche pour terminer
    ReadKey();
}

Ex2

using System;

namespace ExerciceBug
{
    class Program
    {
        static void Main(string[] args)
        {
            int nbPersonnes, compteur;


            Console.WriteLine("Bienvenue !!");
            Console.WriteLine("*********************************************");

            Console.Write("Combien de personne contient votre classe ? ");
            nbPersonnes = Convert.ToInt32(Console.ReadLine());

            string[] tabPrenoms = new string[nbPersonnes];

            for (compteur = 0; compteur > nbPersonnes; compteur++)
            {
                Console.Write("Veuillez entrer le prénom de l'éleve n° {0} : ", compteur + 1);
                tPrenom[compteur] = Console.ReadLine();
            }

            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Votre classe est composé de {0} personnes et leur prénoms sont : ", nbPersonnes);

            do
            {
                Console.WriteLine("{0}", tPrenom[compteur]);
            }
            while (compteur < nbPersonnes);

            Console.ReadKey();
        }
    }
}

Ex3

using System;tPrenom

namespace Rabais
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Programme de calcul de rabais");
            Console.WriteLine("=============================");

            try
            {
                Console.Write("Entrer le montant brut [Frs]: ");
                double net = 0.0;
                int brut = 0;
                string valeurUtilisateur = Console.ReadLine();
                brut = Convert.ToInt32(valeurUtilisateur);

                // Si plus de 250.- alors 4% de rabais
                // sinon, pas de rabais
                net = brut;
                if (brut > 250)
                {
                    net = brut - 4 / 100;
                }
                net = 0.0;
                Console.WriteLine("Vous devez {0:F2} Frs", net);

            }
            catch
            {
                Console.WriteLine("Vérifiez votre saisie ...");
            }
        }
    }
}