ahmed.o.mohamed

اختبر قدراتك في C/CPP - الحلقة الرابعة, الجزء الثاني

6 ردود في هذا الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

الحلقة الثالثة - الجزء الثاني.

الحلقة الثالثة - الجزء الثالث.

الحلقة الثالثة - الجزء الرابع.

الحلقة الثالثة - الجزء الخامس و الأخير.

الحلقة الرابعة - الجزء الأول.

مرحبا بكم إخوتي الكرام في الجزء الثاني من الحلقة الرابعة من سلسلة اختبر قدراتك, قمتُ بتقسيم الحلقة الرابعة إلى عدة أجزاء, مُرتبة حسب الصعوبة.

أجزاء هذه الحلقة ستكون خاصة بمسائل الــ OOP.

الإختبار الرابع (الجزء الثاني) :

قم بإنشاء فئتين (تملك أعضائهم private كمحدد وصول) وفقا للمعطيات التالية :

  • الصنف الأول اسمه vect حيث يسمح بتمثيل متجه بثلاث عناصر من نوع duoble. يحتوي هذا الصنف على دالة بناء و دالة أخرى (fonction membre) لعرض النتائج.
  • الصنف الثاني اسمه matrice يسمح بتمثيل مصفوفة مربعة أبعادها 3x3. يحتوي هذا الصنف على دالة بناء تستقبل كوسيط عنوان مصفوفة 3x3.

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

ملاحظة : تتم كتابة كل فئة في ملف مستقل, أيضا تعريف الدالة prod يجب أن يكون في ملف منفرد و كذلك الحال مع البرنامج الرئيسي.

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أجل, أجل, الناتج موجه. هههههه, يا للفضيحة :lol:

المهم, 4 ملفات:

Vector.h

#include<stdio.h>
#include<cassert>

class CVector
{
private:
float m_pfVector[3];
public:
void printVector();
float& operator[](int index);
CVector(){m_pfVector[0]=m_pfVector[1]=m_pfVector[2]=0;};
CVector(float x, float y, float z){
m_pfVector[0] = x;
m_pfVector[1] = y;
m_pfVector[2] = z;
}
~CVector(void){}
};

void CVector::printVector(){
for(int i=0; i<3; i++)
printf("%-10.2f", m_pfVector[i]);
}

float& CVector::operator[](int index){
assert(index>=0&&index<3);
return m_pfVector[index];
}

Matrix.h

class CMatrix
{
private:
float m_pfMatrix[3][3];
public:
float& operator()(int x, int y);
CMatrix(float matrix[3][3]);
~CMatrix(void){}
};

CMatrix::CMatrix(float matrix[3][3]){
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
m_pfMatrix[i][j]=matrix[i][j];
}

float& CMatrix::operator()(int x, int y){
assert(x>=0&&x<3);
assert(y>=0&&y<3);
return m_pfMatrix[x][y];
}

prod.h

#include"Vector.h"
#include"Matrix.h"

void prod(CMatrix m, CVector v, CVector &resultV){
int i, j;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
resultV[i] = resultV[i] + m(i,j)*v[j];
}

main.cpp

#include<stdio.h>
#include<conio.h>
#include"prod.h"


int main(){
CVector resultV, vector(2, 4, 3);
float m[3][3] = {{1,4,1},{2,1,3},{5,2,2}};
CMatrix matrix(m);
prod(matrix, vector, resultV);
resultV.printVector();
_getch();
return 0;
}

المخرجات:

21.00     17.00     24.00

تم تعديل بواسطه khatibe_30
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جداء مصفوفة بمتجه ينتج عنه متجه و ليس مصفوفة.

شرط الجداء هو أن يكون عدد أعمدة المصفوفة مُساوي لعدد صفوف المتجه.

مثال :

post-219439-060843900 1347296057_thumb.g

محاولتي :

Vect.h

#include <iostream>
using namespace std;
class matrice;

class vect {
double v[3];
public:

vect(double v1 = 0, double v2 = 0, double v3 = 0) {
v[0] = v1;
v[1] = v2;
v[2] = v3;
}

void affiche() {
int i;
for (i = 0; i < 3; i++) cout << v[i] << " ";
cout << endl;
}
friend vect prod(const matrice &, const vect &);
};

Mat.h

#include <iostream>
using namespace std;
class vect;

class matrice {
double mat[3] [3];
public:
matrice();

matrice(double t [3] [3]) {
int i;
int j;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
mat[i] [j] = t[i] [j];
}
friend vect prod(const matrice &, const vect &);
};

Prod.h

#include "Vect.h"
#include "Mat.h"

vect prod(const matrice & m, const vect & x) {
int i, j;
double som;
vect res;
for (i = 0; i < 3; i++) {
for (j = 0, som = 0; j < 3; j++)
som += m.mat[i] [j] * x.v[j];
res.v[i] = som;
}
return res;
}

Main.cpp

#include "Prod.h"

int main() {
vect w(1, 2, 3);
vect res;
double tb [3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

matrice a = tb;
res = prod(a, w);
res.affiche();

return 0;
}

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

بداية أحب أن أعلن أنني أكره المتغيرات من نوع double كل شيء فيها غامض بالنسبة لي ... كيف تخزن ..

وما هي حدودها ولماذا .. فيها قيم عجيبة ...في الحقيقة دائماً أستخدم float قرأت مرة في كتاب عن جافا أن double حدودها العليا في الدقة هي : 1.8*10703 أوشيئاً كذا ..فهل هذا صحيح ؟؟؟

المهم :

هذه محاولتي على int ... ولا أعلم عندما أحول المتغيرات إلى double يطلعلي حاجات عجيبة ...laugh.gif

vector.h

class vect  {
public:
int V[3];
vect(int a=0,int b=0,int c=0) {
V[0] = a;
V[1] = b;
V[2] = c;
}
vect(int a[3])
{
for(int i=0;i<3;i++)
V[i]=a[i];
}
void Show(int(*_printf)(const char*,...))
{
_printf("\nvect ={%d,%d,%d};\n",V[0],V[1],V[2]);
}
int get(int i)
{
return V[i];
}
};

matrix.h

class matrice 
{
private:
int M[3][3];
public:
matrice (int a[3][3])
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
M[i][j]=a[i][j];
}
void Show(int(*_printf)(const char*,...))
{
_printf("matrice ={");
_printf("{%i,%i,%i},",M[0][0],M[0][1],M[0][2]);
_printf("{%i,%i,%i},",M[1][0],M[1][1],M[1][2]);
_printf("{%i,%i,%i}};\n",M[2][0],M[2][1],M[2][2]);
}
int get(int i,int j)
{
return M[i][j];
}
};

prod.h

#include"vector.h"
#include"matrix.h"
vect prod (matrice m,vect v)
{
int result[3]={0};
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
result[i]+=m.get(i,j)*v.get(j);
vect R=result;
return R;
}

main.cpp

#include <cstdio>
#include"prod.h"
int main() {
vect a(1,2,1);
a.Show(printf);
int B[3][3]={{1,1,1},{1,1,1},{1,1,1}};
matrice b(B);b.Show(printf);
vect c=prod(b,a);
printf("after prod");c.Show(printf);
return 0;
}

يمكنكم رؤية البرنامج عندما يكون double بدل int والأشياء العجيبة فيه ؟!!WHY.rar

تم تعديل بواسطه مصطفى 36a2
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدالة prod يجب أن يكون بإمكانها الوصول إلى بيانات كلا الفئتين, لذا كانت فكرة السؤال تكمن في الإعلان عن prod كدالة صديقة للصنفين معا. :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

تم منح النقاط للمشاركات المفيدة و حذف الردود الغير مفيدة, حفاظا على تنسيق الموضوع.

يُغلق.

أراكم في الجزء الثالث من الحلقة الرابعة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .