Mis à jour le lundi 30 octobre 2017
  • 30 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Rédigez un programme pour le terminal

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Joe débarque chez vous très excité !

Salut !

J'ai vu tout ce que tu fais, c'est super ! Cela m'a même donné une idée !

Alors, voilà ce que je te propose. Ton outil permet de prévoir mes recettes. Mais parfois il y a des imprévus et je ne fais pas exactement les choses selon ton modèle. Mais çà me serait très utile pour gérer ma ferme. Est-ce que tu penses que tu pourrais me faire un logiciel de gestion de ma ferme ?

C'est à dire ?

Et bien c'est simple. Chaque jour, je rentre mes activités de la journée et le programme calcule tout à ma place. Mes dépenses, mes recettes, le stockage de mes produits, etc.

Tu penses que c'est possible ?

Bien sûr !

Vous avez fait un nouvel adepte de la technologie apparemment !

Joe vous pose plein de questions sur l'informatique...
Joe vous pose plein de questions sur l'informatique...

 Le terminal

Pour pouvoir créer le logiciel de Joe, nous allons devoir cesser d'utiliser le Playground. Et oui ça vous attriste. Mois aussi ! Car le Playground ne permet pas d'interaction avec un utilisateur. Et Joe veut pouvoir interagir avec le programme pour décrire ses journées.

Mais c'est pour découvrir de nouvelles choses encore plus passionnantes ! Comme le terminal par exemple.

Le terminal, c'est un logiciel qui existe dans tous les ordinateurs. En fait, avant que les ordinateurs aient une interface graphique avec une souris qui permet d'interagir avec son ordinateur, on faisait tout au clavier avec un terminal.

Le terminal, ça ressemble à ça :

C'est pas joli joli vu comme çà mais ne vous inquiétez pas, çà va bien se passer !
C'est pas joli joli vu comme ça mais ne vous inquiétez pas, ça va bien se passer !

L'éditeur en ligne de commande

Pour aller dans le terminal, il vous suffit d'ouvrir l'application Terminal qui se trouve dans votre dossier  /Applications . Ouvrez-la et tapez  swift  puis entrée. Vous devriez obtenir quelque chose comme ça :

C'est l'éditeur Swift en ligne de commande. Il vous permet de taper du code et d'en obtenir un résultat. Vous pouvez écrire ce que vous voulez. Cela fonctionne comme le Playground, sauf que Swift vous répond après chaque ligne. Par exemple, vous pouvez écrire :

Je vous laisse jouer un peu avec l'éditeur en ligne de commande. Vous pouvez utiliser tout ce que vous avez appris jusque là pour faire des minis programmes.

Seulement, cet éditeur comporte plusieurs défauts :

  • Il n'y a pas la colorisation ni l'autocomplétion que propose Xcode

  • On ne peut pas revenir à la ligne précédente pour changer quelque chose

  • On ne peut pas sauvegarder son travail

 On va donc changer notre stratégie et écrire notre code dans un fichier Swift. Laissez-moi vous montrer.

Exécuter un fichier swift

Dans Xcode, allez dans l'onglet File / New... / File. Ou utilisez le raccourci cmd + n. Xcode affiche l'interface suivante :

Choisissez Swift File. Et cliquez sur next. Ensuite vous choisissez le nom de votre fichier. Je vous propose de l'appeler  Hello et de le sauvegarder sur votre bureau. Le fichier est ensuite créé et contient ceci :

// 
//  Hello.swift
//  
// 
//  Created by Ambroise COLLON on 28/02/2017.
// 
// 

import Foundation

Vous pouvez tout supprimer. Je vous propose d'écrire simplement la ligne suivante :

print("Hello World !")

Notre fichier est maintenant prêt à l'essai et nous allons l'exécuter. Pour cela, écrivez d'abord cette commande :

cd ~/Desktop

Maintenant nous allons pouvoir exécuter notre code avec la commande :

swift Hello.swift

Cette commande se lit "utilise Swift pour lire et exécuter le fichier suivant".

Le programme s'exécute et donc vous devriez voir :

Hello World!

La commande readLine()

Maintenant que nous savons exécuter un fichier, nous allons pouvoir gérer l'interaction avec un utilisateur. Pour cela, nous allons utiliser une nouvelle méthode : la méthode  readLine .

Lorsque le programme rencontre cette méthode, il s'interromps et attends que l'utilisateur écrive quelque chose. Par exemple, rajoutons cela à notre programme :

print("Comment vous appelez vous ?")
var name = readLine()
print("Bonjour \(name)")

Sauvegardez et exécutez ! Tout d'abord la console affiche

Comment vous appelez vous ?

Puis l'exécution s'interrompt, c'est à l'utilisateur d'écrire. Écrivez par exemple  Joe  et appuyez sur entrée. Le programme reprend et affiche :

Bonjour Optional("Joe")

Eh oui ! La fonction  readLine  a pour type de retour  String? . La fonction renvoie donc un optionnel. C'est logique, car l'utilisateur peut aussi bien décider de ne pas répondre et donc la variable  name contiendrait  nil .

Pour parer à cela, nous allons modifier un peu notre programme pour déballer notre variable de manière sécurisée :

print("Comment vous appelez vous ?")

if let name = readLine() {
    print("Bonjour \(name)")
}

Maintenant le programme affichera bien :

Bonjour Joe

Le programme 

Le programme que nous allons rédiger s'inspire de ce que nous avons déjà fait. Il va poser des questions à l'utilisateur et écouter ses réponses en suivant ce schéma :

À chaque fois que l'on atteint un stop dans le schéma précédent, on recommence au début. Prenez le temps de bien comprendre ce schéma pour que suivre correctement la suite.

Pour sélectionner, un choix l'utilisateur devra entrer le numéro correspondant. Voilà à quoi va ressembler le programme dans la console :

Que voulez vous faire ?
1. 🤸‍♂️ Enregistrer une nouvelle activité
2. 🏦 Consulter ma banque
3. 🏠 Consulter ma grange

2

Vous avez 1254€ à la banque !

Que voulez vous faire ?
1. 🤸‍♂️ Enregistrer une nouvelle activité
2. 🏦 Consulter ma banque
3. 🏠 Consulter ma grange

etc.

Alors, allons-y ! Créons un nouveau fichier Swift que l'on va appeler  FarmSoft .

Le début du logiciel est simple. Il suffit d'afficher la première question :

print("Que voulez vous faire ?"
    + "\n1. 🤸  Enregistrer une nouvelle activité"
    + "\n2. 🏦  Consulter ma banque"
	+ "\n3. 🏠  Consulter ma grange")

Ensuite il suffit d'ajouter l'écoute de la réponse avec  readLine .

if let choice = readLine() {
   // Faire une action en fonction du choix de l'utilisateur
}

La variable  choice  contient le choix de l'utilisateur à savoir 1, 2 ou 3 a priori. On va donc pouvoir utiliser cette variable pour  choisir notre action :

if let choice = readLine() {
    if choice == "1" {
        print("Vous voulez enregistrer une nouvelle activité !")
    } else if choice == "2" {
        print("Votre banque contient X euros !")
    } else if choice == "3" {
        print("Votre grange contient :"
        	+ "\n🍼  X bidons de lait"
            + "\n🌾  X bottes de blé"
            + "\n⚪️  X pelottes de laine")
    } else {
        print("Je ne comprends pas.")
    }
}

En fonction du choix de l'utilisateur, le programme affiche des réponses différentes. Testez votre programme pour vérifier que tout fonctionne bien !

C'est un bon début. Mais la syntaxe suivante n'est pas très belle :

if choice == "1" {

} else if choice == "2" {

} else if choice == "3" {

} else {

}

Pour améliorer ça, nous allons découvrir la dernière structure de contrôle de Swift (comme ça vous les connaîtrez toutes !).

Le switch

Pour rappel, voici les trois structures de contrôle que vous connaissez :

  • La boucle while

  • La boucle for

  • L'instruction if / else if / else

Le switch est une 4e et dernière structure de contrôle. Le switch comme l'instruction if / else permet de gérer des conditions. Le switch est en particulier utile pour gérer des conditions répétitives comme nous avons ici.

Sa syntaxe est un peu spéciale, mais très pratique :

switch variable {
    case valeur1:
    // Instructions 1
    case valeur2:
    // Instructions 2
    case valeur3:
    // Instructions 3
    default:
    // Instructions par défaut
}

La  variable est évaluée. Si elle est égale à  valeur1 , les instructions 1 sont effectués, si elle est égale à  valeur2 , les instructions 2 sont exécutées, etc. Si la variable n'est égale à aucune des valeurs, les instructions dans  default  sont exécutées.

Le code précédent est équivalent à :

if variable == valeur1 {
    // Instructions 1
} else if variable == valeur2 {
    // Instructions 2
} else if variable == valeur3 {
    // Instructions 3
} else {
    // Instructions
}

 Vous avouerez que c'est quand même plus élégant avec le  switch  !

Allez, à vous de jouer ! Transformez le programme pour utiliser un  switch  :

// Si je t'ai vu, tu essayes de tricher !















































print("Que voulez vous faire ?"
    + "\n1. 🤸  Enregistrer une nouvelle activité"
    + "\n2. 🏦  Consulter ma banque"
	+ "\n3. 🏠  Consulter ma grange")

if let choice = readLine() {
    switch choice {
        case "1":
        print("Vous voulez enregistrer une nouvelle activité !")
        case "2":
        print("Votre banque contient X euros !")
    	case "3":
        print("Votre grange contient :"
        	+ "\n🍼  X bidons de lait"
            + "\n🌾  X bottes de blé"
            + "\n⚪️  X pelottes de laine")
    	default:
        print("Je ne comprends pas")
    }
}

Félicitations ! Vous savez désormais utiliser toutes les structures de contrôle Swift !  Les voici :

Boucles

for in

while

Instructions conditionnelles

if / else if / else

switch

Implémentation 

Et maintenant c'est à vous de jouer ! Je vous laisse implémenter tout le programme seul. :waw: Tout est dans ce schéma que je vous redonne :

Oui, c'est un assez gros exercice ! Mais il n'utilise rien de plus que ce que vous savez déjà. Et une bonne partie du code a déjà été rédigé dans le Playground donc vous en êtes parfaitement capable. C'est un bon moyen de vérifier vos acquis avant de passer à la suite ! Retroussez vos manches et finissez-moi ça vite fait bien fait ! Joe compte sur vous ;) !

// Ne regardez pas la correction sans essayer !















































//======================
// MARK: - Parameters
//======================

// L'argent de Joe
var money = 0.0

// La grange de Joe : [lait, blé, laine]
var barn = ["milk": 0, "wheat": 0, "wool": 0]

//======================
// MARK: - Activities
//======================
func feedAnimals() {
    money -= 4
}

func sell() {
    money += Double(barn["milk"]!) * 0.50
    money += Double(barn["wheat"]!) * 0.30
    money += Double(barn["wool"]!) * 1

    // On vide la grange
    barn = ["milk": 0, "wheat": 0, "wool": 0]
}

func milkCows() {
    barn["milk"]! += 30
}

func harvest() {
    barn["wheat"]! += 100
}

func mowSheep() {
    barn["wool"]! += 30
}

//======================
// MARK: - Conversation
//======================

func addNewActivity() {
    print("Qu’avez-vous fait aujourd'hui?"
        + "\n1. 🥕  J’ai nourri mes animaux"
        + "\n2. 💰  J’ai vendu mes produits"
        + "\n3. 🐄  J’ai trait mes vaches"
        + "\n4. 🌾  J’ai moissonné"
        + "\n5. 🐑  J’ai tondu mes moutons")

    // On récupère la réponse de l'utilisateur
    if let choice = readLine() {
        switch choice {
        case "1": // Nourrir les animaux
            feedAnimals()
        case "2": // Vendre les produits
            sell()
        case "3": // Traire les vaches
            milkCows()
        case "4": // Moissonner
            harvest()
        case "5": // Tondre les moutons
            mowSheep()
        default:
            print("Je ne comprends pas")
        }

        print("🎉  Super 🎉")
    }
}

func presentMenu() {
    print("Que voulez vous faire ?"
        + "\n1. 🤸  Enregistrer une nouvelle activité"
        + "\n2. 🏦  Consulter ma banque"
        + "\n3. 🏠  Consulter ma grange")

    // On récupère la réponse de l'utilisateur
    if let choice = readLine() {
        switch choice {
        case "1": // Ajouter une nouvelle activité
            addNewActivity()
        case "2": // Consulter la banque
            print("Votre banque contient \(money) euros !")
        case "3": // Consulter la grange
            print("Votre grange contient :"
                + "\n🍼  \(barn["milk"]!) bidons de lait"
                + "\n🌾  \(barn["wheat"]!) bottes de blé"
                + "\n⚪️  \(barn["wool"]!) pelottes de laine")
        default:
            print("Je ne comprends pas")
        }
    }
}

// La boucle du programme
while true {
    presentMenu()
}

Votre programme ne ressemble pas exactement à ceci ? Ce n'est pas grave ! L'essentiel, c'est qu'il fonctionne ! Voici quelques remarques concernant la solution que je propose :

  • Les variables  money  et  barn  sont définies tout en haut, car elles sont utilisées dans tout le programme. On dit que ce sont des variables globales, c'est-à-dire donc la portée est sur l'ensemble du fichier.

  • J'ai organisé mon code avec des commentaires un peu spéciaux :

    //======================
    // MARK: - Activities
    //======================

    Les lignes 1 et 3 sont juste là pour attirer l'oeil et permettre une distinction claire entre les parties. C'est assez courant, mais vous pouvez mettre ce que vous voulez tant que c'est voyant. La ligne 2 contient l'instruction  MARK: . Cette instruction permet à Swift de structurer le code dans l'inspecteur en haut :

    Comme vous pouvez le voir, les fonctions sont séparées par les titres : Parameters, Activities et Conversation qui structure le code. C'est pratique quand les fichiers deviennent assez longs.

  • J'ai utilisé exclusivement des fonctions. Tout le code est encapsulé dans des fonctions, ce qui fait que le programme en lui-même se résume à :

    // La boucle du programme
    while true {
        presentMenu()
    }
  • Le  while true permet de créer une boucle infinie. En effet, la condition  true est par définition toujours vraie donc la boucle while ne s'arrête jamais. 

En résumé 

  • Le terminal est un logiciel qui permet d'utiliser son ordinateur entièrement avec le clavier. En connaissant les commandes, on peut faire tout ce qu'on fait à la souris, mais au clavier.

  • Pour lancer l'éditeur Swift en ligne de commande, il d'écrire  swift dans le terminal.

     

  • Pour exécuter un fichier Swift,  il faut écrire  swift suivi du nom du fichier.

  • La commande  readLine permet d'interagir avec l'utilisateur en écoutant ce qu'il va écrire. Elle renvoie un  String? qu'il faut du coup déballer.

  • La commande  switch est une structure de contrôle que l'on utilise comme ceci :

    switch variable {
        case valeur1:
        // Instructions 1
        case valeur2:
        // Instructions 2
        case valeur3:
        // Instructions 3
        default:
        // Instructions
    }

 

Exemple de certificat de réussite
Exemple de certificat de réussite