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

لدي سؤال + حل (وهو مفيد) لكنني عجزت عن فهم الحل فهل تساعدونني؟

مغلق
بدأه إسماعيل ابراهيم في 24 نوفمبر 2002 · 6 رد · 451 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم.

السؤال يقول: اكتب برنامج فيه ثلاث سلاسل نصية(ثلاث جمل) , الجملة الثانية أكبر من الاولى وتحتوي حروف مشابهة لبعض الحروف في الجملة الاولى, على البرنامج ان ينسخ الى الجملة الثالثة(والتي كانت فارغة حتى اللحظة) ان ينسخ اليها الحروف الموجودة في جملة2 وغير موجودة في جملة 1,,

مثال :

جملة 1: How are you,I miss you

الجملة 2: How are your bruther,I miss him

البرنامج يجب ان يجعل الجملة الثالثة تحوي:

r btuther him وبدون الفراغات طبعا.(اي الحروف غير الموجودة في جملة 1 لكنها موجودة في جملة 2.

----

هذا كان السؤال.

(((((((((((((((((((((((((((((((((((

الحل: (والذي لم افهمة واطلب ممن يستطيع تفنيده حرفا حرفا هو:

#include <stdio.h>



void main ()

{

	char first [] = "abCDeFGhijKL" , second [ ] = "12a3b4e56hij789" ,

  target [ 20 ], * pFirst = first , * pSecond = second,

  * pTempSecond  , * pTarget = target;

	while ( * pFirst && * pSecond ) {

  for ( pTempSecond  = pSecond ; * pTempSecond; pTempSecond  ++ )

 	 if ( * pTempSecond  == * pFirst )

    break;

  if ( * pTempSecond  ) {

 	 pFirst ++;

 	 pSecond = pTempSecond + 1;

  }

  else

 	 * pTarget ++ = * pFirst ++;

	}

	while ( * pFirst )

   * pTarget ++ = * pFirst ++;

	* pTarget = 0;

	printf ( "%s" , target );

}

طبعا هذا الحل كان مرفقا في نفس الكتاب الذي يحوي السؤال ,,, هل لكم ان تحللوه سطرا سطرا.. وحرفا حرفا..

وشكرا.

#2

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

أخي إسماعيل كيفك ؟ طيب إن شاء الله ؟

هذا مثال في كتاب ؟ :eek: ياخي حرام عليه المؤلف

هذا راح يكسر سوق السي :D

المهم هذا الكود حاولت اعدل فيه بحيث انه يجعل

الكود مفهوم شوي و أضفت كذا Comment في الكود

للتوضيح و أنت إمسك ورقة و قلم و تتبع الكود حبه حبة

إن شاء الله تفهمه تمام :)

 

#include <stdio.h>



int main ()

{

	char first [] = "abCDeFGhijKL" , second [] = "12a3b4e56hij789";

	char target [20], * pFirst = first , *pSecond = second;

	char *pTempSecond  , * pTarget = target;



	/*

    * pFirst  Point to first.

    * pSecond Point to second.

    * pTarget Point to target.

	*/





	while ( (*pFirst != NULL) && (*pSecond != NULL) ) 

	{

  for ( pTempSecond  = pSecond ; *pTempSecond != NULL; pTempSecond++ )

  {

 	 if ( *pTempSecond  == *pFirst )

    break;

  }



  if ( *pTempSecond != NULL  ) 

  {

 	 pFirst ++;

 	 pSecond = pTempSecond + 1;

  }

  else

  {

    *pTarget = *pFirst;

    *pTarget++;

    *pFirst++;

    /* is equal to (*pTarget ++ = *pFirst ++) */

  }



 	 

	}

	while ( *pFirst != NULL )

	{

  *pTarget = *pFirst;

     *pTarget++;

     *pFirst++;

  /* is equal to (*pTarget ++ = *pFirst ++) */

	}





	*pTarget = 0; /* to bring the pointer to the begin of the target string */



	printf ( "%snn" , target );

}

مع تحياتي ,,, أخوك / طلال.

#3

تحياتي اخ طلال.. كيف حالك؟

شكرا لك على الشرح.... بالفعل كان السؤال صعب الفهم لكن الحمد لله فهمت :)

--

في الحقيقة هذا ليس مثال في كتاب بل سؤال في كتاب للتمرين على سي/سي++ حتى المستوى المتقدّم. فيه اسئلة بتعقّد.. يعني هذا سؤال كان وسط.. وانا بديت اتدرّب لعلّي اتقدم فقد مللت من كوني مجرد مبتدئ.... :)

--

لدي سؤال على الهامش..

اليس صحيحا اننا عندما نعرف مصفوفة هكذا ;[]char string , يكون التعبير string مجرّد يدل على مؤشر للـمصفوفة؟ اذن لماذا استخدم المبرمج اعلاه مؤشرات منفردة؟

طبعا السؤال للجميع

اكرر شكري اخي طلال.(وتوقع كثير من هذا النوع من الاسئلة لأني ناوي افجّر مخي اذا ما صرت متقدّم :) .

#4

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

أخي إسماعيل منيح ما سويت كذا المبرمج ولا بلا (f)

المهم بالنسبة لسؤالك:

لتلاحظ أن هذا التعريف:

 

char str1[20];

مساوي لهذا التعريف:

 

char *str2;

str2 = (char*)malloc(sizeof(char)*20);

في الاول يعرف مؤشر من نوع char و يحجز له 20 خانة

و الثاني كذالك إلا أن النوع الاول يحجزها outomatic

أي لحظة التعريف.

و المصفوفة في السي ما هي في الاصل إلى مؤشر لعدة

عناصر لترى هذا المثال:

 

#include <stdio.h>

#include <stdlib.h>



int main ()

{

	char str1[20] = "talal*c";



	char *str2;

	str2 = (char*)malloc(sizeof(char)*20);



	str2 = str1;    /* str2 will be equal to str1 */



	printf("%cn", *(str1+1));  /* Using Pointer with the array declaration */

	printf("%cn", str2[1]);    /* Using arrays with the pointer declaration */

	/* The output in thees tow statments is the second letter in "talal*c" that is 'a' */



	return 0;

}

نفذ هذا البرنامج و افهمه جيداً لتعرف ان المصفوفات و

المؤشرات شيئ واحد في لغة السي و السي++ :)

مع تحياتي ,,, طلال.

#5

و بالنسبة

اقتباس
اذن لماذا استخدم المبرمج اعلاه مؤشرات منفردة؟

للتعقيد فقط :P و إلا إستخدام المصفوفات أسهل و

اوضح :)

#6

الف شكر طلال... ردك الاول حول المؤشر والمصفوفة أعرفة لكن ما كنت ابحث عنه هو الجواب الموجود في ردك الثاني :) مشكوووووووووووووووووووووووووور

الف شكر.

#7

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

هذا ما كنت أتمناه (f)

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

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

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

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

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

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