تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس السابع : الدوال والطرق
#1
منقول من المنتدى القديم
الكاتب احمد جمال المشرف العام
23-02-08
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

في الجزء الأول من درسنا لهذا الاسبوع تعرفنا على كيفية تشتغيل Visual Studio .net 2008 ، كان آخر خطواتنا في الدرس السابق ان قمنا بكتابة جملة Hello world وطبعناها على الشاشة ، ضمن باقي دروس هذا الاسبوع سنفهم كيف قمنا بكتابة هذه الجملة وما هو الكلاس .. الدول والتعامل معها وخلافه .

بسم الله نبدا ...
الرد }}}
تم الشكر بواسطة:
#2
منقول من المنتدى القديم
الكاتب احمد جمال المشرف العام
لنفهم برنامجنا الأول :

لو لاحظنا برنامجنا الأول لطباعة جملة Helow World والذي كان بالشكل التالي :

كود :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
     static void Main(string[] args)
     {
         Console.Write("Hello World");
         Console.ReadKey();
     }
}
}
Vb.net:
كود :
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Namespace ConsoleApplication4
    
    
    Class Program
        
        
        Private Shared Sub Main(ByVal args As String())
        
            
            Console.Write("Hello World")
            
            Console.ReadKey()
            
        End Sub
        
    End Class
    
End Namespace

اول ما سنجده هو استيراد المكتبات التي سنستخدمها لكتابة اكوادنا باستخدام using أو Imports في الفيجوال بيسك ، قمنا بشرح هذه الخطوة في دروس سابقة .

الجزء الثاني هو تعريف ال name space الخاص ببرنامجنا وهو الاسم الذي توضع تحته كل مكونات البرنامج ، ومن ثم ال Class الاساسي لدينا باسم Main ... كما تعلمنا في اي مبادئ للبرمجة كائنية التوجه فإن أي برنامج يتكون من واحد او اكثر من ال Classes ، الدالة الرئيسية في ال Class المسمى Main هي الدالة main والتي يتم تنفيذها اول شيء في البرنامج .

تستقبل الدالة Main مجموعة من الباميتير تحت اسم args ، معنى هذا ان البرنامج يستقبل مع تشغيله مصفوفة من args[0] إلى args[n] ، يمكن ارسال كل ما تريد إلى البرنامج من خلالها ، وهو ما يسمى Command Line Parameters .

لكي لا نبعد عن مسارنا في الشرح ، ال Command Line Args هي مجموعة من المتغيرات التي يمكن تمريرها للبرنامج وقت تشغيله لتتحكم في بعض النقاط ، مثلاً لو قمنا بكتابة الامر التالي :
كود :
Explorer "http://www.vb4arb.com"
اول ما يتم فتح برنامج Expolorer ، يقوم بقراءة النص الممرر له ، إذا كان موقع انترنت يقوم بفتحه بالشكل المعهود لمتصفح الانترنت ، اما لو كان مسار مثلاً C:/ فسيقوم بفتح متصفح المجلدات مع انهم نفس البرنامج في النهاية .

تستطيع تجربة ذلك على برنامجك من خلال قراءة المتغيرات الممرة له عن طريق For Loop :

C#:
كود :
for (int i = 0; i < args.Length; i++)
             Console.WriteLine(args[i]);

Vb.net:

كود :
For i As Integer = 0 To args.Length - 1
    Console.WriteLine(args(i))
Next

الآن قم بالذهاب إلى Run ، قم بكتابة مسار برنامجك ومن ثم مسافة ومن ثم كتابة البارميترات التي ترغب في تمريرها ، في جهازي كتبت الامر التالي في Run :
كود :
C:\Users\Ahmed\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\bin\Debug\consoleapplication4.exe ahmed ali

الناتج الذي ظهر لي كان بالشكل التالي :

[ATTACH=CONFIG]774[/ATTACH]

كتطبيق سريع ، سنقوم بقراءة المتغير الأول وفي حالة وجود 0 مثلاً يتم تلوين خلفية الكلام بالازرق ، وفيما عدا ذلك يتم تلوين خليفة الكلام بالأحمر ، هذا هو الكود الخاص بذلك :

C#:

كود :
if (args[0] == "0")
         {
             Console.BackgroundColor = ConsoleColor.Blue;
             Console.WriteLine("0 enterd");
         }
         else
         {
             Console.BackgroundColor = ConsoleColor.Red;
             Console.WriteLine("Empty");
         }
         Console.ReadKey();

VB.net:

كود :
If args(0) = "0" Then
    
    
    Console.BackgroundColor = ConsoleColor.Blue
    
        
    Console.WriteLine("0 enterd")
Else
    
    
    
    Console.BackgroundColor = ConsoleColor.Red
    
        
    Console.WriteLine("Empty")
End If
Console.ReadKey()

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

C#:

كود :
if (args.Length > 0)
         {
             if (args[0] == "0")
             {
                 Console.BackgroundColor = ConsoleColor.Blue;
                 Console.WriteLine("0 enterd");
             }
         }
         else
         {
             Console.BackgroundColor = ConsoleColor.Red;
             Console.WriteLine("Empty");
         }
         Console.ReadKey();

VB.net:

كود :
If args.Length > 0 Then
    
    
    If args(0) = "0" Then
        
        
        Console.BackgroundColor = ConsoleColor.Blue
        
            
        Console.WriteLine("0 enterd")
        
    End If
Else
    
    
    
    Console.BackgroundColor = ConsoleColor.Red
    
        
    Console.WriteLine("Empty")
End If
Console.ReadKey()

هناك حل آخر ، ماذا لو احببنا ان نجعل التأكد في سطر واحد بالشكل التالي :

C#:

كود :
if (args.Length >0 && args[0] == "0")

VB.net:
كود :
If args.Length > 0 AndAlso args(0) = "0" Then

هذا يعني انه سيتأكد من وجود بارميترس ، إذا وجدها سينتقل للشرط الثاني وإذا لم يجدها فإنه يخرج مباشرة دون قراءة الشرط الثاني ...
الجدير بالذكر ان المعامل And لن يمكن تطبيقه في VB.net ، بل ستضطر لاستخدام AndAlso ، تجد عنها شرحاً هنا بقلم الأخ احمد بدر :
http://vb4arb.com/vb/showthread.php?1324...0#post3920

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


الملفات المرفقة صورة/صور
   
الرد }}}
تم الشكر بواسطة:
#3
منقول من المنتدى القديم
الكاتب احمد جمال المشرف العام

الدوال Function :

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


C#:

كود :
static int sum(int number1, int number2)
      {
           int total = number1 + number2;
          return total;
      }

VB.net:

كود :
Private Shared Function sum(ByVal number1 As Integer, ByVal number2 As Integer) As Integer
    
    Dim total As Integer = number1 + number2
    
    Return total
    
End Function

ومن ثم ، سنحاول من خلال Main استدعائها بالشكل التالي مثلاً :


C#:

كود :
int result = sum(5, 8);
          Console.Write(result);
          Console.ReadKey();

Vb.net:
كود :
Dim result As Integer = sum(5, 8)
Console.Write(result)
Console.ReadKey()

لماذا تم تعريف sum على انها Static أو Shared ؟؟ السبب انه لا يمكن استدعاء دالة غير Static من خلال دالة static ، وبما ان دالة Main هي من نوع static فلا بد من ان تكون اي دالة اخرى يتم استدعائها من خلال ال main هي static ايضاً ، سنتعرف على بعض التفاصيل الاضافية لاحقاً ، ما ينطبق على static في C# ينطبق على VB.net ايضاً مع Shared .


المتغيرات Variables :

في اي جزء من البرنامج داخل ال Class يمكننا تعريف المتغيرات حسب النوع int , string مثلاً ، ويتم تحديد مدى الوصول عبر المكان الموجود فيه التعريف .
لتوضيح هذه النقطة نعود لمثال الجمع السابق ، في المثال السابق نجد المتغير total في الدالة sum ، هذا المتغير لن يستطيع أحد الوصول إليه إلا خلال الدالة ، أما لو قمنا بتعريف متغير خارج الدالة ( داخل الكلاس مباشرة ) فيمكن لاي دالة الوصول إليه مباشرة ، في هذه الحالة يسمى Member .

- سنتعرف على بعض التفاصيل الاضافية لاحقاً .

لدينا نوعين من المتغيرات ، النوع الأول وهو البسيط مثل int و Long وخلافه حيث يتم يشير اسم المتغير لمكانه من الذاكرة أما المركب مثل Array و Struct فيشير المتغير إلى مكان تستطيع منه الاشارة إلى المتغير في الذاكرة .

الطرق mehtods :

الطرق هي الدالة التي لا تعيد ناتج ، مثل دالة عرض كتابة رسالة بالشكل التالي :

C#:
كود :
void printmsg(string msg)
      {
          Console.WriteLine(msg);
      }

في الفجيوال بيسك 6 ، كان يتم تعريف الطريقة باسم Sub ، وهو المستمر ايضاً مع VB.net ليكون بالشكل التالي :

VB.net:

كود :
Private Sub printmsg(ByVal msg As String)
    
    Console.WriteLine(msg)
    
End Sub
الرد }}}
تم الشكر بواسطة:
#4
منقول من المنتدى القديم
الكاتب احمد جمال المشرف العام

الوظيفة Out :

كما تعلمنا في المثال السابق فإننا نقوم بارجاع النتيجة من خلال return ، ماذا لو اردنا اعادة نتيجة من دالة void ، يتم ذلك باستخدام الدالة Out بالشكل التالي :

C#:

كود :
static void sum(int number1, int number2, out int total)
      {
            total = number1 + number2;

      }

VB.net:

كود :
Private Shared Sub sum(ByVal number1 As Integer, ByVal number2 As Integer, ByRef total As Integer)    
    total = number1 + number2
End Sub

وعند استدعاء الدالة يتم تمرير المتغير الذي نحتاج إليه لعرض النتيجة ايضاً :

C#:

كود :
int result;
          sum(5, 8,out result);
          Console.Write(result);
          Console.ReadKey();

VB.net:

كود :
Dim result As Integer
sum(5, 8, result)
Console.Write(result)
Console.ReadKey()

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

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

الارسال بالمرجع byref والارسال بالقيمة byval :

لنفترض المثال الخاص بعملية الطرح بالشكل التالي :
C#:

كود :
int x=5;
int y=10;
sub(x,y);

VB.net:

كود :
Dim x As Integer = 5
Dim y As Integer = 10
sub(x, y)

والدالة :

C#:

كود :
static void sub(int number1, int number2)
      {
            number1 = number1 - number2;
            return number1;

      }
VB.net:
كود :
Private Shared Sub [sub](ByVal number1 As Integer, ByVal number2 As Integer)
    
    number1 = number1 - number2
    
    Return number1
    
    
    
End Sub

في الدالة السابقة قمنا بتغيير قيمة number1 ، ولكن هل سيغير هذا من قيمة x التي ارسلناها ، الإجابة هي بلا ، هذا ما يعرف بارسال القيمة حيث نقوم في هذه الحالة بارسال قيمة x إلى الدالة وليست قيمة X .

الارسال بالمرجع ByRef هي الحالة الثانية ، في هذه الحالة يتم ارسال عنوان المتغير X في الذاكرة إلى الدالة ، هذا ما يعني ان اي تغيير في number1 سيؤثر بالضرورة على المتغير x .

لكتابة الكود السابق بطريقة ByRef نكتب الكود التالي :

C#:

كود :
static void sub(ref int number1, ref int number2)
      {
            int result = number1 - number2;
            return result;

      }

Vb.net:

كود :
Private Shared Sub [sub](ByRef number1 As Integer, ByRef number2 As Integer)

    Dim result As Integer = number1 - number2
    
    Return result
End Sub

الارسال بالقيمة يمكن تطبيقه فقط مع المتغيرات البسيطة ، اما المتغيرات المركبة مثل Struct فيتم التعامل معه ByRef افتراضياً ...


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



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم