m.3oloum

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


إدارة المنتدى


m.3oloum
 
الرئيسيةس .و .جبحـثالتسجيلدخول
دليل الطالب
تصويت
ما رأيك بالتصميم الجديد للمنتدى ؟
ممتاز
71%
 71% [ 17 ]
جيد
25%
 25% [ 6 ]
لابأس به
4%
 4% [ 1 ]
غير مناسب
0%
 0% [ 0 ]
مجموع عدد الأصوات : 24
المواضيع الأكثر شعبية
المحاضرة 1 جبر خطي 2
المحاضرة 2 برمجة وخوارزميات
مرجع جبر A first cours in liner algebra رائع جدا
المحاضرة 2 تحليل 2
المحاضرة 1 تحليل متجهي
المحاضرة 1 برمجة وخوارزميات
المحاضرة 3 برمجة وخوارزميات
تاريخ الرياضيات
المحاضرة 1 برمجة وخوارزميات عملي
المحاضرة 1 تحليل 2
المواضيع الأخيرة
» الطابعات وأنواعها
الثلاثاء أبريل 09, 2013 7:10 pm من طرف hana sh

» وحدات التخزين الثانوية {التنظيم المنطقي للسواقات (الذاكرة الميتة)}
السبت أبريل 06, 2013 7:43 pm من طرف rouba kh

» الشاشات وأنظمة الألوان
السبت أبريل 06, 2013 7:43 pm من طرف rouba kh

» رسالة من الخوارزمي إلى نيوتن !
السبت أبريل 06, 2013 7:42 pm من طرف rouba kh

» تطور الرياضيات عند العرب
السبت أبريل 06, 2013 7:42 pm من طرف rouba kh

» ماذا بعد المليون
السبت أبريل 06, 2013 7:41 pm من طرف rouba kh

» التحليل الرياضي
السبت أبريل 06, 2013 7:41 pm من طرف rouba kh


شاطر | 
 

 المجموعة set

اذهب الى الأسفل 
كاتب الموضوعرسالة
maya kemara



انثى

عدد المساهمات : 7

نقاط : 10611

السٌّمعَة : 0

تاريخ التسجيل : 21/02/2013


مُساهمةموضوع: المجموعة set   الخميس فبراير 28, 2013 9:30 pm

المجموعة Set

المجموعة Set في لغة البرمجة باسكال Pascal تشبه كثيراً المجموعات الرياضية, حيث أنها تتصف بخواص مشابهة كعدم تكرار عنصر, وعدم أهمية الترتيب, وكون جميع العناصر من نفس النمط

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


[*] المجموعة (Set) نمط ترتيبي (Ordinal) ومتقطع (District), ويمكن أن
تكون عناصرها من نمط Integer أو Boolean أو Charأو enumerated, ويجب أن
تكون جميع العناصر من نمط واحد (كلها أعداد صحيحة مثلاً).
[*] لوضع عناصر في مجموعة نستخدم قوسين متوسطين [ ] ونضع داخلهما العناصر.
[*] العمليات على المجموعات :

  • تقاطع مجموعتين , يعبر عنها في باسكال بنجمة (*)
  • اجتماع مجموعتين , يعبر عنها في باسكال بإشارة زائد (+)
  • فرق مجموعتين يعبر عنها بإشارة (-)
  • الاحتواء (=>) تعني , كما أن (=<) تعني
  • انتماء عنصر (in) تعني



التصريح عن المجموعة set :
يأخذ التصريح عن متحول من نمط مجموعة الشكل التالي :

<نمط متقطع>set of :<اسم المتحول >

النمط المتقطع(discrete type) هو أحد الأنماط (integer,char,boolean,enumerated)

أمثلة :
الكود:
Begin
  S1:=[40,55,99,40,41,44..55]
  {S1 here will contain [40,41,44..55,99]}
  S1:=[300]; { خالية لأن 300 خارج المجال المعرف S1=[] النتيجة}
  S2:=['n','d'..'h']; {أي أن العناصر تُرتب S2=['d'..'h','n'] النتيجة}
  S2:=['A','a']; {S2=['a'] النتيجة}
لا يوجد هنا (في التعليمة الأخيرة) Compile Time Error أو Runtime Error :



  • Compile Time Error هو خطأ إملائي في الكود Syntax Error in the Source Code
  • Runtime Error : خطأ منطقي يظهر أثناء التنفيذ كالقسمة على صفر

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

الكود:
S1:=[i,j]; { خالية لأننا لم نسند قيماً إلى المتحولين S1=[] النتيجة}
  S2:=[i,j]; {--> Incompatible Types ERROR ! (Compile Time Error)}
  i:=50;
  S1:=[i,i 3]; {S1=[50,53]}
  S1:=S1 [i*2]; {S1=[50,53,100]}
end.
ملاحظة: مع أن لغة باسكال القياسية لا تضع حداً أعظم على طول
المجال الذي تنتمي إليه عناصر المجموعة ، فإن أكثر المترجمات compilers لا
تستطيعذلك و تكتفي كحد أعظم بـ 256 عنصراً .


فالتصريح
الكود:
s:set of integer ;
أو
الكود:
s:set of 1..500;
لا تقبله أكثر المترجمات . و يرجع السبب على الأغلب إلى تحقيق فعالية أكثر في طريقة الخزن و تنفيذ العمليات .

المجموعات الثابتة (Constant Sets)


يمكن تعريف مجموعات ثابتة Constant Sets ونعني بذلك أنه لا يمكن تغيير محتوى هذه المجموعة بل يبقى ثابتاً في كامل البرنامج.

مثال:

الكود:
Program test;
type
  Digits=set of 0..9;
const
  HexD:set of '0'..'z'=['0'..'9','A'..'F','a'..'f']; {نضع نمط عناصر المجموعة ثم عناصرها} 
  ED:Digits=[0,2,4,6,8];
var
  d:Digits;
begin
  d:=[8];
  d:=ED;  {يمكن إسناد قيمة الثابت إلى المتحول إذا كانا من نمط واحد
          d=[0,2,4,6,8] والنتيجة هنا}
end.
مجموعات تحتوي على عناصر من نمط تعدادي Enumerated Type


تعرفنا على كيفية تعريف الأنماط التعدادية, كتعريف نمط يحوي على أيام الأسبوع, ويمكن أن نعرف مجموعة Set تحوي عناصر من نمط تعدادي :


الكود:
program ET;
type
  Day=(Sun,Mon,Tue,Wed,Thu,Fri,Sat);
  Days=set of Day;
var
  D:set of Day;
  DD:Days;
begin
  DD:=[Sun,Fri];
  writeln(ord(Mon)); {ord(Sun)=0, ord(Mon)=1, ... , ord(Sat)=6}
end.
مثال عن العمليات على المجموعات



الكود:
program SetsOp;
var
  A0:set of 1..15;
  A1:set of 1..10;
  A2:set of 5..15;
  i:integer;
 
begin
  A1:=[1..10];
  A2:=[5..15];
  A0:=A1*A2;  {A0=[5..10] النتيجة}
  A0:=A1 A2;  {A0=[1..15] النتيجة}
  A0:=A1-A2;  {A0=[1..4]  النتيجة}
  A0:=A0-[1]; {A0=[2..4]  النتيجة}
  A1:=[2,3];
  A2:=[1,2,3,4,5];
  if (A1<=A2) then  {في الشرط A2>=A1 نستطيع أيضاً كتابة}
    writeln('A1 is a subset of A2');
  readln(i);
  if (i in A1) then
    writeln(i,' is in A1')
  else
    writeln(i,' is not in A1');
 
end.
إجرائيات قراءة وطباعة المجموعة


بالحالة العامة لا يمكننا تنفيذ تعليمات قراءة و طباعة مباشرة للـ Set بالشكل التالي :



الكود:
program test();
var
  S1,S2:Set of 1..100;
Begin
  Readln(s1);  {هذا خطأ} 
  Writeln(s2);  {هذا خطأ}                         
End.
فعند تنفيذ الكود السابق سوف نواجه خطأً قبل تنفيذ البرنامج (Compile Time Error) حيث يشير المترجم (compier) إلى حدوث خطأ : Illegal type in Read\Write statement

وبالتالي لقراءة Set أو طباعة عناصرها على الشاشة نحتاج الى كتابة اجرائيات تقوم بهذه العملية ومن ثم نقوم باستدعائها



  • سنقوم بكتابة ست إجرائيات :

    • اجرائية لقراءة مجموعة عناصرها صحيحة.
    • إجرائية لقراءة مجموعة عناصرها محارف.
    • إجرائيتان لطباعة مجموعة عناصرها صحيحة ( Set :Integer ) باستخدام حلقة While ثم باستخدام حلقة For
    • إجرائيتان لطباعة مجموعة عناصرها محارف ( Set :Char ) باستخدام حلقة While ثم باستخدام حلقة For


قبل البدء بكتابة الإجرائيات سنقوم بكتابة الانماط و المتحولات للبرنامج الرئيسي والتي سوف نمررها للإجرائيات


الكود:
Program Test();
Type
  SI = Set of 1..150 ;
  SC = Set of ‘o’..’z’;
Var
  S1  : SI;
  S2  : SC;
  Slen : Integer;
اجرائية لقراءة مجموعة عناصرها صحيحة



الكود:
Procedure ReadsetI (Var S:SI ; L:integer) ;
var
  I,x : Integer;
Begin
  For i:=1 to L do
    Begin
      Read(x);
      S:= S  [x];
    End;
End;
اجرائية لقراءة مجموعة عناصرها محرفية



الكود:
Procedure ReadsetC (Var S:SC ; L:integer) ;
var
  I,x : Char;
Begin
  For i:=1 to L do
    Begin
      Read(x);
      S:= S  [x];
    End;
End;

إجرائيتان لطباعة مجموعة عناصرها صحيحة



  • أولاً:باستخدام حلقة While :


الكود:
Procedure WritesetI (S : SI) ;
var
  I : Integer;
Begin
  I:=1;
  While ( S <> []) do
    begin
      if (I in S) then
        Begin
          Writeln(I);
          S := S – [I];
        End;
      I := I  1;
    end;
End;


  • ثانياً: باستخدام حلقة For :


الكود:
Procedure WritesetI (S : SI) ;
var
  I : Integer;
Begin
  For I:=1 to 32700 do
    Begin
      If (I in S) then
        Begin
          Writeln(I);  S := S – [I];
        End;
      If (S = []) then
          break;
    End;
End;

أمثلة برمجية :


تقاطع مجموعتين :

ليكن لدينا نظام دراسي يختار الطلاب فيه المواد التي يريدون
متابعتها ، فهناك مجموعة من الطلاب تتبع مادة البرمجة prog ومجموعة تتبع
مادة اللغة الانكليزية eng . و لتكن لدينا قوائم بأرقام الطلاب في كل من
المادتين .
المطلوب معرفة الطلاب الذين يتبعون المادتين معاً .



الكود:
Program set1(input,output);
type
 setnum=set of 1..100;
var
 numprog:setnum;
 numeng:setnum;
 num:setnum;
 length1,length2:integer;
procedure readset(var num:setnum;len:integer);
var
 i,a:integer;
 begin
  for i:=1 to len do
  begin
    writeln('ID  ',i,'=');
    read(a);
    if (a< 1) or (a>100)or(a in num) then
    i:=i-1
    else
    num:=num [a];
  end;
  end;
procedure writeset(num:setnum);
var
i:integer;
 begin
  i:=1;
  while(num<>[])do
  begin
    if(i in num )then
    begin
      writeln (i);
      num:=num-[i];
    end;
    i:=i 1;
  end;
  end;

begin
 writeln('the number of the students learning programing: ');
 read(length1);
 writeln('the number of the students learning english: ');
 read(length2);
 writeln('write the IDs of the students learning programing ');
 readset(numprog,length1);
 writeln('write the IDs of the students learning english');
 readset(numeng,length2);
 num:=numprog*numeng;
 writeln('the IDs of the students learning prog and eng are :');
 writeset(num);
 readln;readln;
end.
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
المجموعة set
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
m.3oloum :: مواد دراسية :: البرمجة :: بُنى المعطيات الأساسية-
انتقل الى:  
 
إدارة منتديات سوريا الرياضيات ترحب بكم يمكنكم التواصل معنا من خلال صفحتنا على الفيس بوك \ syriamath أو على صفحتنا على تويتر @ syriamath كما يمكنكم التواصل معنا من خلال بريدنا الإلكتروني support@syriamath.com

FacebookTwitter
أختر لغة المنتدى من هنا