Calculette sur console

bonsoir
Grâce à Maxime et Anthony que je remercie au passage, j’ai pu avancer dans mes essais de programmation.
Alors j’ai codé ce petit TP trouvé sur le net.
Bien entendu :wink: j’ai un petit souci que je vous soumets.
Je voudrais que tant que le choix de l’utilisateur n’est pas 1, 2, 3 ,4 ou 5 (ceux au menu), celui-ci reste bloqué.
J’ai donc mis un while, puis un repeat, mais rien n’y fait, j’obtiens un message d’erreur sur chacune des lignes total avec le message "immutable value ‘nombre1’ may only be initialized once main.swift J’ai le même message d’erreur d’initialisation pour chacune de mes variables. Sans le repeat whil, mes variables s’initialisent correctement pourtant…
merci pour votre aide

Voici mon code
//initialisation des variables
let nombre1: Int
let nombre2: Int
let total: Int
let choix:Int

// tant que l’utilisateur n’entre pas un nombre du menu, le menu s’affiche
repeat {
print("— Menu —")
print(“1. Addition”)
print(“2. Soustraction”)
print(“3. Multiplication”)
print(“4. Division”)
print (“5. Modulo”)

print(“Que voulez-vous ? (de 1 à 5)”)

// on met le choix de l’utilisateur dans la variable choix
choix = Utilisateur.saisirEntier()

// on contrôlke que le choix est bien entre 0 et 6
if choix > 0 && choix < 6 {
print(“Entrez le premier nombre”)
nombre1 = Utilisateur.saisirEntier()
print(“Entrez le deuxième nombre”)
nombre2 = Utilisateur.saisirEntier()

//on teste le choix de l’utilisateur
switch choix {
case 1 :
print(“Vous allez faire une addition”)
total = nombre1 + nombre2
print(“Le résultat de l’opération est (total)”)

case 2 :
print(“Vous allez faire une soustraction”)
total = nombre1 - nombre2
print(“Le résultat de l’opération est (total)”)

case 3 :
print(“Vous allez faire une multiplication”)
total = nombre1 * nombre2
print(“Le résultat de l’opération est (total)”)

case 4 :
print(“Vous allez faire une division”)
total = nombre1 / nombre2
print(“Le résultat de l’opération est (total)”)

case 5 :
print(“Vous allez calculer le modulo”)
total = nombre1 % nombre2
print(“Le résultat de l’opération est (total)”)

default :
print(“Faites un autre choix”)
}
}

} while (choix < 1 || choix > 5)

Bonsoir,

Le problème vient juste que tu à mis des constantes (let) remplace les par des variables (var) et normalement ça devrais fonctionner.

C’est des variables et non des constantes car, tu peut faire plusieurs passage et donc, il doivent pouvoir variées.

1 « J'aime »

En effet, les constantes (déclarées avec let) ne peuvent recevoir qu’une seule valeur alors que les variables (déclarées avec var) peuvent remplacer leurs valeurs autant de fois que nécessaire, ce qui arrivera à chaque nouveau tour de boucle.

Par contre je vois 2 autres problèmes dans ton code : le premier est que tu dupliques la ligne print("Le résultat de l'opération est \(total)") alors que tu pourrais ne le faire qu’une seule fois à la fin de ton switch
Le deuxième problème est que tu risques un bug dans un cas particulier, je te laisse chercher pour voir si tu trouves et sinon je te donnerai la solution :slight_smile:

1 « J'aime »

J’ai remplacé let par var et le problème a été résolu, merci :grinning:

1- Pour ce qui concerne la répétition du print pour afficher le résultat, j’obtiens une erreur d’initialisation de la variable total (“variable ‘total’ used before being initialized”) si je la déplace dans mon switch… Je ne comprends pas pourquoi puisque total a bien été initialisé auparavant ; de type var ; et l’instruction demande juste l’affichage du contenu, pas de refaire un calcul…
J’ai aussi tenté de déplacer la ligne var total:Int
Mais j’ai toujours cette erreur…

2- J’ai un bug si je divise par 0…

Le problème vient du fait que dans le default du switch la variable “total” n’est égale à rien donc, elle ne contiendra rien ci elle passe par cette case. c’est pour ça qu’il met “variable ‘total’ used before being initialized”.

1 « J'aime »

1- J’ai mis une valeur à total dans le default et maintenant ça fonctionne :clap:
merci

2- j’ai modifié le programme pour éviter la division par 0

EDIT
Je continue à m’amuser :

  • à la fin d’un calcul, le programme demande si on a une nouvelle opération à effectuer ; si oui, on refait la boucle, si non, on sort
  • ajout d’un compteur pour voir le nombre de calculs effectués
  • prise en compte du singulier/pluriel dans la phrase “vous avez fait x opération(S)”
    -ajout d’un 6è choix au menu : calcul d’un carré : l’utilisateur ne doit pas avoir à entrer un 2nd nombre pour ce calcul seulement
1 « J'aime »