IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Algo & boucles


Sujet :

Python

  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Algo & boucles
    Bonjour,

    Je vous expose le problème :
    La bibliothèque possède nbLivres livres indexés de 0 à nbLivres - 1. Chaque jour, un certain nombre de clients demandent à emprunter des livres pour une certaine durée. Si le livre est disponible, la requête du client est satisfaite, sinon le client repart sans livre.

    Votre programme doit d'abord lire sur une première ligne deux entiers : nbLivres <= 1000 et nbJours. Pour chacun des jours, votre programme lira un entier nbClients sur une ligne puis nbClients lignes de deux entiers. Le premier entier correspond à l'indice du livre et le second la durée correspondante. (voir l'exemple d'entrée). Il affichera ensuite, sur des lignes séparées, pour chaque client un 1 si le livre peut être prêté et 0 dans le cas contraire.

    On remarquera que si un client emprunte un livre le jour iJour pendant une durée duree alors celui-ci ne sera de nouveau disponible qu'au jour iJour + duree. De plus, si plusieurs personnes demandent le même livre pendant une journée, seule la première a une chance d'être satisfaite.
    Citation Envoyé par exemple d'entrée
    2 4
    2
    0 3
    1 3
    1
    0 3
    1
    1 4
    2
    0 2
    0 5
    Citation Envoyé par sortie
    1
    1
    0
    0
    1
    0
    J'ai fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    entree1 = input().split(' ')
    nbLivres,nbJours = map(int,entree1)
    livres = [1] * nbLivres
    
    for _ in range(nbJours) : 
       nbClients = int(input())
       for _ in range(nbClients) : 
          entree2 = input().split(' ')
          indLivre,duree = map(int,entree2)         
          if livres[indLivre] == 1 : 
             print(1)
             livres[indLivre] = -duree + 1
             print(livres)
          else :
             print(0)
             print(livres)
       if livres[indLivre] < 1 : 
          livres[indLivre] += 1
    Mais ça ne fonctionne pas
    J'ai un problème avec mon nombre de livre, qui ne se met pas à jour correctement.
    Quand un client emprunte un livre pour n jours, sur mon nombre pour le livre concerné je déduis n et rajoute 1
    Et j'essaie (sans succès) d'ajouter 1 à chaque jour qui passe, afin qu'au bout des n jours le nombre de livre soit de nouveau à 1.

    Où ça pêche dans mon raisonnement ? Où dans mon code ?

    D'avance merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Pourquoi, dans livres, stocker 1 partout au début ?
    Tu devrais stocker le nombre de jours avant qu'il ne revienne à la bibliothèque (et 0 donc s'il est disponible).
    Ainsi, pour un livre donné, si tu as 0 il est dispo. Si tu as autre chose, il n'est pas dispo.
    Et à la fin de la journée, tu parcours tous les livres, et s'ils sont différents de 0, c'est qu'ils sont dehors, et donc tu retires 1, car 1 jour vient de se passer.

    Je n'ai pas l'impression que c'est ce que tu ais fait.

  3. #3
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    non pas du tout
    J'ai fait une liste de 1, puisqu'au départ il y a 1 livre n°0, 1 livre n°1, 1 livre n°2, .....

    Mais sinon j'ai fait un peu ce que tu décris. Simplement au lieu de 0 j'ai fait 1. Mais c'est tout.

  4. #4
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    je le tiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    entree1 = input().split(' ')
    nbLivres,nbJours = map(int,entree1)
    livres = [1] * nbLivres
     
     
    for _ in range(nbJours) : 
       nbClients = int(input())
       for iND in range(nbLivres) :
          if livres[iND] < 1 :
             livres[iND] += 1
       for _ in range(nbClients) : 
          entree2 = input().split(' ')
          indLivre,duree = map(int,entree2)         
          if livres[indLivre] == 1 : 
             print(1)
             livres[indLivre] = -duree + 1   
          else :
             print(0)
    évidemment, il me fallait 2 boucles pour chaque jour.
    - une qui incrémente le nbre de chaque livre
    - et une qui demande les emprunts pour chaque client

    voilà. Ce fût laborieux

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       for iND in range(nbLivres) :
          if livres[iND] < 1 :
             livres[iND] += 1
    Ca veut dire quoi ca ? ... Si je reformule, on peut l'écrire comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       for iND in range(nbLivres) :
          if livres[iND] == 0 :
             livres[iND] += 1
    et donc meme, comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       for iND in range(nbLivres) :
          if livres[iND] == 0 :
             livres[iND] = 1
    Donc vous considérez que si à un moment donné la bibliothèque n'as plus un livre donné, alors elle en achète un exemplaire ?
    Car sinon comment est ce que le livre redeviendrais disponible ?

    A mon avis il y a un truc là, car le seul moyen qu'un livre redevienne disponible, normalement ca devrait être qu'il est rendu par celui qui l'avait emprunté ...

  6. #6
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Alors...ma gestion du truc est sans doute un peu bizarre.

    On sait (parce qu'on nous le donne) pendant combien de temps un livre est "dehors".
    Du coup, puisque j'ai une boucle qui...boucle sur le nombre de jours, si, par exemple, le livre n°2 est emprunté pendant 3 jours, dans ma liste de livres, au lieu de 1 j'ai -2, c'est à dire 1-3.
    Oui je sais, c'est bizarre de déduire des jours d'un nombre de livres. Mais je sais qu'il n'y a qu'un seul exemplaire de chaque livre. Du coup, ça marche.

    Si je reprends mon exemple, mon livre 2 au jours 2 il apparaît à -1, le jour 3 à 0, et le jour 4 (puisque le livre est dispo le jour suivant son retour, c'était précisé dans l'énoncé) il est revenu à 1, il est donc de nouveau disponible.

    Voilà

  7. #7
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       for iND in range(nbLivres) :
          if livres[iND] < 1 :
             livres[iND] += 1
    Ca veut dire quoi ca ? ... Si je reformule, on peut l'écrire comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       for iND in range(nbLivres) :
          if livres[iND] == 0 :
             livres[iND] += 1
    Tu as lu trop vite son code. Relis sa ligne livres[indLivre] = -duree + 1.

    Cela dit, c'est vrai qu'il aurait été plus logique de mettre directement le nombre de jours restants. Si on ne change que cela, alors le nouveau code devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    entree1 = input().split(' ')
    nbLivres,nbJours = map(int,entree1)
    livres = [0] * nbLivres
     
     
    for _ in range(nbJours) :
       nbClients = int(input())
       for iND in range(nbLivres) :
          if livres[iND] > 0 :
             livres[iND] -= 1
       for _ in range(nbClients) :
          entree2 = input().split(' ')
          indLivre,duree = map(int,entree2)
          if livres[indLivre] == 0 :
             print(1)
             livres[indLivre] = duree
          else :
             print(0)
    À part ça, RowanMayfair, est-ce que le prof s'attend à ce que le code vérifie la validité des entrées et affiche une erreur en cas d'entrée invalide ? Par exemple, dans la consigne, je lis nbLivres <= 1000.

  8. #8
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Citation Envoyé par Pyramidev Voir le message

    À part ça, RowanMayfair, est-ce que le prof s'attend à ce que le code vérifie la validité des entrées et affiche une erreur en cas d'entrée invalide ? Par exemple, dans la consigne, je lis nbLivres <= 1000.
    Non, on n'a pas encore vu.
    Le prof c'est des tests qui sont faits automatiquement sur le programme pour vérifier s'il fonctionne comme attendu

    Pour situer, je viens de faire le livre de Swinnen, j'ai fait quelques TP ou exos ici ou là, et j'ai découvert qu'elles étaient là mes lacunes : en algo

Discussions similaires

  1. Méthode pour la construction de mon algo ou boucle
    Par Masterkey42 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 03/04/2017, 17h45
  2. Mettre en pause une boucle for (algo de tri)
    Par Naografix dans le forum C#
    Réponses: 14
    Dernier message: 17/02/2015, 11h02
  3. erreur boucle algo
    Par Cuoreconleali dans le forum Débuter
    Réponses: 2
    Dernier message: 16/04/2012, 07h49
  4. aide algo boucles
    Par fire24 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/10/2008, 13h09
  5. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo