PDA

Visualizza la versione completa : [c++] tasselli uguali (ricorsivamente)


mistergks
28-01-2012, 22:07
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?

Donis
28-01-2012, 22:21
- Sembra funzionare se sostituisco if(strcmp(S[i],S[j])!=0) con if(S[i]!=S[j])

ma in strcmp ci vanno dei vettori di caratteri, non dei caratteri, a me daa errore se inserisco dei caratteri e dice "impossibile convertire parametro 1 da 'char' a 'const char*'... penso sia per questo che non funziona...

ramy89
28-01-2012, 22:27
Non ti conviene usare le stringhe in stile C, c'è la classe string con cli operatori =, ==,+= e [] in overloading, se hai una stringa:



string a="ciao";
string b="ciao";
cout<<(a==b)<<endl;
cout << a[0]; // stampa 'c'


Puoi usare tutti questi operatori ed anche molti altri.

mistergks
29-01-2012, 00:51
Lo so che string è migliore..ma nn posso usaper l esame che sto preparando..
Non ho capito in che senso strcmp funziona con array di caratteri? Perché dá quell errore? Alla fine io confronto lo stesso ma con indici diversi..

ramy89
29-01-2012, 01:38
strcmp prende come argomenti due puntatori a char.
Se vuoi valutare solo una sottostringa non puoi passargli un singolo carattere:



char a[]="ciao";
strcmp(a[1],"iao");
// sbagliato, s[1] non è un puntatore a char


Ma gli passi il suo indirizzo:



strcmp(&s[1],"iao");

Loading