Partage
  • Partager sur Facebook
  • Partager sur Twitter

nom de fichier(chaine de caractére)

    7 septembre 2021 à 17:23:50

    bonjour!

    voici l'exercice:


    /*Sous Windows (et sous beaucoup d’autres systèmes d’exploitation), certains caractères
    spéciaux sont utilisés par le système pour son fonctionnement interne. De ce fait, le nom d’un fichier ne
    peut pas par exemple contenir les caractères \ / " * : | ? < >
    Ecrire un programme qui demande à l’utilisateur le nom qu’il souhaite donner à son fichier et lui dit s’il
    est correct (ne contient pas de caractère non autorisé) ou pas. Dans le cas où le nom renseigné est
    incorrect, le programme devra lui proposer un nom adéquat (remplacement des caractères interdits par
    le caractère underscore)*/
    
    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        char nomfichier[15];
        printf("Veuillez entrer le nom de votre fichier:  ");
        fgets(nomfichier,30,stdin);
        for(int i = 0; nomfichier[i] != '\0'; i++)
        {
            if(nomfichier[i] == ' ' || nomfichier[i] == '*'|| nomfichier[i] == '?' || nomfichier[i] == ':' || nomfichier[i] == '"' || nomfichier[i] == '<' || nomfichier[i] == '>' || nomfichier[i] == '/' )
            {
                printf("Ces caractéres sont spéciaux. Ils ne sont pas permis pour l'écriture des noms de fichier.\n Voici des recommandations de nom:  ");
                break;
                
                
    
            }
            else
            {
                printf("Votre nom de fichier a été enregistré avec succés.")
            }
        }
    }

    l'enoncé est en haut(sous forme de commentaire) j'ai pas mis tous les caractéres spéciaux(je le ferai)

    Mon probléme est comment je dois faire pour suggérer des recommandations de nom à l'utilisateur.

    Merci d'avance!

    -
    Edité par FatimatouZahraTALL 7 septembre 2021 à 17:25:29

    • Partager sur Facebook
    • Partager sur Twitter
      7 septembre 2021 à 17:36:33

      Si l'un des caractères interdit est présent, tu doit le remplacer par le caractère underscore  '_'  (touche 8) et proposé ce nom à l'utilisateur.

      Donc dans la boucle tu fais juste les remplacement de caractère et quand tu as terminé tu propose le nom.

      • Partager sur Facebook
      • Partager sur Twitter
        7 septembre 2021 à 17:38:22

        rouIoude a écrit:

        Si l'un des caractères interdit est présent, tu doit le remplacer par le caractère underscore  '_'  (touche 8) et proposé ce nom à l'utilisateur.

        Donc dans la boucle tu fais juste les remplacement de caractère et quand tu as terminé tu propose le nom.

        j'ai bien compris cela mais comment le faire?



        • Partager sur Facebook
        • Partager sur Twitter
          7 septembre 2021 à 18:41:41

          Et bien tu parcours la chaîne de caractère, caractère par caractère à l'aide d'une boucle (C'est déjà ce que tu fais dans ton code) et si tu tombe sur un caractère interdit tu le remplaces par le caractère underscore (Au lieu d'écrire ton message à chaque fois que tu en trouve un).

          C'est pas compliqué ? 

          Essais déjà de faire cela.

          • Partager sur Facebook
          • Partager sur Twitter
            7 septembre 2021 à 18:55:51

            Au lieu d'afficher que les caractères sont invalides dans la boucle for suivi du if, tu fais: nomfichier[i] = '_';
            Tu devras enlever ton break, sinon tu ne verras que le premier caractère invalide.
            le else n'a pas sa place. Tu devras trouver un auttre truc pour savoir si le nom est bien valide.
            • Partager sur Facebook
            • Partager sur Twitter

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

              7 septembre 2021 à 19:55:29

              rouIoude a écrit:

              Et bien tu parcours la chaîne de caractère, caractère par caractère à l'aide d'une boucle (C'est déjà ce que tu fais dans ton code) et si tu tombe sur un caractère interdit tu le remplaces par le caractère underscore (Au lieu d'écrire ton message à chaque fois que tu en trouve un).

              C'est pas compliqué ? 

              Essais déjà de faire cela.*

              merci beaucoup



              • Partager sur Facebook
              • Partager sur Twitter
                16 septembre 2021 à 2:18:24

                Attention ligne 16 : Ton tableau ne prend que 15 caractères et fgets() en autorise 30
                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2021 à 3:46:17

                  Personne ne l'a vu, pas même moi ...
                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    16 septembre 2021 à 8:58:20

                    on a toujours interêt à découper en fonctions, pour simplifier le travail

                    int main() 
                    {
                         char nom_fichier[30];
                         lire_nom(nom_fichier, 30);
                         if (contient_caracteres_speciaux(nom_fichier)) {
                             printf("Contient des caractères spéciaux\n");
                             remplacer_caracteres_speciaux(nom_fichier);
                         }
                         printf("nom fichier = %s\n", nom_fichier);
                         return 0;
                    }

                    décomposition du travail, réutilisabilité, tout ça.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 septembre 2021 à 15:21:40

                      @michelbillaud:
                      Pas d'accord ou je n'ai pas compris ton idée.
                      Ça oblige à parcourir le nom deux fois, pour les détecter, et pour les remplacer.
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        16 septembre 2021 à 15:29:33

                        Dans les deux cas, c'est un parcours "linéaire" en temps proportionnel à la longueur de la chaine.

                        En pratique ça n'a strictement aucune importance si tu regardes

                        • la longueur moyenne d'une chaine représentant un nom de fichier (ici c'est limité à trente !)
                        • le fait que ça se fait en temps linéaire par rapport à la taille
                        • le nombre de millions d'opérations par seconde sur ton ordinateur
                        • le fait que tu parcours une fois la chaine lors de la lecture, et une autre pendant l'écriture.
                        Donc au nom de la séparation des tâches,  et de la programmation propre, il est largement préférable de séparer en deux fonctions.
                        bool contient_caracteres_speciaux(char chaine[]) 
                        {
                            for (int i = 0; chaine[i] != '\0'; i++) {
                                if (est_caractere_special(chaine[i])) {
                                    return true;
                                }
                            }
                            return false;
                        }
                        

                        -
                        Edité par michelbillaud 16 septembre 2021 à 15:35:12

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 septembre 2021 à 15:54:33

                          PierrotLeFou a écrit:

                          @michelbillaud:
                          Pas d'accord ou je n'ai pas compris ton idée.
                          Ça oblige à parcourir le nom deux fois, pour les détecter, et pour les remplacer.


                          Il faut toujours faire une version fonctionnelle simple et si on a besoin d'optimisation on utilise un profiler qui indique où ce sera le plus utile …

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 septembre 2021 à 18:24:04

                            Parce que ce n'est pas évident que de parcourir la chaîne deux fois est moins efficace?
                            Quel est le but de l'exercice? Détecter si le nom a des caractères invalides?Ou les corriger?
                            Par quoi devrait-on remplacer un caractère invalide si ça résulte d'une erreur?
                            • Partager sur Facebook
                            • Partager sur Twitter

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

                              16 septembre 2021 à 18:37:38

                              FatimatouZahraTALL a écrit:

                              Sous Windows (et sous beaucoup d’autres systèmes d’exploitation), certains caractères spéciaux sont utilisés par le système pour son fonctionnement interne. De ce fait, le nom d’un fichier ne peut pas par exemple contenir les caractères \ / " * : | ? < >

                              Ecrire un programme qui demande à l’utilisateur le nom qu’il souhaite donner à son fichier et lui dit s’il est correct (ne contient pas de caractère non autorisé) ou pas. Dans le cas où le nom renseigné est incorrect, le programme devra lui proposer un nom adéquat (remplacement des caractères interdits par le caractère underscore)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 septembre 2021 à 19:02:49

                                Merci pour la précision.
                                Et si l'utilisateur n'accepte pas la proposition?
                                Ça se fait en une seule boucle que de remplacer les caractères interdits par '_' et combien de remplacements ont été effectués.
                                Dans le main, on affiche la réponse appropriée.
                                • Partager sur Facebook
                                • Partager sur Twitter

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

                                  16 septembre 2021 à 19:26:57

                                  PierrotLeFou a écrit:

                                  Parce que ce n'est pas évident que de parcourir la chaîne deux fois est moins efficace?

                                  Perdre environ un tiers de nanoseconde rend-il le programme moins efficace ? dans l'absolu oui … dans la pratique ? non.

                                  Vouloir une version (supposée) optimisée sans en avoir besoin n'est pas une pratique à enseigner à des débutants, enfin àmha.



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 septembre 2021 à 1:30:54

                                    Enseigner qu'il faut parcourir la chaîne deux fois est-elle une meilleure pratique?
                                    Je parcours la chaîne une première fois pour savoir s'il y a des caractères invalides.
                                    Si oui, je la parcours une autre fois pour les remplacer.
                                    Désolé, mais je ne suis pas d'accord que ce soit une bonne pratique à enseigner.
                                    Le premier parcours ne nous apprend qu'une chose. C'est qu'il y a des caractères invalides.
                                    Si on doit parcourir la chaîne une autre fois, le premier parcours ne nous apprend rien et n'est pas utile dans ce cas.
                                    Il faudra tout de même retrouver  ces caractères invalides.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

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

                                      17 septembre 2021 à 6:47:03

                                      On n'enseigne pas qu'il FAUT parcourir deux fois.

                                      On enseigne (on essaie, au moins) qu'il faut découper son code en actions simples clairement identifiables. Et utilisables dans différents contextes, pour les tester à part, par exemple.

                                      Sinon la tendance naturelle du débutant, c'est de faire des fonctions bric à brac qui mélangent calcul , entrées sorties et dialogue utilisateur (pourquoi s'embeter à faire des fonctions, hein, c'est du boulot, c'est compliqué, et ça ralentit, finalement)

                                      L'action "remplacer tous les caractères interdits et retourner combien il y en avait" est envisageable mais n'est pas simple. Elle ne permet pas de tester si il y a des caractères interdits sans modifier.

                                      On peut interpréter le sujet en dissociant les deux : si il y a des caractères interdits, demander si il faut les remplacer et continuer, ou plutôt abandonner l'action en cours. 

                                      -
                                      Edité par michelbillaud 17 septembre 2021 à 6:52:35

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 septembre 2021 à 7:20:42

                                        michelbillaud a écrit:

                                        On n'enseigne pas qu'il FAUT parcourir deux fois.

                                        On enseigne (on essaie, au moins) qu'il faut découper son code en actions simples clairement identifiables. Et utilisables dans différents contextes, pour les tester à part, par exemple.

                                        Sinon la tendance naturelle du débutant, c'est de faire des fonctions bric à brac qui mélangent calcul , entrées sorties et dialogue utilisateur (pourquoi s'embeter à faire des fonctions, hein, c'est du boulot, c'est compliqué, et ça ralentit, finalement)

                                        L'action "remplacer tous les caractères interdits et retourner combien il y en avait" est envisageable mais n'est pas simple. Elle ne permet pas de tester si il y a des caractères interdits sans modifier.

                                        On peut interpréter le sujet en dissociant les deux : si il y a des caractères interdits, demander si il faut les remplacer et continuer, ou plutôt abandonner l'action en cours. 

                                        -
                                        Edité par michelbillaud il y a 23 minutes


                                        D'accord avec l'idée. On en vient à l'idée que les débutants ne savent pas comment exprimer leurs besoins. Faut pas les blâmer tout de même.

                                        S'ils savaient qu'on peut sauver beaucoup de code et de temps en écrivant les fonctions appropriées et de façon appropriée également.

                                        • Partager sur Facebook
                                        • Partager sur Twitter

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

                                          17 septembre 2021 à 14:23:52

                                          Il ne s'agit pas de les blâmer pour des choses qu'ils ne peuvent pas connaître au départ. Justement parce qu'ils sont là pour les apprendre.

                                          Si on les engueule quand ils ne le font pas alors qu'on leur a déjà dit, c'est de juste de la pédagogie, pour qu'ils s'en souviennent. Rien de personnel.

                                          Et quand on les frappe, c'est pas qu'on est en colère contre eux. Il ne faut jamais essayé de frapper les gens quand on est énervé, on risque trop  de les louper.

                                          -
                                          Edité par michelbillaud 17 septembre 2021 à 14:27:24

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          nom de fichier(chaine de caractére)

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