• 0
hicham@com

برنامجي لا يقرأ المدخلات

سؤال

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

 

عندي البرنامج التالي عباره عن création liste نقرأ فيها مدخلات n élèves ثم يمكنك من اضافة تلميذ جديد اما في اول اللقائمة او اخرها البرنامج يشتغل لكن ما يقرا المدخلات ما تنحفظ فيه مش لاقيه وين المشكل

#include<stdio.h>#include<stdlib.h>typedef struct Eleves{	char *num;	char *nom;	char *prenom;	struct Eleves*suivant;}E;E*tete=NULL;//Fonction Lecture:E *Lecture(E*tete,char *N,char *Nom,char *Prenom){	printf("\nDonner le numero d'inscription:\t");	scanf("%s",&N);	printf("\nDonner le nom de l'eleve:\t");	scanf("%s",&Nom);	printf("\nDonner le prenom de l'eleve:\t");	scanf("%s",&Prenom);	return tete;}//Fonction Création liste de n élèves:E*Creer(int n,E*tete,char *N,char *Nom,char *Prenom){	E*courant=tete;	while(n>0)	{		tete=(E*)malloc(sizeof(E));		Lecture(tete,N,Nom,Prenom);		tete->num=N;		tete->nom=Nom;		tete->prenom=Prenom;		tete->suivant=courant;		courant=tete;		n--;	}	return tete;}//Fonction Ajout en tête:E*Ajout_tete(E*tete,char *N,char *Nom,char *Prenom){	E*nouveau;	nouveau=(E*)malloc(sizeof(E));	nouveau->num=N;	nouveau->nom=Nom;	nouveau->prenom=Prenom;	nouveau->suivant=tete;	tete=nouveau;	return tete;}//Fonction Ajout à la fin:E*Ajout_fin(E*tete,char *N,char *Nom,char *Prenom){	E *nouveau;	nouveau=(E*)malloc(sizeof(E));	nouveau->num=N;	nouveau->nom=Nom;	nouveau->prenom=Prenom;	nouveau->suivant=NULL;	if(tete==NULL)	{		tete=nouveau;	}else{		E*courant=tete;		while(courant->suivant!=NULL)		{			courant=courant->suivant;		}		courant->suivant=nouveau;	}	return tete;}//Fonction d'affichage:void Affichage(E*tete){	E*courant=tete;	while(courant!=NULL)	{		printf("\neleve = %s %s %s",courant->num,courant->nom,courant->prenom);		courant=courant->suivant;	}}main(){	//Déclarations:	int n,i,R;	E*tete=NULL;	char N[10],Nom[30],Prenom[30];	//Début:	do	{		printf("Donner le nombre d'eleves:\t");		scanf("%d",&n);	}while(n<=0);	Creer(n,tete,N,Nom,Prenom);	Affichage(tete);	do 	{		printf("\nVoulez vous ajouter l'eleve au debut de la liste ou a la fin? 0/1\t");		scanf("%d",&R);	}while(R!=0 && R!=1);	if(R==0)	{		Lecture(tete,N,Nom,Prenom);		tete=Ajout_tete(tete,N,Nom,Prenom);		Affichage(tete);	}else{		Lecture(tete,N,Nom,Prenom);		tete=Ajout_fin(tete,N,Nom,Prenom);		Affichage(tete);	}	return 0;system("pause");} 
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

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

من الطبيعي ان لا تحدث قراءة للمدخلات بشكل صحيح لانك قمت بكتابة هذه الدالة

E *Lecture(E*tete,char *N,char *Nom,char *Prenom){	printf("\nDonner le numero d'inscription:\t");	scanf("%s",&N);	printf("\nDonner le nom de l'eleve:\t");	scanf("%s",&Nom);	printf("\nDonner le prenom de l'eleve:\t");	scanf("%s",&Prenom);	return tete;}

انا برايي لا فائدة ترجى منها خصوصا و ما ترجعه هو tete و انت ترغب بارجاع قيم رقم التسجيل و الاسمو اللقب و لا توجد دالة ترجع 3 قيم في نفس الوقت ... و انا لا ارى في اي مكان من هذه الدالة اي اسناد قيم للمتغير tete لذلك قم بحذف هذه الدالة من الاساس و قم بالقراءة مباشرة في وسط الدالة Creer 

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

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>typedef struct Eleves{	char num[10];	char nom[30];	char prenom[30];	struct Eleves*suivant;}E;E*tete=NULL;//Fonction Lecture:/*E *Lecture(E*tete,char *N,char *Nom,char *Prenom){	printf("\nDonner le numero d'inscription:\t");	scanf("%s",&N);	printf("\nDonner le nom de l'eleve:\t");	scanf("%s",&Nom);	printf("\nDonner le prenom de l'eleve:\t");	scanf("%s",&Prenom);	return tete;}*///Fonction Création liste de n élèves:E *Creer(int n,E *tete){               char N[10],Nom[30],Prenom[30];	E *courant,*p;	tete=NULL;	p=tete;	while(n>0)	{                              printf("\nDonner le numero d'inscription:\t");                              scanf("%s",&N);                              printf("\nDonner le nom de l'eleve:\t");                              scanf("%s",&Nom);                              printf("\nDonner le prenom de l'eleve:\t");	               scanf("%s",&Prenom);		p=(E*)malloc(sizeof(E));		memcpy(p->num,N,sizeof(N));		memcpy(p->nom,Nom,sizeof(Nom));		memcpy(p->prenom,Prenom,sizeof(Prenom));		p->suivant=NULL;		if(tete!=NULL)                                             courant->suivant=p;                              else                                             tete=p;                              courant=p;		n--;	}	return tete;}//Fonction Ajout en tête:E*Ajout_tete(E*tete){               E *nouveau;               char N[10],Nom[30],Prenom[30];               printf("\nDonner le numero d'inscription:\t");               scanf("%s",&N);               printf("\nDonner le nom de l'eleve:\t");               scanf("%s",&Nom);               printf("\nDonner le prenom de l'eleve:\t");	scanf("%s",&Prenom);	nouveau=(E*)malloc(sizeof(E));	memcpy(nouveau->num,N,sizeof(N));	memcpy(nouveau->nom,Nom,sizeof(Nom));               memcpy(nouveau->prenom,Prenom,sizeof(Prenom));	nouveau->suivant=tete;	tete=nouveau;	return tete;}//Fonction Ajout à la fin:E *Ajout_fin(E *tete){               E *nouveau;               char N[10],Nom[30],Prenom[30];               printf("\nDonner le numero d'inscription:\t");               scanf("%s",&N);               printf("\nDonner le nom de l'eleve:\t");               scanf("%s",&Nom);               printf("\nDonner le prenom de l'eleve:\t");	scanf("%s",&Prenom);	nouveau=(E*)malloc(sizeof(E));	memcpy(nouveau->num,N,sizeof(N));	memcpy(nouveau->nom,Nom,sizeof(Nom));               memcpy(nouveau->prenom,Prenom,sizeof(Prenom));	nouveau->suivant=NULL;	if(tete==NULL)	{		tete=nouveau;	}else{		E*courant=tete;		while(courant->suivant!=NULL)		{			courant=courant->suivant;		}		courant->suivant=nouveau;	}	return tete;}//Fonction d'affichage:void Affichage(E *tete){	E *courant=tete;	while(courant!=NULL)	{		printf("\neleve = %s %s %s",courant->num,courant->nom,courant->prenom);		courant=courant->suivant;	}}main(){	//Déclarations:	int n,i,R;	E *tete,*liste;	//Début:	do	{		printf("Donner le nombre d'eleves:\t");		scanf("%d",&n);	}while(n<=0);	liste=Creer(n,tete);	Affichage(liste);	do	{		printf("\nVoulez vous ajouter l'eleve au debut de la liste ou a la fin? 0/1\t");		scanf("%d",&R);	}while(R!=0 && R!=1);	if(R==0)	{		//Lecture(tete,N,Nom,Prenom);		liste=Ajout_tete(liste);		Affichage(liste);	}else{		//Lecture(tete,N,Nom,Prenom);		liste=Ajout_fin(liste);		Affichage(liste);	}return 0;system("pause");}

كما ترى فقد غيرت حقول بنيتك الجديدة الى جداول ثابتة لاننا لن نرسلها ابدا الى اي دالة، ايضا الخطأ الذي ارتكبته هو التالي

tete->num=N;tete->nom=Nom;tete->prenom=Prenom;

من المحال ان يتم نسخ سلسلة محرفية الى اخرى باستعمال رمز = لذلك عليك استخدام الدالة memcpy و توابعها 3 و هي الحاوية الجديدة العبارة المنسوخة و حجم الحاوية و نحدده بالدالة  sizeof و بذلك نسخ المحتويات الى حاويتنا الجديدة يكون كالتالي

memcpy(p->num,N,sizeof(N));memcpy(p->nom,Nom,sizeof(Nom));memcpy(p->prenom,Prenom,sizeof(Prenom));               

و ايضا ان كنت تريد ان تقوم بانشاء قائمة فعليك استخدام متغيرين من بنيتك الجديدة في البرنامج الرئسي و ليس واحدة فقط و هنا قمت بتعريف اثنتين tete و liste الولى كراس للقائمة ارسله لدالة التشكيل Creer  فقط لا غير و ما ترجعه لي اسنده للمتغير  liste و هي القائمة بعد التشكيل و هي التي ساعمل معها في جميع الدوال التالية

و هاهو التعريف في البرنامج الرئيسي

E *tete,*liste;

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

بالتوفيق اخي الكريم و من فضلك في المرات القادمة حاول ان لا تستعمل الفرنسية كثيرا و اللغة العامية الخاصة بنا حاول ان تستعمل الانجلزية او العربية الفصحى البحتة تجنبا لاي مشكل

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تنبيه خاص لصاحب الموضوع: كما قلت لمن قبلك أن اللغه الأساسية فى علوم الحاسب هى الإنجليزية و عندما تضع سؤال محتواه من كلمات و أكواد بالفرنسية فأنت تقلل من إحتمالات إجابة سؤالك، و أيضا من إحتمالات الإستفاده منه لغيركز لذا يرجى وضع هذه النقطه فى الإعتبار، فلك أن تتخيل وضع سؤال بالفرنسية فى موقع يشدد على الكتابة بالإنجليزية (مثل أغلب المواقع المشهورة)، تخيل ماذا سيحدث لهذا السؤال؟

 

أعلم أن اغلب دراستك قد تكون بالفرنسية و لكن حتى مع هذا فإنك تدرس الإنجليزية و لو بشكل يسير، و إن كان مستواك بها ضعيف فلا اعتقد ان مستوى الضعف قد يصل لعدم قدرتك لكتابة creation list بدلا من création liste (أو ترجمتها فى جوجل على سبيل المثال).

 

 

و الله ولي التوفيق

تم تعديل بواسطه C++er
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كما قال الأخ C++er البرنامج بغير الانكليزية متعب في القراءة ..

على كل حال , مشكلتك كما يبدو في المؤشرات وتمريرها للدوال ,

وطالما أنك تعرف أن المشكلة في الإدخال فعليك مراجعة دالة الادخال والتأكد من صحتها :)

انظر هنا :في Lecture

scanf("%s",&N);

تقوم بقراءة سلسلة نصية , صحيح ؟

عليك تمرير مؤشر إلى char هكذا

char*test=malloc(100);scanf("%s",test);

فقط اسم المؤشر بدون ال& .. لأن محتوى المؤشر هو عنوان أول عنصر ...

وهكذا بالنسبة لباقي المتحولات من نوع char*

 

و

 

ما شاء الله

اختنا tante لم تبق لي شيئاً لأقوله , تفصيلك كان متميزاً ! يبدو أنك أصبحت متمرسة في الـ debugging لبرامج الـ linked list

أنت تثبتين الآن أن الخبرة تأتي من الممارسة ,

 

وفقك الله

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اولا اعتذر اخوتي الكرام عن استعمالي للغه الفرنسيه او العامية فذلك راجع لعدم انتباهي لقانون المنتدى الناص على ذرك اما فيما يخص الفرنسيه فلان كل ما ادرسه بهذه اللغه ساعمل على ترجمة ذلك اكرر أسفي

فيما يخص الدالة memcpy فانا لم ادرسها ولا اعرف لا string.h و لا ctype.h سابحث اكثر

اما الداله Lecture فقد ارتأيت اضافتها حتى لا اعيد نفس الكود 3 مرات : في الاضافه برأس القائمه و اخرها و خلق القائمه في بادئ الامر

بارك الله فيكم جميعا ساحاول التعديل 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لتفهمك الوضع

بالنسبة للدالة memcpy فليس من المفترض ان يتم تدريسنا كل شيء في الجامعات او الاقسام لنطبقه بل هناك يتم اعطاؤنا الاساسيات و البقية نبحث عنها و نتعلمها فكما تعلم البرمجة بحر واسع لا حد له كل يوم تكتشف شيئا جديدا، عمل تلك الدالة هو كما قلت لك نسخ سلسلة محرفية الى اخرى، و string.h هي مكتبة فيها الدوال الخاصة بالعمل على السلاسل المحرفية و ان انت قمت بحذفها فسيقول لك الكومبايلر بان memcpy مجهولة المصدر و فيما يخص ctype.h فهي لا تفيد في برنامجك فقم بحذفها فقد حدث خطا فقط اثناء نسخ الكود لاجربه....تلك الدالة Lecture لا تستعملها مرة اخرى في مثل هذه الحالات و الا فانك سستعرض لمثل هذا المشكل في كل مرة...صحيح ان هناك حل لتغيير قيم اكثر من متغير في دالة لكنها صعبة نوعا ما

بارك فينا و اياك

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

 

أخي الكريم هشام بالأضافة إلي كل ما ذكره الأخوة أستعمل

fflush(stdin);

قبل أي scanf حتي تستطيع تحرير الأدخال من أي حرف أدخال زائد و هو Enetr.

 

أخوك عمرو عيسي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .