Contar cuantas veces aparece una palabra en una frase

Iniciado por minikarpin, 13 Marzo 2017, 10:45 AM

0 Miembros y 1 Visitante están viendo este tema.

minikarpin

Hola, llevo unos días buscando información y no se como resolverlo.
Tengo que buscar una palabra en una frase introducida, el problema es que no se como contar posiciones o como ir sumandolas.
-No puedo usar for (no nos deja usarlo la profesora).

Código (dos) [Seleccionar]
@echo off

setlocal enabledelayedexpansion

set cont=0
:frase1
set frase=""
set /p frase= Introduce una frase:
if !frase! EQU "" (
echo No dejes en blanco la frase
goto frase1
)
:palabra1
set palabra=""
set /p palabra= Introduce una palabra:
if !palabra! EQU "" (
echo No dejes en blanco la palabra
goto palabra1
)

:bucle

if %palabra% EQU %frase:~1% (
set /a cont=%cont%+1
goto bucle
)else (
goto fin
)




:fin
echo sdf %palabra% sdf %frase%
echo cont !cont!
pause


Acabo de empezar y estoy un poco perdido, gracias por la ayuda.



· Los códigos deben ir en etiquetas GeSHi (asumí que es batch...)
>aquí las reglas del foro
-Engel Lex

yottaXT

Mira soy novato en batch, pero bueno como no hay mas comentarios te dare una idea quizás sea tu solución quizás no.

Has probado con los comandos find o findstr? si entendí bien tu pregunta creo que tienen las funciones que andas buscando.

Eleкtro

#2
Cita de: minikarpin en 13 Marzo 2017, 10:45 AMTengo que buscar una palabra en una frase introducida, el problema es que no se como contar posiciones

No puedo usar for (no nos deja usarlo la profesora).

Pues entonces no es un ejercicio práctico. Sinceramente esa profesora no debería estar enseñando algoritmos recursivos ni otras metodologías que sean rebuscadas para conseguir hacer lo que hace un FOR de la única forma eficiente en Batch, por que eso son malos hábitos de programación y tiene sus consecuencias.

El modo eficiente de determinar la posición de un caracter en una cadena de texto es usando un FOR para poder iterar los caracteres y así ir sumando sus índices. La otra metodología sería usando etiquetas (Call, GoTo. Labels), saltanto de una parte del código a otro y esto en según que circunstancias (demasiado recursividad saltos/llamadas consecutivas) inevitablemente desbordará la cola de la pila de llamadas generando un error de desbordamiento de la pila de llamadas, valga la redundancia.

De verdad te lo digo, es un peligro acostumbrarse a hacer estas malas prácticas y tomarlo como costumbres, por que esto solo servirá para conseguir ser un mal programador que tienda a crear código spaguetti, mal estructurado y con alto riesgo de errores. Pero en fin, si te han pedido hacerlo de la manera menos práctica en la programación entonces aquí te enseño el modo:

Código (dos) [Seleccionar]
@echo OFF

Set "str=Hello World!"
Set "find=world"

Call :FindStrPos "%str%" "%find%" Y :: Result: 7
Echo:%Pos%

Call :FindStrPos "%str%" "hello" N :: Result: 0 (nul, because "N" of sensitive case search)
Echo:%Pos%

Pause
Exit



:FindStrPos :: %1=InputString, %2=FindString, %3=IgnoreCase(Y/N)
If Not Defined funcPos   (Set /A "funcPos=0")
If Not Defined funcInput (Set "funcInput=%~1")
If Not Defined funcFind  (Set "funcFind=%~2")
If /I "%~3" EQU "Y" If Not Defined ignoreCase (Set "ignoreCase=/I")
Set /A "funcPos+=1"
(
Echo:%funcInput%|FindStr %ignoreCase% /B /C:"%funcFind%"
)1>NUL || (
Set "funcInput=%funcInput:~1%"
If Defined funcInput (GoTo :FindStrPos)
       Set /A "funcPos=0"
)
Set "Pos=%funcPos%"
Set /A "funcPos=0"
Set "funcInput="
Set "funcFind="
Set "ignoreCase="
Exit /B 0


¡Saludos!