Big_Brother
02-21-2008, 07:17 PM
#include<iostream.h>
void main()
{
int a[3][3]={{4,6,9},{4,3,1},{5,8,8}};
}
أنشئ دالة تطبع القيم المخزنة بالمصفوفة السابقة بشرط استخدام حلقة
For
واحدة
فرجوني شطارتكم
:cool:
Golden man
02-22-2008, 02:03 AM
سؤال جميل ...
هذا حلّي و هو قابل لاستقبال أي مصفوفة بأي بُعد فقط بتغيير قيمة الثابت Len ...
و تتم طباعة كل مصفوفة جزئية على سطر :
#include<iostream.h>
const int Len = 3;
void Print2DimArrByOneLoop(int Arr[][Len],int h,int w)
{
for(int i=0; i<w*h; i++)
{
cout<<Arr[i/h][i%w];
if(i%h == h-1)
cout<<endl;
}
}
void main()
{
int a[Len][Len]={{4,6,9},{4,3,1},{5,8,8}};
Print2DimArrByOneLoop(a,Len,Len);
}
هذه إحدى الطرق فأرجو من بقية الطلاب إبداء طرقهم.....
مــحــمــد
02-22-2008, 01:55 PM
السلام عليكم ورحمة الله وبركاته ....
مشكور كتير أخي الكبير على هالفكرة الحلوة ..
والعنوان الأحلى اللي بيعطي حماس للتفكير والتحدي ..
الفكرة: أنو ليش نحصر مخنا أنو حلقة for هي بس حلقة التكرار لأنو في while كمان ولا هي بنت البطة السودة :)
وبدي أتشكر أخي غولدن مان اللي خلاني ركز فكرة التوابع اللي أخذناها البارحة إلى حد ما ...
وياريت أخي غولدن تشرحلنا آلية تنفيذ البرنامج وبكون ممنونك لأنو لساتني جديد على التوابع...
وهي بحلقة for وحدة :
#include <iostream.h>
void main ()
{
int a[3][3]={{4,6,9},{4,3,1},{5,8,8}};
int x=0;
for (int i=0 ; i<3 ;i++)
{
while ( x<3 )
{
cout <<a[i][x]<<'\t';
x++;
}
cout<<'\n';
x=0;
}
}
وهي بلا for بالمرة :) :
#include <iostream.h>
void main ()
{
int a[3][3]={{4,6,9},{4,3,1},{5,8,8}};
int x=0;
int i=0;
while (i<3)
{
while ( x<3 )
{
cout <<a[i][x]<<'\t';
x++;
}
cout<<'\n';
x=0;
i++;
}
}
بانتظار رد الأخ غولدن مان على أحر من الجمر مشان ركز التوابع بهالمثال...
هلأ اللي عرفت من الحل أنو التابع الذي أختاره أخي لايرد قيمة وله متطلبات (parameters)....
واعرفت شلون استدعينا و بس :)
Bl@ck Angel
02-22-2008, 06:03 PM
السلام عليكم ...
حلي يعتمد على العودية إن شاء الله يكون عندكم فكرة عنا.....
على كل حال مبدأ العودية يعتمد على إستدعاء التابع في كود التابع ( يعني بستدعي حالو )
الحل هو :
#include<iostream.h>
int i=0;
void PrintArray(int a[][3],int L)
{
for(int j=0;j<L;j++)
{
cout<<a[i][j]<<" ";
}
cout<<"\n";
i++;
if(i<L)
PrintArray(a,L);
}
void main()
{
int a[3][3]={{4,6,9},{4,3,1},{5,8,8}};
PrintArray(a,3);
}
إن شاء الله كون فدتكم
سلام ......
Golden man
02-23-2008, 11:59 AM
تفاعل جميل ....
بس في فكرة حابب وضحها .
حلقة for و حلقة while نفس الشي تماما و ما في فرق بينهم إلّا syntax .
و السؤال كان حل التمرين بحلقة واحدة يعني loop واحدة, نهاية لا فرق بين for و while
و حتى في نوع من الـ loop بيكون باستخدام العودية و هيي الطريقة يلي اتبعها أستاذي Black angel و لكن نهاية يعتبر أيضا أنه استعمل 2 loop
أرجو محاولة حل السؤال بـ loop واحدة لأنها فكرة رائعة و تحتاج لمجموعة حسابات بسيطة.
في فكرة باستخدام الشروط.
بالنسبة للتوابع ما إلها علاقة بفكرة حللي و إنما الفكرة بالوصول للمكان الصحيح بالمصفوفة الثنائية البعد بكل دور من دورات الحلقة.
و ان شا الله إذا فضيت بحط درس صغير للتوابع و فائدتها بس اصبروا عليي شوي لأنو مضغوط كتير هالفترة.
معتصم بكري
02-23-2008, 12:45 PM
أسف على التأخير وهاد حلي
#include<iostream.h>
void printArray(int arr[][3] ,int ver ,int hor)
{
int n=0;
int m=0;
for(int x=0 ; x < ver*hor ; x++)
{
cout<<arr[m][n];
n++;
if(n==ver)
{
n=0;
m++;
cout<<endl;
}
}
cout<<endl;
}
//---------------------------------------------------------------------
void main()
{
int a[3][3]={{4,6,9},{4,3,1},{5,8,8}};
printArray(a,3,3);
}
Executioner
02-23-2008, 01:15 PM
السلام عليكم ورحمة الله وبركاته، وبعد:
بصراحة أول ما شفت السؤال وأريت حل Golden man قلت لحالي سؤال حلو وقوي، بس بعد ما كملت وعرفت شو قصدك لئيت أنو السؤال بسيط للغاية، فسؤالك انو بحلقة فور واحدة بسيط ولكن السؤال كان لازم يكون استخدام حلقة واحدة لا على التعيين لكي يكون السؤال أقوى ومع ذلك موضوع جميل للغاية دفع عدة أشخاص للمشاركة ودفعني أيضاً عنوانه وإلحاحك بحلول إضافية بالمشاركة.
بالنسبة لسؤالك، مثل ما جاوبوك البعض بإمكانا نستخدم حلقة for و while أو do while، ونهاية جمعت الحلول كلها (طبعا كلها حلقتين لا على التعيين فلا يوجد هناك فرق كبير بين الحلقات الثلاث فكلهم يؤدون نفس المهمة):
حلقتي do while:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
int i=0;
do {
int j=0;
do {
cout << a[i][j] << "\t";
j++;
} while (j<CountColumn);
cout << endl;
i++;
} while(i<CountLine);
}
حلقتي while:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
int i=0;
while (i<CountLine)
{
int j=0;
while (j<CountColumn)
{
cout << a[i][j] << "\t";
j++;
}
cout << endl;
i++;
}
}
حلقتي for:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
for (int i=0; i<CountLine; i++)
{
for (int j=0; j<CountColumn; j++)
{
cout << a[i][j] << "\t";
}
cout << endl;
}
}
حلقة for وأخرى while:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
for (int i=0; i<CountLine; i++)
{
int j=0;
while (j<CountColumn)
{
cout << a[i][j] << "\t";
j++;
}
cout << endl;
}
}
حلقة for وأخرى do while:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
for (int i=0; i<CountLine; i++)
{
int j=0;
do {
cout << a[i][j] << "\t";
j++;
} while (j<CountColumn);
cout << endl;
}
}
حلقة while وأخرى for:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
int i=0;
while (i<CountLine)
{
for (int j=0; j<CountColumn; j++)
{
cout << a[i][j] << "\t";
}
cout << endl;
i++;
}
}
حلقة while وأخرى do while:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
int i=0;
while (i<CountLine)
{
int j=0;
do {
cout << a[i][j] << "\t";
j++;
}while (j<CountColumn);
cout << endl;
i++;
}
}
حلقة do while وأخرى while:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
int i=0;
do {
int j=0;
while (j<CountColumn)
{
cout << a[i][j] << "\t";
j++;
}
cout << endl;
i++;
} while(i<CountLine);
}
حلقة do while وأخرى for:
#include <iostream.h>
void main()
{
const CountLine= 4, CountColumn= 3;
int a[CountLine][CountColumn]= {{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
int i=0;
do {
for (int j=0; j<CountColumn; j++)
{
cout << a[i][j] << "\t";
}
cout << endl;
i++;
} while(i<CountLine);
}
عذرا على الإطالة السابقة واللاحقة.
أما بالنسبة لحل السؤال إذ ماكان باستخدام حلقة واحدة لا على التعيين، فأبدأ بحل أستاذي Golden man بصراحة حل حلو وجميل للغاية، لك شلون خطرت على بالك يعني حل رائع أكيد بعد الخبرة يلي اكتسبتها من تمارين ال Usaco على كل حال، بحب علق على الحل أنو في مشكلة وهي أنه في حال اختلفت الأبعاد سيكون هناك مشكلة، اما في حال كانت الأبعاد متغيرة بس الطول نفسه العرض فكل شي تمام، فعدلت على الكود ببعض الأماكن التي وردت فيها هذه المشاكل:
اولها: أنه كان يجب أن يضع w بدلا من h عند الطباعة.
ثانيها: أنه عند نزول سطر جديد أيضا يجب أن يضع w بدلا من h أما استخدام h فهو كان فقط لمعرفة وحساب عدد عناصر المصفوفة، طبعا وهو ادرى، وهذا هو الكود بعد التعديل:
#include <iostream.h>
const int Len = 3;
void Print2DimArrByOneLoop(int Arr[][Len],int h,int w)
{
for(int i=0; i<w*h; i++)
{
cout << Arr[i/w][i%w] << " ";
if(i%w == w-1)
cout << endl;
}
}
void main()
{
int a[4][Len]={{4,6,9},{4,3,1},{5,8,8},{1,2,5}};
Print2DimArrByOneLoop(a,4,3);
}
أما حل أخي وأستاذي Bl@ck angel فهو تقريبا نفس الحل تبعي (القلوب عند بعضها)، يعني كنت بدي حط الحل تبعي قبلو بس سبقني فانا أيضا خطر على بالي الحل العودي ولكن بأسلوب آخر فحل أخي بلاك فيه مشكلة صغيرة برأيي ما بعرف إذا بشاركني فيها أنو بهذه الحالة كأنو استخدم 3 حلقات فور وبالتالي هو مناسب للسؤال المطروح و ليس بالنسبة للسؤال الذي برأيي يجب أن يكون حلقة لا على التعيين، إضافة لذلك فهذا الحل لا ينطبق على أي مصفوفة بأي بعد أي ليس عام، ومع ذلك فهو رائع جدا جدا، بس بما انو بيشبه حلي خلص بحطه بالمرتبة الأولى.
أما بالنسبة لحلي فكان أيضا عوديا، حيث سيقوم بطباعة كل سطر من أسطر المصفوفة عودياً، وهو بأي بعد أيضاً، أرجو إعطاء رأيكم فيه:
#include <Iostream.h>
void PrintArray(int a[][100], int CountColumn, int i, int j)
{
if (j<CountColumn)
{
cout << a[i][j++] << "\t";
PrintArray(a,CountColumn,i,j);
}
else
return;
}
void main()
{
int CountLine=3, CountColumn= 3;
int a[100][100]={{5,2,4},{2,15,8},{0,1,2}};
for (int i=0; i<CountLine; i++)
{
PrintArray(a,CountColumn,i,0);
cout << endl;
}
}
آسف للتعليقات الكثيرة على حلول غيري، مثل مابتعرفوا إخواتي فأحدهم انا من أفراد مشروعه، والثاني من الأعداء، عفوا عفوا من الأعدقاء، عفوا عفوا (هدول ناس تانيين)، هو من الذين أحاول أن أصل إلى مستواهم وأن أنافسهم.
آسف على الكلام الكتييييير والممل.
على كل حال شو رأيكم (Golden man و Bl@ck angel بالأخص) حول انه هنا في هذه الحالة عندما استخدمنا حلقة واحدة أصبح التعقيد أقل من أن نستخدم حلقتين متداخلتين (يلا حلوها وظيفة شوفو التعقيد).
طبعا انا آسف جداً على فانا حضرت الرد قبل فترة منيحة بعدين حطيتو لما صحلي، فحسب مالي شايف في مشاركات تانية، إضافة لذلك شايف عمو Golden man كان عم يفكر متل ما كنت عم فكر.
والسلام عليكم ورحمة الله وبركاته