Ver Mensaje Individual
  #3 (permalink)  
Antiguo 25/11/2011, 02:40
Avatar de AlmaVagabunda
AlmaVagabunda
 
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Eliminar caracteres pares o impares en C

No consigo hacer que funcione, te muestro la funcion que llama a esta funcion:

Código C:
Ver original
  1. //Funcion para eliminar pares o impares
  2. char * EliminarParesImpares(char * frase )
  3. {
  4.     char * nueva,a;
  5.     int l=strlen(frase), init,i,j;
  6.  
  7.     nueva = (char *) malloc (l * sizeof(char));
  8.     printf("\nEliminar pares o impares <p/i>: ");
  9.     a=getchar();
  10.     if (a=='p') init = 0;
  11.     else init = 1;
  12.     j=0;
  13.     for (i=init;i < l;  i = i +2)
  14.         nueva[j++] = frase[i];
  15.     nueva[j] = '\0';
  16.     return nueva;
  17. }
  18. ------------------------------------------------------------------------------------------------
  19. void MenuPrincipal (char frase[]){
  20.     system("cls");
  21.     char seleccion;
  22.     printf("\nCadena introducida : %s\n\n",frase);
  23.     do{
  24.         printf("\nMENU:");
  25.         printf("\n1) Pasar a mayusculas o a minusculas");
  26.         printf("\n2) Cambiar caracteres aleatoriamente");
  27.         printf("\n3) Invertir cadena");
  28.         printf("\n4) Eliminar caracteres pares e impares");
  29.         printf("\n5) Estadisticas");
  30.         printf("\n6) Volver a introducir una cadena");
  31.         printf("\n7) Salir");
  32.         printf("\nSelecciona una opcion: ");
  33.         fflush(stdin);
  34.         seleccion=getche();
  35.         printf("\n");
  36.         switch(seleccion){
  37.         case '1':
  38.             MayusculasMinusculas(frase);
  39.             printf("\n\nCadena Actual : %s\n\n",frase);
  40.             break;
  41.         case '2':
  42.             aleatorio(frase);
  43.             printf("\n\nCadena Actual : %s\n\n",frase);
  44.             break;
  45.         case '3':
  46.             Invertir(frase);
  47.             printf("\n\nCadena Actual : %s\n\n",frase);
  48.             break;
  49.         case '4':
  50.             EliminarParesImpares(frase);
  51.             printf("\n\nCadena Actual : %s\n\n",frase);
  52.             break;
  53.         case '5':
  54.             Estadisticas(frase);
  55.             break;
  56.         case '6':
  57.             repetir(frase);
  58.             break;
  59.         case '7':
  60.             break;
  61.         }
  62.     }while(seleccion!='7');
  63.     return;
  64. }
No se como ni donde poner la parte del main (en mi codigo, funcion del menu principal)

He intentado poner lo de:
Código C:
Ver original
  1. char * c = EliminarParesImpares("0123456789");
Justo donde en el menu principal se llama a la funcion eliminar pares, pero logicamente me da fallos.
Tambien he probado a cambiar esa variable c, por el nombre de la cadena. Tambien cambiar lo del parentesis por el nombre de la cadena.

Creo que ando algo perdido jaja.

Como deberia hacerlo?

Muchas gracias sam90 ;)
Voy a tener que pagarte, eres como un profesor particular jajaja
un abrazo


Edit:
Seria posible mantener el codigo tal como lo tenia al principio?
Lo digo por que aun no consigo entender la instruccion malloc, y si enseño eso y me preguntan que es lo que hace y como funciona, no voy a saber responder.
Me gusta mucho tu solucion, supongo que fiunciona, tiene pocas lineas, y eso es importante, pero si se puede arreglar con el codigo que tenia al principio, mejor.

Dejo aqui el codigo desde que se pide una frase en adelante, asi se me entendera mejor:
Código C++:
Ver original
  1. #include<conio.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. //Funcion para eliminar pares o impares
  6. void EliminarPI(char frase[]){
  7.     system("cls");
  8.     int i,l,a;
  9.  
  10.     l=strlen(frase);
  11.     printf("\nEliminar pares o impares <p/i>: ");
  12.     a=getche();
  13.     if (a=='p'){
  14.         for(i=0;i<l;i++){
  15.             frase[i+1]='_';
  16.             i++;
  17.         }
  18.     }
  19.     if (a=='i'){
  20.         for(i=0;i<l;i++){
  21.             i++;
  22.             frase[i-1]='_';
  23.         }
  24.     }
  25.     system("cls");
  26.  
  27.  
  28.     return;
  29. }
  30. //Funcion MenuPrincipal, donde podremos elegir una opcion//
  31. void MenuPrincipal (char frase[]){
  32.     system("cls");
  33.     char seleccion;
  34.     printf("\nCadena introducida : %s\n\n",frase);
  35.     do{
  36.         printf("\nMENU:");
  37.         printf("\n1) Pasar a mayusculas o a minusculas");
  38.         printf("\n2) Cambiar caracteres aleatoriamente");
  39.         printf("\n3) Invertir cadena");
  40.         printf("\n4) Eliminar caracteres pares e impares");
  41.         printf("\n5) Estadisticas");
  42.         printf("\n6) Volver a introducir una cadena");
  43.         printf("\n7) Salir");
  44.         printf("\nSelecciona una opcion: ");
  45.         fflush(stdin);
  46.         seleccion=getche();
  47.         printf("\n");
  48.         switch(seleccion){
  49.         case '1':
  50.             MayusculasMinusculas(frase);
  51.             printf("\n\nCadena Actual : %s\n\n",frase);
  52.             break;
  53.         case '2':
  54.             aleatorio(frase);
  55.             printf("\n\nCadena Actual : %s\n\n",frase);
  56.             break;
  57.         case '3':
  58.             Invertir(frase);
  59.             printf("\n\nCadena Actual : %s\n\n",frase);
  60.             break;
  61.         case '4':
  62.             EliminarParesImpares(frase);
  63.             printf("\n\nCadena Actual : %s\n\n",frase);
  64.             break;
  65.         case '5':
  66.             Estadisticas(frase);
  67.             break;
  68.         case '6':
  69.             repetir(frase);
  70.             break;
  71.         case '7':
  72.             break;
  73.         }
  74.     }while(seleccion!='7');
  75.     return;
  76. }
  77. //Funcion para introducir cadena y llamar a menu principal//
  78. void IntroducirCadena(){
  79.  
  80.     char frase[100];
  81.     printf("\nIntroduzca una frase:\n");
  82.     gets(frase);
  83.     fflush(stdin);
  84.     MenuPrincipal(frase);
  85.     return;
  86. }
  87. //Funcion principal donde llamamos a IntroducirCadena//
  88. int main(void){
  89.     IntroducirCadena();
  90.     return(0);
  91. }
P.D: En cada proceso que se realiza, la variable frase tiene que quedarse modificada para volver a trabajar con ella, es decir:
hola----(pares)--->oa---(invertir)---ao----.....etc.
Con las demas funciones, va perfecto, pero con la de eliminar pares o impares, con mi codigo inicial, queda con "_" lo caracteres "eliminados" de la frase, y como ya sabes, necesito que elimine el caracter realmente y no sustituirlo.
Los for del codigo que me has pasado, los entiendo perfectamente, pero no consigo ver como maneja la cadena, se que recibe la cadena, y trabaja sobre una auxiliar (nueva), pero luego esta no se asigna a la variable del comienzo (frase)

P.D2: Si, he cambiado la variable a frase, no es un fallo mio, asi me acuerdo mejor.

Última edición por AlmaVagabunda; 25/11/2011 a las 04:28