Comunidad Underground Hispana  

Retroceder   Comunidad Underground Hispana > Programacion > Carbide C/C#/C++


Respuesta Crear Nuevo Tema
 
Compartir en twitter LinkBack Herramientas Desplegado
Antiguo 18-ene-2010, 18:23   #1
Recien llegado
 
Fecha de Ingreso: enero-2010
Amigos 0
Mensajes: 1
Gracias: 0
Agradecido 0 veces en 0 mensajes.
Predeterminado Reemplazar una palabra dentro de una frase en C

Me piden:

int reemplazaPalabra(char frase[], char palabraAntigua[], char palabraNueva[])
Dada una frase, reemplaza cada aparición de palabraAntigua por palabraNueva. La función
devolverá el número de apariciones de palabraAntigua en frase. Ten en cuenta que
palabraAntigua y palabraNueva pueden tener longitudes diferentes por lo que habrá que hacer
desplazamientos de caracteres dentro de frase

por lo tanto, segun dice voy a tener que poner 3 if para las tres condiciones, 1 que sean de la misma logitud la palabra por la que quiero cambiar, 2º que sea menor que la que quiero cambiar y 3º que sea mayor.

no tengo ni idea de como empezar dios.

algun alma caritativa, que ayude, se deberia creo que la funcion strlen de la la libreria <string.> para poder ver las dimensiones de cada 1.

gracias
sistematico está desconectado   Responder Citando
Antiguo 18-ene-2010, 23:44   #2
Miembro
 
Avatar de Karitelis
 
Fecha de Ingreso: enero-2010
Ubicación: Mexico
Amigos 2
Mensajes: 56
Gracias: 10
Agradecido 59 veces en 7 mensajes.
Wink Algoritmo

Chico no se si ya leíste las normas de esta zona.
No se hacen tareas! Menos aun si no tienes ni un poco de avances.

Pero bueno como hoy estoy de buenas y el problema me parece interesante te posteare el algoritmo que hice para solucionarlo.
Hoy ya es tarde y no creo que me de tiempo programarlo, mañana tal vez ya lo tenga pero tu debes hacer un avance o algo. Recuerda, aquí no se hacen tareas.

ENTRADA: Cadena antigua, palabra antigua, palabra nueva
SALIDA: Cadena nueva con palabra nueva en vez de palabra antigua

1.- Recibir: Cadena antigua, palabra antigua, palabra nueva
2.- Obtener longitudes: De palabra antigua y palabra nueva
3.- Crear apuntador: A tipo char y asignarle el espacio de memoria correcto
3.1.- Condición: longitud(antigua) == longitud(nueva)
-->La longitud de la nueva cadena es la misma que la de la cadena antigua.
longitud(antigua) > longitud(nueva)
-->La longitud de la nueva cadena es longitud(cadena) - {[longitud(antigua) - longitud(nueva)] * (numero de veces que aparece 'antigua' en cadena)}
longitud(antigua) < longitud(nueva)
-->La longitud de la nueva cadena es longitud(cadena) + {[longitud(nueva) - longitud(antigua)] * (numero de veces que aparece 'antigua' en cadena)}
4.- Escribir a cadena nueva: Los caracteres de la cadena antigua
4.1.- Condición: Si leyendo los caracteres de cadena antigua nos emcontramos con 'palabra antigua'.
4.1.1.- NO ESCRIBIR 'palabra antigua', en su lugar escribir 'palabra nueva'.
4.1.2.- Volver al paso 4 hasta que se encuentre el caracter nulo terminal de cadena antigua.

Lindo no?
Creo que hay cosas aun por mejorar... incluso no se si se entiende bien mi algoritmo, volveré después de unas horas de siesta.
Karitelis está desconectado   Responder Citando
Antiguo 07-mar-2010, 21:25   #3
Miembro
 
Avatar de Karitelis
 
Fecha de Ingreso: enero-2010
Ubicación: Mexico
Amigos 2
Mensajes: 56
Gracias: 10
Agradecido 59 veces en 7 mensajes.
Cool Resuelto!

Se que el usuario que posteo esto ya no pasara por aquí, pero se los dejo resuelto a ustedes por si algún día se los piden, o solo para que vean como se hace.


No es un programa fácil... toma su tiempo, unas 3 horas me tarde yo. Sin embargo la recompensa es muy gratificante de saber que lo pude hacer =)


Ya puse el programa completo, no solo la función que se quería. También tuve que dividirla en dos partes pues se me hizo más sencillo así. De todos modos seria igualmente sencillo adaptarla a la que se pide originalmente.
Sin mas discurso aquí esta:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/********************************************************************
*   El programa recibe una cadena de caracteres, una palabra        *
*   antigua y una palabra nueva. Devuelve la cadena con la palabra  *
*   nueva escrita en los lugares donde estaba la palabra vieja      *
********************************************************************/

int cuenta_cuantos(char *cadena, char *word){
    int i, j, kbuf, conta, NumVeces = 0;
    size_t tam1, tam2;

    // Calculamos tamaños //
    tam1 = strlen(cadena);
    tam2 = strlen(word);

    // Recorremos toda la cadena //
    for(i = 0; i < tam1; i++){
        // Si algun caracter de la cadena coincide con el primero de la palabra //
        if(cadena[i] == word[0]){
            // Guardamos la posicion en donde fue encontrada la coincidencia //
            // Para no afectar el recorrido del primer for //
            kbuf = i;
            conta = j = 0;
            // Recorremos todos los caracteres de la palabra //
            while(j < tam2){
                if(word[j++] == cadena[kbuf++])
                    conta++;
            }
            // Si los caracteres de cadena y palabra coincidieron el mismo numero //
            // de veces que lo que mide la palabra -> palabra se encuentra en cadena //
            if(conta == tam2)
                NumVeces++;
            // NumVeces indica cuantas "palabra" hay en "cadena" //
        }
    }
    return NumVeces;
}

void Convierte(size_t tam1, size_t tam2, size_t tam3, char *cad, char *old, char *nueva, char *cadena_new){
    int i, j, aux, kbuf, bandera, conta, k = 0;

    // Recorremos toda la cadena antigua en busca de coincidencias //
    for(i = 0; i < tam1;){
        // bandera sirve para saber si la coincidencia //
        // es completa o solo de unos cuentos caracteres //
        bandera = 0;
        if(cad[i] == old[0]){
            // Guardamos en kbuf la posicion en la que iva i //
            // para que el recorrido de la cadena no se altere //
            kbuf = i;
            aux = conta = j = 0;
            // Recorremos la palabra vieja para ver si //
            // la coincidencia es completa //
            while(j < tam2){
                if(old[j++] == cad[kbuf++])
                    conta++;
            }
            // bandera sera 0 a menos que entremos al siguiente if //
            bandera = 0;
            // al siguiente if entraremos solo cuando la //
            // palabra vieja se encuentre COMPLETA en la cadena //
            if(conta == tam2){
                while(aux < tam3){
                    // aqui escribimos la palabra nueva en la //
                    // nueva cadena //
                    cadena_new[k++] = nueva[aux++];
                }
                // Como se encontro que "vieja" esta en "cadena" //
                // hacemos que i se salte el tamaño de vieja //
                // para que vieja no se copie en la cadena nueva //
                i += tam2;
                // marcamos a bandera con 1 para que el //
                // programa sepa que entramos aqui  y no //
                // entre al siguiente else if //
                bandera = 1;
            }
        }else if(bandera == 0){
            // se entra aqui solo si entre los caracteres //
            // revisados no se encontro el patron de la palabra //
            // vieja, por lo que se copimos caracteres como si nada //
            cadena_new[k++] = cad[i++];
        }
    }
    cadena_new[k] = '\0';
}


int main(){
    size_t tam1, tam2, tam3;
    int aux;
    char cad[80];
    char old[20];
    char nueva[20];
    char *cadena_new;

    printf("Dame una cadena: ");
    gets(cad);
    printf("Palabra vieja: ");
    gets(old);
    printf("Palabra nueva: ");
    gets(nueva);

    tam1 = strlen(cad);
    tam2 = strlen(old);
    tam3 = strlen(nueva);

    aux = cuenta_cuantos(cad, old);
    if(aux == 0){
        printf("\nERROR! La palabra vieja no se encuentra en la cadena!");
        exit(1);
    }

    if(tam2 == tam3)
        cadena_new = (char *)malloc(tam1+1);
    else if(tam2 > tam3)
        cadena_new = (char *)malloc((tam1 - ((tam2 - tam3)*aux)+1));
    else if(tam2 < tam3)
        cadena_new = (char *)malloc((tam1 + ((tam3 - tam2)*aux)+1));

    Convierte(tam1, tam2, tam3, cad, old, nueva, cadena_new);
    printf("\nLa nueva cadena ahora es: \n%s\n", cadena_new);
    free(cadena_new);
    return 0;
}
  
Como programo en linux pues no se necesita de getch() para pausar.
Ponérselo si hace falta...

Y bien que les parece??
Funciona??
A mi de vez en cuando se queda trabado el programa después de pedir la palabra nueva.
No se todavía por que??

Última edición por Karitelis; 07-mar-2010 a las 21:32 Razón: Faltaba Pedir Opiniones
Karitelis está desconectado   Responder Citando
Respuesta

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado
Trackbacks están Activado
Pingbacks están Activado
Refbacks están Activado



Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reemplazar palabra archivo texto vb.net [[SOLUCIONADO]] lamique Visual Basic y Net 3 08-ene-2010 18:54
Arma tu frase !! SMARTGENIUS Juegos y Humor (Diversión) 38 28-mar-2009 22:38
Consulta muy básica: ¿cómo pongo un vínculo dentro de la palabra "aquí"? utopía77 Off-Topic 3 29-jun-2008 18:33
Frase Celebre The Bonus Juegos y Humor (Diversión) 3 28-jun-2005 22:45
Traduccin rpida de una palabra o frase en Word XP KomKal Software 0 25-feb-2004 16:55



Portal Hacker
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0