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


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 29
    Par défaut exercice en langage C
    Bonjour,
    je voulais faire un exercice simple en langage C (je débute en fait).
    L'exercice est de permuter quatre variable A, B, C et D tels que à la fin de l'exercice A et C seront permutés et D et B seront aussi permutés.
    Je voulais faire l’exercice avec un sous programme et en utilisant un pointeur.
    Voilà ce que j'ai fait
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void permute (int* A,int* B,int* C,int* D)
    {
     
     int perm1;
     int perm2;
     
     perm1=*A;
     *A=*C;
     *C=perm1;
     perm2=B;
     *B=*D;
     *D=perm2;
     
     
    }
    int main()
    {
     
     int A,B,C,D;
     printf("donnez la valeur de A\n");
     scanf("%d",A);
     printf("donnez la valeur de B") ;
     scanf("%d", B);
     printf("donnez la valeur de C");
     scanf("%d", C);
     printf("donnez la valeur de D");
     scanf("%d",D);
     printf("les valeurs de\n A=%d\nB=%d\nC=%d\nD=%d", A,B,C,D);
     permute(A,B,C,D);
     printf ("les nouvelles valeurs sont\nA=%d\nB=%d\nC=%d\nD=%d\n");
     return 0;
    }
    sauf que vous vous en doutez bien ça marche pas et je comprends pas pourquoi.
    Merci de m'aider.
    Cordialement.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zolafencer Voir le message
    Bonjour,
    je voulais faire un exercice simple en langage C (je débute en fait).
    L'exercice est de permuter quatre variable A, B, C et D tels que à la fin de l'exercice A et C seront permutés et D et B seront aussi permutés.
    Salut
    Déjà ici il y a un problème de conception. Tu veux permuter 4 variables A, B, C et D ben tu écris une fonction qui permute X et Y et tu appelles ta fonction avec A et B puis avec C et D...

    Citation Envoyé par zolafencer Voir le message
    Je voulais faire l’exercice avec un sous programme et en utilisant un pointeur.
    C'est d'ailleurs obligé !!!
    Citation Envoyé par zolafencer Voir le message
    Voilà ce que j'ai fait
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
     
    void permute (int* A,int* B,int* C,int* D)
    {
     
     int perm1;
     int perm2;
     
     perm1=*A;
     *A=*C;
     *C=perm1;
     perm2=B;
     *B=*D;
     *D=perm2;
    }
    Pourquoi 2 variables intermédiaires ???

    Citation Envoyé par zolafencer Voir le message
    Code c : 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
    int main()
    {
     
     int A,B,C,D;
     printf("donnez la valeur de A\n");
     scanf("%d",A);
     printf("donnez la valeur de B") ;
     scanf("%d", B);
     printf("donnez la valeur de C");
     scanf("%d", C);
     printf("donnez la valeur de D");
     scanf("%d",D);
     printf("les valeurs de\n A=%d\nB=%d\nC=%d\nD=%d", A,B,C,D);
     permute(A,B,C,D);
     printf ("les nouvelles valeurs sont\nA=%d\nB=%d\nC=%d\nD=%d\n");
     return 0;
    }
    sauf que vous vous en doutez bien ça marche pas et je comprends pas pourquoi.
    Pourtant tu l'as écrit toi-même. Que reçoit ta fonction permute ? 4 "int étoile". Que lui passes-tu ? 4 "int". Un "int" n'étant pas un "int étoile" cela ne peut pas marcher...

    Accessoirement je suis étonné que ton premier printf() te donne les bonnes valeurs. Ou s'il ne te les donne pas, je suis étonné que tu ne sois pas plus inquiet que ça parce que c'est exactement le même problème...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 29
    Par défaut
    Pour les pointeurs, ça te parait évident mais moi je vois pas l'utilité ( à vrai dire je maîtrise pas encore les pointeurs donc je ne sais pas quand on doit les utilise exactement).
    Pour le sous programme permute je vais faire comme tu l'as dit (avec X et Y), je vais donc faire avec une seule variable.
    Pour le premier printf , j'ai pas très bien compris ta remarque. mon programme quand je le compile il me demande la valeur de A, une fois celle ci saisie il plante!!
    Merci

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zolafencer Voir le message
    Pour les pointeurs, ça te parait évident mais moi je vois pas l'utilité ( à vrai dire je maîtrise pas encore les pointeurs donc je ne sais pas quand on doit les utilise exactement).
    Ah, on commence à toucher le fond du problème. Vois-tu, avant de voler il faut d'abord apprendre à marcher.

    Le problème de base, c'est qu'une fonction ne reçoit qu'une copie de l'élément qu'on lui passe.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void fct(int x)
    {
        x=18;
    }
     
    int main()
    {
        int a=12;
        fct(a);
    }

    Ici, la fonction reçoit une copie de la valeur 12 qu'elle stockera dans une variable nommée "x".
    Il va de soi qu'ensuite, si tu mets 18 dans x, cela n'a aucune influence sur le contenu de a.

    Si la fonction doit modifier a, il faut qu'elle sache où ce trouve ce a donc qu'elle ait non pas une copie du contenu de a mais une copie de son adresse donc qu'on passe à la fonction l'adresse de a
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
        int a=12;
        fct(&a);
    }

    Ayant cette adresse en main, la fonction la stockera dans un type capable de stocker des adresses donc un "type étoile". Cette adresse étant l'adresse d'un int, ce sera donc un "int étoile".
    Ayant cette adresse, la fonction sera capable d'aller y taper (grâce à l'opérateur "*") pour modifier la valeur qui s'y trouve

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fct(int* x)
    {
        *x=18;
    }

    C'est le même problème pour scanf. Cette fonction doit modifier le contenu de la variable pour y mettre ce qui est tapé au clavier; Il va de soi qu'il ne faut pas lui passer A mais ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Par défaut
    Bonjour,

    Pour ajouter un petit "truc" ... une erreur "d'inattention" s'est également glissée dans ton programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("les nouvelles valeurs sont\nA=%d\nB=%d\nC=%d\nD=%d\n");
    Ton programme ne va pas réellement trouver quoi mettre à la place de tes %d

    Ensuite, le plantage se fait après avoir rentré la valeur de A :
    => printf fonctionne mais pas scanf
    => cherche une erreur sur scanf
    => tu reprends ton tuto (apparemment tu dois pas apprendre le langage via un tuto parceque le scanf est une fonction assez basique)
    => tu regardes la structure d'un scanf
    => si tu comprends pas la structure, tu regardes un exemple
    => tu vois que devant ton A il te manque un caractère
    => tu fais tes modifs et ça marche

    Google peut te donner certaine réponses à tes problèmes sans passer par des forum... Ici, tu tapes juste "scanf" et voualaaaaaaaaaaaaaa.

    Sinon, bon courage pour ton apprentissage !

    TeqPAF

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 29
    Par défaut résolu
    merci beaucoup pour vos réponses
    Voisi le code correct
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void permute1 (int* x, int* y)
    {
     
     int perm1;
     
     perm1=*x;
     *x=*y;
     *y=perm1;
    }
     
    int main()
    {
     
     int A,B,C,D;
     printf("donnez la valeur de A\n");
     scanf("%d", &A);
     printf("donnez la valeur de B\n") ;
     scanf("%d", &B);
     printf("donnez la valeur de C\n");
     scanf("%d", &C);
     printf("donnez la valeur de D\n");
     scanf("%d", &D);
     printf("les valeurs de \nA=%d\nB=%d\nC=%d\nD=%d\n", A,B,C,D);
     permute1(&A,&C);
     printf ("les nouvelles valeurs sont\nA=%d\nC=%d\n", A,C);
     permute1(&B,&D);
     printf("les nouvelles valeurs sont\nB=%d\nD=%d\n", B,D);
     return 0;
    }
    par contre j'ai encore une question: si j'ai bien compris quand on utilise des pointeurs dans une fonction, il faut mettre des & devant les paramètres lors de l'appel de la fonction?
    Merci bcp encore

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

Discussions similaires

  1. un exercice en langage C
    Par khal22 dans le forum C
    Réponses: 4
    Dernier message: 05/05/2013, 12h15
  2. Exercices en langage assembleur du microprocesseur 8086
    Par lorye dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 10/01/2009, 18h04

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