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

 C++ Discussion :

Exercice de tri de caracteres dans un fichier:


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    infographiste
    Inscrit en
    Mai 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : infographiste

    Informations forums :
    Inscription : Mai 2022
    Messages : 2
    Par défaut Exercice de tri de caracteres dans un fichier:
    Bonjour à tous.
    Je souhaite créer un petit programme en C++ pour trier des caractères importés d'un fichier texte en Français. Et rien qu'au début j'ai déjà des problèmes
    Je vous explique, pour le moment je voudrais :
    1 - Importer un fichier texte dans un tableau dynamique(tabA) pour que la taille du tableau s'adapte à la longueur du texte qui peut donc varier.(et déjà je n'ai pas réussi, je suis donc parti sur des tailles de tableaux fixes)

    2 - Faire un premier tri du tableau (tabA) de tous les caractères importés vers un second tableau (tabB) ne contenant que les lettres minuscules. J'ai bien un embryon de code d'une instruction de condition dans une boucle pour exécuter cette tache mais le rangement des minuscules dans le deuxième tableau(tabB) ne se fait pas comme espéré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int i = 0; i < 200; i++)
    {
    	if (tabA[i] > 96 && tabA[i] < 173)
    	{
    		tabB[i] = tabA[i];// Tri et enregistrement dans le tableau B:
     
    		carNb++;//Nombre de caractères tries.
    	}
    }
    J'aurais voulu que tabA[i] ne renvoi pas les espaces entre les mots vers tabB[i] pourtant il le fait car sans doute par copie d'indice sur indice. Or ceux ci devraient être éliminé de fait par le if, mais non. En gros j'aurais voulu que tabA[i] ne renvoi aucun élément non correspondant aux minuscules. Or la j'ai des "=" à chaque espace dans le tabB. (Pourquoi d'ailleurs "=" ? )

    Le carNb pour nombre de caractères fonctionne aussi mal du coup.
    La tentative de récupération de la taille du tableau (sizeOf) pour en déduire le nombre de caractère n'est juste pas approprié la. ( = lacune de débutant )
    De ce que je comprends il par sur 32/4 = 8.

    Quoiqu'il en soit en affichant le tableau soit disant triés tabB, on se rend bien compte que cela ne fonctionne pas.

    Aussi je me demande si pour ce genre de problématique partir sur des tableaux est une bonne idée... car par la suite les

    Je met ci dessous le résultat de la compilation :

    Nom : Compilation.Jpeg
Affichages : 176
Taille : 24,6 Ko

    Ainsi que le code :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include<stdio.h>
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main() {
     
    //Variables et tableaux:
    int carNb = 0;
    char tabA[200] = { 0 };
    char* tabB = new char[200];//Tentative de tableau dynamique 
     
    //Pointeur:
    FILE* txtFile = NULL;
    //Affectation d'un fichier sur pointeur et ouverture:
    fopen_s(&txtFile, "./00_Ressources/TextToImport.txt", "r");
     
    //Enregistrement du contenu(caratere par caractere) du texte dans le fichier vers le tableau A:
    if (txtFile != NULL)
    {
    do {
    for (int i = 0; i < 200; i++)
    {
    tabA[i] = fgetc(txtFile);
    }
    } while (fgetc(txtFile) != EOF);
     
    //Fermeture fichier:
    fclose(txtFile);
    }
    else
    printf("Ouverture impossible");
     
    //Premier tri des caracteres par le code ASCII(Je ne garde que les lettres minuscules):
    for (int i = 0; i < 200; i++)
    {
    if (tabA[i] > 96 && tabA[i] < 173)
    {
    tabB[i] = tabA[i];// Tri et enregistrement dans le tableau B:
     
    carNb++;//Nombre de caracteres tries.
    }
    }
     
    // Affichage du tableau trié(tabB):
    cout << "Le nombre de lettre minuscule dans le texte est de : " << carNb << "\n";
    //ou
    cout << "Le nombre de lettre minuscule dans le texte est de : " << sizeof tabB << "\n";
     
    cout << "\nEt en voici la liste : " << "\n";
    for (int i = 0; i < carNb; i++)
    {
    //printf_s("%c\n", tabB[i]);
    cout << tabB[i] ;
     
    }
    cout << "\n";
    return 0;
    }

    Merci par avance pour vos retours, vos critiques et vos remarques.
    Cdt, Stephane.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Ton message avec les couleurs c'est n'importe quoi
    Ton orthographe c'est n'importe quoi triller, sérieusement
    Il y a la balise # pour mettre le code

    Ton allocation dynamique c'est n'importe quoi elle ne sert à rien
    Bonus: ton excercie c'est du C, pas du C++

    Ta logique c'est n'importe quoi il faut utiliser 2 compteurs, 1 compteur de parcours de ton tableau entrée et 1 autre pour savoir jusqu'à où tu t'es arrêté dans ton tableau résultat.
    Tu peux utiliser les caractères if ((tabA[i] >= 'a') && (tabA[i] <= 'z')) {.

  3. #3
    Candidat au Club
    Homme Profil pro
    infographiste
    Inscrit en
    Mai 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : infographiste

    Informations forums :
    Inscription : Mai 2022
    Messages : 2
    Par défaut
    Citation Envoyé par foetus Voir le message
    Ton message avec les couleurs c'est n'importe quoi
    Ton orthographe c'est n'importe quoi triller, sérieusement
    Il y a la balise # pour mettre le code

    Ton allocation dynamique c'est n'importe quoi elle ne sert à rien
    Bonus: ton excercie c'est du C, pas du C++

    Ta logique c'est n'importe quoi il faut utiliser 2 compteurs, 1 compteur de parcours de ton tableau entrée et 1 autre pour savoir jusqu'à où tu t'es arrêté dans ton tableau résultat.
    Tu peux utiliser les caractères if ((tabA[i] >= 'a') && (tabA[i] <= 'z')) {.
    Ok, merci, c'est vrai que je suis passé par les codes Ascii pour trier alors que les tableaux sont en caractère.

    Citation Envoyé par Bousk Voir le message



    C'est balèze je trouve, parce que des codes pour ouvrir un fichier et mettre tout son contenu dans un buffer il doit y en avoir des milliers sur internet et Google te donne des résultats probants en quelques millisecondes et il ya toute une page de FAQ sur ce site-même.


    std::isalpha
    std::islower

    Ou alors c'est parce que ton code, qui est du C et non du C++, fait n'importe quoi. Par quelle magie tu as sorti 96 et 173 ?
    Admettons que tu aies trouvé que 97 soit 'a'. La dernière fois que j'ai récité mon alphabet, en maternelle,, il comportant 26 lettres et non... 173 - 96 = 77.

    Ton truc, si tu le faisais vraiment en C++, ce serait 10 lignes pour ouvrir le fichier, mettre tout dans un vector et utiliser remove_if pour virer ce qui t'intéresse pas.
    Oui tu as raison, je me suis trompé sur le code décimale de z (122 et pas 173).
    Merci pour tes liens je vais regarder si j'y comprends quelque chose .

  4. #4
    Invité de passage
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2022
    Messages : 1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Ton message avec les couleurs c'est n'importe quoi
    Ton orthographe c'est n'importe quoi triller, sérieusement
    Il y a la balise # pour mettre le code

    Ton allocation dynamique c'est n'importe quoi elle ne sert à rien
    Bonus: ton excercie c'est du C, pas du C++

    Ta logique c'est n'importe quoi il faut utiliser 2 compteurs, 1 compteur de parcours de ton tableau entrée et 1 autre pour savoir jusqu'à où tu t'es arrêté dans ton tableau résultat.
    Tu peux utiliser les caractères if ((tabA[i] >= 'a') && (tabA[i] <= 'z')) {.
    Je ne comprends pas trop l'intérêt de ta réponse sur un forum d'entraide car n'elle n'apporte rien de constructif sauf peu être assouvir ta frustration de la vie en écrasant les autres. Bref ta réponse, c'est n'importe quoi et tu fais vraiment pitié...

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par tonino10 Voir le message
    Bref ta réponse, c'est n'importe quoi et tu fais vraiment pitié...
    Je donne 1 réponse, 1 réponse + langage C, @Bousk lui donne 1 réponse C++.
    Si tu veux je peux mettre le code si tu ne sais pas comment gérer 2 compteurs lors d'1 parcours, 1 pour chaque tableau

    Ensuite, je donne 1 conseil : en C, 1 caractère est aussi 1 nombre (c'est de type char). Cela évite les nombres magiques ... même si le code ASCII existe depuis plus de 30 ans.
    Et oui, l'allocation dynamique ne sert à rien ... parce qu'elle est statique (taille fixée à la compilation) "Tentative de tableau dynamique", dommage qu'il manque la désallocation, mais bon automatiquement fait à la fermeture.

    Après, j'aurais pu éditer mon message comme l'a fait 1 modo ou le O.P. ("Original Poster") : couleur, orthographe, mise en forme, quasi suppression de la pièce jointe.
    Mais je n'ai pas envie ... surtout que tu l'as "immortalisé".

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Ste_72 Voir le message
    triller


    Citation Envoyé par Ste_72 Voir le message
    1 - Importer un fichier texte dans un tableau dynamique(tabA) pour que la taille du tableau s'adapte à la longueur du texte qui peut donc varier.(et déjà je n'ai pas réussi, je suis donc parti sur des tailles de tableaux fixes)
    C'est balèze je trouve, parce que des codes pour ouvrir un fichier et mettre tout son contenu dans un buffer il doit y en avoir des milliers sur internet et Google te donne des résultats probants en quelques millisecondes et il ya toute une page de FAQ sur ce site-même.

    Citation Envoyé par Ste_72 Voir le message
    2 - Faire un premier tri du tableau (tabA) de tous les caractères importés vers un second tableau (tabB) ne contenant que les lettres minuscules.
    std::isalpha
    std::islower
    Citation Envoyé par Ste_72 Voir le message
    il le fait car sans doute par copie d'indice sur indice. Or ceux ci devraient être éliminé de fait par le if, mais non. En gros j'aurais voulu que tabA[i] ne renvoi aucun élément non correspondant aux minuscules. Or la j'ai des "=" à chaque espace dans le tabB. (Pourquoi d'ailleurs "=" ? )
    Ou alors c'est parce que ton code, qui est du C et non du C++, fait n'importe quoi. Par quelle magie tu as sorti 96 et 173 ?
    Admettons que tu aies trouvé que 97 soit 'a'. La dernière fois que j'ai récité mon alphabet, en maternelle,, il comportant 26 lettres et non... 173 - 96 = 77.

    Ton truc, si tu le faisais vraiment en C++, ce serait 10 lignes pour ouvrir le fichier, mettre tout dans un vector et utiliser remove_if pour virer ce qui t'intéresse pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  2. Réponses: 10
    Dernier message: 22/05/2006, 11h45
  3. Ecriture par caractere dans un fichier.
    Par SaianSupa dans le forum C
    Réponses: 5
    Dernier message: 29/11/2005, 15h31
  4. [langage] recuperer 8 caracteres dans un fichier
    Par ifan dans le forum Langage
    Réponses: 12
    Dernier message: 24/05/2005, 17h01
  5. remplacer un caractere dans un fichier
    Par ickis dans le forum C
    Réponses: 11
    Dernier message: 13/10/2003, 09h29

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