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/
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.
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.
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 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 |
---|---|---|
![]() |
➔ | ![]() |
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é.
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 ?
La règle de la piscine pose des conditions qui déterminent si quelque chose est permis ou interdit.
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
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.
Reprenons l’exemple de la piscine ci-dessus. Le représentation IPO serait la suivante:
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 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
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 ?
💬 Que pouvez-dire du contenu des casiers 1 à 6 ?
💬 Que pouvez-dire du contenu des casiers 8 à 12 ?
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 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;
ReadLine("Veuillez saisir une note");
note = Console.while(note > 0)
{
somme = somme + note;
cpt++;ReadLine("Veuillez saisir une note");
note = Console.
}double moyenne = somme / cpt;
WriteLine("La moyenne vaut: {0:f1}", moyenne);
Console.
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 + note
somme ++
cpt= prompt("Veuillez saisir une note")
note
}let moyenne = somme / cpt
console.log(`La moyenne vaut: ${moyenne.toFixed(1)}`)
--
nbEleves
} }
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.
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
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 !
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.
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 ‘.’ |
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 |
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.
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
On est proche du langage machine. On peut interprété un trou comme un 1
et un non trou comme un 0
.
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
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
$0x6f57206f6c6c6548,%rax ← !dlroW olleH
movabs mov %rax,-0x15(%rbp)
$0x21646c72,-0xd(%rbp)
movl $0x0,-0x9(%rbp)
movb lea -0x15(%rbp),%rax
mov %rax,%rdi
570 <puts@plt> ← puts
callq mov $0x0,%eax
mov -0x8(%rbp),%rdx
xor %fs:0x28,%rdx
je 706 <main+0x5c>
580 <__stack_chk_fail@plt>
callq
leaveqretq
0x0(%rax,%rax,1) nopl
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!";
"%s\n", hello);
printf(return 0;
}
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!";
WriteLine(hello);
Console.
}
} }
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.
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.
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
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.
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
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.
// Window class
CLASS_NAME, L"Learn to Program Windows", // Window text
// Window style
WS_OVERLAPPEDWINDOW,
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
// Parent window
NULL, // Menu
NULL, // Instance handle
hInstance, // Additional application data
NULL
);
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:
0);
PostQuitMessage(return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
1));
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+
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.
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
D:
et pressez ENTER
.D:\>
dotnet -h
pour voir l’aide de la commande-n
et -o
D:\>dotnet new console -o HWProject -n HelloWorld
HWProject
à la racine du disque D:\
HelloWorld.csproj
, Program.cs
et un sous-dossier obj
Program.cs
. Vous y trouvez ce contenu// See https://aka.ms/new-console-template for more information
WriteLine("Hello, World!"); Console.
On comprend que le programme va écrire une ligne grâce à la commande WriteLine
dans la Console
avec le texte "Hello, World!"
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)
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 ?
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.
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
.
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.
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
WriteLine("Hello, World!"); Console.
Ce code est un raccourci du code complet suivant :
using System;
namespace HelloWorld;
internal class Program
{static void Main(string[] args)
{WriteLine("Hello, World!");
Console.
} }
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!
.
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:
*.sln
: le fichier de solution*.csproj
: le fichier de projetProgram.cs
: le fichier sourceobj
: le dossier contenant les fichiers intermédiaires de compilationbin
: le dossier contenant les fichiers binairesbin\Debug\netX.0
: le dossier contenant les fichiers binaires de débogage pour le framework .NET X.0bin\Release\netX.0
: le dossier contenant les fichiers binaires de production pour le framework .NET X.0Le 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;
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
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 :
5.1814579010009765625E1
si le type est réel1'112'490'529
si le type est entierBOB!
si c’est une chaîne de caractèresIl 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
1
. Il y aura donc une Exception 💥1'112'490'530
😎BOB!
+ 1 🤔Soit les cases ci-dessous
Vous devez placer les valeurs suivantes dans une des cases
1
"1"
'1'
'1.0'
"1.0"
1.0
1,0
true
vrai
false
faux
"Bonjour"
'Bonjour'
"Bonjour 1"
"Bonjour '100'"
-2000000000
3000000000
1.7E+3
"1.7E+3"
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;
15; nb =
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;
20; // nb vaut 20 maintenant nb =
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;
20; // !ERREUR AGE_CHAT =
int
, double
, string
, …)
Dans un programme, vous rencontrez la variable moyenne
. Rien que par son nom que pouvez-vous savoir sur cette variable ?
Comment déclarer une variable contenant la position verticale d’un objet, représenté par un nombre entier et lui affecter la valeur 2 ?
Déclarez une variable et affectez lui votre prénom :
Placez dans la variable poids
la valeur 4.58 :
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
:
Écrire sur papier une petite application qui affiche le double d’une variable nombre
à laquelle on affecte 1.2
au départ du programme:
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é
ToDouble
converti en un nombre réelToInt32
converti en un nombre entierToString
converti en une chaine de caractèresExemple de conversion
string texte;
int nb;
"5"; //la variable texte contient la chaine de caractéres "5"
texte = ToInt32(texte); //la variable nb contient la valeur de type entière nb = Convert.
string texte;
double nbDecimal;
"5.6"; //la variable texte contient la chaine de caractéres "5.6"
texte = ToDouble(texte); //la variable nbDecimal contient la valeur de type réel nbDecimal = Convert.
string texte;
double nbDecimal;
5.6;
nbDecimal = ToString(nbDecimal); //On peut aussi faire une conversion en string comme ceci
texte = Convert.ToString() //ou comme ceci ! texte = nbDecimal.
É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;
"5a";
texte = ToInt32(texte); //ERREUR!!!!!! nb = Convert.
double moyenne = 0
. En effet, 0
est une constante entière!double moyenne = 0.0
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;
-3;
age = -2147483648;
valeur = 1;
valeur = valeur - 3.14159265359;
PI = "Johnson";
nom =
premiereLettre = strNom;1e-23;
age =
bouton = False;0;
bouton = 0;
Valeur =
valeur = valeur * age;
age = age * valeur;
} }
💬 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
💬 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;ToString(tmp); texto = Convert.
Console
En vous aidant de la documentation officielle Console, répondez aux questions suivantes:
Write("Texte sur une ligne");
Console.WriteLine("Texte avec retour à la ligne en fin de ligne"); Console.
string texte = Console.ReadLine();
Clear(); Console.
ReadKey(); Console.
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 : 1053 La surface du cercle est de 78.
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 */
WriteLine("Programme qui calcul la surface d’un cercle.");
Console.WriteLine("--------------------------------------------\n");
Console.
/* Affichage d’un message à l'utilisateur */
Write("Veuillez saisir le diamètre du cercle : ");
Console.
/* Récupération de la saisie */
ReadLine();
saisie = Console.
/* 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 */
WriteLine("La surface du cercle est de {0:f2}", surface);
Console.
/* On signal que le programme à terminé son travail */
WriteLine("\n\nAppuyez sur une touche pour terminer...");
Console.
/* On attend que l'utilisateur appuie sur une touche */
ReadKey();
Console.
}
} }
💬 À quoi sert le caractère \n
?
C
)
💬 Que signifie la suite de caractères {0:f2}
?
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.
Gets or sets the width of the console window.
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)
{12;// Elle existe ici
nb =
}
static void DoubleMoi()
{2;// Elle existe aussi ici
nb = nb *
}// <─ Jusqu'à celle-ci }
Au contraire d’une variable locale qui n’existe que dans la portée de déclaration
class Program
{24;// ici elle n'existe pas et ça déclenche une exception 💥
nb =
static void Main(string[] args)
// <────────────────────────────────────────────────────────────────────────────┐
{int nb = 0; // Cette variable est utilisable uniquement entre cette accolade ┘
// <─────────────────────────────────────────────────────────────── et celle-ci
}
static void DoubleMoi()
{2;// ici elle n'existe pas et ça déclenche une exception 💥
nb = nb *
} }
Concevoir un programme qui permet l’addition de deux nombres entiers demandés par le programme et qui affiche le résultat.
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.
Il existe plusieurs types d’opérateurs.
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.
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é | 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
x * y
, *
est de sens ← c’est donc y
qui va multiplier x
val = 12
, =
est de sens ← c’est donc 12
qui va être placer dans val
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 que1 / 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 |
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
= __
💬 10 * 5 / 2
= __
💬 3 * 3.0 / 2.0
= __
💬 5 * 5 * 2.0
= __
💬 7 % 3
= __
💬 +3.0 / -2 * +6.0 - -2
= __
💬 (9 - 3) / 2
= __
💬 (9 - 3) / 2.0
= __
💬 (2 * 5) * (9 / 4)
= __
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
💬 x
← x
divisé par 4
x=x/4
OU x/=4
💬 val
← y
modulo 4
val=y%4
💬 Décrémentez compteur
et placez son contenu dans result
en une seule ligne de commande
result=--compteur
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
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;
}
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)
{1;
instructions
}else
[
{2;
instructions }]
Remarques
&&
et ||
)
if (condition1 && condition2)
exécutera les instructions du bloc vrai (V / VRAI / TRUE) si les deux conditions sont vraiesif (condition1 || condition2)
exécutera les instructions du bloc vrai si l’une ou l’autre des deux conditions est vraieET (&&)
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)
{WriteLine("Vive la jeunesse");
Console.
}else
{WriteLine("Vive la retraite");
Console. }
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)
{Text = "Vive la vie professionnelle";
lblResultat.
}else
{if (age > 65)
{Text = "Vive la retraite";
lblResultat.
}else
{Text = "Vive la jeunesse";
lblResultat.
} }
É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.
É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).
On doit déterminer le prix d’un billet de théâtre selon l’âge de la personne. Faire un programme qui
É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
.
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 ?
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.
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%
Soit les codes suivants
Question 1
if (nouveauMembres > 225 && nbTelechargements > 10000 || nouveauMembres <= 100 && nbTelechargements > 25000)
{"Lancement de l'application réussi!";
text = }
💬 Quels sont les valeurs nécessaires dans nouveauMembres
et nbTelechargements
pour stocker le message dans la variable text
?
Question 2
if (nouveauMembres > 225 || nbTelechargements > 10000 && nouveauMembres <= 100 || nbTelechargements > 25000)
{"On est pas content du lancement de l'application!";
text = }
💬 nouveauMembres
= 225 et nbTelechargements
= 25000. Est-ce qu’on passe dans le IF
pour changer la valeur de la variable text
?
Question 3
Soit le programme suivant
int commandesDuMois = 99;
int commandesDuMoisPasser = 111;
if (!(commandesDuMois > (commandesDuMoisPasser * 0.9)))
{"Nous somme en dessous de l'objectif.";
text = }
💬 Est-ce que la variable text
contient le message “Nous somme en dessous de l’objectif.” ?
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
{1;
instruction
...
}while(condition);
Exemple
do
{ToInt32(Console.ReadLine());
num = Convert.
resultat = num * num;WriteLine("voici la valeur élevée au carré: {0:f2}", resultat);
Console.
}while (num != 0);
Créez les programmes ci-dessous :
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
Soit le code suivant
12.23;
result = 0;
compteur = do
{Sqrt(result) + compteur * 5 % 3;
result = Math.
compteur++;// quels sont les contenus des variables à ce moment ?
}while (compteur < 5);
result | compteur |
---|---|
Après la boucle | |
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++;Write("Entrez un nombre positif - tentative {0} : ", essai);
Console.ToInt32(Console.ReadLine());
nb = Convert.
}while (nb < 0);
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();
Console. }
💬 Que signifie ce bout de code essai > 1 ? "s" : ""
?
Soit le code ci-dessous:
static void Main(string[] args)
{int livret;
int compteur;
WriteLine("Boucles - Exercice 5");
Console.WriteLine("====================");
Console.do
{Write("Saisir un nombre entier compris entre 1 et 12 : ");;
Console.ToInt32(Console.ReadLine());
livret = Convert.
}while (livret < 1 || livret > 12);
// while (!( (livret >= 1) && (livret <= 12) ));
// Calcul et affichage du livret
1;
compteur = WriteLine("\nLivret de {0}", livret);
Console.WriteLine("===============");
Console.do
{WriteLine("{0} * {1} = {2}", compteur, livret, compteur * livret);
Console.
compteur++;
}while (compteur <= 12);
// Fin du programme
Write("\nPresser une touche pour terminer le programme ... ");
Console.ReadKey();
Console. }
Dessiner le structogramme correspondant.
💬 Que signifie cette chaîne de formattage {0, 2:d} * {1, 2:d} = {2, 3:d}
?
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)
{1
instruction
... }
Exemple
while (num != 0)
{ToInt32(Console.ReadLine());
num = Convert.
resultat = num * num;WriteLine("voici la valeur élevée au carré: {0:f2}", reslutat);
Console. }
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 :
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
Soit le code suivant
int nombreA, nombreB;
bool test;
double nombreX;
12;
nombreA = -5;
nombreB = true;
test = 15.58;
nombreX = 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
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)
{1;
instruction
... }
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.
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 :
⚠️ ATTENTION: tout ces problèmes doivent être résolu par une ou plusieurs boucle for
. Il n’est pas permis de faire:
WriteLine(" 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n 10"); Console.
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++)
{WriteLine("{0,3}", i);
Console. }
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
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 : 640 La moyenne est de 4.
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 :
new
. Ces valeurs ne peuvent pas être modifiées pendant la durée de vie de l’instance.int
ou double
sont définies à zéro, et les éléments de type référence comme les string
ont la valeur null
.n
éléments est indexée de 0
à n-1
.Syntaxe générale
Déclaration
type[] nomDuTableau;
Initialisation
new type[taille]; nomDuTableau =
Initialisation avec valeurs
new type[taille] {valeur1, valeur2, valeur3, ...}; type[] nomDuTableau =
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
2] = -100;
tableau[// 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++)
{WriteLine("la variable {0} contient la valeur {1}", i, tableau[i]);
Console. }
Parfois, une image vaut milles mots
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(...)
{WriteLine("Combien de passagers pour le bateau {0} ?", i + 1);
Console.ToInt32(Console.ReadLine());
bateau[i] = Convert.
} ...
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:
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;
new Random(DateTime.Now.Millisecond);
Random rnd = int[] tab = new int[SIZE];
for(int i = 0; i < tab.Length; i++)
{Next(-100, 101);
tab[i] = rnd. }
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
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
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
{ToInt32("123abc");
valeur = Convert.
}catch(Exception ex)
{WriteLine(ex.Message);
Console. }
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;
ToInt32(Console.ReadLine());
nb1 = Convert.ToInt32(Console.ReadLine());
nb2 = Convert.
resultat = nbl + nb2;WriteLine("Le résultat de l'addition est : {0}", resultat); Console.
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
{ToInt32(Console.ReadLine());
nb1 = Convert.ToInt32(Console.ReadLine());
nb2 = Convert.
resultat = nbl + nb2;WriteLine("Le résultat de l'addition est : {0}", resultat);
Console.
}catch(Exception ex)
{WriteLine(ex.Message);
Console. }
Gestion plus fine
int nb1 = 0;
int nb2 = 0;
int resultat = 0;
try
{ToInt32(Console.ReadLine());
nb1 = Convert.
}catch(Exception ex)
{WriteLine("Le premier nombre est incorrect");
Console.
}
try
{ToInt32(Console.ReadLine());
nb2 = Convert.
}catch(Exception ex)
{WriteLine("Le second nombre est incorrect");
Console.
}
resultat = nbl + nb2;WriteLine("Le résultat de l'addition est : {0}", resultat); Console.
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 : 3435 Le résultat de la division est : 0.
Programme de division.
----------------------
Veuillez saisir le premier nombre : 12
Veuillez saisir le second nombre : 0B
Erreur de saisie
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;
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é x²
. 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
CamelCase
.Console.WriteLine(...)
dans une méthode car cela la lierait aux programmes de type Console
.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.
identificateur([[type parametre[,...]])
canal_retour
{
instructions…return;]
[ }
Les méthodes sur le site de Microsoft
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;
ToLower();
prenom = prenom.for (int i = 0;i < prenom.Length;i++)
{if (prenom[i] == lettre)
{
nbLettre++;
}
}WriteLine("Le prénom contient {0} fois la lettre {1}", nbLettre, lettre); Console.
A vous de transformer ce code en méthode.
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)
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
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.
Les codes fournit ci-dessous ne fonctionnent pas correctement. A vous de trouver les erreurs et de les corriger.
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
new Random(DateTime.Now.Millisecond);
Random rnd =
// On commence à la fin et on revient jusqu'à la première case
for(i = tab.Length; i < 0; --i)
{Next(-100, 101);
tab[i++] = rnd.
}
// Affichage du tableau
do
{WriteLine("Tableau[{0}] : {1}", i, tab[i]);
Console.
}while(i < tab.Length)
// On attend que l'utilisateur presse une touche pour terminer
ReadKey();
}
using System;
namespace ExerciceBug
{class Program
{static void Main(string[] args)
{int nbPersonnes, compteur;
WriteLine("Bienvenue !!");
Console.WriteLine("*********************************************");
Console.
Write("Combien de personne contient votre classe ? ");
Console.ToInt32(Console.ReadLine());
nbPersonnes = Convert.
string[] tabPrenoms = new string[nbPersonnes];
for (compteur = 0; compteur > nbPersonnes; compteur++)
{Write("Veuillez entrer le prénom de l'éleve n° {0} : ", compteur + 1);
Console.ReadLine();
tPrenom[compteur] = Console.
}
Clear();
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Votre classe est composé de {0} personnes et leur prénoms sont : ", nbPersonnes);
Console.
do
{WriteLine("{0}", tPrenom[compteur]);
Console.
}while (compteur < nbPersonnes);
ReadKey();
Console.
}
} }
using System;tPrenom
namespace Rabais
{class Program
{static void Main(string[] args)
{WriteLine("Programme de calcul de rabais");
Console.WriteLine("=============================");
Console.
try
{Write("Entrer le montant brut [Frs]: ");
Console.double net = 0.0;
int brut = 0;
string valeurUtilisateur = Console.ReadLine();
ToInt32(valeurUtilisateur);
brut = Convert.
// Si plus de 250.- alors 4% de rabais
// sinon, pas de rabais
net = brut;if (brut > 250)
{4 / 100;
net = brut -
}0.0;
net = WriteLine("Vous devez {0:F2} Frs", net);
Console.
}catch
{WriteLine("Vérifiez votre saisie ...");
Console.
}
}
} }