Foros del Web » Programación para mayores de 30 ;) » Programación General »

como hacer....

Estas en el tema de como hacer.... en el foro de Programación General en Foros del Web. Como puedo hacer esto: abro un archivo .txt (listo) Pongo una palabra (listo) Que cuente cuantas veces esta esa palabra en el archivo (eso me ...

  #1 (permalink)  
Antiguo 17/04/2005, 08:50
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
como hacer....

Como puedo hacer esto:

abro un archivo .txt (listo)
Pongo una palabra (listo)
Que cuente cuantas veces esta esa palabra en el archivo (eso me falta)

como lo puedo hacer :S
  #2 (permalink)  
Antiguo 17/04/2005, 08:52
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Por favor especifica el lenguaje y el Sistema Operativo en el cual estas trabajando.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 17/04/2005, 09:08
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
opps se me olvido

es C/C++
  #4 (permalink)  
Antiguo 17/04/2005, 09:11
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Siendo un archivo de texto, imagino que con un tamaño bastante chico, podes leer todo el archivo en un buffer y usar alguna funcion de busqueda de cadenas tipo strstr().
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 17/04/2005, 09:25
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
Cita:
Iniciado por Eternal Idol
Siendo un archivo de texto, imagino que con un tamaño bastante chico, podes leer todo el archivo en un buffer y usar alguna funcion de busqueda de cadenas tipo strstr().
y como se podria hacer con el strstr() ??

porque si tengo

Hola Como estas?
y pongo...

la

saldria

la Como estas?

:S

como lo puedo hacer con esa funcion?
  #6 (permalink)  
Antiguo 17/04/2005, 09:27
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
o hay alguna funcion que se paresca a la explode() de PHP en C/C++ ???
  #7 (permalink)  
Antiguo 17/04/2005, 09:27
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
ststr() te devuelve un puntero asi que lo podes hacer perfectamente comparando los caracteres anterior y posterior. Si es un \r, \n o espacio lo tomas como valido y sino no. Tambien tenes que comprobar el comienzo y final del buffer que contiene el texto para no pasarte de los limites en la comprobacion.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 17/04/2005, 09:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No conozco mucho de PHP pero creo podes hacer algo parecido con strtok().
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 17/04/2005, 09:38
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
puedes ir usando fscanf(que lee hasta encontrar un espacio) y strcmp para hacerte la vida mas facil.
Saludos
  #10 (permalink)  
Antiguo 17/04/2005, 10:30
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Instru
puedes ir usando fscanf(que lee hasta encontrar un espacio) y strcmp para hacerte la vida mas facil.
Saludos
Pues no. Primero, que es más complicado y tiene menos rendimiento. Si existe una función que "busca subcadenas en cadenas", usa esa coñe. Que manía de hacer las cosas mal.

strstr() te pide dos punteros a cadena. El primero es la cadena DONDE se buscará, y el segundo la cadena A buscar. Devuelve un puntero a la primera posición de la primera aparición. Si no existe, devuelve NULL.

Por lo tanto, con hacer:

char frase[100] = "En un lugar de la Mancha, Paco el de los palotes estaba caminando.";
char buscar[100] = "Paco";

if(strstr(frase,buscar)==NULL) printf("paco no esta");
else printf("paco esta");
  #11 (permalink)  
Antiguo 17/04/2005, 10:40
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
pero yo no quiero saber si esta o no esta es palabra

por ejemplo tengo

char p[100]="Hola a todos como esta, hola denuevo como hola todos"; // mi cadena
chat p2[100]="hola"; // palabra a busca

resultado

La palabra "hola" esta "3" veces

que no importe si es como mayuscula o minuscula
  #12 (permalink)  
Antiguo 17/04/2005, 11:05
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Goku00_1
pero yo no quiero saber si esta o no esta es palabra

por ejemplo tengo

char p[100]="Hola a todos como esta, Hola denuevo como Hola todos"; // mi cadena
chat p2[100]="hola"; // palabra a busca

resultado

La palabra "hola" esta "3" veces

que no importe si es como mayuscula o minuscula
Sobre lo de "mayusculas-minusculas"... Puedes pasar todo a mayúsculas.

Para hacerlo, un while bastaría (lo de buscar cuántas veces):
Código:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>

int Contar(char * t1, char * t2)
{
	char * p1 = (char *) malloc(strlen(t1)*sizeof(char)+1);
	char * p2 = (char *) malloc(strlen(t2)*sizeof(char)+1);

	int i;
	char * temp = p1;

	for(i=0;t1[i]!='\0';i++) p1[i]=toupper(t1[i]); p1[i]='\0';
	for(i=0;t2[i]!='\0';i++) p2[i]=toupper(t2[i]); p2[i]='\0';

	i=0;
	while((temp = strstr(temp,p2))!=NULL) { temp++; i++; }

	free(p1);
	free(p2);

	return i;
}

int main()
{
	char p1[100]="hola a todos como esta, Hola de nuevo como Hola todos";
	char p2[100]="hOlA";

	printf("%i\n",Contar(p1,p2));

	return 0;
}
Salida:
3

Como ves, lo que llamabas tú Instru "tan complicado", se reduce a una línea:

Código:
while((temp = strstr(temp,p2))!=NULL) { temp++; i++; }


*** EDITADO ***
Te he "despejado" o "aislado" todo en una función para que la puedas usar sin preocuparte :)

Última edición por MaxExtreme; 17/04/2005 a las 11:29
  #13 (permalink)  
Antiguo 17/04/2005, 13:24
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
se me olvido decir que solo era con

#include <stdio.h>
#include <stdlib.h>

y no con otras librerias
  #14 (permalink)  
Antiguo 17/04/2005, 13:56
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Las otras librerías son = de estándar que ésas.


#include <ctype.h> // Función ctype
#include <malloc.h> // Memoria dinámica

Si te lo han mandado en C y con limitaciones (ejercicio de universidad), puedes no usar la función (así te ahorras usar la memoria dinámica) y lo metes directamente todo en main.

Sobre la función "toupper", la puedes imitar (pero si es para universidad no te digo más). Simplemente pasas toda cadena con un for y si es una letra minuscula la sumas la diferencia ASCII entre mayúsculas y minúsculas.
  #15 (permalink)  
Antiguo 17/04/2005, 15:01
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
no es para la Universidad...

es que tengo un libro de C, y lo lei, y al final salen 200 ejecicios y este es el numero 26 y no me sale....

por eso quiero la ayuda...

:(

Aun no voy a la Universidad

solo tengo 15 años =)
  #16 (permalink)  
Antiguo 17/04/2005, 16:20
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Goku00_1
no es para la Universidad...

es que tengo un libro de C, y lo lei, y al final salen 200 ejecicios y este es el numero 26 y no me sale....
¡¡ Entonces haz lo que te digo !!

Cita:
Iniciado por Goku00_1
solo tengo 15 años =)
:O ¡ Estoy asombrado !
  #17 (permalink)  
Antiguo 17/04/2005, 16:30
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 11 meses
Puntos: 0
malloc.h no forma parte de la biblioteca estandard de C89 y C99.

En lo que concierne al prototipo de la funcion malloc este se encuentra en stdlib.h por lo que no seria necesario utilizar malloc.h, esto por supuesto siempre y cuando el compilador que se utilice soporte el estandard de C.

Un saludo
  #18 (permalink)  
Antiguo 17/04/2005, 18:00
 
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 20 años
Puntos: 0
Ya me salio

gracias a todo ;)
  #19 (permalink)  
Antiguo 17/04/2005, 19:02
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
Cita:
Como ves, lo que llamabas tú Instru "tan complicado", se reduce a una línea:
Donde dije que "tan complicado"?
Si verdad la mania de hacer las cosas mal y de leer mal como veo yo.

Lo que te dije es bueno y sirve. y siquieres leerlo desde un arreglo puedes usar sscanf que lee pero en vez del stdin o de un archivo, de el arreglo que tu le digas.
Despues comparas y si esta pues igualmente puedes incrementar el contador. Pero bueno, ya le salio, solo digo otra manera de hacerlo que NO ESTA MAL, solo es diferente.

saludos
  #20 (permalink)  
Antiguo 17/04/2005, 20:59
Avatar de SysopNecho  
Fecha de Ingreso: abril-2005
Ubicación: Santiago
Mensajes: 4
Antigüedad: 19 años, 7 meses
Puntos: 0
De acuerdo

HOLA! talves esto te ayude...

#include<stdio.h>
#include<conio.h>

int buscar(char *base, char *strbuscar);

void main(void){
char *str="hola, soy SysopNecho y digo hola a quien me dice hola";
char *str2="hola";
int nveces=buscar(str,str2);
printf("SysopNecho dijo hola %d veces", nveces);
}


int buscar(char *base, char *strbuscar){
int pos1=0;
int pos2=0;
int cont=0;
while(base[pos1]!='\0'){
if(base[pos1]==strbuscar[pos2]){
pos2++;
if(strbuscar[pos2]=='\0'){
pos2=0;
cont++;
}
}else{
pos2=0;
}
pos1++;
}
return cont;
}

Última edición por SysopNecho; 17/04/2005 a las 21:20
  #21 (permalink)  
Antiguo 18/04/2005, 06:11
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por rir3760
malloc.h no forma parte de la biblioteca estandard de C89 y C99.

En lo que concierne al prototipo de la funcion malloc este se encuentra en stdlib.h por lo que no seria necesario utilizar malloc.h, esto por supuesto siempre y cuando el compilador que se utilice soporte el estandard de C.

Un saludo
Cierto, pero aún así staba en lo correcto al decir que usase la función tal y como la había dejado. Una cosa es un ejercicio de libro y otra uno de universidad.
  #22 (permalink)  
Antiguo 18/04/2005, 06:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Instru
Donde dije que "tan complicado"?
Si verdad la mania de hacer las cosas mal y de leer mal como veo yo.

Lo que te dije es bueno y sirve. y siquieres leerlo desde un arreglo puedes usar sscanf que lee pero en vez del stdin o de un archivo, de el arreglo que tu le digas.
Despues comparas y si esta pues igualmente puedes incrementar el contador. Pero bueno, ya le salio, solo digo otra manera de hacerlo que NO ESTA MAL, solo es diferente.

saludos
¿Bueno? No. Tú intentas decir que se usen funciones para emular otra que ya está implementada. Yo siempre intento decir que se use lo que se debe usar.

.
.
.

Cita:
Iniciado por Instru
puedes ir usando fscanf(que lee hasta encontrar un espacio) y strcmp para hacerte la vida _>_mas facil_<_.
Ahí dijistes que lo mío era más complicado...
  #23 (permalink)  
Antiguo 18/04/2005, 14:29
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
Yo no dije que fuera complicdo lo tuyo, eso es lo que tu supones.
Yo solo di una opcion que es facil de usar por si no quieres usar las funciones que tu propones.

saludos
  #24 (permalink)  
Antiguo 18/04/2005, 16:02
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Instru
Yo no dije que fuera complicdo lo tuyo, eso es lo que tu supones.
Yo solo di una opcion que es facil de usar por si no quieres usar las funciones que tu propones.

saludos

Si la tuya es _más_ fácil de usar, la mía es _menos_ fácil. Lógica. :)

Las funciones que "yo propongo" son las que están creadas específicamente para eso.
  #25 (permalink)  
Antiguo 18/04/2005, 17:15
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 21 años
Puntos: 7
Cita:
Iniciado por MaxExtreme
Si la tuya es _más_ fácil de usar, la mía es _menos_ fácil. Lógica. :)

Las funciones que "yo propongo" son las que están creadas específicamente para eso.

Oye, no me agrada que tengas eso en tu firma MaxExtreme.
Sobre todo cuando NO dije eso.
Te pido de favor que la quites, ya que eso no me parece "chistoso". Y que tu malinterpretas las cosas es otra cosa.
  #26 (permalink)  
Antiguo 18/04/2005, 19:04
Avatar de SysopNecho  
Fecha de Ingreso: abril-2005
Ubicación: Santiago
Mensajes: 4
Antigüedad: 19 años, 7 meses
Puntos: 0
Oops!... Cómo pueden discutir por eso...
  #27 (permalink)  
Antiguo 19/04/2005, 03:30
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 20 años
Puntos: 48
MaxExtreme, si dices que strstr() busca "subcadenas dentro de cadenas", entonces no sirve, ya que lo que quiere es contar "palabras dentro de frases". La subcadena "loco" esta en la cadena "Yo coloco eso", pero la palabra "loco" no esta en la frase "Yo coloco eso". A tu solucion habria que añadir la comprobacion de que los caracteres anterior y posterior a lo detectado por strstr() son caracteres que no se pueden encontrar en una palabra: espacios y caracteres especiales. O simplificando caracteres no alfanumericos.

Por eso es bueno realizar prepara los casos de prueba antes de escribir el codigo, mientras algun test falle el codigo no es correcto.
  #28 (permalink)  
Antiguo 19/04/2005, 04:11
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Cita:
Iniciado por DarkJ
MaxExtreme, si dices que strstr() busca "subcadenas dentro de cadenas", entonces no sirve, ya que lo que quiere es contar "palabras dentro de frases". La subcadena "loco" esta en la cadena "Yo coloco eso", pero la palabra "loco" no esta en la frase "Yo coloco eso". A tu solucion habria que añadir la comprobacion de que los caracteres anterior y posterior a lo detectado por strstr() son caracteres que no se pueden encontrar en una palabra: espacios y caracteres especiales. O simplificando caracteres no alfanumericos.

Por eso es bueno realizar prepara los casos de prueba antes de escribir el codigo, mientras algun test falle el codigo no es correcto.
Eso ya habia sido tenido en cuenta:

Cita:
Iniciado por Eternal Idol
ststr() te devuelve un puntero asi que lo podes hacer perfectamente comparando los caracteres anterior y posterior. Si es un \r, \n o espacio lo tomas como valido y sino no. Tambien tenes que comprobar el comienzo y final del buffer que contiene el texto para no pasarte de los limites en la comprobacion.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #29 (permalink)  
Antiguo 19/04/2005, 05:01
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 11 meses
Puntos: 0
Otra opcion es el uso de la funcion strtok (string.h) en combinacion con una funcion que compare cadenas ignorando la diferencia entre mayusculas y minusculas.

Un saludo
  #30 (permalink)  
Antiguo 19/04/2005, 05:05
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Cita:
Iniciado por rir3760
Otra opcion es el uso de la funcion strtok (string.h) en combinacion con una funcion que compare cadenas ignorando la diferencia entre mayusculas y minusculas.

Un saludo
Tambien habia sido propuesto:

Cita:
Iniciado por Eternal Idol
No conozco mucho de PHP pero creo podes hacer algo parecido con strtok().
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
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 14:18.