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

προγραμμα C++... εχω κολλησει...


ghenius

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

Δημοσ.

Πρεπει να παραδωσω καποιες ασκησεις στον Προγραμματισμο Ι και εχω κολλησει σε αυτην εδω... Την εχω γραψει ολη και οταν παω να την τρεξω μου λεει οτι υπαρχει καποιο προβλημα και μ βγαζει κλεισιμο προγραμματος...

 

 

Η εκφωνηση της σκησης ειναι αυτη:

 

 

Να γραφεί πρόγραμμα το οποίο θα ολισθαίνει προς τα δεξιά έναν μονοδιάστατο πίνακα Ν ακεραίων, ενώ το τελευταίο στοιχείο θα πηγαίνει πρώτο. Το πρόγραμμα θα περιλαμβάνει τις εξής συναρτήσεις:

 

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;

}

 

 

ευχαριστω πολυ για το χρονο σας...

Δημοσ.

για αρχη αλλαξε το

 

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)

Δημοσ.

>
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;
}

Δημοσ.

Να δωσω και εγω μια λυση που θυμιζει 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;
}

 

Δημοσ.

Θα μπορούσες να μετακινήσεις τα περιεχόμενα του πίνακα είτε προς τα δεξιά είτε προς τα αριστερά με την βοήθεια της ρουτίνας 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" μπλοκ.

Δημοσ.

@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

 

To παιδί τώρα μαθαίνει c και τον εριξες αμέσως στα βαθυα.

ναι αυτο ισχυει... δεν καταλαβα τιποτα απο τα παραπανω

 

Η λύση αυτή δεν απευθύνεται (στην παρούσα φάση) στον φίλο μας καθώς για το ερώτημα του έχουν ήδη αναρτηθεί θαυμάσιες λύσεις τις οποίες θεωρώ ότι μπορεί να υποστηρίξει σε μια εξέταση. Για αυτό τον λόγο λοιπόν δεν μπήκαν στην διαδικασία να αναρτήσω μια αναλυτική λύση με τα βήματα που υποδεικνύει η εκφώνηση. Θεώρησα όμως καλή ευκαιρία να υπενθυμίσω πως όσον αφορά τα Array και την διαχείριση των περιεχομένων τους υπάρχει επιπλέον των for μια ακόμη, λιγότερο δημοφιλής, λύση την οποία μπορεί σήμερα να μην κατανοεί αλλά σε βάθος χρόνου και καθώς θα εξοικειώνεται με την γλώσσα θα την κατανοήσει και η γνώση της θα τον βοηθήσει σε αρκετές ασκήσεις που θα ακολουθήσουν και θα αφορούν διαχείριση πινάκων.-

:)

Δημοσ.

Η λύση αυτή δεν απευθύνεται (στην παρούσα φάση) στον φίλο μας καθώς για το ερώτημα του έχουν ήδη αναρτηθεί θαυμάσιες λύσεις τις οποίες θεωρώ ότι μπορεί να υποστηρίξει σε μια εξέταση. Για αυτό τον λόγο λοιπόν δεν μπήκαν στην διαδικασία να αναρτήσω μια αναλυτική λύση με τα βήματα που υποδεικνύει η εκφώνηση. Θεώρησα όμως καλή ευκαιρία να υπενθυμίσω πως όσον αφορά τα Array και την διαχείριση των περιεχομένων τους υπάρχει επιπλέον των for μια ακόμη, λιγότερο δημοφιλής, λύση την οποία μπορεί σήμερα να μην κατανοεί αλλά σε βάθος χρόνου και καθώς θα εξοικειώνεται με την γλώσσα θα την κατανοήσει και η γνώση της θα τον βοηθήσει σε αρκετές ασκήσεις που θα ακολουθήσουν και θα αφορούν διαχείριση πινάκων.-

:)

 

θα σ ηταν ευκολο να δωσεις καμια ιδεα με απλες εντολες γιατι ενω η ασκηση τρεχει μ βγαζει μονο τον κερσορα και οχι τη λυση...

Δημοσ.

λοιπον εκανα τις αλλαγεσ που μ υπεδειξε ο 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 χρησιμοποιείς;

Δημοσ.

Καταρχήν το πρόγραμμα του φίλου 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

Δημοσ.

Mια που η συζήτηση αφορά πίνακες, έχετε υπόψη κάποια βιβλιοθήκη στην C++ για την

διαχείριση πολυδιάστατων δυναμικών πινάκων για αριθμούς ;

Δηλ. να μπορώ να ορίζω δυναμικά έναν αριθμητικό πίνακα πολλών διαστάσεων και

ει δυνατόν να υπάρχει μια πληθώρα βοηθητικών λειτουργιών.

Π.χ. στοιχειώδεις πράξεις πινάκων, στοιχειώδεις συναρτήσεις σε πίνακα (π.χ. sinA),

εύρεση μεγίστου/ελαχίστου στοιχείου, διαστάσεις & σχήμα κλπ.

 

Η boost έχει την κλάση multi_array που έχει όλη σχεδόν την λειτουργικότητα που μπορεί να χρειαστεί κάποιος

αλλά δυστυχώς αφορά στατικούς πινακες. Και η array το ίδιο.

 

Όχι τιποτ' άλλο, να μην μπλέκω με χαμηλό επίπεδο...

 

-

Δημοσ.

πως γινεται αυτο?? σε εμενα δεν τρεχει κανενα απο τα 2 προγραμματα... αν εννοεις ποιο προγραμμα χρησιμοποιω για τη C++ ειναι αυτο:

Dev-Cpp

 

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder 2009, VS08 και QT Creator (με MinGW), εμφανίζει τον κέρσορα, δίνεις τον αριθμό των τιμών που θα περάσεις (πχ. 5) και ύστερα ξεκινάς να εισάγεις μια - μια κάθε τιμή πατώντας κάθε φορά Enter (1, 2 κλπ). Στο τέλος γίνεται η ολίσθηση και η εκτύπωση στην οθόνη:

 

 

Όσον αφορά το Dev-Cpp δεν το χρησιμοποιώ και δεν μπορώ να προτείνω τίποτα εκτός του να δεις αν σου δίνει κάποιο σφάλμα (error) ή warning κατά το compile του project σου (μήπως πάρεις κάποιο hint) εξασφαλίζοντας παράλληλα ότι το περιβάλλον του είναι σωστά ρυθμισμένο.

 

Mια που η συζήτηση αφορά πίνακες, έχετε υπόψη κάποια βιβλιοθήκη στην C++ για την

διαχείριση πολυδιάστατων δυναμικών πινάκων για αριθμούς ;

Δηλ. να μπορώ να ορίζω δυναμικά έναν αριθμητικό πίνακα 1,2,3 ή 4 διαστάσεων και

ει δυνατόν να υπάρχει μια πληθώρα βοηθητικών λειτουργιών.

Π.χ. στοιχειώδεις πράξεις πινάκων, στοιχειώδεις συναρτήσεις σε πίνακα (π.χ. sinA),

εύρεση μεγίστου/ελαχίστου στοιχείου, διαστάσεις & σχήμα κλπ.

 

Η boost έχει την κλάση multi_array που έχει όλη σχεδόν την λειτουργικότητα που μπορεί να χρειαστεί κάποιος

αλλά δυστυχώς αφορά στατικούς πινακες. Και η array το ίδιο.

 

Όχι τιποτ' άλλο, να μην μπλέκω με χαμηλό επίπεδο...

 

-

 

Για δες εδώ μήπως σε εξυπηρετήσει (καθώς αναφέρει multidimensional arrays & tensors).

Δημοσ.

@DirectX

 

Ευχαριστώ για την άμεση απάντηση !

 

Δεν το είχα υπόψη μου αυτό.

Με μια πρόχειρη ματιά δείχνει ο ορισμός να είναι δυναμικός, οπότε

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

 

Έχω καλομάθει (ή κακομάθει !) στη Fortran. Εκεί δεν υπάρχουν τέτοια προβλήματα :

π.χ. ένα απλό allocate(A(nx,ny,nz,nw)) φτιάχνει αμέσως έναν πραγματικό ή μιγαδικό πίνακα και

όλη η λειτουργικότητα που χρειάζεται παρέχεται έτοιμη ενδογενώς.

 

Και πάλι σε ευχαριστώ για την υπόδειξη.

 

-

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

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

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