صفحة 11 من 12 الأولىالأولى ... 6789101112 الأخيرةالأخيرة
النتائج 151 إلى 165 من 169

الموضوع: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

  1. #151
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اريد ان اعرض الاعداد بين 1 الى 10 :
    كود:
    declare
    
    i number :=1;
    
    begin
    
    loop
    
    dbms_output.put_line(i);
    
    i:=i+1;
    
    if i>10 then
    
    exit;
    
    end if ;
    
    end loop;
    
    end;
    
    /
    كود:
    1
    
    2
    
    3
    
    4
    
    5
    
    6
    
    7
    
    8
    
    9
    
    10
    
    
    لنعقد الامور ...
    اريد ان اعرض الاعداد الزوجية من واحد الى عشرة !!
    كود:
    declare
    
    i number :=1;
    
    begin
    
    loop
    
    if mod(i,2)=0 then 
    
    dbms_output.put_line(i||' is even');
    
    end if;
    
    i:=i+1;
    
    if i>10 then
    
    exit;
    
    end if ;
    
    end loop;
    
    end;
    
    /

    لاحظ السطر الخامس !!

    وضعنا المتغير
    i في داخل الدالة ... سوف تتغير قيمة هذا المتغير في كل مرة في التكرار !

    فمرة تجده 1 ,,, ومرة 2 ومرة 3 .... حتى 10

    اذا كان باقي قسمة قيمة المتغير على اثنين تساوي صفرا يعني انه زوجي !!

    انظر مخرجاته :
    كود:
    2 is even
    
    4 is even
    
    6 is even
    
    8 is even
    
    10 is even
    الان انظر الى الاعداد الزوجية من 0 الى 50 !!
    كود:
    declare
    
    i number :=0;
    
    begin
    
    loop
    
    if mod(i,2)=0 then 
    
    dbms_output.put_line(i||' is even');
    
    end if;
    
    i:=i+1;
    
    if i>50 then 
    
    exit;
    
    end if ;
    
    end loop;
    
    end;
    
    /
    نفس البرنامج لا تغير ولا تبدل ... الا تغيير بسيط جدا في السطر التاسع , غيرنا الشرط يكون المتغير اكبر من 50 !

    يوجد جملة جديدة قليلا ... وهي
    exit when

    ما فائدتها ...؟؟ ليست تلك الفائدة العظيمة ولكن ... مجرد استخدام اخر لـ
    exit ...

    انظر الى البرنامج التالي نفس البرنامج السابق ولكن باستخدام هذه الجملة :
    كود:
    declare
    
    i number :=0;
    
    begin
    
    loop
    
    if mod(i,2)=0 then 
    
    dbms_output.put_line(i||' is even');
    
    end if;
    
    i:=i+1;
    
    exit when i>50;
    
    end loop;
    
    end;
    
    /
    يظهر انها كالشرط !!

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



    مارأيك ان نطبع الاعداد الزوجية من صفر الى عدد يدخله المستخدم ؟

    التحدي الاول !!

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

    يعني سوف يقول لي .. ادخل قيمة .. وادخل انا مثلا 22 ... فسوف يوجد لي كل الاعداد الزوجية التي بين 0 و 22

    ولو ادخلت 66 فسوف يوجد لي كل الاعداد الزوجية التي بين 0 و 66 وهكذا !!

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

    الاعداد الاولية ,,,
    prima numbers

    هل تعرف ماهي الاعداد الاولية ؟

    هي الاعداد التي لا تقبل الا القسمة على نفسها وعلى واحد فقط !!

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

    تحدثت فيها كثيرا يا رجل ... لا ترفع ضغطي ...

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

    يعني لو ادخل المستخدم 20 فسوف يوجد البرنامج الاعداد الاولية بين الواحد والعشرين !!

    للتسهيل عليك ...

    الاعداد الاولية 1 و 2 و 3 و 5 ......
    ..

    هذه التي لا تقبل القسمة الا على نفسها وعلى واحد !!

    الان اريدك ان تلاحظ ان جملة التكرار البسيطة هذه ... لو نزعنا
    exit منها فسوف لن نستطيع الخروج من البرنامج الى اللانهائية ....

    انظر الى البرنامج :


    النوع الثاني ...

    جمل التكرار العددية
    Numeric for loop

    صراحة هذه اسهل قليلا .... وهو يصلح للتكرار الذي نعرف متى ينتهي ..

    طيب ... اليك طباعة الجملة
    hello world بهذه الطريقة ..

    اريد طباعتها خمس مرات ... ثم عشر مرات في المثالين التاليين :

    كود:
    begin
    
    for i in 1 .. 5 loop
    
    dbms_output.put_line('hello world');
    
    end loop ;
    
    end;
    
    /

    السطر الثاني ...
    for i in 1 .. 5 loop

    يعني عرف المتغير
    i وجعل اول قيمه له تساوي 1 , ثم سوف يكرر الى ان يصل المتغير القيمة الاكبر من 5 ...

    مرة يجعل المتغير يساوي واحد .... وينفذ ثم يجعل المتغير يساوي اثنين وينفذ .......وهكذا

    كود:
    hello world
    
    hello world
    
    hello world
    
    hello world
    
    hello world
    سهلة كما قلت .... وتعمل بشكل اوتوماتيكي في زيادة المتغير ....

    لنعمل برنامج الاعداد الزوجية :
    كود:
    begin
    
    for i in 1 .. 20 loop
    
    if mod(i,2)=0 then
    
    dbms_output.put_line(i||' is even');
    
    end if ;
    
    end loop ;
    
    end;
    
    /
    النتيجة والمخرجات :
    كود:
    2 is even
    
    4 is even
    
    6 is even
    
    8 is even
    
    10 is even
    
    12 is even
    
    14 is even
    
    16 is even
    
    18 is even
    
    20 is even
    مازلنا في تطبيقات بسيطة وسهلة الان ....

    توقع برامج اكثر شراسة فيما بعد !!

    فلا تنسى قوة واهمية التكرار في البرمجة !!

  2. #152
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    جمل التكرار طالما
    While loop


    شكل ثالث من جمل التكرار ..
    while تعني طالما ..

    الان برنامج الاعداد الزوجية التي بين الصفر والعشرة ...

    كود:
    declare 
    
    v number :=0;
    
    begin
    
    while v<=10 loop
    
    if mod(v,2)=0 then
    
    dbms_output.put_line(v||' is even');
    
    end if ;
    
    v:=v+1;
    
    end loop;
    
    end;
    
    /
    في السطر الرابع .. قلنا
    while v<=10 loop

    يعني طالما ان المتغير
    v قيمته اصغر من 10 .. فكرر !!

    يعني بعكس ما تعودنا ... كنا نقول اذا قيمة المتغير اكبر من عشرة .... توقف .

    الان نقول .... اذا قيمة المتغير اصغر من او تساوي عشرة كرر !!

    نفس الفكرة , عكس المفهوم

    السابقة .. تقول اذا ..... توقف ...

    وهذه تقول اذا ..... كرر !!

    فرق بينها ....


    طبعا في السطر الثامن زدنا في كل مرة المتغير بواحد ...

    الان ....

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

    صراحة انا ارى انه لكل واحدة لها غرض ...

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

    طبعا حلقات التكرار البسيطة وحلقات التكرار العددية متشابهة جدا ...

    ولكن العددية اوتوماتيكية وبتريح ولكن .. محدودة القوى ..

    اما البسيطة تتعب ولكن قواها اوسع واكثر مرونة .... كيف ؟ انا اخبرك ...

    طبعا لما نشاهد من اول نظرة الامور , نتسرع ونحكم

    انا من اول نظرة لي ان العددية افضل بكثيييييييييير

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

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

    قبل كل شيء اريد عمل برنامج يطبع لي الاعداد الزوجية بين الصفر والعشرة .. ولكن من الكبير الى الصغير !!

    يعني من عشرة الى الصفر !!
    كود:
    declare 
    
    v number :=10;
    
    begin
    
    loop
    
    if mod(v,2)=0 then
    
    dbms_output.put_line(v||' is even');
    
    end if ;
    
    v:=v-1;
    
    if v <0 then
    
    exit ;
    
    end if ;
    
    end loop;
    
    end;
    
    /
    
    كود:
    10 is even
    
    8 is even
    
    6 is even
    
    4 is even
    
    2 is even
    
    0 is even
    انظر الى جمالها !!

    السطر الثامن لم نقل "زد المتغير بواحد" !!

    بل قلنا "اطرح من المتغير واحد" !!

    سوف يكون 10 في البداية كما لاحظنا في السطر الثاني !!

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

    لاحظ وتأمل في هذا الشرط ... لو قلنا "اذا كان المتغير اكبر من الصفر " مالذي يحصل ؟ سوف يخرج من اول تكرار بالطبع !! لان المتغير في السطر الثامن ينقص بواحد ويصبح قيمته تسعة , ثم يختبره الشرط الذي في السطر تسعة ..

    يجده اكبر من الصفر طبعا !!

    لكي توسع المفهوم ... انظر البرنامج التالي ... وهو نفس السابق ولكن من 10 الى 5 !!
    كود:
    declare 
    
    v number :=10;
    
    begin
    
    loop
    
    if mod(v,2)=0 then
    
    dbms_output.put_line(v||' is even');
    
    end if ;
    
    v:=v-1;
    
    if v <5 then 
    
    exit ;
    
    end if ;
    
    end loop;
    
    end;
    
    /
    كود:
    10 is even
    
    8 is even
    
    6 is even
    غيرنا فقط الشرط وقلنا
    if v<5 then بدلا من الصفر ..

    اعتقد انها نقطة مفهومة واضحة سهلة تافهة ....


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

    كما قلنا .. اولا التكرار التنازلي .. وكما شاهدنا .. ننقص المتغير وليس نزوده !!

    حلقة التكرار البسيطة استطاعت ذلك ...

    هل تستطيع حلقة التكرار العددية ؟؟ لنرى ذلك :
    كود:
    begin
    
    for i in 20 .. 1 loop 
    
    if mod(i,2)=0 then
    
    dbms_output.put_line(i||' is even');
    
    end if ;
    
    end loop ;
    
    end;
    
    /
    في الحقيقة لا يوجد خطأ ولكن ... سوف يرى قيمة المتغير
    i الاولية ... ويجدها 20 .. ثم يقول "هل 20 اكبر من 1؟"

    طبعا يقول نعم !! اذن اخرج من الدوارة ...

    لن يطبق شيء وستكون المخرجات لاشيء !!

    اذن هذه الحلقة غبية وليست قادرة على استيعاب الامر !!

    فهي اذن للزيادة فقط !!

    يوجد طريقة لحل هذه المشكلة ...

    كود:
    begin
    
    for i in reverse 1 .. 20 loop
    
    if mod(i,2)=0 then
    
    dbms_output.put_line(i||' is even');
    
    end if ;
    
    end loop ;
    
    end;
    
    /
    اضفنا كلمة
    reverse وهي تعني العكس , سوف تعد تنازليا من 20 الى 1 ...

    جميل جدا ..


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

    يعني كما شاهدنا ... نزيد بواحد , ننقص بواحد !!

    اريد برنامج يطبع لي الاعداد التي بين 3 و 30 والتي تقسم على العدد ثلاثة !! ماذا اعمل ؟

    بسيطة .. اول شيء الثلاثة , ثم الستة , ثم التسعة ... وهكذا !!

    كيف عرفت ؟ اضيف في كل مرة ثلاثة !!

    اليك البرنامج البسيط ولكن قبل كل شيء ... ارجو ان تكتب انت البرامج قبل ان تطلع عليها !!

    يعني حاول عمل البرنامج قبل ان تراه !!
    كود:
    declare 
    
    v number :=3;
    
    begin
    
    loop
    
    dbms_output.put_line(v);
    
    v:= v+3;
    
    if v>30 then 
    
    exit;
    
    end if;
    
    end loop;
    
    end ;
    
    /
    كود:
    3
    
    6
    
    9
    
    12
    
    15
    
    18
    
    21
    
    24
    
    27
    
    30
    
    
    شاهدنا في السطر السادس
    v := v+3

    يعني نزيد بثلاثة .

    نستطيع ان نزيد باربعة .. بخمسة .. بعشرة بألف بمليون ...

    نستطيع ان ننقص بستة او سبعة او ..... الخ

    حتى اننا نستطيع ان نزيد او ننقص بكسور !!

    مثلا :
    v:= v+0.98

    نستطيع ذلك ... جرب وانظر !!

    الان .. رأينا انه في حلقة التكرار البسيطة نستطيع ان نضيف غير الواحد !

    وحلقة التكرار العددية لا تستطيع ذلك !!

    لا اهتم لهذه الفروقات لأني لا اعلم هل توجد طريقة لحل هذه المشكلة (ولا اعتقد
    ) في حلقة التكرار العددية او لا !!

    ولكن اريد ان اوصل لك رسالة ..

    في لغات البرمجة الاخرى , توجد لغات تعمل كل شيء جاهز , هي صراحة مريحة جدا للمبرمج , ورائعة , وفي وقت قياسي تعمل برامج كبيرة .

    وتوجد لغات اخرى متخلفة جدا , وكل شيء تعمله يدوي ....

    ايهما افضل ؟ هل اللغات التي تعمل لك كل شيء وانت تستخدمها او اللغة التي تجبرك على عمل كل شيء ؟

    طبعا ستقول اللغة التي تريحني وتعطيني كل شيء جاهز !

    انت صادق , ولكن .. في الحقيقة هي سريعة في الانتاج بطيئة في التنفيذ ! يعني لو لديك برنامج كبير , عملته بهذه اللغات الجاهزة في اقل من شهر ... سترى ان اداء البرنامج الكبير سيء !! بطيء ايضا !

    طبعا هذا اذا اهتمينا في اداء البرامج , بينما لو عملناه باليدوية فسوف ننهيه في اربع شهور مثلا ولكن سنجد البرنامج صاااروخ !!

    وهنالك شيء اخر !! المرونة ,,

    اللغات التي تعطيك اشياء جاهزة من الممكن ان تعطيك شيء ضيق الحدود , ولا تستطيع التعديل فيه ...

    اما اليدوية فسوف تعمل كل شيء بنفسك وتتحكم في كل شيء !

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


    الان حلقة التكرار "طالما"
    while loop

    لماذا نستخدمها ؟ الا تكفي جملتي التكرار تلك ؟

    في الحقيقة انا اراها زائدة !!

    في بعض لغات البرمجة هي مهمة جدا لكن هنا .. مجرد زيادة , لأننا نستطيع عمل مثلما تعمله هذه الحلقة , باستخدام الحلقة البسيطة !! رهيبة الحلقة البسيطة , نستغني عن الكل اذا استخدمناها فركز فيها ,,,

    الان لماذا نستخدم
    while ؟؟

    في حلقة التكرار العددية نحن نعرف كم تكرار يلزمنا , لذا نحدد المجال ونقول من كذا الى كذا ...

    طيب لو ما بنعرف ؟ ماذا نستخدم ؟ هل العددية ؟ طبعا لا !!

    مثلا كرر طالما انه يوجد سجلات في الجدول مثلا ,, طبعا نعرف ان انه يوجد سجلات في جدول ما , ولكن لا نعرف كم سجل !!

    لو قلت لك عشر سجلات ... فحلقة التكرار العددية تقوم بذلك , ولكن اذا لم نعرف ذلك ,
    while وجملة التكرار البسيطة تستطيع عمل ذلك ,, لا اريد اعطائك الان أي امثلة ولكن سوف تلاحظها فيما بعد ان شاء الله .


    هل تذكر تداخل الوحدات , وتداخل الشروط , الان يوجد تداخل للتكرار !!

    نفس المفهوم , ونفس الفكرة .....

    سوف نبدأ ان شاء الله درسنا القادم ببرنامج من العيار الثقيل ....(على ما اظن)

    انتهى درس اليوم , واعدكم بدروس ستشيب رأسك حتما , فترقب !!

  3. #153
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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

    الدرس السابععشر
    اسم الدرس
    :لغة PLSQL

    صعوبة الدرس
    : ***** من *****

    الوقت المتوقع منك لفهم الدرس
    ستساعات , تطول او تقصر ... .

    المتوقع منك في هذا الدرس
    - لماذا المصفوفات .
    - كيفية عمل المصفوفات .
    - دوال المصفوفات .
    - مهارة التتبع .


    السلام عليكم ....
    قبل البدء في اجوبة التحديات في الدرس السابق , اريد ان اشير الى انني ان شاء الله اعمل بعض عروض الفلاش الخفيفة والبسيطة جدا في تتبع البرامج , والتي أرى انها مفيدة ان شاء الله ...
    الان اليك اجوبة التحديات في الدرس السابق ...
    حل التحدي الاول :
    كود:
    declare
    v number :=&v;
    s number :=0;
    begin
    loop
    if s>v then
    exit;
    end if;
    if mod(s,2)=0 then 
    dbms_output.put_line(s||' is even');
    end if;
    s :=s+1;
    end loop;
    end;
    /


    حل التحدي الثاني :
    كود:
    declare 
    v number :=&v;
    flage number :=0;
    begin
    for i in 2..v loop
    for j in 2..i-1 loop
    if mod(i,j)=0 then flage:=1;exit;end if;end loop;
    if flage =0 then
    dbms_output.put_line(i||' is prima');
    end if;
    flage :=0;
    end loop;
    end; 
    / 

    ناتج البرنامج كما يلي ... يطلب رقم , انا ادخلت 13 .... وسوف يعرض الاعداد الاولية التي اقل منه :
    كود:
    Enter value for v: 13
    old   2: v number :=&v;
    new   2: v number :=13;
    2 is prima
    3 is prima
    5 is prima
    7 is prima
    11 is prima
    13 is prima

    في حل التحدي الثاني يوجد بعض الافكار القوية ...
    فكرة البرنامج هي طباعة الاعداد الاولية ... يعني يدخل المستخدم عدد ما , والبرنامج يطبع الاعداد الاولية التي اقل منه ...
    الاعداد الاولية هي الاعداد التي لا تقبل القسمة الا على نفسها او على واحد !!
    كيف "لا تقبل القسمة ... " ؟؟؟
    يعني باقي قسمتها يساوي صفر ...
    مثلا قسمة 4 على 2 .... كم الناتج بدون كسور ؟؟ الناتج 2
    كم باقي القسمة ؟ باقي القسمة يساوي صفر ...
    طيب قسمة 3 على 2 .... اريد الناتج بدون كسور !! ... اكرر بدون كسور .
    الناتج =1 ... وباقي القسمة تساوي 1 ....
    اذن باقي القسمة لا تساوي صفرا ... اذن الثلاثة لا تقبل القسمة على الاثنين ....
    نعيد ونكرر .... ما معنى اعداد الاولية ؟ هي التي لا تقبل القسمة الا على نفسها او على الواحد ..
    مثل الاثنين ... لا تقبل القسمة الا على نفسها او على الواحد ...
    مثلا السبعة ... لا تقبل القسمة على ستة ... او على خمسة ... او على اربعة او ثلاثة او اثنين ...
    السبعة لا تقبل القسمة الا على نفسها (يعني سبعة) او على الواحد ! (ركز .. على نفسها , وعلى الواحد فقط !! )
    اذن السبعة عدد اولي ...
    الاعداد الاولية هي كما يلي :
    1 , 2 , 3 , 5 , 7 , 11 ,13 ......... الخ
    هل التسعة من ضمنها ؟ لا .. لماذا ؟ لأنها تقبل القسمة على ثلاثة .... اذن ليست اولية .
    يعني لو فكرنا بالمنطق كيف نعمل برنامج يطبع الاعداد الاولية ؟؟انظر الى المنطق ... ممل ولكن مهم , تحمل خمس دقائق او اقل .... لقرائته :

    - مثلا نجعل المستخدم يدخل عدد اقصى ... مثلا ادخل العشرة ...

    - نبدأ نختبر العشرة هل عدد اولي ام لا ... كيف نختبره ؟ نقول 10/9 .. يقبل ؟ لا ... 10/8 يقبل ؟ لا .... 10/7 يقبل ؟ لا ....10/6 يقبل ؟ لا ... 10/5 يقبل ؟ نعم !!
    هنا العشرة ليست عدد اولي

    - ننقص القيمة القصوى المدخلة ... بتصير الان تسعة مثلا ...

    - نبدأ نختبر التسعة .... هل عدد اولي ام لا ؟ كيف نختبره ؟ نقول 9/8 يقبل ؟ لا ... 9/7 يقبل ؟ لا .......الخ
    يتضح ان التسعة ايضا ليست عدد اولي

    - ننقص التسعة ... ثم نختبر ثم ننقص ثم نختبر ........... الخ ...

    - نلاحظ انه يوجد حلقة تكرار للاختبار , يعني لو اردنا نختبر أي عدد هل اولي او لا ... نعمل حلقة تكرار ...

    - نلاحظ ايضا انه يوجد حلقة تكرار ثانية لتنقيص العدد المدخل ! .... بعد ما نختبر العدد , ننقصه ونختبره........الخ

    الان ... نرى البرنامج مرة ثانية بارقام الاسطر :
    كود:
    SQL> declare 
      2  v number :=&v;
      3  flage number :=0;
      4  begin
      5  for i in 2..v loop
      6  for j in 2..i-1 loop
      7  if mod(i,j)=0 then flage:=1;exit;end if;end loop;
      8  if flage =0 then
      9  dbms_output.put_line(i||' is prima');
     10  end if;
     11  flage :=0;
     12  end loop;
     13  end; 
     14  /
    السطر الثاني :
    نعرف المتغيرالذي يحتوي على اعلى قيمة نريدها , وطبعا قيمته تساوي كم ؟ هي القيمة التي يدخلها المستخدم ..اعتقد اننا تكلمنا في هذا الموضوع .

    السطر الثالث :
    متغير flage وقيمته الابتدائية بصفر , وهو العلم ...لماذا هذا المتغير (العلم)؟ سترى ...

    السطر الخامس :
    بداية حلقة تكرار تنتهي فين ؟ في السطر الثاني عشر .... قرب نهاية البرنامج
    هذه الحلقة تكرر من 2 الى العدد الاقصى الي يدخله المستخدم , يعني تختبر من العدد 2 هل اولي او لا ... ثم تنتقل اوتوماتيكيا الى العدد الذي يليه وتختبره , ثم تنتقل للعدد الذي يلي يليه وتختبره .... وهكذا ...
    طبعا اقصد بـكلمة "تختبره" يعني تشوف هل هو اولي او لا , وذلك بالتأكد انها لا تقسم الا على نفسها او على الواحد .

    السطر السادس :
    بداية حلقة الاختبار والتي تنتهي في السطر السابع .... تبدأ بالقيمة 2 وتنتهي بالقيمة الحالية للإختبار ..
    ركز جيدا ... فهم البرامج (وخاصة ذوات حلقات التكرار ) تأتي بما يسمى بعملية التتبع tracing
    هذه من افضل واسوأ المهارات ... وهي الاكثر امتاع والاكثر ملل ...
    وصراحة الاكثر تعب في البرمجة , من ناحيتي اكرهها واقدر قوتها واهميتها .
    نعود لبرنامجنا ونقول من اين اتى المتغير i ؟؟ من حلقة التكرار السابقة ... والتي تبدأ من اثنين وتنتهي عند العدد v الذي ادخله المستخدم .
    يبدأ مثلا بالاثنين ... الان الـ i تساوي اثنين .... في السطر السادس الان .. نبدأ من الاثنين وننتهي الى الاثنين .
    بعد ان تنتهي هذه الحلقة ,اين يذهب مؤشر البرنامج ؟ اين سوف يقرأ البرنامج ؟؟سوف يرجع الى حلقة التكرار التي في السطر الخامس وسوف تزيد هذه الحلقة قيمة الـ i بواحد وتصبح في المرة الثانية ثلاثة .
    ونعيد الكرة بقيمة ثلاثة , في السطر السادس حلقة تكرار تختبر من الاثنين الى الثلاثة ....... الخ

    اذا لم تفهم لا تخف , سوف احاول بطريقة اخرى .

    السطر السابع :
    اذا باقي القسمة للمتغير i على المتغير j يساوي صفر فهذا يعني انه ليس أولي .
    ماهو المتغير j ؟ وكيف اتت هذه المعادلة ؟
    Mod(i,j) تعني باقي قسمة i على j
    والمتغير j هو القيمة الحالية لحلقة التكرار الثانية (السطر السادس)
    الان لو باقي قسمتهما يساوي صفر , فسوف تصبح قيمة العلم بواحد وسيخرج من حلقة التكرار الداخلية (التي تبدأ في السطر السادس).
    الان سوف تدور هذه الحلقة الداخلية , وتدور وتدور وتختبر باقي القسمة للعدد على الاعداد الاقل منه ,
    يعني اذا كانت الـ i تساوي 10 فسوف تختبر هذه الحلقة الداخلية مايلي :
    باقي 10/9 = 0 ؟ لا
    باقي 10/8 = 0 ؟ لا
    باقي 10/7 = 0 ؟ لا
    ....
    باقي 10/5 = 0 ؟ نعم .. اذن العلم (العلم هو المتغير flage)يساوي واحد (ومعناه انه ليس أولي)و اخرج من حلقة التكرار .

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

    يرجع البرنامج ويقرأ السطر الخامس ....أي حلقة التكرار الخارجية سيزود قيمة العشرة وتصبح احدى عشر.
    في الحلقة الداخلية سوف يحدث مايلي :
    باقي 11/10=0 ؟ لا
    باقي 11/9 =0 ؟ لا
    .....
    11/2=0؟ لا
    وطبعا العلم يساوي 0 الان ... أي انه لم تتغير قيمته ....
    سوف يرى هل العلم يساوي صفر ؟ طبعا نعم ... إذن أطبع "الاحدى عشر عدد أولي"

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


    إذا لم تفهم , فحاول أن تفهم هذا المثال عبر ملف الفلاش (رقم 17000) الذي سأرفقه

    الآن أريد أن أقول أن الرقم واحد اعتقد انه (في اغلب ظني ) عدد أولي . وبرنامجي هذا لا يعرضه ..
    فلو حبيت , حاول ان تعدل البرنامج لكي يعرض الواحد .

    انتهينا من حل التحديات في الدرس السابق , لذا نبدأ بدرس اليوم .

  4. #154
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء


    المصفوفات :
    ماهي المصفوفة يا ترى ؟ مجموعة متغيرات مرتبة .... فقط .... لماذا ؟ هنا القصة تطول قليلا ..
    المصفوفة عبارة عن متغيرات , مجرد متغيرات .
    لكن هذه المتغيرات مرقمة , وكأنها مفهرسة , وكأن بها عنوان . اليك مثال بسيطة
    A(0) :=10;
    A(1) :=5;
    A(2) :=6;
    كما شاهدنا , تحمل هذه المصفوفة نفس الاسم ! ولكنها مرقمة , يعني المتغير A والذي رقمه 0 به القيمة 10

    انتبه جيدا , بامكاني ابدأ درس اليوم مباشرة , ولكن لا اريد منك معرفة كيف ... بل اريد منك معرفة لماذا !
    يعني كيف نعمل مصفوفة .... هذه سهلة , اعطيك سطرين واحفظهم وطبق , ولكن لماذا ؟ هنا المصيبة !

    لماذا المصفوفة ؟
    لو مثلا قلت لك , اريد البرنامج ندخل به ارقام ويعرضها , ثم يعرضها ثانية وهي مضاعفة , ولكن يجب ان يكون ذو مواصفات كما يلي :
    - ان نطبع الاعداد المدخلة جميعها ....ثم نطبع الاعداد المدخلة مرة ثانية ولكن مضاعفة (العدد*2)
    - مع العلم انه في بداية البرنامج يطلب من المستخدم عدد الاعداد التي يدخلها فيه .. يعني اذا ادخل ثلاثة فيجب ان يكون هنالك ثلاث متغيرات , و يدخل في كل متغير عدد , ولو ادخل اربعة في البرنامج .. فيجب ان يكون هنالك اربع متغيرات .... وهكذا .

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

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

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

    - ان يطلب البرنامج من المستخدم ادخال عدد الاعداد , يعني لو قلنا انه ادخل ثلاثة , فيسمح البرنامج بان ندخل ثلاث قيم لثلاث متغيرات .. الم نقل انه يجب عمل متغيرات ؟
    طبعا يجب ان نخزن القيم في متغيرات , مثلا عملنا البرنامج , لو ادخل المستخدم اثنين , كم يلزمنا متغير ؟ طبعا متغيرين , لو ادخل ثلاثة , فيجب ان نعرف ثلاثة .... وهكذا . كيف نفعل ذلك ؟ كيف نجعل البرنامج ذكي ويعرف اوتوماتيكيا عدد المتغيرات ؟ هل يعقل ان نعرف a,b,c,d,e,f مثلا , و ادخل المستخدم عدد اكبر من المتغيرات التي عرفناها ؟ اذن المشكلة هي اننا في بعض الاحيان لا نعرف كم نحتاج متغير ! يعني يجب ان يكون هنالك تمدد في الكود بشكل اوتوماتيكي ! وهو شبه مستحيل بالنسبة لنا في هذه المرحلة !
    اعرف ان كلامي فيه غموض .. لأنك في اغلب الامر لا تعرف ماهي المصفوفة ...

    - ان يطبع البرنامج الاعداد مرتبة .. سواء تصاعديا او تنازليا على ان يكون البرنامج بسيط ولا يكون طويل ولا يتمدد ....

    هذه صعبة جدا , لماذا ؟ انا اخبرك ... ادخلنا ثلاث متغيرات , a , b , c .....
    ادخلنا ثلاث قيم .. كيف نعرف الاكبر منها او الاصغر ؟
    سوف ترى هل a اكبر من b و c ؟؟ اذا اكبر فيطبعها , ثم يرى الاكبر في الـ c و الـ b
    لو لم تكن الـ a اكبر , فسوف يرى هل الـ b اكبر قيمة , ثم يطبعها ويطبع الذي يليها ..... الخ
    اذا اردت ان تتطلع على الكود , فلن يسرك .. اقدر انه اكثر من ثلاثين سطر , وعملية مكررة ومتعبة وغبية ..
    هذه وهي ثلاث قيم , فما بالك بعشرين ؟؟ انها معقدة جدا جدا , ولا استغرب لو كلفنا الكود اكثر من مليارات الاسطر .. او اكثر !!
    طبعا انت لن تحس بالمشكلة حتى ترى الكود التالي ... ولا تحبط منه , فهو برنامج غبي جدا والمصفوفة حلت مشكلته في تمدد الكود :

    كود:
    declare
    a number ;
    b number ;
    c number ;
    begin 
    a:=&a;
    b:=&b;
    c:=&c;
    if a > b and a > c then
    dbms_output.put_line('the first:'||a);
    if b > c then
    dbms_output.put_line('the second:'||b);
    dbms_output.put_line('the third :'||c);
    else 
    dbms_output.put_line('the second:'||c);
    dbms_output.put_line('the third:'||b);
    end if ;
    else if b > a and b > c then
    dbms_output.put_line('the first:'||b);
    if a>c then
    dbms_output.put_line('the second:'||a);
    dbms_output.put_line('the third :'||c);
    else
    dbms_output.put_line('the second:'||c);
    dbms_output.put_line('the third:'||a);
    end if ;
    else 
    dbms_output.put_line('the first:'||c);
    if a>b then
    dbms_output.put_line('the second:'||a);
    dbms_output.put_line('the third :'||b);
    else 
    dbms_output.put_line('the second:'||b);
    dbms_output.put_line('the third :'||a);
    end if ;
    end if ;
    end if ;
    end ;
    /
    
    Enter value for a: 2
    old   6: a:=&a;
    new   6: a:=2;
    Enter value for b: 3
    old   7: b:=&b;
    new   7: b:=3;
    Enter value for c: 1
    old   8: c:=&c;
    new   8: c:=1;
    the first:3
    the second:2
    the third :1 

    ارجو رجاء خاص جدا ان تتمعن في البرنامج , اعرف انه طويل ولكنه غبي وساذج , لكن اريدك ان تعمل مثله لو استطعت .
    وكما تشاهد الكود قابل للتمدد بشكل مخيف .
    لو كان لدينا رقمين فالكود صغير جدا .. يوجد احتمالين .. اما ان الاول اكبر او الثاني اكبر ..
    لو كان لدينا ثلاث ارقام .. فالكود يتمدد كما شاهدنا .. ويوجد ست احتمالات .... (1*2*3)
    ولو كان لدينا عشر ارقام , فيوجد لدينا 3628800 احتمال !! (1*2*3*4*5*6*7*8*9*10)

    الان ... انتهت هذه المناقشة التي اعتقد انك لم تنتفع منها .
    بعد هذا الدرس , اذا كنت راغب في تضخيم عقلك ومنطقك , فأعد قراءة السطور السابقة (ولكن بعد الدرس )
    الان...
    ماهي المصفوفة وكيف نعملها :
    قلنا من قبل ان المصفوفة عبارة عن متغيرات , مجرد متغيرات .
    لكن هذه المتغيرات مرقمة , وكأنها مفهرسة , وكأن بها عنوان .
    رأيت مثال لم تفهمه في اغلب الامر .
    سوف اعطيك برنامج سهل , وهو يخزن ثلاث ارقام في مصفوفة , ويقوم بطباعتها :

    كود:
    declare
    type t1 is table of number index by binary_integer ;
    A t1;
    begin
    A(0):=0;
    A(1):=5;
    A(2):=8;
    dbms_output.put_line(A(0)||' '||A(1)||' '||A(2));
    end;
    /
    
    المخرجات
    0 5 8
    في السطر الثاني , سطر طويل وغريب , في السطر الثالث كذلك ...
    لتعريف مصفوفة .. أولا نعرف نوع المصفوفة , كيف ؟ نقول "لا نريد يا أوراكل نوع رقمي , أو حرفي أو تاريخي ... نريد نوع جديد يدعى بمصفوفة أعداد.. لا اريد مصفوفة حروف , ولا مصفوفة تاريخ .. بل مصفوفة اعداد !! "
    في السطر الثالث كما شاهدنا type أي عرف نوع جديد ... اسم هذا النوع بـ t1 .... الان t1 صار نوع جديد مثل الـ number و الـ date ..... وباقي الانواع . فهمت ؟
    الان ما مواصفات هذا النوع ؟ is table of number يعني مصفوفة عددية , يخزن به اعداد يعني .
    طبعا ستكون مجموعة متغيرات متشابهة في الشكل , وكل متغير فيها نوعه ماذا ؟ طبعا رقم ! انتبه جيدا .
    لو اردنا نصوص ؟ هكذا is table of varchar2(15) يعني مصفوفة نصية , لكل متغير فيها يحمل بداخله 15 حرف ! ... فهمت ؟
    يقول في السطر الثاني :
    Index by binary_integer تعني انها مرقمة ومفهرسة باعداد ... سوف تعرف هذه النقطة بعد قليل .

    السطر الثالث :
    الان لدينا نوع اسمه t1 , هذا النوع مثله مثل التاريخ , والاعداد ....
    هذا النوع يعتبر عدد , ولكن مجموعة متغيرات (مصفوفة) عددية .. وليست واحدة فقط , يعني بالامكان تكون متغير واحد او اثنين او عشرة او عشرين ...... الخ , فكما ترى ان مشكلة "عدم معرفة عدد المتغيرات" قد انتهت وماتت كما ستشاهد بعد قليل .
    لدينا نوع , ولكن لا يوجد متغير لهذا النوع .... في السطر الثالث عرفنا متغير يدعى بـ A , و نوعه "مصفوفة عددية" !! فهمت ؟

    السطر الخامس والسادس والسابع :
    كما نشاهد .. ان المتغير A هو مصفوفة , هو صحيح متغير واحد ولكن به عدد غير معلوم من المتغيرات العددية ! الان استخدمنا هذا المتغير المرقم , وكما قلنا انه مفهرس باعداد (index by binary_integer ) لو قلنا انه مفهرس بحروف او نصوص (index by varchar(3)) فسوف يكون شكل هذه السطور هكذا :
    A(abc):=1;
    A(gfd):=2;
    A(ef):=3;
    وطبعا لكل استعمالاته , واكثر الاستعمالات مع المرقمة طبعا .
    الان تخيل معي المصفوفة الحالية A : (صورة 1701)


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


    كود:
    declare
    type t1 is table of number index by binary_integer;
    A t1;
    begin
    A(0):=0;
    A(1):=5;
    A(2):=8;
    dbms_output.put_line(A(0)||' '||A(1)||' '||A(3));
    end;
    /
    نفس البرنامج ولكن في سطر الطباعة استخدمنا المتغير A والذي عنوانه رقم ثلاثة .
    نحن وضعنا قيم في العناوين 0 و 1 و 2 ... ولكن لم نضع في الرقم ثلاثة ... اليك الخطأ .
    كود:
    ERROR at line 1:
    ORA-01403: no data found
    ORA-06512: at line 8
    يقول انه لا يوجد بيانات ... صادق يا اوراكل .

  5. #155
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    دعنا نعقد قليلا الامور .... انظر الى مصفوفتين عدديتين مختلفتين :

    كود:
    SQL> declare
      2  type t1 is table of number index by binary_integer ;
      3  A t1;
      4  B t1;
      5  begin
      6  A(0):=2;
      7  A(1):=5;
      8  B(-4):=33;
      9  B(20):=41;
    10  dbms_output.put_line(A(0)||' '||A(1)||' '||B(-4)||' '||B(20));
     11  end;
     12  /
    
    
    2 5 33 41
    فقط لا جديد سوى انني اريد ايصال فكرة متغير ونوع مصفوفة .
    نوع المصفوفة العددية هي t1 , بامكاننا ان نعمل عدد من المتغيرات , انا عملت متغيرين من نوع t1 , الاول يدعى بـ A والاخر يدعى بـ B .
    شاهد البرنامج والنتيجة , واعتقد انه لايوجد أي صعوبة في فهمها .
    كود:
    
    


    الان لنرى برنامج يدخل الاعداد من 0 وحتى رقم يدخله المستخدم , سوف ترى كيف اننا لن نكون ثابتين في عدد معين من المتغيرات , يعني بكلمة اخرى ديناميكية وليست ثابتة ,, شخصيا احب الديناميكية في كل البرامج , والتي تتغير على حسب الظروف , لو عشت لأمد ابعد وصادفت برمجة الانترنت والمواقع الديناميكية سوف تقدر معنى الديناميكية في البرمجة بشكل عام .

    البرنامج ناتجه هكذا :
    كود:
    Enter value for number: 3
    old   4: v number :=&Number;
    new   4: v number :=3;
    1 :1
    2 :2
    3 :3
    1*2 :2
    2*2 :4
    3*2 :6 
    ولو ادخلنا مثلا قيمة غير الثلاثة سوف يكون ناتجه ما يلي :
    كود:
    Enter value for number: 5
    old   4: v number :=&Number;
    new   4: v number :=5;
    1 :1
    2 :2
    3 :3
    4 :4
    5 :5
    1*2 :2
    2*2 :4
    3*2 :6
    4*2 :8
    5*2 :10
    هل تعرف ان تبرمج هذا البرنامج ؟
    بالمصفوفة طبعا ...
    فكر قليلا ....واليك البرنامج :
    كود:
    declare
    type t1 is table of number index by binary_integer ;
    A t1;
    v number :=&Number;
    begin
    for i in 1..v loop
    A(i):=i;
    end loop ;
    for i in 1..v loop
    dbms_output.put_line(i||' :'||A(i));
    end loop ;
    for i in 1..v loop
    dbms_output.put_line(i||'*2 :'||A(i)*2);
    end loop;
    end;
    /
    السطر السادس الى الثامن :
    حلقة تكرار من الواحد وحتى الـ v الذي ادخله المستخدم ... يدخل قيم عددية في المتغير A
    طبعا على حسب ما ادخله المستخدم , سوف ندخل اعداد , وكأننا وضعنا متغيرات ديناميكية .
    يعني لو ادخل ثلاثة فكأنما عرفنا ثلاثة متغيرات فقط ! ولو ادخل اكثر فسوف يتم تعريف متغيرات اكثر , وعلى حسب ما ترغب , ستشاهد هذه الديناميكية الرائعة (عدد غير معلوم من المتغيرات).

    السطر التاسع الى الاحد عشر :
    نريد طباعتهم .... مع ملاحظة عدد المتغيرات الان v , أي اننا لا نعرف عددهم , على حسب ما يدخله المستخدم .

    السطر الثاني عشر الى السطر الرابع عشر :
    حلقة تكرار ثالثة لطباعة هذه الاعداد في المصفوفة بشكل مضاعف , لاحظ الـ reuseability او ما يسموه باعادة الاستخدام , هنا تكمن قوة المتغيرات , وهنا ايضا تكمن قوة المصفوفة , جميلة هذه الخاصية (اعادة الاستخدام) فلقد احتجنا قيم المصفوفة مرة اخرى .

    دوال المصفوفات :
    هل تذكر كلمة "دوال"؟
    لا اذكر ما قلت ولكن ... هي جزء برمجي , له وظيفة معينة ....
    للمصفوفات بعض الدوال المساعدة والتي سنرى بعض منها الان .
    قبل البدء سوف تجدني اقول بعض الاحيان عنصر المصفوفة , فما معنى عنصر element ؟
    اقصد بذلك لو عندنا مصفوفة وبها ثلاث قيم , يعني ان بها ثلاث عناصر , والعناصر هي المتغيرات الموجودة بالمصفوفة ذات القيم .... هل فهمت ؟
    وهنالك شيء اخر اعتقد انك نسيته في اغلب الظن , وهو مدخل الدالة ومخرج الدالة ...
    مدخل الدالة argument هل القيم التي بين أقواس الدالة واعتقد انني تكلمت كثيرا عنها , اما مخرج الدالة هو النتيجة المرجوة من الدالة . راجع دروسي السابقة لو نسيت .
    انظر الى الدوال , سوف اشرحها بشكل مبسط , وسوف اعطيك مثال كبيييييير وشامل عليها كلها , وسوف اعطيك تلخيص (صورة) شامل للكل ...

    EXISTS : هذه تخبرنا اذا كان العنصر الفلاني موجود او لا .. كيف ؟
    . نعطي هذه الدالة مدخل (وهو العنوان او الفهرس) وتخبرنا هل يوجد بيانات او لا .. سوف تعطينا نتيجة false اذا لا يوجد شيء , وtrue اذا وجدت .

    COUNT
    هذه توجد عدد العناصر بالمصفوفة ....

    FIRST
    هذه توجد فهرس (انتبه فهرس !) اول عنصر بالمصفوفة ...

    LAST
    هذه توجد فهرس اخر عنصر بالمصفوفة ...

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

    NEXT
    اعطيها مدخل (فهرس) لعنصر ما في المصفوفة , وسوف تعطيك فهرس العنصر التالي لفهرس لعنصر المدخل

    TRIM
    هذه دالة لم تعمل معي , ولكن يقولون انها تحذف اخر عنصر من المصفوفة .. غبية هذه الدالة ولا احبها , وستعرف لماذا .

    DELETE
    هذه الدالة هي الافضل للحذف , اعطيها مدخل (رقم الفهرس) وستحذف القيمة التي به ..
    او بامكانك ان لا تعطيها أي مدخل , فسوف تحذف كل العناصر (كل القيم الموجودة بالمصفوفة ) وتصبح كأنها مصفوفة فارغة .
    الان انظر الى الصورة رقم 1702 , اعتقد انها واضحة ان شاء الله .. (صورة كبيرة نسبيا .. 200 كيلوبايت )


    الان اليك مثال برنامج عن هذه الدوال , البرنامج طويل , ثلاثين سطر تقريبا , يجب عليك ان تقرأه .
    بامكاني اعطائك امثلة صغيرة لكل دالة , ولكن تعمدت اعطائك مثال كبير قليلا لكي تتعود ان تشاهد البرامج الكبيرة ذات الاسطر .... :
    كود:
    declare
      type t1 is table of number index by binary_integer ;
      A t1;
    begin
      A(-5):=87;
      A(-2):=14;
      A(0):=47;
      A(1):=50;
      A(2):=13;
    dbms_output.put_line('the elements is :'||A(-5)||','||A(-2)||','||A(0)||','||A(1)||','||A(2));
    dbms_output.put_line('the number of elements now :'||A.COUNT);
    dbms_output.put_line('the index of first element is :'||A.first||' ,its value:'||A(A.first));
    dbms_output.put_line('the index of last element is  :'||A.last||' ,its value:'||A(A.last));
    dbms_output.put_line('the index of next element of A(-5) is :'||A.NEXT(-5)||' ,its value:'||A(A.NEXT(-5)));
     dbms_output.put_line('the index of prior element of A(0) is :'||A.PRIOR(0)||' ,its value:'||A(A.PRIOR(0)));
     dbms_output.put_line('-----------------------------------------------------');
     if A.EXISTS(0) then
     dbms_output.put_line('A(0) is exist befor delete');
     else 
     dbms_output.put_line('A(0) is not exist befor delete');
     end if ;
     A.DELETE(0);
     if A.EXISTS(0) then
     dbms_output.put_line('A(0) is exist after A.DELETE(0)');
     else 
     dbms_output.put_line('A(0) is not exist after A.DELETE(0)');
     end if ;
     A.DELETE;
     dbms_output.put_line('the number of elements after A.DELETE is :'||A.COUNT);
     end;
     /

    تتبع البرنامج وحاول ان تكتب وتخمن ما هي النتائج لهذا البرنامج ..
    وهذا تحدي بسيط (التحدي الاول), بدون استخدام البرنامج ... اكرر بدون استخدام البرنامج اريك ان تقرأ الكود السابق وان تطبع لي النتيجة (أي تتبع البرنامج trace the code) كما قرأته مع شرح هذه النتيجة لما ظهرت هكذا ... ارجوا ان لا تطبق البرنامج قبل ان ترى نتيجتك , واي سؤال انا حاضر .

  6. #156
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    الان هنالك بعض الامور المهمة جدا جدا واريدك ان تدركها .
    فستجد في السطر العاشر من الكود السابق انني عرضت كل العناصر الموجودة في المصفوفة , كما تشاهد بعض الاحيان لا نقول هكذا :
    A(1):=95;
    A(2):=90;
    A(3):=87;
    ….الخ
    بل سنجد بعض الاحيان انه لا يوجد ترتيب في فهارس (عناوين) العناصر , لماذا ؟ تخيل اننا نريد ان نحذف العنصر ذو الفهرس رقم اثنين :
    A.DELETE(2);
    الان قلي ما هي عناصر المصفوفة الان ؟ ستصبح كما يلي :
    A(1):=95;
    A(3):=87;
    ….الخ
    طبعا انحذف العنصر ذو العنوان رقم 2 , هو موجود في الحقيقة , ولكن بهذه الصيغة (انتبه جيدا ):
    A(1):=95;
    A(2):=NULL;
    A(3):=87;
    ….الخ
    قيمة خالية , سوف يجدها قيمة خالية ويتجاهلها , ارجو ان تكون هذه النقطة واضحة .
    الان بعض الاحيان لا نستطيع ان نعرف أي من العناصر موجودة في المصفوفة او لا , لذا فهذه الدوال مهمتها عمل ذلك , قبل ان تقرأ البرنامج اريد ان اقول لك ... اننا نعامل أي مصفوفة على اساس اننا لا نعرف كم عنصر بداخلها , اغلب الاحيان اننا لا نعرف كم عنصر , وهي حقيقة .
    انظر الى البرنامج التالي وهو برنامج يطبع لنا جميع العناصر في مصفوفة معينة :
    كود:
    declare
    type t1 is table of number index by binary_integer ;
    A t1;
    v number ;
    begin
    A(-5):=87;
    A(1):=50;
    A(2):=13;
    A(-2):=14;
    A(0):=47;
    v:=A.first;
    loop
    dbms_output.put_line(A(v));
    v:=A.next(v);
    if v = A.last then
    dbms_output.put_line(A(v)); exit; end if ;
    end loop;
    end;
    / 
    اليك النتيجة :
    كود:
    87
    14
    47
    50
    13
    النتيجة مرتبة على حسب ارقام الفهارس من الفهرس الاصغر الى الفهرس الاكبر , صح ؟
    انظر , تأكد ... ستجد انه عرض A(-5) اولا ثم A(-2) ....... الخ
    نبدأ بشرح البرنامج السابق ... انظر الى البرنامج السابق ولكن مرقم :
    كود:
    SQL> declare
      2  type t1 is table of number index by binary_integer ;
      3  A t1;
      4  v number ;
      5  begin
      6  A(-5):=87;
      7  A(1):=50;
      8  A(2):=13;
      9  A(-2):=14;
     10  A(0):=47;
     11  v:=A.first;
     12  loop
     13  dbms_output.put_line(A(v));
     14  v:=A.next(v);
     15  if v = A.last then
     16  dbms_output.put_line(A(v)); exit; end if ;
     17  end loop;
     18  end;
     19  /
    السطر السادس الى التاسع :
    عادي , وضعنا بعض القيم العشوائية في فهارس عشوائية .

    السطر الحادي عشر :
    طبعا يوجد لدينا هذا المتغير v الذي عرفناه في السطر الرابع , وهو رقمي ...
    وضعنا في هذا المتغير القيمة A.first ... ما معنى هذه القيمة او ماذا ستعطينا هذه الدالة ؟ سوف تعطينا فهرس اول عنصر في المصفوفة , هذه الدالة عظيمة , نحن كما قلت سابقا لا نعرف في بعض الاحيان ماهي العناصر الموجودة وكم عددها وأي منها الاولى وأي منها الاخيرة , وحل هذه المعضلات هي دوال المصفوفات ..
    طبعا في هذا المثال نجد ان فهرس اول عنصر هو -5 !!

    السطر الثاني عشر الى السابع عشر ...
    تكرار ....

    في السطر الثالث عشر :
    سوف يطبع A(V) , انتبه معي ,, ماهي قيمة v الان في بداية حلقة التكرار ؟
    قيمتها هي "فهرس اول عنصر في المصفوفة A " صح ؟ سوف يطبع اول عنصر اذن

    السطر الرابع عشر :
    انتقل الى العنصر التالي ... كيف ؟ كما تشاهد دالة رهيبة هنا , تعطينا فهرس العنصر التالي لعنصر ما ... ماهو قصدي من عنصر ما ؟ هنا في المثال قلنا A.NEXT(v) يعني اعطيني فهرس العنصر التالي للفهرس v ..
    و v بها الان الرقم -5 , ماهو قيمتها الان ؟ كما يلي :
    v:= A.NEXT(v);
    v:= A.NEXT(-5);
    v:= -2 ;
    وهكذا انتقل الى العنصر التالي , ولاحظ كيف رتبها اوتوماتيكيا ! اذ انه بدأ بـ -5 , ثم -2 , ثم 0 , ثم 1 ..... الخ
    يعني بالاصغر الى الاكبر ..

    السطر الخامس عشر والسادس عشر :
    اذا كانت v هي قيمة اخر عنصر ... اطبع هذا العنصر الاخير واخرج من حلقة التكرار ..

    كما ترى , البرنامج جميل , ومنطقي , وذكي , فحاول ان تفهمه بعمق شديد ثم حاول ان تتعلم كيف تتبع هذا البرنامج وغيره من البرامج جيدا , اعملها على ورق , واعمل كما عملت لك في عرض الفلاش ..


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

    كود:
    A(-8) :  87
    A(-1) : 14
    A(2) : 47
    A(44): 50
    A(49): 13
    - - - - - - -
    تحدي اخر وسهل جدا (التحدي الثالث) ,
    اريد عرض العناصر لمصفوفة ما , ولكن بالمقلوب , يعني من العنصر الاخير الى الاول .

    اليك برنامج نفس برنامجنا السابق ولكن يوجد تغيير بسيط في حلقة التكرار , وهو تسهيل اكثر :
    كود:
    declare
    type t1 is table of number index by binary_integer ;
    A t1;
    v number ;
    begin
    A(-5):=87;
    A(1):=50;
    A(2):=13;
    A(-2):=14;
    A(0):=47;
    v:=A.first;
    while v is not null loop
    dbms_output.put_line(A(v));
    v:=A.next(v);
    end loop;
    end;
    / 

    انظر الى البرنامج التالي هو برنامج يعرض لنا عناصر مصفوفة ولكن ليست مصفوفة عددية !
    بل مصفوفة غريبة علينا , مصفوفة نصية , ومفهرسة بالنص وليس بالعدد ! :
    كود:
    declare
    idx varchar2(20);
    type word_list is table of varchar2(15) index by idx%type;
    the_list word_list;
    begin
    the_list('ahmad'):='dentist';
    the_list('abdullah'):='teacher';
    the_list('saad'):='doctor';
    the_list('osama'):='salesman';
    idx := the_list.First();
    while idx is not null loop
    Dbms_Output.Put_line (idx || ' : ' || the_list(idx) );
    idx := the_list.Next(idx);
    end loop;
    end;
    /

    المخرجات
    كود:
    abdullah : teacher
    ahmad : dentist
    osama : salesman
    saad : doctor
    البرنامج غريب جدا , في السطر الثاني عرفنا متغير نصي حده عشرين حرف ,
    السطر الثالث عرفنا نوع مصفوفة تدعى بـ word_list هذه المصفوفة نصية وحدها 15 حرف لكل عنصر .
    الغريب انها ليست مفهرسة بأعداد ! بل مفهرسة بنفس نوع المتغير idx ,, هل فهمت النقطة !
    يعني الجملة index by idx%type تعني "يا اوراكل !! لا تفهرس المصفوفة بعدد او تاريخ ..... بل فهرس المصفوفة بنفس نوع المتغير idx "
    سوف يرى الاوراكل ماهو نوع هذا المتغير , ويجده نصي حده 20 حرف !
    لم تفهم ؟ لا تخف ..
    السطر الرابع :
    عرفنا متغير نوعه مصفوفة نصية مفهرسة نصيا .
    في السطور من السطر السادس الى التاسع :
    ستجد شيء غريب , وهو ما كنا نقصد ! المصفوفة فهرسها نصي ... وكما قلنا يصل هذا النص الى 20 حرف ..
    يعني لو قلنا :
    The_list('abc'):='???';
    صحيح ..
    ولو قلنا :
    The_list('asdfghjklzxcvbnmqwerty'):='???';
    فهذا خطأ , لأن الفهرس تعدى حده (يوجد اكثر من عشرين حرف)!
    تخيل رسمتنا رقم 1701 , ولكن بهذه الفهرسة النصية , وبالعناصر النصية ... اعتقد انه لا مشكلة انظر الى الصورة 1703




  7. #157
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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

    السطر العاشر , وضعنا فهرس اول مصفوفة (كما قلنا الفهرس نصي) في هذا المتغير النصي ...
    مع ملاحظة انهما نفس النوع ونفس الحد !

    السطر الحادي عشر
    طالما ان المتغير ليس فارغ , كرر ...

    السطر الثاني عشر اطبع فهرس العنصر الحالي + قيمة العنصر الحالي

    السطر الثالث عشر :
    ضع فهرس العنصر التالي للعنصر الذي فهرسه idx في المتغير idx .... ركز في ما قلت ..

    الان سوف تتكرر هذه المسئلة حتى تنتهي عناصر المصفوفة , لكن هل فكرت .... أي عنصر هو الاول ؟ انظر الصورة 1703 مرة ثانية ..

    ستجد اننا وضعنا قيم عشوائية وفهارس بشكل غير مرتب , وهو اوتوماتيكيا رتبها !
    لو انها ارقام لكان الامر هين , ولكن هذه حروف .. كيف رتب الحروف ؟ بسيطة ...
    سوف يرتبها على حسب ترتيب الحروف , مثلا لو واجهنا هذين الفهرسين ...
    Abdullah , ahmad ايهما الاول ؟ كلاهما يبدأ بالحرف a , اذن .. ننظر في الحرف الثاني ..
    Abdullah حرفه الثاني هو b , و ahmad حرفه الثاني هو h ... وهكذا ,,,
    اذن ترتيب Abdullah هو اولا ثم ahmad ... ارجوا ان تكون الصورة واضحة وسهلة , فهذه الطريقة موجودة في قواميسنا وبعضنا لا يعرف ذلك ...

    الان رأينا المصفوفات عن قرب , ولا ادري بعضكم لم يفهم فيها شيء , ولا ادري هل فهم بعضكم فكرتها , ولكن ارى ان المصفوفة حلت مشاكل جمة , ومنها :
    - انها سهلت كتابة الكود بشكل رائع , واختصرته بشكل جميل ... طبعا لن تشعر بهذه النقطة حتى ترى المصفوفات الضخمة جدا !
    - المصفوفة كالمتغيرات لها فائدة في اعادة الاستخدام لمجموعة قيم كبيرة , ولكن بطريقة سهلة .
    - المصفوفة تجعل الكود البرمجي لا يتمدد لأننا سنضطر احيانا تعريف عدد غير معلوم من المتغيرات , وسنرى بعد قليل كيف حلت المصفوفة هذه المسألة (اقصد من المسئلة هي ترتيب البيانات!) .

    هذه بعض مما ذكرنا , ولا ادري يوجد غيرها او لا .. لما لا ....

    الان اليك التحدي الرابع !!
    تتبع البرنامج التالي واعطيني نتيجته (مخرجاته output ) بدون تنفيذه (يعني نفذه في عقلك وتوقع النتائج)
    ارجوا الاتشغله حتى تضع تخمينك ...

    كود:
    declare
    type t1 is table of number index by binary_integer ;
    A t1;
    B t1;
    begin
    for i in 0..10 loop
    A(i):=i*5;
    end loop;
    for i in 0 ..10 loop 
    B(i):=A(10-i);
    end loop ;
    dbms_output.put_line('B  ,   A');
    for i in 0..10 loop
    dbms_output.put_line(B(i)||' , '||A(i));
    end loop;
    end;
    /
    ..
    وهذا التحدي الخامس... ذو الصعوبة القصوى :
    اريد منك ان تعمل برنامج , تدخل هذه القيم في مصفوفة ما :

    A(-12):=78;
    A(-11):=1;
    A(-4):=11;
    A(0):=45;
    A(5):=-23;
    A(14):=61;
    A(99):=30;
    البرنامج سيرتب المصفوفة كما يلي :
    A(-12) =-23
    A(-11) =1
    A(-4) =11
    A(0) =30
    A(5) =45
    A(14) =61
    A(99) =78
    طبعا اجعل البرنامج يطبع عناصر المصفوفة بعد الترتيب .... ولاحظ اننا رتبنا "قيم" المصفوفة تصاعديا !
    وايضا لو اردت ان تدخل أي قيم اخرى واي عدد من العناصر من المفترض ان البرنامج يقبل بترتيب ذلك !
    هذا التحدي صعب جدا ويحتاج لتقنيات في الترتيب , حاول ان تعمل فكرة البرنامج على ورق .
    لا تخف اذا لم تستطع حله , فهو فعلا صعب .

    الان سوف افترض انك فهمت ولو جزء بسيط في ما يسمى بـ"المصفوفة" , كل ما قلته في هذا الدرس مجرد افكار عن المصفوفة والتي تنفعك حتى في اللغات الاخرى (باختلافات بسيطة او كبيرة) .

    الان اريد بعض تطبيقات المصفوفة في لغتنا هذه , وهي التطبيقات التي افترضها حقيقية !
    انظر الى هذا المثال :
    اعمل الجدول التالي مع اضافة سجلات :
    كود:
    create table emp_1 
    (empno number , ename varchar(20) , sal number );
    
    insert into emp_1 values (100 , 'any_1' , 1000);
    insert into emp_1 values (101 , 'any_2', 2000);
    insert into emp_1 values (102 , 'any_3',2500);
    insert into emp_1 values (103 , 'any_4',2750);
    انظر الى الجدول الان :

    كود:
    SQL> select * from emp_1;
    
    EMPNO           ENAME                        SAL
    ----------            --------------------           ----------
           100           any_1                          1000
           101           any_2                           2000
           102           any_3                           2500
           103           any_4                           2750 
    كما شاهدنا الجدول , نلاحظ ان الارقام متتالية (مجرد افتراض)...
    الان هذا البرنامج يأخذ البيانات من الجدول ويخزنها في مصفوفة , وطبعا نعرض ما بداخل المصفوفة :

    كود:
    declare 
    type t_array is table of emp_1%rowtype index by binary_integer ;
    arr t_array ;
    v_count number :=103;
    begin 
    for i in 100 .. v_count loop
    select * into arr(i) from emp_1 where empno=i;
    end loop;
    for i in arr.first .. arr.last loop
    dbms_output.put_line('the no:'||arr(i).empno);
    dbms_output.put_line('the name:'||arr(i).ename);
    dbms_output.put_line('the sal :'||arr(i).sal);
    dbms_output.put_line('----------------------');
    end loop ;
    end;
    /
    هنالك شيء جديد في درسنا , في السطر الثاني عرفنا مصفوفة نوعها رقمي ؟ نصي ؟ لا !
    بل نوعها "نفس نوع سجل الجدول emp_1" !!
    يعني مصفوفة من سجلات , مجموعة سجلات , يعني كأنها تخزن جدول كامل !
    هل متخيل الوضع ؟
    ومفهرسة بالارقام .
    السطر الرابع عرفنا متغير , مجرد متغير وبه قيمة اكبر رقم موظف في جدولنا ... مجرد مثال .
    السطر السادس : تكرار على حسب عدد الصفوف (السجلات... الموظفين ....الخ) في الجدول ..
    السطر السابع : جملة استعلام , وضعنا ناتجها في المتغير arr(i) .... يعني تخيل ان الـ i=100 مثلا ..
    فان ناتج الاستعلام سيكون :
    100 any_1 1000
    طبعا سوف يخزن في العنصر arr(100) .. كيف ؟ هكذا :
    Arr(100).empno:=100
    Arr(100).ename='any_1'
    Arr(100).sal:=1000
    هل فهمت ؟ وطبعا في التكرار الثاني ...سيكون ناتج الاستعلام :
    101 any_2 2000

    وسيخزن النتيجة في العنصر arr(101) كما يلي :
    arr (101).empno:=101;
    arr (101).ename:='any_2';
    arr (101).sal:=2000;
    وهكذا ...
    انظر الصورة 1704
    انظر الى الفهرسة الرقمية , عادية جدا ,
    ولكن انظر الى العنصر نفسه ! ليس عنصر واحد !! بل عنصر مركب , قيمة مركبة من ثلاث قيم ...
    كما تشاهد لو اردنا قيمة ما , فإننا ننادي اسم المصفوفة و عنوانها (فهرسها ) ومن ثم نقطة ثم اسم المتغير الداخلي

    السطور الخاصة بالطباعة , انظر اليها جيدا , وحاول ان تفهمها من الصورة او من البرنامج .
    انظر الى المخرجات :
    كود:
    the no:100
    the name:any_1
    the sal :1000
    ----------------------
    the no:101
    the name:any_2
    the sal :2000
    ----------------------
    the no:102
    the name:any_3
    the sal :2500
    ----------------------
    the no:103
    the name:any_4
    the sal :2750
    ----------------------

    اعتقد ان درس اليوم اقد انتهى , على امل ان نلتقي ثانية ...

  8. #158
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    اوه سوووري ..... ملف الفلاش (عرض الفلاش 17001)
    سوري انه مش عربي ..
    وسوري على انجليزيتي الضعيفة
    وسوري على سوء الديزاين ... بس والله ياخذو وقت .... اهم شي توصيل فكرة ما ....

    اي استفسار على الفلاش .... تل مي ^^

  9. #159
    التسجيل
    06-12-2005
    المشاركات
    8

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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

    اخوك محمد علي ياسين
    www.MuhammadYassein@yahoo.com
    ww.MuhammadYassein@Hotmail.com
    www.MuhammadYassein@Gmail.com

  10. #160
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    حياك الله تسلم ,,,
    انشر العلم , للفائدة ^^


    واي استفسار ... يوجد موضوع استفسارات اوراكل في منتدى البرمجة هذا ^^

  11. #161
    التسجيل
    13-04-2005
    المشاركات
    1

    Lightbulb رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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

    هل هناك ملف اكروبارت او ملف ورد للدوره كامله حيث لا استطيع مشاهده الصور في الشرح وكذلك طبيعة عملي لاتسمح لي بتواصل معكم بستمرار
    الله يساعدتكم الدوام عندنا 28 يوم في البر و اسبوع عند اهل اريد ان استفيد من هذه الدوروانا في مقر عملي مع الشكر والتقدير الى الاستاذ معد الدورة وجميع الاعضاء
    ممكن مساعدة بالحصول على ملف الدور كاملا بشكل ملف او ملفات من الورد او الاكروبارت
    شاكر ومقدر لكم هذا
    دمتم في حفظ الله

    اخوكم / بومحمد

  12. #162
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

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


    الشغلة مطولة , يعني انا والله مش فاضي
    والدروس يبغالها ثلاث الى اربع اشهر اعيد كتابتها بشكل افضل
    والله يعينك لازم تنتظر او .... سامحنا عاد


    ان شاء الله لكل درس اطرح ملف اكروباد او وورد

    موفق ,,

  13. #163
    التسجيل
    24-02-2007
    المشاركات
    1

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    مراقبنا العزيز ما زلت منتظر الدروس المنقحه
    والله ثم و الله اني في امس الحاجه ليها

  14. #164
    التسجيل
    26-07-2005
    الدولة
    Australia
    المشاركات
    3,368

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    السلام عليكم

    اجواد ... اخي ...
    اسف على الاطالة لكن ..... ظروفي مازالت قاهرة
    انتظر اخي شويتين .... لعلي اتغلب على الظروف ...
    واسف جدا جدا على المماطلة .

  15. #165
    التسجيل
    07-12-2005
    الدولة
    المغـــرب
    المشاركات
    202

    رد: الطريق لاحتراف الاوراكل .. دورة مطوري اوراكل .. من الالف الى الياء

    لو تضع ىملف وورد او pdf احسن اخي وبارك الله فيك

صفحة 11 من 12 الأولىالأولى ... 6789101112 الأخيرةالأخيرة

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •