Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jaimeramirez10 en 11 Junio 2013, 15:50 pm



Título: Cadenas c++
Publicado por: jaimeramirez10 en 11 Junio 2013, 15:50 pm
Para la universidad  realice un programa en c++, se pedia que se digitaran dos cadenas y que se comprobara si las dos cadenas tenian las mismas letras, el problema es que si pongo las letras en desorden no dice que son iguales,  si se pone espacio en la primera cadena se salta de una vez y dice que son iguales, aqui el programa:
#include <iostream>
#include<cstring>
using namespace std;
int main(){
  char cadena1[1000];
  char cadena2[1000];
  int n;
  cout<<"cadena1 es: ";
  cin>>cadena1;
  cout << "cadena2 es: ";
  cin>>cadena2;
  if (strcmp(cadena1,cadena2)!=0){
      cout<<"Las cadenas no son iguales\n";
   }
   if(strcmp(cadena1,cadena2)==0){
      cout<<"Las cadenas no son iguales\n"; 
      }
  system("Pause");
}
Gracias por la ayuda



Título: Re: Cadenas c++
Publicado por: amchacon en 11 Junio 2013, 16:11 pm
Código
  1. if (strcmp(cadena1,cadena2)!=0){
  2.      cout<<"Las cadenas no son iguales\n";
  3. }
  4.  
  5. if(strcmp(cadena1,cadena2)==0){
  6.      cout<<"Las cadenas no son iguales\n";  
  7.      }
Has puesto el mismo texto en las dos comparaciones  ;-)

Por cierto, C++ incluye un tipo de cadena más fácil de usar (string):

Código
  1. #include <iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5.  string Cadena
  6.  string Cadena2
  7.  int n;
  8.  cout<<"cadena1 es: ";
  9.  cin>>cadena1;
  10.  cout << "cadena2 es: ";
  11.  cin>>cadena2;
  12.  if (Cadena != Cadena2){
  13.      cout<<"Las cadenas no son iguales\n";
  14.   }
  15.   if(Cadena == Cadena2){
  16.      cout<<"Las cadenas son iguales\n";  
  17.      }
  18.  system("Pause");
  19.  return 0;
  20. }


Título: Re: Cadenas c++
Publicado por: rir3760 en 11 Junio 2013, 16:35 pm
el problema es que si pongo las letras en desorden no dice que son iguales
Antes de la comparacion debes ordenar el contenido de las dos cadenas. Si se trata de arrays de caracteres puedes utilizar la función qsort (prototipo en <cstdlib>) y una propia, para objetos de la clase string la función sort (el encabezado aquí es <algorithm>).

si se pone espacio en la primera cadena se salta de una vez
Eso sucede porque al utilizar el operador "<<" este lee una palabra. En su lugar utiliza la función getline (http://www.cplusplus.com/reference/istream/istream/getline/).

En el caso de utilizar la clase string es relativamente fácil:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8. using std::getline;
  9.  
  10. #include <algorithm>
  11. using std::sort;
  12.  
  13. int main()
  14. {
  15.   cout << "Primera cadena: ";
  16.   string a;
  17.   getline(cin, a);
  18.  
  19.   cout << "Segunda cadena: ";
  20.   string b;
  21.   getline(cin, b);
  22.  
  23.   sort(a.begin(), a.end());
  24.   sort(b.begin(), b.end());
  25.  
  26.   cout << "Las cadenas ";
  27.   if (a != b)
  28.      cout << "NO ";
  29.   cout << "estan formadas por los mismos caracteres" << endl;
  30.  
  31.   return 0;
  32. }

Un saludo


Título: Re: Cadenas c++
Publicado por: CCross en 11 Junio 2013, 16:38 pm
Buenas!!

Creo que lo que intentas es buscar si las dos cadenas son anagramas al ser asi te dejo una
posible solución

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(){
  6.  
  7.  char cadena1[30], cadena2[30];
  8.  int i = 0, j, k = 0;
  9.  
  10.  printf("Introduzca las dos cadenas: ");
  11.  scanf("%s" "%s" , cadena1, cadena2);
  12.  
  13.  if (strlen(cadena1) != strlen(cadena2))
  14.    printf("No son anagramas\n");
  15.  
  16.  else
  17.  {
  18.        for (; cadena1[i]!='\0'; i++){
  19.            for (j=0; j < cadena2[j]!='\0'; j++)
  20.                if (cadena1[i] == cadena2[j]){
  21.                    k++;
  22.                  }
  23.           }
  24.       if(strlen(cadena2)== k)
  25.          printf("Son anagramas\n");
  26.  
  27.        else
  28.          printf("No son anagramas\n");
  29.   }
  30.  return 0;
  31. }
  32.  

Saludos  ;D