Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet Emploi du temps C-Python

Sujet résolu
    26 décembre 2021 à 18:59:33

    Bonsoir,

    Actuellement en train de réaliser un projet en Python/C pour mon école, je souhaiterais savoir si certains d'entre vous auraient des idées car je suis un peu dans une impasse.

    Concrètement, le projet consiste à recenser toutes les "UE" (correspond aux matières de l'école) avec tout un tas d'informations pour chacune des UE (tout est rentré au clavier) et derrière, un étudiant utilisant le programme doit pouvoir choisir ses UE en utilisant le programme.

    Le soucis est que, lors de la saisie des informations d'une UE, je ne sais pas comment aborder les informations à propos de dates/heures.
    Pour chacun des 3 cours de chaque UE, on doit rentrer le jour, et l'heure de début/fin en format hh:mm mais il faut que cela respecte certains critères à savoir :

    - Il y a 3 cours par UE et chacun des créneaux de chaque cours ne doit pas déborder sur un autre --> je ne sais pas du tout comment faire
    - Chacun des créneaux doit commencer après 8h00 et se terminer avant 20h00
    - L'heure de fin du cours doit être après l'heure de début du cours
    - Lorsque l'étudiant choisit plusieurs UE, il faut pouvoir comparer les créneaux de chacun des 3 cours de chacune des 6 UE entre eux savoir si il n'y a pas de débordements (même soucis que le premier tiret)

    Globalement, c'est Python qui récupère les infos auprès de l'utilisateur, et c'est C qui doit aller chercher dans les fichiers où sont stockées les infos, ou bien dans les infos que python envoie pour pouvoir comparer et vérifier si il y a un éventuel soucis.

    La communication des 2 langages se fait avec c_types ça j'ai compris comment ça marche mais comme le projet utilise 2 langages je ne sais pas trop où poster le message, étant donné que le plus gros soucis que j'ai c'est avec C je le poste ici.

    Je souhaiterais savoir concrètement comment récupérer une date/heure dans une structure adaptée ainsi qu'un jour et également comment faire la vérification de tous les critères indiqués ci-dessus.

    Désolé si je n'ai pas été très clair, je peux donner d'autres infos si besoin.

    Merci d'avance (je demande juste des tuyaux pas un code complet je veux pas trop vous embêter !)

    -
    Edité par ValentinCaron1 26 décembre 2021 à 19:02:52

    • Partager sur Facebook
    • Partager sur Twitter
      26 décembre 2021 à 19:09:58

      Je m'y attendais mdr je vais essayer d'être plus clair et plus concis surtout !

      En fait je souhaite avec C effectuer des vérifications sur les créneaux des cours d'une matière.

      Mettons que j'ai 3 cours de maths, je souhaite vérifier si chacun de ces cours respecte les critères suivant :

      - Il commence après 08h00 et se termine avant 20h00
      - L'heure de fin du cours est bien après l'heure de début du cours
      - Les créneaux de chacun des 3 cours ne doivent pas se chevaucher (Exemple, si le cours 1 est Lundi de 8h00 à 10h00, l'utilisateur ne doit pas pouvoir écrire que le cours 2 est Lundi de 9h00 à 11h00)
      - Dernier point, je souhaite faire la même comparaison qu'au dessus en récupérant les infos depuis un fichier

      Dernier petit soucis, j'ai aucune idée de comment stocker les informations relatives à chaque cours. (si je stocker heure + min dans la même variable ou non etc, et je souhaite pouvoir afficher l'heure en format hh:mm genre 08h00)

      J'espère avoir été plus clair !

      • Partager sur Facebook
      • Partager sur Twitter
        26 décembre 2021 à 22:09:47

        Bonjour,

        quel est ton niveau en C selon toi ?

        • Partager sur Facebook
        • Partager sur Twitter
          26 décembre 2021 à 22:57:17

          Salut white crow,

          J'ai fais les 2/3 de la formation open classroom plus 2 mois en classe, je saurais pas trop donner mon niveau mais disons que je commence à bien comprendre et maitriser la gestion de mémoire et les notions de base ce qui devrait théoriquement être suffisant pour ce qu'on nous demande.

          En fait le seul truc qui me pose problème c'est vraiment quelle structure utiliser pour stocker les heures des cours ainsi que trouver un moyen de pouvoir les comparer entre elles ou a des valeurs de référence pour pouvoir réaliser les obligations citées précedemment

          • Partager sur Facebook
          • Partager sur Twitter
            26 décembre 2021 à 23:20:38

            ValentinCaron1 a écrit:

            c'est vraiment quelle structure utiliser pour stocker les heures des cours.

            Quel structure et bien les structures du langage C ! struct , tu as vu ça ?

            Par exemple un cours a un nom, une heure de début, une heure de fin ou une durée comme tu voudras, tu englobes tout ça dans une structure du langage C.

            • Partager sur Facebook
            • Partager sur Twitter
              26 décembre 2021 à 23:46:24

              Salut rouloude,

              C'est ce que j'avais envisagé au début j'ai effectivement vu le type struct.
              J'ai utilisé la même structure qu'en python (je dois faire communiquer les 2 langages) que j'envoie au langage C.

              Le problème qu'il me reste à résoudre c'est comment réussir à écrire par exemple 08h00 au lieu de 8h0 si j'utilise des entiers.
              Egalement, comment pouvoir "comparer" deux créneaux horaires (exemple : savoir lequel se situe plus tard que l'autre, savoir si deux créneaux se chevauchent etc)

              Merci de la réponse !

              • Partager sur Facebook
              • Partager sur Twitter
                26 décembre 2021 à 23:52:06

                Hello,

                ValentinCaron1 a écrit:

                Le problème qu'il me reste à résoudre c'est comment réussir à écrire par exemple 08h00 au lieu de 8h0 si j'utilise des entiers.

                int hour=8;
                int minute=0;
                
                printf("%02dh%02d",hour,minute);


                -
                Edité par edgarjacobs 26 décembre 2021 à 23:58:07

                • Partager sur Facebook
                • Partager sur Twitter

                Il y a ceux qui font des sauvegardes, et ceux qui n'ont pas encore eu d'incident....

                  26 décembre 2021 à 23:59:41

                  edgarjacobs a écrit:

                  Si ce n'est que de l'affichage

                  int hour=2;
                  int minute=3;
                  
                  printf("%02dh%02d",hour,minute);

                  Salut, je dois d'abord stocker ça dans un fichier texte pour pouvoir le faire apparaitre par la suite, mais effectivement je pourrais vérifier avec un if par exemple pour savoir ce que l'utilisateur a rentré comme informations et ajuster ce que j'écris dans le fichier par la suite, simple mais j'y avais pas pensé merci !
                  Voilà déjà 1 problème de résolu !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 décembre 2021 à 0:44:56

                    Alors normalement on n'y a va pas la fleur au fusil. On essaye de modéliser ce qu'on veut/doit gérer.

                    ValentinCaron1 a écrit:

                    [...]
                    Pour chacun des 3 cours de chaque UE, on doit rentrer le jour, et l'heure de début/fin en format hh:mm mais il faut que cela respecte certains critères à savoir :

                    - Il y a 3 cours par UE et chacun des créneaux de chaque cours ne doit pas déborder sur un autre --> je ne sais pas du tout comment faire
                    - Chacun des créneaux doit commencer après 8h00 et se terminer avant 20h00
                    - L'heure de fin du cours doit être après l'heure de début du cours
                    - Lorsque l'étudiant choisit plusieurs UE, il faut pouvoir comparer les créneaux de chacun des 3 cours de chacune des 6 UE entre eux savoir si il n'y a pas de débordements (même soucis que le premier tiret)

                    [...]

                    Tu dois pouvoir représenter une UE. Une UE est composée de 3 cours (et a peut-être d'autres propriétés comme un nom, ou autre chose). Une première approche est donc :

                    #define COURS_PAR_UE (3)
                    #define MAX_LONGUEUR_NOM_UE (30)
                    
                    struct UE {
                       struct cours cours[COURS_PAR_UE];
                       char nom[MAX_LONGUEUR_NOM_UE];
                    
                       // éventuellement d'autres attributs
                    };

                    Il te sera utile (voire nécessaire) de définir plein de fonctions pour gérer cette structure comme par exemple :

                    struct UE *ue_new(const char *nom, const struct cours[3]);
                    void ue_free(const struct UE *ue);
                    
                    
                    const char *ue_get_nom(struct UE *ue);
                    const struct cours* ue_get_cours(struct UE *ue, size_t num_cours);
                    
                    …

                    Du coup il apparaît nécessaire de faire quelque chose de similaire pour la structure cours :

                    struct cours {
                        char nom[MAX_LONGUEUR_NOM_COURS];
                        struct Horaire horaire;
                    };
                    
                    …
                    idem pour les fonctions de création/modification/accès

                    Et aussi la struct Horaire 

                    struct Horaire {
                        struct tm debut;
                        struct tm fin;
                    };
                    
                    … toujours les primitives d'accès …

                    Si on part sur l'utilisation de la libc pour gérer les heures à proprement parler

                    Il te faudra aussi pouvoir gérer une liste d'UE car tu as plusieurs UE, des étudiants, des listes d'étudiants … et lire toutes les données depuis un fichier.

                    Bref un bon paquet de structure …

                    Tout cela se simplifie si tu as le droit d'utiliser un bdd externe à la sqlite.




                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 décembre 2021 à 2:12:16

                      Pour tester la superposition, je suppose que l'intervalle est une semaine.
                      Si les cours ne sont pas la même journée, il n'y a pas chevauchement.
                      Saurais-tu comment vérifier si deux périodes se chevauchent dans une journée?
                      On peut concaténer l'heure et les minutes, Appelons ça hm

                      Par exemple: hm = h*60+m ou hm = h*100+m
                      Pour les cours 1 et 2, j'aurais [hmd1, hmf1] et [hmd2, hmf2] (hmd: heure-minute-début, hmf: heure-minute-fin)
                      il faut hmd1 < hmf1 et hmd2 < hmf2
                      il faut hmd1 != hmd2
                      puis si hmd1 < hmd2
                      il faut hmf1 < hmd2 (peut-être <=)
                      sinon, c'est le contraire.
                      S'il y a 3 cours, on teste 1 vs 2, 1 vs 3, 2 vs 3

                      -
                      Edité par PierrotLeFou 27 décembre 2021 à 2:15:08

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        27 décembre 2021 à 2:47:00 - Message modéré pour le motif suivant : Message complètement hors sujet


                          27 décembre 2021 à 3:42:37

                          @CristianoRolando:
                          Laisses-tu entendre que nous sommes condescendants envers ValentinCaron1?
                          > J'ai fais les 2/3 de la formation open classroom plus 2 mois en classe, je saurais pas trop donner mon niveau mais disons que je commence à bien comprendre
                          et maitriser la gestion de mémoire et les notions de base ce qui devrait théoriquement être suffisant pour ce qu'on nous demande
                          Justement, je ne suis pas convaincu, surtout avec les cours d'OC.
                          Et je ne sais pas ce qui doit être écrit en Python non plus.
                          Personnellement, je ferais l'étape de la saisie et vérification de base en Python. C'est nettement plus facile dans ce langage.
                          Le formatage également: h=8 -> h =('0'+str(h))[-2:]
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                            27 décembre 2021 à 4:22:09

                            Salut.

                            Merci a vous 2 pour vos réponses.

                            Je pense utiliser la méthode de pierrot, merci évidemment à toi white crow mais je pense que me lancer la dedans va être compliqué vu mon niveau.

                            Je suis contraint par le sujet de mon projet à effectuer toutes les vérifications via C et je pense que concaténer les heures et mon va résoudre beaucoup de mes soucis étant donné que je fais tout le reste en python et que ça sera plus simple.

                            Derniere petite chose, comme je vais sauvegarder les créneaux de chaque cours dans un fichier texte, est ce que je pourrais les récupérer sous forme d'entier pour à nouveau les comparer car j'aurais besoin de le faire par la suite, ou bien récupérer la chaîne et la transformer en entier.

                            Merci encore pour vos réponses passez de bonnes fêtes de fin d'année ! 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 décembre 2021 à 4:56:50

                              Puisque c'est un fichier texte, il vaut mieux écrire le tout en caractères.
                              En C comme en Python, il est facile d'écrire des fichiers en format CSV (Comma Separated Values)
                              C'est à dire que tes champs seront séparés par un délimiteur, qi est habituellement la virgule.
                              Python a des modules pour cela (module csv)
                              Et on peut s'en tirer en C avec la fonction strtok() pour isoler les champs.
                              Il y a des fonctions en C pour refaire la conversion en int (ou autre).
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                27 décembre 2021 à 22:48:13

                                Ah, faire une vanne sur le fait que Valentin se fait bizuter est hors-sujet.

                                Désolé, mais faire un planning c'est compliqué et en plus avec DEUX langages de programmation, c'est le casse-pipe assuré.

                                Vu qu'il est sur le forum C, autant qu'il s'en tienne uniquement à ce langage. Il aura d'autres occasions d'utiliser le langage Python.

                                Bon courage à Valentin car je crois que faire un planning rentre dans la catégorie des optimisations combinatoire qui fait partie de la liste de problèmes NP-complets. Ce ne sont pas ces fameux problèmes mathématiques qui, si résolus, nous font remporter 1 million de dollars ?

                                https://fr.wikipedia.org/wiki/Liste_de_probl%C3%A8mes_NP-complets#Optimisation

                                Le sujet du fil est très intéressant.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 janvier 2022 à 15:20:16

                                  Np-complet ne veut pas dire insoluble, ni indécidable.

                                  On sait les résoudre, en général on a même des solutions simples, avec des algorithmes "brute force". C'est juste que ca prend très beaucoup de temps à exécuter, dès que la taille des données augmente.

                                  Problème d'emploi du temps optimal ?  Il suffit d'etudier toutes les possibilites, et de les comparer.

                                  -
                                  Edité par michelbillaud 17 janvier 2022 à 15:26:47

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Projet Emploi du temps C-Python

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  • Editeur
                                  • Markdown