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

لا اجد سبب المشكله في برنامجي

مغلقمُجاب
بدأه hicham@com في 25 أبريل 2014 · 2 رد · 1,321 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 

اخوتي الكرام لدي الكود الاتي كلما قمت بادخال أول بيان يتوقف فجأه و لم أجد سبب المشكله أرجو المساعده

البرنامج يقوم بقراءة بيانات طالب و اضافتها اما اول القائمة او اخرها ثم يعرض القائمة، كلما يصل الكود لقراءة رقم الطالب و ادخل الرقم يتوقف

#include<stdio.h>
#include<stdlib.h>

typedef struct eleves
{
	int num;
	char nom[10];
	char prenom[10];
	struct eleves*suivant;
}E;
typedef E* liste;
//Fonction Ajout tete
liste Ajout_tete(liste p)
{
	liste nouveau=(liste)malloc(sizeof(E));
	printf("donner le numero:\t");
	scanf("%d",&p->num);
	printf("donner le nom:\t");
	scanf("%s",p->nom);
	printf("donner le prenom:\t");
	scanf("%s",p->prenom);
	nouveau->suivant=p;
	p=nouveau;
	return p;
}
//Fonction Ajout queu
liste Ajout_fin(liste p)
{
	liste nouveau=(liste)malloc(sizeof(E));
	printf("donner le numero:\t");
	scanf("%d",&p->num);
	printf("donner le nom:\t");
	scanf("%s",p->nom);
	printf("donner le prenom:\t");
	scanf("%s",p->prenom);
	if(p==NULL)
	{
		p=nouveau;
	}else{
		liste temp=p;
		while(temp->suivant!=NULL)
		{
			temp=temp->suivant;
		}
		temp->suivant=nouveau;
	}
	return p;
}
//Fonction Affichage
void Affiche(liste p)
{
	liste temp=p;
	if(temp!=NULL)
	{
		printf("%d,%s\t%s",temp->num,temp->nom,temp->prenom);
		Affiche(temp->suivant);
	}
}
main()
{
	int n,i;
	liste p=NULL;
	
	printf("Donner le nbr d'eleves:\t");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		p=Ajout_fin(p);
	}
	Affiche(p);
return 0;
system("pause");
}
−1
#2 أفضل إجابة

* تجنب استخدام الفرنسية في كتابة المتغيرات والدوال.

* ضع مسافات لتسهيل قراءة البرنامج، بدل ان تكتب:

for(i=1;i<=n;i++)

اكتب:

for(i = 1 ; i <= n ; i++)

* يفضل استخدام المسافات بدل حرف الـtab في محرر النصوص لأن عرض الـtab غير ثابت في المتصفحات ومحررات النصوص، ادخل لإعدادات محررك وابحث عن خيار يبدل لك الـtab بمسافة (مسافتين أو أربع),

 

عند إضافة أول عنصر فأنت تضيفه عند العنوان NULL.

liste Ajout_fin(liste p)
{
    liste nouveau=(liste)malloc(sizeof(E));
    printf("donner le numero:\t");
    scanf("%d",&p->num);
    printf("donner le nom:\t");
    scanf("%s",p->nom);
    printf("donner le prenom:\t");
    scanf("%s",p->prenom);
    ....

يفترض أن تقرأ العناصر في nouveau وليس p.

 

أيضاً ضع قيمة مؤشر العنصر التالي nouveau->suivant = NULL.

  liste nouveau = (liste) malloc(sizeof(E));
  if( nouveau == NULL )
  {
    perror("Error");
    abort();
  }
  printf("donner le numero:\t");
  scanf("%d", &nouveau->num);

  printf("donner le nom:\t");
  scanf("%s", nouveau->nom);

  printf("donner le prenom:\t");
  scanf("%s", nouveau->prenom);

  nouveau->suivant = NULL;

في الدالة Affiche لاتعمل استدعاء ذاتي كي تطبع العناصر، بدل if بـwhile هكذا:

void Affiche(liste p)
{
    liste temp=p;
    while(temp!=NULL)
    {
        printf("%d,%s\t%s\n",temp->num,temp->nom,temp->prenom);
        temp = temp->suivant;
    }
}

أو بدلها بـfor لتصبح أسهل قراءة:

void Affiche(liste p)
{
  liste temp;

  for(temp = p ; temp ; temp = temp->suivant)
  {
    printf("%d,%s\t%s\n", temp->num, temp->nom, temp->prenom);
  }
}
1
#3

بارك الله فيك لقد صلحته و أتممته جزاك الله خيرا

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

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