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

المسابقة الثانية ,,

مغلق
بدأه Khaled.Alshaya في 5 أبريل 2007 · 3 رد · 1,495 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ,,

نحتاج في كثير من الأحيان إلى تقسيم نص ما إلى عدة أقسام بناء على حواجز "فواصل" بين كل نص و آخر ,,

مثال ذلك ,, تصور أنك تريد أن يدخل المستخدم اسمه الثلاثي ,,

فقام المستخدم بإدخال التالي :

>> First Mid Last

جميل الآن تريد أن تخزن كل اسم في متغير أو تفعل به شيئاً ,, فمثلاً تريد إعادة ترتيب الاسم ليكون Last, First Mid و بالتالي تستخدمه في أغراض مختلفة ,,

طبعاً يمكنك استخدام متغير نصي و vector من STL إذا أحببت حتى توفر الجهد ,,

و لا تنسى أن الفاصلة في المثال السابق هي المسافة و في مسابقتنا الفاصل عبارة عن حرف واحد لتسهيل المهمة ,,

سأضع محاولتي عن قريب ,,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 5 أبريل 2007 في 20:21

#2

السلام عليكم ,,

هذا حلي للمسابقة التي طرحتها :rolleyes: ,,

void Tokenize ( string& Content, Token& Tokenizer, unsigned char Delimiter ){

	size_t Pos = 0;

	string SubStr   = "";

   	for ( size_t P = Content.find ( Delimiter, Pos ); P != string::npos; P = Content.find ( Delimiter, P ) ){

	   	SubStr = Content.substr ( Pos, P - Pos );

		Tokenizer.AddToken ( SubStr );

		Pos = ++P;
	}

	return;
}

طبعاً الكود يقوم بالبحث عن الفواصل التي يحددها المستخدم و يستخدم الكائن Token لإضافة الـ Tokens و التنقل بينهم ,,

و هذه هي واجهة الكائن ,,

class Token {

	string **Tokens;
	size_t Count, Current;
	// Array of Tokens.. Used by Tokenize function.

public :

	Token  () { Tokens = NULL; Count = 0; Current = 0; };
	~Token ();

	void AddToken ( string& token );

	bool NextToken ();
	bool PrevToken ();

	string GetToken () { return (*Tokens[ Current ]); };
	size_t GetCount () { return Count; };
	void PosStart   () { Current = 0; };
};

و

هذا هو الكود الخاص بالكائن ,,

~Token (){

	for ( size_t counter = 0; counter < Count; counter++ )
		delete Tokens[ counter ];

	if ( Tokens )
		delete Tokens;
}

void AddToken ( string& token ){

	string **Temp = NULL;

	size_t NewCount = Count + 1;


	Temp = new string* [ NewCount ];

	for ( size_t counter = 0; counter < Count; counter++ )
		Temp[ counter ] = Tokens[ counter ];

	Temp[ Count ] = new string( token );


	delete [] Tokens;

	Tokens = Temp;

	Count++;

	return;
}

bool NextToken (){

	if ( Current == Count )
		return false;

	Current++;

	return true;
}

bool PrevToken (){

	if  ( !Current )
		return false;

	Current--;

	return true;
}

أعرف أن الكود طويل و لكن الدالة الأولى هي حل المسابقة و الكائن Token هو لتخزين النصوص التي تم تقسيمها لا أكثر ,,

إذا كان لديك استفسار حول الكود فسأكون أكثر من سعيد بالإجابة ,,

ملاحظة : لأن السؤال عن تقسيم النص لذلك يمكنك استخدام الكائن الذي صممته بدلاً من Vector لأني أعرف أن الكثيرين لا يحبون استخدام المكتبة STL ,,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 6 أبريل 2007 في 01:15

#3

الاخ الفاضل ...

جميله هذه الفكرة، وكنت منذ فترة قد استخدمت فكرة الى حدما قريبه من ذلك فى الموضوع: اريد برنامج بلغة c يعد الكلمات WordsCounter.zip

وذلك لإفادة

شكراً

تم تعديل هذه المشاركة بواسطة Eng. Usama El-Mokadem في 6 أبريل 2007 في 02:54

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#4

السلام عليكم ,,

بعد إذنك أخ أسامة سأقوم بإدارج الكود لأنه داخل ضمن المسابقة ,,

و تحياتي للمشاركة الرائعة ,,

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

bool isSeparator(char ch, char* szSeperators);
bool InsertWord(char* szWord, char* szWordsArray);
bool isWordHere(char* szWord, char* szWordsArray);

int main(int argc, char* argv[])
{
	const	int iMaxWordLength		= 20;
	const	int iMaxWords			= 100;
	char	szWords[iMaxWords][iMaxWordLength+1];
	int		iCurrentWord = 0;

	const	int iMaxSentenceLength	= 1024;

	char	szSentence[iMaxSentenceLength+1];
	char	szWord[iMaxWordLength+1];
	char	szSeperators[] = " ,;.'\"-_";

	int		n, i = 0;
	int		iSearch;

	printf("\r\n\tEnter sentence: ");
	gets(szSentence);
	printf("\r\n\n");

	while(szSentence)
	{
		while(isSeparator(szSentence, szSeperators))
			i++;

		if (szSentence)
		{
			n	= 0;

			while(szSentence && !isSeparator(szSentence, szSeperators))
				szWord[n++] = szSentence[i++];
			szWord[n] = 0;

			if (InsertWord(szWord, szWords[iCurrentWord]))
				iCurrentWord++;

			if (szSentence)
				i++;
		}
	}
	printf("\r\n\tYour sentence have: %u word(s)\r\n", iCurrentWord);

	do
	{
		printf("\r\n\n\n\tEnter word for search [avoid using (%s)] : ", szSeperators);
		gets(szSentence);
		printf("\r\n");

		i = 0;
		n = 0;
		while(szSentence && isSeparator(szSentence, szSeperators))
			i++;
		while(szSentence && !isSeparator(szSentence, szSeperators))
			szWord[n++] = szSentence[i++];
		szWord[n] = 0;

		n = 0;
		iSearch = 0;
		while(iCurrentWord > n)
		{
			if (!strcmpi(szWord, szWords[n]))
				iSearch++;
			n++;
		}
		if (iSearch)
			printf("\r\n\tWord '%s' was found: %u time(s)\r\n", szWord, iSearch);
		else
			printf("\r\n\tSorry not found: %s\r\n", szWord);

		printf("\r\n\tWould you like search again?(Y/N)");
	}
	while(toupper(getch()) == 'Y');

	return 0;
}

bool isSeparator(char ch, char* szSeperators)
{
	int		i = 0;

	while(szSeperators)
	{
		if (ch == szSeperators)
			return true;

		i++;
	}

	return false;
}

bool InsertWord(char* szWord, char* szWordsArray)
{
	if (strlen(szWord))
	{
		strcpy(szWordsArray, szWord);
		return true;
	}
	return false;
}

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

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