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

اريد برنامج بلغة c يعد الكلمات. الفكرة بسيطة جدا اريدة باسرع وقت.

مغلق
بدأه حتومي في 6 يناير 2007 · 28 رد · 2,940 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اريد برنامج بلغة c يعد الكلمات. الفكرة بسيطة جدا اريدة باسرع وقت.

طريقة البرنامج

ادخل جملة ثم ياتي بعدد الكلمات

ثم اكتب كلمة يخبرني هل هي موجودة او لا

مثلا

ادخلت I am car new .

يطبع عدد الكلمات وهي 4

ثم ادخل كلمة مثلا car

يخبرني هل هي موجودة او لا

ارجوكم بسرعة

#2

اولاه بسرعه

#3

هذه دالة تقوم بحساب عدد الكلمات

قم بتكملة السؤال بنفسك :)

#include <ctype.h>

int word_cnt (char *s) {
	int cnt=0;
	while (*s != '\0') {
		while (isspace (*s)) s++;
		if (*s != '\0') {
			cnt++;
			while (!isspace(*s) && *s != '\0') s++;
		}
	}
	return cnt;
}
#4

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

أستخدم الدالتين strlen لمعرفة عدد حروف المصفوفة الحقيقى (الذى بداخلها وليس حين أعلن عنها وبحذف الصفر أيضا) strchr للبحث عن حروف داخل مصفوفة أو ممكن من خلال أمر find الخاص بأوامر النظام

لو حبت شرح بأذن الله أشرحلك أستعمالهم

أرجو أن أكون أفدتك

سلام

تم تعديل هذه المشاركة بواسطة say say not know في 6 يناير 2007 في 19:26

befor any great jop there is a bad jop had done

#5

مشكور بس ابغى البرنامج كامل ويعديني خيار البحث

#6

بصراحة مش فاهم أيه تقصد ممكن توضيح؟

befor any great jop there is a bad jop had done

#7

ابغى البرنامج من اول شي لا خره

اعطيك فكرة البرنامج

حينما تقوم بتشغيله يقول لك البرنامج ادخل جملة كتبت مثلا I am go to university.

يطبع عدد الكلمات 5 كلمات

بعدين يقول لي ادخل كلمة مثلا ادخلت home يقول الكلمة غير موجودة.

واذا مثلا ادخلت am يقول موجودة يعني موجودة بالسترينج الي كتبته اول شي....

تكفى بسرعة

وضحت

#8

أخى أقرأ قواعد المشاركة قبل الرد ولكن أرنا محاولتك ونحن نساعدك ليس بأن تطلب البرنامج كامل :blink: بدون أن تفعل أى شىء

أرجو أن لا تكون أضايقت من كلامى لكن كان لابد منه <_<

befor any great jop there is a bad jop had done

#9

بسرعه اويلاه وينكم

لاحد الان وصلت كذا ارجو التكمله

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int word_cnt (char *s);
int main() 
{ 
		char text[] = "I am car new.";
		word_cnt (text);
		return 0;
}
int word_cnt (char *s) {
	int cnt=0;
	while (*s != '\0') {
		while (isspace (*s)) s++;
		if (*s != '\0') {
			cnt++;
			while (!isspace(*s) && *s != '\0') s++;
		}
	}
	printf("%d",cnt);
	return cnt;
}

هذه محاولتي ولاتزعل say say not know

باقي مايحسب الفاصلة والنقطة + انت الي تدخل الجملة + خيار البحث

بأذن الله سأتي بالبرنامج قبلك

يالله ايهم اسرع

#10
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int word_cnt (char *s);
int main() 
{ 
		char text[100];
		char *ptr;

		printf("Enter a string contaning puncuations: \n");
		gets(text);
		ptr = text;
		while(ptr != '\0')
		{
			ptr = strpbrk(ptr,".,!;'/-/" );
			if(ptr != '\0')
				*ptr = ' ';
		}
		printf("\n%s\n\n",text);

		word_cnt (text);


	return 0;
}
int word_cnt (char *s) {
	int cnt=0;
	while (*s != '\0') {
		while (isspace (*s)) s++;
		if (*s != '\0') {
			cnt++;
			while (!isspace(*s) && *s != '\0') s++;
		}
	}
	printf("%d",cnt);
	return cnt;
}

باقي خيار البحث

مثلا كتبت الجملة i am very good .

بعدين كتب very يقول لي موجودة

#11

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

وأدى يا أخى ما ينقص البرنامج :D

main()
  {
	 char st, ch;
	  FILE * opfile;
	  int shearch;

	  opfile=fopen("string.dat", "a");
	 printf("Input string: %s");
	  scanf(&st);
	   fprintf(opfile, "%s", st);
	   fclose(opfile);

		printf("\nInput characters:%s");
		scanf(&ch);   

		 shearch =system("find %s string.dat", ch);

		 if(shearch!=0)
		 printf("\nThe characters found");
		 else
		  printf("\Not found character");
}

ونسيت أخى فى هذا البرنامج سيظهر لك ملف ملف فى folder البرنامج أسمه string.dat فتحط أمتداد الملف كامل بأسمه فى جملة find بدلا من string.dat بس

أرجو أن أكون أفدتك سلام

تم تعديل هذه المشاركة بواسطة say say not know في 6 يناير 2007 في 21:31

befor any great jop there is a bad jop had done

#12

اخي say say not know الا ترى ان في الدالة word_cnt بعض التعقيد قليلا لم لا تجرب هذه الطريقة في العد

int word_cnt (char *s) 
{
	int cnt=1;
	while (*s++) if(*s == ' ')cnt++;
	return cnt;
}
#13

الأخ alawashiz

ماذا لو كان في الجملة فراغين متتاليين ؟؟

ماذا لو كانت الجملة فارغة، أي ان s=null ؟؟

ماذا لو كان قبل او بعد الجملة فراغات ؟؟

أعتقد ان حلك لا يؤدي المطلوب :)

#14
اقتباس
اخي say say not know الا ترى ان في الدالة word_cnt بعض التعقيد قليلا لم لا تجرب هذه الطريقة في العد

أولا ليس أنا من كتبها لكنها طريقة أسهل من الطريقة التى تقول عنها

اقتباس
الأخ alawashiz

ماذا لو كان في الجملة فراغين متتاليين ؟؟

ماذا لو كانت الجملة فارغة، أي ان s=null ؟؟

ماذا لو كان قبل او بعد الجملة فراغات ؟؟

أعتقد ان حلك لا يؤدي المطلوب

حله يؤدى المطلوب ولكن ليس عملى فهو يمكن أن يفعل أذا ظهر فراغ يكمل حتى 8 فراغات فأن لم يوجد حروف يقف عند هذا الحد

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

أما أذا وجد فراغ قبل الجمل فيجعل تقبل مساحة 8 فراغات ولا أظن أن المستخدم سيحتاج لإدخال أكثر من 3 فراغات فبل الجملة

ولكنها فكرة غير عملية

befor any great jop there is a bad jop had done

#15

عذرا اخي say say not know ظننت انه انت من كتب الكود

اخي abc_amjad

فقظ اريد ان اخبرك ان جميع السلاسل النصية تنتهي بـnull ولا يوجد سلسلة نصية ينتصفها null

اي ان علامة انتهاء السلسة النصية هو الحرف null

اقتباس
حله يؤدى المطلوب ولكن ليس عملى فهو يمكن أن يفعل أذا ظهر فراغ يكمل حتى 8 فراغات فأن لم يوجد حروف يقف عند هذا الحد

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

أما أذا وجد فراغ قبل الجمل فيجعل تقبل مساحة 8 فراغات ولا أظن أن المستخدم سيحتاج لإدخال أكثر من 3 فراغات فبل الجملة

ولكنها فكرة غير عملي

عفوا اخي لم افهم ماتقصد

لا اعلم من اتيت بالرقم 8 ولا ادري لماذا فكرتي ليست عملية

على العموم ساقوم بشرح الفكرة

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

بعد ذلك تقوم حلقة الدوران while بالفحص عن حروف السلسة حرف حرف حتى يصل الى نهاية الجملة فاذا كان مسافة يقوم بزيادة العداد

بعد ذلك نعيد قيمة العداد

فقط

#16

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

اشكر الاخ abc_amjad لانه ساعدني في بعض الاكود

وهذا البرنامج كملته لكم ياشباب

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int word_cnt (char *s);
int main() 
{ 
	char text[1000],word[1000];
	char *ptr;

		printf("Enter a sentence: ");
		gets(text);
		ptr = text;
		while(ptr != '\0')
		{
			ptr = strpbrk(ptr,".,!;'/-/" );
			if(ptr != '\0')
			*ptr = ' ';
		}
		word_cnt (text);
		printf("\n\nEnter a word: ");
		scanf ("%s",&word);
		if ( strstr( text, word ) != NULL )
		{
			printf( "\'%s\' was found in \"%s\".\n", word ,text);
		} 
		else
		{ 
			printf( "\'%s\' was not found in \"%s\".\n", word , text);
		}

	return 0;
}
int word_cnt (char *s)
{
	int cnt=0;
	while (*s != '\0')
	{
		while (isspace (*s))
		s++;
		if (*s != '\0')
		{
			cnt++;
			while (!isspace(*s) && *s != '\0')
			s++;
		}
	}
	printf("\n Number of words is %d",cnt);
	return cnt;
}

abc_amjad لوتكرمت اشرح للشباب

#17

أخى الأخ abc_amjad كان يقصد أذا كانت السلسلة الحرفية فارغة أى كلها تساوى NULL فأرجع إلى حلك وأنظر ماذا سيفعل أذا كانت الجملة فارغة أو أذا كانت تحتوى على أكثر من فراغ بين الكلمات والعدد 8 أفتراضا مش شرط حتى يبحث عن السلسلة الحرفية فأن وجد فراغ يظل يستقبل حتى 8 فراغات مثلا فأنا أخترت رفم مثل 8 لان المستخدم مش معقول هيدخل جملة المسافة بين كلماته أكثر من 8 قراغات وهكذا

أخى حتومي

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

ولو حبيت توضيح أنا ممكن أوضح

أرجو أن تكون الفكرة أتضحت

سلام

befor any great jop there is a bad jop had done

#18

اولا ارجوا الا يكون الهدف من هذه المناقشة هو فقط ان يدافع كل منا عن فكرته

فكلنا نخطئ ونصيب وجل من لا يسهو

ثانيا

للمعلومية فقط كلتا الدالتين تحدث خطا عند اسناد القيمة NULL الى المؤشر

وما اشرت اليه انا من بداية الموضوع هو التبسيط

فلا اظن ان هناك مستخدم سيدخل سلسلة نصية null او يقوم بادخال جملة لفارغة وان حصل ذلك فلا تتحمل الدالة ادنى مسؤلية :rolleyes:

لان الدالة تفترض من البداية ان يكون هناك جملة ولو من حرف واحد

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

انظر

int word_cnt (char *s) 
{
	int cnt=1;
	while (*s++) if(*s == ' '){cnt++;while(*s==' ')s++;}
	return cnt;
}

اخيرا (زبدة الموضوع ) عندما قلت تعقيد قصدت تلك الثلاث جمل while المتكررة ثلاث مرات

شكرا

#19
اقتباس
اولا ارجوا الا يكون الهدف من هذه المناقشة هو فقط ان يدافع كل منا عن فكرته

فكلنا نخطئ ونصيب وجل من لا يسهو

أولا هذا صحيح وأنا لاحظت فعلا هذا وحتى أنت تدافع الآن عن الفكرة مع أن كلتا الفكرتين غير مكتملتين لكن فكرتك ينقصها أكثر من الجملة السابقة المسافات ولو الجملة فارغة وفى التعليق على بقية ردك سيتضح المقصود من كلامى بأذن الله

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

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

أرجو أن تكون أتضحت الرؤية من منظار واسع وعام يضم رؤية جميع الأعضاء

سلام

befor any great jop there is a bad jop had done

#20

ماذا لو كان في الجملة فراغين متتاليين ؟؟

ماذا لو كانت الجملة فارغة، أي ان s=null ؟؟ (بمعنى أن المستخدم لم يدخل شيء، او ان s لا تحتوي على شيء)

ماذا لو كان قبل او بعد الجملة فراغات ؟؟

فكرتك واضحة، ولكن فيها نقص

#21

لا اريد ان اعيد كلامي لكي لاتقوموا بنفس العملية

استاذي say say not know

ماالذي ينقص البرنامج لكي لا يكون ساذج؟ فقط جملة شرطية للتحقق ؟

اضف الجملة الشرطية هل ستكون بنفس التعقيد؟

فقط وضحو لي لماذا هذا التداخل بين جمل while

اشرحوا لي ماتقوم به تلك الدالة فقد اكون ظننت بها ظن السوء B)

#22

أخى فعلا هذه الجملة الصغيرة لا يجوز أن تكون سبب خلاف بين الأعضاء وبالنسبة للجملة أخى فأنا أعرف أنك تعرف عملها ولكن تظن أننا لا نفهم ما الغاية منها

أخى فى الجملة هذه وضعنا وضعنا فى جملة التكرار while الحد الأعلى للتكرار المسموح به والذى هو 36888 دورة ومن ثم وضعنا الشرط if والذى يشترط أذا المؤشر s يساوى فراغ أو NULL ينفذ ما يليه والأمر بعده يجعل المتغير cnt يأخذ القيم الصفرية ومن ثم جملة التكرار while والتى تكرر إسناد القيمة NULL وينقذ تكرار أخر كما فى أول الجملة فالجملة ليست معقدة جدا ولكنها تحتوى على تكرارين فقط

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

سلام

تم تعديل هذه المشاركة بواسطة say say not know في 8 يناير 2007 في 22:59

befor any great jop there is a bad jop had done

#23

بالفعل الموضوع اخذ اكبر من حجمه

اشكركم على تعاونكم

#24
اقتباس
بالفعل الموضوع اخذ اكبر من حجمه

طالما الموضوع تحول إلى موضوع نقاشي فالمشاركات تنير الموضوع اكثر واكثر , ولا يؤدي ذلك إلى هدر او شئ من هالقبيل .

بالسنبة لي انا ارى ان الحلول التي قدمها الاخوان abc_amjad & alawashiz

حلول ممتازة لكن اعتقد بأن الحل الذي قدمه alawashiz اوضح ومجدي للتعامل مع جملة مثل التي طرحها حتومي لكنه سيواجه صعوبة بالتعامل مع بعض الحالات التي طرحها الاخوان " ماذا لو كانت الجملة تحتوي على فراغين وإلخ "

ولكن معالجتها بسيطة جدا , يمكن ذلك عن طريق حجز متغير جديد للتأكد من عناصر السلسة بأنها لم تصل بعد إلى NULL حتى لو كان أول عنصر , وبالنسبة للفراغين يمكن عن طريق حلقة تكرار تجاهل الفراغ الثاني او اذا كان هناك ثالث .. إلخ

تم تعديل هذه المشاركة بواسطة time1 في 9 يناير 2007 في 08:10

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#25

في البدااية ارحب فيك اخي time1

اقتباس
طالما الموضوع تحول إلى موضوع نقاشي فالمشاركات تنير الموضوع اكثر واكثر , ولا يؤدي ذلك إلى هدر او شئ من هالقبيل .

هذا اذا كانت النتيجة المرجوة ( من جميع الاطراف ) هي التعلم و الاستفادة

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

تم تعديل هذه المشاركة بواسطة alawashiz في 9 يناير 2007 في 13:39

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

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

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

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

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

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