المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : مشكـــلة في Les Listes Linéaires Chainées


yalova
2013-03-28, 10:59
السلام عليكم
أعاني من مشكل في كيفية عرض La liste linéaire chainée
البرنامج يعمل لكنه لا يعرض لي la liste في النهاية
البرنامج بلغة C في المرفقات
أرجو توضيح الخطأ في البرنامج
وشكـــــــراا

yalova
2013-03-28, 12:08
الرجــــــــــــاء المساعدة

yalova
2013-03-28, 19:22
*=== (( ما يلفظ من قول إلا لديه رقيب عتيد )) ===*

yalova
2013-03-29, 10:07
*=== (( ما يلفظ من قول إلا لديه رقيب عتيد )) ===*

agm1991
2013-03-29, 12:35
السلام عليكم ورحمة الله وبركاته
لدي بعض التعليقات على الحل
اولا:ما فائدة هذه العبارة مادمت لا تستخدمها
typedef struct Maillon Maillon;ملاحظة:
العبارة typedef تستخدم لإعاة صياغة الكلمات المحجوزة بشكل مختصر(اختصرت struct Maillonالى Maillon ;ولكنك استمريت في استخدام struct Maillonبدلا عنMaillon)
ثانيا:
في الحلقة for وضعت شرطالا معنى له
قيمة tete لا تتغير ابدا (يعني الشرط دائما غير محقق)
if ( Tete != NULL )
{
Aff_Adr(p,q);
}
else
{
p=q;
}ثالثا:
بعد الحلقةfor قمت بإعطاء القيمة NULL للمؤشر P (قيمة tete تحتوي علىNULL )
p=Tete;وكنتيجة حتمية لن تعمل حلقة while لان الشرط غير محقق
----------------------------------------------
عذرا, حاليا لم استطع تنفذ الحل على الحاسوب لان لدي بعض مشاكل في الوينودز لم تسمح بتنفيذه.

yalova
2013-03-29, 15:00
السلام عليكم ورحمة الله وبركاته
لدي بعض التعليقات على الحل
اولا:ما فائدة هذه العبارة مادمت لا تستخدمها
typedef struct maillon maillon;ملاحظة:
العبارة typedef تستخدم لإعاة صياغة الكلمات المحجوزة بشكل مختصر(اختصرت struct maillonالى maillon ;ولكنك استمريت في استخدام struct maillonبدلا عنmaillon)
ثانيا:
في الحلقة for وضعت شرطالا معنى له
قيمة tete لا تتغير ابدا (يعني الشرط دائما غير محقق)
if ( tete != null )
{
aff_adr(p,q);
}
else
{
tete=q;
}
p=qثالثا:
بعد الحلقةfor قمت بإعطاء القيمة null للمؤشر p (قيمة tete تحتوي علىnull )
p=tete;وكنتيجة حتمية لن تعمل حلقة while لان الشرط غير محقق
----------------------------------------------
عذرا, حاليا لم استطع تنفذ الحل على الحاسوب لان لدي بعض مشاكل في الوينودز لم تسمح بتنفيذه.


أخي لقد صححت البرنامج كما هو الاقتباس لكن مازالت هناك بوكل انفيني
يعرض النتائج بتكراار لم أفهم ما السبب

yalova
2013-03-29, 15:30
هاهو البرنامج الجديد ارجو التصحيح

agm1991
2013-03-29, 16:10
السلام عليكم ورحمة الله وبركاته
اليك تصحيح (تم تعديل كثير من الاوامر)
الحل يعمل بشكل جيد ,
تم انجازه بdevcpp 5.3.0.3


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Maillon {
int val;
struct Maillon *suiv;
}Maillon,*pMaillon;
void Allouer(pMaillon &P)
{
P= (pMaillon) malloc( sizeof(Maillon));
};
struct Maillon *Suivant ( struct Maillon *P)
{
return( P->suiv );
};
void Aff_Val( pMaillon &P, int v )
{
P->val = v;
}
void Aff_Adr( pMaillon &P, pMaillon Q )
{
P->suiv = Q;
}
int Valeur( pMaillon P)
{
return (P->val);
}
main()
{



pMaillon p,q,Tete;
int i,Nombre_des_elements;
int val; /* La valeur peut etre de type qlq : ici un entier */
Tete=NULL;
printf("Veuillez introduire le nombre des elements dans la liste ==>");
scanf("%d",&Nombre_des_elements);
Allouer(p);
printf("LA VALEUR DU MAILLON 1 est :");
scanf("%d",&val);
Aff_Val(p,val);
Aff_Adr(p,NULL);
Tete=p;
for ( i=2 ; i<=Nombre_des_elements ; i++)
{
printf("LA VALEUR DU MAILLON %d est :",i);
scanf("%d",&val);
Allouer(q);
Aff_Val(q,val);
Aff_Adr(q,NULL);
Aff_Adr(p,q);
p=q;
}
p=Tete;
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
printf("appuyez sur n'importe quelle touche pour continuer\n");
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
getch();
i=1;
while ( p != NULL )
{
printf("la MAILLON NO = %d contien la Valeur %d\n",i,Valeur(p));
p= Suivant(p);
i++;
}
getch();
}
لي ملاحظات
الاولى: الدوال يتم كتابتها قبل الكلمة المحجوزة Main وليس داخلها(بالنسبة لي dev و باقي المترجمات الله اعلم)
الثانية:اعتقد انكم درستم passage par valeur et passage par adress ف الياسكال
المهم في السي نستخدم الرمز & لي passage par adress
الثالثة : استخدمت typedef لنختصر
struct Maillon الى Maillon
و
struct Maillon * الى pMaillon
السلام عليكم ورحمة الله وبركاته

yalova
2013-03-29, 17:55
السلام عليكم
أخي شكرا على الأخطاء التي نبهتني اليها
لكن انا ترجمت البرنامج بلغة السي حسب الخوارزمية التي اعطانا اياها الاستاذ أما برنامجك فلم يشتغل عندي بـــ codeblocks 10.05 ، وان لا اريد تغيير الخوارزمية لأنه طلب منا التقيد بذلك في العمل الموجه
هناك خطأ وحيد في برنامجي وهو كيفية عرض la liste والخطأيكمن في while فهو يعرض المحتوى لأخر maillon حسب عدد nombre des elements ولا يعرض محتوى جميع les maillons او بوكل انفيني اذا ما نزعت i
والله حيرني ....

yalova
2013-03-30, 11:57
السلام عليكم الرجاء المساعدة في القريب العاجل

agm1991
2013-03-30, 14:32
السلام عليكم ورحمة الله وبركاته
#include <stdio.h>
#include <stdlib.h>

int main()
{
/*typedef struct Maillon Maillon;*/
struct Maillon {
int val;
struct Maillon *suiv;
};
struct Maillon *Allouer() {
return ((struct Maillon *) malloc( sizeof(struct Maillon)));
};
struct Maillon *Suivant ( struct Maillon *p)
{
return( p->suiv );
};
void Aff_Val( struct Maillon *p, int v )
{
p->val = v;
}
void Aff_Adr( struct Maillon *p, struct Maillon *q )
{
p->suiv = q;
}
int Valeur( struct Maillon *p)
{
return (p->val);
}
struct Maillon *p;
struct Maillon *q;
struct Maillon *Tete;
int i,Nombre_des_elements;
int val; /* La valeur peut etre de type qlq : ici un entier */
Tete=NULL;
p=NULL;
printf("Veuillez introduire le nombre des elements dans la liste ==>");
scanf("%d",&Nombre_des_elements);
for ( i=1 ; i<=Nombre_des_elements ; i++)
{
printf("LA VALEUR DU MAILLON %d est :",i);
scanf("%d",&val);
q=Allouer();
Aff_Val(q,val);
Aff_Adr(q,NULL);
if ( Tete != NULL )
{
Aff_Adr(p,q);
}
else
{
Tete=q;
}
p=q;
}
p=Tete;
i=0;
while ( (p != NULL) && (i<Nombre_des_elements) )
{
printf("%d\n",Valeur(p));
p= Suivant(p);
i++;
}
return 0;
}

تم تغيير
Allouer(q);الى
q=Allouer();لانك allouer في برنامجك كتبتها على شكل دالة لديها قيمة مرجعة وليست procedure
---------------------

yalova
2013-03-30, 18:04
السلام عليكم ورحمة الله وبركاته
#include <stdio.h>
#include <stdlib.h>

int main()
{
/*typedef struct Maillon Maillon;*/
struct Maillon {
int val;
struct Maillon *suiv;
};
struct Maillon *Allouer() {
return ((struct Maillon *) malloc( sizeof(struct Maillon)));
};
struct Maillon *Suivant ( struct Maillon *p)
{
return( p->suiv );
};
void Aff_Val( struct Maillon *p, int v )
{
p->val = v;
}
void Aff_Adr( struct Maillon *p, struct Maillon *q )
{
p->suiv = q;
}
int Valeur( struct Maillon *p)
{
return (p->val);
}
struct Maillon *p;
struct Maillon *q;
struct Maillon *Tete;
int i,Nombre_des_elements;
int val; /* La valeur peut etre de type qlq : ici un entier */
Tete=NULL;
p=NULL;
printf("Veuillez introduire le nombre des elements dans la liste ==>");
scanf("%d",&Nombre_des_elements);
for ( i=1 ; i<=Nombre_des_elements ; i++)
{
printf("LA VALEUR DU MAILLON %d est :",i);
scanf("%d",&val);
q=Allouer();
Aff_Val(q,val);
Aff_Adr(q,NULL);
if ( Tete != NULL )
{
Aff_Adr(p,q);
}
else
{
Tete=q;
}
p=q;
}
p=Tete;
i=0;
while ( (p != NULL) && (i<Nombre_des_elements) )
{
printf("%d\n",Valeur(p));
p= Suivant(p);
i++;
}
return 0;
}

تم تغيير
Allouer(q);الى
q=Allouer();لانك allouer في برنامجك كتبتها على شكل دالة لديها قيمة مرجعة وليست procedure
---------------------

نعم أخي لقد انتبهت الى الخطأ وقد اشتغل البرنامج بارك الله فيك وجعلها في ميزان حسناتك :o :19: