joanna1990 Δημοσ. 18 Ιανουαρίου 2012 Δημοσ. 18 Ιανουαρίου 2012 (επεξεργασμένο) Έχω γράψει σχεδόν όλον τον κώδικα μόνο το κομμάτι που κάνει extract_max(διαγράφει το max και κάνει ταξηνόμιση) λείπει. Σας δίνω την εκφώνηση και τον κώδικα.Αν μπορεί κάποιος να με βοηθήσει με αυτό το κομμάτι θα του ήμουν πολύ ευγνώμων. Μου βγάζει error στο build εκεί που έχω βελάκια. Εκφώνηση: Να υλοποιήσετε ένα σωρό μεγίστων με χ΄ρηση ενός πίνακα 20 θέσεων. Συγκεκριμένα να υλοποιήσετε τις λειτοθργίες: εισαγωγή στοιχείου, μέγιστο στοιχείο, εξαγωγή μέγιστου στοιχείου, καταστροφή σωρού, ερώτηση κενού σωρού και μέγεθος σωρού. Κάθε στοιχείο του σωρού είναι ένα ζεύγος που αποτελείται από έναν χαρακτήρα και μία ακέραια τιμή από 1 έως 99 η οποία καθορίζει την προτεραιότητα του χαρακτήρα, πχ. (k, 53) και (l, 34). Το πρόγραμμα θα πρέπει να δημιουργεί ένα κενό σωρό και μετά να παρέχει τη δυνατότητα στον χρήστη να δίνει επαναληπτικά εντολές της μορφής: -insert C P - max - extract max - size - exit Η εντολή insert εισάγει τον χαρακτήρα C με προτεραιότητα P στον σωρό. Η max τυπώνει το στοιχείο με τη μέγιστη προτεραιότητα ενώ η extract max το εξάγει. Η εντολή size τυπώνει το τρέχον πλήθος των στοιχείων του σωρού. Με τη εντολή exit το πρόγραμμα καταστρέφει το σωρό και τερματίζει. Επιτρέπεται η εισαγωγή του ίδιου χαρακτήρα περισσότερες από μία φορες. Το πρόγραμμα θα πρέπει να εμφανίζει τα αναγκαία μην΄θματα λάθους, όπως όταν επιχειρείται η εξαγωγή του μεγίστου στοιχείου από κενό σωρό ή δίνεται μη έγκυρη εντολή. > #include <cstdlib> #include <iostream> #include <cstring> #include <cassert> #include <string> using namespace std; void insert(char *c, int p); void max(); void extract_max(); void size(); void destroy(); bool is_it_empty(); int answear; char answear2; int answear3; static const int MAXSIZE=20; char_and_priority array[MAXSIZE]; //<--------- int i; int count=0; class char_and_priority { public: char character; int priority; }; int main(int argc, char** argv) { do { do { cout<< "Epilekste mia apo tis parakatw entoles\n"; cout<< "1: insert C P\n"; cout<< "2: max\n"; cout<< "3: extract max\n"; cout<< "4: size\n"; cout<< "5: exit\n"; cin>> answear; if((answear != 1)&&(answear != 2)&&(answear != 3)&&(answear != 4)&&(answear !=5)) { cout<< "H epilogh sas einai lanthasmenh. prepei na dwsete enan arithmo apo to 1 ews to 5\n"; } } while((answear != 1)&&(answear != 2)&&(answear != 3)&&(answear != 4)&&(answear !=5)); if(answear==1) { insert(); //<--------- } else if(answear==2) { max(); } else if(answear==3) { extract_max(); } else if(answear==4) { size(); } else { destroy(); } }while(answear!=5); cout<< "Termatismos programmatos\n"; return 0; } void insert(char *c, int p) { int i,j; char_and_priority temp; //<----------- do { cout<< "Dwste to zeygos poy epithumeitai\n"; cout<< "Dwste ton xarakthra\n"; cin>> answear2; cout<< "Dwste ton arithmo prwtaireothtas\n"; cin>> answear3; if((!isalpha(answear2))||(!isdigit(answear3))||(answear3<1)||(answear3>99)) { cout<< "De dwsate swsta stoixeia ksanaprospathiste\n"; } } while((!isalpha(answear2))||(!isdigit(answear3))||(answear3<1)||(answear3>99)); count=count+1; array[count].character=answear2; //<---------- array[count].priority=answear3; //<---------- i=count; j=i/2; while(((i>1)&&(strcmp(array[i].character,array[j].character)>0))||((i>1)&&(strcmp(array[i].character,array[j].character)=0))) //<---------- { if(strcmp(array[i].character,array[j].character)=0) { if(array[i].priority >array[j].priority) { temp=array[i]; array[i]=array[j]; array[j]=temp; i=j; j=i/2; } } else { temp=array[i]; array[i]=array[j]; array[j]=temp; i=j; j=i/2; } } } void max() { if( cout<< "To megisto stoixeio einai to : (\n"; cout<< array[1].character << endl; cout<< ",\n"; cout<< array[1].priority<< endl; cout<< ")\n"; } void extract_max() { bool c; c = is_it_empty(); if(c==true) { cout<< "O pinakas einai adeios\n"; } else////// auto edw to kommati { } } void size() { int Size = sizeof(array)/sizeof(char_and_priority); cout<< "To megethos tou pinaka einai: \n"; cout<< Size << endl; return 0; } bool is_it_empty() { bool a=false; int Size1 = sizeof(array)/sizeof(char_and_priority); if(Size1==0) { a=true; } return a; } void destroy() { delete array[]; } Επεξ/σία 18 Ιανουαρίου 2012 από joanna1990
erimitis Δημοσ. 19 Ιανουαρίου 2012 Δημοσ. 19 Ιανουαρίου 2012 Πιστέυω ότι δεν έχει οριστει ο πίνακας σωστά δεν υπάρχει τέτοια δομή char_and_priority array[MAXSIZE]; //<---------
virxen75 Δημοσ. 19 Ιανουαρίου 2012 Δημοσ. 19 Ιανουαρίου 2012 Πιστέυω ότι δεν έχει οριστει ο πίνακας σωστά δεν υπάρχει τέτοια δομή char_and_priority array[MAXSIZE]; //<--------- υπάρχει (class char_and_priority) αλλά ορίζεται μετά την εντολή έκανα κάποιες διορθώσεις ίσα ίσα να κάνει compile > #include <cstdlib> #include <iostream> #include <cstring> #include <cassert> #include <string> using namespace std; void insert(char *, int); void max(); void extract_max(); void size(); void destroy(); bool is_it_empty(); int answear;//γράφεται κανονικά έτσι --->answer char answear2; int answear3; static const int MAXSIZE=20; int i; int count1=0;// το count είναι ήδη εντολή οπότε δεν μπορείς να χρησιμοποιήσεις το όνομα σαν μεταβλητή class char_and_priority { public: char character; int priority; }; char_and_priority array[MAXSIZE]; //<---------πρώτα ορίζεις την κλάση και μετά την χρησιμοποιείς int main(int argc, char** argv) { do { do { cout<< "Epilekste mia apo tis parakatw entoles\n"; cout<< "1: insert C P\n"; cout<< "2: max\n"; cout<< "3: extract max\n"; cout<< "4: size\n"; cout<< "5: exit\n"; cin>> answear; if((answear != 1)&&(answear != 2)&&(answear != 3)&&(answear != 4)&&(answear !=5)) { cout<< "H epilogh sas einai lanthasmenh. prepei na dwsete enan arithmo apo to 1 ews to 5\n"; } } while((answear != 1)&&(answear != 2)&&(answear != 3)&&(answear != 4)&&(answear !=5)); if(answear==1) { //insert(); //<---------η insert δέχεται 2 ορίσματα και εσύ την καλείς με κανένα το οποίο είναι λάθος } else if(answear==2) { max(); } else if(answear==3) { extract_max(); } else if(answear==4) { size(); } else { destroy(); } }while(answear!=5); cout<< "Termatismos programmatos\n"; return 0; } void insert(char *c, int p) { int i,j; char_and_priority temp; //<-----------το ίδιο με πριν do { cout<< "Dwste to zeygos poy epithumeitai\n"; cout<< "Dwste ton xarakthra\n"; cin>> answear2; cout<< "Dwste ton arithmo prwtaireothtas\n"; cin>> answear3; if((!isalpha(answear2))||(!isdigit(answear3))||(answear3<1)||(answear3>99)) { cout<< "De dwsate swsta stoixeia ksanaprospathiste\n"; } } while((!isalpha(answear2))||(!isdigit(answear3))||(answear3<1)||(answear3>99)); count1++; array[count1].character=answear2; //<----------το ίδιο array[count1].priority=answear3; //<----------το ίδιο i=count1; j=i/2; while(((i>1)&&(array[i].character>array[j].character))||((i>1)&&(array[i].character==array[j].character))) //<----------η strcmp συγκρίνει 2 συμβολοσειρές και όχι 2 χαρακτήρες που έχεις εδώ. { if(array[i].character==array[j].character) { if(array[i].priority >array[j].priority) { temp=array[i]; array[i]=array[j]; array[j]=temp; i=j; j=i/2; } } else { temp=array[i]; array[i]=array[j]; array[j]=temp; i=j; j=i/2; } } } void max() { //if( τι? cout<< "To megisto stoixeio einai to : (\n"; cout<< array[1].character << endl; cout<< ",\n"; cout<< array[1].priority<< endl; cout<< ")\n"; } void extract_max() { bool c; c = is_it_empty(); if(c==true) { cout<< "O pinakas einai adeios\n"; } else////// auto edw to kommati { } } void size() { int Size = sizeof(array)/sizeof(char_and_priority); cout<< "To megethos tou pinaka einai: \n"; cout<< Size << endl; //return 0; einai void } bool is_it_empty() { bool a=false; int Size1 = sizeof(array)/sizeof(char_and_priority); if(Size1==0) { a=true; } return a; } void destroy() { delete []array;//<----εδώ δεν είναι σωστό αυτό γιατί το array δεν έχει οριστεί δυναμικά }
joanna1990 Δημοσ. 19 Ιανουαρίου 2012 Μέλος Δημοσ. 19 Ιανουαρίου 2012 Σας ευχαριστώ πάρα πολύ.Θα κάνω τις αλλαγές.
joanna1990 Δημοσ. 19 Ιανουαρίου 2012 Μέλος Δημοσ. 19 Ιανουαρίου 2012 Δεν μπορώ να βρώ πως να κάνω την καταστροφή του σορού που ζητάει αν ξέρει κάποιος ας με βοηθήσει. Επίσης μπορώ να συγκρίνω char κάπως έτσι? char a= "b"; char b= "r"; if(a> b ) { } else { }
joanna1990 Δημοσ. 19 Ιανουαρίου 2012 Μέλος Δημοσ. 19 Ιανουαρίου 2012 Αυτή είναι η καινούργια έκδοση κάνει compile αλλά βγάζει λάθος. Στο size θέλω να εμφανίζει πόσα στοιχεία έχει μέσα ο πίνακας.Οταν την καλώ όμως εμφανίζει πάντα 20. Αν μπορεί κάποιος να το τσεκάρει. Ευχαριστώ πάρα πολύ προκαταβολικά. > #include <cstdlib> #include <iostream> #include <cstring> #include <cassert> #include <string> using namespace std; void insert_C_P(); void max(); void extract_max(); void size(); void destroy(); bool is_it_empty(); int answer; char answear2; int answear3; static const int MAXSIZE=20; int i; int count1=0; int t=0; class char_and_priority { public: char character; int priority; }; char_and_priority array[MAXSIZE]; int main(int argc, char** argv) { do { do { cout<< "Epilekste mia apo tis parakatw entoles\n"; cout<< "1: insert C P\n"; cout<< "2: max\n"; cout<< "3: extract max\n"; cout<< "4: size\n"; cout<< "5: exit\n"; cin>> answer; if((answer != 1)&&(answer != 2)&&(answer != 3)&&(answer != 4)&&(answer !=5)) { cout<< "H epilogh sas einai lanthasmenh. prepei na dwsete enan arithmo apo to 1 ews to 5\n"; } } while((answer != 1)&&(answer != 2)&&(answer != 3)&&(answer != 4)&&(answer !=5)); if(answer==1) { insert_C_P(); } else if(answer==2) { max(); } else if(answer==3) { extract_max(); } else if(answer==4) { size(); } else { destroy(); } }while(answer!=5); return 0; } void insert_C_P() { int i,j,answer3; char answer2; char_and_priority temp; do { cout<< "Dwste to zeygos poy epithumeitai\n"; cout<< "Dwste ton xarakthra\n"; cin>> answer2; cout<< "Dwste ton arithmo prwtaireothtas\n"; cin>> answer3; if((!isalpha(answer2))||(!isdigit(answer3))||(answer3<1)||(answer3>99)) { cout<< "De dwsate swsta stoixeia ksanaprospathiste\n"; } } while((!isalpha(answer2))||(!isdigit(answer3))||(answer3<1)||(answer3>99)); count1=count1+1; array[count1].character=answer2; array[count1].priority=answer3; i=count1; j=i/2; while(((i>1)&&(array[i].character>array[j].character))||((i>1)&&(array[i].character==array[j].character))) { if(array[i].character==array[j].character) { if(array[i].priority >array[j].priority) { temp=array[i]; array[i]=array[j]; array[j]=temp; i=j; j=i/2; } } else { temp=array[i]; array[i]=array[j]; array[j]=temp; i=j; j=i/2; } } for(t=1;t<=count1;t++) { cout<< array[t].character << endl; cout<< ",\n"; cout<< array[t].priority<< endl; cout<< ")\n"; } } void max() { cout<< "To megisto stoixeio einai to : (\n"; cout<< array[1].character << endl; cout<< ",\n"; cout<< array[1].priority<< endl; cout<< ")\n"; } void extract_max() { char_and_priority temp1; int i=1,l=2,r=3; int mc; bool c; c = is_it_empty(); if(c==true) { cout<< "O pinakas einai adeios\n"; } else { array[1]=array[count1]; count1=count1-1; while(l<=count1) { mc=l; if((r<=count1) && (array[r].character>array[l].character)) { mc=r; } if((r<=count1) && (array[r].character==array[l].character)) { if(array[r].priority>array[l].priority) { mc=r; } else { break; } } if(array[i].character>array[l].character) { break; } temp1=array[i]; array[i]=array[mc]; array[mc]=temp1; i=mc; l=2*1; r=l+1; } } } void size() { int Size = sizeof(array)/sizeof(char_and_priority); cout<< "To megethos tou pinaka einai: \n"; cout<< Size << endl; } bool is_it_empty() { bool a=false; int Size1 = sizeof(array)/sizeof(char_and_priority); if(Size1==0) { a=true; } return a; } void destroy() { cout<< "To programma twra tha katastrepsei th swro(sto return 0) kai tha termatisei\n"; }
defacer Δημοσ. 20 Ιανουαρίου 2012 Δημοσ. 20 Ιανουαρίου 2012 Και να ταν μόνο αυτό το θέμα... Καλό θα ήταν να κάτσεις κάποια στιγμή να δεις τον κώδικα και να βάλεις λίγη κοινή λογική. Εκτός αν απλά θέλεις να φύγει το κακό απ τα μάτια σου οπότε δεν έχω να προσθέσω κάτι. Γενικό παράδειγμα: >while((answer != 1)&&(answer != 2)&&(answer != 3)&&(answer != 4)&&(answer !=5)); Μήπως ας πούμε να το γράφαμε αυτό σαν >while(answer < 1 || answer > 5); Ειδικό παράδειγμα: >int Size = sizeof(array)/sizeof(char_and_priority); Καταλαβαίνεις τι κάνει αυτό; Αν πρόκειται να δεις άλλο μέγεθος κάποια στιγμή, θα πρέπει προφανώς είτε ο αριθμητής είτε ο παρονομαστής να αλλάξει. Τι είναι οι τιμές που παίρνουν; Αλλάζουν ποτέ; Αν ναι, πότε; Αν όχι, μήπως η ερώτηση ήταν χαζή;
virxen75 Δημοσ. 20 Ιανουαρίου 2012 Δημοσ. 20 Ιανουαρίου 2012 void insert_C_P() { int i,j,answer3; char answer2; char_and_priority temp; do { .......... cin>> answer2; cout<< "Dwste ton arithmo prwtaireothtas\n"; cin>> answer3; if((!isalpha(answer2))||(!isdigit(answer3))||(answer3<1)||(answer3>99)) { cout<< "De dwsate swsta stoixeia ksanaprospathiste\n"; } ................. διάβασε εδώ τι κάνει η isdigit isdigit και για την destroy() μάλλον προσπαθείς να κάνεις κάτι τέτοιο > ......... }; char_and_priority *array=new char_and_priority[MAXSIZE]; int main(int argc, char** argv) ........... void destroy() { delete[] array; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα