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 :

Fonctions récursives en C


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Fonctions récursives en C
    Bonjour chers amis, j'ai un problème pour faire 2 fonctions récursives dont l'une cherche un élément dans un tableau et renvoie vrai s'il est trouvé ou faux sinon et l'autre qui permet de renverser un tableau. J'ai a chaque fois des erreurs de segmentation. Voici mes codes:
    Fonction estPresent
    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
    #include <stdio.h>
    #include <stdlib.h>
     
        int N, i, element;
     
     
    void saisirTableau(int T[], int N){
        for (i = 0; i < N; i++)
        {
            printf("Donnez le nombre %d: ", i+1);
            scanf("%d", &T[i]);
        }
    }
     
    void afficherTableau(int T[], int N){
        //int  i;
     
        printf("\n\nLes %d nombres saisis sont: \n\n", N);
        for (i = 0; i < N; i++)
        {
            printf("%d, ",  T[i]);
        }
    }
     
    int estPresent(int element, int T[], int N){
        typedef enum BOOL {false, true} bool;
        bool absent=false, present=true;
        int indice=T[0];
        if(indice==0) return absent;
        if(T[N]==element) return present;
        indice++;
        return estPresent(element,T,N-1);
    }
     
    int main()
    {
        int T[N];
        int element;
     
        printf("Combien de nombres voulez vous saisir? \n ");
        scanf("%d", &N);
     
        saisirTableau(T, N);
        afficherTableau(T, N);
     
        printf("\n\nDonnez l'élément que vous voulez rechercher dans le tableau: \n");
        scanf("%d", &element);
     
        estPresent(element,T,N);
     
        return 0;
    }
    Fonction inverserTableau:
    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
        int N, i;
        int T[15];
        int *debut,  *fin;
     
     
    void saisirTableau(int T[], int N){
        for (i = 0; i < N; i++)
        {
            printf("Donnez le nombre %d: ", i+1);
            scanf("%d", &T[i]);
        }
    }
     
    void afficherTableau(int T[], int N){
     
        printf("Les %d nombres saisis sont: ", N);
        for (i = 0; i < N; i++)
        {
            printf("%d, ",  T[i]);
        }
    }
     
    void inverserTableau(int T[], int N, int *debut, int *fin;)
    {
        int tampon;
     
            if (*debut < *fin)
            {
                tampon=T[*debut];
                T[*debut]=T[*fin];
                T[*fin]=tampon;
     
                inverserTableau(T, N, *debut+1, *fin-1);
            }
        //}
     
    }
     
    int main()
    {
     
        printf("Combien de nombres voulez vous saisir? \n ");
        scanf("%d", &N);
        saisirTableau(T, N);
        afficherTableau(T, N);
        printf("\n\nAprès inversion ");
        inverserTableau(T, N, &debut, &fin);
        afficherTableau(T, N);
     
        return 0;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut


    Je regarde ton code pendant ce temps là

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    C'est un peu le foutoir ton code. Je suppose que tu as eu un petit problème de copier/coller. Je l'ai nettoyé :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int N, i, element;
    int T[15];
    int *debut, *fin;
     
     
    void
    saisirTableau(int T[], int N)
    {
      for (i = 0; i < N; i++)
        {
          printf("Donnez le nombre %d: ", i+1);
          scanf("%d", &T[i]);
        }
    }
     
    void
    afficherTableau(int T[], int N)
    {
      printf("Les %d nombres saisis sont: ", N);
      for (i = 0; i < N; i++)
        {
          printf("%d, ", T[i]);
        }
    }
     
    void
    inverserTableau (int T[], int N, int *debut, int *fin)
    {
      int tampon;
     
      if (*debut < *fin)
        {
          tampon=T[*debut];
          T[*debut]=T[*fin];
          T[*fin]=tampon;
     
          inverserTableau(T, N, *debut+1, *fin-1);
        }
      //}
     
    }
     
    int main()
    {
     
      printf("Combien de nombres voulez vous saisir? \n ");
      scanf("%d", &N);
      saisirTableau(T, N);
      afficherTableau(T, N);
      printf("\n\nAprès inversion ");
      inverserTableau(T, N, &debut, &fin);
      afficherTableau(T, N);
     
      return 0;
    }
    Après cette étape une première compilation. Voila le résultat :
    main.c: In function ‘inverserTableau’:
    main.c:40:7: warning: passing argument 3 of ‘inverserTableau’ makes pointer from integer without a cast [enabled by default]
    main.c:30:1: note: expected ‘int *’ but argument is of type ‘int’
    main.c:40:7: warning: passing argument 4 of ‘inverserTableau’ makes pointer from integer without a cast [enabled by default]
    main.c:30:1: note: expected ‘int *’ but argument is of type ‘int’
    main.c: In function ‘main’:
    main.c:54:10: warning: passing argument 3 of ‘inverserTableau’ from incompatible pointer type [enabled by default]
    main.c:30:1: note: expected ‘int *’ but argument is of type ‘int **’
    main.c:54:10: warning: passing argument 4 of ‘inverserTableau’ from incompatible pointer type [enabled by default]
    main.c:30:1: note: expected ‘int *’ but argument is of type ‘int **’
    Commencer par supprimer ces warnings serait un bon début.

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Voilà une version de estPresent qui doit mieux fonctionner:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int N, i, element;
     
    void saisirTableau(int *T, int N)
    {
        for (i = 0; i < N; i++) {
            printf("Donnez le nombre %d: ", i + 1);
            scanf("%d", &T[i]);
        }
    }
     
    void afficherTableau(int *T, int N)
    {
     
        printf("\n\nLes %d nombres saisis sont: \n\n", N);
        for (i = 0; i < N; i++) {
            printf("%d, ", T[i]);
        }
    }
     
    int estPresent(int element, int *T, int N)
    {
        typedef enum BOOL { false, true } bool;
        bool absent = false, present = true;
        if (N == -1)
            return absent;
        if (T[N] == element)
            return present;
        return estPresent(element, T, N - 1);
    }
     
    int main()
    {
        int *T;
        int element;
        int rv;
     
        printf("Combien de nombres voulez vous saisir? \n ");
        scanf("%d", &N);
        T=malloc(N*sizeof(int));
     
        saisirTableau(T, N);
        afficherTableau(T, N);
     
        printf("\n\nDonnez l'élément que vous voulez rechercher dans le tableau: \n");
        scanf("%d", &element);
     
        rv=estPresent(element, T, N-1);
        printf("%d\n",rv);
     
        return 0;
    }

  5. #5
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Commencer par supprimer ces warnings serait un bon début.
    @mano2003 : Tu dois bien faire la différence entre les pointeurs (ici sur des entiers qui servent d'indices dans le tableau) et les données sur lesquelles ils pointent. Ta fonction récursive inverserTableau attend 2 pointeurs sur des indices qui définissent l'intervalle sur lequel elle va travailler. Et là, tu te plantes, 2 fois:

    * Dans l'appel récursif, tu lui passes... quoi?
    * Dans l'appel depuis main(), tu lui passes... quoi?

    Tous ces warnings sont en fait de vraies erreurs. (C'est presque toujours le cas, d'ailleurs.)

    denis

Discussions similaires

  1. fonction récursive: erreur
    Par calla29 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/05/2006, 11h51
  2. [VB6] XML, fonction récursive de recherche
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/04/2006, 21h27
  3. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  4. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  5. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12

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