بسم الله
السلام عليكم
أمتحنت اليوم هياكل بيانات والحمدلله بمناسباتها كان أهم معاملين نعمل علي تقليلهما طوال دراستنا المساحة والزمن
المهم ندخل في الموضوع كيفية عمل تبديل لمتغيرين بدون أستخدام متغير ثالث مؤقت
هناك طريقتان
الاولي
السلام عليكم
أمتحنت اليوم هياكل بيانات والحمدلله بمناسباتها كان أهم معاملين نعمل علي تقليلهما طوال دراستنا المساحة والزمن
المهم ندخل في الموضوع كيفية عمل تبديل لمتغيرين بدون أستخدام متغير ثالث مؤقت
هناك طريقتان
الاولي
public static void swap(int a,int b){
a+=b;
b=a-b;
a=a-b;
}
}
a+=b;
b=a-b;
a=a-b;
}
}
الآن ماذا فعلنا لنفرض ان a=5 &b=3
ضفنا قيمة b إلي a فأصبحت a=8
طرحنا قيمة bمن a ثم وضعناها في b إذا b=5
ثم نطرح قيمة b من a ونضعها في a إذا a=3
سهلة أليست كذلك
ننتقل للطريقة الثانية
ضفنا قيمة b إلي a فأصبحت a=8
طرحنا قيمة bمن a ثم وضعناها في b إذا b=5
ثم نطرح قيمة b من a ونضعها في a إذا a=3
سهلة أليست كذلك
ننتقل للطريقة الثانية
public static void swap(int x,int y){
x ^= y;
y ^= x;
x ^= y;
}
}
x ^= y;
y ^= x;
x ^= y;
}
}
أولاً ماهذا ^ أنه XOR operator
ماذا يفعل يخرج واحد إذا كان القيمتان مختلفان وصفر إذا كانا متشابهان كيف
عندنا قيمتان 5 و 3 نكتبهم بالنظام الثنائي وسيوضح الأمر
101
011
أول خانة منهما بها 1و1 إذاً الناتج 0
ثاني خانة 0و1 إذاً الناتج 1
الثالثة 1و0 إذاً الناتج 1
نكتبهم من اليمن 110
101
^
011
=
110
هل وضحت
الآن سنختبر الكود بفرض x=3وy=5
أولاً نضع في x قيمة x^y =6
ثم نضع في y قيمة y^x=5
ثم نضع في x قيمة x^y=3
ملحوظة المعامل ^ إبدالي
مرجع لفهم XOR أكثر هنا
ملحوظة أخري الطريقة الثانية من الممكن أن تسبب أخطاء في لغات oop لأنها تعمل علي الريجيستر كما رأيتم
وفي الختام أسألكم الدعاء لأخواننا في غزة بالنصر والفرج
دعواتكم نكمل باقي الأمتحانات علي خير
وسلام الله عليكم ورحمته وبركاته
ماذا يفعل يخرج واحد إذا كان القيمتان مختلفان وصفر إذا كانا متشابهان كيف
عندنا قيمتان 5 و 3 نكتبهم بالنظام الثنائي وسيوضح الأمر
101
011
أول خانة منهما بها 1و1 إذاً الناتج 0
ثاني خانة 0و1 إذاً الناتج 1
الثالثة 1و0 إذاً الناتج 1
نكتبهم من اليمن 110
101
^
011
=
110
هل وضحت
الآن سنختبر الكود بفرض x=3وy=5
أولاً نضع في x قيمة x^y =6
ثم نضع في y قيمة y^x=5
ثم نضع في x قيمة x^y=3
ملحوظة المعامل ^ إبدالي
مرجع لفهم XOR أكثر هنا
ملحوظة أخري الطريقة الثانية من الممكن أن تسبب أخطاء في لغات oop لأنها تعمل علي الريجيستر كما رأيتم
وفي الختام أسألكم الدعاء لأخواننا في غزة بالنصر والفرج
دعواتكم نكمل باقي الأمتحانات علي خير
وسلام الله عليكم ورحمته وبركاته
مممممممممممممم
ردحذفأظن أنك عكست في موضوع مشكلة الريجستري
لأن الخطأ سيحصل في الطريقة الأولى
وهذا على أساس الفرض أن المتحولات تستطيع حمل قيمة قصوى
مثلاً short يستطيع حمل حتى 127 ما الذي سيصحل لو كان العددين 126 و 5
سنجد أنا حصلنا على عدد غير صحيح
بيناما عند استخدام xor نلاحظ أن القيمة لا تزيد بحال من الأحوال وهذا شيء جيد جداً
أتمنى التوضيح لو كان كلامي خائاَ
تحياتي
لن يحدث أخطاء في الطريقة الأولي
ردحذفجرب هذا الكود بالسي
int main(){
short x=300;
short y=500;
x+=y;
y=x-y;
x=x-y;
printf("%i %i\n",x,y);
return 0;
}
سيقوم بعمل سواب بدون مشاكل !!!
وللعلم في xor القيمة تزيد ايضاً ولكنها زيادة صغيرة مقارنة بالطريقة الاولي
بالنسبة لموضوع الريجيستري أنا ترجم ما فهمته ولكني لم أجرب ولم اقل أنه أكيد حدوث خطأ بل قلت أحتمال
في النهاية كيف يحمل متغير قيمة اكبر من قيمته حدثت معي كثيراً ولكني لا اعرف كيف تحدث بدون مشاكل لو عرفت أخبرني
بالتوفيق
ما الذي تعنيه بأنه حمل أكثر من قيمته؟؟
ردحذفلازلت أعتقد أن هناك مشكلة في استخدام الجمع
تحياتي
أقصد أن مثلاً لدينا متغيران كلاهما short واستخدمنا معهم الطريقة الاولي وكانت قيمتهما 121,119 معني هذا أننا سنجمعهم معاً ونضعهما في أحدهما طبقاً للطريقة الاولي اي أننا سنضع في أحدهما 240 والمتغير short لا يحمل أكثر من 127 -حدث فيض -ومع هذا لايحدث خطأ وتتم العملية بدون مشاكل لا ادري كيف يحدث هذا ,هل تحدث عملية casting to int ممكن لكني لست متاكد .
ردحذفلو حضرتك تعرف ياريت تخبرنا
هل وضح ما أعنيه الآن؟
بالتوفيق