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 en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Par défaut Exercice en C
    bonsoir

    j'ai un exercice dans les pointeurs manipulé par le langage C
    et je suis debutante en programmation

    je veux me dire si cette solution est juste ou non

    1- Au démarrage du programme principal on a demandé à l'utilisateur combien de case il veut utiliser .

    2- Faite en suite l'allocation de la zone mémoire sachant que la taille désirée est : N*taille d'un entier . à vous de trouvez comment.

    3-L'espace est alloué , faire les fonction suivantes:

    * void trier( int Nb_case, int *ptr)
    qui permet d'ordonner en croissant les valeurs qui se trouvent dans le'éspace reservé par le programme principal

    *void afficher( int Nb_case, int *ptr)
    qui permet d'afficher les valeurs stockées dans l'éspace réservé.

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<alloc.h>
     
    void Trier(int Nb_case, int *ptr)
    {
    int i=0,j,V;
    while(i<Nb_case)
      {
    	 for(j=i+1;j<=Nb_case;j++)
    		if(*(ptr+i) > *(ptr+j))
    			{
    			 V= *(ptr+j);
    			 *(ptr+j)= *(ptr+i);
    			 *(ptr+i)=V;
    			 }
     
    	  i=i+1;
      }
    }
     
    void Afficher(int Nb_case, int *ptr)
    {
      int i=0;
     
      for(i=0;i<Nb_case;i++)
     
    	 printf("%d\n",*(ptr+i));
     
     
    }
     
    void main()
    {
    int *p; int nb;
     
    //l'introdution le nbr de cases à allouer
     
      scanf("%d",&nb);
     
    while (nb<=0)
      scanf("%d",&nb);
     
    // L'allocation de la zone memoire
     
    p=(int *) malloc(nb);
    Trier(nb,p);
    Afficher(nb,p);
    free(p);
     
    }
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour le main() : C'est pas mal, mais:
    1. La fonction main() retourne un int. Toujours.
    2. Tu peux utiliser un do-while à la place du while, ce qui t'évitera de dupliquer le scanf().
    3. On ne caste pas le retour de malloc() en C.
    4. Tu oublies de tester le retour de malloc(). Il faut toujours vérifier que malloc() n'a pas retourné NULL.


    Pour ta fonction de tri, tu peux utiliser ptr[i] et ptr[j] au lieu de *(ptr+i) et *(ptr+j). Ce sera à la fois plus court et plus compréhensible.
    Même remarque pour ta fonction d'affchage.

    À part ces remarques sur la forme, le fond (hormis le test de malloc()) m'a l'air correct...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    [*]La fonction main() retourne un int. Toujours.[*]On ne caste pas le retour de malloc() en C.
    fonction() en C ne signifie pas "ne prend pas d'argument"
    Donc c'est : int main(void)
    D'ailleur je crois que seul
    int main(void) et int main(int argc, char** argv) sont autorisés en c99

    Ensuite le cast du retour de malloc n'est pas inutil il permet de mieux voir ce qu'on manipule, et de generer des warnings dès la compilation en cas de mauvaise utilisation.Après chacun ses habitudes, mais il n'y a pas de mal à le faire ou alors quels sont les arguments contre?

    edit:

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par totaliou Voir le message
    Ensuite le cast du retour de malloc n'est pas inutil il permet de mieux voir ce qu'on manipule, et de generer des warnings dès la compilation en cas de mauvaise utilisation.
    Perdu, il permet de CACHER des warnings si l'on oublie d'inclure <stdlib.h>. Des warnings qu'il vaut mieux ne pas cacher sur certaines plate-formes, notamment Win64 et toute plate-forme basée sur un 68k, où un int n'est pas retourné de la même manière qu'un pointeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Perdu, il permet de CACHER des warnings si l'on oublie d'inclure <stdlib.h>. Des warnings qu'il vaut mieux ne pas cacher sur certaines plate-formes, notamment Win64 et toute plate-forme basée sur un 68k, où un int n'est pas retourné de la même manière qu'un pointeur.
    Malloc n'est pas définie dans le header stdlib.h? son oublie devrait creer une erreur avant même de s'inquieter du type? Enfin je connais pas les plates-formes dont tu parles...

    Sinon je crois que ca va depasser l'allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(j=i+1;j<=Nb_case;j++)
           if(*(ptr+i) > *(ptr+j))

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Justement non, en C, on aura juste un warning "implicit declaration" (si on a pensé à l'activer) et un warning "making pointer from integer without à cast".
    C'est ce second warning qui sautera si on a connement mis un cast qui ne sert à rien...
    Mais dans tous les cas, ça compilera quand même à moins qu'on n'ait mis un paramètre du genre -Werror...

    Ce cast est officiellement déclaré inutile par les auteurs du C depuis l'errata du K&R2.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Par défaut
    Bon alors tout d'abord une maladresse qu'il nous faut tout de suite corriger


    au lieu d'écrire *(ptr+j)
    ecrit plutot ptr[j]

    c'est équivalent mais c'est plus rapide , moins de risque d'erreur et quand on lit ton code on sait que l'on à affaire à un tableau et non juste à des pointeurs

    deuxièment la libraire alloc.h n'est pas nécessaire ici , les fonctions de stdlib et stdio suffisent

    pour le moment ton programme fait un depassement de memoire , bon vu quec'est un exercice , je te donne juste un indice

    l'erreur se trouve à l'endroit de l'allocation , le malloc (nbr ) alloue juste un espace de nbr byte or tu veux un espace de nbr * taille d'un int , une petite recherche sur l'allocation dynamique de tableau t'apportera la réponse

    sinon c'est étrange comme exercice car personnellement sous linux et gcc le tableau à du mal à être trié vu que tout les emplacement sont initialisé à 0 ^^

    par contre je n'ai pas encore regardé si ta fonction de tri etait correcte


    edit : desolé j'ai mis trop de temps à écrire ma réponse moi^^

    ps: vu qu'elle incremente le i à la fin du while , une boucle for est plus approprié

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ah, je n'avais pas vu le coup de l'oubli de multiplication dans le malloc().
    Par contre, alloc.h n'est pas une "librairie" (On dit "bibliothèque", cad "library" en Anglais), c'est un fichier d'en-tête. Et en effet, c'est un fichier d'en-tête non-standard qui n'a rien à faire ici.

    Et je n'avais pas pigé non plus que le tableau n'était pas rempli. C'est marrant, on repère vite ce qui est en trop, mais beaucoup plus difficilement ce qui manque...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [VB6] Exercice de Combinatoire
    Par fichtre! dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 19/01/2005, 14h27
  2. Un cours de C/C++ avec exercices corrigés
    Par merrheim dans le forum C++
    Réponses: 65
    Dernier message: 18/01/2005, 22h30
  3. Demande de corrections d'exercices Turbo Pascal
    Par Helpine dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 16/01/2005, 10h38
  4. Pages d'exercices à faire pour l'autoformation ?
    Par [thebadskull] dans le forum Evolutions du club
    Réponses: 13
    Dernier message: 15/06/2004, 20h26
  5. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26

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