Προς το περιεχόμενο

Εργασία σε C++


suomilk

Προτεινόμενες αναρτήσεις

Δημοσ.

Μου έχει ανατεθεί η εξής εργασία στο πανεπιστήμιο:

 

 

Να γίνει πρόγραμμα σε C++ το οποίο θα πραγματοποιεί πολλαπλασιασμό πινάκων και αντιστροφή τετραγωνικού πίνακα. Θα εμφανίζεται επαναληπτικά μενού όπου ο χρήστης θα επιλέγει αν θέλει πολλαπλασιασμό, αντιστροφή ή έξοδο από το πρόγραμμα. Η εισαγωγή των/ του πίνακα θα γίνεται με χρήση συνάρτησης όπου ο χρήστης θα επιλέγει και τις διαστάσεις του πίνακα. Επίσης η αντιστροφή, ο πολλαπλασιασμός αλλά και η εκτύπωση των αποτελεσμάτων θα γίνονται με χρήση κατάλληλων συναρτήσεων.

 

Ο κώδικας που έκανα είναι ο παρακάτω:

>
#include <iostream>
using namespace std;

int d1, d2;	
double **m;
double **c;
double fill_array();
double multiply_array(int row1,int column1,int column2,double** a,double** ;
double inverse_array(int n,double** d);
void print_array(int row,int column,double **c);
int main( )
{	
int answer=0;
while(answer!=3){
	cout<<"Please select one of the operations\n";
	cout<<"1. Multiply Array\n"<<"2. Inverse square Array\n"<<"3. Quit\n";
	cin>>answer;
	if (answer==1){
		int row,column;
		int row1,column1,column2;			
		fill_array();
		double **a1;
		a1 = new double* [d1];
		int i, j;
		for (i = 0; i < d1; i++)
			a1[i] = new double[d2];
		for (i = 0; i < d1; i++)
			for (j = 0; j < d2; j++)
				a1[i][j]= m[i][j];
		row1=d1;
		column1=d2;
		fill_array();
		double **a2;
		a2 = new double* [d1];
		for (i = 0; i < d1; i++)
			a2[i] = new double[d2];
		for (i = 0; i < d1; i++)
			for (j = 0; j < d2; j++)
				a2[i][j]= m[i][j];
		column2=d2;	
		multiply_array(row1,column1,column2,a1,a2);			

		row=row1;
		column=column2;
		print_array(row,column,c);			
		}
	else if (answer==2){
		
		fill_array();
		double **a3;
		a3 = new double* [d1];
		int i, j;
		for (i = 0; i < d1; i++)
			a3[i] = new double[d1];
		for (i = 0; i < d1; i++)
			for (j = 0; j < d1; j++)
				a3[i][j]= m[i][j];
		inverse_array(d1,a3);
		print_array(d1,d1,a3);

	}
	else 
		return 0;
}
}

double fill_array(){
cout << "Enter the row and column dimensions of the array:\n";
	cin >> d1 >> d2;
m = new double* [d1];
int i, j;

for (i = 0; i < d1; i++)
	m[i] = new double[d2];
cout << "Enter " << d1 << " rows of "<< d2 << " integers each:\n";
for (i = 0; i < d1; i++)
	for (j = 0; j < d2; j++)
		cin >> m[i][j];
return **m;	
return d1;
return d2;	
}

double multiply_array(int row1,int column1,int column2,double**  a,double** {
c = new double* [row1];
int i, j,k;	

for (i = 0; i < column2; i++)
	c[i] = new double[column2];

for( i=0;i<row1;++i)
{
	for(j=0;j<column1;++j)
	{
		double val=0;
		for(k=0;k<column2;++k)
		{
			val += a[i][k] * (b[k][j]);
		}
		c[i][j]=val;
	}
}
for (i = 0; i < row1; i++)
	delete[] a[i];
delete[] a;

for (i = 0; i < column1; i++)
	delete[] b[i];
delete[] b;

return **c;
return row1;
return column2;
}

void print_array(int row,int column,double **c){
int i,j;
for (i = 0; i < row; i++)
	{
		for (j = 0; j < column; j++)
			cout << c[i][j] << " ";
		cout << endl;
	}
for (i = 0; i < row; i++)
	delete[] c[i];
delete[] c;
}

double inverse_array(int n,double** e){
int i,j,k;

double **d;
d = new double* [n];
for (i = 0; i < n; i++)
	d[i] = new double[n];

double **f;
f = new double* [n];
for (i = 0; i < n; i++)
	f[i] = new double[n];

for(i=0;i<n;i++)
{
		for(j=0;j<n;j++)
		{
				if(i==j)
					d[i][j]=1;
				else
					d[i][j]=0;
		}
}

if(e[0][0]==0)
{
	for(j=0;j<n;j++)
	{
		f[0][j]=e[1][j];
		e[1][j]=e[0][j];
		e[0][j]=f[0][j];
		f[0][j]=d[1][j];
		d[1][j]=d[0][j];
		d[0][j]=f[0][j];
	}
}
for(i=0;i<n;i++)
{
	double h=0;
	h=e[i][i];
	
	for(j=0;j<n;j++)
	{
		e[i][j]=e[i][j]/h;			
		d[i][j]=d[i][j]/h;			
	}
	for(k=0;k<n;k++)
	{
		if(k!=i)
		{
			double z=0;
			z=e[k][i];
			for(j=0;j<n;j++)
			{
				e[k][j]=e[k][j]-(e[i][j]*z);					
				d[k][j]=d[k][j]-(d[i][j]*z);					
			}
		}
	}
}

return **d;
return n;
}

 

Το πρόβλημα που έχω είναι ότι ενώ η συνάρτηση inverse_array δεν δουλεύει σωστά ενώ

θα έπρεπε. Η αντιστροφή του πίνακα γίνεται με επαυξημένη μήτρα μιας και είναι πιο εύκολος στην υλοποίηση.

 

Αν μπορεί να βοηθήσει κάποιος θα το εκτιμούσα.

Δημοσ.

Θα βοηθούσε να μας δώσεις ένα copy past από το τι τυπώνει

 

επίσης χωρίς να έχω κάνει compile το source δεν μου

"αρέσουν προγραματιστικά" τα deletes που κάνεις εντός των συναρτήσεων multiply, print καθώς και ο τρόπος που γυρνάς τα αποτελέσματα... (με return) θα μου φαινόταν πιο "σωστο" να τα γυρνάς με pointer parameter πχ

 

void multiply(int Rows, int Cols, double *A, double*b, double *AB);

Δημοσ.
Τελικά δούλεψε.Ευχαριστώ.Έκανα ένα πολύ χαζό λάθος.Ευχαριστώ πολύ πάντως.

 

Αν θέλεις θα ήταν καλό να ποστάρεις και ποιά είναι η λύση ώστε στο μέλλον αν κάποιος βρεθεί με το ίδιο πρόβλημα να δει και την απάντηση...

Δημοσ.
Αν θέλεις θα ήταν καλό να ποστάρεις και ποιά είναι η λύση ώστε στο μέλλον αν κάποιος βρεθεί με το ίδιο πρόβλημα να δει και την απάντηση...

>
#include <iostream>
using namespace std;

int d1, d2;	
double **m;
double **c;
double **d;
int fill_array();
int multiply_array(int row1,int column1,int column2,double** a,double** ;
void inverse_array(int n,double** e);
void print_array(int row,int column,double **c);
int main( )
{	
int answer=0;
while(answer!=3){
	cout<<"Please select one of the operations\n";
	cout<<"1. Multiply Array\n"<<"2. Inverse square Array\n"<<"3. Quit\n";
	cin>>answer;
	if (answer==1){
		int row,column;
		int row1,column1,column2;			
		fill_array();
		double **a1;
		a1 = new double* [d1];
		int i, j;
		for (i = 0; i < d1; i++)
			a1[i] = new double[d2];
		for (i = 0; i < d1; i++)
			for (j = 0; j < d2; j++)
				a1[i][j]= m[i][j];
		row1=d1;
		column1=d2;
		for (int i = 0; i < d1; i++)
			delete[] m[i];
		delete[] m;			
		fill_array();
		double **a2;
		a2 = new double* [d1];
		for (i = 0; i < d1; i++)
			a2[i] = new double[d2];
		for (i = 0; i < d1; i++)
			for (j = 0; j < d2; j++)
				a2[i][j]= m[i][j];
		column2=d2;	
		for (int i = 0; i < d1; i++)
			delete[] m[i];
		delete[] m;

		multiply_array(row1,column1,column2,a1,a2);
		for (i = 0; i < row1; i++)
			delete[] a1[i];
		delete[] a1;
		for (i = 0; i < column1; i++)
			delete[] a2[i];
		delete[] a2;
		row=row1;
		column=column2;
		print_array(row,column,c);
		
		for (int i = 0; i < row; i++)
			delete[] c[i];
		delete[] c;
		}
	else if (answer==2){
		
		fill_array();
		inverse_array(d1,m);
		print_array(d1,d1,d);
		for (int i = 0; i < d1; i++)
			delete[] d[i];
		delete[] d;
	}
	else 
		return 0;
}
}

int fill_array(){
cout << "Enter the row and column dimensions of the array:\n";
	cin >> d1 >> d2;
m = new double* [d1];
int i, j;

for (i = 0; i < d1; i++)
	m[i] = new double[d2];
cout << "Enter " << d1 << " rows of "<< d2 << " integers each:\n";
for (i = 0; i < d1; i++)
	for (j = 0; j < d2; j++)
		cin >> m[i][j];
return d1;
return d2;	
}

int multiply_array(int row1,int column1,int column2,double**  a,double** {
int i, j,k;	
c = new double* [row1];
for (i = 0; i < column2; i++)
	c[i] = new double[column2];

for( i=0;i<row1;++i)
{
	for(j=0;j<column2;++j)
	{
		double val=0;
		for(k=0;k<column1;++k)
		{
			val += a[i][k] * b[k][j];
		}
		c[i][j]=val;
	}
}	
return row1;
return column2;
}

void print_array(int row,int column,double **c){
int i,j;
for (i = 0; i < row; i++)
	{
		for (j = 0; j < column; j++)
			cout << c[i][j] << " ";
		cout << endl;
	}
}

void inverse_array(int n,double** e){
int i,j,k;	
d = new double* [n];
for (i = 0; i < n; i++)
	d[i] = new double[n];

double **f;
f = new double* [n];
for (i = 0; i < n; i++)
	f[i] = new double[n];

for(i=0;i<n;i++)
{
		for(j=0;j<n;j++)
		{
				if(i==j)
					d[i][j]=1;
				else
					d[i][j]=0;
		}
}

if(e[0][0]==0)
{
	for(j=0;j<n;j++)
	{
		f[0][j]=e[1][j];
		e[1][j]=e[0][j];
		e[0][j]=f[0][j];
		f[0][j]=d[1][j];
		d[1][j]=d[0][j];
		d[0][j]=f[0][j];
	}
}
for(i=0;i<n;i++)
{
	double h=0;
	h=e[i][i];
	
	for(j=0;j<n;j++)
	{
		e[i][j]=e[i][j]/h;			
		d[i][j]=d[i][j]/h;			
	}
	for(k=0;k<n;k++)
	{
		if(k!=i)
		{
			double z=0;
			z=e[k][i];
			for(j=0;j<n;j++)
			{
				e[k][j]=e[k][j]-(e[i][j]*z);					
				d[k][j]=d[k][j]-(d[i][j]*z);					
			}
		}
	}
}
for (i = 0; i < n; i++)
	delete[] f[i];
delete[] f;
for (i = 0; i < n; i++)
	delete[] e[i];
delete[] e;
}

 

Ιδού και η λύση.Για κάποιο λόγο τρώει κωλύματα κατά την εκτέλεση του πρώτου if εάν δηλαδή θέλουμε να κάνουμε πολλαπλασιασμό δύο πινάκων.

Πιθανώς να παίζει ρόλο ότι καλείται η fill_array δύο φορές ή κάτι με τους Pointers ή τον τύπο double ή την αποδέσμευση μνήμης από τους Pointers.

Αν κάποιος μπορεί να το βελτιώσει και να εξαλείψουμε τα bugs θα ήμουν ευγνώμων.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...