المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : ماذا تعرف عن الخورزميات



MouradPr
26-04-2009, 04:07 PM
السلام عليكم ورحمة الله تعالى وبركاته

سيتم في هذا الموضوع تناول أنواع الخوارزميات الموجودة الى الآن , لحل بعض المعضلات البرمجية , وسننطلق من أبسطها الى أعقدها...

نبدأ بأبسط الخورزميات ألا وهي خوارزميات البحث عن عنصر من ضمن مجموعة عناصر...

ماذا تعرف عن خوارزميات البحث : أنوعها

ولا ننسى الكود البرمجي لكل خوارزمية وبأغلب لغات البرمجة

هيا بنا.. :)

MouradPr
26-04-2009, 04:31 PM
بما أنني من فتح الموضوع فانا من يجب أن أبد وسأضع أبسط خوارزمية بحث بشكل عقلي ومتسلسل وبأمثلة لنصل في الأخير الى الكود البرمجي..

حسن نفترض لدينا 10 عناصر نأخدها أعداد في الحالة الأولى:

3 5 7 12 99 56 43 12 8 10

الآن قلت لك أن تجد لي العدد 8 في السلسلة؟؟

طبعا أنت إنسان ستقع عينك عليه مباشرة وستقول لي إنه الرقم ماقبل الأخير في السلسلة إبتداءا من اليمين :)
لكن كيف عرفت ذلك؟ هذا هو الهدف من هذه الخوارزمية.. سنحاول أن نعرف الطريقة التي عرفت بها أن الرقم 8 موجود وحددت موضعه أيضا.

حسن لو قمنا بعملية العرض البطيء للطريقة التي عرفت بها أن الرقم 8 موجود في السلسلة سنجد أنك تبدأ من الأول وتقارنه ب 8 إذا كان هو فإننا وجدنا النتيجة وإذا لا فننتقل للثاني حتى نجده أو نصل لآخر السلسلة :)

وهذه هي أبسط خوارزمية بحث وسألخصها فيما يلي

لدينا عناصر :

X1,X2,X3,X4,....,Xn

نريد البحث عن X ضمن هذه السلسلة

حسن سنقوم بوضع متغير نسميه i بحيث ينتمي الى المجموعة
{4,3,2,1,....,n}
وسبدأ من 1 الى أن يصل الى n

وسوف نقارن العنصر الذي نبحث X عنه مع العنصر الذي نقارنه به Xi

وستكون الخوارزمية كالتالي

For i = 1 to n
if X=Xi : X found
End For

=========أرجوا أن تكون مفهومة قليلا ==============

الآن الأكواد البرمجية

بلغة C





#include<stdio.h>

int main()
{
int i,n,X,x[10]={3, 5, 7,12,99,56,43,12,8,10};
X=8;
n=10;
for (i=0;i<n;i++)
{
if ( X==x[i]){
printf(" X found\n");
return 0;
}
}
return 0;
}




بالتوفيق والى الخوارزمية التالية... وطبعا لا تنسى أن تضع الكود بلغتك المفضلة :)

Wajdy Essam
26-04-2009, 05:22 PM
موضوع دراسه الخوارزميات بشكل عام يعتبر من المواضيع المهمه للغايه لأي مبرمج coder -لا أعرف عن الcracker- ، حيث لا يمكن أن نجد برنامج جيد من غير استخدام خوارزميه جيده ،، ومجال الخوارزميات واسع للغايه من خوارزميات ضغط وتشفير وبحث وترتيب ووو ..

بما أنك حددت الحديث حول خوارزميات البحث فتطبيقات البحث كثيره للغايه ، إبتداء من محررات النصوص العاديه والتي تحتوي على خاصيه Find & Replace حيث أغلب المحررات الحاليه تستخدم خوارزميه بحث تسمى Boyer-Moore Searching فهي تقريبا من أسرع الخوازرميات في مجال البحث ،،

هذا فقط بالنسبه للبحث عن النص المطابق أو ما يعرف بExact String Searching ، فهناك تطبيقات للبحث حينما تكون لديك أول مجموعه من الحروف أو الكلمات وتقوم الخوارزميه بايجاد جميع الكلمات التي تبدأ بهذه الحروف ، هذه الخوارزميات عاده تسمى ب prefix searching ولها تطبيقات كثيره مثلا في ايجاد جميع الأسماء التي تبدأ بحرف ما ،، حاليا محرك Google يستخدم هذه الخوارزميه لايجاد جميع الكلمات التي تبدأ بالكلمه التي تكبتها في خانه البحث ، أيضا المتصفحات مثل Firefox تستخدم هذه الخوارزميات عند كتابتك لموقع يبدأ بحرف كنت قد زرته سابقا ،،

نوع أخر من الخوارزميات وهو البحث أي عن نص قريب للنص المراد البحث عنه ، وتستخدم هذه الخوارزميات في المحررات الإملائيه فحين تكتب كلمه وتم أكتشاف أنها كلمه خاطئه يقوم البرنامج بالبحث عن أقرب 4 أو 5 كلمات للكلمه الخاطئه ،، هناك الكثير من هذه الخوارزميات وهي تعتمد أغلبها على الوزن الصوتي للحرف ، أشهر هذه الخورزميات هي Soundex Searching .

ليس هذا فقط :) ، فمضادات الفايروسات تستخدم خوارزميات بحث سريعه للبحث عن وجود توقيع مطابق لأحد البيانات في الملف المراد فحصه ،، وبما أن قواعد بيانات التواقيع تكون ضخمه للغايه فالبحث توقيع توقيع هذا أمر بطيء وهناك الأفضل ،، حيث هناك خوارزميات بالإمكان أن تبحث عن عده تواقيع في نفس اللحظه وتستخدم بنيه بيانات شجريه للقيام بكهذا أمر ، وهناك خوارزميات أخرى تعتمد على مفاهيم أخرى Hash Table وعده أمور أخرى ،، وتقريبا هذا النوع من الخوارزميات Multiple pattern searching يعتبر من أصعب الخوارزميات ، وهناك كثير من الأنتي فايروس تستخدم مثل هذه الخوارزميات مثل ClamAV .

نرجع لك يامراد بك :) ، الطريقه التي وضعتها تسمى Linear Searching أو البحث الخطي ، حيث سوف تستمر عمليه البحث من البدايه الى النهايه ،، من ميزاتها السهوله في التطبيق ، ومن عيوبها البطئ الشديد وخصوصا في حال كبر مجال البحث ،، فهذه الخوارزميه لها تعقيد زمني Big o(n) وهذا يعني أن الزمن المستغرق سوف يزيد كل ما زادت المدخلات ،، وفي أفضل الحالات يمكن أن نجد المفتاح في أول خانه ، وفي المتوسط n/2 ، وفي الأسوء في n محاوله ، وهذا أمر سيء خصوصا في التطبيقات الضخمه ،،

ملاحظه بسيطه وهي الخروج من الحلقه break فور وجود المفتاح حتى لا تضيع زمن في بحث لا تريده ، الا في حال كنت تريد ايجاد البقيه ان كان هناك .

سأضيف نفس مثالك ولكن هذه المره في البحث عن نص داخل نص (وهو أكثر interesting خصوصا لمن يريد عمل AV ) ،، هذه الخوارزميه تسمى Naive Searching Algorithms أو Brute-Force Search حيث سيكون البحث حرف بحرف كما سنرى بالمثال القادم . وهي بالتأكيد أسوأ خوارزميه في هذا المجال :)

* بالمناسبه تشكر على رفعك لكود الأنتي فايروس مره أخرى ،، فحاليا أعمل في مشروع تخرج في هذا المجال ،، وما شاء الله دروسك وأكوادك ممتازه وسأستفيد كثيرا منها خصوصا أني مبتدئ جدا في برمجه الويندوز والأسمبلي 32 ، فجزيت خيرا ،، وانتظر الكم الهائل من الأسئله الذي سوف ينهال عليك :D

zEaK47
26-04-2009, 05:29 PM
Vb :)



splited = split("3 5 7 12 99 56 43 12 8 10", " ")
looop:
If splited(i) = 8 then
msgbox "8 found !"
else
i = i + 1
goto looop
end if

MouradPr
26-04-2009, 05:31 PM
مرحبا بك أخي العزيز معلوماتك جد قيمة... مارأيك أن تشرح لنا خوارزمية بحث بسيطة ولاتنسى أن الشرح للمبتدئين جدا... وإن شاء الله نصل الى الى الخوارزميات التي ذكرت والتي لها تطبيق واسع في الذكاء الإصطناعي :)

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

على العموم ما هو مطلوب منكم الآن هو فهم هذه الخوارزمية وكل واحد يترجمها للغة البرمجة التي يحب

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

أخ Wajdy Essam بالمناسبة لو لاحظت المشاركة الأولى لم أضع حتى إسم الخوارزمية :( ترى ما السبب؟؟
أنا أريدهم أن يختاروا لها إسما كما يحبون المهم أن تفهم بشكل عقلي

سلامي لك ولنا حديث طويل

Wajdy Essam
26-04-2009, 05:35 PM
حسنا أخي ،، لندع الموضوع ينضج على طريقتك ،،

بالتوفيق ،

MouradPr
26-04-2009, 05:38 PM
اخي العزيز أعرف أن نيتك حسنة وتريد أن تعطي أفضل شيء

لكن تخيل معي شخص لازال لديه بعض المشاكل في الرياضيات ومشاكل في تحليل الأمور هل تظنه سيفهم ما وضعت؟؟

لما لنغير طريقة الشرح لشيء أبسط... لنتسلسل وبأمثلة يستطيع الطفل الصغير فهمها؟؟

AmCha.y
26-04-2009, 05:53 PM
اخي مراد مجرد تعقيب بسيط
ما كان عليك حذف مشاركته واضح انو تعب شويتين فيها
و فيها معلومات قيمة يعني كان ممكن يكمل الموضوع من غير
ما تحذفها
مجرد راي ..

Salsabeal
26-04-2009, 10:18 PM
Delphi


var
i : integer;
s: string;
begin
s:= '3571299564312810';
for i := 1 to length(s) do
begin
if s[i] = '8' then begin
showmessage('found!')
break;
end;
end;

end;

M[j]IrIm
26-04-2009, 10:30 PM
في البداية السلام عليكم


يستحسن أخي العزيز Salsabeal
ان تكون s من نوع مصفوفة لتتوافق افضل مع البحث

و السلام.

MouradPr
26-04-2009, 10:36 PM
اخي مراد مجرد تعقيب بسيط
ما كان عليك حذف مشاركته واضح انو تعب شويتين فيها
و فيها معلومات قيمة يعني كان ممكن يكمل الموضوع من غير
ما تحذفها
مجرد راي ..


لم أحدف شيء... صاحب المشاركة من حررها...

Salsabeal
يستحسن أن تكون مصفوفة من نوع integer

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

سلامي لكم وغدا سأضع خوارزمية البحث القاموسي..

M[j]IrIm
26-04-2009, 10:37 PM
في البداية السلام عليكم


بالنسبة ل السي ++
نفس كود أخي العزيز مراد
مع استبدال


printf(" X found\n");
ب
ِCout<<X<<"Found";


و اضافة

#include<iostream.h>
قبل أو عوض

#include<stdio.h>

و السلام.

o15s19
26-04-2009, 10:51 PM
خطرت ببالي فكرة جهنمية للبحث عن كلمة مثلا بين ألاف أو ملايين الكلمات طبعا حسب معلوماتي :

هي
لماذا لا يتم حفظ جميع الكلمات بواسطة جدول مثل جداول RainBowTables
يعني نحفظ الكلمة و الهاش تبع الكلمة و يكون الهاش MD5 أو Crc
و عند البحث نستخرج ال Crc للكلمة المراد البحث عنها و ثم نبحث عن Crc المطابق و بهذه حالة نكون وفرنا ملايين الاحتمالات
هي فكرة خطرت ببالي و حبيت اطرحها فقط

MouradPr
26-04-2009, 10:53 PM
بعض التعاريف حول المصفوفات

المصفوفات : هي مجموعة عناصر من نفس النوع ويمكن تمثيلها بجدول ذي أبعاد

لماذا المصفوفات ؟
مثلا نريد تعرف 3 متغيرات من نوع integer ستقول لي سهلة

x,y,z : integer

والآن قلت لك عرف لي 500 متغير من نوع integer ؟؟؟ سيكون الأمر متعب وممل

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

x[500] : integer

أما العناصر يمكن الوصول لها حسب ال index أو موضعها بالشكل التالي

x[0] the first element

أما العنصر العاشر مثلا ف x[9]

أما إن أردت مصفوفة ببعدين m و n فكالتالي :

Matrix[m][n] : integer

وتخيلها كجدول :D

مثال C



#include<stdio.h>

int main()
{
int i,x[10]={3, 5, 7,12,99,56,43,12,8,10};
X=8;
n=10;
for (i=0;i<n;i++)
{
printf("x[%d] = %d \n",i,x[i]);
}
return 0;
}

سيسرد كل عناصر الجدول

MouradPr
26-04-2009, 10:57 PM
لماذا لا يتم حفظ جميع الكلمات بواسطة جدول مثل جداول rainbowtables
يعني نحفظ الكلمة و الهاش تبع الكلمة و يكون الهاش md5 أو crc
و عند البحث نستخرج ال crc للكلمة المراد البحث عنها و ثم نبحث عن crc المطابق و بهذه حالة نكون وفرنا ملايين الاحتمالات
هي فكرة خطرت ببالي و حبيت اطرحها فقط

جميل أنك وجدتها بنفسك لكن للأسف موجودة :d
سيكون الملف الذي ستضع فيه المعلومات بحجم يفوق 200 gb
بالنسبة للكلمات التي يتراوح طولها بين 1 و 10 فقط

وربما يكون الحجم أكبر...

هناك بعض الملفات إستغرقت أيام لإتمامها وهي تباع ...

Salsabeal
27-04-2009, 01:21 PM
IrIm;48782']
في البداية السلام عليكم


يستحسن أخي العزيز Salsabeal
ان تكون s من نوع مصفوفة لتتوافق افضل مع البحث

و السلام.


السلام عليكم

شكرا لك أخي M[j]IrIm على الملاحظة ...

على قولك سيكون الكود كما يلي :


var
i : integer;
const
s: array [1 .. 16] of integer= ( 3, 5, 7, 1, 2, 9, 9, 5, 6, 4, 3,
1, 2, 8, 1, 0);
begin
for i := 1 to 16 do
begin
if s[i] = 8 then begin
showmessage('found!');
break;
end;
end;

end;

DATA_SNIPER
27-04-2009, 08:00 PM
السلام عليكم.
شكرا لك أخي مراد على هذا الموضوع الجميل.
أخي سلسبي أظن أنه في الباسكال لا يمكن الإسناد أثناء عملية التصريح بالمصفوفة فلربما الأمر كذلك في الدلفي (إن كان هذا الكود مكتوب بالدلفي فالدلفي مبني على الباسكال) :)
جيد سأطرح خوارزمية تركيب مصفوفة و الكود بالباسكال.
الخوارزمية معروفة بــBubble Sort Algorithm وهي تعتمد على خوارزمية البحث الخطي تجد موضوع عنها في الفريق العربي للبرمجة.

program Bubble_Sort;
const
n=7;
var
t:array[1..n] of longint;
j,u,i,k,exch:longint;
begin
writeln('Entrée les valeur:');
for j:=1 to n do
readln(t[j]);
(* بداية عمل الترتيب*)
for u:=1 to n+1 do
begin
for i:=1 to n-u do (* 1 *)

if t[i]>t[i+1] then
begin
(*2*)
exch:=t[i];
t[i]:=t[i+1];
t[i+1]:=exch;
end;
end;
writeln('***************');
for k:=1 to n do
writeln(t[k]);
readln;
end.
1=عند إتمام دورة كاملة فإن العدد الأكبر في السلسلة سيكون هو الأخير لذلك نقوم كل مرة بإنقاص او تقليص الجدول عن طريق هذه العبارة n-u
2=عملية إستبدال داخل المصفوفة وذلك طبقا للترتيب و عملية التبديل تكون عن طريق متغير آخر يعتبر وسيط
و السلام عليكم ورحمة الله تعالى وبركاته.

Salsabeal
27-04-2009, 09:37 PM
السلام عليكم
كيف لا يمكن الإسناد أثناء عملية التصريح بالمصفوفة ...؟
بما أن المصفوفة أعلن عليها في مقطع ال CONST فليس هناك مشكل في إسناد قيمة تابثة إليها

سؤال
هل جربت الكود ؟

لقد جربته وهو يعمل بشكل جيد

أرجو منك أخي أن تشرح هده الجزئية ولك جزيل الشكر

ملاحظة :
لقد نسيت أن تضع هدا ال Directive

{$AppType CONSOLE}
لكي تظهر الشاشة السوداء

MouradPr
28-04-2009, 07:19 PM
حسن الآن سأضع الخوارزمية التالية والتي مبدأها كمبدأ البحث في قاموس لترجمة كلمة ما..

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

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

ملاحظة :
القاموس مرتب ترتيب أبجدي مما يسهل البحث بهذه الخوارزمية...


متطلبات الخوارزمية :
- أن تكون العناصر مرتبة
- نعرف البداية والنهاية للعناصر


مثال :

لدينا السلسلة التالية :

1 4 5 8 9 12 15 19 23 25 30 52 77

لدينا العناصر على شكل مصفوفة ببعد واحد وعدد عناصرها 13 عنصر و موضع العنصر الأول هو 0 أما موضع العنصر الأخير هو 12

نريد البحث عن العنصر 8 في المصفوفة بإتباع البحث القاموسي...

سنتجه الى الوسط والذي هو 2/( 0 + 13 ) = 6 نأخد فقط الجزء الصحيح لأننا سنتعامل معه كموضع...

ثم نتجه للعنصر ذي الموضع 6 والذي هو 15 ثم نقارنه ب 8 إذا أكبر فسنلغي الجزء الأول بكامله إبتداءا من الموضع 0 الى الموضع 6 ثم نبحث في النصف الآخر بنفس الطريقة حتى نصل الى المبتغى...

أرجوا أن تكون مفهومة قليلا..

الآن الكود البرمجي بلغة C




#include<stdio.h>

int main(){
int found=0,medium,end=13,start=0,Table[13]={1,4,5,8,9,12,15,19,23,25,30,52,77};
int x=8;
do
{
medium=(start+end)/2;

if(Table[medium]<x) start=medium+1;

else if(Table[medium]>x) end=medium-1;

else
{
printf("X found in position = %d\n",medium+1);
found=1;
}

}while((start<=end) && (found==0));
return 0;
}

أرجوا أن تكون مفهومة قليلا لنمر الى شيء آخر... وكالعادة من فهمها يضعها بلغة البرمجة المفضلة لديه

MouradPr
28-04-2009, 08:55 PM
Data_sniper

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

سلامي لك

zEaK47
29-04-2009, 11:05 AM
Vb :)



dim num(0 to 12)
dim cur as integer
dim star as integer
dim nd as integer
private sub form_load()
star = 0
nd = 12
cur = (star + nd) / 2
num(0) = 1
num(1) = 4
num(2) = 5
num(3) = 8
num(4) = 9
num(5) = 12
num(6) = 15
num(7) = 19
num(8) = 23
num(9) = 25
num(10) = 30
num(11) = 52
num(12) = 77
end sub
private sub command1_click()
looop:
If num(cur) > 8 then
cur = cur / 2
goto looop
elseif num(cur) < 8 then
cur = cur * 2
goto looop
elseif num(cur) = 8 then
msgbox "8 found!" & vbcrlf & "in the " & cur + 1 & "th position !"
end if
end sub




ان لم تكن 8 موجودة يقع Loop Infini

MouradPr
01-05-2009, 02:17 PM
ان لم تكن 8 موجودة يقع Loop Infini

إذا مالحل؟

zEaK47
01-05-2009, 03:19 PM
إذا مالحل؟

هناك عدة حلول ...

MouradPr
01-05-2009, 03:23 PM
حسن لنبدأ خوارزميات الترتيب ونستهل الموضوع بأبسط خوارزمية وسنوضح بمثال

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

3 9 2 20 5 15 12 33 1 6 10 7


حسن .. أتذكر عندما كنا في الأقسام الإبتدائية وندرس الترتيب :D أتذكر أنني كنت آخد علقة من الأستاذ لأنني كنت كسولا قليلا هههه

على أي فالطريقة هي نفسها في الخوارزمية :) كيف؟

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

لنطبق الأمر..

سنأخد أصغر عنصر هو العنصر الأول والذي هو 3 ثم سنبدأ مقارنته بالباقي.. كالتالي :

2 9 3 20 5 15 12 33 1 6 10 7

ثم نكمل مقارنة باقي العناصر بعد أن صار العنصر الأول هو 2

1 9 3 20 5 15 12 33 2 6 10 7

إنتهت حلقة المقارنة والقلب.. وستبدأ الخوارزمية التي ستقوم بإتعتبار العنصر الثاني هو الأصغر من بين العناصر الباقية...

لاحظ أن الرقم 1 هو الأصغر وقد تم وضعه في الموضع الأول عند إنتهاء خوارزمية الترتيب ولذلك سنلغيه ونرتب الباقي بنفس الطريقة.. يبقى لنا ترتيب

9 3 20 5 15 12 33 2 6 10 7

بنفس الطريقة نعتب العنصر الأول هو الأصغر والذي هو 9 ثم نقارن إذا وجد أصغر منه فسنقلب الأماكن كالتالي

3 9 20 5 15 12 33 2 6 10 7

2 9 20 5 15 12 33 3 6 10 7

أرأيت كم الأمر سهل .. الآن لنجمع ناتج المرحلة الأولى مع الثانية

1 2 9 20 5 15 12 33 3 6 10 7

رائع جدا.. الآن هل فهمت أم أعيد الكرة؟؟ أعدها بنفسك

الآن كيف سنترجم ما فعلناه يدويا الى كود برمجي!!

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

الحلقة الأولى تعتبر العنصر الأول هو الأصغر أما الحلقة الثاني فتقارنه بالباقي : إذا أصغر تقلب الأماكن

وبالتالي سنضيف شرطا في الحلقة الثانية...

الآن سأوضح شيء : كيف نقلب عنصرين ...

لقلب عنصرين هناك طرق ذكية لفعلها لكنها لاتنفعنا ونريد شيء نفهمه ونفهمه لأطفالنا الصغار الذين لا علم لهم بالطرق الذكية..

سأوضح الأمر بإستعمال المماثلة :

لدينا دلوين واحد به ماء وواحد به مشروب ونريد جعل ماء الدلو الأول في الدلو الثاني ومشروب الدلو الثاني في دلو الماء؟؟

أفضل حل والمنطقي أن يكون لدينا دلو إحتياطي نضع فيه ماء الدلو الأول ثم نضع مشروب الدلو الثاني في دلو الماء وبعد دلك نضع في دلو المشروب الماء الذي كان في الدلو الإحتياطي ...

مثال بمتغيرات

نضع
x=a
و
y=b

نريد قلبهم

سنعرف متغير temp نضع فيه محتوى x ثم نضع y في x ثم temp في y

temp=x
x=y
y=temp

وبذلك سنحل على x=b و y=a

أما الطريقة الذكية والتي تنفع في الأعداد فقط فكالتالي بدون تعريف متغير إحتياطي

x=x+y
y=x-y
x=x-y

x= a+b
y=(a+b) -b= a
x=x-y = (a+b) -a = b

وهكذا قلبت الأماكن
===============================================

لنعد الى الكود البرمجي






#include <stdio.h>

int main()
{
int tab[12] = {3,9,2,20,5,15,12,33,1,6,10,7};
int i,j,temp;

for (i=0;i<11;i++)
{
for(j=i+1;j<12;j++)
{
if (tab[i]>tab[j])
{
temp=tab[i];
tab[i]=tab[j];
tab[j]=temp;
}
}
}

for (i=0;i<12;i++) printf("%d ",tab[i]);

system("pause");
return 0;
}


من فهمها بضعها بلغته المفضلة

DATA_SNIPER
02-05-2009, 05:19 PM
بما أن المصفوفة أعلن عليها في مقطع ال const فليس هناك مشكل في إسناد قيمة تابثة إليها
هذا الذي لم أنتبه إليه.

لقد نسيت أن تضع هدا ال directive
هل تتحدث عن الباسكال ام عن لغة أخرى؟

AMINE27
02-05-2009, 05:37 PM
السلام عليكم

يبدو أنه درس عن Algorithm and Data Structure : )

أقترح أن يتطرق كل من يضع خوارزمية إلى درجة تعقيدها، مثلا bubble sort أبطؤهم بدرجة تعقيد O(n³)

أما dichotomic search فهو بـ O(2^k)

MouradPr
02-05-2009, 05:41 PM
أقترح أن يتطرق كل من يضع خوارزمية إلى درجة تعقيدها، مثلا buble sort أبطؤهم بدرجة تعقيد o(n³)

من يعرف هذا فإنه حتما يعرف الخوارزميات... أما نحن فنتعامل مع شخص لا يعرف أي شيء...

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

سلامي لك أخي العزيز ومرحبا بك

aljeelany
04-05-2009, 04:47 PM
موضوع جميل .. متابع معكم ان شاء الله
بخصوص خوارزميات البحث اظن ان خوارزمية التي سميتها القاموس
تعتبر من افضلها فتخييل ان لديك 1048576 قيمه هل سيبحث عن
القيمه المطلوبه 1048576 مره ..بهذه الخوارزيمه سيقارن كحد اقصى 20 مره ..(1048576=20^2)
ولكنها تحتاج الى ترتيب البيانات لتعمل بشكل صحيح


هل تتحدث عن الباسكال ام عن لغة أخرى؟
هو قصد انه عند كتابة هذا الكود في مترجم الدلفي فانك تضعه على
هيئة كونسول وبالتالي وجب كتابة الكود الذي ذكره ..
هو لم يقصد terbo pascal

WoLFGanG
04-05-2009, 07:50 PM
يبدوا انك تحسن تنشيط المنتدى اخ مراد
كذلك الاخوة لهم دراية بالمواد الهندسية المتعلقة بالحاسوب
ساشارك بما استطيع :d:d

MouradPr
04-05-2009, 08:17 PM
يبدوا انك تحسن تنشيط المنتدى اخ مراد
كذلك الاخوة لهم دراية بالمواد الهندسية المتعلقة بالحاسوب

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

==============
أتعلم عندما يكون كل شيء جاهز تمله .. وها أنت ترى ذلك بأم عينك...
قبل سنتين كنت أشقى لسماع فقط عنوان الدرس ... هيهات أن تجد أحد يشرح لك بلغتك
=============

سلامي لكم وهدى الله الجميع لما فيه خير وصلاح

MouradPr
05-05-2009, 07:19 PM
أختم هذا الموضوع وأتركه للأسئلة فقط:


hxxp://autoformation.freehostia.com/cours_informatique/cours_advance_programming_algorithmique/pagemenutext.html

أفضل شرح رأيته في حياتي :d

Dr.MOT
08-05-2009, 02:18 PM
أختم هذا الموضوع وأتركه للأسئلة فقط:



أفضل شرح رأيته في حياتي :d

شكرا ,,

لكن للأسف 404 File Not Found :help:

MouradPr
08-05-2009, 04:29 PM
http://autoformation.freehostia.com/cours_informatique/Cours_Advance_programming_Algorithmique/pageMenutext.html

عدرا

hichampro
08-05-2009, 10:33 PM
الآن سأوضح شيء : كيف نقلب عنصرين ...






VB Classic

Dim x As Integer, y As Integer
x = 5
y = 7

MsgBox "Before swaping" & vbNewLine & "x=" & x & vbNewLine & "y=" & y

x = x Xor y
y = x Xor y
x = x Xor y


MsgBox "After swaping" & vbNewLine & "x=" & x & vbNewLine & "y=" & y

MouradPr
08-06-2009, 09:15 PM
جميل أخي hichampro

يمكننا إستعمال هذه الطريقة أيضا مع البنيات إذا عملنا
overloading of operator

:) أنا لا أتوقف عن القراءة كل مرة أجد شيء يخرج من الجانب

louah_0001
30-06-2009, 02:56 PM
شكرا لك Mourad
خوارزمية الترتيب بال vb.net Console

sub TrieTable
dim t(11),i,z,nc as integer
t(0)=3
t(1)=9
t(2)=2
t(3)=20
t(4)=5
t(5)=15
t(6)=12
t(7)=33
t(8)=1
t(9)=6
t(10)=10
t(11)=7
do
nc = 0
for i= 0 to 11
if t(i) > t(i+1) then
z = t(i)
t(i) = t(i+1)
t(i+1) = z
nc = 1
end if
next
loop until nc = 0
for i= 0 to 11
console.writeline ("t(" & i & ")=" & t(i) )
next
end sub

hichampro
30-06-2009, 07:13 PM
dim t(11)

المصفوفة بها 12 عنصر
سيظهر خطأ أثناء التنفيد

MouradPr
30-06-2009, 07:38 PM
المصفوفة بها 12 عنصر
سيظهر خطأ أثناء التنفيد

ذلك صحيح في vb
:) عادي مادمنا نتكلم عن لغة سيئة

hichampro
30-06-2009, 07:50 PM
ذلك صحيح في vb
:) عادي مادمنا نتكلم عن لغة سيئة

وهل لا يحدث خطأ هكذا :


int tab[12] = {3,9,2,20,5,15,12,33,1,6,10,7,98};


تحديد عناصر المصفوفة في 12 عنصر
وتمري 13 عنصر إليها ؟؟؟؟

MouradPr
30-06-2009, 07:58 PM
تحديد عناصر المصفوفة في 12 عنصر
وتمري 13 عنصر إليها ؟؟؟؟

بلى في C خطأ

أما VB فصحيح لذلك أقول عنها سيئة...

حسن سأشرح شيء...
نعرف مصفوفة T[5]

في التنفيد يتم التعامل بالشكل التالي

الموضع الأول 0 هو نفسه عنوان المتغير T كمؤشر

أما الموضع التالي فيتمي إضافة حجم نوع النتغير على العنوان T

مثلا لو كانت T مصفوصة من نوع int وفيها 10 عناصر ونريد عنوان العنصر التاسع..

Address(T) + 9*sizeof(int) =address9


لو أردنا المتغير 11 في المصفوفة سيخرج عن عنوان المصفوفة بحجمها :(

هذا كل مافي الأمر

إذا C على حق و VB على خطأ

hichampro
30-06-2009, 08:53 PM
جيد مراد نقطة رائعة فيما يخص ال pointers أضفتها ;)

ننتظر منك أن تكمل ...

MouradPr
01-07-2009, 10:35 AM
ننتظر منك أن تكمل ...

مرحبا بسؤالك..

louah_0001
01-07-2009, 12:44 PM
يا اخي hichampro , ليس هناك خطأ , لان المصفوفة تبدا بالعنصر 0 .
بالنسبة للاخ mouradpr ,ما العمل , فنحن ندرس ال vb.net!
ام انك تدافع عني c لانك تدرسها .
ساقول لك بان c++ افضل من c و vb.net من ناحية البرمجة الموجهة oop .

MouradPr
01-07-2009, 12:48 PM
يا اخي hichampro , ليس هناك خطأ , لان المصفوفة تبدا بالعنصر 0 .
بالنسبة للاخ mouradpr ,ما العمل , فنحن ندرس ال vb.net!
ام انك تدافع عني c لانك تدرسها .
ساقول لك بان c++ افضل من c و vb.net من ناحية البرمجة الموجهة oop .

درست VB و C/C++ و Asm ... أظن هذا يكفي لأختار من الأفضل

وعلى العموم تبقى وجهة نظر

louah_0001
01-07-2009, 01:30 PM
اخي mouradpr , كيف يمكنني ان ادرج الكود بصيغة php , عوض الاقتباس . حتى اتمكن من مشاركتكم كيفية اصطياد السمكة , كيف ما كان نوعها , بادن الله .
وشكرا لك , مرة اخرى.

hichampro
01-07-2009, 02:15 PM
يا اخي hichampro , ليس هناك خطأ , لان المصفوفة تبدا بالعنصر 0 .


صحيح أخي hak-amz ;)

louah_0001
02-07-2009, 06:58 PM
واش ممكن اكتب مثل هذا الكود في ال vb.net .

s: array [1 .. 16] of integer= ( 3, 5, 7, 1, 2, 9, 9, 5, 6, 4, 3,
1, 2, 8, 1, 0);


؟؟؟؟؟ وشكراااااا.

hichampro
03-07-2009, 04:33 PM
نفس مثالك مراد :)


#include <conio.h>
#include <iostream>

void main(){

int aArray[12] = {8,2,96,14,22,53,61,37,4,9,3,72};
int i, j;

for (i = 0; i < 11; i++)
{
for (j = (i + 1); j < 12; j++)
{
if (aArray[i] > aArray[j])

{

aArray[i] = aArray[i] ^ aArray[j];
aArray[j] = aArray[i] ^ aArray[j];
aArray[i] = aArray[i] ^ aArray[j];
}

}
}

for (i = 0; i < 12; i++) std::cout << aArray[i] << std::endl;

_getch();
}

MouradPr
05-07-2009, 02:12 PM
aArray[i] = aArray[i] ^ aArray[j];
aArray[j] = aArray[i] ^ aArray[j];
aArray[i] = aArray[i] ^ aArray[j];

رائعة منك :) تشكر على الإضافة

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

فعلا أقنعني لما تحدث عن النصوص :) لكن الآن لو رأيته لقلت له أنت هو حمار جحى

يوج OverLoading للعمليات للتعامل مع البنيات حتى

تبا له...

hichampro
09-07-2009, 11:06 AM
هل جربت أخي مراد الدالة CopyMemory لقلب عنصرين عن طريق مؤشريهما ؟؟
مجرد فكرة ..لكن أظنها منطقية عكس الطرق الأخرى ..

لو أمكن تضع مثال عنها

MouradPr
09-07-2009, 11:35 AM
هل جربت أخي مراد الدالة CopyMemory لقلب عنصرين عن طريق مؤشريهما ؟؟
مجرد فكرة ..لكن أظنها منطقية عكس الطرق الأخرى ..

لو أمكن تضع مثال عنها

نعم ممكنة :) لكن بدون CopyMemory يمكنك اللعب بالمؤشرات كما تشاء...

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

hichampro
11-07-2009, 02:19 PM
أنا أستفيد منك أخي هشام البروفيسور...

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

عن طريق المؤشرات لن تجد مشكلا حتى مع المتغيرات الحرفية

Salsabeal
11-07-2009, 02:38 PM
السلام عليكم
هذه التقنية جميلة وقد بدات فيها ولم اكمل يظهر لي انني ساعيد النظر فيها :d

ashalshaikh
08-08-2009, 06:05 PM
بارك الله فيك أخي مراد..
الله لا يضيع لك تعب ,,
تصدق أول مرة أعرف معنى خوارزمية :D

على كل حال ,, كتبت أكواد للبحث بـ سكربتات AutoIt أعرف أنها لا تقارن بلغة البرمجة ,, ولكن لا أعرف غيرها :D

على فكرة أخي ,, يوجد دالة جاهزة في AutoIt للبحث تعطيك حتى رقم الخانة :D وهي StringInStr
على كل حال أنا عملتها بالطريقتين ,, وأرفقت مثال


;#######################################
Func SSearch($String,$FindString)
Local $aString = StrIngSplit(StrIngStripWS($String,3)," ")
FOr $x = 1 To $aString[0]
If $NumFind = $aString[$x] Then Return True
Next
Return False
EndFunc
;============= Example ==========
Dim $Res = SSearch("3 5 7 12 99 56 43 12 8 10 ","8")
MsgBox (0,"","Found : " & $Res)
;#################################################
Dim $Res = StringInStr("3 5 7 12 99 56 43 12 8 10 ","8")
MsgBox (0,"","Found : " & $Res)

شكرا لك أخي ,,
سأكمل الموضوع , ,وأرى ماذا أستطيع أن أتعلم منكم :)

ashalshaikh
08-08-2009, 07:00 PM
بدأت في البحث القاموسي ,, ولكن ما قدرت لأن راسي دايخ ,, وينقصني النوم ,, وأنا أمام الجهاز من الصبح :D

لذلك حبيت أشارككم بخوارزمية ترتيب المصفوفة !!

معمولة كدالة ,, موضح اسم من كتب الدالة ,, أمام Author !!
من أحد UDF المرفقة مع المحرر :)
UDF = User Defind Fanction
ملاحظة ::ـ
الدالة _ArraySort تختبر المصفوفة إن كانت بعد واحد أو بعدين ثم تعمل دالة الترتيب المناسبة ثم ترجع لك الناتج. وهذه التي يتم استخدامها .
الدالة __ArrayQuickSort1D لترتيب ذات البعد الواحد .
الدالة __ArrayQuickSort2D لترتيب ذات البعد الواحد .
ملاحظة :: الترتيب حسب الحروف والأرقام !!
<<< أنا ما فهمتها :D ,, ولكن حبيت أفيد !!

لأنها طويلة ولا يقبلها المنتدى ,, <<< الأحرف محدودة .
سأرفقها في Text مضغوط

شكرا لكم ..
تعلمت الكثير !!
أدام الله الله هذا المنتدى ,, وبارك بكل من يُعنى به .