vendredi 10 novembre 2017

Affectation et égalité

Confondre entre l'égalité et l'affectation n'est pas rare chez les nouveaux étudiants de la branche. Heureusement, cette confusion finit par disparaître au bout de quelques exercices; mais, des fois, elle persiste.

La cause principale de cette confusion est le lien avec les mathématiques. Cette même cause sera le remède. Le signe utilisé "=", est souvent utilisé pour désigner l'égalité. Mais, en revoyant les maths, est-il vraiment le cas ?

Oublions l'informatique, et revenons vers les math. Le signe "=" est utilisé dans deux types de phrase et n'est jamais mis seul, sans explications.

Le premier type de phrases est du genre :

  • x ∈ N ... (un peu plus loins)... Supposons que x = 1.
  • x ∈ N ... (un peu plus loins)... On met x = 1.
Dans les deux cas, le signe "=" ne peut pas être vu sans le "Supposons que" et "On met". Ainsi, ce type de phrases permet de préciser la valeur exacte de x dans l'ensemble (ou l'intervalle) de définition.

Le deuxième type de phrase est du genre :

U(n) = U(n - 1) + 5 .... si n > 1
            0 ... si n = 1

Dans cette définition (d'une suite), on voit que nous ne connaissons pas la valeur de n, alors on donne les différentes possibilités selon la valeur de n. Cette valeur c'est à "l'utilisateur" de fournir plus tard. Dans ce cas aussi, le signe "=" ne peut pas être vu sans le "si" qui le précède.

En algorithmique (ou en programmation si vous voulez), c'est exactement la même chose :
  • Des fois, on connaît la valeur de notre variable et on veut la préciser à notre programme. Là, il s'agit de l'affectation.
  • Des fois, on ne connaît pas la valeur de la variable au moment de l'écriture du programme; elle sera donnée par l'utilisateur via le clavier, lue à partir d'un fichier ou récupérée depuis Internet, peu importe sa source, l'essentiel c'est qu'on ne connaît pas cette valeur. Ainsi, on demande au programme de vérifier si elles est égale à telle ou telle valeur. Là, il s'agit de la comparaison.
Et puisque nous n'avons pas le luxe d'ajouter des phrases telles que "Supposons que" dans notre code, la solution était de proposer deux signes différents pour distinguer les deux opérations :

En pascal :

a := 4 { définir la valeur de la variable a, affectation }
a = 4 { vérification si la variable a est égale à la valeur, égalité }

En Java :


a = 4 // Définir la valeur de la variable a, affectation
a == 4 // Vérifier si la variable a est égale à la valeur précisée, égalité


jeudi 9 novembre 2017

Calculs simples (partie 2)

Ennoncé de l'exercice :

Ecrire l'algorithme qui permet de calculer la somme, la différence et le produit de deux nombres entiers.

Solution (partie 2):

Nous avons vu dans la première partie, le programme qui permet de calculer la somme, la différence et le produit de deux nombres entiers. Néanmoins, nous avons codé directement les valeurs; tout changement des valeurs nécessitera de modifier le code et de le re-compiler. C'est trop pénible. Alors comment faire pour permettre au programme de récupérer à chaque fois de nouvelles valeurs sans devoir le modifier à chaque fois ?

Cela peut être fait en deux étapes :

La première étape : l'utilisation des variables :

Tout comme en mathématiques, il est possible de définir des variables, un symbole défini sur un ensemble donné et qui peut contenir UNE seule valeur A LA FOIS de cet ensemble. Cette valeur peut changer dans le temps, mais, à un instant donné t, cette valeur est unique.

En effet, si je définit la variable x ∈ N, cela veut dire que x prend sa valeur dans l'ensemble des nombres naturels N, mais il ne prendra qu'une seule valeur à la fois. Une telle déclaration en Pascal sera :


x : Integer;

Et en Java :

int x;

L'ordre peut changer entre les deux langages (symbole de la variable en premier ou bien son type) et même le nom du domaine (entre Integer en Pascal et int "seulement" en Java), néanmoins, l'idée et l'effet des deux déclaration sont exactement les mêmes.
En ajoutant les déclarations à nos codes, nous allons obtenir en Pascal :


Program FaireCalculs;
Var
 a, b, r1, r2, r3 : Integer;
Begin
 a := 5;
 b := 3;

 r1 := a + b;
 r2 := a - b;
 r3 := a * b;

 WriteLn(r1);
 WriteLn(r2);
 WriteLn(r3);
End.

Et en Java :

public class Exemple {
 public static void main(String[] args){
  int a, b, r1, r2, r3;
  
  a = 5;
  b = 3;

  r1 = a + b;
  r2 = a - b;
  r2 = a * b;

  System.out.println(r1);
  System.out.println(r2);
  System.out.println(r3);
 }
}

En utilisant ces variables, nous avons obtenu deux avantages :
  1. Il est maintenant possible de gagner du temps en ne modifiant que les valeurs de a et b (deux valeurs seulement) pour obtenir de nouveaux résultats.
  2. Nous avons séparé le calcul de l'affichage. En effet, les deux actions sont exécutées par des instructions séparées. Cela rend le code plus lisible et plus compréhensible.
Note : Les trois variables r1, r2 er r3 vont occuper 12 octets de votre RAM qui dépasse (probablement) 4 Go (4.294.967.296 octets); alors mettez vous à l'aise et déclarez autant de variables que vous voulez.

La deuxième étape : lecture à partir du clavier :

Si l'écran est la "sortie" principale de l'ordinateur, c'est à dire, le moyen principal qu'il utilise pour nous parler, le clavier est son "entrée" principale c'est à dire, le moyen principal que nous utilisons pour parler à l'ordinateur.

Nous avons déjà demandé à notre programme de nous parler. Nous avons demandé qu'il nous "affiche" quelque chose, certainement, sur sa sortie principale. L'ordre était différent entre les deux langages mais avec le même sens :
En Pascal :

WriteLn();  

En Java :


System.out.println();

Si on ignore la partie "ln" pour le moment, nous auront "write" et "print", au sens de "afficher" les données. Suivant la même idée, nous pouvons demander au programme de recevoir des données de notre part. Pour cela, nous utilisons son entrée principale, c'est à dire le clavier, pour lui parler.

En Pascal : très simple, il arrive à reconnaitre le type de la donnée passée en entrée.


ReadLn(a); {Lire la donnée "a"}

En Java : un peu plus complexe, parce qu'il ne reconnaît pas le type de la donnée, c'est à nous de lui préciser qu'est ce qu'il doit recevoir :


Scanner scanner = new Scanner(System.in); // Ecouter le clavier
a = scanner.nextInt(); // Lire l'entier suivant et le mettre dans la donnée "a"

En intégrant ces notions dans le code précédent, nous aurons le code Pascal :


Program FaireCalcul;
Var
 a, b, r1, r2, r3 : Integer;
Begin
 ReadLn(a);
 ReadLn(b);

 r1 := a + b;
 r2 := a - b;
 r3 := a * b;

 WriteLn(r1);
 WriteLn(r2);
 WriteLn(r3);
End.

Et en Java :


import java.util.Scanner;

public class Exemple {
 public static void main(String[] args){
  int a, b, r1, r2, r3;
  
  Scanner scanner = new Scanner(System.in);  
  a = scanner.nextInt();
  b = scanner.nextInt();

  r1 = a + b;
  r2 = a - b;
  r3 = a * b;

  System.out.println(r1);
  System.out.println(r2);
  System.out.println(r3);
 }
}

A ce stade, notre programme ne définit pas des valeur fixes; il les captent à partir du clavier (c'est l'utilisateur qui les saisit), par conséquent, nous pouvons calculer la somme, la différence et le produit autant de fois que nous voulons et avec de nouvelles valeurs à chaque fois sans avoir à modifier et re-compiler notre programme.

Calculs simples (partie 1)

Énoncé de l'exercice :

Ecrire l'algorithme qui permet de calculer la somme, la différence et le produit de deux nombres entiers.

Solution :


Cet exercice est parmi les premiers exercices à résoudre, il y a pas plus simple mais s'il s'agit du premier exercice de votre vie, alors des explications supplémentaires peuvent être données.

Tout comme en mathématiques, le produit, la différence et le produit prennent deux opérandes; l'opérateur prend sa place entre les deux. Ainsi, Une première idée qui viens en esprit sera le code Pascal suivant :


Program FaireCalculs;
Begin
 5 + 3;
 5 - 3;
 5 * 3;
End.

En Java :


public class Exemple {
 public static void main(String[] args){
  5 + 3;
  5 - 3;
  5 * 3;
 }
}

Mais, ce code est incorrect; faire un calcul sans garder le résultat et sans l'utiliser n'a aucun sens. Mais pourquoi le programme ne l'a pas affiché tout simplement ? Il ne l'a pas affiché parce que nous ne l'avons pas demandé, nous avons mis les opérations seulement. Pour "afficher" le résultat du calcul, il faut le demander explicitement. Ainsi, le programme qui fait le calcul et l'affiche sera en Pascal :


Program FaireCalculs; 
Begin
 WriteLn(5 + 3);
 WriteLn(5 - 3);
 WriteLn(5 * 3);
End.

Et en Java :


public class Exemple {
 public static void main(String[] args){
  System.out.println(5 + 3);
  System.out.println(5 - 3);
  System.out.println(5 * 3);
 }
}

(partie 2)

mercredi 8 novembre 2017

Présentation

Ce blog vise un seul objectif : la publication des codes les plus simples qui constituent l'introduction à l'algorithmique et la programmation. Les exemples plus complexes seront (PROBABLEMENT) publiés sur mon deuxième blog consacré aux activités d'enseignement (par ici).
Ces exemples sont des solutions pour les questions que je trouve périodiquement sur les forums de discussion. La différence est que j'essaierai de porter le chapeau de pédagogue et ainsi, travailler sur les exemples les plus basiques avec l'explication la plus détaillée que je peux donner. La chose que le "climat" de la plupart des forums ne le permet pas.
En effet, sur les forums, la plupart des questions basiques sont l'objet de raillerie. Et si cela ne suffisait pas, les solutions pédagogiques simples proposées sont vites critiquées et modifiées pour être plus optimales tant dit que le contexte de la question est un contexte d'introduction et d'apprentissage et non pas d'optimisation.
Ainsi, ce blog se présente comme un autre espace où un nouveau apprenant peut trouver des solutions à des exercices avec des explications simple.

Note : Tous les codes publiés sont les miens; vous pouvez les utiliser et les adapter. Néanmoins, les exercices ne sont pas les miens et, sauf autre indication, je ne les propose pas, mais je les trouve sur Internet et sur les forums. Pour me simplifier la vie, je ne metterai pas des liens vers des postes sur des forums. Si vous pensez qu'un exercice vous appartient ou bien que vous pensez que la solution doit être enlevée alors prière de me contacter.