Programmation

2022 - Mars

durée estimée 9h

Formateur: Philippe Vincent

Métier : artisan numérique

Quelques langages informatiques que j’utilise régulièrement

Ruby, Bash, Typescript, Markdown, Html, Css

Récemment

Rust, Haxe

Qui êtes-vous ?

Présentez-vous

Prénom – Nom

État des connaissances

Qu’avez-vous retenu du précédent cours de programmation ?

PLAN

Le matin

  • de la théorie
  • quelques exercices théoriques
  • un peu de pratique

L’après-midi

  • un jeu de carte
  • plus de pratique
  • évaluation

COPYLEFT

LICENCE ART-LIBRE

Le copyleft est l’autorisation donnée par l’auteur d’un travail soumis au droit d’auteur d’utiliser, d’étudier, de modifier et de diffuser son œuvre, dans la mesure où cette même autorisation reste préservée.

Autrement dit, les nouvelles créations réalisées à partir d'œuvres sous copyleft héritent de fait de ce statut de copyleft : ainsi, ce type de licence permet un partage de la création ou de la connaissance, comme bien commun, qui permet aux œuvres culturelles d'être développées librement.

Quelques révisions

… ensemble

Down arrow

Des synonymes de programmation ?

Savez-vous comment sont réalisés nos programmes ?

Langages informatiques

Vs

Langages de programmation ?

Le langage Assembleur

instructions pour le processeur

MOV AX, 10    ; stocke la valeur 10 dans le registre AX
MOV BX, 101   ; stocke la valeur 11 dans le registre BX
ADD AX, BX    ; additionne le registre AX et BX

spécifique pour une gamme de processeur

  • 8bits / 16bits / 32bits / 64bits
  • Intel (ordinateur) / ARM (téléphone) / …

Assembleur, langage de bas niveau pour dialoguer en direct avec la machine

Pourquoi ne pas tout faire en assembleur ?

CODE SOURCE

ça veut dire quoi ?

Est-ce qu’on a accès au code source de tous les programmes ?

Différentes protection du code source ?

Existe-t-il des plateformes pour faciliter l’accès au code source dit “ouvert” ?
Down arrow

LOGICIEL LIBRE Vs OPEN SOURCE

Le logiciel libre est un pot commun auquel chacun peut ajouter quelque chose mais duquel personne ne peut rien retirer.

– Eben Moglen

Compilation Vs Interprétation

Rapidité

Accès en lecture

La machine de Turing

machineTuring

La base théorique de tout ordinateur

Le codage binaire

représentation des nombres

	BASE 10 => BASE 2				    8 cases
	=================				===============
	      0 => 0					0 1 2 3 4 5 6 7	
	      1 => 1
	      2 => 10
	      3 => 11
	      4 => 100
              ...		
	      8 => 1000 		        8 bits   = 1 octet
	     16 => 10000		     1024 octets = 1 Ko (kilo-octet)
	     32 => 100000		     1024 Ko     = 1 Mo (méga-octet)
	     64 => 1000000		     1024 Mo     = 1 Go (giga-octet)
	    128 => 10000000		     1024 Go     = 1 To (téra-octet)
	    256 => 100000000			...

Conversion décimal => binaire

Une méthode pour convertir du décimal en binaire

https://fr.wikihow.com/convertir-du-décimal-en-binaire

exo1

Convertir le nombre 264 (10) en binaire

Conversion binaire => décimal

exo 2

Convertir le nombre 11001100(2) en décimal

Coder en SNAP

Construire le jeu du nombre mystère

Déterminer un nombre au hasard entre 1 et 100
Poser indéfinement la question : "Deviner le nombre mystère ? "
  Si le mystère est plus grand que la réponse, 
      répondez : "plus grand"
  Si le mystère est plus petit que la réponse, 
      répondez : "plus petit"
  Si trouvé, 
      Terminer le jeu
      puis préciser :  Fécilitations, vous avez trouvé en \<n\> coups !

Utiliser

  • Variable > Nouvelle Variable

Découvrir Ruby

Le site officiel

www.ruby-lang.org/fr

La documentation officielle

www.ruby-lang.org/fr/documentation

Un conseil pour développeur

devdocs.io/ruby (in english)

Utiliser Ruby depuis son navigateur

https://repl.it

30%

Repl.it

  • créer vous un compte
  • choisissez le langage Ruby
  • copier-coller le texte suivant :
print 'Entrez votre nom : '
name = gets
puts "Bonjour #{name}"

Astuce : CTRL + Return => exécution instantanée !

Ruby, Apprendre les bases

  • affectation de variable, symbole =
  a = 1      	# => 1
  b = 'Jean' 	# => 'Jean'
  • comparaison entre 2 variables, symbole == ou son inverse !=
  a == 1 	# => true
  a == 2 	# => false
  a != 2 	# => true

Quelques règles minimales

  • une variable commence par une minuscule plutôt que Ma_Constante

  • les valeurs sont typées => entier, booléen, chaîne de caractère, etc…

    • notion de Programmation Orientée Objet
    • variable.action => exécute une action sur la variable de son type
    • objet.méthode(p1, p2) => applique une méthode avec 2 arguments
  • notion de bloc pour délimiter une suite d’instructions avec { ... } ou do ... end

    • notion de bloc paramétré {|a,b| ... }, ex: Array#each

Ruby est un langage élégant

poignant guide to Ruby (in english)

Naviguer dans la documentation

https://devdocs.io/ruby

chercher les mots clefs

if
while
Integer#==

Tester une condition avec un bloc [else, elsif optionnel]

valeur = 5
if valeur >= 10
  puts 'nombre positif'
elsif valeur < 0
  puts 'nombre négatif'
else
  puts 'chiffre'
end
unless ou if sur une seule ligne !
puts 'chiffre' unless valeur < 0 || valeur >= 10 # && signifie ET
# OU l'inverse
puts 'chiffre' if valeur >= 0 && valeur < 10 # || signifie OU

Afficher un message en console

puts OU print ?

nom = 'toto' # ne pas oublier entre apostrophe ' ou guillement "

puts nom
print nom
print "\n"

Rq: ‘#’ permet d’exprimer un commentaire, ne sera pas exécuté !

# \n est un caractère spécial qui signifie retour à la ligne, cf code ASCII

Demander une information en console

gets est une fonction qui retourne une chaîne de caractère. elle s’utilise comme suit : ma_variable = gets

exemple avec le code :

print 'Entrez votre nom : '
name = gets
print 'Vous avez saisi : '
puts name

petit problème

Utiliser la bibliothèque Date

require 'date'
hui = Date.today

puts hui.day
puts hui.month
puts hui.year

documentation Date

chercher la différence entre Date#day et Date#yday

Coder en Ruby

Exercices

EXO 1

  • demander votre jour de naissance
  • demander votre mois de naissance
  • demander votre année de naissance
  • répondre soit :
    • aujourd’hui est un jour comme un autre… pffff
    • joyeux anniversaire !

cherchons dans la documentation

String#chomp 

exécutons : 'ok'.chomp ? 'ok\n'.chomp ? 1.chomp ?

pourquoi 1.chomp retourne une erreur ?

  • notion de classe

améliorons notre tout premier programme

print 'Entrez votre nom : '
name = gets.chomp
print name
puts ', quel joli prénom !'

les chaines de caractères entre ’ ou "

pseudo = 'toto' => toto pseudo = "toto" => toto nom = pseudo => toto nom = toto => erreur: variable toto non défini !

interpolation de variable avec “#{…}”

Noter la différence entre et "

pseudo = 'toto'
puts "mon nom est : #{pseudo}" # avec interpolation
puts 'mon nom est : #{pseudo}' # sans interpolation

EXO 2

  • Afficher ‘Entrer votre date de naissance’
  • Obtenir une date sous la forme JJ/MM/AAAA avec l’instruction
    • Date.strptime(gets, '%d/%m/%Y')
  • Tester avec la date du jour afin de répondre:
    • aujourd’hui, vous avez <n> ans.
      • <n> représente le nombre d’années
      • ça dépend de votre anniversaire ?

définition de fonction

def ma_fonction(param1, param2)
    [instruction 1]
    [instruction 2]
    ...
    [instruction n]
end
# Rq: la dernière instruction est retournée par la fonction
# Rq: toute instruction retourne une valeur ... ou nil (nul en anglais) 
# -> attention puts retourne nil

appel de fonction

ma_fonction(1,2)

Instructions de base

voir les méthodes attachés à Integer, String, Boolean , …

budget = 1000
budget = budget + 100
budget += 50
budget /= 2
puts budget

nom = 'toto'.upcase # upcase est une fonction/méthode de la classe String
nom += ' est en majuscule'
nom += ", n'est ce pas ?\nNouvelle ligne." # noter l'interpolation pour \n
puts nom

OU

puts "#{'toto'.upcase}, n'est ce pas ?\nNouvelle ligne." # en une ligne

Exo 3 : Construire le jeu du nombre mystère

Déterminer un nombre au hasard entre 1 et 100
Poser indéfinement la question : "Deviner le nombre mystère ? "
Si le mystère est plus grand que la réponse, répondez : “plus grand”
Si le mystère est plus petit que la réponse, répondez : “plus petit”
Si trouvé, Terminer le jeu
Et préciser : Fécilitations, vous avez trouvé en <n> coups !

Exo 4 : palindrome?

Définir la fonction palindrome? qui retourne vrai si : une chaine de caractère sans ses espaces est égale à son inverse.

palindrome?("engage le jeu que je le gagne") # => true

Remarque : En ruby, toutes les fonctions qui retournent un booléen se termine avec un ‘?’ pour améliorer la lisibilité

Apprendre l’écosystème de la programmation

avec …

une distribution de cartes

JEU SAIS TOUT

Règles du “Jeu sais tout”

  1. choisir sa carte en binôme ou trinôme
  2. INDIVIDUEL: surfer sur Internet et collecter un maximum d’information (25mn)
    • Wikipedia, la base + tout autre site web
    • Vidéo tolérée avec casque
  3. GROUPE: mettre en commun vos connaissances, trier, prioriser (5mn)
  4. GROUPE: restitution oral 5mn
    • 3 questions du public

Choix des cartes

1 parmi 10

en binome ou en trinome

Carte 1 : Algorithmique

Problème du voyageur de commerce
Algorithme glouton
Heuristique

Carte 2 : REFACTORING (réusinage)

code spaghetti
code mort
K.I.S.S / D.R.Y / Y.A.G.N.I

Carte 3 : Internet

Tim Berners Lee / HTTP
Nom de domaine
Serveur Web (Apache, Nginx)
Service Web (API REST)

Carte 4 : Programmation impérative

Routine / Procédure / Fonction
Programmation fonctionnelle
Récursivité

Carte 5 : Programmation orientée objet

Diagramme UML
Classe, attribut, méthode
Héritage, polymorphisme

Carte 6 : Programmation fonctionnelle

Calcul Lambda
Lisp
OCaml
Haskell

Carte 7 : GIT, Fork

OpenOffice / LibreOffice
Mysql / MariaDB
Visual Studio Code / VsCodium
Chrome / Chromium

Carte 8 : Javascript

EcmaScript
Arbre DOM
Ajax
JSon

Carte 9 : Rust

Mozilla
Cargo
WebAssembly

Carte 10 : Bash

Ligne de commande
CTRL+C
PowerShell
Dash

Auto-Apprentissage

LibreCours

https://librecours.net/module/js/js00a/

AlgoPython

https://www.algopython.fr/

Aller plus loin avec Ruby (intermédiaire)

Utilisation de librairies pour Internet

obtenir un fichier depuis le web
require "open-uri"
licence = URI.parse("https://www.ruby-lang.org/en/about/license.txt").read
print licence
crypter/décrypter un fichier attaché dans un email
require "base64"
document = 'Voici une information secrète'
enc = Base64.encode64(document)
dec = Base64.decode64(enc)
puts "#{enc} <=Base64=> #{dec}"

Appréhender les limites


Exo 3

Programmer factorielle(n) tel que :
  factorielle(0) = 0
  factorielle(1) = 1
  factorielle(n) = n + factorielle(n - 1)
conseil: utiliser la récursité

:-)

Exo 4

Quelle est la réponse maximale de la fonction factorielle décrite précédemment ?

Exo 5

Proposer une version impérative de la fonction créé précédemment autrement dit : supprimer toute définition de fonction.

  • est-ce que vous pouvez demander une réponse plus grande qu’avant, avec la méthode récursive ?
  • si oui, POURQUOI ?

BONUS

chercher une table de conversion pour les chiffres romains

par exemple :

http://chiffreromain.fr/conversion.php

programmer la fonction qui convertit un décimal en romain
programmer la fonction qui convertit un romain en décimal

ÉVALUATION

QCM

https://qcm.artcode.re