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