Topic de gearthquake :

Un jean programmeur ? (aide pour 2-3 question très très basique)

Le 09 janvier 2021 à 09:41:45 gearthquake a écrit :
et pour celle ci svp ? quelqu'un peut m'aider ?? :-( https://image.noelshack.com/fichiers/2021/01/6/1610180559-unnamed.jpg

L’info si tu galères pas t’apprends pas :ok:

Un conseil, pense à faire des notes des cas précis que tu rencontres en disant comment tu l’as résolu et les liens sur lesquelles tu t’es basés

import java.util.Scanner;

public class Exam{  
    public static void main(String args[]){ 
      int pate = 30;
      int stom = 20;
      int sbla = 10;
      int from = 40;
      int jamb = 10;
      int legu = 10;
      
      

      System.out.println("----------AutoPizzaMakerPro 2021----------");
      System.out.println("Veuillez choisir votre pizza parmis les 4 options suivantes: ");
      System.out.println("1- Pizza Fabulous");
      System.out.println("2- Pizza Fromagus");
      System.out.println("3- Pizza Vegarous");
      System.out.println("4- Pizza Extraordinarous");
      Scanner scan = new Scanner(System.in);
      int choix = scan.nextInt();
      if (choix == 1) {
        System.out.println("Vous avez demandé une Pizza Fabulous !");
        int npate = pate -1;
        int nstom = stom -1;
        int nfrom = from -1;
        int njamb = jamb -1;
          if (pate > 0) && (stom > 0){ 
            System.out.println("Nous allons preparez votre Pizza, veuillez patientez 5min");
          
          }
          
        System.out.println("1- Pizza Fabulous");;
      }
        
      }
      
     
}
  
jai fait ca mais cava pas je galere svp help

Le but de ce type d'exo est de visualiser la conception objet.

Donc déjà tu vas séparer la logique métier, la modélisation des domaines, de l'algorithme et des inputs utilisateurs.

Le premier truc c'est de modéliser le distributeur (première composante de l'énoncé). C'est un objet mutable qui sera modifié en fonction des commandes de pizzas.

1- Modélisation du domaine

Du coup une modélisation correcte :


public class Distributeur {
    int pate;
    int tom;
   ...
}

Que tu initialises par constructeur comme le stipule l'énoncé :


public class Distributeur {

     public Distrubuteur() {
         pate = 30;
         tom = 20;
         ...
     }

}

Ensuite tu modélises les pizzas
Un choix naïf serait de définir une classe Pizza de la sorte :


public class Pizza {
   int pate;
   int stom;
   int sbla;
   ...
}

et de définir les pizzas :


Pizza fabulous = new Pizza(1, 1, 1, 1);

C'est un mauvais choix car la constitution des pizzas est connue à l'avance et il n'est pas demandé de pouvoir modifier la recette ni de pouvoir ajouter/supprimer des pizzas => tout est static => enum


public enum Pizza {
    FABULOUS(1, 1, ....),
    FROMAGOUS(1, 1, 3...)
    etc;

    int pate;
    int tom;
   ...    

    private Pizza(int pate, int tom...) {
        this.pate = pate;
        this.tom = tom;
        ...
    }

}

2- Modélisation du choix de l'utilisateur

Il choisit un type de pizza (on retrouve bien notre enum) et une taille.

On modélise la taille :


public enum Size { NORMAL, HIGH };

Le choix n'est donc qu'un couple comme suit :


public class Input {
    Size size;
    Pizza pizza;

    public Input(Pizza pizza, Size size) {
        this.size = size;
        this.pizza = pizza;
    }
}

Quand tu demanderas les infos à l'utilisateur, tu créeras une fonction qui utilise les méthodes I/O (le fameux Scanner) et qui renverra à la fin un objet Input. C'est uniquement cette méthode qui doit avoir un couplage avec l'I/O.
Si demain le programme évolue et que c'est géré via IHM/Web service ou autre... il n'y aura qu'à ajouter un adapter et tout le reste fonctionnera.

3- Règles métier

1- Réservation d'une pizza
Tu dois gérer le distributeur et pouvoir préparer la pizza.

Définis une méthode d'instance sur le Distributeur qui prend en paramètre une pizza.
Ca doit à la fin du traitement mettre à jour les infos du distributeur (pate, tom...) en retranchant les portions nécessaire à la fabrication de la pizza.

Si le distributeur n'est pas capable de préparer la pizza, tu gères un cas d'erreur (par ex en throw un new IllegalArgumentException).

2- Etat des lieux
Créer une fonction qui fait la diff entre l'état initial et l'état courant du distributeur, pour indiquer le nombre d'ingrédients manquants.

Je te laisse continuer, mais tu as compris la démarche :noel:

Je reviendrais un peu sur la gestion du cas d'erreur.
Ne lance pas IllegalArgumentException mais plutôt un RuntimeException.

Personnellement si je devais le faire j'éviterais les exceptions, mais on va éviter de trop complexifier les choses :noel:

Merci kluent pour ta superbe réponse très détaillé mais en fait on a pas encore abordé la POO donc il faudra se débrouiller sans ces outils je pense :(

jai fait un truc sans utiliser la poo mais je sais pas comment arreter le while, quand on choisit la pizza ca affiche sans arret le choix de l'user.

import java.util.Scanner;

public class Exam{  
    public static void main(String args[]){ 
      int pfab;
      int pfro;
      int pveg;
      int pext;
      int pate = 30;
      int stom = 20;
      int sbla = 10;
      int from = 40;
      int jamb = 10;
      int legu = 10;
      
      

      System.out.println("----------AutoPizzaMakerPro 2021----------");
      System.out.println("Veuillez choisir votre pizza parmis les 4 options suivantes: ");
      System.out.println("1- Pizza Fabulous");
      System.out.println("2- Pizza Fromagus");
      System.out.println("3- Pizza Vegarous");
      System.out.println("4- Pizza Extraordinarous");
      Scanner scan = new Scanner(System.in);
      int choix = scan.nextInt();
      while (choix < 5) {
      if (choix == 1) {
        System.out.println("Vous avez demandé une Pizza Fabulous !");
        int fabpate = pate -1;
        int fabstom = stom -1;
        int fabfrom = from -1;
        int fabjamb = jamb -1;
          if (pate > 0 && stom > 0 && from >0 && jamb >0){ 
            System.out.println("Nous allons preparez votre Pizza, veuillez patientez 5min");
            
             }
          else {
            System.out.println("Pizza non disponible.");
            break;
          }
         }
      if (choix == 2) {
        System.out.println("Vous avez demandé une Pizza Fromagous !");
        int frpate = pate -1;
        int frstom = stom -1;
        int frfrom = from -3;
          if (pate > 0 && stom > 0 && from > 2){ 
            System.out.println("Nous allons preparez votre Pizza, veuillez patientez 5min");
             }
          else {
            System.out.println("Pizza non disponible.");
            break;
          }
          
        
      }
       if (choix == 3) {
        System.out.println("Vous avez demandé une Pizza Vegarous !");
        int vpate = pate -1;
        int vstom = stom -1;
        int vlegu = legu -2;
          if (pate > 0 && stom > 0 && legu > 1){ 
            System.out.println("Nous allons preparez votre Pizza, veuillez patientez 5min");
             }
          else {
            System.out.println("Pizza non disponible.");
            break;
          }
          
        
      }
       
        if (choix == 4) {
        System.out.println("Vous avez demandé une Pizza Extraodinarous, très bon choix !");
        int xpate = pate -1;
        int xsbla = sbla -1;
        int xlegu = legu -1;
        int xfrom = from -1;
          if (pate > 0 && stom > 0 && from > 0 && legu > 0){ 
            System.out.println("Nous allons preparez votre Pizza, veuillez patientez 5min");
             }
          else {
            System.out.println("Pizza non disponible.");
            break;
          }
          
        
      }
      }
      }
     
}
    
  

l histoire du ++i et i++:

++i incremente i avant d'etre utilisé
i++ incremente i apres avoir été utilisé

exemple

i = 2
Sysout.print(i++) -> affiche 2 et augmente i de 1

i=2
Sysoutprint(++i) -> affiche 3 et augmente i de 1

Dans ce cas dis à ton prof qu'il faut pas faire du java.
Quoi qu'il en soit la démarche reste valable.

Il faut découper le programme en plusieurs fonctions qui expriment des intentions.
En C tu aurais défini des struct à la place des classes par ex.

Il faut que dans ton programme on comprenne ce qu'il se passe, et que chaque logique/traitement corresponde à un traitement spécifique (= une méthode).

Une méthode main qui fait tout et du code pas clair (sans intention métier = sans voir dans le code le domain Pizza/Distributeur etc..) c'est l'approche à fuir.

Quel est ton niveau actuel en java l'op ? Tu sais faire des fonctions ? Des structures ? Des boucles ? Si non-> go apprendre et ensuite fais l'exo
L'approche la moins degueulasse a mon avis est de mettre tous les ingredients dans une structure et separer le code en plusieurs fonctions comme a dit kluent si dessus. La meilleure approche serait avec des classes certes, mais peu adaptée aux debutants.

cet examen niveau desco + "++i" mis dans une expression le truc que personne ne fait car personne ne sait si ça incrémente avant ou après, juste pour ceux qui apprennent par coeur :rire:.

Après intuitivement, "++i" le "++" est avant le i donc logiquement ça DEVRAIT être incrémenté avant le retour, mais aucune garantie. Jamais fait de java (que du C++) y'a la même mais personne ne fait ça.

Sinon t'as pas correct car i est incrémenté quoi qu'il arrive, ++i c'est pas que renvoyer une valeur sinon ça ne servirait à rien, c'est avant tout modifier i... avec +1.

Le 09 janvier 2021 à 11:18:44 Oubidolamareca a écrit :
L'approche la moins degueulasse a mon avis est de mettre tous les ingredients dans une structure et separer le code en plusieurs fonctions comme a dit kluent si dessus. La meilleure approche serait avec des classes certes, mais peu adaptée aux debutants.

C'est exactement ce à quoi je pensais.
Et définir des constantes FABULOUS, FROMAGEOUS etc.. correspondant à des tableaux valorisés.

Comme ça ça permet d'implémenter de la logique métier, en mettant en évidence les intentions et en évitant les "magic number" qui rendent difficiles la lecture du code :ok:

La " programmation " crayon papier c'est non

Données du topic

Auteur
gearthquake
Date de création
8 janvier 2021 à 23:58:50
Nb. messages archivés
35
Nb. messages JVC
35
En ligne sur JvArchive 142