![]() |
|
|
#1 |
|
Recien llegado
![]() Fecha de Ingreso: enero-2010
Amigos 0
Mensajes: 1
Gracias: 0
Agradecido 0 veces en 0 mensajes.
|
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 |
|
|
|
|
|
#2 |
|
Miembro
![]() Fecha de Ingreso: enero-2010
Ubicación: Mexico
Amigos 1
Mensajes: 50
Gracias: 10
Agradecido 60 veces en 7 mensajes.
|
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. |
|
|
|
|
|
#3 |
|
Miembro
![]() Fecha de Ingreso: enero-2010
Ubicación: Mexico
Amigos 1
Mensajes: 50
Gracias: 10
Agradecido 60 veces en 7 mensajes.
|
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;
}
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 |
|
|
|
![]() |
| Herramientas | |
| Desplegado | |
|
|

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 |
| Traducción rápida de una palabra o frase en Word XP | KomKal | Software | 0 | 25-feb-2004 16:55 |