ghenius Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Πρεπει να παραδωσω καποιες ασκησεις στον Προγραμματισμο Ι και εχω κολλησει σε αυτην εδω... Την εχω γραψει ολη και οταν παω να την τρεξω μου λεει οτι υπαρχει καποιο προβλημα και μ βγαζει κλεισιμο προγραμματος... Η εκφωνηση της σκησης ειναι αυτη: Να γραφεί πρόγραμμα το οποίο θα ολισθαίνει προς τα δεξιά έναν μονοδιάστατο πίνακα Ν ακεραίων, ενώ το τελευταίο στοιχείο θα πηγαίνει πρώτο. Το πρόγραμμα θα περιλαμβάνει τις εξής συναρτήσεις: 1) Eisodos: θα διαβάζει με κατάλληλη προτροπή το πλήθος και τα στοιχεία του πίνακα. 2) Olisthisi: θα επιστρέφει τον ίδιο πίνακα αφού προηγηθεί ολίσθηση προς τα δεξιά και το τελευταίο στοιχείο να πάει πρώτο. 3) Emfanisi: θα εμφανίζει τον πίνακα σε μια γραμμή. Στη main(): • Θα γίνεται κλήση της συνάρτησης Eisodos για να το πλήθος και τα στοιχεία του πίνακα. • Θα γίνεται κλήση της συνάρτησης Emfanisi για να εμφανιστεί ο πίνακας πριν την ολίσθηση. • Θα γίνεται κλήση της συνάρτησης Olisthisi για να γίνει η ολίσθηση του πίνακα. • Θα γίνεται κλήση της συνάρτησης Emfanisi για να εμφανιστεί ο πίνακας μετά την ολίσθηση. Και το προγραμμα που εχω γραψει εγω ειναι αυτο: #include <stdlib.h> #include <iostream> using namespace std; void Eisodos (int a[], int pli) { cin>>pli; for (int i=0;i<=pli;i++) cin>>a; } //============================================== void Olisthisi (int a[],int pli){ int temp; do { temp=a[pli-1]; a[pli-1]=a[pli]; a[pli]=temp; pli--;} while (pli==0); } //============================================== void Emfanisi (int a[],int pli) { for(int i=0;i<=pli;i++) cout<<a<<" ,"; } //============================================== int main(int argc, char *argv[]) { int plithos, N[plithos]; Eisodos(N,plithos); Emfanisi(N,plithos); Olisthisi(N,plithos); Emfanisi(N,plithos); system("PAUSE"); return EXIT_SUCCESS; } ευχαριστω πολυ για το χρονο σας...
Nikosgiann Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 για αρχη αλλαξε το void Eisodos (int a[], int pli) { cin>>pli; for (int i=0;i<=pli;i++) -------------->for (int i=0;i<pli;i++) cin>>a; το ιδιο και στην εμφανιση (μετρας και το 0)
fotis4u Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 > void Olisthisi (int a[],int pli){ int temp; do { temp=a[pli-1]; a[pli-1]=a[pli]; a[pli]=temp; pli--; }while (pli==0); Το a[pli] δεν μπορεί να έχει τέτοια τιμή γιατί τα στοιχεία του Πίνακα ξεκινάνε από το 0 και καταλήγουν στο pli-1, οπότε η θέση a[pli] δεν μπορεί να καθοριστεί στον πίνακα σου. Και επίσης το μέγεθος που θα έχει ο πίνακας από που το διαβάζεις ?
virxen75 Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 κάπως έτσι είναι > #include <stdlib.h> #include <iostream> using namespace std; void Eisodos (int a[], int *pli) { cout<<"posa 8a diabaso:"; cin>>*pli; for (int i=0;i<*pli;i++){ cout<<"dose to A["<<i<<"]="; cin>>a[i]; } } //============================================== void Olisthisi (int a[],int pli){ int i,temp; int last=a[pli-1]; for (i=pli-1;i>0;i--) a[i]=a[i-1]; a[0]=last; } //============================================== void Emfanisi (int a[],int pli) { for(int i=0;i<pli;i++) if (i<pli-1) cout<<a[i]<<" ,"; else cout<<a[i]<<endl; } //============================================== int main(int argc, char *argv[]){ int *plithos; int N[10000]; // N[plithos]; Eisodos(N,plithos); Emfanisi(N,*plithos); Olisthisi(N,*plithos); Emfanisi(N,*plithos); system("PAUSE"); return EXIT_SUCCESS; }
Evgenios1 Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Να δωσω και εγω μια λυση που θυμιζει c++ αφου αυτη κανεις. >#include <algorithm> #include <iostream> template<class It> void Olisthisi(It first,It last) { for( ;first != last;//oso to last den exei ftasei to prwto std::swap(*(last-1),*(last)),// allakse to last me to proigoymeno toy --last)//pigene to last mia thesh pisw ; /* px pinkas int p[2] = {1,2,3}; 1 2 3 -> 1 3 2 -> 3 1 2 */ } int main() { int p[] = {1,2,3,4,5,6}; ::Olisthisi(p,p+5); for(int i =0;i<6;i++) std::cout<<p[i]<<std::endl; return 0; }
Directx Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Θα μπορούσες να μετακινήσεις τα περιεχόμενα του πίνακα είτε προς τα δεξιά είτε προς τα αριστερά με την βοήθεια της ρουτίνας memmove (string.h) εξαλείφοντας την ανάγκη του for-loop: > // Array scroll (to left or right), dx. #include <iostream> /* #define _LEFT */ using namespace std; int main(void) { int Array[] = { 1, 2, 3, 4, 5 }, Temp; const int ArrayLen = sizeof(Array) / sizeof(int) - 1; #ifdef _LEFT cout << " ~LEFT ~ "<<endl<<endl; #else cout << " ~RIGHT~ "<<endl<<endl; #endif // Redo 5 times. for(int T = 0; T <= 5; T++) { // Dump array on STDOUT.. cout << "Turn #"<<T<<":"<<endl<<"\t"; for(int C = 0; C <= ArrayLen; C++) cout <<Array[C] << (C + 1 <= ArrayLen ? ",": " "); // Move array LEFT or RIGHT? #ifdef _LEFT // Store array top. Temp = Array[0]; // (mem)Move array data left (Warning: ArrayLen must != 1) memmove(Array, &Array[1], sizeof(Array) - sizeof(int)); // Restore array top to bottom. Array[ArrayLen] = Temp; #else // Store array bottom. Temp = Array[ArrayLen]; // (mem)Move array data right (Warning: ArrayLen must != 1) memmove(&Array[1], Array, sizeof(Array) - sizeof(int)); // Restore array top from bottom. Array[0] = Temp; #endif cout << endl; } // Program end. cout <<endl<<"Press Enter to exit.."; cin.get(); return 0; } ΕΞΟΔΟΣ - ΔΕΞΙΑ: > ~RIGHT~ Turn #0: 1,2,3,4,5 Turn #1: 5,1,2,3,4 Turn #2: 4,5,1,2,3 Turn #3: 3,4,5,1,2 Turn #4: 2,3,4,5,1 Turn #5: 1,2,3,4,5 Press Enter to exit.. ΕΞΟΔΟΣ - ΑΡΙΣΤΕΡΑ (#define LEFT): > ~LEFT ~ Turn #0: 1,2,3,4,5 Turn #1: 2,3,4,5,1 Turn #2: 3,4,5,1,2 Turn #3: 4,5,1,2,3 Turn #4: 5,1,2,3,4 Turn #5: 1,2,3,4,5 Press Enter to exit.. Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder 2009 και μπορεί να περιέχει bugs ή άλλες αβλεψίες. Καλή συνέχεια!! Υ.Γ. Στο προηγούμενο post εκ παραδρομής έκανα την μετακίνηση του πίνακα προς τα αριστερά, αποφάσισα λοιπόν να διατηρήσω και αυτό το κομμάτι κώδικα τοποθετώντας το σε ένα "#ifdef LEFT" μπλοκ.
digital curse Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 @Directx To παιδί τώρα μαθαίνει c και τον εριξες αμέσως στα βαθυα.
ghenius Δημοσ. 18 Ιανουαρίου 2011 Μέλος Δημοσ. 18 Ιανουαρίου 2011 @Directx To παιδί τώρα μαθαίνει c και τον εριξες αμέσως στα βαθυα. ναι αυτο ισχυει... δεν καταλαβα τιποτα απο τα παραπανω, αλλα σας ευχαριστω παρα πολυ... μαλλον θα ψαξω να διορθωσω τα πρωτα που μ επισημαναν... > void Olisthisi (int a[],int pli){ int temp; do { temp=a[pli-1]; a[pli-1]=a[pli]; a[pli]=temp; pli--; }while (pli==0); Το a[pli] δεν μπορεί να έχει τέτοια τιμή γιατί τα στοιχεία του Πίνακα ξεκινάνε από το 0 και καταλήγουν στο pli-1, οπότε η θέση a[pli] δεν μπορεί να καθοριστεί στον πίνακα σου. Και επίσης το μέγεθος που θα έχει ο πίνακας από που το διαβάζεις ? το μεγεθος του πινακα το διαβαζω στη διαδικασια Εισοδος.... κάπως έτσι είναι > #include <stdlib.h> #include <iostream> using namespace std; void Eisodos (int a[], int *pli) { cout<<"posa 8a diabaso:"; cin>>*pli; for (int i=0;i<*pli;i++){ cout<<"dose to A["<<i<<"]="; cin>>a[i]; } } //============================================== void Olisthisi (int a[],int pli){ int i,temp; int last=a[pli-1]; for (i=pli-1;i>0;i--) a[i]=a[i-1]; a[0]=last; } //============================================== void Emfanisi (int a[],int pli) { for(int i=0;i<pli;i++) if (i<pli-1) cout<<a[i]<<" ,"; else cout<<a[i]<<endl; } //============================================== int main(int argc, char *argv[]){ int *plithos; int N[10000]; // N[plithos]; Eisodos(N,plithos); Emfanisi(N,*plithos); Olisthisi(N,*plithos); Emfanisi(N,*plithos); system("PAUSE"); return EXIT_SUCCESS; } λοιπον εκανα τις αλλαγεσ που μ υπεδειξε ο virxen 75 και τωρα αυτο που μ βγαζει ειναι ο κερσορας τ προγραμματος και τιποτα παραπανω... εμενα μ φαινεται σωστο και η C++ δε βγαζει κανενα λαθος, πως γινεται να μην τρεχει...???
Directx Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 @Directx To παιδί τώρα μαθαίνει c και τον εριξες αμέσως στα βαθυα. ναι αυτο ισχυει... δεν καταλαβα τιποτα απο τα παραπανω Η λύση αυτή δεν απευθύνεται (στην παρούσα φάση) στον φίλο μας καθώς για το ερώτημα του έχουν ήδη αναρτηθεί θαυμάσιες λύσεις τις οποίες θεωρώ ότι μπορεί να υποστηρίξει σε μια εξέταση. Για αυτό τον λόγο λοιπόν δεν μπήκαν στην διαδικασία να αναρτήσω μια αναλυτική λύση με τα βήματα που υποδεικνύει η εκφώνηση. Θεώρησα όμως καλή ευκαιρία να υπενθυμίσω πως όσον αφορά τα Array και την διαχείριση των περιεχομένων τους υπάρχει επιπλέον των for μια ακόμη, λιγότερο δημοφιλής, λύση την οποία μπορεί σήμερα να μην κατανοεί αλλά σε βάθος χρόνου και καθώς θα εξοικειώνεται με την γλώσσα θα την κατανοήσει και η γνώση της θα τον βοηθήσει σε αρκετές ασκήσεις που θα ακολουθήσουν και θα αφορούν διαχείριση πινάκων.-
ghenius Δημοσ. 18 Ιανουαρίου 2011 Μέλος Δημοσ. 18 Ιανουαρίου 2011 Η λύση αυτή δεν απευθύνεται (στην παρούσα φάση) στον φίλο μας καθώς για το ερώτημα του έχουν ήδη αναρτηθεί θαυμάσιες λύσεις τις οποίες θεωρώ ότι μπορεί να υποστηρίξει σε μια εξέταση. Για αυτό τον λόγο λοιπόν δεν μπήκαν στην διαδικασία να αναρτήσω μια αναλυτική λύση με τα βήματα που υποδεικνύει η εκφώνηση. Θεώρησα όμως καλή ευκαιρία να υπενθυμίσω πως όσον αφορά τα Array και την διαχείριση των περιεχομένων τους υπάρχει επιπλέον των for μια ακόμη, λιγότερο δημοφιλής, λύση την οποία μπορεί σήμερα να μην κατανοεί αλλά σε βάθος χρόνου και καθώς θα εξοικειώνεται με την γλώσσα θα την κατανοήσει και η γνώση της θα τον βοηθήσει σε αρκετές ασκήσεις που θα ακολουθήσουν και θα αφορούν διαχείριση πινάκων.- θα σ ηταν ευκολο να δωσεις καμια ιδεα με απλες εντολες γιατι ενω η ασκηση τρεχει μ βγαζει μονο τον κερσορα και οχι τη λυση...
Directx Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 λοιπον εκανα τις αλλαγεσ που μ υπεδειξε ο virxen 75 και τωρα αυτο που μ βγαζει ειναι ο κερσορας τ προγραμματος και τιποτα παραπανω... -- θα σ ηταν ευκολο να δωσεις καμια ιδεα με απλες εντολες γιατι ενω η ασκηση τρεχει μ βγαζει μονο τον κερσορα και οχι τη λυση... Καταρχήν το πρόγραμμα του φίλου virxen75 τρέχει κανονικά. Από εκεί και πέρα ακολουθεί ο κώδικας σου από την πρώτη σου ανάρτηση με διάφορες τροποποιήσεις: > #include <stdlib.h> #include <iostream> using namespace std; void Eisodos (int a[], int &pli) { cin>>pli; for (int i = 0; i < pli; i++) cin>>a[i]; } //============================================== void Olisthisi (int a[],int pli){ int temp = a[pli - 1]; for(int C = pli - 1; C > 0; C--) a[C] = a[C - 1]; a[0] = temp; } //============================================== void Emfanisi (int a[],int pli) { cout << "\n"; for(int i = 0; i < pli; i++) cout <<a[i]<<" ,"; cout << "\n"; } //============================================== int main(int argc, char *argv[]) { int plithos, N[100]; Eisodos(N,plithos); Emfanisi(N,plithos); Olisthisi(N,plithos); Emfanisi(N,plithos); system("PAUSE"); return EXIT_SUCCESS; } ΕΞΟΔΟΣ: > 5 1 2 3 4 5 1 ,2 ,3 ,4 ,5 , 5 ,1 ,2 ,3 ,4 , Press any key to continue . . . Υ.Γ. Ποίο compiler/IDE χρησιμοποιείς;
ghenius Δημοσ. 18 Ιανουαρίου 2011 Μέλος Δημοσ. 18 Ιανουαρίου 2011 Καταρχήν το πρόγραμμα του φίλου virxen75 τρέχει κανονικά. Από εκεί και πέρα ακολουθεί ο κώδικας σου από την πρώτη σου ανάρτηση με διάφορες τροποποιήσεις: > #include <stdlib.h> #include <iostream> using namespace std; void Eisodos (int a[], int &pli) { cin>>pli; for (int i = 0; i < pli; i++) cin>>a[i]; } //============================================== void Olisthisi (int a[],int pli){ int temp = a[pli - 1]; for(int C = pli - 1; C > 0; C--) a[C] = a[C - 1]; a[0] = temp; } //============================================== void Emfanisi (int a[],int pli) { cout << "\n"; for(int i = 0; i < pli; i++) cout <<a[i]<<" ,"; cout << "\n"; } //============================================== int main(int argc, char *argv[]) { int plithos, N[100]; Eisodos(N,plithos); Emfanisi(N,plithos); Olisthisi(N,plithos); Emfanisi(N,plithos); system("PAUSE"); return EXIT_SUCCESS; } ΕΞΟΔΟΣ: > 5 1 2 3 4 5 1 ,2 ,3 ,4 ,5 , 5 ,1 ,2 ,3 ,4 , Press any key to continue . . . Υ.Γ. Ποίο compiler/IDE χρησιμοποιείς; πως γινεται αυτο?? σε εμενα δεν τρεχει κανενα απο τα 2 προγραμματα... αν εννοεις ποιο προγραμμα χρησιμοποιω για τη C++ ειναι αυτο: Dev-Cpp
V.I.Smirnov Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 Mια που η συζήτηση αφορά πίνακες, έχετε υπόψη κάποια βιβλιοθήκη στην C++ για την διαχείριση πολυδιάστατων δυναμικών πινάκων για αριθμούς ; Δηλ. να μπορώ να ορίζω δυναμικά έναν αριθμητικό πίνακα πολλών διαστάσεων και ει δυνατόν να υπάρχει μια πληθώρα βοηθητικών λειτουργιών. Π.χ. στοιχειώδεις πράξεις πινάκων, στοιχειώδεις συναρτήσεις σε πίνακα (π.χ. sinA), εύρεση μεγίστου/ελαχίστου στοιχείου, διαστάσεις & σχήμα κλπ. Η boost έχει την κλάση multi_array που έχει όλη σχεδόν την λειτουργικότητα που μπορεί να χρειαστεί κάποιος αλλά δυστυχώς αφορά στατικούς πινακες. Και η array το ίδιο. Όχι τιποτ' άλλο, να μην μπλέκω με χαμηλό επίπεδο... -
Directx Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 πως γινεται αυτο?? σε εμενα δεν τρεχει κανενα απο τα 2 προγραμματα... αν εννοεις ποιο προγραμμα χρησιμοποιω για τη C++ ειναι αυτο: Dev-Cpp Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder 2009, VS08 και QT Creator (με MinGW), εμφανίζει τον κέρσορα, δίνεις τον αριθμό των τιμών που θα περάσεις (πχ. 5) και ύστερα ξεκινάς να εισάγεις μια - μια κάθε τιμή πατώντας κάθε φορά Enter (1, 2 κλπ). Στο τέλος γίνεται η ολίσθηση και η εκτύπωση στην οθόνη: http://www.youtube.com/watch?v=QD3ESmA1Xxw Όσον αφορά το Dev-Cpp δεν το χρησιμοποιώ και δεν μπορώ να προτείνω τίποτα εκτός του να δεις αν σου δίνει κάποιο σφάλμα (error) ή warning κατά το compile του project σου (μήπως πάρεις κάποιο hint) εξασφαλίζοντας παράλληλα ότι το περιβάλλον του είναι σωστά ρυθμισμένο. Mια που η συζήτηση αφορά πίνακες, έχετε υπόψη κάποια βιβλιοθήκη στην C++ για την διαχείριση πολυδιάστατων δυναμικών πινάκων για αριθμούς ; Δηλ. να μπορώ να ορίζω δυναμικά έναν αριθμητικό πίνακα 1,2,3 ή 4 διαστάσεων και ει δυνατόν να υπάρχει μια πληθώρα βοηθητικών λειτουργιών. Π.χ. στοιχειώδεις πράξεις πινάκων, στοιχειώδεις συναρτήσεις σε πίνακα (π.χ. sinA), εύρεση μεγίστου/ελαχίστου στοιχείου, διαστάσεις & σχήμα κλπ. Η boost έχει την κλάση multi_array που έχει όλη σχεδόν την λειτουργικότητα που μπορεί να χρειαστεί κάποιος αλλά δυστυχώς αφορά στατικούς πινακες. Και η array το ίδιο. Όχι τιποτ' άλλο, να μην μπλέκω με χαμηλό επίπεδο... - Για δες εδώ μήπως σε εξυπηρετήσει (καθώς αναφέρει multidimensional arrays & tensors).
V.I.Smirnov Δημοσ. 18 Ιανουαρίου 2011 Δημοσ. 18 Ιανουαρίου 2011 @DirectX Ευχαριστώ για την άμεση απάντηση ! Δεν το είχα υπόψη μου αυτό. Με μια πρόχειρη ματιά δείχνει ο ορισμός να είναι δυναμικός, οπότε πιθανόν θα το χρησιμοποιήσω καθώς δεν υπάρχουν πολλές εναλλακτικές επιλογές. Έχω καλομάθει (ή κακομάθει !) στη Fortran. Εκεί δεν υπάρχουν τέτοια προβλήματα : π.χ. ένα απλό allocate(A(nx,ny,nz,nw)) φτιάχνει αμέσως έναν πραγματικό ή μιγαδικό πίνακα και όλη η λειτουργικότητα που χρειάζεται παρέχεται έτοιμη ενδογενώς. Και πάλι σε ευχαριστώ για την υπόδειξη. -
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.