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

سلسلة - شغل مخك (1)

مغلق
بدأه هاني الأتاسي في 8 مايو 2002 · 24 رد · 3,776 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ملاحظة :: السلسلة الآن تحتوي على أكثر من 10 مسائل :) أرجو القاء النظرة عليها جميعا ..

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

مر معي سؤال لا أعرف الاجابة المثلى له لكني عندي اجابة وأريد أن أسمع اجاباتكم ونتناقش ..

لديك مصفوفة أرقام integers تحتوي على n عدد . كيف تستطيع أن تحدد True أو False إذا كانة المصفوفة ممكن أن يتم ترتيبها بحيث تكون الأعداد متتالية بشكل تام ..:

مثال

3 و 1 و 0 خطأ لأن 0 1 3 غير متعاقبة

-2 و 0 و 1 و -1 صحيح لأن -2 و -1 و 0و 1 متعاقبة

ماهي أفضل وأكفئ طريقة (من ناحية السرعة والمساحة المستهلكة) لتحديد السابق ..

;)

Coding on the Cloud and for the Cloud!

My Blog

#2

hi

i'm sure there are better than this.

int sp(int h[], int n)
{
	int i, cmd;
	int iResault;

	iResault = TRUE;

	for ( i= 0 , cmd = h[0]; i < n ; i++, cmd++)
	{
		if ( h != cmd )
		{
			iResault = FALSE;
			break;
		}

	}

	return iResault;
}
#3

السلام عليكم

أخ Developer .NET

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

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#4

معلومة رياضية بسيطة: (light)

مجموع الأعداد من 1 وحتى n هو

n(n+1) / 2

ومجموع n عدد متتالي ابتداءاً من B هو

(n(n+1) / 2 ) + n(B-1)
أي
n(n+ 2B -1)/2

:D

الفكرة هي كما يلي:

سنفترض أولاً أن المصفوفة لا تحوي أعداد مكررة

سنقوم بجمع أعداد المصفوفة

وبنفس الوقت نحدد أصغر هذه الأعداد

قيكون في هذه الحالة أصغرها هو B

فإذا كانت الأعداد متالية فمجموعها سيكون مساوياً

n(n+ 2B -1)/2

وإلا فهو أكبر لأننا افترضنا عدم التكرار

وأظن أنها طريقة جيدة :) ولكنها تعالج حالة خاصة نوعاً ما لأننا نفترض مسبقاً عدم التكرار :(

لكن كلفتها بسيطة (عمليات جمع) وأي خوارزمية أخرى ستحتاج (في الحالة العامة) إلى المرور على جميع العناصر لمرة على الأقل ;) . (قد تحسم النتيجة في خوارزميات أخرى قبل المرور على جميع العناصر إذا وجدنا مثلاً عنصرين الفرق بينهما أكبر أو يساوي n ولكنها حسب ظني لن تكون فعالة في معظم الحالات)

[Code2]

int srl (int h[], int n)

{ int i, min, sum;

min = h[0];

sum=0;

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

{

sum += h;

if (min > h) { min=h };

};

return sum == (n * (n + 2*min -1))/2

}

[/Code2]

بلغة باسكال

[Code2]

Function srl(Var h:array of integer; n:integer);

Var i,min,sum:integer;

begin

min:=h[0];

sum:=min;

for i:=1 to n-1 do

begin

sum:=sum+h;

if min > h then min:=h;

end;

srl:= (sum = n*(n + 2 * min - 1 ) / 2);

end;

[/Code2]

#5

طبعاً أكيد واضح أنو العناصر مو بالضرورة تكون مرتبة

;)

#6

اشكركم على المشاركة وأشكرك أخي سالم على هذا التفكير الرائع ..

ببساطة طريقتي جدا بسيطة ويمكن ما تخطر على البال ..

وهي أنو نوجد أصغر رقم ومن ثم أكبر رقم ونطرحهم من بعض ونقارن النتيجة بعدد العناصر .. ;)

وهذا هو الكود بالسي :

bool srl(int *arr, int n)
{
    if (n == 0) return false;

    int min = arr[0];
    int max = arr[0];

    for (register int i = 1; i < n; i++)
    {
        register int val = arr;

        if (val < min) min = val;
        if (val > max) max = val;
    }

    return (max - min + 1 == n);
}

هذا الكود يشبه كود الأخ سالم لكن أنا عندي فحص شرطين وهو لديه .

ماذا لو قارنا هذين السطرين

        if (val > max) max = val;
with
        sum += h;

لوجدنا أن التايني أسرع لأنه فقط جمع أما الأول فيقتضي مقارنة وقد يتبعها اسناد ..

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

والسؤال المطروح هل يوجد أفضل؟؟؟؟؟؟؟

:rolleyes:

Coding on the Cloud and for the Cloud!

My Blog

#7

السلام عليكم

موضوع ممتاز (f) (f) (f) .

لدي سؤال :

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

ما رأيكم ان تناقش الحالتين Integer , float numbesr .

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#8

:eek: :eek:

كيف يمكن أن تكون الأعداد الحقيقية متعاقبة ؟؟؟؟؟؟

فالعددين 1.99 و 2.00 ليسا متعاقبان .. وهذا كله يعتمد على الدقة التي نتعامل معها ..

Coding on the Cloud and for the Cloud!

My Blog

#9

نفس السؤال ممكن أن يطرح بطريقة أخرى ..

إذا كان لدينا مصفوفة ذات N عنصر و كل رقم يقع بين ال 1 و N .. ماهي أفضل طريقة لتحديد إذا كان يوجد في المصفوفة تكرار ؟؟ مع الملاحظة أنه يمكن تدمير عناصر المصفوفة ..

-- حلى هو نفس برنامجي ولكن السطر الأخير يغير إلى

return (max - min + 1 < n);

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

هل يوجد طريقة أفضل برأيكم من أحل المسئلة الجديدة؟؟

Coding on the Cloud and for the Cloud!

My Blog

#10

هل يوجد حل يسمح بتكرار بالعناصر ؟

شكرا

#11

التكرار خارج ضوء المسئلة ... والتعبير الذي يحسب مجموع الأعداد المتتالية لا يعتبر أيضا التكرار في الأعداد .. :rolleyes: :rolleyes: :rolleyes:

Coding on the Cloud and for the Cloud!

My Blog

#12

السلام عليكم

:o

اعتذر عن مسألة الاعداد الحقيقيه , دخلت مسألة ترتيب الاعداد في ذهني فأثرت على تفكيري ..

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

اذا لم تأخذ مسالة التكرار بعين الاعتبار فاعتقد ان طريقة الاخ هاني هي الافضل ...

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#13

:confused:

كلا الطريقتين تفترضان عدم التكرار!

:P

أما المسألة الثانية ما فكرت فيها حتى الآن :D :cool:

بعدين أخ هاني التفكير عادي بس أنت الرائع :P :P :D

#14

لن اشارك في هذا السؤال ....

لما فهمت السؤال الان قررت عدم المشاركة لانه ببساطه لما كتبت اول رد و قراء هاني الرد لم يصحح لي الخطأ ويقول ان المصفوفة لن تأتي مرتبه .... وقام tmaa مشكور بتنبيهي ..

هاني انا زعلان منك ....

#15

صديقي ديفولوبر ... أنا رأيت ردك ورد tmaa مع بعض ... فقلت لحالي ليش أرد مرة تانية إذا كان أحد غيري رد ؟؟؟ ووهي وردة (f) (f)

Coding on the Cloud and for the Cloud!

My Blog

#16
var myArray =new Array(1,5,3,2,4,0)
alert(inSecuence(myArray))
function inSecuence(inputArray){
	var testArray=inputArray.sort()
	if(testArray.length == -1 ) return false
	if(testArray.length == 0 ) return true

	var min=testArray[0]
	var next = min

	for(var n=1;n<=testArray.length-1;n++){
		if( Math.abs(next - testArray[n]) != 1) return false
		next=testArray[n]
	}
	return true
}
#17

مممم... بس احنا مابدنا الترتيب !!

راجع أحد الطرق السابقة التي لا تحتاج إلى ترتيب .. :)

Coding on the Cloud and for the Cloud!

My Blog

#18

المصفوفة الأصلية ماتترتب ، الدالة تعمل نسخة مرتبة تصاعديا لأختبار المصفوف

#19

أي المفروض كان عدم استخدام الترتيب لا من خارج المصفوفة ولا من داخل المصفوفة أقصد داخل وخارج التابع ;)

Coding on the Cloud and for the Cloud!

My Blog

#20

ممكن ، بس أنتم تبون الأفضل و الأسرع...

بدون ترتيب:

يجب مقارنة عنصر المصوفة بجميع العناصر الأخرى

هل الكود يفي بالغرض ؟

#21

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

مجهود رائع ممن شارك في هذا الموضوع ،كل من المشاركين حاولوا ايجاد الحل المناسب كل مشترك علي حسب حسه البرمجي .

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

فما الذي يضمن كون الأرقام غير مكررة مئة في المئة؟

حتي يكون برنامجنا قوي يجب ان نتوقع كافة الأحتمالات والأخطاء

#22

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

ولكن كان يجب المشاركة ولو بالقليل في هذا الموضوع الشيق

مع وعد بمشاركات قادمة أكثر فاعلية ان شاء الله

#23

الموضوع صراحة جذاب جداً و ديه أول مشاركة لى فياريت تعجبكم

الحل ده للمشكلة الأولى

معلش يا أستاذ هانى أنا مصر على الترتيب

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

الكود شكله كبير لكنه بسيط

أرجو إن كل شىء يكون واضح و أى إستفسار أنا تحت أمركم

الكود:

bool srl(int *arr, int n)
{
    if (n == 0) return false;

    int out,in,temp,k=0;

    for( out=0 ; out < n-1 ; out++)

       for (in=out+1 ; in < n ; in++)
       {
         if(arr[out]>arr[in])
          {
           temp=arr[in];
           arr[in]=arr[out];
           arr[out]=temp;
          }
          if(arr[out]==arr[in])
           {
            k++;
            temp=arr[in];
            arr[in]=arr[out+1];
            arr[out+1]=temp;
            out++;
            continue;
           }

        }
     return (arr[n-1] + k - arr[0] +1 ==n);
}

#24

الكود ده علشان لو ينفع التكرار

يعنى ينفع مثلاً : 3،2،2،2،2،1

اللى عنده أى فكرة لحل مشكلة التكرار يتفضل...

#25

أنا آسف جداً يا جماعة ...فيه خطا بسيط

المفروض الأمر :

break

بدلاً من:

continue

سهو منى و معلشى...

الكود بعد التصحيح:

bool srl(int *arr, int n)
{
    if (n == 0) return false;

    int out,in,temp,k=0;

    for( out=0; out < n-1; out++)

       for (in=out+1; in < n; in++)
       {
         if(arr[out]>arr[in])
          {
           temp=arr[in];
           arr[in]=arr[out];
           arr[out]=temp;
          }
          if(arr[out]==arr[in])
           {
            k++;
            temp=arr[in];
            arr[in]=arr[out+1];
            arr[out+1]=temp;
            out++;
            break;
           }

        }
     return (arr[n-1] + k - arr[0] +1 ==n);
}

و تحياتى للجميع

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

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