برنامه سازی پیشرفته
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.
برنامه سازی پیشرفته

اتاق گفتگو مربوط به درس برنامه سازی پیشرفته دانشگاه خوراسگان
 
الرئيسيةالرئيسية  جستجوجستجو  ثبت نامثبت نام  ورود  

 

 برنامه ماتريس خلوت یا اسپارس

اذهب الى الأسفل 
2 مشترك
نويسندهپيام
alireza




تعداد پستها : 204
تاريخ التسجيل : 2009-02-05
آدرس پستي : ghafouri.has.alirea7@gmail.com

برنامه ماتريس خلوت یا اسپارس Empty
پستعنوان: برنامه ماتريس خلوت یا اسپارس   برنامه ماتريس خلوت یا اسپارس Emptyالأربعاء ديسمبر 16, 2009 1:39 am

#include <conio.h>
#include <iostream.h>
#define Max 30
/*********************************************************/
class string;
class Sparse;
/*********************************************************/
class SparseNode
{
int row, col;
float value;
friend class Sparse;
};
/*********************************************************/
class Sparse
{
int Row, Col, Terms;
SparseNode Data[Max];
public:
void ReadSparse( void );
void WriteSparse( void );
void WriteMatrix( void );
void AddSparse( Sparse a, Sparse b );
void ManfiSparse();
void FastTranspose( Sparse b );
int StoreSum( int sum, int&LastInResult, int r, int c );
void Sparse :: MulSparse( Sparse a, Sparse b );
};
/*********************************************************/
void Sparse :: ReadSparse( void )
{
clrscr();
int i = 0;
cout << "\n\n@ Lotfan Ettelaat Zir Ra Dar Mored Matrise Sparse Vared Konid : \n\n"
<< "$ Tadade Satrha : ";
cin >> Row;
cout << "$ Tedade Sotoonha : ";
cin >> Col;
do
{
cout << "$ Tedade Anasore Gheyre Sefr : ";
cin >> Terms;
if( Terms > ( Row * Col ) || Terms < 0 )
cerr << "\nERROR ! ( In Tedad Ghabele Ghabool Nemibashad )\n\n";
}
while( Terms > ( Row * Col ) || Terms < 0 );
while( i < Terms )
{
cout << "\n# Lotfan Shomarehye Satr Va Sotoone Onsore "
<< ( i + 1 )
<< " -om Ra Vared Konid : ";
cin >> Data[i].row
>> Data[i].col;
if( Data[i].row > Row || Data[i].col > Col || Data[i].row < 1 || Data[i].col < 1 )
cerr << "\nERROR ! ( In Jayegah Dar Moshakhkhasat Matris Nemigonjad )\n";
else
{
cout << "* Lotfan Meghdar Onsor Ra Vared Konid : ";
cin >> Data[i].value;
i++;
}
}
clrscr();
}
/*********************************************************/
void Sparse :: WriteSparse( void )
{
int i;
cout << "\n\n# Moshakhkhasat Matris Be Soorate Zir Ast :"
<< "\n\n~ Tedade Satrha = "
<< Row
<< "\n~ Tedade Sotoonha = "
<< Col
<< "\n~ Tedade Anasore Gheyre Sefr = "
<< Terms
<< "\n\n~ Liste Anasor Gheyre Sefre Matris Be Sharhe Zir Ast :\n\n"
<< "Satr\tSotoon\tMeghdar\n";
for( i = 0; i < Terms; i++ )
cout << Data[i].row
<< "\t"
<< Data[i].col
<< "\t"
<< Data[i].value
<< endl;
getch();
}
/*********************************************************/
void Sparse :: WriteMatrix( void )
{
clrscr();
int i, j;
float Matrix[Max][Max] = {0};
cout << "\n\nMatrix Vaghei :\n\n";
for( i = 0; i < Terms; i++ )
Matrix[Data[i].row-1][Data[i].col-1] = Data[i].value;
for( i = 0; i <= Col; i++ )
cout << "[" << ( i ) << "]\t";
for( i = 0; i < Row; i++ )
{
cout << "\n\n"
<< "[" << ( i+1 ) << "]";
for( j = 0; j < Col; j++ )
{
cout << "\t"
<< Matrix[i][j];
}
}
getch();
clrscr();
}
/*********************************************************/
void Sparse :: AddSparse( Sparse a, Sparse b )
{
int i, j, k;
i = j = k = 0;
if( a.Row != b.Row || a.Col != b.Col )
{
cout << "\n*** ERROR !!! Nemitavan In 2 Matris Ra Ba Ham Jame Kard ***";
return;
}
Row = a.Row;
Col = a.Col;
while( i < a.Terms && j < b.Terms )
{
if( a.Data[i].row < b.Data[j].row || ( a.Data[i].row == b.Data[j].row && a.Data[i].col < b.Data[j].col ) )
{
Data[k].row = a.Data[i].row;
Data[k].col = a.Data[i].col;
Data[k++].value = a.Data[i++].value;
}
else if( a.Data[i].row > b.Data[j].row || ( a.Data[i].row == b.Data[j].row && a.Data[i].col > b.Data[j].col ) )
{
Data[k].row = b.Data[j].row;
Data[k].col = b.Data[j].col;
Data[k++].value = b.Data[j++].value;
}
else if( a.Data[i].value + b.Data[j].value )
{
Data[k].row = a.Data[i].row;
Data[k].col = a.Data[i].col;
Data[k++].value = a.Data[i++].value + b.Data[j++].value;
}
else
{
i++;
j++;
}
}
while( i < a.Terms )
{
Data[k].row = a.Data[i].row;
Data[k].col = a.Data[i].col;
Data[k++].value = a.Data[i++].value;
}
while( j < b.Terms )
{
Data[k].row = b.Data[j].row;
Data[k].col = b.Data[j].col;
Data[k++].value = b.Data[j++].value;
}
Terms = k;
}
/*********************************************************/
void Sparse :: ManfiSparse()
{
for( int i = 0; i < Terms; i++ )
Data[i].value *= -1;
}
/*********************************************************/
void Sparse :: FastTranspose( Sparse a )
{
int i, k;
int RowSize[Max], RowStart[Max];
Row = a.Col;
Col = a.Row;
Terms = a.Terms;
for( i = 0; i < a.Col; i++ )
RowSize[i] = 0;
for( i = 0; i < a.Terms; i++ )
RowSize[a.Data[i].col-1]++;
RowStart[0] = 0;
for( i = 1; i < a.Col; i++ )
RowStart[i] = RowStart[i-1] + RowSize[i-1];
for( i = 0; i < a.Terms; i++ )
{
k = RowStart[a.Data[i].col-1]++;
Data[k].row = a.Data[i].col;
Data[k].col = a.Data[i].row;
Data[k].value = a.Data[i].value;
}
}
/*********************************************************/
int Sparse :: StoreSum( int sum, int&LastInResult, int r, int c )
{
if( sum != 0 )
if( LastInResult < Max-1 )
{
LastInResult++;
Data[LastInResult].row = r;
Data[LastInResult].col = c;
Data[LastInResult].value = sum;
return 0;
}
else
{
cerr << "\n*** ERROR !!! Tedade Anasore Gheyre Sefr Az Fazaye Arayeh Biroon Mizanad ***\n";
return 1;
}
else
return 0;
}
/*********************************************************/
char compare( int x, int y )
{
if( x < y )
return '<';
else if( x == y )
return '=';
return '>';
}
/*********************************************************/
void Sparse :: MulSparse( Sparse a, Sparse b )
{
if( a.Col != b.Row )
{
cout << "\n*** ERROR !!! Zarbe 2 Matris Emkan Pazir Nist ***";
Row = 0;
Col = 0;
Terms = 0;
return;
}
if( ( a.Terms == Max ) || ( b.Terms == Max ) )
{
cout << "*** ERROR !!! Yek Fazaye Khali Dar Matris 'A' Ya 'B' Lazem Ast ***";
Row = 0;
Col = 0;
Terms = 0;
return;
}
Sparse d;
d.FastTranspose( b );
int currRowIndex = 0, LastInResult = -1, currRowBegin = 0, currRowA = a.Data[0].row;
a.Data[a.Terms].row = a.Row;
d.Data[b.Terms].row = b.Col;
d.Data[b.Terms].col = -1;
int sum = 0;
while( currRowIndex < a.Terms )
{
int currColB = d.Data[0].row;
int currColIndex = 0;
while( currColIndex <= b.Terms )
{
if( a.Data[currRowIndex].row != currRowA )
{
if( StoreSum( sum, LastInResult, currRowA, currColB ) )
{
Row = 0;
Col = 0;
Terms = 0;
cout << "\n *** ERROR !!! ***";
return;
}
else
sum = 0;
currRowIndex = currRowBegin;
while ( d.Data[currColIndex].row == currColB )
currColIndex++;
currColB = d.Data[currColIndex].row;
}
else if( d.Data[currColIndex].row != currColB)
{
if( StoreSum( sum, LastInResult, currRowA, currColB ) )
{
Row = 0;
Col = 0;
Terms = 0;
cout << "\n *** ERROR !!! ***";
return;
}
else
sum = 0;
currRowIndex = currRowBegin;
currColB = d.Data[currColIndex].row;
}
else switch( compare( a.Data[currRowIndex].col, d.Data[currColIndex].col ) )
{
case '<' :
currRowIndex++;
break;
case '=' :
sum += a.Data[currRowIndex].value * d.Data[currColIndex].value;
currRowIndex++;
currColIndex++;
break;
case '>' :
currColIndex++;
}
}
while( a.Data[currRowIndex].row == currRowA )
currRowIndex++;
currRowBegin = currRowIndex;
currRowA = a.Data[currRowIndex].row;
}
Row = a.Row;
Col = b.Col;
Terms = LastInResult + 1;
}
/*********************************************************/
void Moarrefi( void )
{
clrscr();
cout << "\t\t\t\tBe Name Khoda"
<< "\n\n\nBarname Nevis : BEHZAD LOTFI"
<< "\n\nShomare Daneshjooti : 860343715"
<< "\n\nReshteye Tahsili : computer"
<< "\n\nMaghtae Tahsili : Karshenasi"
<< "\n\ntell : 09126142203"
<< "\n\ng mail : behzad.lotfi@gmail.com"
<< "\n\n\n\n\t\t\t\tKelidi Ra Befesharid";
getch();
}
/*********************************************************/
void Meno( void )
{
clrscr();
cout << "\n# Lotfan Alamat Morede Nazar Ra Vared Konid :\n"
<< "\n+ : Jam Ba Matrisi Digar"
<< "\n- : Tafrigh Az Matrisi Digar"
<< "\n* : Zarb Dar Matrisi Digar"
<< "\nP : Chape Matrise Vagheyi"
<< "\nT : Tarane Hadeye Matris";
}
/*********************************************************/
void main( void )
{
Moarrefi();
Sparse a, b, c;
a.ReadSparse();
a.WriteSparse();
Meno();
switch( getch() )
{
case '+' :
b.ReadSparse();
b.WriteSparse();
c.AddSparse(a,b);
cout << "\n\nAnswer Is : ";
c.WriteSparse();
break;
case '-' :
b.ReadSparse();
b.WriteSparse();
b.ManfiSparse();
c.AddSparse(a,b);
cout << "\n\nAnswer Is : ";
c.WriteSparse();
break;
case '*' :
b.ReadSparse();
b.WriteSparse();
c.MulSparse(a,b);
clrscr();
cout << "\n\nAnswer Is : ";
c.WriteSparse();
break;
case 'p' :
a.WriteMatrix();
break;
case 't' :
c.FastTranspose( a );
clrscr();
cout << "\n\nAnswer Is : ";
c.WriteSparse();
break;
}
}
بازگشت به بالاي صفحه اذهب الى الأسفل
http://p4dl.com
saeedkiania




تعداد پستها : 3
تاريخ التسجيل : 2010-01-05

برنامه ماتريس خلوت &#1740;ا اسپارس Empty
پستعنوان: رد: برنامه ماتريس خلوت &#1740;ا اسپارس   برنامه ماتريس خلوت &#1740;ا اسپارس Emptyالإثنين يناير 11, 2010 8:14 pm

خیلی ممنون
بازگشت به بالاي صفحه اذهب الى الأسفل
 
برنامه ماتريس خلوت &#1740;ا اسپارس
بازگشت به بالاي صفحه 
صفحه 1 از 1

صلاحيات هذا المنتدى:شما نمي توانيد در اين بخش به موضوعها پاسخ دهيد
برنامه سازی پیشرفته :: برنامه سازی پیشرفته :: برنامه سازی گروه 2-
پرش به: