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

ερωτηση για string στη c


stefanos59

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

Δημοσ.

επειδη αυτο το κομματι δεν το καταλαβαινω

 

να γινει καπως ετσι:

>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

  • Απαντ. 37
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

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

}

Δημοσ.

Ναι οντως δεν κανει την αντιστοιχιση που εκανα στο παραδειγμα..

Δοκιμασα και το δικο σου renouko ,αλλα και παλι δεν τρεχει σωστα.

Γιατι πχ

2-->{Α,Β,C}

3-->{D,E,F}

δινω το 23 θελω και αυτα που θελω να μου εμφανιση ειναι:

AD

AE

AF

BD

BE

BF

CD

CE

CF

Δημοσ.

Αυτό που χρειάζεσαι είναι μια μέθοδο υπολογισμού των πιθανών συνδυασμών (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 και φυσικά μπορεί να περιέχει σφάλματα ή άλλες αβλεψίες.

 

Καλή συνέχεια!!

:)

Δημοσ.

Αυτό που χρειάζεσαι είναι μια μέθοδο υπολογισμού των πιθανών συνδυασμών (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;
}

Δημοσ.
καλή προσπάθεια ,όμως δεν λύνει την άσκηση τους.

 

επειδή κάποιος μου ζήτησε βοήθεια στον κώδικα στέλνω την άσκηση τους αυτούσια

Χμ.. τούτο εδώ το παλιό θέμα μπορεί να φανεί χρήσιμο όσον αφορά την αντιστοίχηση των συνδυασμών σε πιθανές λέξεις (σίγουρα θα χρειαστεί κάποιο είδος λεξικού).

 

Για παράδειγμα ο κώδικας σε C++ επιστρέφει μεταξύ άλλων για το "4685463" τον συνδιασμό "HOTLINE" (κλασσικός κωδικός :D) με ένα έλεγχο βάση λεξικού (όπως δείχνω στο προηγούμενο παλαιότερο 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
]

Δημοσ.

για την ιστορία πάλι,το ζητούμενο με αναδρομή

 

>


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

  • 2 εβδομάδες αργότερα...
Δημοσ.

παιδια εγω ειμαι παλι,

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

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


}

Δημοσ.

χρονια πολλα και καλη χρονια σε ολους!!

Παιδια κατι για τν ασκηση,

προσπαθω τοσο καιρο αλλα δεν τα καταφερνω,γιαυτο αν μπορειται να με βοηθησετε!!

Δημοσ.

χρονια πολλα και καλη χρονια σε ολους!!

Παιδια κατι για τν ασκηση,

προσπαθω τοσο καιρο αλλα δεν τα καταφερνω,γιαυτο αν μπορειται να με βοηθησετε!!

 

χρονια πολλα και καλη χρονια σε ολους

 

η λύση που σου έδωσα δεν σου κάνει?(ποστ 22)

Δημοσ.

χρονια πολλα και καλη χρονια σε ολους

 

η λύση που σου έδωσα δεν σου κάνει?(ποστ 22)

στην λυση αυτη και 2 αριθμους να δωσω μου εμφανιζει λεξεις με 3 γραμματα,ενω θα πρεπε με δυο.

και εχω προσπαθησει να το κανω αλλα δεν τα καταφερνω. :mellow:

Δημοσ.

Δεν ξερω τι ακριβος θελεις αλλα το κομματι

if((choice==3 &&choice+1==4)||(choice==4 &&choice+1==3)) συνεπαγεται με το if( choice == 4 ) ή switch(choice)case 4:{...} break;

Δημοσ.

στην λυση αυτη και 2 αριθμους να δωσω μου εμφανιζει λεξεις με 3 γραμματα,ενω θα πρεπε με δυο.

και εχω προσπαθησει να το κανω αλλα δεν τα καταφερνω. :mellow:

 

 

αν δεν μπορείς να κάνεις copy paste τι να πω.

δες την φώτο για τον αριθμό --->23

post-172311-0-64712000-1293996790_thumb.jpg

Δημοσ.

αν δεν μπορείς να κάνεις 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;
}

Ευχαριστω.

Δημοσ.

 

οποτε στην 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;
}

Ευχαριστω.

ναι

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

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

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