elefher Δημοσ. 21 Ιουνίου 2008 Δημοσ. 21 Ιουνίου 2008 kalispera pedia imai kainourgios kai tha ithela mia voithia se ena programam tis c++ xriazome na ftiajo ena programa sto opoio tha tou dino 12 arithmous kai tha mou emfanizi toy 2 megaliterous.den mporo na katalavo pos tha vro ton deftero megalitero.ean mpori kapios as mou grapsi ti lisi.efxaristo poli. pedia efxaristo poli giati voithia ala mipos tha mporouse kapios na me voithisi sto programam etsi opos to exo arxisi ego giati diskoleyome ligo me ta alla. #include <iostream.h> void main(void) { int x,y=1,a[12],z,max1; for(x=0;x<=11;x++) { cout<<"dose to "<<y<<" apo tous 12 arithmous "; cin>>z; a[x]=z; ++y; } max1=a[0]; for(x=0;x<=11;x++) { if(max1<a[x]) { max1=a[x]; } } cout<<"o protos megaliteros arithmos inai to "<<max1<<endl; }
ippo00 Δημοσ. 21 Ιουνίου 2008 Δημοσ. 21 Ιουνίου 2008 Πάντως τρία int θες προφανώς, όχι πίνακα δώδεκα θέσεων
RubiksCube Δημοσ. 21 Ιουνίου 2008 Δημοσ. 21 Ιουνίου 2008 Προφανώς υπάρχουν πολλοί τρόποι να το κάνεις αυτό. Ανάλογα με την οικειότητα που έχεις με την γλώσσα, άλλοι φαίνονται ευκολότεροι και άλλοι δυσκολότεροι. Σε περίπτωση που έχεις τους 12 αριθμούς σε ένα πίνακα: Αφού βρεις τον μεγαλύτερο, εκτός από τον αριθμό αποθήκευσε σε μια μεταβλητή και τη θέση του μέσα στον πίνακα (π.χ το στοιχείο Α(5), άρα αποθηκεύεις και το 5.). Τώρα μπορείς απλώς να αντικαταστήσεις την τιμή του με μια ακραία χαμηλή τιμή π.χ -99999, και ξανατρέχεις το ίδιο loop με πριν. Τώρα θα βρει τον δεύτερο μεγαλύτερο. Αν χρειάζεσαι τον πίνακα και στην συνέχεια απλά ξαναβάζεις την αρχική τιμή στη θέση του μεγαλύτερου (δηλαδή στη θέση 5 στο παράδειγμα.)
Dr.Fuzzy Δημοσ. 21 Ιουνίου 2008 Δημοσ. 21 Ιουνίου 2008 Παρε αυτο το function που εφτιαξα και αναλογα το προσαρμοζεις: > void largest(float& max1, float& max2, float a[], int n) { assert(n > 0); float max_val1 = a[0]; float max_val2 = a[0]; // Find 1st max for (int i=1; i<n; i++) { if (a[i] > max_val1) { max_val1=a[i]; } } // Find 2nd max for (int i=1; i<n; i++) { if (a[i] > max_val2 && a[i] != max_val1 ) { // != or < max_val2 = a[i]; } } max1 = max_val1; max2 = max_val2; } Φυσικα μπορει να γινει πολυ πιο αποδοτικα αν το ψαξεις!
ippo00 Δημοσ. 21 Ιουνίου 2008 Δημοσ. 21 Ιουνίου 2008 > #include <iostream> using namespace std; int main(int argc,char **argv) { int i,x,a,b; for(i=0;i<12;i++) { if(b>a) x=a,a=b,b=x; cin >> x; if(x> b=x; } cout << a << endl << b; return 0; } 1: Απλά πρέπει να αρχικοποιήσεις το α και β με την χαμιλότερη τιμή για το datatype. 2: Τουλάχιστον από ότι είπε το παιδί κανείς δεν μας λεεί να αποθηκεύσουμε όλα τα νούμερα. Έτσι γλυτώνουμε μνήμη και δύο loops 3: Προφανώς λείπουν τα prompts 4: Επίσης θα σε πετάξει απο το λούπ αν δεν εισάγεις αριθμό... τέσπα
Directx Δημοσ. 21 Ιουνίου 2008 Δημοσ. 21 Ιουνίου 2008 Μιας και πρόκειται για C++ θα μπορούσες να χρησιμοποιήσεις την ρουτίνα sort η οποία ταξινομεί τα περιεχόμενα ενός container (για εμάς ένα vector<int>) με αύξουσα σειρά. Η είσοδος από το πληκτρολόγιο μπορεί να γίνει με την βοήθεια της cin η οποία αποθηκεύει τα δεδομένα του χρήστη σε ένα string το οποίο εφόσον περιέχει αριθμητικούς χαρακτήρες (βλ. find_first_not_of) μετατρέπεται από string σε int (βλ. atoi) και ύστερα καταχωρείται στο vector<int> (βλ. .push_back). Η είσοδος επαναλαμβάνεται μέχρι την αποθήκευση 12 τιμών στο vector<int> (βλ. .size() < 12). Ύστερα με την βοήθεια της sort ταξινομούμε τις τιμές του vector<int> και επιστρέφουμε την τελευταία τιμή (βλ. rbegin(), που είναι εξορισμού της sort η μεγαλύτερη του πίνακα) και μετά την πρώτη διαφορετική τιμή της τελευταία (ώστε να εξαλείψουμε πιθανότητες διπλο-εγγραφών), ψάχνοντας τον πίνακα από το τέλος (μετά την μεγαλύτερη τιμή του) προς την αρχή. > //-Find Max & Min element in C++ Directx-(CodeGear Turbo C++ Explorer)------- #include <iostream> #include <algorithm> #include <stdlib.h> #include <vector> #include <string> #ifdef __BORLANDC__ #pragma hdrstop #endif //--------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { std::vector<int> vecNumber; std::string strInput; // Read keyboard buffer while(vecNumber.size() < 12) { std::cout<<"Enter Number ["<<vecNumber.size() + 1<<"]:"; std::cin>>strInput; // Valid Number? if(strInput.find_first_not_of("0123456789") == std::string::npos) vecNumber.push_back(atoi(strInput.c_str())); // atoi string and push it in vector } // Sort values std::sort(vecNumber.begin(), vecNumber.end()); // Return first max value std::cout<<"First Max:"<<*vecNumber.rbegin(); std::cout<<std::endl; // Return second max value (search vector backwards) for(int nSecondMax = vecNumber.size() - 1; nSecondMax >= 0; nSecondMax--) if(vecNumber.at(nSecondMax)!=*vecNumber.rbegin()) { std::cout<<"Second Max:"<<vecNumber.at(nSecondMax); break; } return 0; } //--------------------------------------------------------------------------- Υ.Γ. Ο κώδικας έχει γραφθεί με την C++ STL του CodeGear Turbo C++ Explorer, ελπίζω να δουλέψει και ως έχει και για άλλους C++ μεταφραστές.
elefher Δημοσ. 22 Ιουνίου 2008 Μέλος Δημοσ. 22 Ιουνίου 2008 pedia sas efxaristo olous giati voithia ala mipos mporite na mou to pite etsi opos to grafo ego giati de ta jero afta pou lete?
elefher Δημοσ. 22 Ιουνίου 2008 Μέλος Δημοσ. 22 Ιουνίου 2008 directx se efxaristo ala de katalaveno tipota apo to programa sou mipos mporis na me voithisis me pio apla pragmata?kitaje stin arxi pos to exo kani ego
Dr.Fuzzy Δημοσ. 22 Ιουνίου 2008 Δημοσ. 22 Ιουνίου 2008 Μα σου εδωσα ετοιμο το function! Καλεσε το απο την main() και δες πως δουλευει! Απλο ειναι!
ippo00 Δημοσ. 22 Ιουνίου 2008 Δημοσ. 22 Ιουνίου 2008 Δυο άτομα σου δώσαμε ολόκληρο πρόγραμμα, και ένας σου έδωσε συνάρτηση για να το κάνεις και ακόμα δεν βγάζεις άκρη; Το y γιατί το έχεις; εκτύπωσε χ+1 ή κάνε for(x=1;x<12;x++).
xyz_ Δημοσ. 22 Ιουνίου 2008 Δημοσ. 22 Ιουνίου 2008 > //-Find Max & Min element in C++ Directx-(CodeGear Turbo C++ Explorer)------- #include <iostream> #include <algorithm> #include <stdlib.h> #include <vector> #include <string> #ifdef __BORLANDC__ #pragma hdrstop #endif //--------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma argsused #endif // note 0 int main(int argc, char* argv[]) { std::vector<int> vecNumber; std::string strInput; // Read keyboard buffer while(vecNumber.size() < 12) // note 1 { std::cout<<"Enter Number ["<<vecNumber.size() + 1<<"]:"; // note 2 std::cin>>strInput; // Valid Number? if(strInput.find_first_not_of("0123456789") == std::string::npos) // note 3 vecNumber.push_back(atoi(strInput.c_str())); // atoi string and push it in vector } // Sort values std::sort(vecNumber.begin(), vecNumber.end()); // Return first max value std::cout<<"First Max:"<<*vecNumber.rbegin(); std::cout<<std::endl; // Return second max value (search vector backwards) // note 4 for(int nSecondMax = vecNumber.size() - 1; nSecondMax >= 0; nSecondMax--) if(vecNumber.at(nSecondMax)!=*vecNumber.rbegin()) { std::cout<<"Second Max:"<<vecNumber.at(nSecondMax); break; } return 0; } //--------------------------------------------------------------------------- Υ.Γ. Ο κώδικας έχει γραφθεί με την C++ STL του CodeGear Turbo C++ Explorer, ελπίζω να δουλέψει και ως έχει και για άλλους C++ μεταφραστές. Γεια σου Directx. Έχω μερικά notes για τον κώδικα σου. 0. Δεν χρειάζεσαι αυτές τις δυο μεταβλητές. Προφανώς έχεις ένα starting template στον editor σου και αυτά μπαίνουνε αυτόματα. Δεν παίζει κανένα ρολο, απλά δεν χρειάζονται. 1. θα ήταν καλύτερα να έτρεχες την loop όσο διαβάζονται valid αριθμοί, ώστε να μην υπάρχει το limit τον 12 αριθμόν. 2. Πρέπει να κανεις flush το stream αν θες να γραφτεί το output. Ένας τρόπος είναι με std::endl, ένας άλλος με flush(). 3. Αν και σιγουρεύεις ότι έχουνε διαβαστεί μονο 0123456789, αυτό δεν σημαίνει ότι η atoi() θα γυρίσει τα σωστά results. Για παράδειγμα, μπορώ να γράψω ένα αριθμό μεγαλύτερο του INT_MAX, και η atoi() θα αποτύχει γυρνώντας ένα τυχαίο αριθμό. 4. Δεν χρειάζεται να κανεις search στο vector. EDIT: Aκυρο αυτό αν και εγώ θα χρησιμοποιούσα την unique() Παρακάτω είναι ο "fixed" κώδικας. > #include <iostream> #include <vector> #include <climits> int main(void) { std::vector<int> v; int i; std::cout << "q to quit\nAri8moi apo " << INT_MIN << " eos " << INT_MAX << std::endl; for(std::cout << "Ari8mos[" << v.size() + 1 << "]:", std::cout.flush(); std::cin >> i; std::cout << "Ari8mos[" << v.size() + 1 << "]:", std::cout.flush()) v.push_back(i); if(std::cin.bad()) { std::cerr << "\nFatal error with cin istream\n"; return 0; } sort(v.begin(), v.end()); v.resize(unique(v.begin(), v.end()) - v.begin()); if(v.size() < 2) { std::cout << "\nTo programa xreiazete toulaxiston 2 unique ari8mous" << std::endl; return 0; } std::cout << "\nMax 1: " << v.back() << "\n" << "Max 2: " << v.at(v.size()-2) << std::endl; return 0; }
Directx Δημοσ. 22 Ιουνίου 2008 Δημοσ. 22 Ιουνίου 2008 xyz_ καλησπέρα και καλωσόρισες στο forum, Πάμε στα notes σου . . . 0ον) Πράγματι είναι template αλλά δεν μπαίνω στον κόπο να το τροποποιήσω βλέπεις δεν βλάπτουν ούτε ενοχλούν κανέναν (εκτός από εσένα ), ύστερα είναι common factor για πολλές C/C++ εφαρμογές και τα παιδιά εδώ το έχουν συνηθίσει από τις Σχολές τους (δίχως να ξεχνάμε και την ανάλογη της, την int main() που μου είναι πιο συμπαθητική). Βέβαια, πριν 15 με 20 χρόνια θα μπορούσες να έλεγες ότι επιβαρύνω το πρόγραμμα μου με ένα extra bootstrap κώδικα στη C RTL (μεγαλύτερο c0 obj αν θυμάμαι καλά) που αναγκαστικά θα προσέθετε ο compiler για την διαχείριση αυτών των παραμέτρων, σήμερα είναι πια non-issue (εκτός και αν συμπεριλάβεις το ή κάποιο ανάλογο του wildargs.obj το οποίο είναι μια άλλη ιστορία). 1ον) Το limit των 12 αριθμών τοποθετήθηκε μιας και έγινε αναφορά τους από την άσκηση και για κανέναν άλλο λόγο. Ένα ευχάριστο side effect είναι ότι σε περίπτωση εισαγωγής μη αποδεκτής τιμής, συνεχίζει την εισαγωγή από την τελευταία τιμή που καταχωρήθηκε. 2ον) Μια ερώτηση μόνο – λες “q to quit”, είναι φυσιολογικό ότι το for-loop σου σπάει αν εγώ δώσω t ή a ή κάποιο άλλο invalid input; Ρωτώ διότι αν είναι design decision (που αυτό θεωρώ) ok. Τώρα όσον αφορά το flush σε παραπέμπω σε παλαιότερα post μου επί του θέματος. Γενικά αυτά τα ζητήματα είναι ευαίσθητα και παίζουν από compiler σε compiler -αν και δεν θα έπρεπε- οπότε έχω αποφασίσει να μην τα θίγω σε κώδικα τέτοιας σκοπιμότητας (απλό παράδειγμα - γρήγορη λύση). 3ον) Φυσικά αγαπητέ μου αλλά για τις ανάγκες του ζητήματος είναι μάλλον υπέρ αρκετή, σε άλλες σοβαρές περιπτώσεις υπάρχουν σαφώς πιο "πονηρές" λύσεις τόσο σε C/C++ όσο και άλλου -ψάξε αν έχεις κέφι, καθώς στο παρόν forum (όπου είχε συζητηθεί αυτό το θέμα διεξοδικά..) είχα δημοσιεύσει κώδικα σε 80x86 32bit Assembly που ανίχνευε σε επίπεδο CPU, τέτοιες δύσκολες over/underflow περιπτώσεις 4ον) Εδώ συμφωνώ απόλυτα - γενικά από όλα τα notes σου, για εμένα σημασία έχει αυτό εδώ, η unique διότι λύνει αυτόματα το backward search του vector - τα άλλα notes είναι για εμένα και με βάση τον σκοπό του κώδικα μου, θα έλεγα αδιάφορα, διότι για κάθε ένα από αυτά που δοκιμάζεις να με ψέξεις . . . ενδεχομένως έχω δημοσιεύσει στο παρελθόν και κάποιο ανάλογο post (είμαι βλέπεις μαθουσάλας σε αυτό το forum) Γενικά, ο κώδικας σου είναι πολύ όμορφος, μινιμαλιστικός υπό την σκοπιά της STL - οπότε από εμένα έχεις ένα μπράβο!! είσαι ωραίος και φαίνεται ότι ξέρεις καλή C++ ή STL Υ.Γ. Μια μικρή λεπτομέρεια, σου ξέφυγε το #include <algorithm> το οποίο περιλαμβάνει τα sort & unique. Επίσης θα ήθελα πιο σταθερή χρήση του std:: απλά από συνήθεια και όχι μόνο, ενώ θα ήθελα πιο προσεγμένο for στο input σου -εκ πρώτης όψεως.. μήπως ένα do{ }while ; .
xyz_ Δημοσ. 23 Ιουνίου 2008 Δημοσ. 23 Ιουνίου 2008 xyz_ καλησπέρα και καλωσόρισες στο forum, ty 1ον) Το limit των 12 αριθμών τοποθετήθηκε μιας και έγινε αναφορά τους από την άσκηση και για κανέναν άλλο λόγο. Ένα ευχάριστο side effect είναι ότι σε περίπτωση εισαγωγής μη αποδεκτής τιμής, συνεχίζει την εισαγωγή από την τελευταία τιμή που καταχωρήθηκε. Το side effect ίσος και να μην είναι ευχάριστο αν ο user θέλει να δώσει 11 η λιγότερους αριθμούς. Όντως ήταν από την άσκηση ο μαγικός αριθμός 12, αλλα δεν βλέπω τον λόγο για τον οποιο το πρόγραμμα χρειάζεται να γραφτεί για 12 και όχι X αριθμούς. 2ον) Μια ερώτηση μόνο – λες “q to quit”, είναι φυσιολογικό ότι το for-loop σου σπάει αν εγώ δώσω t ή a ή κάποιο άλλο invalid input; Ρωτώ διότι αν είναι design decision (που αυτό θεωρώ) ok. Όντως σταματάει με οποιοδήποτε 'bad input'. Το μήνυμα 'press q το quit' το έβαλα μετά, απλά για να μην ψάχνετε ο user πως να σταματήσει το πρόγραμμα. Το καλύτερο πιστεύω θα ήτανε να κάνει ignore όλα τα bad inputs, και να σταματάει μονο σε EOF, αλλα αρκετοί (όπως εγώ πχ) δεν ξέρουνε πως να στείλουνε EOF σε windows terminal Τώρα όσον αφορά το flush σε παραπέμπω σε παλαιότερα post μου επί του θέματος. Γενικά αυτά τα ζητήματα είναι ευαίσθητα και παίζουν από compiler σε compiler -αν και δεν θα έπρεπε- οπότε έχω αποφασίσει να μην τα θίγω σε κώδικα τέτοιας σκοπιμότητας (απλό παράδειγμα - γρήγορη λύση). Σύμφωνο 4ον) Εδώ συμφωνώ απόλυτα - γενικά από όλα τα notes σου, για εμένα σημασία έχει αυτό εδώ, η unique διότι λύνει αυτόματα το backward search του vector - τα άλλα notes είναι για εμένα και με βάση τον σκοπό του κώδικα μου, θα έλεγα αδιάφορα, διότι για κάθε ένα από αυτά που δοκιμάζεις να με ψέξεις . . . ενδεχομένως έχω δημοσιεύσει στο παρελθόν και κάποιο ανάλογο post (είμαι βλέπεις μαθουσάλας σε αυτό το forum) Γενικά έκανα το post για αυτούς που δεν γνωρίζουν Υ.Γ. Μια μικρή λεπτομέρεια, σου ξέφυγε το #include <algorithm> το οποίο περιλαμβάνει τα sort & unique. Oops!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.