PDA

View Full Version : [C++] tasselli uguali in char


mistergks
28-01-2012, 00:30
Ho provato a svolgere il seguente esercizio:
scrivere una funzione ricorsiva che ricevuta una stringa verifichi se essa è formata da due tasselli uguali. Esempio: "caracara", "ciaociao", "cici"...mentre sono diversi ad esempio in: "caracasa", "ciaocia" ecc...



#include <iostream>
#include <cstring>
using namespace std;

bool tasselliuguali(char *S, int n, int i, int j);

int main(){
int n=4;
int i=0, j=n;
char S[]={"ciaociao"};

if(tasselliuguali(S,n,i,j))
cout<<"ok"<<endl;
else cout<<"no"<<endl;


system("pause");
return 0;
}

bool tasselliuguali(char *S, int n, int i, int j){
if(strlen(S)% n != 0)
return false;

if(i >=n-1 && j >= n+n)
return true;

if(strcmp(S[i],S[j])!=0) //cosi non funzione ma se faccio if(S[i]!=S[j]) SI!
return false;

return tasselliuguali(S, n, ++i, ++j);
}


Sembra funzionare se sostituisco if(strcmp(S[i],S[j])!=0) con if(S[i]!=S[j])
come mai?? Non dovrebbero essere equivalenti? strcmp dovrebbe restituire 0 se le due stringhe sono uguali...e 1 o -1 se sono diverse vero?cosa sbaglio?

Dr. Cox
11-02-2012, 12:59
Passare alla funzione anche tre valori di tipo int è inutile.
Così come appesantisce inutilmente il codice usare funzioni che si usavano tipicamente con la libreria <string.h> in C, quando ora per C++ è disponibile la libreria <string>
Sfrutta la funzione SIZE, della libreria <string>.


#include <iostream>
#include <string>

using namespace std;

bool TasselliUguali (string s);

int main()
{
string t;

cout << "Inserire una stringa: ";
cin >> t;

if(TasselliUguali(t))
cout << "La stringa e' formata da due tasselli uguali" << endl;
else
cout << "La stringa non e' formata da due tasselli uguali" << endl;

return 0;
}

bool TasselliUguali (string s)
{

if( (s.size() % 2) != 0)
return false;

unsigned half_string = s.size() / 2;

for(unsigned i=0; i < half_string; i++)
if(s[i] != s[i + half_string])
return false;
return true;
}