الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خطأ في كود هذا البرنامج الخاص ب pile & liste

مغلقمُجاب
بدأه tantie L في 22 ديسمبر 2013 · 7 رد · 782 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته اساتذتي الكرام

لقد طلب منا كتابة برنامج يطلب من المستخدم ادخال عبارة حرفية مثل /ab+c فيقراها و يطلب منه قيم كل متغير اي حد و يقوم بحفظها في قائمة بها نوعين حرفي لاسم الحد و رقمي لقيمة الحد ثم يقوم البرنامج بانشاء جدول له هيكلة خاصة اي كل خانة فيها نوعين حرفي للمتغيرات التي ادخلها و رقمي لنوعها 0 معناه حد و 1 معناه عملية ثم استنادا لتلك القائمة يقوم بانشاء pile رقمية فيستخدم الدالة empiler للاظافة و يتوقف عندما يصل الى عملية هنا يستخدم الدالة depiler  من اجل الاحتفاظ بالقيم في متغير ترجعه و تقوم بحذفها من الـ pile و في الاخير يطبع البرنامج العبارة بعد ان يعوض كل متغير بقيمته فيكون شكل العبارة رقميا و بشكل عادي اي مثلا (3+2)/2 و يظهر النتيجة 

انا المشكلة التي واجهتني في الكود المبدئي هي الدالة depiler فهي لا تعمل و لم اعلم لماذا فهل لكم اساتذتي الكرام ان توجهونني الى الخطا الذي ارتكبته و كيفية اصلاحه و ساكون لكم شاكرة

هذا هو الكود الذي كتبته للىن هو لم يكتمل فجزء طباعة العبارة غير موجود

#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct val_liste{               char var;               int val;               struct val_liste *ptrn;}val_l;typedef struct pile{               int val_p;               struct pile *ptrn_p;}val_pi;typedef struct tab_type{               char op;               int typ;}tab_t;val_pi *empiler(val_l *liste,val_pi *sommet){               val_pi *n_pile;               int x;               while(liste!=NULL)               {                             n_pile=(val_pi*)malloc(sizeof(val_pi));                             x=liste->val;                             liste=liste->ptrn;                             n_pile->val_p=x;                             printf("\n");                             printf("| %d |\t",(n_pile->val_p));                             n_pile->ptrn_p=sommet;                             sommet=n_pile;               }               return sommet;}val_pi *empiler_vleur(int x,val_pi *sommet){               val_pi *n_pile;               n_pile=(val_pi*)malloc(sizeof(val_pi));               n_pile->val_p=x;               printf("\n");               printf("| %d |\t",(n_pile->val_p));               n_pile->ptrn_p=sommet;               sommet=n_pile;               return sommet;}int depiler(val_pi *pile,val_pi *sommet){               int x;               val_pi *d_pile;               pile=sommet;               while(pile)               {                              x=pile->val_p;                              printf("\nx : %d",x);                              d_pile=sommet;                              sommet=sommet->ptrn_p;                              free(d_pile);               }               return x;}val_l *criation_l(char *t){               int n,valeur,i=0;               val_l *n_val,*n_val1,*tete;               tete=NULL;               n=strlen(t);               while(i<n)               {                              if(t>='a' && t<='z' || t>='A' && t<='Z')                              {                                             n_val=(val_l*)malloc(sizeof(val_l));                                             printf("%c : ",t);                                             scanf("%d",&valeur);                                             n_val->var=t;                                             n_val->val=valeur;                                             n_val->ptrn=NULL;                                             if(tete!=NULL)                                             {                                                            n_val1->ptrn=n_val;                                             }                                             else                                             {                                                            tete=n_val;                                             }                                             n_val1=n_val;                              }                              i=i+1;               }return tete;}void aff(val_l *tete){    val_l *P;     P=tete;     if(!tete)     printf("la liste n'existe pas\n");     else     {           while (P!=NULL)           {                 printf("| %c | %d |\t",(P->var),(P->val));                 P=P->ptrn;           }           printf("\n------------------------\n");      }}main(){               char exp[20];               int i,lenth,x,y,z;               val_l *valeur_l,*tete_v_l;               val_pi *valeur_p,*sommet_v_p;               tab_t etat[40];               sommet_v_p=NULL;               printf("entrez votre exp SVP\n");               gets(exp);               lenth=strlen(exp);               valeur_l=criation_l(exp);               aff(valeur_l);               for(i=0;i<lenth;i++)               {                              if(exp>= 'a' && exp<='z' || exp>='A' && exp<='Z')                              {                                             etat.op=exp;                                             etat.typ=0;                              }                              else if(exp=='+'|| exp=='-'|| exp=='*'|| exp=='/')                              {                                             etat.op=exp;                                             etat.typ=1;                              }                              printf("| %c : %d |",etat.op,etat.typ);               }               i=0;               if(etat.typ==0)               {                             valeur_p= empiler(valeur_l,sommet_v_p);i++;               }               for(i=0;i<lenth;i++)               {                             if(etat.typ==1)                             {                                             x= depiler(valeur_p,sommet_v_p);                                             printf("\nx : %d",x);                                             y= depiler(valeur_p,sommet_v_p);                                             printf("\ny : %d",y);                                             switch(etat.op)                                             {                                                            case '+': z=y+x;break;                                                            case '-': z=y-x;break;                                                            case '*': z=y*x;break;                                                            case '/': z=y/x;break;                                             }                                             z= depiler(valeur_p,sommet_v_p);                                             valeur_p=empiler_vleur(z,sommet_v_p);                          }               }}

جزاكم الله عني كل خير و وفقكم الى كل خير

لكم فائق احترامي و تقديري

1

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#2

السلام عليكم أختي الكريمة ..

وظيفة جميلة هذه ... تحيّة للأستاذ D:

 

واضح أن القيم التي تتم طباعتها هي قيم تظهر عادة عند عدم تعريف المتحول

جرّبي كتابة

int x=-1;

في بداية depiler ولاحظي أن جميع الأعداد التي تتم طباعتها ستكون -1

وهذا يدل على أن التابع لا يدخل إلى while أبداً وبالتالي لا يغيّر قيمة x

المهم ..

عند استدعاء التابع deplier عند

x= depiler(valeur_p,sommet_v_p);

قمت هنا بعملية تمرير وسطاء غريبة لم أفهمها !

فالمؤشر sommet_v_p منذ بداية الكود وهو يشير إلى NULL ولم يتم تغييره أبداً !!

ولابد أنك تظنين أنه تغير بداخل empiler ولكن هذا غير صحيح فما قمت بتغييره هو المؤشر الخاص بالتابع empiler فقط ( لو كان هذا خطأً بالفعل أرجو منك السؤال عنه فحلّه عن طريق مؤشر إلى مؤشر يعني ** )

في داخل deplier قمت بالجريمة التالية

pile=sommet;while(pile){

وهذا يعني إسناد الرأس إلى NULL وضياع القائمة في الذاكرة (فقط بالنسبة لهذا التابع )

 

أظن أن مكان الخطأ قد اتضح ..

بالتوفيق

#3

و عليكم السلام و رحمة الله و بركاته اخي الكريم مصطفى

مسرورة لانها اعجبتك و سابلغه التحية باذن الله  :lol:

 

مصطفى 36a2 كتب:

افي بداية depiler ولاحظي أن جميع الأعداد التي تتم طباعتها ستكون -1

وهذا يدل على أن التابع لا يدخل إلى while أبداً وبالتالي لا يغيّر قيمة x

 

معك حق بهذا فانا ايضا جربتها و بالفعل القيم لم تتغير و لم يدخل الى while ابدا

 

مصطفى 36a2 كتب:

قمت هنا بعملية تمرير وسطاء غريبة لم أفهمها !

 

الوسائط التي مررتها على ما اظن يجب تمريرها لان valeur_p هي pile التي اريد ان احذف منها القيم لذلك فهي واجبة فقمت بتمريرها في بادئ الامر بمفردها لكن عند التطبيق تظهر لي امور و كتابات غريبة فقلت لنفسي sommet يجب ان تكون من المعطيات التي تمررلدالة و ليس كمتغيرات في داخلها 

 

 

مصطفى 36a2 كتب:

فالمؤشر sommet_v_p منذ بداية الكود وهو يشير إلى NULL ولم يتم تغييره أبداً !!

ولابد أنك تظنين أنه تغير بداخل empiler ولكن هذا غير صحيح فما قمت بتغييره هو المؤشر الخاص بالتابع empiler فقط ( لو كان هذا خطأً بالفعل أرجو منك السؤال عنه فحلّه عن طريق مؤشر إلى مؤشر يعني ** )

 

لكن لماذا لم يتغير المؤش sommet_v_p فانا قد ارسلته للدالة empiler اي انه قد صار هو في مكان sommet و هذا الاخير يتغير في اخر الدالة ؟؟؟؟؟

sommet=n_pile;

اذن فان sommet_v_p تتغير 

 

مصطفى 36a2 كتب:

في داخل deplier قمت بالجريمة التالية

pile=sommet;while(pile){

وهذا يعني إسناد الرأس إلى NULL وضياع القائمة في الذاكرة (فقط بالنسبة لهذا التابع )

 

هنا انا اعترف بجريمتي بعد ان فهمت الامر و لكن انا وضعت هذا لانني كنت اظن ان قيمة sommet تتغير و للان لم افهم هذا الامر جيدا فلماذا لم تتغير؟ و كيف اغيرها؟

 

تقريبا لكن مازال الامر مبهما قليلا فانا على حسب ما فهمت ان خطئي يكمن في عدم تغيرقيمة  sommet و الارسال الخاطئ للـ parametres الخاصة بالدوال، فهل هذا صحيح؟

 

مشكور اخي الكريم بالتوفيق لك

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#4 أفضل إجابة

السلام عليكم

لنتتبع الكود

بدءاً من هذا الاستدعاء

valeur_p= empiler(valeur_l,sommet_v_p);

وهذا هو جسم الدالة

val_pi *empiler(val_l *liste,val_pi *sommet)
{
    val_pi *n_pile;
    int x;
    while(liste!=NULL)
    {
        n_pile=(val_pi*)malloc(sizeof(val_pi));
        x=liste->val;
        liste=liste->ptrn;
        n_pile->val_p=x;
        printf("\n");
        printf("| %d |\t",(n_pile->val_p));
        n_pile->ptrn_p=sommet;
        sommet=n_pile;
    }

    return sommet;
}

عند الاستدعاء يتم اسناد الوسطاء إلى الوسطاء الاسمية كما يلي

liste=valeur_l

sommet=sommet_v_p

وبالتالي عندما  تقومين بـ

sommet=n_pile

فإنك تغيّرين قيمة الوسيط الاسمي فقط !!

أما sommet_v_p

فلم يتم الاقتراب منه

تماماً كما في الحالة التالي

لنفرض أن لدينا الدالة التالية

void hello(int x,int y){    x=5;    y=6;}

ثم في main كتبنا الكود التالي

int m=2,n=6;hello(m,n);

ماذا ستكون قيمة m,n بعد الاستدعاء ؟؟ ستبقى كما هي بالتأكيد :)

والحل هو ان نمرر القيمة بالمرجع وليس بالقيمة

وذلك بأن نكتب الدالة كما يلي

void hello(int *x,int *y){    *x=5;    *y=6;}

والاستدعاء كما يلي

int m=2,n=6;hello(&m,&n);

اما في حالة الكود الخاص بك فستتعاملين مع مؤشر إلى مؤشر وهي بنفس البساطة تقريباً

نكتب الاستدعاء كما يلي

valeur_p= empiler(valeur_l,&sommet_v_p);

وتوقيع التابع كما يلي

val_pi *empiler(val_l *liste,val_pi **sommet){

وبدلاً من استعمال sommet في الكود نستخدم sommet*

هذه هي الفكرة المبدئة أرجو أن تكوني انتبهت لمكان الخطأ

 

بالتوفيق

#5

و عليكم السلام و رحمة الله و بركاته اخي مصطفى 

حسنا لقد فهمت الامر و قمت بالفعل بتغيير جسم الدالة empiler فتم استدعاء الدالة depiler بعد التصحيح لكن واجهتني مشكلة اخرى  :(  صحيح تم استدعاء الدالة depiler لكن هناك امر غريب 

هذا هو مجسم الدالتين بعد التعديل 

val_pi *empiler(val_l *liste,val_pi **sommet)
{
    val_pi *n_pile;
    int x;
    while(liste!=NULL)
    {
        n_pile=(val_pi*)malloc(sizeof(val_pi));
        x=liste->val;
        liste=liste->ptrn;
        n_pile->val_p=x;
        printf("\n");
        printf("| %d |\t",(n_pile->val_p));
        n_pile->ptrn_p=*sommet;
        *sommet=n_pile;
    }

    return *sommet;
}
int depiler(val_pi *pile,val_pi *sommet)
{
               int x;
               val_pi *
               n_pile=sommet;
               if(sommet==NULL)
               {
                              printf("la pile n'existe pas\n");
               }
               else
               {
                              x=sommet->val_p;
                              printf("\nx : %d",x);
                              pile=sommet;
                              sommet=sommet->ptrn_p;
                              free(pile);
               }printf("\n---------\n");
               return x;
}

لنرى ماذا يحدث بعد ان اتتبعها بداية عند الاستدعاء للدالة empiler 

sommet_v_p= empiler(valeur_l,&sommet_v_p);

حسنا و بالفعل ارسلت اليها @ الخاصة بـ  sommet_v_p و ناتج الدالة سيكون مخزنا في sommet_v_p اذن فمشكلة عدم تغير قيمةsommet_v_p قد حلت و هذا لانني استخدمت مؤشر لمؤشر و ارجو ان لا اكون قد اخطات فيها مجددا  :blush:

ثم بعدها نذهب الى الدالة depiler و توابعها هي  sommet فقط و عند الاستدعاء

x= depiler(sommet_v_p);

فاني اسند مخرجات الدالة الى متغير x حسنا الان الى جسد الدالة  :)  اكيد و في حالة sommet!=NULL 

في هذه الخطوة

x=sommet->val_p;

فانني اسند القيمة التي يؤشر عليها sommet الى x و هذا امر طبيعي 

جيد.... الى الخطوة التالية 

pile=sommet;

و هنا بعد ان عرفت مؤشر اخر خاص بالدالة قمت باسناد sommet اليه حتى اعرف القيمة التي ساحذفها

حسنا... و التي بعدها هي

sommet=sommet->ptrn_p;

تقديم sommet الى الامام

و الان...التي تليها هي

free(pile);

تحرير المؤشر الجديد الذي يحمل sommet

و أخيرا...هذه

return x;

ارجاع x الذي يحوي القيمة المحذوفة

على ما اعتقد ان الفكرة منطقية حسب ما فهمتها انا

فطبقتها مسرورة  :lol:  لكن وقعت الصاعقة على راسي  :( فالنتيجة كانت هكذا

QnNoM.png

 

فتساءلت لت ماذا حدث :huh: فالخطوات سليمة منطقيا فلماذا ظهر لي كل هذا  :wacko:

فقلت لاغير التعليمات و جعلت جسد الدالة depiler هكذا

int depiler(val_pi *sommet)
{
               int x;
               val_pi *pile;
               pile=sommet;
               while(sommet)
               {
                              x=sommet->val_p;
                              printf("\nx : %d",x);
                              pile=sommet;
                              sommet=sommet->ptrn_p;
                              free(pile);
               }printf("\n---------\n");
               return x;
}

قمت بنزع الشرط و عوضته بحلقة 

فطبقت و انا اشك في الامر  <_< فكانت النتيجة هكذا

QRj9M.png

 

فلم استغرب لانني اعلم انه يجب الحذف لمرة واحدة فقط فهنا تم اسناد قيمة x بشكل صحيح لكن y & z لا لانه تم تفريغ ال pile  في اول مرة 

السؤال المهم الان لماذا لم ينفذ الامر باستخدام الشرط و نفذ عند استخدام الحلقة؟ :( 

رغم ان التعليمات صحيحة حسب فهمي الا انه اخرج لي امورا غريبة :wacko:  لم افهمها 

فهل الخطأ مجددا في الارسال و المؤشرات :(  ام أن هناك امرا اخر ؟؟؟

حقا حقا عذرا على كل هذا لكن افكاري شوشت   

أشكرك كثيرا اخي مصطفى على تجاوبك معي و مع كل وجع الراس هذا  :blush: 

لك فائق الاحترام و التقدير   

تم تعديل هذه المشاركة بواسطة tantie L في 24 ديسمبر 2013 في 21:39

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#6

نفس الخطأ السابق

اقتباس

حسنا... و التي بعدها هي

sommet=sommet->ptrn_p; 

تقديم sommet الى الامام

قمت بتمرير sommet_v_p بالقيمة وليس بالمرجع واستلمه *sommet

وبذلك حدث الاسناد التالي

sommet=sommet_v_p

وعند تغيير sommet لن يتأثر sommet_v_p (يجب تحويله إلى مؤشر إلى مؤشر كما في empiler)

 

اقتباس

قمت بنزع الشرط و عوضته بحلقة

لا علاقة لذلك .. كما أخبرتك يجب استخدام مؤشر إلى مؤشر

 

بالمناسبة

اقتباس

sommet_v_p= empiler(valeur_l,&sommet_v_p);

لا داعي لإسناد sommet_v_p فقد تم تغييره بداخل الدالة

 

بعد تغيير الدالة depiler لتأخذ مؤشر إلى مؤشر

أعطي الكود المخرجات التالي

entrez votre exp SVP
ab+c*
a : 1
b : 2
c : 3
| a | 1 |       | b | 2 |       | c | 3 |
------------------------
| a : 0 || b : 0 || + : 1 || c : 0 || * : 1 |
| 1 |
| 2 |
| 3 |  

---------

x : 3
---------

y : 2
---------

| 1 |
la pile n'existe pas
---------
x : 1981058261la pile n'existe pas
---------
y : 1981058261la pile n'existe pas
---------
| 1981058261 |

من الواضح أن لديك خطاً هنا :

z= depiler(valeur_p,sommet_v_p);
valeur_p=empiler_vleur(z,sommet_v_p);

فبعد القيام بالعملية المطلوبة ( + * - / ) سيحتفظ z بالناتج .. ولكن عندما تقومين بـ z= depiler(valeur_p,sommet_v_p);l سيتم أخذ عنصر آخر من المكدس وسيُمحى الناتج الصحيح !!

لذلك عليك حذف ذلك السطر ... هذا أولاً

نفس الخطأ يتكرر مع valeur_p=empiler_vleur(z,sommet_v_p);l يجب أن نستخدم مؤشر إلى مؤشر

 

بشكل عام هناك أخطاء منطقية كثيرة .. مثلاً : أين طباعة النتيجة النهائية !

 

بعد التعديلات هذا هو الكود

#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct val_liste{    char var;    int val;    struct val_liste *ptrn;} val_l;typedef struct pile{    int val_p;    struct pile *ptrn_p;} val_pi;typedef struct tab_type{    char op;    int typ;} tab_t;val_pi *empiler(val_l *liste,val_pi **sommet){    val_pi *n_pile;    int x;    while(liste!=NULL)    {        n_pile=(val_pi*)malloc(sizeof(val_pi));        x=liste->val;        liste=liste->ptrn;        n_pile->val_p=x;        n_pile->ptrn_p=*sommet;        *sommet=n_pile;    }    return *sommet;}val_pi *empiler_vleur(int x,val_pi **sommet){    val_pi *n_pile;    n_pile=(val_pi*)malloc(sizeof(val_pi));    n_pile->val_p=x;    n_pile->ptrn_p=*sommet;    *sommet=n_pile;    return *sommet;}int depiler(val_pi **sommet){    int x;    val_pi *   pile=*sommet;    if(*sommet==NULL)    {        printf("la pile n'existe pas\n");    }    else    {        x=(*sommet)->val_p;        pile=sommet;        *sommet=(*sommet)->ptrn_p;        free(pile);    }    return x;}val_l *criation_l(char *t){    int n,valeur,i=0;    val_l *n_val,*n_val1,*tete;    tete=NULL;    n=strlen(t);    while(i<n)    {        if(t>='a' && t<='z' || t>='A' && t<='Z')        {            n_val=(val_l*)malloc(sizeof(val_l));            printf("%c : ",t);            scanf("%d",&valeur);            n_val->var=t;            n_val->val=valeur;            n_val->ptrn=NULL;            if(tete!=NULL)            {                n_val1->ptrn=n_val;            }            else            {                tete=n_val;            }            n_val1=n_val;        }        i=i+1;    }    return tete;}void aff(val_l *tete){    val_l *P;    P=tete;    if(!tete)        printf("la liste n'existe pas\n");    else    {        while (P!=NULL)        {            printf("| %c | %d |\t",(P->var),(P->val));            P=P->ptrn;        }        printf("\n------------------------\n");    }}main(){    char exp[20];    int i,lenth,x,y,z;    val_l *valeur_l,*tete_v_l;    val_pi *valeur_p,*sommet_v_p;    tab_t etat[40];    sommet_v_p=NULL;    printf("entrez votre exp SVP\n");    gets(exp);    lenth=strlen(exp);    valeur_l=criation_l(exp);    aff(valeur_l);    for(i=0; i<lenth; i++)    {        if(exp>= 'a' && exp<='z' || exp>='A' && exp<='Z')        {            etat.op=exp;            etat.typ=0;        }        else if(exp=='+'|| exp=='-'|| exp=='*'|| exp=='/')        {            etat.op=exp;            etat.typ=1;        }        printf("| %c : %d |",etat.op,etat.typ);    }    if(etat[0].typ==0)    {        //sommet_v_p= empiler(valeur_l,&sommet_v_p);        valeur_p= empiler(valeur_l,&sommet_v_p);        printf("((sommet_v_p %d %d))\n",sommet_v_p->val_p,sommet_v_p->ptrn_p->val_p);    }    for(i=0; i<lenth; i++)    {        if(etat.typ==1)        {            x= depiler(&sommet_v_p);            printf("\nx : %d",x);            y= depiler(&sommet_v_p);            printf("\ny : %d",y);            printf("\ndo %c\n",etat.op);            switch(etat.op)            {            case '+':                z=y+x;                break;            case '-':                z=y-x;                break;            case '*':                z=y*x;                break;            case '/':                z=y/x;                break;            }            empiler_vleur(z,&sommet_v_p);        }    }    printf("result=%d\n",depiler(&sommet_v_p));}

ولكن نأتي إلى الخطأ الأكبر ... منطق الكود غير صحيح !!

هذه إحدى نتائج الكود

entrez votre exp SVP
ab+c*
a : 1
b : 2
c : 3
| a | 1 |       | b | 2 |       | c | 3 |
------------------------
| a : 0 || b : 0 || + : 1 || c : 0 || * : 1 |((sommet_v_p 3 2))

x : 3
y : 2
do +

x : 5
y : 1
do *
result=5

المفترض أن تتم العملية كما يلي

جمع 1 و 2

ثم الضرب مع 3

والنتيجة ستكون 9

ولكن الذي يحدث  هو

جمع 2 مع 3 ثم الضرب بـ 1

 

أترك لك تتمة الحل , فالعملية أصبحت رياضية وليست برمجية

بالتوفيق

1
#7

و عليكم السلام و رحمة الله و بركاته اخي الكريم مصطفى

خيبة امل كبيرة لانه نفس الخطأ السابق :(  و فعلا هذا امر مخزي  :blush:

فهمتها الان و ارجو ان لا اقع في هذا الخطأ مجددا 

بالنسبة للخطأ المنطقي الذي اخبرتني عنه (عدم طباعة العبارة) انا لم اقم بانهاء الكود تماما فقط كلما اقوم بتغيير فيه اجربه و عندما اجد فيه مشكلة احاول ان احلها ثم انتقل للخطوة التي تليها 

و بشان خطأ الحساب فهو برمجي لانني عندما اقوم باظافة قيمة الى قائمة القيم فانني اظيف من البداية و لكن يجب ان نظيف في النهاية اي ان الخطأ المرتكب موجود في الدالة criation_l و قد عدلتها فصارت هكذا

val_l *criation_l(char *t){    int n,valeur,i=0;    val_l *n_val,*tete;    tete=NULL;    n=strlen(t);    while(i<n)    {        if(t>='a' && t<='z' || t>='A' && t<='Z')        {            n_val=(val_l*)malloc(sizeof(val_l));            printf("%c : ",t);            scanf("%d",&valeur);            n_val->var=t;            n_val->val=valeur;            n_val->ptrn=tete;            tete=n_val;        }        i=i+1;    }    return tete;}

و النتيجة كانت

HHyjm.jpg

 

ممتازة  :lol: بعد عناء طويل و ازعاجك بنفس السؤال و الخطأ  :blush:

لا اعلم كيف اشكرك اخي الكريم على كل هذه المساعدة و الصبر الطويل على كل اسئلتي المتكررة

بارك الله فيك و جزاك عني كل الخير 

موفق باذن الله

تم تعديل هذه المشاركة بواسطة tantie L في 25 ديسمبر 2013 في 16:10

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#8

ملاحظة : لمن يستخدمون نظام تشغيل اللونيكس عند تجريب البرنامج قوموا بتغيير في الدالة depiler 

int depiler(val_pi **sommet)
{
    int x;
    val_pi *pile=*sommet;
    if(*sommet==NULL)
    {
        printf("la pile n'existe pas\n");
    }
    else
    {
        x=(*sommet)->val_p;
        pile=*sommet;// هنا مكان التغيير لا تكتبوا pile=sommet بل اكتبوا pile=*sommet 
        *sommet=(*sommet)->ptrn_p;
        free(pile);
    }
    return x;
}

بصراحة انا لم افهم لماذا لكن ظهر لي هذا التحذير قبل التغيير 

/home/detective/TP/Untitled Folder/pile.c|56|warning: assignment from incompatible pointer type [enabled by default]|

و لمن لديه فكرة عن الامر فليتفضل و ليشرحه لي مشكورا علما انه على الوينداوز قد عمل حتى بدون هذا التغيير 

مع تحياتي  :)

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…