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

افتتاح أكبر تجمع لعشاق لغتي السي و السي++ على منتديات الفريق العربي للبرمجة.

مغلقرائج
بدأه Snack3r في 25 يونيو 2010 · 322 رد · 21,470 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#276
أبو دحيم كتب:

namespace

أسئلتك تميل للصعوبة هذه المرة :(

لكن بإذن الله سأحلها ( مع أني مشغول كثيرا هذه الأيام لدي مجموعة مشاريع أريد تنفيذها )

سأحاول وأرسل لك الحل بإذن الله :)

المصفوفة عبارة عن عدة متغيرات في متغي واحد فكيف تقوم بإسناد عدة متغيرات إلى متغير واحد

يمكنك فقط إسناد عنصر واحد منها فقط

لا أعلم بالضبط ماذا تريد لكن سؤالك غريب قليلا :wacko:

يعني لا يمكن مساواه متغير بـ مصفوفه

لاني كنت اريد استخدم المصفوفه للحل

شكرا للتوضيح و ابدا لاتستغرب من السؤال كل يوم نتعلم

#277

مشغول جدا للأسف ولاأستطيع ان أشارك بشكل كامل :( , لكن حللت المسألة الأولى فقط لأن الفكرة إستهوتني :P

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#278

تم إرسال حل السؤال الأول + السؤال الثاني

هل من الممكن شرح عن السؤال الثاني لأنني لم أفهم ما هو المطلوب و شكرا ً

#279
اقتباس

انتباه انتباه

الليلة بإذن الله لغز جديد - 3 فروع كالعادة

أفضل ما في اللغز أنه لا يوقف الشعر

وأسوأ ما فيه أنه ينشف الريق laugh.gif

لا تخافوا - الجميع سيشارك بإذن الله

على الأقل في أول فرعين laugh.gif

فكونوا مستعدين

أيوه كده ياوديع,,,, أخيرا فهمتني يا وديع ,,, هههههههههههه (مزاحة طبعا)

إن شاء الله أشارك معكم هذه المره

#280

أعتقد أن السؤال الثالث كان كافي جدا :D

#281
جراند كتب:

انا حاولت احله لكن حسبت الـ مضروب و انا اعرف انك تشترط عدم حاسبته لكن للفائده فقط

انا واجهتني مشكله حيث انني وضعت الناتج ( المضروب في متغير ) اسمه fact

لكن اريد ان اساوي ( = ) المتغير fact بمصفوفه و لنفرض انها a

لا تتعب نفسك يا صديقي - أنت تسير في الطريق الخطأ

المتغير fact لن يستوعب مضروب الـ 100 مثلاً

فكر بطريقة أخرى أبسط دون حساب المضروب

البرمجة = الرياضيات

#282
aohammed كتب:

تم إرسال حل السؤال الأول + السؤال الثاني

هل من الممكن شرح عن السؤال الثاني لأنني لم أفهم ما هو المطلوب و شكرا ً

هل تقصد السؤال الثالث ؟

ببساطة كل طالب يريد التسجيل في 3 دورات ، يزود النظام بالدورات العشرة المطروحة مرتبة من الأهم إلى الأقل أهمية بالنسبة للطالب ، والنظام ( برنامجك ) يقوم باختيار 3 دورات من الـ 10 لكن بشكل عادل ، كل طالب يهمه أن يختار له النظام أول 3 دورات في القائمة ، لكن ليس ذلك السيناريو الذي سيحصل ، فرضاً جميع الطلاب يريدون التسجيل في الدورة رقم 6 كاختيار أول ، ولدينا كما تعلم 30 مقعداً فقط لتلك الدورة ، إذن هناك 70 طالباً لن يحصلوا على الاختيار الأول ، يأتي دورك هنا لإرضاء الجميع وجعل القسمة عادلة قدر الإمكان

فكر بالأمر بشكل منطقي ، لا أريد أن أوضح المزيد ، أخشى أن أظلم أناساً بإمكانهم حل اللغز دون مزيد من التوضيح ، أو أن أحل اللغز دون أن أدري :lol:

أية ملاحظات أو تساؤلات أرجو عرضها هنا وليس على الخاص .. أخشى أنني لن أتمكن من رؤية الخاص إلا بعد انتهاء المهلة ، بسبب الانشغال بالامتحانات ..

تم تعديل هذه المشاركة بواسطة namespace في 7 أغسطس 2010 في 12:31

البرمجة = الرياضيات

#283
هويدي كتب:

(مزاحة طبعا)

خذ راحتك :lol:

اقتباس
إن شاء الله أشارك معكم هذه المره

يسرني ذلك

اقتباس
أعتقد أن السؤال الثالث كان كافي جدا

نريد من الجميع المشاركة

يمكنكم حل فروع معينة وترك الباقي - أو إرسال الحلول بالتقسيط المريح ، دون فائدة طبعاً :lol:

البرمجة = الرياضيات

#284
اقتباس

هل تقصد السؤال الثالث ؟

ببساطة كل طالب يريد التسجيل في 3 دورات ، يزود النظام بالدورات العشرة المطروحة مرتبة من الأهم إلى الأقل أهمية بالنسبة للطالب ، والنظام ( برنامجك ) يقوم باختيار 3 دورات من الـ 10 لكن بشكل عادل ، كل طالب يهمه أن يختار له النظام أول 3 دورات في القائمة ، لكن ليس ذلك السيناريو الذي سيحصل ، فرضاً جميع الطلاب يريدون التسجيل في الدورة رقم 6 كاختيار أول ، ولدينا كما تعلم 30 مقعداً فقط لتلك الدورة ، إذن هناك 70 طالباً لن يحصلوا على الاختيار الأول ، يأتي دورك هنا لإرضاء الجميع وجعل القسمة عادلة قدر الإمكان

فكر بالأمر بشكل منطقي ، لا أريد أن أوضح المزيد ، أخشى أن أظلم أناساً بإمكانهم حل اللغز دون مزيد من التوضيح ، أو أن أحل اللغز دون أن أدري :lol:

أية ملاحظات أو تساؤلات أرجو عرضها هنا وليس على الخاص .. أخشى أنني لن أتمكن من رؤية الخاص إلا بعد انتهاء المهلة ، بسبب الانشغال بالامتحانات ..

شكرا ً لك أخي .. لكنني قصدت السؤال الثاني :( " لو أنك قرأت الخاص :P :P )

#285
aohammed كتب:

شكرا ً لك أخي .. لكنني قصدت السؤال الثاني :( " لو أنك قرأت الخاص :P :P )

اقتباس
لو حل 9 أشخاص الأسئلة الأربعة الأولى بشكل صحيح وحل الشخص العاشر السؤال السابع فقط بشكل صحيح فهو الفائز

أليس هذا كافياً ؟ أي أن عدد الأسئلة الصحيحة ليس ما يحدد الفائز ، بل إن إجابة المتسابق على سؤال أو أسئلة صعبة يزيد فرصته في الفوز ، فلو حل متسابق السؤال العاشر فقط بشكل صحيح ، وقام الباقي بحل أول 9 أسئلة بشكل صحيح ، فالذي حل السؤال العاشر هو الفائز ، وقس على ذلك ..

البرمجة = الرياضيات

#286

السلام عليكم

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

وأنا حظي ممتاز لأنه تأخيري جاء بهذا التوقيت ، أكيد الكل مسامحني - صح ؟

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

بالنسبة للجزء الثالث من اللغز ، أشكر الزميلين : هويدي ، وأبو دحيم على المحاولة ، لكن في الحقيقة ، ومع أني مررت بحلهما مرور الكرام ولم أدقق فيهما ، إلا أنني لم أجد فيهما روح الحل الصحيح

الفرع الثالث كان أصعب مما أتوقع ، وأنا أعتذر من الزملاء الكرام لأنني توقعت أن يكون أسهل من ذلك وإلا لم أكن لأضعه بين أسئلة اللغز ( طبعاً حللت اللغز بعدما وضعته وليس قبل ذلك )

اقتباس
أفضل ما في اللغز أنه لا يوقف الشعر

وأسوأ ما فيه أنه ينشف الريق

قلتها مازحاً ، لكنه فعلاً نشف ريقي مع أنني صائم وريقي ناشف بدون واسطة

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

نقول مبروك للزميل هويدي كونه أول من بادر بتسليم الأجزاء الثلاثة

جاري التحليل ، وسأعرض حلول الأخوة بإذن الله مع المناقشة بعد قليل

ومن ثم سأعرض الحل الصحيح للفرع الثالث من اللغز

لذا أطلب من الزميل هويدي تحضير لغز جديد وفريد ليعرضه علينا مساء غد إن أمكن

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

البرمجة = الرياضيات

#287

الفرع الأول :

ببساطة كأن المطلوب هو كم مرة سنجد ( 5 × 2 ) عند تحليل مضروب العدد إلى عوامله الأولية ، وبما أننا سنصادف 5 بعدد مرات أقل بكثير من 2 ، لذا يصبح العامل 5 هو critical number أو العامل المحدد والذي سنبحث في تردده لنجد كم صفراً على يمين مضروب ذلك العدد ...

نبدأ مع الزميل هويدي

كنت أتساءل في اللغز الثاني من أين أتى بإشارة المساواة

if ( _diff > max && _diff <= diff/2)

وأنه بإزالتها سيتحسن الحل ، الآن عرفت !

نحن الآن في أمس الحاجة إلى إشارة المساواة يا صديقي

//1.c

#include <stdio.h>
#include <math.h>

int factorial_trail_zeros(int);

int main(void)
{
        printf("%d\n", factorial_trail_zeros(1000));

        return 0;
}

/* The algorithm here: http://www.purplemath.com/modules/factzero.htm*/

int factorial_trail_zeros(int n)
{
        int e=1;
        int t, count=0;

        while( (t=pow(5, e++)) < n)
        {
                count += n/t;
        }
        return count;
}

بالتعديل على سطر واحد ليصبح :

    while( (t=pow(5, e++)) <= n)

وإلا ستكون لدينا مشكلة عند بعض مضاعفات الخمسة ( 5 ، 25 ، ... )

الرابط التالي كان الخوارزمية التي عمل عليها ، رابط جميل :

http://www.purplemath.com/modules/factzero.htm

= = = = = = = = = = = = = = = = = = = = = =

الزميل aohammed جاءنا بحل مختصر ، لكن ليته يعطينا نفس الدقة عند الأرقام الكبيرة :

#include<iostream>
using namespace std;

void main()
{
	int x;
	cin >> x;

	int zeros = x * 0.24;

	cout << zeros << endl;
}

بما أنه هناك 24 صفراً على يمين مضروب المئة

= = = = = = = = = = = = = = = = = = = = = =

الزميل HGB مشكوراً شاركنا هذه المرة في اللغز ، الحل سليم لولا أنه يعاني مما يعاني منه حل الزميل هويدي

#include <cmath>
#include <iostream>

using namespace std;

int num_of_fives(float number)
{
        int q=0;
        while(number >= 5 )
        {
                number = number/5;
                q++;
        }
        return q;
}


int main()
{
        int num = 5;
        int m5 = num_of_fives(num);
        int num_of_zeros = 0;

        for(int w=1;w<=m5;w++)
        {
                num_of_zeros +=  (num-(num%(int)pow(5.00,w)))/pow(5.00,w) ;

        }

        cout << "number of Zeros = " << num_of_zeros << endl;

        return 0;
}

تم إضافة إشارة المساواة في جملة while فقط لا غير

يبدو أن هناك ثأراً بين المشرفين وإشارة المساواة ، خير اللهم اجعله خير

= = = = = = = = = = = = = = = = = = = = = =

في حل الزميل أبو دحيم هناك شيء مريب ، حله صحيح بلا شك ، يقارب حل الزميل هويدي ، إلا أننا هنا نعلم كم مرة سننفذ الدوران بفضل اقتران اللوغاريتم ، وهذه ليست ميزة على حل الزميل هويدي ، فقط هنا دوران for وهناك while:

#include <iostream>
#include <math.h>

using namespace std;

int main ()
{
	double Number, Limit;

	int i, Zeros=0;

	cout << "Enter number : ";
	cin >> Number;

	Limit = log(Number)/log(5);

	for (i=1; i<=Limit; i++)
	{
		Zeros += Number/pow(5, i);
	}

	cout << Zeros << "  Zeros " << "\n";

	return 0;
}

الشيء المريب الذي لا أجد له تفسيراً هو أن الكود التالي :

	cout << log(25)/log(5) << " "
	     << int(log(25)/log(5))
   	     << endl;

ألا يفترض أن يطبع الكود 2 2 ، لماذا يطبع 1 2 ؟ لعل هذا ما جعل الكود لا يعمل بالشكل المطلوب عند 25 أو عند قوى 5 بشكل عام

= = = = = = = = = = = = = = = = = = = = = =

في حلي حاولت عدم استخدام مكتبة math وكان كالآتي :

#include <iostream>
using namespace std;

int main()
{
	int n, x, zeros = 0;

	cout << "Please insert the number to find the trailing zeros in its factorial : ";
	cin >> n;

	n = n / 5 * 5;

	for(int i=n; i>=5; i-=5)
	{
		x = i;

		while(x % 5 == 0)
		{
			x /= 5;
			zeros++;
		}
	}

	cout << "# of zeros : " << zeros << endl;

	return 0;
}

البرمجة = الرياضيات

#288

شكرا حمزه... و نحن نعزرك -إن شاء الله- على التأخير

أنا ربما أضع لغز خفيف يتكون من ثلاث لأربع أجزاء أيضا... أقوم هذه الأيام بحله......

#289

سلام الله عليكم

نتابع مناقشة الأسئلة ( أكرر اعتذاري عن الانقطاع المتكرر - مشغول جداً هذه الفترة )

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

" توليد الأرقام العشوائية - من البداية وحتى الاحتراف "

/index.php?showtopic=226812&st=0#entry1124423

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

الفرع الثاني :

تخيلوا لو كان السؤال بالصيغة التالية :

اشترك 10 متسابقين في مسابقة من 10 أسئلة ؛

السؤال الأول بـ 1 نقطة

السؤال الثاني بـ 2 نقطة

السؤال الثالث بـ 4 نقطة

السؤال الرابع بـ 8 نقطة

السؤال الخامس بـ 16 نقطة

السؤال السادس بـ 32 نقطة

السؤال السابع بـ 64 نقطة

السؤال الثامن بـ 128 نقطة

السؤال التاسع بـ 256 نقطة

السؤال الأخير بـ 512 نقطة

بناءاً على هذه الصيغة من السؤال ، لو حل طالب أول 3 أسئلة سيكون لديه 1 + 2 + 4 = 7 نقاط

في حين لو حل طالب السؤال الرابع فقط سيكون لديه 8 نقاط

أليس السؤال تطبيقاً مباشراً على التحويل من Binary إلى Decimal ؟

على هذا الأساس كانت محاولة الزميلين هويدي وأبو دحيم

نبدأ بحل الزميل هويدي :

// 2.c

// multi-winner approch
// compiled using GCC

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

#define NO_OF_PERSONS 10

struct person{
        double score;
        bool questions[10];
};

void init(struct person[]);
void get_winner_list(struct person[], int[]);

int main(void)
{
        struct person persons[NO_OF_PERSONS];
        init(persons);


        int i, j;
        for (i=0; i<NO_OF_PERSONS; i++)
        {
                for (j=0; j<10; j++)
                {
                        if (persons.questions[j])
                                persons.score += pow(2, j);
                }
        }

        int winner_list[NO_OF_PERSONS] = {0};
        get_winner_list(persons, winner_list);

        for (i=0; i<NO_OF_PERSONS; i++)
                if (winner_list)
                        printf("person at index %i is winner\n", i);            // zero-based index

        return 0;
}

void init(struct person persons[])
{
        persons[0] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[1] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[2] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[3] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[4] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[5] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[6] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[7] = (struct person){0, {true, true, true, true, false, false, false, false, false, false}};
        persons[8] = (struct person){0, {false, false, false, false, true, false, false, false, false, false}};
        persons[9] = (struct person){0, {false, false, false, false, true, false, false, false, false, false}};
}

void get_winner_list(struct person persons[], int winner_list[])
{
        double max_score = 0;
        int i,length=0, winner=-1;

        for (i=0; i<NO_OF_PERSONS; i++)
                if (persons.score > max_score)
                        max_score = persons.score;

        // get winner list
        for (i=0; i<NO_OF_PERSONS; i++)
                if (persons.score == max_score)
                        winner_list = 1;
}

الحل صحيح مشكوراً ، لكن بالرجوع إلى موضوع الأعداد العشوائية ، سيكون الاقتران init مختصراً أكثر باستخدام دوران متداخل نعطي القيم وبشكل عشوائي

وليته لم يستخدم المكتبة math ، لأننا في غنىً عن ذلك ..

= = = = = = = = = = = = = = = = = = = = = = = = =

نأتي إلى حل الزميل أبو دحيم :

#include <iostream>
#include <math.h>

using namespace std;

struct x
{
	int no;
    int deg;

    x ()
	{
		deg = 0;
	}

};

int main ()
{
	x result[10];

	int results[10][10]={0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,1,
			0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,
			0,1,0,1,0,1,0,1,0,0,
			0,0,0,0,0,0,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,
			1,1,1,0,0,0,0,0,0,0,
			1,1,1,1,0,0,0,0,0,0,
			1,1,1,1,1,0,0,0,0,0,};
	int i,j,k;

	for (i=0;i<10;i++)
	{
		result.no=i+1;

		for (j=0;j<10;j++)
			result.deg += results[j]*pow(2,j);
	}

	for (i=0;i<10;i++)
		for (j=0;j<10;j++)
		{
			if (result.deg > result[j].deg)
			{
				k=result.deg;
				result.deg = result[j].deg;
				result[j].deg = k;
				k=result.no;
				result.no = result[j].no;
				result[j].no = k;
			}
		}

	for (i=0;i<10;i++)
		cout << "  " << result.no << "   \n";

	return 0;
}

حله صحيح بالطبع ، أكرر نفس الملاحظات السابقة ..

= = = = = = = = = = = = = = = = = = = = = = = = =

محاولتي :

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

const int Q = 10; // # of Quqstions
const int P = 10; // # of Participants

int main()
{
	srand(time(0));

	bool ans[Q][P];

	int marks[P] = {0};

	for(int i=0; i<P; i++)
		for(int k=Q-1; k>=0; k--)
		{
			ans[k] = (rand()%2 == 1);

			marks = marks*2 + (ans[k] ? 1 : 0);
		}

	int max = marks[0];

	for(i=1; i<P; i++)
		if(marks > max)
			max = marks;

	cout << "Participant(s) in the first place : ";

	for(i=0; i<P; i++)
		if(marks == max)
			cout << i << " ";

	cout<<"\n\nCheck :\n\n";

	for( i=0; i<P; i++,cout<<endl)
		for( int k=0; k<Q; k++)
			cout << ans[k] << " ";

	cout << endl;

	return 0;
}

تم تعديل هذه المشاركة بواسطة namespace في 16 أغسطس 2010 في 01:35

البرمجة = الرياضيات

#290

بص ياحمزه, أنا بقالي ساعة مستنيك تخلص عشان أحط السؤال بتاعى :D

أنا هروح أنام, وبقا أحطه بعدين :P

ههههههه

#291
هويدي كتب:

بص ياحمزه, أنا بقالي ساعة مستنيك تخلص عشان أحط السؤال بتاعى :D

أنا هروح أنام, وبقا أحطه بعدين :P

ههههههه

باقي الفرع الأخير بس

ما رأيك بكرة العصر تطرح لغزك

أنا مفتكر أنك لسة ما جهزت الأسئلة

خلص أنت روح نام وتغطى كويس

وأنا إن شاء الله رح أكمل عرض الجزء الأخير الليلة دي

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

البرمجة = الرياضيات

#292

الفرع الثالث

وما أدراك ما الفرع الثالث ؟ أعاد إلى ذهني الفرع الثاني من اللغز الثاني ( تقسيم الطلبة إلى قسمين متكافئين في مسابقة ) هذه الأفكار وغيرها تأتيني من واقع الحياة ومن مشكلات يشعر الإنسان حيالها بالظلم في بعض الأحيان ...

أيام الطفولة ( أقصد عندما كنت في الصف العاشر أ ) كان الطلاب موزعين على 4 شعب ، شعبتي أ كان أقل معدل طالب فيها يقارب الـ 90 ، أما باقي الشعب ( خليني ساكت أحسن ) وهذا بالطبع ليس عدلاً ، من هنا كان اللغز .

هنا ؛ اللغز السابع ؛ أتت فكرة الفرع الثالث من الظلم الشديد الذي يتعرض له الطلاب يوم تسجيل المواد الدراسية ، البعض يسجل في أفضل الشعب وعند أفضل المدرسين وفي الأوقات التي يريدونها .

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

ناهيك عن الضغط الهائل على نظام التسجيل ، تتوالى تنبيهات NO RESPONSE من النظام ، تتوالى معها رشقات F5 من الطلاب المساكين ، القلوب إلى الحناجر ..

وأخييييييييييراً استجاب النظام ، وأصدر تنبيهاً عظيماً " الشعبة مغلقة " يا سلام على هكذا نظام تسجيل ...

= = = = = = = = = = = = = = = = = = = = = = = =

حل الفرع الثالث

لحل الفرع الثالث تم اعتماد التسلسل التالي :

في البداية أنشئ مصفوفة باختيارات الطلاب ، ستكون اختيارات الطلاب عشوائية ..

	// initializing the array with each row has the values : 0 -> 9
	for(a1=0; a1<stdnum; a1++)
	{
		for(a2=0; a2<coursenum; a2++)
		{
			selections[a1][a2] = a2;
		}
	}

	// rearrange the rows to have the same values but sorted randomly
	for(a1=0; a1<stdnum; a1++)
	{
		for(int c=coursenum; c>0; c--)
		{
			swap(&selections[a1][c-1], &selections[a1][rand()%c]);
		}
	}

تذكر التعريفات التالية في بداية الكود لكي تكون الأمور واضحة :

const int stdnum = 100;
const int coursenum = 10;
const int needed = 3;
const int seats = 30;

void swap(int *a, int *b);

int min(int a, int b);

void process(int i);

bool still(int i);


int selections[stdnum][coursenum] = {0}; // selections of the students to be processed.

int priority[stdnum] = {0}; // the higher the priority, the more the chance that the student has.
				// maximum = coursenum - 1

int counter[stdnum] = {0}; // how many cources have the system registered for each student.
			 // maximum = needed

int enrolled[coursenum] = {0}; // contains how many students are currentry
				  // enrolled in each course.

int registered[stdnum][needed]; // the courses that have been registered for each student

أعطِ القيم الابتدائية ثم أعد الترتيب ، هذا مر معك في موضوع الأعداد العشوائية سابق الذكر لكن هنا 2D array فقط لا غير.

الآن سيقوم النظام بتسجيل 3 مواد لكل طالب ، لذا فنحن بحاجة إلى دوران خارجي 3 دورات .

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

	// since we have (needed) courses to be registered for each student
	for(int i=1; i<=needed; i++)
	{
		do
		{
			process(i);
		}
		while(still(i)); // while there are students still not enrolled in course # i
	}

داخل اقتران process ؛

لكل طالب هناك أولوية priority ، من خلالها يتم التحديد أي الطلاب سيتم البدء بالنظر في طلبهم أولاً ..

فرضاً تقدم 50 طالباً إلى الدورة رقم 6 كاختيار أول ، هناك 20 طالباً لن يتم تلبية رغبتهم كون عدد المقاعد 30 فقط ، لذا سيتم النظر في طلبهم الثاني وتلبيته إن أمكن ، وإلا فالثالث فالرابع ...

كلما وجدنا شعبة مملوءة بالطلاب وانتقلنا بالاختيار إلى الذي يليه ، ترتفع الأولوية لأولئك الطلاب ، أي أنه لن يتم النظر في طلبات الطلاب الـ 30 الذين حصلوا على اختيارهم الأول إلا بعد تلبية رغبة الطلاب الذين لم يحالفهم الحظ في المرة السابقة ( مرة لك ومرة عليك )

تبدأ أولوية الطلاب جميعاً من الصفر ثم ترتفع تدريجياً . الدوران الخارجي في اقتران process هو للمرور على الأولويات من أعلاها إلى أدناها ، ثم يتم المرور على طلبات جميع الطلاب بتلك الأولوية .

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

لتقييم عمل النظام ، قمت بعمل اقتران test دوره هو مقارنة طلبات الطلاب بالذي حصلوا عليه من ذلك النظام ؛

مثلاً طالب حصل على أول 3 اختيارات له ، ترتيب تلك الاختيارات 0 1 2 ومجموعها 3 ، لاحظ أنه كلما قل المجموع كان أفضل ، وفي أسوأ الأحوال سيحصل على آخر 3 اختيارات ، ترتيبها 7 8 9 ومجموعها 24 ، لذا نسبة التطابق في البداية ستكون 100% وأخيراً 0% ، كأن هناك تناسباً عكسياً خطياً في الموضوع ..

المعادلة التي سترونها في اقتران test أتت من معادلة الخط المستقيم التالي :

55ymp.jpg

حينها ؛ التالي سيكون الناتج :

# of students   percentage of match

81              100 %
12              96 %
1               91 %
4               86 %
2               67 %
Press any key to continue

هذا معناه أن 81 طالباً حصلوا على أول 3 اختيارات لديهم ، أي نسبة تطابق 100%

12 طالباً فقدوا اختياراً من الثلاثة ، تم الاستعاضة عنه بالرابع ، لذا كانت النسبة 96% ، وهي ليست سيئة

- - - - - - - - - - - - - - - -

سيناريو آخر :

# of students   percentage of match

79              100 %
14              96 %
3               91 %
2               86 %
2               81 %
Press any key to continue

النسبة تتركز دائماً عند 100% و 96% ، لذا فالنظام يعطي نتائج مرضية ...

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

تم تعديل هذه المشاركة بواسطة namespace في 16 أغسطس 2010 في 10:19

البرمجة = الرياضيات

#293

تفضلوا الكود كاملاً ، ونسخة في المرفقات أيضاً

#include<iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

const int stdnum = 100;
const int coursenum = 10;
const int needed = 3;
const int seats = 30;

void swap(int *a, int *b);

int min(int a, int b);

void process(int i);

bool still(int i);

void test();


int selections[stdnum][coursenum] = {0}; // selections of the students to be processed.

int priority[stdnum] = {0}; // the higher the priority, the more the chance that the student has.

int counter[stdnum] = {0}; // how many cources have the system registered for each student.

int enrolled[coursenum] = {0}; // contains how many students are currentry enrolled in each course.

int registered[stdnum][needed]; // the courses that have been registered for each student

int
main()
{
	srand(time(0));

	int a1, a2;

	// initializing the array with each row has the values : 0 -> 9
	for(a1=0; a1<stdnum; a1++)
	{
		for(a2=0; a2<coursenum; a2++)
		{
			selections[a1][a2] = a2;
		}
	}

	// rearrange the rows to have the same values but sorted randomly
	for(a1=0; a1<stdnum; a1++)
	{
		for(int c=coursenum; c>0; c--)
		{
			swap(&selections[a1][c-1], &selections[a1][rand()%c]);
		}
	}

	// since we have (needed) courses to be registered for each student
	for(int i=1; i<=needed; i++)
	{
		do
		{
			process(i);
		}
		while(still(i)); // while there are students still not enrolled in course # i
	}

	test();

	return 0;
}


void
swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

bool
still(int i)
{
	for(int k=0; k<stdnum; k++)
	{
		if(counter[k] != i)
			return true;
	}

	return false;
}

int
min(int a, int b)
{
	return (a < b ? a : b);
}

void
process(int i)
{
	int n; // number of requests of a certain course

	int c[coursenum];

	// prepare c to contain courses numbers randomly
	for(int x=0; x<coursenum; x++)
	{
		c[x] = x;
	}

	for(x=coursenum; x>0; x--)
	{
		swap(c[x-1], c[rand()%x]);
	}

	int j, k, h, v, d; // needed in loops

	// passes through priorities from high to low
	for(j=coursenum-1; j>=0; j--)
	{
		// passes through all cources of that priority randomly
		for(k=0; k<coursenum; k++)
		{
			// all requests of a certain cource will be put in this array
			int request[stdnum] = {0};

			n = 0;

			// pass through all students of that priority and want that course
			for(h=0; h<stdnum; h++)
			{
				if(priority[h] == j && selections[h][j] == c[k] && counter[h] == i-1)
				{
					request[n++] = h;
				}
			}

			if(n == 0) continue;

			int empty = seats - enrolled[c[k]];

			// check if the number of empty seats is not enough
			if(n > empty)
			{
				// rearrange students randomly
				for(v=n; v>0; v--)
				{
					swap(&request[v-1], &request[rand()%v]);
				}

				// increase the priority for those who will not be enrolled
				for(d=empty; d<n; d++)
				{
					priority[request[d]]++;

					if(priority[request[d]] == 10)
						priority[request[d]] = 0;
				}
			}

			for(d=0; d<min(n, empty); d++)
			{
				registered[request[d]][i-1] = c[k];

				priority[request[d]]++;

				if(priority[request[d]] == 10)
					priority[request[d]] = 0;

				counter[request[d]]++;

				enrolled[c[k]]++;
			}

			if(n > empty) return;
			// because the priority of some students was modified
		}
	}
}

void test()
{
	int sum = 0;

	int a=0, b=0;

	for(int c=needed-1, d=coursenum-1; c>=0; c--, d--)
	{
		a += c;
		b += d;
	}

	int size = b - a + 1;

	int *p = new int[size];

	for(int k=0; k<size; k++)
		p[k] = 0;

	for(int g=0; g<stdnum; g++)
	{
		sum = 0;

		for(int r=0; r<needed; r++)
		{
			for(int z=0; z<coursenum; z++)
			{
				if(registered[g][r] == selections[g][z])
					sum += z;
			}
		}

		p[sum-a]++;
	}

	cout<< "# of students\tpercentage of match\n\n";

	for(int i=a; i<=b; i++)
	{
		if(p[i-a] != 0)
		cout << p[i-a] << "\t\t" << 100 - 100*(i - a) / (size-1) << " %" << endl;
	}
}

أتمنى أن أكون وفقت في إيصال الفكرة وتوضيحها

انتهى دوري الآن - ينتقل التحكم إلى الأخ هويدي

فإلى هناك

7th Puzzle.rar

تم تعديل هذه المشاركة بواسطة namespace في 16 أغسطس 2010 في 04:12

1

البرمجة = الرياضيات

#294

بسم الله الرحمن الرحيم...

أولا بحب أشكر الأخ حمزه على مجهوداته الأكثر من رائعه, و عاوز أقوله شكرا يا أبا حمزه, جزاك الله خيرا...

و معلش أعذرني على إستعجالى, لأن اللغز اليوم عندي, غدا لن يصبح عندي (حقيقة, فلدي ظروف ما الأيام القادمه)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

نأتي للمهم..

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

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

المسأله هى, نريد أن ننشأ بعض الدوال التي تكمل / تتراكب مع الدوال الموجوده في string.h ... و هي فكره رائعه بصراحه,, تصور مثلا أنك تريد بناء نظام تشغيل, فجزء مهم من بناء نظام التشغيل هي توفير ال c standard lib على نظامك الجديد....

نريد بناء هذه الدوال (طبعا ممنوع إستخدام أي داله من دوال ال c std lib string.h):


// string2.h

#ifndef STRING_2_H
#define STRING_2_H

int str_len(const char str[]);
void substring(const char source[], int index, int count, char dest[]);
int find_string(const char src[], const char target[]);
void remove_string(char src[], int index, int count);
void insert_string(char src[], const char target[], int index);
int replace_string(char src[], const char s1[], const char s2[]);

#endif

الدالة الأولي دقوم بإعادة طول السلسة النصيه (بدون الحرف الناهي '\0' )

مثال:


str_len(str); // will be 3
char str[]  = "ABC";

أما الثانيه: تقوم بإرجاع في السلسة النصيه dest من السلسله النصيه source من index و بطول count


char dest[4];

substring(src, 3, 3, dest);
printf("%s\n", dest); // will print EDF
char src[] = "ABCEDFG";

الثالثه: البحث عى target داخل src و إعادة ال Index الذي يشير على أول حرف ل target داخل src


char target[] = "Hello";
find_string(src, target); // will return 4
char src[] = "HellHelloWorld";

الرابعه: تقوم بالحذف من src بداية من index و بطول count



remove_string(src, 4, 5);
printf("%s\n", src); // will print: This String
char src[] = "This Is A String";

الخامسه: تقوم بإدراج target داخل src بداية من index


char target[] = "Long ";

insert_string(src, target, 10);
printf("%s\n", src); // will print: This Is A Long String
char src[] = "This Is A String";

السادسه: تقوم بتبديل s1 ل s2 داخل src ... لاحظ أنه هذه الداله ستقوم ببساطه بإستخدام الدوال السابقه لها, لذا إكتبها أخر واحده..

و سترجع 0 في حالة الفشل, 1 غير ذلك


while(replace_string(str, " ", ""));
printf("%s\n", str); // will be ABCDEFGHIJKL
ahar str[50] = "ABC DEF GHI JKL";

هذا هو كل شئ....

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

ميعاد التسليم إن شاء الله بعد 5 أيام, أي يوم الجمعه.....

شكرا لكم

@ حمزه.... حلو موضوع أنك تأتي بالأفكار من واقع الحياه... جميل جدا أن تطلع علينا عقدك (هههههههه, أمزح)

حقا,, شئ جميل أنك تحاول أن تنظم ما تجده غير منظم من حوله....

ورينا همتك بقه يا بطل إنت و الأخوه في اللغز ده,,, سهل و مباشر, خلى الشعب يعيش :D

1
#295

المعامل dest فى حالة الداله substring لابد و أن يكون من نوع char** أو أن يقوم المستخدم بحجز المساحه الخاصه به و إلا كيف سأقوم بإرجاع قيمه من خلاله؟ (طبعا لم اذكر فى حالة ان المستخدم ادخل المعامل dest و حدد له مساحه خاطئه)

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

char* substring(const char* source, int index);

******************************

ايضا بالنسبه للمعامل src الموجود بالدوال remove_string, insert_string, replace_string بالتأكيد تم حجز مساحته داخل الـ heap، أليس كذلك ؟

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 16 أغسطس 2010 في 18:44

1

مدونتي: C++ Tips and Tricks

#296

محمد, ممكن تستخدم مصفوفات فقط في هذا التمرين؟ وألا تستخدم pointers خالص؟ فضلا لا فرضا طبعا :D

بالنسبة لموضع ال Heap , فكما قلت لك, كل الشغل عباره عن مصفوفات.. :D.. و على المستخدم تحديد حجم المصفوفه (كما بالمثال الخاص ب substring بالأعلى) :D

#297

إيه يا شباب, لم ينجح أحد ولا إيه؟؟

موش شايف حد سلمني حاجه إلى الأن؟!

#298

أنت قلت

اقتباس
ألا تستخدم pointers خالص؟

و بالتالي العديد سينفر لأن المؤشرات كانت ستحل العديد من المشاكل (انا كنت خلصت كل الدوال من أول يوم ماعدا replace و لما انت طلبت بدون مؤشرات تركت العمل الخاص بهم :blush: ).

مدونتي: C++ Tips and Tricks

#299

لا لا خالص,, أنا أقصد للتسهيل على المتسابقين....

ياريت في replace أن تستخدم باقي الدوال... يعني إستخدم find ثم remove ثم insert ....

#300

تم إرسال الحل

مدونتي: C++ Tips and Tricks

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

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

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

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

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

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