Dev - C++ - Anagramas

 
Vista:
sin imagen de perfil

Anagramas

Publicado por Héctor (2 intervenciones) el 20/11/2016 19:43:45
Buenas, es mi primer año programando, tengo que realizar un programa que compruebe si dos apalabras son angramas. El único problema que encuentro es que no se como hacer que rconozca las vocales con tildes y sin tildes como iguales. Alguien que me explique como podría lograrlo?Gracias de antemano. Os dejo el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#define DIM 256
 
main()
{
	 setlocale (LC_ALL, "spanish");
	 char cadena1[DIM];
	 char cadena2[DIM];
	 int frec1,frec2;
	 int i;
 
 
	 //Inicializamos los vectores con 0s para evitar errores
	 for(i=0;i<DIM;i++)
	 {
	 	cadena1[i]=0;
	 	cadena2[i]=0;
	 }
 
	 //Peticion de datos
	 printf("Introduzca la primera palabra para determinar si es anagrama:\n");
	 fflush(stdin);
	 gets(cadena1);
	 printf("Introduzca la segunda palabra para determinar si es anagrama:\n");
	 fflush(stdin);
	 gets(cadena2);
 
	 for(i = 0; cadena1[i]; i++)
             cadena1[i] = toupper(cadena1[i]); //<--convierte a mayusculas 
         for(i = 0; cadena2[i]; i++)
              cadena2[i] = toupper(cadena2[i]); //<--convierte a mayusculas 
 
	 //Para saber si tienen el mismo numero de caracteres, sumamos dichos caractares por su valor ascii
	 for(i=0,frec1=0,frec2=0;i<DIM;i++)
	 {
	 	frec1=frec1+cadena1[i];
	 	frec2=frec2+cadena2[i];
	 }
	 if(frec1==frec2)
	 	printf("Las palabras introducidas son anagramas\n");
	 else
	 	printf("Las palabras introducidas no son anagramas\n");
 
	 system("pause");
	 return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Anagramas

Publicado por agustin (522 intervenciones) el 20/11/2016 20:56:11
Pues no termino de entender a que llamas anagrama ya que lo que haces es sumar los valores de los caracteres y según tu eso te diría si son del mismo largo. No lo veo porque no compruebas si se introducen números o caracteres especiales. De todos modos, como no vuelves a mostrar las palabras, es tan fácil como poner en el bucle que usas para pasar a mayúsculas algo asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for(i = 0; cadena1[i]; i++){
    switch(cadena1[i]){
        case 'á': case 'Á':
            cadena1[i] = 'A';
            break;
        case 'é': case 'É':
            cadena1[i] = 'E';
            break;
        case 'í': case 'Í':
            cadena1[i] = 'I';
            break;
        case 'ó': case 'Ó':
            cadena1[i] = 'O';
            break;
        case 'ú': case 'Ú':
            cadena1[i] = 'U';
            break;
        default:
            cadena1[i] = toupper(cadena1[i]); //<--convierte a mayusculas 
    }
}
Lo ideal seria crear una función y así no tendrías que duplicar el código dos veces.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Anagramas

Publicado por Héctor (2 intervenciones) el 20/11/2016 21:03:54
La verdad que no se me habia ocurrido utilizar un bucle for para cambiarlo. Muchas gracias! Introduciré una comprobación para los carácteres especiales y números. La idea con la que he utilizado la suma de los valores de los carácteres es comprobar a la vez que las palabras contienen los mismos caracteres, ya que aunque estén en distinta posición en ambas palabras, el valor del carácter no cambia. Lo mismo no me he explicado bien, si es así lo siento. De nuevo, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Anagramas

Publicado por agustin (522 intervenciones) el 20/11/2016 22:53:18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int pasar_a_mayusculas(char cadena[]){
    int retval = 0;
    for(i = 0; cadena[i] && retval == 0; i++){
        switch(cadena[i]){
            case 'á': case 'Á':
                cadena[i] = 'A';
                break;
            case 'é': case 'É':
                cadena[i] = 'E';
                break;
            case 'í': case 'Í':
                cadena[i] = 'I';
                break;
            case 'ó': case 'Ó':
                cadena[i] = 'O';
                break;
            case 'ú': case 'Ú':
                cadena[i] = 'U';
                break;
            case 'ñ': case 'Ñ':
                cadena[i] = 'Ñ';
                break;
            default:
                if (isalpha(cadena[i])){
                    cadena[i] = toupper(cadena[i]); //<--convierte a mayusculas 
                }else{
                    printf("Palabra con formato incorrecto\n");
                    retval = -1;
                }
        }
    }
    return retval;
}
Por otro lado si lo que quieres realmente es averiguar si ambas palabras tienen los mismos caracteres la suma de estos no es para nada fiable. Imagina que introduzco estas dos palabras:
"casa"
"bata"
Ambas sumas te van a dar lo mismo y como ves no tienen los mismos caracteres. Lo que tienes que hacer es ordenar los caracteres por orden alfabético en ambas palabras y luego usas strcmp para compararlas y si usan los mismos caracteres coincidirán.
Por cierto, la ñ igual te da el mismo problema que las vocales con acento con lo que es mejor que lo cambies también en el switch.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar