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).
@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 (http://foro.elhacker.net/reglas.htm)
-Engel Lex
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.
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:
@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!