المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : بعض المسائل في ++c


Executioner
02-25-2008, 05:39 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته، وبعد:
http://www.100hla.com/up/uploads/b161f2f64c.gif (http://www.100hla.com/up/uploads/b161f2f64c.gif)
في كم تمرين حلوين جايي على بالي حطهم لشوف من حيستطيع يحلهم (طبعا باستثناء الأخوة الأكارم Goden man و Bl@ck angel لأنهم من المحترفين، طبعا وهناك غيرهم أيضا ولكنهم قليلا ما يشاركون :))، ولكل تمرين في كم فكرة يمكن اشرحها لأن طلاب السنة الأولى مالهم آخدينهم، وإذا لقيت تفاعل في حل هذه الأسئلة والتمارين يمكن كمل وحط غيرها. أما هدول المحترفين إذا جايي على بالهم يشاركوا بسيطة بنحطلهم شي برنامج معت وطوييييل :D.
على كل حال سأبدأ بالسؤال الأول:
بدي برنامج يقرأ سطر من المحارف (من الممكن أن يحتوي على فراغات أو علامات ترقيم) ويقوم بطباعته بالمعكوس، بدون استخدام توابع أخرى غير التابع الرئيسي، وبدون استخدام المصفوفات http://www.100hla.com/up/uploads/953aa8f38e.gif (http://www.100hla.com/up/uploads/953aa8f38e.gif).
في فكرتين لازم ينشرحوا ولو بشكل بسيط:
أولا: التوابع: تشبه التابع الرئيسي ال main، يكون تعريفها كالتالي:

return_Value_Type Function_Name (Paramerter_list)
{
// instructions.
}
اسم نمط القيمة المردة ثم اسم التابع (قائمة من البرامترات)
قوس بداية وآخر للنهاية وبينهما التعليمات وإلخ...
مثال تابع يجمع عددين صحيحين ويرد نتيجة الجمع:

int GetSum(int x, int y)
{
return x+y;
}

مثال آخر تابع يقوم بطباعة مصفوفة حيث ستمرر المصفوفة وبعدها:

void PrintArray(int a[], int n)
{
for (int i=0; i<n; i++)
cout << a[i] << "\t";
cout << endl;
}

طريقة الإستدعاء:

void main()
{
int x=9, y=3;
int a[]= {2,1,5,8,6};
int z;
z= GetSum(x,y);
cout << "Sum1 is: " << z << endl;
cout << "Sum2 is: " << GetSum(5,10) << "\n";
cout << "Array is:" << endl;
PrintArray(a,5);
}

طبعا حتلاحظو بان هناك تابع يرد قيمة والآخر لا، الأول استقبل القيمة ثم وضعت بمتحول (أو من خلال طباعتها مباشرة)، أم الثاني لم يستقبل ولم يطبع لأنه لا يرد أي قيمة (void)، إلخ....
وهناك أنواع للتحميل الزائد (أي عملية تسمية عدة توابع بنفس الاسم):
أن يختلفوا بعدد البرامترات، مثال:

float GetSum(float x, float y)
{
return x+y;
}
float GetSum(float x, float y, float z)
{
return x+y+z;
}

أو أن يختلفوا بأنماط البرامترات او بعضها، مثال:

float GetSum(float x, float y)
{
return x+y;
}
float GetSum(float x, int y)
{
return x+y;
}
أما حالة ان يختلفوا بالنمط المرد فهذا غير صحيح لأنه لن يستطيع التمييز، مثال:
float GetSum(float x, float y)
{
return x+y;
}
int GetSum(float x, float y)
{
return x+y;
}
وهناك العديد من الأمور لم أتطرق اليها (رؤية وما رؤية يعني).
طبعا من الممكن ان يستدعي التابع الرئيسي ال main أحد التوابع.
ومن الممكن أن يستدعي أحد التوابع التابع الرئيسي ال main.
ومن الممكن أن يستدعي التابع تابعا آخر.
ومن الممكن ان يستدعي التابع نفسه (سواء كان أحد التوابع أو التابع الرئيسي)
العودية:
استدعاء التابع لنفسه بطريقة ما، وبشرط ما، يكسر الشرط فيه فيما بعد بطريقة ما (عندها لن يستدعي نفسه)، مثال:
طباعة مصفوفة بشكل عودي:

#include <Iostream.h>
void PrintArray(int a[], int n, int i)
{
if (i<n)
{
cout << a[i] << "\t";
PrintArray(a,n,i+1);
}
return;
}

void main()
{
int a[]= {2,1,5,8,6};
cout << "Array is:" << endl;
PrintArray(a,5,0);
cout << endl;
}
حيث سيتم استدعاء التابع لنفسه عدة مرات حتى يختل الشرط (i<n)، حيث انه من المهم ان نكتب (i+1) بدلا من i لكي يقوم بطياعة العنصر التالي ففي كل استدعاء سيقوم بطباعة عنصر واحد فقط من المصفوفة وعند كسر الشرط سيخرج من جميع التوابع التي تم استدعائها (حاولوا أن تطبقوا عدة أفكار عن العودية مثلا قراءة مصفوفة عوديا او طباعة عدد عوديا .... أرجو أن يكون الشرح قد شكل لديكم فكرة ولو بسيطة عن العودية).
طبعا السؤال يعتمد بشكل رئيسي على العودية، وفهمكم كفاية بآآآآ (ولمزيد من الاستفسارات التواصل مع الإخوة المحترفين).
عذرا على الإطالة السابقة واللاحقة :D:D.
السؤال الثاني:
المطلوب برنامج يقوم بقراءة الاسم (كلمة واحدة) ثم الكنية (كلمة واحدة) ومن ثم طباعة الكنية ثم نقطة ثم أول حرف من الاسم http://www.100hla.com/up/uploads/e79539f695.gif (http://www.100hla.com/up/uploads/e79539f695.gif).
ها ها هون حطينا الجمّال، هون بدنا نتعرف على (get, getline):
بدايةً (cin.get): يقوم بقراءة محرف واحد شو ما كان حتى لو فراغ او انتر فكما نعلم ان (cin) تقرأ ثم تقرأ إلى أن تجد فراغا فتقف أو أنتر.
#include <Iostream.h>
void main()
{
char a= cin.get();
cout << a << endl;
}
ثانياً (cin.getline): يقوم بقراءة سطر بكامله مع الفراغات ويقف إذا ما وجد أنتر او إنتهى بعد المصفوفة.

#include <Iostream.h>
void main()
{
char aa[100];
cin.getline(aa,100);
cout << aa << endl;
}
والله شي متعب.....
المسألة الثالثة:
بدي برنامج بيقرا مصفوفة ثنائية البعد (ثم بعد ذلك يقوم بعدة عمليات وإحصائيات) ثم يقوم بطباعة كون المصفوفة سحرية أم غير سحرية (وكما نعلم تكون المصفوفة سحرية عندما يتساوى مجموع كل من الأسطر مع بعضها مع مجموع كل من الاعمدة مع بعضها مع مجموع القيم في كل من القطر الثانوي والرئيسي للمصفوفة، بس مو أكتر).
ادربوا منيح وطبقوا كتير وحاولوا تحلوهم لانوا إذا إذا إذا إذا http://www.100hla.com/up/uploads/6c4aec507d.gif (http://www.100hla.com/up/uploads/6c4aec507d.gif):D :D حليتوهم حيكون في أسئلة متلهم أو أدسم شوي صغيرة (ادرسوا التوابع).
بس تخلصوا ادربوا على هي المسألة يلي بالمرفقات طبعا هيه تطبيق (exe)، ونصيحة إذا كنتوا ملاقيين حالكم فاضيين أو مليانين لا تاخدوها مشان ما تلتهوا.
ملاحظة إذا اخذتم المرفقات: للتحرك 6 5 4 8 وسبيس لل Fire.
أما السنة الثانية لااا ما بصير لازم يشتغلوا، بداية ساووا كانسة الألغام على Dos، أنتوا ابتعرفوا التوابع وكل شي، لا تقولوا صعبة، لا مو صعبة إذا مشان العرض، جربوا ترسموا جدول باستخدام المحارف - و | باستخدام تابع يمرر له بعد المصفوفة فيرسم جدول خاص بهذه المصفوفة حيث سيكون الجدول عبارة عن مربعات تقريبا وضمن كل مربع سنضع المصفوفة السابقة والتي ستحتوي إما علة فراغ او نجمة لغم او رقم لن يتجاوز 8 او مثلا . أي مربع غير مفتوح، ومشان تخزين الألغام بشكل عشوائي الكل بيعرف أنو فينا نستخدم التابع rand يلي حيعطيا قيم عشوائية، ولأن هذه القيم ستتكرر عند كل مرة نشغل فيها البرنامج نستطيع استخدام srand فهو يغير نقطة البداية للتابع rand حيث ياخذ قيما عددية فمثلا:
إذا حطينا فيه 3 سيعطي التابع العشوائي قيما مثلا 3 5 8 6 2 1
أما عند 8 اعطى 8 9 6 2 0 2
أما عند 15 أعطى 9 0 0 5 15 2
بينما إذا ثبتنا القيمة على أي منها فنفس النتيجة ستتكرر القيم ولو اختلفت فيما بينها.
يفضل أن نعطي التابع srand التابع GetTickCount لأنه سيعطي أجزاء من الثانية، ام التابع time فيعطي ثواني ففي حالته من الممكن ان تتكرر القيم لأن المعالج يستطيع أن يقوم بتنفيذ البرنامج غالبا بأجزاء من الثانية.
ملاحظة: إذا بدكم تجملو كانسة الالغام بإمكانهكم استخدام بعض المحارف المناسبة جدا (دورو بالآسكي) وإذا لازمكم تابع بلون فبعدين بحطوا.
والسلام عليكم ورحمة الله وبركاته.

Executioner
02-26-2008, 10:03 AM
شو شايف ما حدى حل شي، وما حدى سأل على الأقل.

يعني بفهم من هاد الشي انو ما في طلاب سنة أولى ولا حتى ثانية.

بصراحة ما في غير Bl@ck angel و Golden man بفشوا القلب، فياريت يحلوا سؤال كانسة الألغام على Dos مو على Windows :D.

ملاحظة: طبعا المرفقات هيه عبارة عن لعبة بال ++C .


مضى اليوم الأول وما زال الطلاب عاجزين عن حل أي سؤال

صاحـب الظل الطويــل
02-27-2008, 01:55 PM
السلام عليكم :


شو شايف ما حدى حل شي، وما حدى سأل على الأقل.



3smil4smil3smilsmil13smil4smil3smil4smil4smil

SYR_SNIPER
02-27-2008, 04:28 PM
جاييك بالحلول ^^ استناني :d
السئال الأول والثالث شوي بدهن تركيز -,-' وانشالله بحلهن بكرا بس لو تعطينا مثال عليهن بيكون كتر خيرك لانو الفكرة ما استوعبتها منيح ....

حليت السؤال الثاني هلأ معليش مستعجل ^^ كالعادة سلاااااااااام وشكر


#include <iostream>
using namespace std;

void main() {

char rw[100]={0};
char par1[50]={0};
char par2[50]={0};

cin.getline(rw,100);

bool ok=true;
int j=0,p=0,i=0;

for ( ;p<100 ;p++) {
if (rw[p]==0)
break;
if ((rw[p] != ' ')&&(ok)) {
par1[i] = rw[p];
i++;
}
else {
if (ok){
p++;
ok=false;
}
par2[j] = rw[p];
j++;
}
}

cout << par2 <<'.'<<par1[0] <<endl;
}

Executioner
02-28-2008, 02:55 AM
السلام عليكم ورحمة الله وبركاته:

لاااااااااء مو معقول شايف في ردود :rolleyes:، أكيد في خطأ .... ;) ....

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

طبعا انا بعرف انكم مضغوطين، مشان هيك عم حاول حمسكم شوي لشوف مين حيقدر يحل اول شي، فالكل مضغوط.

لك أهلين بالاخ The Ghost على راسي، بس إذا بدك ناس أحسن مني، ..... ..... ولو
:D Golden man & Bl@ck angel :D ..... وأنا شو بدك جاهز، إن شاء الله.

أهلا وسهلا بك أخ SYR_SNIPER بس أنا بعتذر منك (بعد ما تعبت على حل السؤال الثاني) لأنني نسيت أمرا هاما وهو أنه لا يجب هنا استخدام المصفوفات :p.

وبالتالي يا اخي الكريم مو بس السؤال الأول والثالث بدهم تركيز وإنما الكل :D:D...

أما أمثلة امهلوني شوي فالأمور مكركبة عندي، إضافة للضغوطات بأنواعها.

مضى اليوم الثاني وما زال الطلاب عاجزين عن حل أي سؤال

ظريف
02-28-2008, 08:52 AM
اعذروني ما بقدر شارك لأنو ما لساتني جديد على المصلحة يعني لسة ما دخلت بالبرمجة بشكل منيح

لكني نويت اتعلم و انا لما بنوي بنوي

The Ghost :

أنا بعرف Executioner اسمه ????? ?????? بالسنة التانية
و غولد مان اسمه ???? بس ما بذكر كنيته
أما بلاك أنجل ما بعرفه

على كل ما بنصحك تحاول تسألن لأنو بحسن شايفين حالن كتير و ما بعبروا حدا

أنا بعتذر من الجميع بس هاد رأيي
يعني ليش ما تكونوا ظراف متلي

Executioner
02-28-2008, 09:22 AM
السلام عليكم ورحمة الله وبركاته:

امبين يا ظريف إنك واحد مو بس ظريف وإنما طريف، يعني يا معلم إذا الناس بدها تتعرف على بعض انا رأيي في رسائل خاصة في ايميل في ... في ... ما في داعي للأسماء يلي هلئ أنا شفرتها.

أما من ناحية شايفين حالهم:

اولا: Bl@ck angel ما بتعرفه شلون بآ شايف حالو.
ثانيا: أما Golden man وما أدراك من Golden man ما في داعي إحكي الناس بتعرفوا.
ثالثا: أما أنا يمكن معم حس على حالي، ولكن مع ذلك أشك جدا بهذا فعلى شو بدي شوف حالي؟؟؟؟؟.

اما إذا كنت عم تمزح كونك ظريف :) فإنت فعلا ظريف.

ملاحظة: خربطت بعد الأيام الفائتة، وبالتالي...

مضى اليوم الثالث وما زال الطلاب عاجزين عن حل أي سؤال

SYR_SNIPER
02-28-2008, 12:58 PM
اممم صار تحدي اذا بدون مصفوفات ^^
معليش تمهلني معلمنا :d?

Golden man
02-28-2008, 02:06 PM
شايف وصل البل لدقني و أنا مو حاسس....

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

بالنسبة لصديقنا ظريف فياريت شوفك بالمعهد و افهم منك شو القصة و ليش هالنظرة الغريبة يلي آخدها عنّا .

و أنا بشكرك كتير لأنو نبهتني لموضوع يمكن مالي منتبهله مع أنه أمر مهم جدا .

SYR_SNIPER
02-28-2008, 02:39 PM
السلام عليكم اخي goldenman او اي حدا اونلاين ممكن تشرحلي شوي الأسئلة ^^ لوسمحت لانو ما عم اعرف اعمل شي ههههه
يعني مثلا للسؤال الأول لازم نحدد طول السلسلة ولا لأ وهل بغمكاننا نستخدم محرف التراجع لانو في عندي فكرة انو مثلا نطبع الحرف الأول بعد مسافة وهي طول السلسلة وبعدين نتراجع ونطبع الي بعدو بس اظن ما رح تنفع 100%

وشكرا مقدما

mss cool
02-29-2008, 12:34 PM
ولول ما بيهون علينا زعلك أخي محمد بس بصراحة انا مو بيبتي حاليا والكمبيوتر الي عما اشتغل عليه مافيه فيجول بس تكرم عينك رح حط أفكاري بشكل كودات
الكود الأول:
بصراحة كان طلبك صعب لأنو هيك نوعية من الكودات ما تعملنا معها إلا بشكل مصفوفات وبعدين توابع بس انا هيك حليته
آلية الحل :
_احجز مكان بالذاكرة بإسمX
اطبع " ادخل العبارة : "
_كرر طالما عداد لا يساوي ترتيب ENTER بجدول اسكي
*** ادخل المحرف
*** اجعل قيمة العدة تساوي محرف المدخل
_كرر طالما العداد أكبر من الصفر انطلاقا من قيمة التي تسبق ترتيب ENTER بجدول اسكي
*** اطبع قيمة العدة المحرفية
_انهي البرنامج


#include<iostream.h>
Void main()
{
Int enter =? ;
char x;
cout <<" please enter your string :\n";
for (int I =0 ; I <= " nter " ; i++)
{
cin>> x ;
I = x ;
}
for ( I = enter-1 ; I >= 0 ; i++)
{
cout<< I ;
}
}

بعتذر ما بعرف شو ترتيب enter بجدول اسكي
الكود التاني :

# include <iostream.h>
#include< string.h>
main()
{
string name ;
getline(cin, name) ;
cout << name;
return 0 ;
}


وهلآ بنجي للكود التالت الي ما فهمته منيح ممكن توضيح

Executioner
02-29-2008, 12:36 PM
السلام عليكم ورحمة الله وبركاته، وبعد:

يا أستاذ SYR_SNIPER الأمر بسيط للغاية، وخصوصا إنك حالل مسائل من USACO يعني أكيد عندك أفكار منيحة عن العودية، يا سيدي الكريم السؤال الأول كل الشغل تبعك حيكون بالـ main بس، وبالتالي بدك تخلي الـ main يستدعي حالو. وفي حال أردت تعرف مصفوفة أكيد خطأ لأنو معلى يمشي الحال في حال العودية وبالتالي الطول غير محدد إطلاقاً.
وبالتالي يا معلم إذا حللنا شوي المسألة نرى إلى أنه في كل استدعاء للـ main سيقوم بقراءة محرف وحيد ولا يقوم بطباعته حتى يقوم باستدعاء آخر له .... وإلخ، عطيتك بداية الحل الباقي عليك :D.
أما مشان المسألة الثانية: ستستخدم هنا التابع cin.get لقراءة محرف محرف بدون تعريف مصفوفة، وهنا عليك أن تستفاد من الحلقات، حيث هنا يجب أن تستفيد من كون هناك فراغات بين الكلمتين أي الاسم والكنية، يعني مثلا تقوم بالقراءة (من خلال أي حلقة تتضمن التابع السابق) إلى أن تجد فراغاً (بعد تخزين الحرف الأول بشي متحول)، إلخ. عطيتك بداية الحل الباقي عليك :).
أما السؤال الثالث فهو بغاية البساطة هنا أكيد معلش أنو تستخدم المصفوفات، أنت بلش خطوة خطوة يعني بداية شوف إذا قيم مجموع كل من الأسطر متساوية، ومن ثم جميع قيم كل من الأعمدة متساوية، ثم مجموع قيم كل من القطر الرئيسي والثانوي متساويين ثم شوف إذا بساوي بعضهم، مثال على أحد هذه المصفوفات:
8 1 6
3 5 7
4 9 2
وإذا لازمك شي برنامج يعطيك مصفوفات سحرية أنا عندي واحد ساويتو على ++C بيعطيه البعد بيمشي معك خطوة خطوة (بعد ضغط Enter) حتى يعطيك مصفوفة سحرية بقيم متتالية بدون أي تتكرار لأي منها، حطيتو بالمرفقات، طبعا المصفوفة مربعة أكيد (لأنه من غير الممكن التوصل إلى القطرين عندها).
البرنامج بالمرفقات (exe).
إن شاء الله بكون مشي الحل معك، يعني شوي تانية حأعطيك الحل ;).
ما شاء الله ما في طلاب، كلو عاجز بدون أي سؤال أو استفسار (دققوا منيح على كلمة عاجز) لأنو كلوا عم يفوت على هاد المنتدى ويطنش الموضوع.
والسلام على من اتبع الهدى وحل التمارين أو حاول يحلهم بدون ما يؤثر هاد الشي على دراسته.

مضى اليوم الرابع وما زال الطلاب عاجزين عن حل أي سؤال

صاحـب الظل الطويــل
02-29-2008, 03:15 PM
السلام عليكم:


السلام عليكم:

يا سيد ظريف

شوها لحكي يللي مو ظريف ولا طريف

والله الشباب متل الوردة كل وحدة أحلى من التانية:rolleyes:

كلهون أحلى من العسل والله يشهد على كلامي هيك سمعت وشفت من بعيد

ما في داعي لهل الكلام يللي ما إلو داعي





قال عليه الصلاة والسلام:

من كان يؤمن بالله واليوم الآخر فليقل خيرا أو ليصمت


استهدو بالله ولا تكونو إلا عباد الله إخوانا

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

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

SYR_SNIPER
03-01-2008, 03:48 AM
اولا السلام عليكم ورحمة الله وبركاته.....
ثانيا : لا أرى أي سبب مقنع لوضع ردود خارجة عن الموضوع الرئيسي -,-' ولو حتى إبداء رأي وذلك لوجود أماكن أخرى لإبداء الآراء .... لن اكمل فلا اريد انا اخرج عن الموضوع الأساسي ;)

ثالثا :

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


#include <iostream>
using namespace std;


void main() {

char a;//letter

cin.get(a);

if (a!= '\n')
main();

cout << a;

}

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

سلااااااااااام

نسيت نسيت :D رابعا لحنا مو عاجزييييين ^^

SYR_SNIPER
03-01-2008, 04:27 AM
السلام عليكم من جديد ...
عودة سريعة بحل البرنامج الثاني ..
الكود :

#include <iostream>
using namespace std;



void main() {

static char first=0;
static bool space=false;

char a;

cin.get(a);
if (first == 0)
first = a;

if (a == ' ') {
space = true;
main();
return;
}

if ((space)&&(a != '\n'))
cout << a;

if (a == '\n') {
if (space) {
cout << '.' << first;
space = false;
}
return;
}

main();

}


اممم شرح الكود :
اظن اول شي اظن انو في كود احسن منو , هيك حاسس ^^
انا قمت بعملية اختبار للمحارف كل مرة واول محرف و المتحول البولياني خليتهن استاتيك مشان ما كل مرة البرنامج يعرفهن طبعا باين انو لو كان المحرف مسافة يعني ناخد محرف جديدة باستدعاء الماين مرة تانية ونطبع الحروف مادام البوليان true وفي آخر خطوة عند وجود محرف السطر الجديد سنطبع ولمرة واحدة فقط نقطة متبوعى بالمحرف الأول ومن ثم نبدأ بالرجوع خطوة خطوة للتابع الرئيسي بواسطة return; حتى انهاء تنفيذ البرنامج ايضا كان بالإمكان تحسين مظهر البرنامج قليلا لكن حتى يكون الكود واضحا .....
شكرا جزيلا أخي اكسكيوتنر على الافكار الرائعة
جاري حل البرنامج الثالث ....
ومجددا لسنا عاجزين ;)

مــحــمــد
03-01-2008, 04:49 AM
السلام عليكم ورحمة الله وبركاته .....
أول الشي مافيني إلا ما كتر حكي لأنو صايرة كتابتي على الكيبورد سريعة وكرمالها عم تسرع أكتر من ورا
هالردود الكبيرة ....وكمان مشان عبر عن كل شي بقلبي لإخواني(بكل ما تحمل الكلمة من معنى) في المنتدى الغالي ...

بالنسبة للشكر فبدي أشكر واللي بدو يصير يصير لأنو ما حدا من الأعضاء مقدر الضغوط اللي عند الأخ Executioner أدي فبقول لك يا أخي الكريم :
جزاك الله الفردوس وأعطاك على قد نيتك وجعلك من الأوائل وإن شاء الله السنة الجاية بدي زورك بالمعلوماتية :) أنت وكم أخ حاببهم وما قصروا معي بعطاءهم بنوب ....

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

بالنسبة للأخ ظريف بدي أتشكره وأنقده ..
بتشكرك لأنو سنحتلي الفرصة أنو عرف على الشجعان الثلاثة Executioner و Bl@ck angel وGolden man ....
هدول يا سيدي ما أنت أفضل أناس أعرفهم في المعهد أحبوا فعل الخير وجعلوه همهم لكي يكسبوا من وراءه
الخيراااااااات والأجور الكبيييييرة من ملك الملوك فحبذا يا أخي لو تتعرف عليهم قبل أن تظن بهم الظنون ...
إذاً فنقدي لك يا ظريف هو الظن السوء الذي يسيطر علينا كلنا وليس عليك وحدك فيجب علينا أن نتعلم ومن أخطاء بعضنا ولا نقع في مثل خطأك وخطأ الأخ فايروس من قبلك مرة أخرى ...


وهلأ منبدا بالجد ...
بدك تستناني شي ساعة زمان مشان فكر شوي ويا بحط حل يا سؤال ...
بس كتبت هالمشاركة مشان أربط حالي معك وما أهرب :) لأنو ماني واثق من إرادتي :)حاكم البلاوي ملتلة لفوق راسي تلتلة :d...
ومشاركة أخي SYR_SNIPER عم تزيدني حماس أكتر وأكتر و كلمة عاجزين هي استفزتني وبدي برهنلك أنو نحنا مو عاجزين بس
للأسف مضغوطين بعلبة سردين ضايع مفتاحها :d ...
وهلأ عم شوف كل ما بدي حط هالرد عم شوف الأخ SYR_SNIPER عم يطرح حل جديد ما شاء الله أخي أنت السابق دوماً ...
بس معلش خيرها بغيرها ;) ...

والشغلة الجديدة علي من السؤال الأول هي :"نسخ التابع لنفسه"يعني هون أكيد لح ياخد مكان بالذاكرة لكل محرف عم ياخذه مع كل أستدعاء للتابع
بس هي مو مصفوفة وإنما محل مؤقت في الذاكرة يتحرر حالما يتم تنفيذ نسخة التابع والتنفيذ سيتم أفتراضياً من الأخير إلى الأول (الرئيسي أباً عن جد )......
فشكراً أخوتي على هذه المعلومة الجديدة التي أوصلتوها لنا بكل سلاسة .....

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


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

SYR_SNIPER
03-01-2008, 06:09 AM
عودية سريعة مجددا ^^
ولعيونك استاذي اكسكيوتنر هي حل المسألة الثالثة وبهيك اثبتت انو مالي عاجز ;)


#include <iostream>
using namespace std;

void main () {
int a[50][50];
int x;
int i,j;
bool magic=true;
int hor[50]={0};
int ver[50]={0};
int line1=0;
int line2=0;

cout << "Enter array Width\n";
cin >> x;

for(i=0 ;i<x ;i++) {
for (j=0 ;j<x ;j++) {
cin >> a[i][j];
hor[i] += a[i][j];
ver[j] += a[i][j];
if (i == j)
line1 += a[i][j];
if (x-1-j == i )
line2 += a[i][j];
}
}

for (i=0 ;i<x-1 ;i++)
if ((hor[i] != hor[i+1]) || (ver[i] != ver[i+1]) || (line1 != line2)) {
magic = false;
break;
}

if ((magic) && (line1 == ver[0]) && (line1 == hor[0]) )
cout << "This array is a Magic array\n";
else
cout << "This array isNOT a Magic array\n";

}




بانتظار أسئلة جديدة :)
سلاااااااام

مــحــمــد
03-01-2008, 07:16 AM
ما بعرف حاسس حالي طلعت عاجز كتير :( يعني السؤال التالت كنت عم حله ..
ورسمة خوارزميته متل خوارزمية الأخ SYR_SNIPER وبلشت أكتبها ككود وإذ :)...
الأخ SYR_SNIPER بحط الحل ...
مشان الطلاب اللي ما فهموا كود المسألة التالتة لح أحكيلكم الخوارزمية واللي هي :
أول شي بتجيب دفتر وقلم وبترسم مربع(المصفوفة الثنائية الأم) وبتقسمه لx صف وx عمود مثلاً x=3 ...
بترسم جنب هالمربع (على اليسار مثلاً)مستطيل ذو بعد واحد و3 أقسام (hor(عمودي) مصفوفة أحادية لنضع فيها مجموع كل صف ونحنا نازلين) وبترسم مستطيل تاني ذو بعد واحد و3 أقسام تحت المربع( ver (أفقي) مصفوفة أحادية لنضع فيها مجموع كل عمود بالمصفوفة الأم )...
طبعاً والقطرين يعتبر كل منهما سطر واحد فلذلك مجموع السطر سيوضع في متحول وهو (line1 ,line2) .....
طيب إذا بتطلعوا على كود أخونا SYR_SNIPER وهو عم يقرأ المصفوفة الثنائية عم يأسند ...
وبتفهموا منين جاب هالشروط مزبوط وقت ترسموا المصفوفة وتعرفوا i بتدل على الصف وj بتدل على العمود ...
وفي صورة بالمرفقات إن شاء الله تفيدكم ...
أخي Executioner مشان ما ضل حاسس حالي عاجز أنا مستني منك مسألة ...
وياريت تنزلنا ياها بأقرب وقت ولا تنزلنا أكتر من وحدة مشان ما نتوه ...
بانتظار المسألة على أحر من الجمر ..
وبدي طمنك أخي الغاية من فتح هالموضوع وصلتني يعني أنا والحمد لله فهمت كل المسائل لأنو وأنا عم فكر فيهم
يجي الحل من أخونا SYR_SNIPER مع توضيحه الحلو متلو إضافة إلى توضيحك له فهنا استفدت من التوضيحين والحمد لله فهمت .....
بس في السألة التانية فيها إشكال بسيط بالنتحول البولوني إن شاء الله بحله وإذا ما نحل معي
بسألكم أخوتي بالمعهد .....

والسلام عليكم ورحمة الله وبركاته ...
برجع بذكر مستني المسألة التانية على أحر من الجمر;)......

Executioner
03-01-2008, 08:58 AM
السلام عليكم ورحمة الله وبركاته:

منين بدي بلش يلا بداية بالأخ SYR_SNIPER:
ما شاء الله يا أخي الكريم شو هاد، أنت أول واحد حاولت تحلهم، بس بعد ما عطيتك بدايات الحلول (يعني مو شطارة منك، عم امزح)، طبعا
أنت مستواك ما شاء الله عالي بالبرمجة كونك عم تحل مسائل من الـ USACO وقدرت تحل هي الأسئلة بشكل عودي.
وأنا ما ذكرت الكلمة عاجز إلا مشان حمي الشباب أما من ناحية عاجز فمحدى عاجز إن شاء الله هي واحد، اثنين ليش عم تكتبها أكثر من مرة
إنك مو عاجز، يعني عم تأفحمني إنك حليتم؟؟؟.

بداية: بحب بلش بحلك للسؤال الأول:
حلال عليك هذا هو الحل المطلوب، وإذا بدك فيك تحط الاستدعاء والطباعة سوا ضمن ال if مشان ما يكون في سطر فاضي، بس هلئ السؤال موجه
إلك بالذات، شلون حتقدر تطبع أنتر بعد طباعة السلسلة بشكل معكوس؟؟؟؟.
والمراد كان بهي المسألة معرفة العودية، ومعرفة أن التابع الرئيسي ممكن أن يستدعي حالو، لأنو في كتير ناس مابتعرف.

ثانيا: بالنسبة للسؤال الثاني:
حل حلو للغاية، بس بالمناسبة علقت معك العودية؟؟؟ كتير عجبك استدعاء التابع الرئيسي لحالو؟؟ بس ومعك ذلك شي رائع إنك قدرت تساويه
بالعودية، زائد استخدامك للمتحولات الستاتيكية، بس بصراحة إنت زودت شوي، لأنو هون ما في داعي للعودية، حاول مرة ثانية بس بدون عودية
ومع احتمال وجود فراغات بالبداية، وطباعة انتر بعد طباعة الكنية نقطة أول حرف من الاسم (طبعا كل هاد الحكي موجه للكل جربوا
وحاولوا).
والمراد هنا بهذا التمرين عدم الإعتماد دائما على المصفوفات فمن الممكن أن يكون قراءة محرف محرف واختباره أفضل من تعريف عدة
مصفوفات ومعالجتها.

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

أما بالنسبة لأخي نمــ البرمجة ـــر:
بعرف إنك قلتلي بس حبيت حمي الموضوع شوي أحسن من انو يموت، وطبعا لا غنى لنا عنك فأنت نمرنا، (وخيرا ما فعلت) بأنك تركت المنتدى
مؤقتاً.
ويلي بدو لس في طرق ثانية لحل السؤال الثاني والثالث حاولوا. ويا معلم إذا بدك حل كمان السؤال الأول متل ما قلت لأخونا SYR_SNIPER،
بس إذا بدي حط أسئلة فيا سيدي الكريم أسئلة دسمة بمعنى الكلمة، مو يعني مستحيلة بس في أفكار جديدة عليكم وبدا الشغلة شوية تفكير
برمجي، حاكم خطر على بالي سؤالين حلوين على كيفك.
بس بداية إذا بدك ساوي برنامج متل يلي انا نزلتوا بالمرفقات ثاني مرة، البرنامج: يلي بتعطيه بعد أحادي بيعطيك مصفوفة سحرية،الطريقة حتلاحظها لما تجربه أكثر من مرة. أما الأسئلة فبعدين ححطها.

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

وبسبب الأخ SYR_SNIPER حغير شوي الجملة

مضى اليوم الخامس وما زال الطلاب عاجزين عن حل الأسئلة بطريقة ثانية

SYR_SNIPER
03-01-2008, 02:22 PM
مرحبا اخي اكسكيوشنر :$ اسف على الخطأ النحوي (( قال عم آخد دورة انجليزي قال ههههه )) ...
شكرا لإطراءك الحلو وعلى هالأفكار الحلوة ونتمنى المزيد

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

هي حل السؤال الأول و الثاني كما طلبت ;)
First Code:

#include <iostream>
using namespace std;

int i=1;
void main() {

char a;//letter

cin.get(a);

if (a!= '\n') {
i++;
main();
}

i--;
cout << a;
if (i == 0)
cout <<endl;

}


Second Code :


#include <iostream>
using namespace std;


void main() {

char first=0;
bool space=false;

char a;

cin >> first;

do {
cin.get(a);

if (a == ' ') {
space = true;
continue;
}
if ((space)&&(a != '\n'))
cout << a;

if (a == '\n') {
cout << '.' << first << endl;

}
}while ( a!='\n');

}


البرنامج الأول يطبع النص بالمقلوب ومن ثم يطبع سطر جديد آخر النص ^^ فكرة حلوة مدري شلون اجتت ببالي هههه انو اعمل عداد للاستدعاآت ..

البرنامج الثاني بطريقة التكرار do while وبدوون عودية

غير الجملة :D
حلو الطلاب المسائل بطريقة ثانية ..

Executioner
03-02-2008, 12:08 PM
السلام عليكم ورحمة الله وبركاته، وبعد:

ما شاء الله أخ SYR_SNIPER شي حلو للغاية، بالنسبة لأول واحد، شي رائع إنك قدرت تعمكل هالشي، بس في ملاحظة مو كل هالقد مهمة ليش جايي على بالك تترك سطر فاضي بين السطر ومقلوبة!!.
اما بالنسبة للسؤال الثاني فأنا بصراحة بعتبرك أفحمتني لما حطيت (cin) بدل (cin.get) أنا مو هي الطريقة يلي توقعت منك. شي جميل وطبعا على هي الحالة هيك تمارين صارت مو من مستواك لأنك يمكن مريت على تمارين أدسم بالـ USACO (هذا مو يعني ما عندي أدسم وإنك
حتقدر تحلهم:D).أنت ما قربت إطلاقا عن الفكرة يلي كنت متوقعها من حدى انو يساويها.
أما مشان غير الجملة، معلى غيرها :D مشان حمس غيرك هي واحد اثنين لس حلولك تعتبر حل واحد لأنو الأول ضفت عليه اما الثاني بيشبه تماما الحل السابق إلك فبدلا من العودية استخدمت حلقة، تقريبا نفس الشي، وهلئ أنا بعترف أنو في واحد استطاع يحل هي الأسئلة البسيطة :).

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

أما مشان أخي نمـــ البرمجة ـــــر: فيا أخي الكريم مشان المسألة تبع المصفوفة السحرية:
أنا بدي منك تساوي وحدة متلها تقريبا بس في عدة شغلات بدي وضحها:
1) بداية حاول تساوي تابع يمرر له بعد المصفوفة فيرسم جدولا للمصفوفة (مربعة أكيد) ويمرر له أيضا المصفوفة يلي بدو يحطها ولا تنسى استخدام التابع (setw) فسوف يساعدك بالتنسيق وتفاديا لكثرة الإحتمالات (هل الرقم خانة أم خانتين أم ...).
2) البرنامج السابق لا يقوم بتوليد مصفوفات سحرية، وإنما انا صممته لعمل معين وهو أنه في الرياضيات هناك طريقة يمكن لأي شخص أن يتبعها لكي يحصل على مصفوفة سحرية (يجب أن تكون المصفوفة مربعة فردية البعد) فقمت ببرمجة الطريقة بحيث يمشي خطوة خطوة للوصول إلى
المصفوفة السحرية حيث تبدأ القيم دائما بالرقم واحد وتتزايد تتدريجيا ويكون أكبر عدد هو العدد الموجود في منتصف المصفوفة ضرب بعد
المصفوفة أمثلة:
البعد 3: العدد بالمنتصف هو 5 وبالتالي اكبر قيمة هي 5*3= 15 مجموع كل من الأسطر وكل من الاعمدة وكل من القطر الرئيسي و الثانوي.
البعد 5: العدد بالمنتصف هو 13 وبالتالي اكبر قيمة هي 5*13= 65 مجموع كل من الأسطر وكل من الاعمدة وكل من القطر الرئيسي و الثانوي.
الطريقة:
1) بداية يكون أول رقم بالسطر الأول بالمنتصف كون المصفوفة فردية البعد.
2) نتجه نحو الزاوية العليا اليمنى دوما فإذا:
-) كان فارغا نضع فيه القيمة التالية.
-) كان ممتلئا نضع القيمة التالية تحت المربع الحالي.
-) كان خارج حدود المصفوفة فنرى إذا كنا نستطيع أن نضعه في أقصى اليسار (يعني في فراغ حتى أقدر حطه) أو إذا كنا نستطيع أن
نضعه في أقصى الأسفل (...).
-) كان خارج حدد المصفوفة ولا يمكن وضعه إلى أقصى اليسار او إلى أقصى الأسفل فنضع القيمة التالية تحت المرع الحالي.
هي هيه الطريقة بكل بساطة، أنت امشي خطوة خطوة، وبامكانك أن ترى الملف السابق للتتأكد.

والسلام عليكم ورحمة الله تعالى وبركاته ومغفرته

مضى اليوم السادس وما زال الطلاب عاجزين عن حل الأسئلة بطريقة ثانية

مــحــمــد
03-03-2008, 12:13 PM
السلام عليكم ورحمة الله وبركاته ....
أخي Executioner أشكرك على هذه الثقة التي منحتني إياها وإن شاء الله بدي كون قدها ...
ولكن أنتظر عليي شوي أخي لأنو لساتنا بالتوابع وعندي 6 مواد غير السي فلذلك أنا حطيت المسألة ببرنامجي الشهري وإن شاء الله بعطيك الكود وبكون عند حسن ظنك بي ...وهذا البرنامج بالنسبة لي كمبتدئ عبارة غن مشروع :)
بس بحب نوه أنو المسألة محجوزة بأسمي يعني لا حدا يفكر يحلها قبلي :) ...
والحل بالطريقة التانية قريباً إن شاء الله ...


هلأ أخي أنا بحثت بالغوغل عن المصفوفة السحرية ولقيت هالمقال وضمنه هالملف فأتمنى أن يفيدك ...
المقال: إضغط هنا أخي وما بتندم ;) (http://www.codeproject.com/KB/recipes/Magic_Square.aspx)
المرفق:370
حلاوته أنو بيعطيك المصفوفة السحرية للأبعاد كافة زوجية أم فردية ...