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 :

Transformation de PASCAL en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut Transformation de PASCAL en C
    SALUT A TOUS!
    svp, aidez moi a transformer ce programme écris en PASCAL en C
    ____________________
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    program serie2exo8;
    uses crt;
    {declaration des types et variables}
    type liste=^element;
         element=record
         pri:integer;
         val:string;
         suiv:liste;
         end;
    	 var l,lp:liste;
    choix:char;
    prio,dp:integer;
    vale,dv:string;
    {creation delement pour ajouter}
    procedure creation(var e:liste;pri:integer;val:string);
    begin
    new(e);
    e^.pri:=pri;
    e^.val:=val;
    end;
    {affichage de liste}
    procedure affichage(l:liste);
    var q:liste;
    begin
    q:=l;
    while(q<>nil) do begin
    writeln('Priorite:> ',q^.pri);
    writeln('Valeur => ',q^.val);
    q:=q^.suiv;
    end;
    end;
    {emfiler insert en queu}
    procedure emfiler(var l:liste;var pe:integer;var ve:string);
    var e,q:liste;
    begin
    creation(e,pe,ve);
    if (l=nil) then l:=e
    else begin
    q:=l;
    while(q^.suiv<>nil)do q:=q^.suiv;
    q^.suiv:=e;
    end;
    end;
    {defiler sup de la tete}
    procedure defiler(var l:liste;var pd:integer;var vd:string);
    var q:liste;
    begin
    q:=l;
    l:=l^.suiv;
    q^.suiv:=nil;
    pd:=q^.pri;
    vd:=q^.val;
    dispose(q);
    end;
    {empiler insertion en tete}
    procedure empiler(var l:liste;var pe:integer;var ve:string);
    var e,q:liste;
    begin
    creation(e,pe,ve);
    if (l=nil) then l:=e
    else begin
    e^.suiv:=l;
    l:=e;
    end;
    end;
    {depiler sup de la tete}
    procedure depiler(var l:liste;var pd:integer;var vd:string);
    var q:liste;
    begin
    q:=l;
    l:=l^.suiv;
    q^.suiv:=nil;
    pd:=q^.pri;
    vd:=q^.val;
    dispose(q);
    end;
     
    {maxpri}
    procedure maxpri(l:liste;var pm:integer;var vm:string);
    var q,x:liste;
    begin
    q:=l;
    x:=l;
    while(q<>nil) do begin
    if((q^.pri)>(x^.pri))then x:=q;
    q:=q^.suiv;
    end;
    pm:=x^.pri;
    vm:=x^.val;
    end;
     
    {defiler par prioriteX XX}
    procedure defilerpri(var l:liste;var pd:integer;var vd:string);
    var q,ls,t:liste;
    vs:string;
    ps:integer;
    begin
    ls:=nil;
    maxpri(l,pd,vd);
    while((l^.pri<>pd)and(l^.val<>vd)) do begin
    defiler(l,ps,vs);
    empiler(ls,ps,vs);
    end;
    if((l^.val=vd)and(l^.pri=pd)) then defiler(l,pd,vd);
    if (ls<>nil) then repeat
    depiler(ls,ps,vs);
    empiler(l,ps,vs);
    until(ls=nil);
    end;
     
    {program principal}
     
    begin
    clrscr;
    l:=nil;
    lp:=nil;
    choix:='y';
    writeln('>L ELEMENT LE PLUS PRIORITAIRE EST CELUI QUI A LA PRIORITE LA PLUS SUPERIEUR<');
    writeln;
    while(choix<>'n')do begin;
    writeln('Entrer la valeur(un caractere):');
    readln(vale);
    writeln('Entrer la priorite(un entier):');
    readln(prio);
    emfiler(l,prio,vale);
    writeln('Voulez vous ajoutez un element?: (y/n)');
    readln(choix);
    end;
    writeln;
    writeln('LA LISTE DES ELEMENTS CREES');
    affichage(l);
    writeln;
    writeln('LISTE DES ELEMENTS AVEC LA PRIORITE CROISSANTE');
    repeat
    defilerpri(l,dp,dv);
    empiler(lp,dp,dv);
    until (l=nil);
    affichage(lp);
    readln;
    end.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    On va travailler en équipe pour que ça soit rapide et pour qu'on soit super efficaces :

    1. Tu essaies de le convertir ce code en C comme tu peux (tu remplaces déjà ce que tu sais remplacer) :

    - les { commentaires pascal } par des /* commentaires C */
    - les type alias = type_original; par typedef type_original alias;
    - les type_name = record ... end; par struct type_name { ... };
    - les var_name : type_pascal par type_C var_name (par exemple, pri:integer; => int pri;)
    - les begin et end par { et }
    - etc.

    2. Tu postes ce que ça t'as donné.

    3. On corrige s'il y a des fautes.

    4. On reprend l'étape 1, jusqu'à ce qu'il n'y ait plus de faute.

    Bon travail.

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Qua,

    +1

    Avec une première étape que j'estime nécessaire : mettre le code Pascal en forme (indentation, séparation des fonctions par une ligne vide, ...).

    Tout le monde sait bien que ça facilite la lecture/compréhension du code, et donc le travail.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    As-tu regarde si des convertisseurs existaient (oui, je sais, je donne la solution) ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    C'est surtout que mon expértience avec les convertisseurs m'a appris qu'ils ne donnent jamais du code qui ressemble à ce qu'un humain aurait effectivement écrit. Mais si c'est juste pour avoir un programme qui compile et qui marche, c'est en effet une solution.

  6. #6
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    En jetant un coup d'œil au code, les fonctions depiler et defiler sont identiques. Je pense qu'il doit y avoir une erreur. Si les paires de fonctions empiler et depiler doivent respectivement ajouter et supprimer sur le haut de liste, j'en conclu que les fonctions emfiler et defiler doivent ajouter et supprimer par le bas de liste.

    Bonne continuation.

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    J'ai corrigé les erreurs et mon programme maintenant

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    #include<stdio.h>
    #include <stdlib.h>
     
    typedef struct element {
        int pri ;
        char val ;
        struct element *suiv ;
    } filed ;
     
    /* Création d'un nouvel élément */
    void creation(filed *e,int pri, char val)
    {
        e=(filed*)malloc(sizeof(filed*)) ;
        e->pri=pri;
        e->val=val;
        e->suiv=NULL;
    }
    /*afficher dune filed*/
    void afficher(filed l)
    {
     filed *q;
     *q=l;
     while(q!=NULL) {
     printf("Priorite:> %d",q->pri);
     printf("Valeur => %c",q->val);
     q=q->suiv;
                       }
    }
    /*insert en queu */
    void emfiler(filed *l,int pe,char ve)
    {    filed e,*q;
         creation(&e,pe,ve);
         if (l==NULL)  *l=e;
         else {
         q=l;
         while(q->suiv!=NULL)
         {q=q->suiv;}
         *q->suiv=e;
                   }
    }
    /*supression de la tete*/
    void defiler(filed *l,int *pd,char *vd)
    {
     filed *q,*p;
     q=l;
     p=l;
     p=p->suiv;
     q->suiv=NULL;
     *pd=q->pri;
     *vd=q->val;
     free(q);
    }
    /*insertion en tete*/
    void empiler(filed *l,int pe,char ve)
    {
     filed *e,q;
     creation(e,pe,ve);
     if (l=NULL)  l=e;
     else {
     e->suiv=l;
     l=e;
         }
    }
    /*suppression de la tete*/
    void depiler(filed *l,int *pd,char *vd)
    {
     filed *q,*p;
     q=l;
     p=l;
     p=p->suiv;
     q->suiv=NULL;
     *pd=q->pri;
     *vd=q->val;
     free(q);
    }
    /*max pri*/
    void maxpri(filed l,int *pm,char *vm)
    {
     filed *q,*x;
     *q=l;
     *x=l;
     while(q!=NULL)  {
     if((q->pri)>(x->pri)) x=q;
     q=q->suiv;
               }
               *pm=x->pri;
               *vm=x->val;
     }
    /*defiler par priorite*/
    void defilerpri(filed *l,int *pd,char *vd)
    {
         filed q,*ls,t,*p,*r;
         char vs;
         int ps;
         ls=NULL;
         p=l;
         maxpri(*l,pd,vd);
         while((p->pri!=*pd)&&(p->val!=*vd)) {
         defiler(l,&ps,&vs);
         empiler(ls,ps,vs);
         r=l;                                   }
    if((r->val=*vd)&&(r->pri=*pd))  defiler(l,pd,vd);
    if (ls!=NULL){
    	do
    	{
    	depiler(ls,&ps,&vs);
    	empiler(l,ps,vs);}
    	while(ls!=NULL);
    	}
    			}
    int main()
    {
    /*declaration des types et viables*/
    filed *l,*lp;
    char choix;
    int prio,dp;
    char vale,dv;
    /*programme principal*/
     
    l=NULL;
    lp=NULL;
    choix='y';
    printf("\n");
    printf(">L ELEMENT LE PLUS PRIORITAIRE EST CELUI QUI A LA PRIORITE LA PLUS SUPERIEUR<\n");
    printf("\n");
    while(choix!='n') {
    printf("Entrer la valeur(un caractere):\n");
    scanf("%c",&vale);
    printf("Entrer la priorite(un entier):\n");
    scanf("%d",&prio);
    emfiler(l,prio,vale);
    printf("Voulez vous ajoutez un element?  (y/n)\n");
    scanf("%c",&choix);
    }
    printf("\n");
    printf("LA FILE DES ELEMENTS CREE\n");
    afficher(*l);
    printf("\n");
    printf("LA FILE DES ELEMENTS AVEC LA PRIORITE CROISSANTE\n");
     
    do{
    defilerpri(l,&dp,&dv);
    empiler(lp,dp,dv);
    }while(l!=NULL);
    afficher(*lp);
    getchar();
    getchar();
    }
    mais un fois que je l'exécute voila ce qu'il m'affiche

  8. #8
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonsoir,

    Il te reste beaucoup de warning. Un warning sous-entend un danger potentiel. Il ne faut pas les négliger et les corriger.
    Nota: Ajouter quelques commentaires à ton code t'aidera plus à comprendre son fonctionnement.

    La fonction creation: Je te conseil vivement, comme beaucoup te l'on dit, de tester ton allocation mémoire. Si elle échoue, c'est risque de segment fault directe.
    Une fonction peut retourner un pointeur et dans ton cas, cela pourrait te simplifier ton écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* Création d'un nouvel élément. Retourne un pointeur sur une structure allouée en mémoire. */
    file *creation(int pri, char val)
    {    filed *e = NULL ;
     
        e = (file*)malloc(sizeof(filed)) ;
        if(e!=NULL) {
            e->pri = pri ;
            e->val = val ;
            e->suiv = NULL ;
        }
        return e ;    // Peut-être NULL en cas d'échec de l'allocation
    }
    La fonction emfiler: Attention avec les pointeurs. Tu as une structure "e" et tu veux lui attribuer une adresse par la fonction création. NON. Il te faut un pointeur sur une structure "*e".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Insertion d'un élément en queue de la file */
    void emfiler(filed *l, int pe, char ve)
    {   filed *e = NULL ;
     
        if(l==NULL) {
            l = creation(pe, ve) ;
        }
        else {
            e = l ;
            while(e->suiv!=NULL) e = e->suiv ;
            e->suiv = creation(pe, ve) ;
        }
    }
    La fonction defiler: Je pense qu'il doit y avoir une erreur. Si les paires de fonctions empiler et depiler doivent respectivement ajouter et supprimer sur le haut de liste, j'en conclu que les fonctions emfiler et defiler doivent ajouter et supprimer par le bas de liste.
    Le but de cette fonction est de supprimer le dernier élément sans oublier de metter à jour l'avant dernier (->suiv).
    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
    /* Suppression de l'élément de queue de la file */
    void defiler(filed *l, int *pd, char *vd)
    {   filed *e = NULL, *r = NULL ;
     
        if(l!=NULL) {
            e = l ;
            while(e->suiv!=NULL) {
                r = e ;         // Pointe sur l'avant dernier élément
                e = e->suiv ;   // Pointe sur le dernier élément
            }
            r->suiv = NULL ;    // Détache le dernier élément de la file
            *pd = e->pri ;
            *vd = e->val ;
            free(e) ;            // Libère la mémoire du dernier élément
        }
    }
    La fonction empiler: Même chose; vérifier tes pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Insertion d'un élément en tete de file */
    void empiler(filed *l, int pe, char ve)
    {   filed *e = NULL ;
     
        e = creation(pe, ve) ;
        if(l==NULL) {
            l = e ;
        }
        else if(e!=NULL) {
            e->suiv = l ;
            l = e ;
        }
    }
    La fonction depiler: Même chose; vérifier tes pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* Suppression de l'élément en tete de file */
    void depiler(filed *l, int *pd, char *vd)
    {   filed *e = NULL ;
     
        if(l!=NULL) {
            e = l ;         // Mémo de la tête de file
            *pd = e->pri ;
            *vd = e->val ;
            l = l->suiv ;   // l pointe maintenant sur l'élément suivant
            free(e) ;       // Libère la mémoire de la tête de file
        }
    }
    La fonction afficher: La liste doit être passée en tant que pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* Affichage des élément d'une file */
    void afficher(filed *l)
    {   filed *q = NULL ;
     
        q = l ;
        while(q!=NULL) {
            printf("Priorite: %d\n", q->pri) ;
            printf("Valeur  : %c\n", q->val) ;
            q = q->suiv ;
        }
    }
    La fonction maxpri: La liste doit être passée en tant que pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Recherche de la priorité max */
    void maxpri(filed *l, int *pm, char *vm)
    {   filed *q = NULL, *x = NULL ;
     
        q = l ;
        x = l ;
        while(q!=NULL) {
            if((q->pri) > (x->pri)) x = q ;
            q = q->suiv ;
        }
        *pm = x->pri ;
        *vm = x->val ;
    }
    Le main:
    - Ta saisie de caractères et de valeur n'est pas fonctionnel. Je te conseil de lire cette FAQ Comment lire une ligne de manière securisée ?.
    - Pour faire une convertion d'une chaine de caractères numérique vers un nombre, tu peux utiliser les fonctions suivantes: strtol ou sscanf.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Exemple avec sscanf
    char buffer[20] ;
    int ret = 0, priorite = 0 ;
     
    if(read_stdin(buffer, 20)!=NULL) {
        ret = sscanf(buffer, "%d", &priorite) ;
        if(ret==1)
            printf("priorite = %d\n", priorite) ;
    }
    Voila pour une première correction. A toi de jouer.

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    Elijha, merci bien pour votre aide
    mais j'ai pas bien compris le truc de main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Exemple avec sscanf
    char buffer[20] ;
    int ret = 0, priorite = 0 ;
     
    if(read_stdin(buffer, 20)!=NULL) {
        ret = sscanf(buffer, "%d", &priorite) ;
        if(ret==1)
            printf("priorite = %d\n", priorite) ;
    }

Discussions similaires

  1. Transformer un code Pascal en algorithme simple et explication de la simulation
    Par nadirmabed dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 01/01/2015, 21h16
  2. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 21h07
  3. FFT(Fast Fourier Transform)
    Par IngBen dans le forum Traitement du signal
    Réponses: 6
    Dernier message: 23/05/2002, 16h35

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