Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Eliminar caracteres pares o impares en C

Estas en el tema de Eliminar caracteres pares o impares en C en el foro de C/C++ en Foros del Web. Hola, de vuelta estoy aqui, a ver si alguien me puede ayudar. Estoy haciendo un programa en C, para hacer diversas funciones con cadenas, una ...
  #1 (permalink)  
Antiguo 24/11/2011, 17:55
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 12 años, 5 meses
Puntos: 1
Pregunta Eliminar caracteres pares o impares en C

Hola, de vuelta estoy aqui, a ver si alguien me puede ayudar.
Estoy haciendo un programa en C, para hacer diversas funciones con cadenas, una de ella es eliminar los caracteres pares o los impares, es decir:

Hola---> par: oa || impar: hl

He conseguido que me cambie los caracteres a eliminar, por "_", pero necesito que los elimine, y no deje espacio en blanco donde ha eliminado una letra.
He probado "\0", 0, -1, '', ' ', ... y alguna locura mas, pero sigo sin poder hacer nada.
En la cadena original pueden haber espacios, asi que no es eliminar todos los espacios que hayan.

Os dejo el codigo (que no se si sera el mejor) de la funcion en concreto, la funcion recibe la referencia de la cadena, y ya realiza todo el proceso.

Código C:
Ver original
  1. void EliminarParesImpares(char cadena1[]){
  2.     int i,l,a;
  3.    
  4.     l=strlen(cadena1);
  5.     printf("\nEliminar pares o impares <p/i>: ");
  6.     a=getche();
  7.     if (a=='p'){
  8.         for(i=0;i<l;i++){
  9.             cadena1[i+1]='_';
  10.             i++;
  11.         }
  12.     }
  13.     if (a=='i'){
  14.         for(i=0;i<l;i++){
  15.             i++;
  16.             cadena1[i-1]='_';
  17.         }
  18.     }
  19.     system("cls");
  20.     return;
  21. }


Muchas gracias de antemano
  #2 (permalink)  
Antiguo 24/11/2011, 20:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Eliminar caracteres pares o impares en C

Decidi cambiarte entera tu funcion, porque lo que propones se puede llegar a complicar mas.

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. char * EliminarParesImpares(char * cadena )
  4. {
  5.     char * nueva,a;
  6.     int l=strlen(cadena), init,i,j;
  7.  
  8.     nueva = (char *) malloc (l * sizeof(char));
  9.     printf("\nEliminar pares o impares <p/i>: ");
  10.     a=getchar();
  11.     if (a=='p') init = 0;
  12.     else init = 1;
  13.     j=0;
  14.     for (i=init;i < l;  i = i +2)
  15.         nueva[j++] = cadena[i];
  16.     nueva[j] = '\0';
  17.     return nueva;
  18. }
  19.  
  20. int main()
  21. {
  22.     char * c = EliminarParesImpares("0123456789");
  23.     printf("%s\n",c);
  24.     return 0;
  25. }

La idea es la siguiente, en vez de modificar esa cadena, creamos una nueva y vamos a ir copiando los elementos ahi.
Uso malloc para reservear memoria para la cadena. un char nueva[50]; me crearia problemas ya que al devolver la funcion esta deja de existir, ademas tendria una limitacion.

Luego lo que hago es recorrer la cadena de dos en dos, empezando por cero si es par o por 1 si es impar. Asi voy copiando cada elemento a la cadena nueva. Esta va aumentando, por supuesto, de uno en uno...

Supongo que hay muchas cosas que no vas a entender ahora... pero con el tiempo vas a encontrarle el sentido.

La funcion devuelve un puntero a la nueva cadena.

Cualquier cosas pregunta.
  #3 (permalink)  
Antiguo 25/11/2011, 02:40
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 12 años, 5 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
  #4 (permalink)  
Antiguo 25/11/2011, 05:02
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Eliminar caracteres pares o impares en C

El problema es que mi funcion no modifica a frase... aca tenes una variante acotado a tu ejemplo

Código C:
Ver original
  1. void  EliminarParesImpares(char * cadena )
  2.     {
  3.         char  nueva[100] , a;
  4.         int l=strlen(cadena), init,i,j;
  5.         printf("\nEliminar pares o impares <p/i>: ");
  6.         a=getchar();
  7.         if (a=='p') init = 0;
  8.         else init = 1;
  9.         j=0;
  10.         for (i=init;i < l;  i = i +2)
  11.             nueva[j++] = cadena[i];
  12.         nueva[j] = '\0';
  13.         strcpy(frase,nueva);
  14.     }
  #5 (permalink)  
Antiguo 25/11/2011, 05:36
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Eliminar caracteres pares o impares en C

No se que haria sin ti sam90!!
Funciona perfectamente.

De verdad, muchas gracias.
Cada vez aprendo mas, voy lento, pero aprendo.
Un abrazo, y como las demas veces +karma ;)
  #6 (permalink)  
Antiguo 25/11/2011, 08:14
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Eliminar caracteres pares o impares en C

Lo importante es, notaste las modificaciones que le hice? las entendiste??
Declaro una nueva cadena, copia ahi todo lo necesario y luego copia la auxiliar a la cadena primaria con la funcon strcpy.

Saludos
  #7 (permalink)  
Antiguo 12/01/2012, 19:21
Avatar de AlmaVagabunda  
Fecha de Ingreso: noviembre-2011
Ubicación: San Juan De Alicante, Valenciana, Spain, Spain
Mensajes: 20
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Eliminar caracteres pares o impares en C

Perdona por no haberte contestado, no vi que me dijiste algo mas :P

Si que lo entendí. Cada vez aprendo mas, y con la ayuda que me prestas, perfecto ;)

Un saludo

Etiquetas: caracteres, funcion, impares, pares, programa, cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:32.