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

سؤال بخصوص برمجة برنامج احتمالا بالجافا

بدأه Dev:MOH-TAHA في 23 أغسطس 2010 · 13 رد · 2,211 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

فكرة البرنامج :

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

بحيث سيعرض البرنامج عند بدء تشغيله المجموعات التي يسمح اسخدامها

مثلا :

(a-z)

(A-Z)

(0-9)

ثم سيقوم المستخدم بتحديد المجموعات التي يريد اشراكها في العملية

وتحديد طول النص الذي يريده

مثلا في حال اختار (a-z)

و ايضا (0-9)

وطول الكلمة هو 2

اذن يجب ان يكون الناتج :

aa

ab

ac

ad.....

a0

a1

a2.....

0a

1a

2a......

bb

ba

bc

الى اخره

بحيث يقوم بايجاد جميع الاحتمالات التي يمكن ان تتكون من حرفين من المجموعتين (a-z) و (0-9) وبحيث ان الترتيب مهم (يعني a1 لا تكفئ عن 1a )

أنا اعلم اني اتحدث عن مليارات الاحتمالات وربما اكثر

حقيقة لا توجد لدي فكرة واضحة عن كيفية برمجة مثل هذا البرنامج وهل يوجد مكتبات جاهزة تدعم هذه الاشياء في الجافا ام لا

لذى يرجى المساعدة ودمتم بود

Linux for human beings

#2

اخي الكريم

اولا يجب عليك معرفة المعادلات التي تريد استخدامها

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

وَعَبْدٌ قَدْ يَنامُ عَلَى حَرِيرٍ ××× وَذُو نَسَبٍ مَفَارِشُهُ التُّرَابُ

#3

انهيت الحل

لكن نرجو منك وضع تجاربك هنا

لتعم المناقشات

#4
EMNALI كتب:

اخي الكريم

اولا يجب عليك معرفة المعادلات التي تريد استخدامها

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

هذا ما أسال عنه اسال عن المعادلات التي يجب ان استخدمها او الخوارزمية

شكرا لك

محمد عرسان كتب:

انهيت الحل

لكن نرجو منك وضع تجاربك هنا

لتعم المناقشات

اخي الفاضل محمد

لم اقم باي محاولة لكتابة كود برمجي ولن اقوم بذلك ما لم افهم الخوارزمية التي يجب ان اتبعها ،،

استطيع بناء الواجهة بسهولة واستطيع برمجة الخوارزمية كذلك لكن تنقصني الفكرة الواضحة

لكن لنقل ما فكرت فيه ،،

فكرت أن اضع كل مجموعة من الرموز في array

ثم اقوم حسب عدد الحروف التي تكون الكلمة بعمل loops و بين المجموعة ونفسها اولا ثم المجموعة والمجموعات الثانية ثم اقوم بعملة swap بين المجموعة والاخرى لكي احافظ على مبدأ الترتيب

لكن لم ترق لي الفكرة لذى فضلت السؤال عن خوارزمية وآلية عمل واضحة

وشكرا لك

Linux for human beings

#5

في كل الأحوال حتى لو لم تحل

ماهي الطريقة التي فكرت فيها؟

اكتب الخوارزمية التي فكرت فيها ولنرى ما يعيبها

إن لم يكن هناك خوارزمية كاملة اكتب أنصاف الخوارزميات

أو حتى ما فكرت فيه

بالمناسبة أعتقد أن القسم المناسب لهذا الموضوع هو قسم الخوارزميات

هل تحب أن أنقل الموضوع هناك؟

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 24 أغسطس 2010 في 04:15

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

نعم لا مانع لدي من نقل الموضوع

سأقوم الليلة ان شاء الله بكتابة ما فكرت فيه لانني ساتحتاج الى رسم بعض الامور

Linux for human beings

#7

عزيزي محمد..

أعتقد أن من الحلول الممكنة لبرنامجك هو استخدام الـ tree

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

فمثلاً: لو كان لدي فقط 3 أحرف و هي 1 و 2 و 3.. و كان الطول المطلوب هو 2..

إذا..

 
start ---------- 1 ---------- 1
             |          |---- 2
             |          |---- 3
             |
             |-- 2 ---------- 1
             |          |---- 2
             |          |---- 3
             |
             |-- 3 ---------- 1
                        |---- 2
                        |---- 3

و بالمرور على كل الفروع بالشجرة نحصل على كل الاحتمالات المطلوبة

و لو كان طول الكلمة هو 3 .. فسيكون هناك 3 فروع من كل نهاية.. و هكذا

أتمنى أن يكون ذلك مفيدا..

و دمتم و دام الود بكم

Techno

#8

السلام عليكم

قمت بعمل كلاس صغير لتوضيح فكرتي

المجموعة المدخلة هنا او ال character set هي 1,2,3

وطول الكلمة يتراوح بين 1 و2 و3

عندما يكون طول الكلمة 1 كل شي يظهر بشكل ممتاز

وعندما يكون 2 كذلك

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

وطلبي هو خوارزمية واضحة اسيتطيع ان اتعامل معها فانا لا اعلم طول الكلمة كم من المحتمل ان يكون من المحتمل ان يكون 20 مثلا فهل سأضطر الى وضع 20 loop واستخراج المقاطع المطلوبة من ال string

ادعكم من الكود وانتظر آرائكم



*
*/

package net;

/**
* @author mohammed
*
*/
public class Prob {



public static void main (String args []){

int set[] = {1,2,3}; /// the set of characters.
StringBuilder str= new StringBuilder(); /// just for printing purpose
int str_length=2; /// the length of the string
for(int i=0;i<set.length;i++){
str.append(set);

for(int j=0;j<set.length;j++){
if(str_length==1){
System.out.println(str.toString());
str.delete(0, str.length());
break;}
str.append(set[j]);
for(int k=0;k<set.length;k++){
if(str_length==2){
System.out.println(str.substring(str.length()-2).toString());
str.deleteCharAt(str.length()-1);
break;}
str.append(set[k]);
System.out.println(str.substring(str.length()-3).toString());
str.delete(str.length()-1,str.length());


}

}

}





}

}
/**

Techno_Fantasy كتب:

عزيزي محمد..

أعتقد أن من الحلول الممكنة لبرنامجك هو استخدام الـ tree

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

فمثلاً: لو كان لدي فقط 3 أحرف و هي 1 و 2 و 3.. و كان الطول المطلوب هو 2..

إذا..

 
start ---------- 1 ---------- 1
         	|          |---- 2
         	|          |---- 3
         	|
         	|-- 2 ---------- 1
         	|          |---- 2
         	|          |---- 3
         	|
         	|-- 3 ---------- 1
                        |---- 2
                        |---- 3

و بالمرور على كل الفروع بالشجرة نحصل على كل الاحتمالات المطلوبة

و لو كان طول الكلمة هو 3 .. فسيكون هناك 3 فروع من كل نهاية.. و هكذا

أتمنى أن يكون ذلك مفيدا..

و دمتم و دام الود بكم

Techno

شكرا لك عزيزي Techno_Fantasy على الاهتمام

اعلم ان هذا هو احد الحلول وقد قمت بتطبيقه في البرنامج السابق وان لم اكن قد استخدمت ال tree بشكل واضح

لكن كما اسلفت مسبقا انا لا اعلم طول ال string و هناك بعض المشاكل في اسختراج النص من ال string

شكرا لاهتمامك :)

Linux for human beings

#9

ما رأيك لو اتبعت طريقة الـ recursion ؟

أي بدلا من أن نقوم بعمل 20 loop كل ما عليك هو أن تنادي الدالة نفسها حتى تصل إلى العمق (طول الكلمة) المطلوب..

ثم تتراجع..

مثلا .. في كل مرة تنادي الدالة ترسل لها الجملة اللتي وصلت إليها حتى الان.. و الطول الأقصى..

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

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

و إذا أردنا كتابة خوارزم يصف الطريقة..

void function printAllWords( string current, array alpha, int maxLen)
   if ( strlen(current) == maxLen-1 ) then
      foreach cin alpha
          print current+c  # + mean concatenate
   else 
      foreach c in alpha
          printAllWords( current+c, alpha, maxLen)

و دعنا نقوم بعمل تجربة "نظرية" لعمل الخوارزم عندما يكون لديك الحروف المتوفرة هي 1 و 2 و 3 .. و طول الكلمة المطلوب هو 2

printAllWords( "" , [1,2,3] , 2 )

maxLen = 2 	current = ""	alpha=123
	c = 1 
	printAllWords( "1" , [1,2,3] , 2 )
	maxLen = 2	current = "1"	alpha=123
		print 11
		print 12
		print 13

	c = 2
	printAllWords( "2" , [1,2,3] , 2 )
	maxLen = 2	current = "2"	alpha=123
		print 21
		print 22
		print 23

	c = 3
	printAllWords( "3" , [1,2,3] , 2 )
	maxLen = 2	current = "3"	alpha=123
		print 31
		print 32
		print 33

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

و دمت و دام الود بكم

Techno

#10

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

شكرا لك مرة اخرى :)

Linux for human beings

#11

حقيقة لم افهم ما تقصد بشكل جيد ولم اجد به تتابع منطقي

فان كان هناك امكانية للتوضيح يكون الموضوع افضل

وشكرا لكم جميعا

Linux for human beings

#12

عزيزي دعنا في البداية نمر على مبدأ الـrecursive function و هي عبارة عن دالة تحتوي ضمن تعلمياتها call لنفسها و هذا موجود و بكثرة في المعادلات مثلا عندما نقول:

مضروب(4) = 4 * 3 * 2 * 1

علما أن مضروب(3) = 3 * 2 * 1

إذن: مضروب(4) = 4 * مضروب(3)

و بشكل عام: مضروب(س) = س * مضروب(س-1)

فلو أردنا أن نقوم ببرمجة معادلة المضروب الأخيرة فإننا سنحصل على الخوارزمة التالية:

int function factorial (int x) 
   return x * factorial(x-1)

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

مشكلة أليس كذلك؟

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

و في حالتنا نعلم أنه لا مضروب للأعداد السالبة.. إذا آخر مضروب هو 0 .. و مضروب(0) = 1

إذا دعنا نعدل الخوارزمة لتصبح:

unsigned_int function factorial (unsigned_int x) 
   if ( x == 0 ) 
      return 1
   else
      return x * factorial(x-1)

و تتبع عمل هذا النوع من البرامج هو ليس سهلا فلنقم بذلك خطوة خطوة.. و لنفرض أن x تساوي 4 كما في مثالنا سابقا

a = factorial(4)

   x = 4
   ( 4 == 0 )	false, go to else
   return 4 * factroial(3) 	% we have to compute factorial(3) first

		x = 3
		( 3 == 0 ) 	false, go to else
		return 3 * factorial(2)   % we have to compute factorial(2) first

				x = 2
				(2 == 0)	false, got to else
				return 2 * factrial(1)  % we have to compute factorial(1) first

						x = 1
						(1 == 0) 	false, got to else
						return 1 * factorial(0)  % we have to compute factorial(0) first

								x = 0
								( 0 == 0 ) 	true, go to next instruction
								return 1

						return 1 * 1	% replaced factroial(0) by its returned value which is 1

				return 2 * 1  % replaced factorial(1) by its returned value which is 1*1 = 1

		return 3 * 2  % replaced factorial(2) by its returned value which is 2*1 = 1

   return 4 * 6  % replaced factorial(3) by its returned value which is 3*2 = 6

a = 24  % replaced factorial(4) by its returned value which is 4 * 6 = 24

و من ذلك عزيزي.. سنلاحظ أنه لعمل أي دالة بحيث تكون recusrive function هناك شرطين أساسين

1- أن تكون هناك حالة نداء لنفس الدالة اللتي نحن بداخلها

2- أن يكون هناك شرط أو حالة لا تنادي فيها الدالة نفسها .. و خي عادة تمثل الحالة الأخيرة التي نتوقف عندها

أرجو أن تكون بذلك اتضحت الفكرة العامة..

لنعد إلى برنامجك..

أنت تريد طباعة كل الكلمات الناتجة عن مجموعة من الأحرف بطول محدد.. إذن:

المعطيات هي : طول الكلمة .. و الأحرف المستخدمة

المخرجات : طباعة الكلمات

دعنا نعرض مرة أخرى الخوارزمة اللتي كتبتها سلفا:

void function printAllWords( string current, array alphabet, int maxLength)
   if ( strlen(current) == maxLength-1 ) then
      foreach character in alphabet
          print current+character   # + mean concatenate
   else 
      foreach character in alphabet
          printAllWords( current+character, alphabet, maxLength )

ما قمت به هنا هو إرسال الجملة اللتي وصلت إليها حتى الآن لتتم طباعتها ملحقة بالأحرف الأخيرة..

و شرط التوقف هنا هو أن تصل الجملة المراد طباعتها إلى الطول المطلوب

طبعا هناك طرق عديدة لاستخدام الـrecusrsion لحل مشكلتك.. و لكن هذه إحداها

أرجو أن يكون الشرح وافيا .. أعلم أنني لست كاتبا جيدا .. و لكن ان توارد إلى ذهنك أي سؤال ما عليك إلا السؤال.. و أنا حاضر

دمت بود

#13

الإستدعاء التكراري جميل , لكن ماذا عن التبسيط ؟ وماذا لو أردنا إحتمال معين بعيد فقط , يعني نريد الإحتمال رقم 921 في هذه الإحتمالات ؟ سنحتاج أن نمر عليهم جميعا ..

خذ الكود يعطيك كل الإحتمالات ل n عنصر في k خانة تختارها أنت مثلا ...

القضية ومافيها معادلات باقي القسمة من جديد :wink: فهذه هي المعادلة التي ستعطيك المقابل للإحتمالات كلها , وتستطيع أن توجد الإحتمال رقم w فورا , يعني مثلا أريد الإحتمال رقم 921 للأرقام 1,2,3,4,5,6,7 لكن بتبديلهم في 10 خانات " أعرف سؤالك تريدهم لأن يكونو في 7 خانات أيضا بعددهم , فقط غير PLACES لتصبح = 7 في الكود " فستحصل على الإحتمال مباشرة , وسيكون في هذه الحالة :

5653111111

المعادلة الرئيسية :

POW=pow((float)char_num,w);
                                cout<<STRING[((q-(q%POW))/POW)%char_num];

إن إستطعت أن تفهم ماتقوم به المعادلة ستسهل عليك أمور كثيرة جدا ... فكر في ترتيب الأرقام العادية 1 2 3 4 5 6 .. الخ وكيف تلتف لتصبح 11 12 13 .. 21 22 23 .. 123 124 125 .. الخ ... هنا نفس الفكرة , لكن المعادلة تبني أساس جديد بدل الأساس العشري وتستبدل النص الذي وضعته بدل الأرقام العادية .

الكود الكامل بالسي :

#include "stdafx.h"
#include <cmath>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        const int PLACES=3;     //How many places do you want the characters to be placed in, "any number"
        int result[PLACES];

        unsigned int POW;
        const int char_num=3;   //Define the number of characters
        char STRING[char_num]={'a','b','c'};    //Write down your characters array

        cout<<"The total number of substrings is : "<<pow((float)char_num,PLACES)<<endl;
        cout<<"Press Enter to continue displaying the strings"<<endl;
        cin.get();

        for(int q=0;q<pow((float)char_num,PLACES);q++)
        {
                for(int w=0;w<PLACES;w++)
                        {
                                POW=pow((float)char_num,w);
                                cout<<STRING[((q-(q%POW))/POW)%char_num];
                        }       
                cout<<endl;
        }

        cout<<"FINISH"<<endl;
        cin.ignore();
        cin.get();      //Freeze the screen, you can also use ctrl+F5 in VS compilers

        return 0;
}

الناتج :

The total number of substrings is : 27
Press Enter to continue displaying the strings
aaa
baa
caa
aba
bba
cba
aca
bca
cca
aab
bab
cab
abb
bbb
cbb
acb
bcb
ccb
aac
bac
cac
abc
bbc
cbc
acc
bcc
ccc
FINISH
1

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#14

هذا النوع من الخوارزميات غالبية ما يكونه حله بالطريقة العودية recursive method

أسهل من الطريقة التكرارية looping بمراحل

فكر وأخبرنا ما الذي توصلت إليه

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

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

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

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

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

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