suomilk Δημοσ. 13 Φεβρουαρίου 2009 Δημοσ. 13 Φεβρουαρίου 2009 Μου έχει ανατεθεί η εξής εργασία στο πανεπιστήμιο: Να γίνει πρόγραμμα σε 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 δεν δουλεύει σωστά ενώ θα έπρεπε. Η αντιστροφή του πίνακα γίνεται με επαυξημένη μήτρα μιας και είναι πιο εύκολος στην υλοποίηση. Αν μπορεί να βοηθήσει κάποιος θα το εκτιμούσα.
drm Δημοσ. 13 Φεβρουαρίου 2009 Δημοσ. 13 Φεβρουαρίου 2009 Θα βοηθούσε να μας δώσεις ένα copy past από το τι τυπώνει επίσης χωρίς να έχω κάνει compile το source δεν μου "αρέσουν προγραματιστικά" τα deletes που κάνεις εντός των συναρτήσεων multiply, print καθώς και ο τρόπος που γυρνάς τα αποτελέσματα... (με return) θα μου φαινόταν πιο "σωστο" να τα γυρνάς με pointer parameter πχ void multiply(int Rows, int Cols, double *A, double*b, double *AB);
suomilk Δημοσ. 13 Φεβρουαρίου 2009 Μέλος Δημοσ. 13 Φεβρουαρίου 2009 Τελικά δούλεψε.Ευχαριστώ.Έκανα ένα πολύ χαζό λάθος.Ευχαριστώ πολύ πάντως.
_DiMoN_ Δημοσ. 13 Φεβρουαρίου 2009 Δημοσ. 13 Φεβρουαρίου 2009 Τελικά δούλεψε.Ευχαριστώ.Έκανα ένα πολύ χαζό λάθος.Ευχαριστώ πολύ πάντως. Αν θέλεις θα ήταν καλό να ποστάρεις και ποιά είναι η λύση ώστε στο μέλλον αν κάποιος βρεθεί με το ίδιο πρόβλημα να δει και την απάντηση...
suomilk Δημοσ. 13 Φεβρουαρίου 2009 Μέλος Δημοσ. 13 Φεβρουαρίου 2009 Αν θέλεις θα ήταν καλό να ποστάρεις και ποιά είναι η λύση ώστε στο μέλλον αν κάποιος βρεθεί με το ίδιο πρόβλημα να δει και την απάντηση... > #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 θα ήμουν ευγνώμων.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.