ديسمبر 062011
 

في هذا الدرس سيتم شرح طريقة استقبال مدخلات من المستخدم ومعالجتها في البرنامج، هذا الدرس قد يتطلب مراجعة الدروس السابقة في قسم دروس C.

في لغة C نستخدم الدالة scanf لإدخال قيمة معينة لمتغير عبر المستخدم، وطريقة استخدامها:

scanf(type, variable);

الشطر الأول type: ويقصد به نوع المتغير سواء كان عددًا صحيح، أو حرف وإلخ..

الشطر الثاني variable: اسم المتغير، لكن مسبوقًا بـ&

مثال:

float a;
scanf("%f", &a);

سيتم تقسيم الدرس قسمين، وثالث متفرع من الثاني لتسهيل تتبع الدرس.

أولًا: الادخال البسيط:

في هذا الشطر سنقوم بتخزين المدخلات في متغيرات بسيطة، مثلا نخزن الرقم 5 في المتغير a و 2 في المتغير b وهكذا، هذا مثال مع الشرح:

#include<stdio.h>
main()
{
    /* *****************************************************
    *  تعريف المتغيرات المستخدمة                           *
    *  number1: لتخزين الرقم الأول                          *
    *  number2: لتخزين الرقم الثاني                        *
    *  sum: لتخزين حاصل جمع الرقم الأول مع الثاني           *
    ****************************************************** */
    int number1, number2, sum;
    // طباعة رسالة لطلب ادخال رقمين
    printf("Enter 2 numbers: ");
    /* ***************************************************************
    *  scanf(): هي  دالة لاستقبال مدخلة من قبل المستخدم               *
    *  %d: هنا تك نوع المتغير، وهنا تم تحديده كعدد صحيح              *
    *  &: يستخدم هذا الرمز قبل اسم المتغير لتتم تخزين البيانات به    *
    **************************************************************** */
    scanf("%d", &number1);
    scanf("%d", &number2);
    // عملية الجمع الاعتيادية
    sum = number1 + number2;
    //طباعة النتائج، لاحظ طريقة الكتابة
    printf("Sum of %d + %d = %d", number1, number2, sum);
}

ثانيا: الادخال إلى مصفوفة:

الجزء 1 من 2: الادخال لمصفوفة مباشرة:

المثال مع الشرح:

#include<stdio.h>
main()
{
    /* *****************************************************
    *  تعريف المتغيرات المستخدمة                           *
    *  numbers: مصفوفة بطول 3، لتخزين الأرقام               *
    *  sum: تخزين حاصل جمع المتغيرات الثلاثة                *
    ****************************************************** */
    int numbers[3], sum;
    // رسالة طلب ادخال 3 أرقام
    printf("Enter 3 numbers: ");
    // الادخال للخانة الأولى من المصفوفة
    scanf("%d", &numbers[0]);
    // الادخال للخانة الثانية من المصفوفة
    scanf("%d", &numbers[1]);
    // الادخال للخانة الثالثة من المصفوفة
    scanf("%d", &numbers[2]);
    // عملية الجمع الاعتيادية
    sum = numbers[0] + numbers[1] + numbers[2];
    printf("Sum of %d + %d + %d = %d", numbers[0], numbers[1], numbers[2], sum);
}

الجزء 2 من 2: استخدام التكرارات في الادخال والجمع:
المثال مع الشرح:

#include<stdio.h>
main()
{
    /* *****************************************************
    *  تعريف المتغيرات المستخدمة                           *
    *  numbers: مصفوفة بطول 5، لتخزين الأرقام               *
    *  sum: تخزين حاصل جمع المتغيرات كافّة                  *
    *  i: الرقم المتزايد للتكرار                           *
    ****************************************************** */
    int numbers[5], sum, i;
    // تحديد القيمة المبدئية لمتغير الجمع لتجنب الأخطاء
    sum = 0;
    // رسالة طلب ادخال 5 أرقام
    printf("Enter 5 numbers: ");
    /* *******************************************************
    *  التكرار الأول، للإدخال                                  *
    *  بدء عملية التكرار، البدء من 0 والتوقف عند 9           *
    *  لاحظ استبدال رقم الفهرس في المصفوفة بالمتغير المتزايد  *
    ******************************************************** */
    for(i=0;i<5;i++)
    {
        scanf("%d", &numbers[i]);
    }
    /* *******************************************************
    *  التكرار الثاني؛ عملية الجمع                           *
    *  لاحظ طريقة كتابة سطر الجماع:                           *
    *  sum += numbers[i];                                    *
    *  ويمكن كتابته بالطريقة الآتية أيضًا:                     *
    *  sum = sum + numbers[i];                               *
    ******************************************************** */
    for(i=0;i<5;i++)
    {
        sum += numbers[i];
    }
    // طباعة النتيجة
    printf("result is %d", sum);
}

يتضح بعد الدرس أن الاختلاف بين Java و C بسيط وليس هناك صعوبة لمن يتقن أحدهما في تعلم الأخرى 🙂

ديسمبر 012011
 

في تدوينة سابقة حول نظام ادارة المحتوى السهل (EPCMS= Easy PHP Content Management System) تم طرح بعض التحديثات في للنسخة الأولية من النظام، وسأقوم بذكر التحديثات هنا قبل وضع خواص إضافة المكتبة الصوتية.

الميزات بشكل عام:

  1. ديناميكية القوائم، إمكانية اضافتها بلا حدود سواء في العدد أو العمق
  2. إمكانية التحكم في محتوى القوائم حسب الخيارات (صفحة، ملف برمجي، وصلة خارجية أو قائمة رئيسية)
  3. نظام ادارة نماذج خاص، بحيث يتم تكوينها تلقائيًا في بضع مواضع
  4. نظام إدارة قوالب خاص، لازال في النسخة التجريبية الأولى له، والغرض منه تسهيل إنشاء التصاميم للنظام
  5. نظام مجموعات الأعضاء، بحيث يمكن التحكم بصلاحيات الأعضاء في كل مجموعة
  6. إمكانية التحكم في ظهور الصفحات حسب مجموعات الأعضاء
  7. تعدد الأشكال واللغات
  8. سهولة تركيب أو برمجة الإضافات، وعبرها يمكن التحكم بالصفحة الرئيسية أيضًا

ميزات المكتبة الصوتية:

  1. تعدد الأصناف بلا حدود في العدد والعمق
  2. امكانية التحكم بـ(الألبومات، المؤدين و الشعراء) ولكل منهم صفحة خاصة به
  3. الإكمال التلقائي (الصور في نهاية التدوينة قد توضح المقصود)
  4. إمكانية جلب المحتوى حسب (القسم، الألبوم، المؤدي أو الشاعر)
  5. لوحة تحكم عملية (باستخدام jQuery)

الغرض من التدوينة تو البحث عن الأخطاء في لوحة التحكم الخاصة بالإضافة الصوتية، ويمكن الوصول إليها:

الرابط: http://www.alrashdi.co/tests/epcms/index.php

اسم المستخدم: demo

كلمة المرور: demo

 

بالنسبة لصفحة العرض للزوار، سيتم بناءها بناءً على توجيهات المستخدمين 🙂

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

نوفمبر 242011
 

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

العملية الشرح مثال
+ تستخدم لعمليات الجمع 1+ 2
++ أضف 1 i++
تستخدم لعمليات الطرح 1 – 2
اطرح 1 i–
* تستخدم لعمليات الضرب 1 * 2
/ تستخدم لعمليات القِسمة 1 / 2
% تستخدم لعرض الباقي من عملية القسمة 1 % 2
التعابير
== للتساوي a == b
=! لا يساوي a != b
< و > تستخدم لعمليات المقارنة، أكبر أو أصغر من a > b
=< أو => أكبر أو يساوي / أصغر أو يساوي a >= b
|| أو“or” – أي يتحقق
أحد الشروط
a == b || c == d
&& و “and” – يجب أن
تتحقق كل الشروط
a == b && c == d

العمليات ليست معقدة وتم شرحها في دروس سابقة ومن الأمثلة السابقة:

sum = a + b;

هي عملية جمع، حاصل ناتج جمع المتغير a مع b، أو للطرح:

sub = a - b;

حاصل طرح a من b وهكذا ..

سيتم شرح الأوامر الشرطية في درس لاحق بإذن الله 🙂

نوفمبر 212011
 

في درس اليوم سنحتاج لكافة ما تعلمناه في الدروس السابقة، وسأقوم بتدريج الدرس من الأسهل فما فوق. قبل البدأ في الدرس والأمثلة، هناك جزء مهم لم يتم شرحه في المقدمات السابقة بشكل وافي، وهو المكتبات المرفقة مع Java. إذ أن Java تحتوي على عدة مكتبات من شأنها المساعدة على معالجة البرنامج وأيضًا التسهيل والاختصار على المستخدم. في Java لإدراج مكتبة معينة نستخدم الكلمة المفتاحية import تتليها مسافة ثم اسم المكتبة قبل اسم الكائن أو class. مثال:

import java.util.scanner;

في المثال هناك اسم احد المكاتب الجاهزة في Java، وقد قمت بتضمينها جزء معين منها وهو “scanner” الخاص بالمدخلات، ويمكننا تضمين كافة اجزاء مكتبة معينة بالطريقة الآتية:

import java.util.*;

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

في الدرس الذي بعنوان البرنامج الأول باستخدام Java تم شرح طريقة كتابة برنامج بسيط بـJava، وأيضًا شُرحت بعض المعطيات في الكائن. وفي درس آخر بعنوان المتغيرات والمصفوفات في Java تم وضع شرح حول المتغيرات وأنواعها. انتهينا من المقدمة التجهيزية :mrgreen: .

 

الجزء الاول لدرس المدخلات: الادخال لمتغير بسيط:

صنع برنامج لعمل عملية حسابية بين رقمين، اسم الكائن هو testinput، والمتغيرات a للرقم الأول، b للرقم الثاني، sum لناتج الجمع و input للمدخلات.

مثلما ذُكِر في المقدمة، سنقوم بتضمين إحدى مكتبات Java المرفقة مسبقًا إلى البرنامج للتعامل مع المدخلات فسنضع في السطر الأول أمر الاستيراد أو التضمين:

import java.util.*;

بعد امر الاستيراد سنقوم ببدأ بقية البرنامج بشكل اعتيادي ليكون كالتالي:

class testinput
{
public static void main(String[]args)
{

* لا تنسى إغلاق الأقواس بعد الانتهاء من البرنامج 🙂

الآن لنقم بتحديد انواع المتغيرات، ولنتفرض أنها اعداد صحيحة (integer) كالتالي:

int a, b, sum;

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

الطريقة الصحيحة لتخصيص متغير لمكتبة التعامل مع المدخلات هو كتابة الكلمة المفتاحية Scanner يتلوها اسم المتغير ولنفترض انه input، وبعدها علامة “=” تتلوها الكلمة المفتاحية new وأخيرًا كتابة الدالة Scanner وبين قوسين كتابة System.in. (لاحظ أن كافة السطر ثوابت باستثناء المتغير input، أي يمكننا استبداله بأي اسم آخر). المثال:

Scanner input = new Scanner(System.in);

بعد ان قمنا بتهيئة مكتبة الادخال، لجلب المدخلات نستخدم الطريقة الآتية:

a = input.nextInt();
b = input.nextInt();

وهكذا بالترتيب. لاحظ استخدام “nextInt“؛ هي من ثوابت مكتبة الادخال، ولها انواع اخرى بنفس الوزن مثل:

input.nextDouble();

input.nextFloat();

input.nextChar();

النوع تحدده حسب نوع المتغير الذي يتم تخزين البيانات به

بعد أن قمنا بتخزين المدخلات في المتغيرات a و b سنقوم بتخزين حاصل جمعهما في المتغير sum كالتالي:

sum = a+b;

وببساطة نتابع بقية البرنامج:

System.out.print(a + " + " + b + " = " + sum);
}
}

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

import java.util.*;
class testinput
{
 public static void main(String[]args)
 {
  int a, b, sum;
  Scanner input = new Scanner(System.in);
  System.out.print("Enter 2 numbers: ");
  a = input.nextInt();
  b = input.nextInt();

  sum = a+b;

  System.out.print(a + " + " + b + " = " + sum);
 }
}

صورة للناتج:

الجزء الثاني من الدرس: الادخال لمصفوفة:

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

لعمل متغير باسم numbers بطول (2) أو مكانين للتخزين، نكتب الكلمة المفتاحية int[] (لاحظ الاقواس المربعة) ويتلوها اسم المتغير وهو numbers وعلامة “=” ثم نكتب الكلمة المفتاحية new وأخيرًا نكرر int لكن هذه المرة مع حجم المتغير بين القوسين المربعين [2]. المثال:

int[] numbers = new int[2];

أيضًا عن المثال في الجزء الأول، سنضطر لتغيير المتغيرات a و b إلى متغير المصفوفة ورقم الفهرسة (index) ليكون:

numbers[0] عوضًا عن a
numbers[1] عوضًا عن b

البرنامج كاملًا بعد التعديلات اللازمة:

import java.util.*;
class testinput
{
 public static void main(String[]args)
 {
  int[] numbers = new int[2];
  int sum;
  Scanner input = new Scanner(System.in);
  System.out.print("Enter 2 numbers: ");
  numbers[0] = input.nextInt();
  numbers[1] = input.nextInt();

  sum = numbers[0]+numbers[1];

  System.out.print(numbers[0] + " + " + numbers[1] + " = " + sum);
 }
}

الجزء الثالث والأخير من الدرس: استخدام التكرار في الادخال ومعالجة المدخلات:

للتذكير: يمكن الوصول لدرس التكرارات عبر الدرس التكرار في C, Java و PHP.

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

class testloop
{
 public static void main(String[]args)
 {
  // المصفوفة مع بعض القيم
  int[] numbers = {10,33,21,53,22};
  //تعريف متغير حساب التكرار
  int i;
  /* أمر التكرار
   *  لاحظ استخدام
   *  numbers.length
   *  الغرض من ذلك هو تحديد طول المصفوفة تلقائيًا دون الحاجة لكتابة الرقم يدويًا
   *  ويمكن كتابة الرقم ليكون حسب المثال السابق 5
   *  لاحظ أن شرط المصفوفة هو أن يكون متغير حساب التكرار أصغر من حجم المصفوفة
   *  لأن المصفوفة تبدأ من الصفر، بالتالي فإن آخر فهرس هو 4
  */

  for(i=0;i<numbers.length;i++)
  {
   /* طباعة محتوى المصفوفة
    *  لاحظ ان متغير حساب التكرار هو بمكان رقم الفهرس
    *  حسب الأمثلة السابقة دون التكرار
   */
   System.out.print(numbers[i] + "\n");
  }
 }
}

(يفضل نسخ الشفرة السابقة لمحرر Java لتظهر بشكل صحيح)

 

حان الوقت لتطبيق المثال السابق للعمليات الحسابية وباستخدام التكرار، الاختلاف ليس بالكثير، الشفرة كاملة:

import java.util.*;
class testinput
{
 public static void main(String[]args)
 {
  // تحديد نوع المصفوفة وطولها
  int[] numbers = new int[5];
  // تحديد نوع متغير حساب التكرار ومتغير تخزين حاصل الجمع
  int i,sum;
  // تحديد قيمة متغير حساب المجموع بصفر لتجنب الأخطاء في بداية العملية الحسابية
  sum = 0;
  Scanner input = new Scanner(System.in);
  System.out.print("Enter 5 numbers: ");
  // أمر التكرار، لتخزين المدخلات فقط
  for(i=0;i<numbers.length;i++)
  {
   numbers[i] = input.nextInt();
  }
  /* أمر التكرار للعمليات الحسابية
   * لاحظ طريقة كتابة المتغير
   * ويقصد به جمع القيم السابقة في متغير حساب المجموع مع محتوى المصفوفة
   * ويمكن كتابته بطرق أخرى مثل:
   * sum += numbers[i];
  */
  for(i=0;i<numbers.length;i++)
  {
   sum = sum + numbers[i];
  }  

  System.out.print("sum = " + sum);
 }
}

صورة للناتج:

 

يمكن طرح الاستفسارات في التعليقات أسفل الدرس 🙂

نوفمبر 162011
 

بما أن اوامر التكرار تشبه بعضها بعضًا بشكل كبير، في هذا الدرس سيتم شرحها لـ3 لغات برمجية مختلفة. للدروس السابقة يمكنك العودة للأقسام من القائمة الجانبية.

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

في Java, C و PHP، هناك 3 انواع من أوامر التكرار وهي:

  1. while
  2. do-while
  3. for

وتستخدم بالطريقة الآتية:

1. while

أولًا: تحديد متغير بقيمة أولية ولنفترض أنه i والقيمة الأولية هي 1.

ثانيًا: كتابة الكلمة المفتاحية while وبين قوسين كتابة “expression” أو تعبير رياضي من خلاله تحدد القيمة النهائية للتكرار، لنتفرض أننا نريد إيقاف التكرار عندما تبلغ قيمة i الرقم 10 مثلًا، فيمكن كتابة التعبير (i < 11) – اي المتغير أصغر من 11 أو (i <= 10) – أي المتغير اصغر أو يساوي 10.

ثالثًا: داخل كتلة التكرار “أي بين { و }” تضع ذات المتغير بشكل متزايد؛ مثلًا: i++ أو i= i+1 أو يمكن بطرق أخرى. عدم وضع التزايد قد يسبب حمل زائد على الذاكرة بالتالي إيقاف عمل البرنامج، وذلك يعتمد على المترجم.

2. do-while

أولًا: تحديد متغير بقيمة أولية ولنفترض أنه i والقيمة الأولية هي 1.

ثانيًا: كتابة الكلمة المفتاحية do ويتلوها قوسي الكتلة “أي { و }”.

ثالثًا: داخل كتلة التكرار “أي بين { و }” تضع ذات المتغير بشكل متزايد؛ مثلًا: i++ أو i= i+1 أو يمكن بطرق أخرى. عدم وضع التزايد قد يسبب حمل زائد على الذاكرة بالتالي إيقاف عمل البرنامج، وذلك يعتمد على المترجم.

رابعًا: كتابة الكلمة المفتاحية while وبين قوسين كتابة “expression” أو تعبير رياضي من خلاله تحدد القيمة النهائية للتكرار، لنتفرض أننا نريد إيقاف التكرار عندما تبلغ قيمة i الرقم 10 مثلًا، فيمكن كتابة التعبير (i < 11) – اي المتغير أصغر من 11 أو (i <= 10) – أي المتغير اصغر أو يساوي 10.

3. for

تلخص كافة الخطوات في while في سطر واحد ليكون كالتالي:

كلمة for المفتاحية وبين القوسين بالترتيب: نكتب قيمة المتغير الأولية ونضع “؛” (فاصلة منقوطة) وبعدها التعبير الرياضي (مثلا i<=10) ونضع “؛” وأخيرًا نضع امر التزايد ليكون مثلًا i++

 

الآن سأقوم بوضع الأمثلة لتصل المعلومة بشكل أفضل، أولًا: Java:

class testloop
{
public static void main(String[]args)
{
int i;

//type 1
i=1;
System.out.print("Type 1 (while): \n");
while(i <= 10)
{
System.out.print(i + "\n");
i++;
}

//type 2
i=1;
System.out.print("\nType 2 (do-while): \n");
do
{
System.out.print(i + "\n");
i++;
}
while(i <= 10);

//type 3
System.out.print("\nType 3 (for): \n");
for(i=1;i<=10;i++)
{
System.out.print(i + "\n");
}
}
}

ثانيًا: C:

#include <stdio.h>
main()
{
int i;

//type 1
i=1;
printf("Type 1 (while): \n");
while(i<=10)
{
printf("%d \n", i);
i++;
}

//type 2
i=1;
printf("\nType 2 (do-while): \n");
do
{
printf("%d \n", i);
i++;
}
while(i<=10);

//type 3
printf("\nType 3 (for): \n");
for(i=1;i<=10;i++)
{
printf("%d \n", i);
}

}

ثالثًا: PHP:

<?PHP
// Type 1
$i=1;
echo "type 1 (while):<br />\n";
while($i <= 10)
{
echo $i."<br />";
$i++;
}

// Type 2
$i=1;
echo "type 2 (do-while):<br />\n";
do
{
echo $i."<br />";
$i++;
}
while($i <= 10);

// Type 3
echo "type 3 (for):<br />\n";
for($i=1;$i<=10;$i++)
{
echo $i."<br />";
}
?>

هل توافقني على أنها متشابهة جدًا ؟ 😀