virxen75 Δημοσ. 7 Δεκεμβρίου 2010 Δημοσ. 7 Δεκεμβρίου 2010 επειδη αυτο το κομματι δεν το καταλαβαινω να γινει καπως ετσι: >numberLetters[2][3]='A','B','C'; numberLetters[3][3]='D','E','F'; numberLetters[4][3]='G','H','I'; numberLetters[5][3]='J','K','L'; numberLetters[6][3]='M','N','O'; numberLetters[7][3]='P','R','S'; numberLetters[8][3]='T','U','V'; numberLetters[9][3]='W','X','Y'; for (i=2;i<10;i++){ for (j=0;j<4-1;j++) printf("\ni=%d ---> letters=%s",i,numberLetters[i][j]); } 1) κάνε το έτσι τότε > strcpy(numberLetters[2],"ABC"); strcpy(numberLetters[3],"DEF"); strcpy(numberLetters[4],"GHI"); strcpy(numberLetters[5],"JKL"); strcpy(numberLetters[6],"MNO"); strcpy(numberLetters[7],"PRS"); strcpy(numberLetters[8],"TUV"); strcpy(numberLetters[9],"WXY"); 2) > int choice=(int)buf[i]-(int)'0' στο buf βρίσκεται το i ψηφίο που έχει εισάγει ο χρήστης σαν char π.χ. '2' to (int)buf μετατρέπει τον char σε αριθμό όχι όμως με βάση του τι βλέπεις π.χ. '2' να γίνει 2 αλλά του δίνει την τιμή που αντιστοιχεί στον ASCIIκωδικό του π.χ. το '2'--->50.Οι χαρακτήρες αριθμοί ξεκινάνε από το 0..9 αντίστοιχα το '0'--->48. Επομένως choice=50-48=2 δηλαδή από char καταλήξαμε σε integer
renouko Δημοσ. 10 Δεκεμβρίου 2010 Δημοσ. 10 Δεκεμβρίου 2010 επειδη θελει την συγκεκριμενη αντιστοιχιση στο παραδειγμα του stefanos59 δεν θα μπορουσε να γινει καπως ετσι? > #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> //sunartisi gia ton elegxo psifiwn int check(char*); char buf[256]; size_t mikos; int main(){ int k=0; int i=0,j=0,d; int ii=0,jj=0; int kapa[25]; int numbers[25]; //arxika vazw ola ta grammata se pinaka alla me antistoixeia ascii for(i=1;i<=16;i++){ numbers[i]=64+i; } for (j=1;j<=8;j++){ numbers[16+j]=81+j; } printf("\nDwse ton kwdiko arithmo\n"); while(1) { fgets(buf,256,stdin); if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]='\0'; if(check(buf) == 1) printf("\nUpirxe to 0 i to 1 ston kwdika arithmo\nDwse neo kwdika arithmo:"); else break; } mikos=strlen(buf); d=(int)pow(3,mikos);//pithanoi sundiasmoi leksewn for(jj=0;jj<d;jj++){ for (i=0;i<3;i++){ for(ii=0;ii<mikos;ii++){ int choice=(int)buf[ii]-(int)'0';//'0'=48 if(choice==2){ kapa[i]=numbers[i+1]; } if(choice==3){ kapa[i]= numbers[i+4]; } if(choice==4){ kapa[i]=numbers[i+7]; } if(choice==5){ kapa[i]=numbers[i+10]; } if(choice==6){ kapa[i]=numbers[i+13]; } if(choice==7){ kapa[i]=numbers[i+16] ; } if(choice==8){ kapa[i]=numbers[i+19]; } if(choice==9){ kapa[i]=numbers[i+22]; } } } printf("%s",kapa[i]); } printf("Press Enter to exit!"); getchar(); // End of program. return 0; } ////sunartiseis //sunartisi pou elegxei an uparxei 0 i 1 int check(char *ptrBuff){ int i=0; while(ptrBuff[i]!='\0'){ if(ptrBuff[i]=='0' || ptrBuff[i]=='1') return 1;//yes 0,1 i++; } return 0;//no 0,1 }
stefanos59 Δημοσ. 10 Δεκεμβρίου 2010 Μέλος Δημοσ. 10 Δεκεμβρίου 2010 Ναι οντως δεν κανει την αντιστοιχιση που εκανα στο παραδειγμα.. Δοκιμασα και το δικο σου renouko ,αλλα και παλι δεν τρεχει σωστα. Γιατι πχ 2-->{Α,Β,C} 3-->{D,E,F} δινω το 23 θελω και αυτα που θελω να μου εμφανιση ειναι: AD AE AF BD BE BF CD CE CF
Directx Δημοσ. 11 Δεκεμβρίου 2010 Δημοσ. 11 Δεκεμβρίου 2010 Αυτό που χρειάζεσαι είναι μια μέθοδο υπολογισμού των πιθανών συνδυασμών (permutations) που μπορούν να προκύψουν από τους κωδικούς που εισήγαγε ο χρήστης (μορφής char-array) στο πρόγραμμα με ταυτόχρονο περιορισμό των αποτελεσμάτων τους στον αριθμό χαρακτήρων του δοθέντος κωδικού (πχ. αν 23, τότε επιστροφή όλων των συνδυασμών 2 γραμμάτων). Ακολουθεί μια σύντομη λύση σε C++ η οποία βασίζεται σε αναδρομική εκτέλεση (recursion) και λύνει το πρόβλημα ως εξής: > /* Permutations & Arrays in C++ by Directx. */ #include <iostream> #include <vector> #include <string> #include <map> using namespace std; void _recperm(vector<int> &RCL, int& CRow, bool& Break); int main(void) { vector<string> WordCombo; map<char, string> CodeMap; /* Setup Numeric-Code */ CodeMap['2'] = "ABC"; CodeMap['3'] = "DEF"; CodeMap['4'] = "GHI"; CodeMap['5'] = "JKL"; CodeMap['6'] = "MNO"; CodeMap['7'] = "PRS"; CodeMap['8'] = "TUV"; CodeMap['9'] = "WXY"; /* Request user code. */ while(true) { char Input[bUFSIZ]; /* Read user input from keyboard */ cout << "]"; cin.getline(Input, sizeof(Input)); /* Transform Input from char to string. */ string strInput = Input; /* Skip return */ if(!strInput.length()) continue; /* If x or X, quit. */ if(strInput == "X" || strInput == "x") break; /* Validate input */ if(strInput.find('0') == string::npos && strInput.find('1') == string::npos) { bool BadArg = false; vector<string> CodeList; /* Store each alphabet string into a string-vector for easy reference. */ for(int Chr = 0; Chr < strInput.length(); Chr++) if(CodeMap.find(strInput.at(Chr)) != CodeMap.end()) CodeList.push_back(CodeMap[strInput.at(Chr)]); else { /* Bad argument - not digit! */ cout << "Bad arg - \"" << strInput.at(Chr) << "\"" << endl; BadArg = true; break; } if(BadArg) continue; /* Create a Row-Counter List. */ vector<int> RCL; for(int Chr = 0; Chr < strInput.length(); Chr++) RCL.push_back(0); /* Setup recursion function variables. */ int LastRow = RCL.size() - 1; bool Break = false; /* Calculate permutations.. */ while(!Break) { /* Print word on STDOUT using RCL counters for each character! */ for(int Row = 0; Row < CodeList.size(); Row++) cout << CodeList.at(Row).at(RCL.at(Row)); /* Permutation will be calculated using recursive. */ _recperm(RCL, LastRow, Break); /* Skip to next line. */ cout << endl; } /* Skip to next input. */ continue; } /* Invalid input!! */ cout << "Syntax error!"<<endl<<"Type x or X to exit"<<endl; } /* End.. */ return 0; } void _recperm(vector<int> &RCL, int& CRow, bool& Break) { /* If current row is negative then break. */ if(CRow < 0) { Break = true; return; } /* If current row value is 2 then all row permutations complete! */ if(RCL.at(CRow)++ == 2) { /* Reset row value to zero (to begin next perm.) */ RCL.at(CRow) = 0; /* Go to previous (parent) row counter. */ CRow--; /* Redo the same for parent row counter. */ _recperm(RCL, CRow, Break); /* Restore current row to last-row counter. */ CRow = RCL.size() - 1; } } ΕΞΟΔΟΣ: > ][b]2[/b] A B C ][b]23[/b] AD AE AF BD BE BF CD CE CF ][b]234[/b] ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEH BEI BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI ][b]2345[/b] ADGJ ADGK ADGL ADHJ ADHK ADHL ADIJ ADIK ADIL AEGJ AEGK AEGL AEHJ AEHK AEHL AEIJ AEIK AEIL AFGJ AFGK AFGL AFHJ AFHK AFHL AFIJ AFIK AFIL BDGJ BDGK BDGL BDHJ BDHK BDHL BDIJ BDIK BDIL BEGJ BEGK BEGL BEHJ BEHK BEHL BEIJ BEIK BEIL BFGJ BFGK BFGL BFHJ BFHK BFHL BFIJ BFIK BFIL CDGJ CDGK CDGL CDHJ CDHK CDHL CDIJ CDIK CDIL CEGJ CEGK CEGL CEHJ CEHK CEHL CEIJ CEIK CEIL CFGJ CFGK CFGL CFHJ CFHK CFHL CFIJ CFIK CFIL ] Καταρχήν περνώ στο πρόγραμμα όλους τους κωδικούς ως MAPs όπου κάθε αριθμητικός χαρακτήρας ASCII αντιστοιχεί σε μια συμβολοσειρά που απαρτίζεται από τρία γράμματα της αγγλικής αλφάβητου (βλ. CodeMap). Ύστερα αποθηκεύω την είσοδο του χρήστη σε ένα STL string (βλ. strInput) και μετατρέπω σχετικά εύκολα τους αριθμητικούς της χαρακτήρες με την βοήθεια του MAP σε αλφαβητικά strings τα οποία αποθηκεύω σε ένα vector (λίστα) ονόματι CodeList. Και τώρα αρχίζουν τα δύσκολα (όσον αφορά την εξήγηση της μεθόδου).. Μετά με βάση τον αριθμό των καταχωρήσεων της CodeList δημιουργώ μια λίστα από int, την RCL (από το Row-Counter-List) με όλα τα int ίσα με 0. Από εκεί και πέρα εκτυπώνω κάθε συνδυασμό αυτών των RCL int στην οθόνη (με την βοήθεια της CodeList) όπου κάθε θέση / int της RCL αντιστοιχεί σε ένα γράμμα της λέξης. Έτσι με την βοήθεια της αναδρομικής ρουτίνας _recperm αρχίζω να αυξάνω το τελευταίο int της RCL μέχρι αυτό να γίνει 2 (δηλαδή 3). Μόλις συμβεί αυτό η _recperm μηδενίζει το γεμισμένο int της RCL και καλεί εκ νέου τον εαυτό της και ελέγχει αν το αμέσως προηγούμενο int από το τελευταίο είναι και αυτό 2 διαφορετικά το αυξάνει και επιστρέφει, αν είναι 2 τότε ξανά μηδενίζει το int / θέση της RCL και ξανά καλεί τον εαυτό της και κάνει τον ίδιο έλεγχο, την ίδια αύξηση κτλ. Δηλαδή, με πιο απλά λόγια η _recperm εφαρμόζει, αυτή την λογική, πάντα με βάση τα INPUT που έχεις δημοσιεύσει ως τώρα (αν αλλάζει σε μεγαλύτερους κωδικούς δεν μπορώ να το γνωρίζω): >0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 κλπ. Υ.Γ. Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder 2009 με μερικά συγκεκριμένα input και φυσικά μπορεί να περιέχει σφάλματα ή άλλες αβλεψίες. Καλή συνέχεια!!
virxen75 Δημοσ. 11 Δεκεμβρίου 2010 Δημοσ. 11 Δεκεμβρίου 2010 Αυτό που χρειάζεσαι είναι μια μέθοδο υπολογισμού των πιθανών συνδυασμών (permutations) που μπορούν να προκύψουν από τους κωδικούς που εισήγαγε ο χρήστης (μορφής char-array) στο πρόγραμμα με ταυτόχρονο περιορισμό των αποτελεσμάτων τους στον αριθμό χαρακτήρων του δοθέντος κωδικού (πχ. αν 23, τότε επιστροφή όλων των συνδυασμών 2 γραμμάτων). Ακολουθεί μια σύντομη λύση σε C++ η οποία βασίζεται σε αναδρομική εκτέλεση (recursion) και λύνει το πρόβλημα ως εξής: > /* Permutations & Arrays in C++ by Directx. */ #include <iostream> #include <vector> #include <string> #include <map> using namespace std; void _recperm(vector<int> &RCL, int& CRow, bool& Break); int main(void) { vector<string> WordCombo; map<char, string> CodeMap; /* Setup Numeric-Code */ CodeMap['2'] = "ABC"; CodeMap['3'] = "DEF"; CodeMap['4'] = "GHI"; CodeMap['5'] = "JKL"; CodeMap['6'] = "MNO"; CodeMap['7'] = "PRS"; CodeMap['8'] = "TUV"; CodeMap['9'] = "WXY"; /* Request user code. */ while(true) { char Input[bUFSIZ]; /* Read user input from keyboard */ cout << "]"; cin.getline(Input, sizeof(Input)); /* Transform Input from char to string. */ string strInput = Input; /* Skip return */ if(!strInput.length()) continue; /* If x or X, quit. */ if(strInput == "X" || strInput == "x") break; /* Validate input */ if(strInput.find('0') == string::npos && strInput.find('1') == string::npos) { bool BadArg = false; vector<string> CodeList; /* Store each alphabet string into a string-vector for easy reference. */ for(int Chr = 0; Chr < strInput.length(); Chr++) if(CodeMap.find(strInput.at(Chr)) != CodeMap.end()) CodeList.push_back(CodeMap[strInput.at(Chr)]); else { /* Bad argument - not digit! */ cout << "Bad arg - \"" << strInput.at(Chr) << "\"" << endl; BadArg = true; break; } if(BadArg) continue; /* Create a Row-Counter List. */ vector<int> RCL; for(int Chr = 0; Chr < strInput.length(); Chr++) RCL.push_back(0); /* Setup recursion function variables. */ int LastRow = RCL.size() - 1; bool Break = false; /* Calculate permutations.. */ while(!Break) { /* Print word on STDOUT using RCL counters for each character! */ for(int Row = 0; Row < CodeList.size(); Row++) cout << CodeList.at(Row).at(RCL.at(Row)); /* Permutation will be calculated using recursive. */ _recperm(RCL, LastRow, Break); /* Skip to next line. */ cout << endl; } /* Skip to next input. */ continue; } /* Invalid input!! */ cout << "Syntax error!"<<endl<<"Type x or X to exit"<<endl; } /* End.. */ return 0; } void _recperm(vector<int> &RCL, int& CRow, bool& Break) { /* If current row is negative then break. */ if(CRow < 0) { Break = true; return; } /* If current row value is 2 then all row permutations complete! */ if(RCL.at(CRow)++ == 2) { /* Reset row value to zero (to begin next perm.) */ RCL.at(CRow) = 0; /* Go to previous (parent) row counter. */ CRow--; /* Redo the same for parent row counter. */ _recperm(RCL, CRow, Break); /* Restore current row to last-row counter. */ CRow = RCL.size() - 1; } } ΕΞΟΔΟΣ: > ][b]2[/b] A B C ][b]23[/b] AD AE AF BD BE BF CD CE CF ][b]234[/b] ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEH BEI BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI ][b]2345[/b] ADGJ ADGK ADGL ADHJ ADHK ADHL ADIJ ADIK ADIL AEGJ AEGK AEGL AEHJ AEHK AEHL AEIJ AEIK AEIL AFGJ AFGK AFGL AFHJ AFHK AFHL AFIJ AFIK AFIL BDGJ BDGK BDGL BDHJ BDHK BDHL BDIJ BDIK BDIL BEGJ BEGK BEGL BEHJ BEHK BEHL BEIJ BEIK BEIL BFGJ BFGK BFGL BFHJ BFHK BFHL BFIJ BFIK BFIL CDGJ CDGK CDGL CDHJ CDHK CDHL CDIJ CDIK CDIL CEGJ CEGK CEGL CEHJ CEHK CEHL CEIJ CEIK CEIL CFGJ CFGK CFGL CFHJ CFHK CFHL CFIJ CFIK CFIL ] Καταρχήν περνώ στο πρόγραμμα όλους τους κωδικούς ως MAPs όπου κάθε αριθμητικός χαρακτήρας ASCII αντιστοιχεί σε μια συμβολοσειρά που απαρτίζεται από τρία γράμματα της αγγλικής αλφάβητου (βλ. CodeMap). Ύστερα αποθηκεύω την είσοδο του χρήστη σε ένα STL string (βλ. strInput) και μετατρέπω σχετικά εύκολα τους αριθμητικούς της χαρακτήρες με την βοήθεια του MAP σε αλφαβητικά strings τα οποία αποθηκεύω σε ένα vector (λίστα) ονόματι CodeList. Και τώρα αρχίζουν τα δύσκολα (όσον αφορά την εξήγηση της μεθόδου).. Μετά με βάση τον αριθμό των καταχωρήσεων της CodeList δημιουργώ μια λίστα από int, την RCL (από το Row-Counter-List) με όλα τα int ίσα με 0. Από εκεί και πέρα εκτυπώνω κάθε συνδυασμό αυτών των RCL int στην οθόνη (με την βοήθεια της CodeList) όπου κάθε θέση / int της RCL αντιστοιχεί σε ένα γράμμα της λέξης. Έτσι με την βοήθεια της αναδρομικής ρουτίνας _recperm αρχίζω να αυξάνω το τελευταίο int της RCL μέχρι αυτό να γίνει 2 (δηλαδή 3). Μόλις συμβεί αυτό η _recperm μηδενίζει το γεμισμένο int της RCL και καλεί εκ νέου τον εαυτό της και ελέγχει αν το αμέσως προηγούμενο int από το τελευταίο είναι και αυτό 2 διαφορετικά το αυξάνει και επιστρέφει, αν είναι 2 τότε ξανά μηδενίζει το int / θέση της RCL και ξανά καλεί τον εαυτό της και κάνει τον ίδιο έλεγχο, την ίδια αύξηση κτλ. Δηλαδή, με πιο απλά λόγια η _recperm εφαρμόζει, αυτή την λογική, πάντα με βάση τα INPUT που έχεις δημοσιεύσει ως τώρα (αν αλλάζει σε μεγαλύτερους κωδικούς δεν μπορώ να το γνωρίζω): >0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 κλπ. Υ.Γ. Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder 2009 με μερικά συγκεκριμένα input και φυσικά μπορεί να περιέχει σφάλματα ή άλλες αβλεψίες. Καλή συνέχεια!! καλή προσπάθεια ,όμως δεν λύνει την άσκηση τους. επειδή κάποιος μου ζήτησε βοήθεια στον κώδικα στέλνω την άσκηση τους αυτούσια Η ασκηση ειναι αυτη: Σε ένα τυπικό τηλεφωνικό πληκτρολόγιο υπάρχουν τα ψηφία από το 0 μέχρι και το 9. Σε καθένα από τα ψηφία από το 2 μέχρι και το 9 αντιστοιχούν τρεις αλφαβητικοί χαρακτήρες σύφωνα με τον επόμενο πίνακα αντιστοιχίας: Αριθητικό ψηφίο Αλφαβητικοί χαρακτήρες 2 A B C 3 D E F 4 G H I 5 J K L 6 M N O 7 P R S 8 T U V 9 W X Y Πολλοί άνθρωποι που δυσκολεύονται να απομνηονεύσουν αριθμούς,χρησιοποιούν την ανωτέρω αντιστοιχία μεταξύ δεκαδικών ψηφίων και αλφαβητικών χαρακτήρων για να φτιάξουν λέξεις που αντιστοιχούν σε τηλεφωνικούς αριθμούς. Για παράδειγμα,κάποιος που έχει τον τηλεφωνικό αριθμό 6862377 μπορεί να αξιοποιήσει αυτή την αντιστοιχία και να απομνημονεύσει τη λέξη NUMBERS. Αυτή είναι μια συνηθισένη πρακτική σε επιχειρήσεις οι οποίες επιδιώκουν να έχουν τηλεφωνικούς αριθούς που απομνημονεύονται εύκολα από τους πελάτες τους. Κάθε λέξη που σχηματίζεται με τον τρόπο που περιγράφηκε αντιστοιχεί σε ένα και μόνον ένα αριθμμό του ίδιου μήκους. Αντίστροφα, δοθέντος ενός τηλεφωνικού αριθού, μπορούν να σχηματιστούν πολλές υποψήφιες λέξεις. Συγκεκριμένα, για κάθε αριθμό με n ψηφία, το πλήθος των υποψήφιων λέξεων είναι n^3 , όσοι οι συνδυασμοί των αλφαβητικών ψηφίων που αντιστοιχούν στα n αριθητικά ψηφία (τα αριθμητικά ψηφία 0 και 1 δεν χρησιμοποιούνται). Για παράδειγμα, οι υποψήφιες λέξεις για το διψήφιο αριθμό 28 είναι 2^3 =9: 1. AT 2. AU 3. AV 4. BT 5. BU 6. BV 7. CT 8. CU 9. CV Δυστυχώς, οι περισσότερες από αυτές δεν είναι κατάλληλες για απομνημόνευση. Είναι δυνατόν, όμως, κάποιες από αυτές να είναι κατάλληλες. Για παράδειγμα, ένα κουρείο με τηλεφωνικό αριθμό 4247288 μπορεί να χρησιμοποιήσει τη λέξη HAIRCUT από τις 37 υποψήφιες λέξεις. Ένας κτηνίατρος με τηλεφωνικό αριθμό 7382273 μπορεί να χρησιμοποιήσει τη λέξη PETCARE από τις 37 υποψήφιες λέξεις κλπ. Κατασκευάστε ένα πρόγραμα το οποίο θα δέχεται ως είσοδο από το χρήστη ένα τηλεφωνικό αριθμό αυθαίρετου μήκους και θα παρουσιάζει στην οθόνη όλες τις δυνατές λέξεις που μπορούν να σχηματιστούν γι' αυτόν τον τηλεφωνικό αριθό με βάση την ανωτέρω αντιστοιχία με αλφαβητικούς χαρακτήρες. Η χρήση των αριθητικών ψηφίων 0 και 1 δεν επιτρέπεται. Για τον υπολογισμό των δυνατών λέξεων κατασκευάστε μια κατάλληλη αναδρομική συνάρτηση. δηλαδή κάτι τέτοιο με αναδρομή όμως > #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ char number1[]="ABC"; char number2[]="DEF"; int i,j; for (i=0;i<3;i++) for (j=0;j<3;j++) printf("\n %d --> %c%c ",(i*3+j+1),number1[i],number2[j]); getchar(); return 0; }
Directx Δημοσ. 11 Δεκεμβρίου 2010 Δημοσ. 11 Δεκεμβρίου 2010 καλή προσπάθεια ,όμως δεν λύνει την άσκηση τους. επειδή κάποιος μου ζήτησε βοήθεια στον κώδικα στέλνω την άσκηση τους αυτούσια Χμ.. τούτο εδώ το παλιό θέμα μπορεί να φανεί χρήσιμο όσον αφορά την αντιστοίχηση των συνδυασμών σε πιθανές λέξεις (σίγουρα θα χρειαστεί κάποιο είδος λεξικού). Για παράδειγμα ο κώδικας σε C++ επιστρέφει μεταξύ άλλων για το "4685463" τον συνδιασμό "HOTLINE" (κλασσικός κωδικός ) με ένα έλεγχο βάση λεξικού (όπως δείχνω στο προηγούμενο παλαιότερο topic) θα μπορούσαν να την εντοπίσουν μεταξύ των σκουπιδιών, πχ: > [..]HOTLIND >HOTLINE< HOTLINF[..] Υ.Γ. Έχουν πάντως αρκετά στοιχεία (κώδικα για έλεγχο 0 & 1, κώδικα για αναδρομικό υπολογισμό λέξεων κλπ) για να λύσουν την άσκηση μόνοι τους πια συνδυάζοντας όλα όσα έχουν ως τώρα δημοσιευθεί εδώ και στο προηγούμενο topic. --EDIT-- Ακολουθεί (για την ιστορία..) μια αναθεωρημένη έκδοση του προηγούμενου προγράμματος η οποία αναζητά πιθανές λέξεις - εκφράσεις σε ένα μικρό λεξικό (Dictionary) παρουσιάζοντας τα αποτελέσματα στην οθόνη: > /* Phone-Word in C++ by Directx. */ #include <iostream> #include <vector> #include <string> #include <algorithm> #include <functional> #include <map> using namespace std; void _recperm(vector<int> &RCL, int& CRow, bool& Break); int main(void) { vector<string> WordCombo; map<char, string> CodeMap; /* Setup Numeric-Code */ CodeMap['2'] = "ABC"; CodeMap['3'] = "DEF"; CodeMap['4'] = "GHI"; CodeMap['5'] = "JKL"; CodeMap['6'] = "MNO"; CodeMap['7'] = "PRS"; CodeMap['8'] = "TUV"; CodeMap['9'] = "WXY"; /* Setup a very simple dictionary. */ vector<string> Dictionary; Dictionary.push_back("HOTLINE"); // 4685463 Dictionary.push_back("GNULINE"); // "" Dictionary.push_back("HAIRCUT"); // 4247288 Dictionary.push_back("GAGSCUT"); // "" Dictionary.push_back("PETCARE"); // 7382273 Dictionary.push_back("NUMBERS"); // 6862377 Dictionary.push_back("ALLPINK"); // 2557465 Dictionary.push_back("PIGSCAN"); // 7447226 Dictionary.push_back("PHISCAM"); // "" /* Request user code. */ while(true) { char Input[bUFSIZ]; /* Read user input from keyboard */ cout << "]"; cin.getline(Input, sizeof(Input)); /* Transform Input from char to string. */ string strInput = Input; /* Skip return */ if(!strInput.length()) continue; /* If x or X, quit. */ if(strInput == "X" || strInput == "x") break; /* Validate input */ if(strInput.find('0') == string::npos && strInput.find('1') == string::npos) { bool BadArg = false; vector<string> CodeList; /* Store each alphabet string into a string-vector for easy reference. */ for(int Chr = 0; Chr < strInput.length(); Chr++) if(CodeMap.find(strInput.at(Chr)) != CodeMap.end()) CodeList.push_back(CodeMap[strInput.at(Chr)]); else { /* Bad argument - not digit! */ cout << "Bad arg - \"" << strInput.at(Chr) << "\"" << endl; BadArg = true; break; } if(BadArg) continue; /* Create a Row-Counter List. */ vector<int> RCL; for(int Chr = 0; Chr < strInput.length(); Chr++) RCL.push_back(0); /* Setup recursion function variables. */ int LastRow = RCL.size() - 1; bool Break = false; /* Calculate permutations.. */ while(!Break) { string strWord; /* Build word using RCL counters for each character! */ for(int Row = 0; Row < CodeList.size(); Row++) strWord += CodeList.at(Row).at(RCL.at(Row)); /* Permutation will be calculated using recursive. */ _recperm(RCL, LastRow, Break); /* Search Word in our dictionary.. */ if(find_if(Dictionary.begin(), Dictionary.end(), bind1st(equal_to<string>(), strWord)) != Dictionary.end()) { /* Show known permuted word and skip to next line. */ cout << strWord << endl; } } /* Skip to next input. */ continue; } /* Invalid input!! */ cout << "Syntax error!"<<endl<<"Type x or X to exit"<<endl; } /* End.. */ return 0; } void _recperm(vector<int> &RCL, int& CRow, bool& Break) { /* If current row is negative then break. */ if(CRow < 0) { Break = true; return; } /* If current row value is 2 then all row permutations complete! */ if(RCL.at(CRow)++ == 2) { /* Reset row value to zero (to begin next perm.) */ RCL.at(CRow) = 0; /* Go to previous (parent) row counter. */ CRow--; /* Redo the same for parent row counter. */ _recperm(RCL, CRow, Break); /* Restore current row to last-row counter. */ CRow = RCL.size() - 1; } } ΕΞΟΔΟΣ: >]4685463 GNULINE HOTLINE ]4247288 GAGSCUT HAIRCUT ]7382273 PETCARE ]6862377 NUMBERS ]2557465 ALLPINK ]7447226 PHISCAM PIGSCAN ]
virxen75 Δημοσ. 18 Δεκεμβρίου 2010 Δημοσ. 18 Δεκεμβρίου 2010 για την ιστορία πάλι,το ζητούμενο με αναδρομή > #include <stdio.h> #include <string.h> #define SIZE 4 static int COUNT = 0; char Letters[][size] = { {'0','0','0'}, {'0','0','0'}, {'A', 'B', 'C'}, {'D', 'E', 'F'}, {'G', 'H', 'I'}, {'J', 'K', 'L'}, {'M', 'N', 'O'}, {'P', 'R', 'S'}, {'T', 'U', 'V'}, {'W', 'X', 'Y'} }; void ConvertPhoneNumberToString(char phone[], int nArraySize, int nStart){ if(nStart < nArraySize - 1){ char chDigit = phone[nStart]; int nDigit = chDigit - '0'; for(int iLetterCount=0; iLetterCount < SIZE; ++iLetterCount){ char chLetter = Letters[nDigit][iLetterCount]; if(chLetter != 0){ phone[nStart] = chLetter; ConvertPhoneNumberToString(phone, nArraySize, nStart + 1); phone[nStart] = chDigit; } } }else{ COUNT++; if (COUNT%21==0){ printf("pata ena pliktro gia sinexeia...\n"); getchar(); } printf("[%d]=> %s\n", COUNT, phone); } } int main(){ char phone[] = "2845"; ConvertPhoneNumberToString(phone, sizeof(phone), 0); getchar(); return 0; }
stefanos59 Δημοσ. 29 Δεκεμβρίου 2010 Μέλος Δημοσ. 29 Δεκεμβρίου 2010 παιδια εγω ειμαι παλι, εχω κανει το παρακατω μεβαση αυτα που μου ειπατε και θα ηθελα αν θελετε να μου δωσετε καποια καθοδηγηση... > #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> //sunartisi gia ton elegxo psifiwn int check(char*); char metatropi(char* ,char*); char buf[256]; char number1[]="ABC";//2 char number2[]="DEF";//3 char number3[]="GHI";//4 char number4[]="JKL";//5 char number5[]="MNO";//6 char number6[]="PRS";//7 char number7[]="TUV";//8 char number8[]="WXY";//9 size_t mikos; int main(){ int i=0,j=0,d; printf("\nDwse ton kwdiko arithmo\n"); while(1) { fgets(buf,256,stdin); if(check(buf) == 1) printf("\nUpirxe to 0 i to 1 ston kwdika arithmo\nDwse neo kwdika arithmo:"); else break; } mikos=strlen(buf); d=(int)pow(3,mikos);//pithanoi sundiasmoi leksewn for(j=0;j<d;j++){ for(i=0;i<=mikos;i++){ int choice=(int)buf[i]-(int)'0';//'0'=48 if((choice==2 &&(choice+1)==3|| choice==3 &&choice+1==2)){ metatropi(number1,number2);} else if((choice==3 &&choice+1==4)||(choice==4 &&choice+1==3)){metatropi(number1,number2);} else if((choice==4 &&choice+1==5)||(choice==5 &&choice+1==4)){metatropi(number3,number4);} else if((choice==5 &&choice+1==6)||(choice==6 &&choice+1==5)){metatropi(number4,number5);} else if((choice==6 &&choice+1==7)||(choice==7 &&choice+1==6)){metatropi(number5,number6);} else if((choice==7 &&choice+1==8)||(choice==8 &&choice+1==7)){metatropi(number6,number7);} else if((choice==8 &&choice+1==9)||(choice==9 &&choice+1==8)){metatropi(number7,number8);} else if(choice==9 &&choice+1==9){metatropi(number8,number8);} } } printf("Press Enter to exit!"); getchar(); // End of program. return 0; } ////sunartiseis //sunartisi pou elegxei an uparxei 0 i 1 int check(char *ptrBuff){ int i=0; while(ptrBuff[i]!='\0'){ if(ptrBuff[i]=='0' || ptrBuff[i]=='1') return 1;//yes 0,1 i++; } return 0;//no 0,1 } //tha dexetai san orisma to eidos tou arithmou pou einai char metatropi(char *number,char *number0){ int i,j,k; for (i=0;i<3;i++) for (j=0;j<3;j++) printf("\n %d --> %c%c ",(i*3+j+1),number[i],number0[j]); getchar(); return 0; }
stefanos59 Δημοσ. 1 Ιανουαρίου 2011 Μέλος Δημοσ. 1 Ιανουαρίου 2011 χρονια πολλα και καλη χρονια σε ολους!! Παιδια κατι για τν ασκηση, προσπαθω τοσο καιρο αλλα δεν τα καταφερνω,γιαυτο αν μπορειται να με βοηθησετε!!
virxen75 Δημοσ. 1 Ιανουαρίου 2011 Δημοσ. 1 Ιανουαρίου 2011 χρονια πολλα και καλη χρονια σε ολους!! Παιδια κατι για τν ασκηση, προσπαθω τοσο καιρο αλλα δεν τα καταφερνω,γιαυτο αν μπορειται να με βοηθησετε!! χρονια πολλα και καλη χρονια σε ολους η λύση που σου έδωσα δεν σου κάνει?(ποστ 22)
stefanos59 Δημοσ. 2 Ιανουαρίου 2011 Μέλος Δημοσ. 2 Ιανουαρίου 2011 χρονια πολλα και καλη χρονια σε ολους η λύση που σου έδωσα δεν σου κάνει?(ποστ 22) στην λυση αυτη και 2 αριθμους να δωσω μου εμφανιζει λεξεις με 3 γραμματα,ενω θα πρεπε με δυο. και εχω προσπαθησει να το κανω αλλα δεν τα καταφερνω.
Evgenios1 Δημοσ. 2 Ιανουαρίου 2011 Δημοσ. 2 Ιανουαρίου 2011 Δεν ξερω τι ακριβος θελεις αλλα το κομματι if((choice==3 &&choice+1==4)||(choice==4 &&choice+1==3)) συνεπαγεται με το if( choice == 4 ) ή switch(choice)case 4:{...} break;
virxen75 Δημοσ. 2 Ιανουαρίου 2011 Δημοσ. 2 Ιανουαρίου 2011 στην λυση αυτη και 2 αριθμους να δωσω μου εμφανιζει λεξεις με 3 γραμματα,ενω θα πρεπε με δυο. και εχω προσπαθησει να το κανω αλλα δεν τα καταφερνω. αν δεν μπορείς να κάνεις copy paste τι να πω. δες την φώτο για τον αριθμό --->23
stefanos59 Δημοσ. 3 Ιανουαρίου 2011 Μέλος Δημοσ. 3 Ιανουαρίου 2011 αν δεν μπορείς να κάνεις copy paste τι να πω. δες την φώτο για τον αριθμό --->23 εχεις δικιο στο copy paste δεν μου τα επαιρνε καποια. οποτε στην main θα ειναι ετσι >int main(){ printf("\nDwse ton arithmou tilefwnou pou theleis na metatrepseis se pithanes lekseis\n"); gets(phone); ConvertPhoneNumberToString(phone, sizeof(phone), 0); getchar(); return 0; } Ευχαριστω.
renouko Δημοσ. 6 Ιανουαρίου 2011 Δημοσ. 6 Ιανουαρίου 2011 οποτε στην main θα ειναι ετσι >int main(){ printf("\nDwse ton arithmou tilefwnou pou theleis na metatrepseis se pithanes lekseis\n"); gets(phone); ConvertPhoneNumberToString(phone, sizeof(phone), 0); getchar(); return 0; } Ευχαριστω. ναι
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.