تكفووون ساعدوني (طلب بسيط)..
السلام عليكم ورحمة الله وبركاته
أنا عضوه جديدة في المنتدى بصراحه عجبني كثيييرررر وسجلت ..
انا ادرس برمجة حاسب وتوني مبتدئه مالي كم شهر من بديت اتعلم لغة السي بلس بلس
حاولت اسوي برنامج ضرب مصفوفات لكن كل مرره افشل
ودي احد يسويه لي اذا ما عليه كلافه
على فكره انا اشتغل على Borland ..
(( برنامج يقوم بضرب مصفوفتين ماتكون احاديه ( يعني لها اعمده وصفوف) واظهار المصفوفتين على الشاشه والمصفوفه الناتجة))
طلب بلييززززززز لاتردوني ..
وجزاه الله خير إلي بيسويه والله يجعله في ميزان حسناته..
مشاركة: تكفووون ساعدوني (طلب بسيط)..
الحل يعتمد على الحلقات المتداخلة و سنستخدم 3 حلقات for .. بافتراض أن المصفوفة الثنائية رباعية أو ثلاثية .. إلخ و هذا البعد مخزن في الثابت m .. و حيث أن :
i هي السطر .. j هي العمود .. k من أجل عملية الضرب التجميعي .. لأن c[1,1] تساوي مجموع ضرب السطر الأول من المصفوفة الأولى في العمود الأول من المصفوفة الثانية و هكذا ..
الحل كالتالي :
كود:
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
for (int k=1; k<=m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
حيث أن المصفوفة الأولى هي a و الثانية هي b و الناتجة هي c .. و هذا هو الحل كامل مع إدخال المصفوفتين a و b :
كود:
#include <iostream.h>
const int m = 2;
int a[m][m];
int b[m][m];
int c[m][m] = {{0,0},{0,0}};
void sum();
void main()
{
// Enter
cout << "Enter Array a[] : " << endl;
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
{
cout << "a[" << i << "," << j << "] = ";
cin >> a[i][j];
}
cout << "Enter Array b[] : " << endl;
for (i=1; i<=m; i++)
for (int j=1; j<=m; j++)
{
cout << "b[" << i << "," << j << "] = ";
cin >> b[i][j];
}
// Process
sum();
// Printing
for (i=1; i<=m; i++)
{
for (int j=1; j<=m; j++)
cout << c[i][j] << "\t";
cout << endl;
}
}
void sum()
{
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
for (int k=1; k<=m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
أنا أستخدم نسخة Microsoft Visual C++ 6 و ليس نسخة الـ Borland و لكنها متشابهة يعني لا يوجد إختلاف .
ملاحظة / في كود الطباعة لقد قمت بطباعة المصفوفة الناتجة فقط و عليك بالباقي كتمرين :)
مشاركة: تكفووون ساعدوني (طلب بسيط)..
مشكووووووووووووووووووور أخ wolf sniper
ماقصرت .. الله يجعله في ميزان حسناتك ..
أنا نسخت الكود بجربه وأحااول افهمه ..
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اهلا
جربته بس ..
عندي بعض الاسئله ...
* البرنامج مارضى يشتغل إلا لما اعرف في بدايه البرنامج i , k , j
**بعدها يشتغل البرنامج ادخل المصفوفتين بس مايطلع الناتج ؟
*** ايش تقصد في السطر الأخير؟؟ (( c[i][j] = c[i][j] + a[i][k] * b[k][j]; ))
اتمنى اني مااكون تعبتك .. بس ترى مبتدئة:08: :08: :08:
1 مرفق
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اقتباس:
المشاركة الأصلية كتبت بواسطة الكتكوته
اهلا
جربته بس ..
عندي بعض الاسئله ...
* البرنامج مارضى يشتغل إلا لما اعرف في بدايه البرنامج i , k , j
**بعدها يشتغل البرنامج ادخل المصفوفتين بس مايطلع الناتج ؟
*** ايش تقصد في السطر الأخير؟؟ (( c[i][j] = c[i][j] + a[i][k] * b[k][j]; ))
اتمنى اني مااكون تعبتك .. بس ترى مبتدئة:08: :08: :08:
1- كنت أعتقد أنه لا توجد إختلافات بين نسخ ++C و لكني كنت على خطأ .. ففي بعض المترجمات Compilor يجب أن تعرف المتحولات الخاصة بالحلقات التكرارية ( for ) قبل بداية الحلقة و ذلك في بعض المترجمات .. (قرأتها من أحد الكتب ) .. سوف أحل هذه المشكلة عندك .
2- الخطأ بسبب (1) .. جربي هذا الكود :
كود:
#include <iostream.h>
const int m = 2;
int a[m][m];
int b[m][m];
int c[m][m] = {{0,0},{0,0}};
int i = 0;
int j = 0;
int k = 0;
void sum();
void main()
{
// Enter
cout << "Enter Array a[] : " << endl;
for (i=0; i<m; i++)
for (j=0; j<m; j++)
{
cout << "a[" << i << "," << j << "] = ";
cin >> a[i][j];
}
cout << endl;
cout << "Enter Array b[] : " << endl;
for (i=0; i<m; i++)
for (j=0; j<m; j++)
{
cout << "b[" << i << "," << j << "] = ";
cin >> b[i][j];
}
// Process
sum();
// Printing
cout << endl;
for (i=0; i<m; i++)
{
for (j=0; j<m; j++)
cout << c[i][j] << "\t";
cout << endl;
}
}
void sum()
{
for (i=0; i<m; i++)
for (j=0; j<m; j++)
for (k=0; k<m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
3- البرنامج كله في هذا الكود .. فكرته هي نفسها عندما تقومين بضرب مصفوفتين .. فضرب السطر الأول في العمود الثاني يعطينا C[1,2] .. و العملية تتم عن طريق ضرب العنصر الأول في السطر الأول (مصفوفة1) مع العنصر الأول في العمود الثاني (مصفوفة 2) و جمع الناتج ( لهذا كررت C[i,j] ) مع حاصل ضرب العنصر الثاني من السطر الأول (مصفوفة 1) مع العنصر الثاني من العمود الثاني (مصفوفة 2) .. و هكذا بقية عناصر المصفوفة الناتجة .
و هذا ما يوضحه هذا الكود .. فـ i تشير إلى السطر .. و j تشير إلى العمود .. و k من أجل عملية الضرب السابقة التي شرحتها لك .. ولو تتبعتي الحلقات من البداية و قمت بتسجيل قيم i و j و k و وضعتها في الكود الأخير فستفهمين العملية .. أنا أعرف أن هناك بعض الصعوبة في فهم الحلقات المتداخلة لأول وهلة و لكن مع التمرين تصبح أسهل ..
يجب أن يكون البرنامج عندك مثل هذه الصورة المرفقة .. تحياتي
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اهلا
جربته واشتغل بس شكله فيه مشكله عندي
ادخل قيم المصفوفات عادي واذا دخلت القيمه الاخيره للمصفوفه الثانيه وضغطت انتر,,
كأنها تطلع الاجابه بس تختفي شاشه الدوس ,, يعني مايمديني اشوفها \
ما أدري ايش المشكله ,,
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اقتباس:
المشاركة الأصلية كتبت بواسطة الكتكوته
اهلا
جربته واشتغل بس شكله فيه مشكله عندي
ادخل قيم المصفوفات عادي واذا دخلت القيمه الاخيره للمصفوفه الثانيه وضغطت انتر,,
كأنها تطلع الاجابه بس تختفي شاشه الدوس ,, يعني مايمديني اشوفها \
ما أدري ايش المشكله ,,
إذا كنتي تريدين مشاهدة نتائج البرنامج إضغطي Ctrl + F5 و عندها تستطيعين مشاهدة كامل العمليات .. أما إذا ضغطي على F5 فقط فسوف يعمل البرنامج و لكن سوف يخرج فور الانتهاء من جميع الأوامر لذلك دائما استخدمي Ctrl + F5 .. و هو اختصار لأمر Execute .
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اهلا
اذا ضغطت ctrl+F5
يجيني هذا ..
http://shoooshooo.jeeran.com/11.jpg
انا دايم اشغل البرنامج من العلامه الصفراء إلي زي البرق (Run):17: :17: :17:
أو أضغط على ctrl+F9:17: :17: :17:
ودايم البرنامج تشتغل وتبقى شاشة الدوس لما اقفلها ,,:17: :17: :17:
مشاركة: تكفووون ساعدوني (طلب بسيط)..
أووووووه نسيت أنك تستخدمين نسخة Borland فهي تختلف في الإختصارات عن نسخة Microsoft .. طيب .. ابحثي في القوائم File و غيرها أكيد سوف تجدين الأمر المطلوب لإيقاف الشاشة عند الإنتهاء من عمل البرنامج .
لأني لا أعرف ما هي الإختصارات أو القوائم في نسخة Borland .. هل توجد قائمة تسمى Build ؟ أو ربما تجدين في أحد القوائم الأمر Compile .
مشاركة: تكفووون ساعدوني (طلب بسيط)..
ما لقيييت
طيب ليه البرامج تبقى على الشاشه إلا هذا ؟
مالقيت هذي الاوامر
لقيت compiler
بس يبحث عن الاخطاء في البرنامج وبس ..
ماتجي شاشه الدوس..
خلاص مو مشكله بوريه احد ثاني احس اني احرجتك بأسإلتي وانت ما تستخدم بورلاند..
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اضيفي السطرين هذولي باخر البرنامج قبل return 0; =)
كود:
char temp;
cin >> temp;
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اقتباس:
المشاركة الأصلية كتبت بواسطة soultaker
اضيفي السطرين هذولي باخر البرنامج قبل return 0; =)
كود:
char temp;
cin >> temp;
الله يجزيك الخير .. أضيفي الأمرين اللي كتبهم الأخ soultaker قبل نهاية التابع main .. و بعد ذلك حاولي إيجاد حل للمشكلة تلك .
مشاركة: تكفووون ساعدوني (طلب بسيط)..
//اسف لتطفلي
//واحب اقول ان البرنامج فيه خطأ بسيط وصححته
#include <iostream.h>
const int m = 2;
int a[m][m];
int b[m][m];
int c[m][m] = {{0,0},{0,0}};
void sum();
int main()
{
// Enter
cout << "Enter Array a[] : " << endl;
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
{
cout << "a[" << i << "," << j << "] = ";
cin >> a[i][j];
}
cout << "Enter Array b[] : " << endl;
for (i=1; i<=m; i++)
for (int j=1; j<=m; j++)
{
cout << "b[" << i << "," << j << "] = ";
cin >> b[i][j];
}
// Process
sum();
// Printing
for (i=1; i<=m; i++)
{
for (int j=1; j<=m; j++)
cout << c[i][j] << "\t";
cout << endl;
}
return 0;
}
void sum()
{
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
for (int k=1; k<=m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
مشاركة: تكفووون ساعدوني (طلب بسيط)..
#include <iostream.h>
const int m = 2;
int a[m][m];
int b[m][m];
int c[m][m] = {{0,0},{0,0}};
void sum();
int main()
{
// Enter
cout << "Enter Array a[] : " << endl;
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
{
cout << "a[" << i << "," << j << "] = ";
cin >> a[i][j];
}
cout << "Enter Array b[] : " << endl;
for (i=1; i<=m; i++)
for (int j=1; j<=m; j++)
{
cout << "b[" << i << "," << j << "] = ";
cin >> b[i][j];
}
// Process
sum();
// Printing
for (i=1; i<=m; i++)
{
for (int j=1; j<=m; j++)
cout << c[i][j] << "\t";
cout << endl;
}
return 0;
}
void sum()
{
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++)
for (int k=1; k<=m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
مشاركة: تكفووون ساعدوني (طلب بسيط)..
أين الخطأ في البرنامج ؟ :أفكر:
مشاركة: تكفووون ساعدوني (طلب بسيط)..
بصراحة انا عمري مادرست الدالة الرئيسة تكون بالفويد لازم تكون بالانت
بعدين مافهيه ريتيرن 0 في نهاية البرنامج
مشاركة: تكفووون ساعدوني (طلب بسيط)..
اقتباس:
المشاركة الأصلية كتبت بواسطة wcw
بصراحة انا عمري مادرست الدالة الرئيسة تكون بالفويد لازم تكون بالانت
بعدين مافهيه ريتيرن 0 في نهاية البرنامج
أهلاً أخي ..
أولاً / البرنامج صحيح بالتأكيد لأنه يعمل عندي و قد قبله Compilor عندي هذا أولاً .
ثانياً / سأقول لك لماذا void صحيحة .. أنت أكيد تعرف بأن هناك توابع (دوال) تعيد قيمة و توابع لا تعيد قيمة .. التوابع التي تعيد قيمة نضع قبل اسم التابع أي نوع من الأنواع المعرفة من قبل البرنامج أو المبرمج (int..float) .. إلخ أما التوابع التي لا تعيد قيمة فنضع لها void ..
و الـ main ما هو إلا تابع مثل باقي التوابع و لكن ما يميزه بأن المترجم (Compilor) يبدأ قراءة برنامجك من عنده .. فإذا وضعت void و لم تعيد قيمة في النهاية فالطريقة صحيحة .. و إذا وضعت int و أعدت قيمة الصفر في النهاية فأيضاً صحيح ..
فالطريقتين صحيحتين 100% .. و قلت لك الدليل أن Compilor قبل void .
و أهلاً بك في المنتدى :)