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 :

Fichier d'entiers triés


Sujet :

C

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Points : 39
    Points
    39
    Par défaut Fichier d'entiers triés
    Bonjour à tous,

    Comment implémenter une fonction en C qui permet de créer un fichier d'entiers triés ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    file * nom_fonction(int x) {
    	f = fopen("C:\file.txt", "w");
    	do {
    		printf("Donner un entier :");
    		scanf("%d", &V);
     
    		while (V > 0) {
    			fprintf(f, "%d", V);
    		}
    	} while (V != 0);
     
    	fclose(f);
    }
    Est-ce que la syntaxe est juste ?

  2. #2
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Alors j'essaye de répondre sans te donner la réponse directement.

    Ton code devrais marché, même si ta fonction "nom_fonction" semble inutile.

    Quel points :
    1) Pense a donner des noms explicite par exemple pour le pointeur de type FILE, (n'oublie pas le NULL) important.

    2) Pense que ça peut être pratique des fois de placer le nom de ton fichier dans un char. Comme ça tu peux enchaîner sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fichier = fopen(char_nom_fichier, "r");
    Rappel : N'oublie pas que seuls les droits d'ouverture de fichier "r" / "r+" ne permettent pas de créer le fichier au préalable si ce n'est pas fait.

    Je suis pressé, je go au taf et je reviens vers toi. Mais je t'incite à aller voir le tuto sur le C.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Est-ce que la syntaxe est juste ? Demande à ton compilateur, il est fait pour ça :
    07:53:45 **** Incremental Build of configuration Debug for project Developpez ****
    make all 
    Building file: ../src/developpez.c
    Invoking: GCC C Compiler
    gcc -std=c99 -O0 -g3 -pedantic -Wall -Wextra -c -fmessage-length=0 -MMD -MP -MF"src/developpez.d" -MT"src/developpez.d" -o "src/developpez.o" "../src/developpez.c"
    ../src/developpez.c:1:1: error: unknown type name 'file'
    file * nom_fonction(int x) {
    ^
    ../src/developpez.c:2:2: error: use of undeclared identifier 'f'
            f = fopen("C:\file.txt", "w");
            ^
    ../src/developpez.c:2:6: warning: implicit declaration of function 'fopen' is invalid in C99 [-Wimplicit-function-declaration]
            f = fopen("C:\file.txt", "w");
                ^
    ../src/developpez.c:4:3: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
                    printf("Donner un entier :");
                    ^
    ../src/developpez.c:4:3: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
    ../src/developpez.c:5:3: warning: implicitly declaring library function 'scanf' with type 'int (const char *restrict, ...)'
                    scanf("%d", &V);
                    ^
    ../src/developpez.c:5:3: note: please include the header <stdio.h> or explicitly provide a declaration for 'scanf'
    ../src/developpez.c:5:16: error: use of undeclared identifier 'V'
                    scanf("%d", &V);
                                 ^
    ../src/developpez.c:7:10: error: use of undeclared identifier 'V'
                    while (V > 0) {
                           ^
    ../src/developpez.c:8:4: warning: implicit declaration of function 'fprintf' is invalid in C99 [-Wimplicit-function-declaration]
                            fprintf(f, "%d", V);
                            ^
    ../src/developpez.c:8:4: warning: declaration of built-in function 'fprintf' requires inclusion of the header <stdio.h> [-Wbuiltin-requires-header]
    ../src/developpez.c:8:12: error: use of undeclared identifier 'f'
                            fprintf(f, "%d", V);
                                    ^
    ../src/developpez.c:10:11: error: use of undeclared identifier 'V'
            } while (V != 0);
                     ^
    ../src/developpez.c:12:2: warning: implicit declaration of function 'fclose' is invalid in C99 [-Wimplicit-function-declaration]
            fclose(f);
            ^
    ../src/developpez.c:12:9: error: use of undeclared identifier 'f'
            fclose(f);
                   ^
    6 warnings and 7 errors generated.
    make: *** [src/developpez.o] Error 1
    
    07:53:45 Build Finished (took 60ms)
    
    Ah..... Je crois que gcc (clang en fait) n'est pas d'accord.

    Commence par ajouter les includes puis corrige les problèmes un par un.

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Points : 39
    Points
    39
    Par défaut
    Merci le tutoriel m'a bien aidé, j'ai modifié et compilé mon programme et y a aucune erreur pour le moment

    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
    FILE * Creatio (char nom[50])
    {   FILE *f;
        int V;
     
        f=fopen(nom,"r");
        if (f = NULL)
        {  // On affiche un message d'erreur si on veut
            printf("Impossible d'ouvrir le fichier test1.txt");
        }
        else
        { //mettre entier triés dans fichier
            do
            {
    		printf("Donner un entier :");
    		scanf("%d", &V);
     
    		while (V > 0) {
            fprintf(f, "%d", V);
    		}
    	    }while (V != 0);
        }
        return f;
    }
    Est ce que ma condition sur le tri est juste !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alias2015_29 Voir le message
    Est ce que ma condition sur le tri est juste !
    Quel tri ?
    Essaye, et tu auras la réponse à ta question. C'est le minimum... Tu te rendrais compte qu'il n'y a pas de tri, et qu'il y a une belle boucle infinie dès que tu rentres une valeur > 0.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alias2015_29 Voir le message
    Comment implémenter une fonction en C qui permet de créer un fichier d'entiers triés ?
    Bonjour

    Tu as 2 façons de faire
    1. tu stockes et tries tes entiers en mémoire puis tu écris la liste triée dans un fichier. Ca peut se faire via un tableau que tu trieras avec qsort() (fonction déjà toute faite) ou bien une liste chainée triée à la création.
    2. tu lis et relis le contenu fichier en écrivant au fur et à mesure dans un fichier temporaire et quand tu as fini, tu effaces le fichier d'origine et renomme le temporaire (ou bien l'inverse: tu commences par recopier le fichier d'origine dans le temporaire puis tu lis et relis le temporaire en écrivant tes entiers dans l'ordre un à uns dans le fichier d'origine)


    Perso la mémoire étant généralement assez conséquente (surtout avec la swap en plus), et les accès disques étant plutôt longs, j'utiliserais la méthode n° 1.

    Citation Envoyé par alias2015_29 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (V > 0) {
            fprintf(f, "%d", V);
    }
    Citation Envoyé par archMqx. Voir le message
    et qu'il y a une belle boucle infinie dès que tu rentres une valeur > 0.
    C'est vrai que faire une boucle sur une valeur de V qui ne change pas dans la boucle... Sans déconner tu ne ressens vraiment rien au moment ou tu "écris" ce genre de truc ?

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Points : 39
    Points
    39
    Par défaut
    j'ai voulu tester l'entier à saisir à la valeur précédente si elle est supérieur à l'ancienne valeur elle sera enregistrer dans le fichier sinon il boucle jusqu’à donner une valeur plus grande (tri croissant)

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alias2015_29 Voir le message
    j'ai voulu tester l'entier à saisir à la valeur précédente
    Nulle part tu compares la valeur saisie à la "valeur précédente" !!! Je ne sais pas moi, elle est où pour toi la "valeur précédente" ???

    Citation Envoyé par alias2015_29 Voir le message
    si elle est supérieur à l'ancienne valeur elle sera enregistrer dans le fichier sinon il boucle jusqu’à donner une valeur plus grande (tri croissant)
    Ah mais là cela ne correspond pas à ce que tu as dit dans ton premier post. Dans ton premier post tu définis ton problème comme "j'ai des entiers et je veux les trier". A ce moment là, la saisie des entiers est annexe, elle n'est là que pour te créer des valeurs correspondant à ton problème pour que tu puisses ensuite tester ta solution qui pourra ensuite être appliquée à tous les fichiers d'entiers du monde.

    Maintenant, ton problème devient "je n'ai pas de valeurs et je veux forcer l'utilisateur à les rentrer à ma convenance". Ce n'est plus du tout pareil et la façon de faire ne sera pas la même...

  9. #9
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Ça serait pas si mal que tu pense à faire un tableau d'entier, avec une taille MAX. Dans lequel tu pourras tu placé tous tes entiers, et au lieu d'avoir à rentrer toi-même les valeurs du tableau, tu pourrais te renseigner sur le rand() du <time.h>.

    Pour un affichage basique, données non triées :
    Une boucle for, incrémentant une variable (par exemple 'i'), jusqu'à ce qu'elle soit égal à taille MAX. Utilise cette variable ' i ' pour parcourir le tableau et afficher éléments par éléments.

    Pour un affichage trié, tu as plusieurs solution : des algorithmes de tri tel que le quicksort, le mergesort, le tri à bulles, le tri sélection ... etc

  10. #10
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Mince du coup, précise nous bien ce que tu veux faire.

    1) Tu veux écrire dans valeurs de type int dans un fichier. Puis comme si elle t'étais inconnue tu lie le fichier de tel sorte que tu récupère les éléments souhaité puis tu les tris ?

    Ou

    2) Ce que je te proposais dans mon précédent message ...

    Donne nous dès ton premier message des instructions précises pour ne pas nous envoyés sur une mauvaise piste ...

    Mais dans les deux cas, tu vas devoir apprendre les algorithmes de tri, certains sont plus complexes que d'autres donc choisit bien et prend ton temps :
    http://fr.scribd.com/doc/26076235/La...rithmes-de-Tri

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Points : 39
    Points
    39
    Par défaut
    objectif de l'exercice est de implémenter une fonction en C qui permet de créer un fichier d'entiers triés.
    c.a.d lors de saisie des entiers je vérifie l'ancienne valeur qui est dans le fichier si la nouvelle > a celle fichier sera enregistrer dans fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do{
    	printf("Donner un entier :");
    	scanf("%d", &V);
    	while (V > 0) {        
                fprintf(f, "%d", V);
               do{
                printf("Donner un entier :");
    	    scanf("%d", &X); 
                }while(X>V);
                 fprintf(f, "%d", V); 
      }
        }while (V != 0);
    est ce mon implémentation du code est juste ?!

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alias2015_29 Voir le message
    objectif de l'exercice est de implémenter une fonction en C qui permet de créer un fichier d'entiers triés.
    Dans ce cas, pourquoi ne pas suivre la première solution envisagé par sieur Sve@r ?
    1. tu stockes et tries tes entiers en mémoire puis tu écris la liste triée dans un fichier. Ca peut se faire via un tableau que tu trieras avec qsort() (fonction déjà toute faite) ou bien une liste chainée triée à la création.
    Tant que l'utilisateur rentre des entiers, tu les stockes dans un tableau. Soit tu tries le tableau à chaque nouvelle valeur, soit tu attends que l'utilisateur ai finis de rentrer les entiers et tu le tries ensuite.
    Quand le tableau est trié, il ne te reste plus qu'à écrire son contenu dans le fichier, et le tour est joué.
    De plus, trier le tableau, mais de quel manière ? Tri ascendant, descendant ? Sans précision, pas de chocolat...


    Si par contre, à chaque entier rentré par l'utilisateur, tu l'écris directement dans le fichier, tu vas d'abord t'assurer d'insérer l'entier au bon endroit en parcourant le fichier, et ensuite tu devras décaler tout les entiers qui se trouve après lui. Mais, comme le dit sieur Sve@r, ce n'est ni la méthode la plus simple, ni la méthode la plus efficace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do{
    	printf("Donner un entier :");
    	scanf("%d", &V);
    	while (V > 0) {        
                fprintf(f, "%d", V);
               do{
                printf("Donner un entier :");
    	    scanf("%d", &X); 
                }while(X>V);
                 fprintf(f, "%d", V); 
      }
        }while (V != 0);
    est ce mon implémentation du code est juste ?!
    Bah je ne sais pas, à ton avis, est-ce correct ? As-tu seulement compilé et lancer le programme une fois pour voir si c'était correct et juste ?
    surement pas Je ne pense pas, sinon ce que tu viens de faire te sauterais au yeux (et à la figure).

    Ici, tu ne fais que comparer deux nombres entre eux... Quid des nombres précédent ?
    En supposant que tu souhaites un tri descendant (comme le suggère ton code), si tu rentre la suite de nombre 9 5 7 2 5 3 1 0 par exemple, en suivant ta logique on comparera 9 et 5, puis 9 et 7, puis 9 et 2, ensuite 9 avec 5, puis 9 avec... Une magnifique, énorme, monstrueuse, génial boucle infinie. Comment tu sors de la boucle while (V > 0) en ne modifiant JAMAIS la valeur de V dedans ?

    Tu veux "trier" l'ensemble du tableau sur une valeur "étalon".. Mais ce n'est pas ce que tu veux, je me trompe ?
    Tu dois avoir un endroit ou tu puisses stocker et retrouver tes nombres une fois rentrer, et lire ce qu'il y a eu avant pour vérifier que tout est bon.

    De plus, 0 est lui-même un chiffre. Pourquoi tant de racisme envers lui ? Il a été puni, il n'a pas le droit de se retrouver dans un tableau trié? (A moins que cela ne soit imposé, mais sans en savoir plus...)

    La moindre des choses, cela serait d'expérimenter le code que tu nous donnes, d'essayer, de comprendre ce que l'on te dit et d'agir en conséquence. Par deux fois, on te donne les clés pour comprendre et réaliser une solution face à ton problème. Mais si tu ne fais même pas l'effort de tester les "choses" (appelons un chat, un chat) sur lesquels tu nous demandes de t'aider, ... Il faut arrêter quoi.
    Dernière modification par Invité ; 04/12/2014 à 06h21.

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alias2015_29 Voir le message
    objectif de l'exercice est de implémenter une fonction en C qui permet de créer un fichier d'entiers triés.
    c.a.d lors de saisie des entiers je vérifie l'ancienne valeur qui est dans le fichier si la nouvelle > a celle fichier sera enregistrer dans fichier
    Mais non cela ne revient pas à dire ça !!! Désolé mais tu n'es pas encore assez précis

    Ton objectif peut se lire de deux façons
    • offrir à l'utilisateur la possibilité de saisir n'importe quelle suite d'entiers (par exemple 2, 3, 8, 1, 7, 4) et ton programme se charge de trier cette suite pour la stocker dans le fichier (1, 2, 3, 4, 7, 8)
    • imposer à l'utilisateur de ne pouvoir saisir que des entiers croissants. Dans ce cas, une fois qu'il aura saisi "8", les chiffres "1", "7" et "4" seront refusés


    La façon dont tu considères l'énoncé aura des répercussions sur ton code (et aussi sur l'accueil qu'en feront les demandeurs si cela correspond ou pas à ce que eux veulent). Et là, on ne sait pas si cette conclusion que tu en faits (obliger les utilisateurs à rentrer leurs entiers dans l'ordre qui t'arrange) vient de ta façon de lire la demande ou si c'est réellement comme ça que la demande a été faite.

    Accessoirement, dans ta façon de faire, étant donné que les valeurs saisies sont d'abord mémorisées avant d'être écrites dans le fichier, c'est dommage d'aller comparer la nouvelle saisie avec l'ancienne valeur dans le fichier. Cela t'oblige à relire le fichier (opération super longue) alors qu'il est si facile de mémoriser cette "précédente" valeur au moment où celle ci était saisie...

Discussions similaires

  1. Fichiers et entiers
    Par nightwar dans le forum SDL
    Réponses: 4
    Dernier message: 21/03/2008, 00h39
  2. Lire un fichier d'entier avec SDL en C
    Par gsaly dans le forum SDL
    Réponses: 15
    Dernier message: 07/05/2007, 20h41
  3. [HP-UX] 3 Fichiers en 1 trié par N° Ligne
    Par argoet dans le forum Unix
    Réponses: 3
    Dernier message: 21/04/2007, 11h49
  4. Réponses: 7
    Dernier message: 01/02/2007, 18h02
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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