Entrambe le funzioni sono errate; la prima esce subito alla prima lettera che corrisponde, e comunque, se ho capito quello che avresti intenzione di fare (cercare nella seconda stringa ogni lettera della prima), l'approccio è errato, poiché dà risultati sbagliati in caso di alcune parole con doppie.
Inoltre la funzione ha due parametri con il medesimo nome (dim), il che ovviamente non è consentito.
Anche l'approccio della seconda è sbagliato, dato che, usando generici numeri casuali, nulla impedisce che lo stesso numero venga pescato più volte, ottenendo così un anagramma privo di alcune delle lettere della parola di partenza.
Il metodo più semplice per vedere se due parole sono l'una l'anagramma dell'altra è di ordinarle entrambe in ordine alfabetico e poi confrontarle: se coincidono erano l'una l'anagramma dell'altra (per dirla in un altro modo, l'ordinamento riduce tutti gli anagrammi della medesima parola ad una rappresentazione comune univoca, che può essere quindi facilmente confrontata).
Per quanto riguarda le permutazioni, ci sono diversi algoritmi "classici", ne trovi alcuni qui.
Se ti è consentito usare le funzioni standard della STL, la libreria C++ fornisce sia la funzione sort che la next_permutation. Usandole in abbinata con le stringhe C++ il tuo problema si riduce ad una cosa semplicissima:
codice:
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
bool VerificaAnagramma(string Str1, string Str2);
string GeneraAnagramma(string Str);
int main()
{
srand(time(NULL));
string str1, str2;
cout<<"Inserisci la prima parola: ";
cin>>str1;
cout<<"Inserisci la seconda parola: ";
cin>>str2;
if(str1.size()!=str2.size())
{
cout<<"Le due parole hanno lunghezze diverse."<<endl;
return 0;
}
if(VerificaAnagramma(str1, str2))
{
cout<<"Le due parole sono l'una l'anagramma dell'altra."<<endl;
}
else
{
cout<<"Le due parole non sono l'una l'anagramma dell'altra.\n";
cout<<"Un anagramma di "<<str1<<" e' "<<GeneraAnagramma(str1)<<endl;
}
return 0;
}
bool VerificaAnagramma(string Str1, string Str2)
{
// ordina i caratteri delle stringhe
sort(Str1.begin(), Str1.end());
sort(Str2.begin(), Str2.end());
// restituisce l'esito del confronto
return Str1==Str2;
}
string GeneraAnagramma(string Str)
{
const int maxCicli=10; // massimo numero di permutazioni da scorrere
// scorre un numero casuale di permutazioni
int cicli=rand()%maxCicli;
for(int i=0; i<cicli; i++)
next_permutation(Str.begin(), Str.end());
// restituisce l'ultima generata
return Str;
}
Se comunque questo è un esercizio suppongo che lo scopo sia proprio quello di farti scrivere le funzioni di ordinamento e di permutazione.