Les fonctions en C
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Les fonctions en C



  1. #1
    hibabel

    Les fonctions en C


    ------

    Bonjour tout le monde
    j'ai rencontre un probleme en faisant un exercice sur les fonctions .
    Bon , je dois entrer les informations d'une entreprise : nombre d'ateliers NAF, nom du responsable d'atelierNomRA , nombre des emplyes NEF dans chaque ateliers ...
    en utilisant les pointeur
    Bon , mon probleme c'est dans la fonction d'entree : voila la fonction
    void ENT(char *P)
    {scanf("%s",Intro);
    P=malloc((strlen(Intro)+1)*siz eof(char));
    if(P) strcpy(P,Intro);
    else {printf("pas assez de memoire\n");
    exit(-1);}}
    quand j'entre les information y a pas de probleme ,mais , par exemple si je veux afficher le nom du responsable d'atelier rien ne s'affiche , je ne sais pas pourquoi
    veuillez m'aider svp .

    -----

  2. #2
    hibabel

    Re : Les fonctions en C

    voici tout le programme

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /*declaration des variables */
    char **i,**j,*NomAF[20],*NomRA[20],*NomE[20][20],Intro[20],IndiceP[20][20];
    int NAF,NEF[20],NPF[20][20],Taux;
    float TotalIID,Tind[20],IndP[20][20];
    void ENT(char *P)
    {scanf("%s",Intro);
    P=malloc((strlen(Intro)+1)*siz eof(char));
    if(P) strcpy(P,Intro);
    else {printf("pas assez de memoire\n");
    exit(-1);}}
    void trait(char indice, int i , int j){
    if(indice=='A')
    Taux=20;
    if(indice=='B')
    Taux=10;
    if(indice=='C')
    Taux=5;
    indice='A';
    IndP[i][j]=Taux*NPF[i][j];
    Tind[i]+=IndP[i][j];}
    void affichage ( )
    {
    for(i=NomAF;i<NomAF+NAF;i++)
    {printf("Nom d'atelier de fabrication %d",i-NomAF+1);
    puts(NomAF[i-NomAF]);
    printf("Nom de responsabe d'atelier %d",i-NomAF+1);
    puts(NomRA[i-NomAF]);
    for(j=NomAF;j<NomAF+NEF[i-NomAF];j++)
    {puts(NomE[i-NomAF][j-NomAF]);
    printf("NPF est %d",NPF[i-NomAF][j-NomAF]);
    printf("indice P est %c",IndiceP[i-NomAF][j-NomAF]);
    printf("IndP est %d",IndP[i-NomAF][j-NomAF]);
    printf("le total d'indemnite de l'atelier %d est %f",i-NomAF+1,Tind[i-NomAF]);
    }
    printf("Totaux des indemnites des employes du groupe Motoprod pendant la journee est %f",TotalIID);
    }}
    void main ( ){
    /*Entrees et traitement des donnees*/
    printf("entrez le nombre d'ateliers de fabrication ");
    scanf("%d",&NAF);
    for(i=NomAF;i<NomAF+NAF;i++)
    {printf("Atelier %d\n",i-NomAF+1);
    printf("enterz le nom de l'atelier de fabrication\n");
    ENT(NomAF[i-NomAF]);
    printf("enterz le nom de responsable l'atelier de fabrication\n");
    scanf("%s",Intro);
    NomRA[i-NomAF]=(char*)malloc((strlen(Intro)+ 1)*sizeof(char));
    if(NomRA[i-NomAF])
    strcpy(NomRA[i-NomAF],Intro);
    else {printf("pas assez de memoire\n");
    exit(-1);}
    printf("entrez le nombre des employes de fabrication\n");
    scanf("%d",&NEF);
    for(j=NomAF;j<NomAF+NEF[i-NomAF];j++)
    {printf("entrez le nom de l'emplye %d",j-NomAF+1);
    scanf("%s",Intro);
    NomE[i-NomAF][j-NomAF]=(char*)malloc((strlen(Intro)+ 1)*sizeof(char));
    if(NomE[i-NomAF][j-NomAF]) strcpy(NomE[i-NomAF][j-NomAF],Intro);
    else {printf("pas assez de memoire ");
    exit(-1);}
    printf("entrez le nombre de pieces fabriquees par l'emplpoyer de l'atelier");
    scanf("%d",&NPF[i-NomAF][j-NomAF]);
    printf("entrez l'indice P\n");
    scanf("%s",&IndiceP[i-NomAF][j-NomAF]);
    trait(IndiceP[i-NomAF][j-NomAF],i-NomAF ,j-NomAF);
    TotalIID+=Tind[i-NomAF];
    }}
    affichage( );
    }

  3. #3
    pm42

    Re : Les fonctions en C

    La 1ère des choses est d'utiliser la balise CODE. Tel quel, tes posts sont difficilement lisibles.

  4. #4
    hibabel

    Re : Les fonctions en C

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /*declaration des variables */
    char **i,**j,*NomAF[20],*NomRA[20],*NomE[20][20],Intro[20],IndiceP[20][20];
    int NAF,NEF[20],NPF[20][20],Taux;
    float TotalIID,Tind[20],IndP[20][20];
    void ENT(char *P)
    {scanf("%s",Intro);
    P=malloc((strlen(Intro)+1)*siz eof(char));
    if(P) strcpy(P,Intro);
    else {printf("pas assez de memoire\n");
    exit(-1);}}
    void trait(char indice, int i , int j){
    if(indice=='A')
    Taux=20;
    if(indice=='B')
    Taux=10;
    if(indice=='C')
    Taux=5;
    indice='A';
    IndP[i][j]=Taux*NPF[i][j];
    Tind[i]+=IndP[i][j];}
    void affichage ( )
    {
    for(i=NomAF;i<NomAF+NAF;i++)
    {printf("Nom d'atelier de fabrication %d",i-NomAF+1);
    puts(NomAF[i-NomAF]);
    printf("Nom de responsabe d'atelier %d",i-NomAF+1);
    puts(NomRA[i-NomAF]);
    for(j=NomAF;j<NomAF+NEF[i-NomAF];j++)
    {puts(NomE[i-NomAF][j-NomAF]);
    printf("NPF est %d",NPF[i-NomAF][j-NomAF]);
    printf("indice P est %c",IndiceP[i-NomAF][j-NomAF]);
    printf("IndP est %d",IndP[i-NomAF][j-NomAF]);
    printf("le total d'indemnite de l'atelier %d est %f",i-NomAF+1,Tind[i-NomAF]);
    }
    printf("Totaux des indemnites des employes du groupe Motoprod pendant la journee est %f",TotalIID);
    }}
    void main ( ){
    /*Entrees et traitement des donnees*/
    printf("entrez le nombre d'ateliers de fabrication ");
    scanf("%d",&NAF);
    for(i=NomAF;i<NomAF+NAF;i++)
    {printf("Atelier %d\n",i-NomAF+1);
    printf("enterz le nom de l'atelier de fabrication\n");
    ENT(NomAF[i-NomAF]);
    printf("enterz le nom de responsable l'atelier de fabrication\n");
    scanf("%s",Intro);
    NomRA[i-NomAF]=(char*)malloc((strlen(Intro)+ 1)*sizeof(char));
    if(NomRA[i-NomAF])
    strcpy(NomRA[i-NomAF],Intro);
    else {printf("pas assez de memoire\n");
    exit(-1);}
    printf("entrez le nombre des employes de fabrication\n");
    scanf("%d",&NEF);
    for(j=NomAF;j<NomAF+NEF[i-NomAF];j++)
    {printf("entrez le nom de l'emplye %d",j-NomAF+1);
    scanf("%s",Intro);
    NomE[i-NomAF][j-NomAF]=(char*)malloc((strlen(Intro)+ 1)*sizeof(char));
    if(NomE[i-NomAF][j-NomAF]) strcpy(NomE[i-NomAF][j-NomAF],Intro);
    else {printf("pas assez de memoire ");
    exit(-1);}
    printf("entrez le nombre de pieces fabriquees par l'emplpoyer de l'atelier");
    scanf("%d",&NPF[i-NomAF][j-NomAF]);
    printf("entrez l'indice P\n");
    scanf("%s",&IndiceP[i-NomAF][j-NomAF]);
    trait(IndiceP[i-NomAF][j-NomAF],i-NomAF ,j-NomAF);
    TotalIID+=Tind[i-NomAF];
    }}
    affichage( );
    }
    desole je ne savais .

  5. A voir en vidéo sur Futura
  6. #5
    hibabel

    Re : Les fonctions en C

    void ENT(char *P)
    {scanf("%s",Intro);
    P=malloc((strlen(Intro)+1)*siz eof(char));
    if(P) strcpy(P,Intro);
    else {printf("pas assez de memoire\n");
    exit(-1);}}
    celle du 1 er message

  7. #6
    Jack
    Modérateur

    Re : Les fonctions en C

    les balises CODE, pas QUOTE. Ou alors le bouton # de l'éditeur avancé.
    J'aurais bien fais la modification, mais comme rien n'est indenté, ça n'est pas la peine.

    Essaie de présenter correctement ton code si tu veux que quelqu'un le lise parce qu'en l'état ça pique les yeux. Pense également à mettre les accolades comme il faut.
    Dernière modification par Jack ; 27/04/2018 à 12h22.

  8. #7
    Ikhar84
    Animateur Informatique

    Re : Les fonctions en C

    Toujours aussi illisible sans indentation pout moi...

    Mais il y a quand même un petit truc qui m'a fait tilté:
    Code:
    // Variables globales
    char **i,**j (...);
    Et plus loin:
    Code:
    // En paramètre de trait();
    (...) char indice, int i , int j (...)
    Une utilisation bizarre de la boucle for:
    Code:
    for(i=NomAF;i<NomAF+NAF;i++)
    On initialise i à NomAF, la condition est que i soit strictement inférieur a NomAF, et on incrémente i a chaque itération... il y a rien qui te choques ?
    (Sans parler du type et du contenu de NomAF qui est un tableau de char et de i qui hésite entre entier et pointeur sur un tableau de char..., je ne parle que de la logique de chaque itération de la boucle for (indice: aucune itération)...).

    On en reste là sans code correctement presenté (indentation), des noms de variables qui font sens, que leur type soit cohérent (et bien fixé, n'evoluant pas au gré du code), des variables utiles (dans le sens au beaucoup ici n'ajoutent qu'à la confusion...).

    [En tout cas si tu veux que pm42 revienne]
    Edit: c'est la balise CODE et non QUOTE...
    Edit2: grillé par Jack que je salue...
    Dernière modification par Ikhar84 ; 27/04/2018 à 12h28.

  9. #8
    PA5CAL

    Re : Les fonctions en C

    Bonjour

    Tout d'abord, voici le code tel qu'on aurait aimé nous le voir présenter :

    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    /*declaration des variables */
    char **i, **j, *NomAF[20], *NomRA[20], *NomE[20][20], Intro[20], IndiceP[20][20];
    int NAF, NEF[20], NPF[20][20], Taux;
    float TotalIID, Tind[20], IndP[20][20];
    
    void ENT(char *P) {
      scanf("%s", Intro);
      P = malloc((strlen(Intro)+1)*sizeof(char));
      if (P)
        strcpy(P, Intro);
      else {
        printf("pas assez de memoire\n");
        exit(-1);
      }
    }
    
    void trait(char indice, int i, int j) {
      if (indice == 'A')
        Taux = 20;
      if (indice == 'B')
        Taux = 10;
      if (indice == 'C')
        Taux = 5;
      indice = 'A';
      IndP[i][j] = Taux*NPF[i][j];
      Tind[i] += IndP[i][j];
    }
    
    void affichage () {
      for (i = NomAF; i < NomAF+NAF; i++) {
        printf("Nom d\'atelier de fabrication %d", i-NomAF+1);
        puts(NomAF[i-NomAF]);
        printf("Nom de responsable d\'atelier %d", i-NomAF+1);
        puts(NomRA[i-NomAF]);
        for (j = NomAF; j < NomAF+NEF[i-NomAF]; j++) {
          puts(NomE[i-NomAF][j-NomAF]);
          printf("NPF est %d", NPF[i-NomAF][j-NomAF]);
          printf("indice P est %c", IndiceP[i-NomAF][j-NomAF]);
          printf("IndP est %d", IndP[i-NomAF][j-NomAF]);
          printf("le total d\'indemnite de l'atelier %d est %f", i-NomAF+1, Tind[i-NomAF]);
        }
    
        printf("Totaux des indemnites des employes du groupe Motoprod pendant la journee est %f", TotalIID);
      }
    }
    
    void main () {
      /* Entrees et traitement des donnees */
      printf("entrez le nombre d\'ateliers de fabrication ");
      scanf("%d", &NAF);
      for (i = NomAF; i < NomAF+NAF; i++) {
        printf("Atelier %d\n", i-NomAF+1);
        printf("entrez le nom de l\'atelier de fabrication\n");
        ENT(NomAF[i-NomAF]);
        printf("entrez le nom de responsable l\'atelier de fabrication\n");
        scanf("%s", Intro);
        NomRA[i-NomAF] = (char*)malloc((strlen(Intro)+1)*sizeof(char));
        if (NomRA[i-NomAF])
          strcpy(NomRA[i-NomAF], Intro);
        else {
          printf("pas assez de memoire\n");
          exit(-1);
        }
    
        printf("entrez le nombre des employes de fabrication\n");
        scanf("%d", &NEF);
        for (j = NomAF; j < NomAF+NEF[i-NomAF]; j++) {
          printf("entrez le nom de l\'employe %d", j-NomAF+1);
          scanf("%s", Intro);
          NomE[i-NomAF][j-NomAF] = (char*)malloc((strlen(Intro)+1)*sizeof(char));
          if (NomE[i-NomAF][j-NomAF])
            strcpy(NomE[i-NomAF][j-NomAF], Intro);
          else {
            printf("pas assez de memoire ");
            exit(-1);
          }
    
          printf("entrez le nombre de pieces fabriquees par l\'employe de l'atelier");
          scanf("%d", &NPF[i-NomAF][j-NomAF]);
          printf("entrez l\'indice P\n");
          scanf("%s", &IndiceP[i-NomAF][j-NomAF]);
          trait(IndiceP[i-NomAF][j-NomAF], i-NomAF, j-NomAF);
          TotalIID += Tind[i-NomAF];
        }
      }
    
      affichage();
    }

  10. #9
    PA5CAL

    Re : Les fonctions en C

    Si j'analyse la fonction ENT() :

    Code:
    void ENT(char *P) {
      scanf("%s", Intro);
      P = malloc((strlen(Intro)+1)*sizeof(char));
      if (P)
        strcpy(P, Intro);
      else {
        printf("pas assez de memoire\n");
        exit(-1);
      }
    }
    Le paramètre P passé à la fonction fournit en entrée une adresse pointant sur des caractères, mais la ligne :
    Code:
      P = malloc((strlen(Intro)+1)*sizeof(char));
    écrase cette valeur en la replaçant par l'adresse d'un bloc mémoire réservé sur le tas (heap).

    En sortant de la fonction, l'adresse du bloc est perdu, la fonction appelante ne la récupère pas, et ce bloc ne pourra pas être libéré.


    Pour que cette fonction soit pertinente, il faudrait écrire :

    Code:
    void ENT(char **P) {
      scanf("%s", Intro);
      *P = (char *)malloc((strlen(Intro)+1)*sizeof(char));
      if (*P)
        strcpy(*P, Intro);
      else {
        printf("pas assez de memoire\n");
        exit(-1);
      }
    }
    Dernière modification par PA5CAL ; 28/04/2018 à 10h05.

  11. #10
    CM63

    Re : Les fonctions en C

    Bonjour,

    Commence par un programme de quelques lignes et regarde si il fait ce que tu veux. Sinon, il y a beaucoup trop d'erreurs, on est largué, on ne sait pas si c'est implicite dans ton esprit ou si ce sont vraiment des erreurs.

Discussions similaires

  1. Séries Numériques / Suites de Fonctions / Séries de Fonctions / Séries Entières
    Par SuprAlgebra dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 02/01/2014, 17h15
  2. Fonctions homogènes, fonctions à plusieurs variables
    Par karma34 dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 03/03/2013, 11h29
  3. [Fonctions] Les fonctions égales à leur réciproque
    Par Aenonis dans le forum Mathématiques du supérieur
    Réponses: 6
    Dernier message: 04/01/2013, 12h04
  4. Différence fonctions de classe C1 et fonctions dérivables
    Par Nowotny dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 21/06/2012, 20h40
  5. Les fonctions en fonctions d'un graphique !!!
    Par invitee284d01f dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 03/11/2011, 23h11