الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعده في برنامج rotating rings في لغة c++

بدأه هدوء المطر في 13 مايو 2012 · 28 رد · 6,253 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

يوجد لدي برنامج في لغة السي بلس بلس

أرجو منكم مساعدتي في حل الفقرات التي لم أعرفها

انا فاهمه البرنامج لكن تطبيق الكود يوجد بعض الخطوات لم أستطع تطبيقها بالكود

أرجو مساعدتكم فيها

البرنامج في الرابط فقره C

http://www.mediafire.com/download.php?ym7m8r9qswpdxna

(الفكرة العامة نفس فكرة المكعب اللي ترتيبه على حسب الألوان وهنا على حسب ترتيب الأرقام)

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

المصفوفة عبارة عن حلقات حلقة خارجية ثم داخلية حتى نصل الى اخر حلقه(قطعه وحده) التي في الوسط

نلف الحلقة الخارجية (الحلقه الخارجيه الكبيره تكون على شكل مربع) مع اتجاه عقارب الساعة او عكس عقارب الساعة و نلف ايضا الحلقة الداخلية (على شكل مربع ايضا بس داخل المربع الكبير)

ونلف كل الحلقات الى أن تترتب المصفوفة

اذا لفينا كل الحلقات و لم تترتب معنا المصفوفة معناها انها لن تكون مصفوفة قابلة للترتيب و سوف يكون الناتج (No)

اول خطوه نطلب من المستخدم أن يدخل رقم ولازم نختبر هذا الرقم الذي أدخله المستخدم بحيث يكون اكبر من الصفر و اصغر من او يساوي الف. اذا أدخل الرقم صفر ينهي البرنامج.

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

و نعرف مصفوفة أخرى نعبيها ب for loop من صفر الى تربيع الرقم الذي أدخله المستخدم ناقص واحد عشان نقارن فيها

نعمل foor loop من صفر الى اقل من العدد الذي أدخله المستخدم مثلا لو أدخل 4 سوف يكون العدد من 0 الى 3

و داخل ال foor loop هذه foor loop أخرى أيضا من صفر الى العدد الذي أدخله المستخدم

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

خارج الfoor loop الداخلية نضع endl لكي تظهر الارقام كانها مكتوبة في صفوف

خارج الاتنين foor loop هذه

نعمل while loop

في كل مرة نعمل ازاحة(تحريك او لف )مع اتجاه عقارب الساعة للحلقة الخارجية و مع كل ازاحة نقارن اول صف و اخر صف بالمصفوفة التي خزننا فيها الأرقام.

اذا لم تنفع ولا ازاحة نجرب نعمل ازاحة لليسار و نقارن ايضا اذا لم تظهر نفس المصفوفة حقتنا المرتبة يصير خلاص ما نقارن الحلقات الداخلية لانه اول حلقة اصلا ما كانت مرتبة

اما اذا كانت مرتبة

نشوف الحلقة الداخلية و نعمل معها مثل ما عملنا مع الحلقة التي قبلها اللي اكبر منها

بعد أن ننهي اختبار المصفوفة و اذا طلعت تترتب خلاص نطبع كلمة yes

أتمنى يكون شرحي واضح..

هذا الكود الذي عملته..

#include <iostream>

using namespace std;

int main()

{

long int x;

long int a[x*x], b[x*x-1];

cin>>x;

while (x!=0)

{

if(x>0&&x<=1000)

for(int i=0;i<(x*x)-1;i++)

b;

for(int j=0;j<x-1;j++)

{

for(int c=0;c<x;c++)

{

cin>>a[c];

}

cout<<endl;

}

}

سؤالي هذه الخطوه كيف اعملها بالكود..

(كل مرة نسوي ازاحة(تحريك او لف )مع اتجاه عقارب الساعة للحلقة الخارجية و مع كل ازاحة نقارن اول صف و اخر صف بالمصفوفة اللي عبيناها

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

اما اذا كانت مرتبة

نشوف الحلقة الداخلية و نسوي معاها مثل ما سوينا مع الحلقة اللي قبلها اللي اكبر منها

بعد ما ننهي اختبار المصفوفة و اذا طلعت تترتب خلاص نطبع كلمة yes )

وهل كودي السابق صحيح مئه بالمئه ارجو المساعده..

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

ولكم جزيل الشكر..

تم تعديل هذه المشاركة بواسطة هدوء المطر في 14 مايو 2012 في 19:14

#2

السلام عليكم هذا تصحيح الكود اللي بالأعلى

وبداية البرنامج..

#include<iostream>

using namespace std;

int main()

{

int size;

int count=0;

do{

cout<<endl;

cout<<"Enter the size of the grid: ";

cin>>size;

int y=size+1;

int b=size;

int a;

int t[size*size];

cout<<endl;

if(size>1000)

cout<<"Please, enter number less than 1000 \n";

else

for(int i=1;i<=size*size;i++){

if(i==y){

cout<<endl;

cout<<i<<"\t";

y=y+size;

}

else{

cout<<i<<"\t";}

} if(size!=0)

{

cout<<endl;

cout<<"Enter the elements of your grid"<<endl;

for(int s=0;s<size;s++){

for(int r=0;r<size;r++)

{

cin>>a[r];

cout<<endl;

count++;

}

}

}

else

{

cout<<"End of the program\n";

break;

}

}while(1);

return 0;

}

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

ابغى اطبعها في مصفوفه ذات بعدين عشان بعدين اقارن فيها

كيف اسويها بالترتيب في مصفوفه ذات بعدين؟؟؟

for(int i=1;i<=size*size;i++){

if(i==y){

cout<<endl;

cout<<i<<"\t";

y=y+size;

}

else{

cout<<i<<"\t";}

والاستفسار الثاني:كيف اعمل عملية الازاحه وكيف أقارن على أي أساس؟؟؟

يوجد لدي كود ممكن يسهل عملية الازاحه او تفهموها لاني مافهمت الكود

هذا هو:

public static void rotate(int[][] matrix,int n)

{

int( layer = 0;layer < n/2;++layer){

int first = layer;

int last = n -1 - layer;

for(int i = first;i<last;++i){

int offset = i - first;

int top = matrix[first];

matrix[first] = matrix[last-offset][first];

matrix[last-offset][first] = matrix[last][last-offset];

matrix[last][last-offset] = matrix[last];

matrix[last] = top;

}

}

}

اتمنى احد يرد..

تم تعديل هذه المشاركة بواسطة هدوء المطر في 16 مايو 2012 في 17:28

#3

يا جماعة سؤال اﻻخت بالمرفقات سهول التنزيل والعمل علية.

cxxxxxxxxxxxxxx.pdf

أو يمكنكم استعراض المشكلة من صفحتى الموقع الشهرين فى المشاكل البرمجية:

1-Rotating Rings على موقع spoj.pl

2-Rotating Rings على موقع poj.org

والله من وراء القصد..

تم تعديل هذه المشاركة بواسطة AudaNix في 16 مايو 2012 في 18:24

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

مشكور أخوي AudaNix

#5

هذا شرح بسيط توصلت اليه لكن لا اعرف كيف أنفذه

لو أدخل المستخدم الرقم 4 مثلا

سوف تصبح المصفوفه 4*4

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

لما تترتب نلف الحلقه الداخليه وهي عباره عن ثاني صف والصف الثالث والعمود الثاني والثالث الين تترتب

سهله العمليه جدا لما كانت 4*4

أما لو اعتبرنا ان المستخدم دخل رقم 7 مثلا

هنا نلف الحلقه الخارجيه اول صف واخر صف واول عمود واخر عمود..<<هذي اول حلقه

لكن الحلقه التاليه حتكون ثاني صف والصف قبل الاخير وثاني عمود والعمود قبل الاخير

والحلقه الثالثه حتكون ثالث صف والصف الثالث من الاخير وثالث عمود والعمود الثالث من الاخير

ويتبقى مربع واحد فقط بالوسط <<لاحظت انه لو ادخل المستخدم عدد فردي بيكون فيه رقم بالوسط هذا ثابت ما نغيره ولا نحركه

اتمنى تكونوا فهمتوا علي

اذا كتبتو او رسمتو بورقه بتفهموها مضبووط..

اذا لفينا الحلقه الخارجيه بعد كل لفه نقارنها بالمصفوفه الاساسيه اللي احنا مخزنين فيها الارقام بالترتيب<<هذي المصفوفه ماعرفت اسويها؟؟

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

اتمنى لو احد يعرف كيف بتتنفذ بالاكواد

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

والله محتاجه احد يتناقش معاي فيه يمكن افهم وانتبه على اشياء ماجات في بالي

#6

هل من testcases ليتم التجربه؟؟

مدونتي: C++ Tips and Tricks

#7

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

هل يجب ان يكون اسلوب التدوير اما كله مع عقارب الساعه او عكس عقارب الساعه؟ يعني اسلوب التدوير موحد لكل الحلقات

اسلوب الترتيب ascending, descending ام استطيع الاختيار؟

الحلقه

تتكون من ولنفرض ان السطر نضعه في متغير row فان سطري الحلقه هما row, size-1-row حيث ان size هو حجم المصفوفه

الاعمده تبدأ من col=row وحتى col=size-1-row

عدد التكرارات هي عبارة عن size/2 +1 حيث ان القسمه integer division و الحلقه الاخير حجمها 1x1 ويمكننا اهمالها واخذ size/2

تحياتي

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#8

نعم أستطيع البدء من أي مكان في الحلقه..وأسلوب التدوير ليس شرط أن يكون مع عقارب الساعه أو عكسها

وليس شرط أن يكون موحد لجميع الحلقات

#9

بقراءة محتوى ملف الـ pdf الموجود بالمشاركه الثالثه و بتحليل بسيط نجد ان:

5x5 = 25
ring(s) count = 5/2 = 2
special ring = 5%2 = 1

Ring 1:
  count = 2*(5-0) + 2*(5-2) = 10 + 6 = 16
  start = ring0_end + 1 = 0 + 1 = 1
  end   = ring0_end + count = 0 + 16 = 16

Ring 2:
  count = 2*(5-2) + 2*(5-4) = 6 + 2 = 8
  start = ring1_end + 1 = 16 + 1 = 17
  end   = ring1_end + count = 16 + 8 = 24

S. Ring = 25

********************************
8x8 = 64
ring(s) count = 8/2 = 4
special ring = 8%2 = 0

Ring 1:
  count = 2*(8-0) + 2*(8-2) = 16 + 12 = 28
  start = ring0_end + 1 = 0 + 1 = 1
  end   = ring0_end + count = 0 + 28 = 28

Ring 2:
  count = 2*(8-2) + 2*(8-4) = 12 + 8 = 20
  start = ring1_end + 1 = 28 + 1 = 29
  end   = ring1_end + count = 28 + 20 = 48

Ring 3:
  count = 2*(8-4) + 2*(8-6) = 8 + 4 = 12
  start = ring2_end + 1 = 48 + 1 = 49
  end   = ring2_end + count = 48 + 12 = 60

Ring 4:
  count = 2*(8-6) + 2*(8-8) = 4 + 0 = 4
  start = ring3_end + 1 = 60 + 1 = 61
  end   = ring3_end + count = 60 + 4 = 64

بإستخدام هذا التحليل يمكن كتابة كود لمعرفة هل المصفوفه قابله للدوران ام لا، فمثلا مصفوفه 8x8 تتكون من 4 حلقات و الحلقه الثالثه بها عدد عناصرها 12 و تبدأ من 49 و تنتهي عند 60 و بتخزين مجموع الأرقام فى هذا المدى و مقارنته بالموجود فعليا سنعرف هل تحتوى هذه الحلقه تحتوى على جميع الأرقام فى المدى المطلوب ام لا، بالطبع سنقوم بالتحقق من محتوى جميع الحلقات اولا فإن كان المجموع سليم لكل الحلقات حينها يتم معرفة مكان اصغر عنصر بكل حلقه و يمكن الحصول عليه أثناء عمل scan على المصفوفه من الملف.

قم بعمل scan و تأكد ان اصغر رقم فى الحلقه هو نفسه رقم البدايه لهذه الحلقه و ابدء بزيادة واحد على هذا الرقم و قارنه بالموقع التالي فإن كان يساويه فأكمل و غن كان لا يساويه فهذا يعنى ان المصفوفه غير قابله للتدوير.

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

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة Μωάμεθ αλάά في 17 مايو 2012 في 22:17

3

مدونتي: C++ Tips and Tricks

#10

قمت بكتابة حل لها و اريد test cases للتجربه؟

تم تعديل هذه المشاركة بواسطة Μωάμεθ αλάά في 19 مايو 2012 في 20:16

مدونتي: C++ Tips and Tricks

#11
Μωάμεθ αλάά كتب:

قمت بكتابة حل لها و اريد test cases للتجربه؟

(1):

9 5 1 2

13 7 11 3

14 6 10 4

15 16 12 8

(2):

1 2 3

5 6 7

8 9 4

(3):

3 1 4

6 5 9

2 7 8

#12

الـ Test case التى قمت بوضعها صغيره جدا و قام البرنامج الذى كتبته بالتعامل معها بدون مشاكل - جميعهم غير قابل للتدوير - ما ابحث عنه هو test case ذات احجام اكبر من التاليه:

8
19   20   21   22   23   24   25   26
18   37   38   39   40   41   42   27
17   36   52   53   54   55   43   28
16   35   51   64   61   56   44    1
15   34   50   63   62   57   45    2
14   33   49   60   59   58   46    3
13   32   31   30   29   48   47    4
12   11   10    9    8    7    6    5

الكود الذى كتبته حتى الأن يعمل على 3 مستويات من التحقق:

الأول: عند عمل scan يتم التأكد من ان الرقم المدخل يقع داخل مدى الأرقام الخاص بالحلقه المطلوب وضعه بها (فى هذه المرحله كل الـ test case التى وضعتها فشلت)، أثناء عمل الـ scan يتم حفظ موقع اكبر رقم و اصغر رقم داخل الحلقه، أيضا يتم حفظ مجموع الأرقام داخل كل حلقه.

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

الثالث: جميع الحلقات تحتوى على الأرقام بشكل سليم لذا يتم التأكد من توزيعهم بشكل يتيح تدويرهم و لا مشكله إذا كان تدوير كل حلقه مختلف عن الأخرى.

توجد لدى اكثر من طريقه لإختبار التدوير و حتى الان الكود الخاص بهم مكتوب بالـ VBA - لإختباره على Excel - و لم اقم بتحويله بعد، إن شاء الله سأنتهى منه كحد أقصى اليوم و سأضعه لك غدا.

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

#13

اول test case قمت بوضعها المفترض ان تكون قابله للتدوير!!!

4

9 5 1 2

13 7 11 3

14 6 10 4

15 16 12 8

وهذه المفترض تكون قابله للتدوير..

11

44 55 66 77 88 99 110 121 120 119 118

33 16 17 18 19 20 21 32 43 54 117

22 15 94 93 92 91 81 69 58 65 116

11 14 95 39 40 41 52 63 47 76 115

10 13 96 38 73 72 71 74 36 87 114

9 24 97 37 62 61 70 85 25 98 113

8 35 86 48 51 50 49 84 26 109 112

7 46 75 59 70 81 82 83 27 108 111

6 57 64 53 42 31 30 29 28 107 100

5 68 79 90 101 102 103 104 105 106 89

4 3 2 1 12 23 34 45 56 67 78

#14

من الواضح اني فهمت السؤال بشكل خاطئ جدا!! :S

سأعيد قراءة الملف مره اخرى.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#15
v → s كتب:

من الواضح اني فهمت السؤال بشكل خاطئ جدا!! :S

سأعيد قراءة الملف مره اخرى.

و الله ولي التوفيق

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

لقد قمت سابق بتحليل مشكلة Kind of a Blur وكودتها. حقيقا أمر يشيب الشعر

نسأل الله المستعان ان يعيننا على هذة المشكلة لقد بدءت بقراء المشكلة من الرابط:. Rotating Rings

وهذا التحليل البسيط ان شاء الله سيساعدنا فى كتابة اﻻكواد:

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

أنظر معى الى المصفوفة 4*4 التالية:

post-247365-048941400 1338284066_thumb.p

عند تخيلها فى صورة حلقات تبدو بالشكل التالى كل حلقة على حدة:

post-247365-097667700 1338284082_thumb.p

بعد هذا التخيل نسأل أنفسنا سؤال هل يمكن الحصول على 4 عناصر متتالية من الحلقة اﻻولى (انتبة عندما اقول حلقة فجيب عليك تخيلها كأنها صف واحد طويل مكون من 12 عنصر.) بشرط ان تكون عناصر مرتبة .

نعم يمكننى انظر المربعات الحمراء بالصورة التالية للحلقة اﻻولى. أذا هى حلقة مقبولة وتأخذ ok

post-247365-062358500 1338284106_thumb.p

ولماذا طلبنا 4 عناصر ولم نطلب 2 أو 3 ﻻنة يجب ان يوكن عدد العناصر ﻻيقل عن عدد عناصر صف فى الحلقة. بتوضيح:

فى الحلقة اﻻولى مطلب 4 عناصر متتالية ومرتبة في أى مكن بالحلقة.

فى الحلقة الثانية مطلوب 2 عنصر متتالي ومرتبين فى اى مكان بالحلقة.

انظر عناصر الحلقة الثانية:

post-247365-022704500 1338284824_thumb.p

وعند النظر الى الحلقة الثانية بالمربعات الحمراء نجد انها بها عنصرين مرتبين ومتتالين أذا هى حلقة مقبولة وتأخذ ok

ومن نتيجة الحلقة اﻻولى والثانية نطبع رسالة OK للمستخدم ونقول له نعم هذة المصوفة متابقة للشروط.

ﻻحظ انة فى التمرين لم يطلب منك عملية التدوير

أنظر الحلقة اﻻولى قبل وبعد التدوير:

post-247365-027491500 1338285329_thumb.p

لكن مطلوبة كما وضحنا سابقنا.

وهكذ الحلقة الثانية.

واﻵن وبعد ان حللنا المشكلة وعرفنا المطلوب نتأتى لكى نتناقش فى طرق الحل وهذا بعد صلاة الظهر أن شاء الله.

المرفقات
1.png1+2.png4.png5.png6.png
1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#16

بعد اﻻنتهاء من التحليل نأتى الى أفكار حول الكود:

لو رجعنا الى السؤال نجدة حدد المدخلات فى جزئين :

  • جزء يحدد عدد عناصر المصفوفة كـ 2 يقصد مصفوفة 2*2 أو 3 يقصد مصفوفة 3*3 وهكذا .....
  • عناصر المصفوفة فى سورة صفوف وهذا ما سنحاول معالجة من خلال اﻻكواد.

نحن بحاجة الى:

  • عدد الحلقات فى المصفوفة .
    1. بالنسبة للصفوفات الزوجية أى 2*2 أو 4*4 = عدد عناصر الصف / 2
    2. بالنسبة للصفوفات الفردية أى3*3 أو 5*5 = عدد عناصر الصف-1 / 2
    3. بشكل عام = عدد عناصر الصف /2 انتهينا.

    [*]تتبع عناصر كل الحلقة بالتتالى من بداية الحلقلة الى نهايتها.

    [*]بعد النجاح فى عملية التتبع ندمج كود التحقق من وجود عناصر مرتبة متتالية .

وبذلك نكون انتهينا من كود المشكلة.

النتقتين اﻻخيرتين ستحتاج منا الى تفكير وتحليل على الورق ..

لى رجعة ان شاء الله والله من وراء القصد.

تم تعديل هذه المشاركة بواسطة AudaNix في 29 مايو 2012 في 13:41

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#17
v → s كتب:

من الواضح اني فهمت السؤال بشكل خاطئ جدا!! :S

سأعيد قراءة الملف مره اخرى.

و الله ولي التوفيق

جزاك الله خير ..

وجعل مابذلت من مجهود في ميزان حسناتك..

#18

اخي AudaNix هل سنحتاج لازاحه ام لا؟؟

فهمت من شرحك اننا لانحتاج لازاحه اي نعمل تدوير للحلقه الواحده نحرك الرقم من الاندكس الخاص فيه الى الاندكس الاصغر منه اذا كان عكس عقارب الساعه

واذا كان الدوران مع عقارب الساعه الى الاندكس الاكبر منه..!!

ثم اقارنها بالمصفوفه الاساس(تكون مصفوفه مرتبه بالاعداد من واحد الى تربيع الرقم الذي ادخله المستخدم)

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

اذا كان فهمي صحيح فمن الممكن ان نحتاج لمصفوفه ثالثه للمقارنه..

وشكرا لك على شرحك للمسئله وتبسيطها..

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

>>للمعلوميه لا اعلم ان كان هناك خطأ في فهمي للمسئله لاني مبتدئه لم ااخذ غير ماده برمجه1>>

اتمنى ان تفيدني في اسرع وقت لان اخر موعد يوم الجمعه الساعه 12 ظهرا لتسليم الحل..

#19

نعم لا يوجد تدوير للحلقة

كل ما عليك فعلة هو ان تقول ان الحلقة بها عناصر مرتبة أم لا بعدد لا يقل عن عدد الصف الاول فى الحلقة

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#20

هذا كود ﻻدخال حجم المصفوفة وحجز قيمها ديناميكيا والباقية تأتى:

/* 
 * File:   main.cpp
 * Author: Mohammed Abu Zayed
 * Created on May 29, 2012, 10:03 AM
 */

#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    unsigned int SizeOfGird = 7;
    int Rows, Cols, i, x;
    int *pnewrow;
    int **Gird = new int * [Rows];
    // Allocating memroy for Gird .... 

    cout << "Enter Size Of gird: ";
    cin >> SizeOfGird;

    Rows = SizeOfGird;
    Cols = SizeOfGird;
    for (i = 0; i < Rows; i++)
    {
        pnewrow = new int[Cols];
        *(Gird + i) = pnewrow;
        for (x = 0; x < Cols; x++)
        {
            cout << "Row: " << i + 1 << " Col: " << x + 1 << ": ";
            cin >> *(*(Gird + i) + x);            
        }
    }

    if (SizeOfGird == 0)
        cout << "1.no";
    else if (SizeOfGird == 1)
        cout << "1.Yes";
    else
    {
        for (i = 0; i < Rows; i++)
            for (x = 0; x < Cols; x++)
                cout << Gird[x] << " " ;

    }
    return 0;
} // end of main

هذا والله من وراء القصد

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#21

جزاك الله خير

أنا بانتظارك

أتمنى معرفة كيفية عمل الكود الاتي لانه الاهم وانا اريد الاستفاده بكيف قمت بعملية التتبع..

ولك مني خالص الدعاء

#22
هدوء المطر كتب:

جزاك الله خير أنا بانتظارك

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

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

اليوم سنضيف برنامج الحلقه المستديرة Rotating Rings

نقطة الوصول الى كل حلقة على حدا.

البرنامج التالى سوف يطبع كل الحلقات فى مصفوفة 8 * 8

لاحظ طباعة الحلقة من اليسار الى اليمين ثم من أعلى الى اسفل ثم من اليمين الى اليسار ثم من اسفل الى أعلى

فى المرة القادمة:

  1. سوف ننشئ مصفوة ديناميكية لتخزين كل حلقة على حدا
  2. أيجاد مجموعة من العناصر المتجاورة والمرتبة تصاعديا بعدد عناصر صف فى الحلقة. النقطة هذة فى القليل من الصعوبة فكر ماذا لو كانت هناك علاقة بين العنصر الاول والاخير كيف تربط بينهما هنا تكمن فكرة التدوير .

الكود:

/* 
 * File:   main.cpp
 * Author: Mohammed Abu Zayed
 * Created on May 31, 2012, 06:51 AM
 */

#include <cstdlib>
#include <iostream>
using namespace std;

int main(void)
{
    int Rows = 0, Cols = 0, i = 0, x = 0;
    int SizeOfGird = 0;
    cout << "Enter Size Of gird: ";
     cin >> SizeOfGird;
    Rows = SizeOfGird;
    Cols = SizeOfGird;
    int *pnewrow = 0;
    int **Gird = new int * [Rows];
    // Allocating memroy for Gird ....    
    int xx = 10;
    for (i = 0; i < Rows; i++)
    {
        pnewrow = new int[Cols];
        *(Gird + i) = pnewrow;
        for (x = 0; x < Cols; x++)
        {
            // cout << "Row: " << i + 1 << " Col: " << x + 1 << ": ";
            *(*(Gird + i) + x) = xx++;
        }
    }
    for (i = 0; i < Rows; i++)
    {
        cout << endl;
        for (x = 0; x < Cols; x++)
        {
            cout << Gird[x] << " ";
        }
    }
    cout << endl << "------" << endl;

    int ring = 0, RingPerGird = 0;
    RingPerGird = SizeOfGird / 2;

    for (ring = 0; ring < RingPerGird; ring++)
    {
        cout << "Ring : " << ring + 1 << ": ";       

        // from left to right
        for (i = ring; i < (Cols - ring); i++)
            cout << *(*(Gird + ring) + i) << " ";

        // form top to down
        for (i = ring + 1; i < (Cols - ring - 1); i++)
            cout << *(*(Gird + i) + Cols - ring - 1) << " ";
        // from left to right

        for (i = ring; i < (Cols - ring); i++)
            cout << *(*(Gird + Rows - ring - 1) + Cols-1-i) << " ";                

        // from Down to top
        for (i = ring + 1; i < (Cols - ring - 1); i++)
            cout << *(*(Gird + Rows-i-1) + ring) << " ";

        cout << endl;
    }
    return 0;
} // end of main

المخرجات:

Enter Size Of gird: 8

10 11 12 13 14 15 16 17 
18 19 20 21 22 23 24 25 
26 27 28 29 30 31 32 33 
34 35 36 37 38 39 40 41 
42 43 44 45 46 47 48 49 
50 51 52 53 54 55 56 57 
58 59 60 61 62 63 64 65 
66 67 68 69 70 71 72 73 
------
Ring : 1: 10 11 12 13 14 15 16 17 25 33 41 49 57 65 73 72 71 70 69 68 67 66 58 50 42 34 26 18 
Ring : 2: 19 20 21 22 23 24 32 40 48 56 64 63 62 61 60 59 51 43 35 27 
Ring : 3: 28 29 30 31 39 47 55 54 53 52 44 36 
Ring : 4: 37 38 46 45 

RUN SUCCESSFUL (total time: 2s)

هذا والله من وراء القصد.

تم تعديل هذه المشاركة بواسطة AudaNix في 31 مايو 2012 في 20:02

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#23

فهمت الكود ولكن لماذا بدأنا المصفوفه من العدد 10 ؟؟

وفقك الله..

#24
هدوء المطر كتب:

فهمت الكود ولكن لماذا بدأنا المصفوفه من العدد 10 ؟؟

وفقك الله..

فى هذا الكود شبة النهائى يتم تعبة عناصر المصفوفة بقيم من المتغير xx يبدأ بــ 10 وذلك لتسهيل عملية الادخال.

لكن فى الكود النهائى سيتم ادخال قيم المصفوفة بواسطة المستخدم.

أم أنك تصدين شئ آخر؟

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#25

اليس من المفترض ان يكون xx يبدأ من واحد

لانه في المسئله الgride تبدا من 1 وتنتهي بتربيع الرقم وليس من 10

هل يوجد فرق اذا بدأت بعشره ام اني لم افهم الخطوه هذه جيدا؟؟

مواضيع مشابهة