mboost-dp1

VBScript med mellemrun ?


Gå til bund
Gravatar #1 - Stewart
5. nov. 2007 09:48
Jeg sidder og laver et script, men jeg har brug lidt hjælp.
jeg har en inputbox hvor den tjekker hvad der bliver skrevet, f.eks. "Jens Jensen" og så retunere den en tekst f.eks. "hej Jens Jensen".
Mit Problem er at jeg gerne vil ha den til at tjekke om der er mellemrum (" ") i og så skrive noget andet end "hej Jens Jensen"

nogen forslag?
Gravatar #2 - illishar
5. nov. 2007 12:17
Tjo,


If InStr(mytext, " ") >= 0 then
MsgBox("All your base are belong to us!")
End if





Eller var det mere komplex end som så?
Gravatar #3 - Stewart
5. nov. 2007 15:35
det jeg er ved at lave er noget med et score system, hvor man får flere point hvis man skriver noget med mellemrum f.eks.

dim test
dim antal

test = inputbox("Skriv et eller andet", "test","")
antal = len(test)

if test = " " then
else
wscript.echo(antal)
end if


men det virker ikk helt som jeg vil ha det til. Det skal være at hvis de skriver "Jens Jensen" så skal outputtet være være 16 og ikk 11, får så bliver der added 5 "point" får et mellemrum
Gravatar #4 - Dreadnought
5. nov. 2007 16:08
aaaaaaaaa = 9 point
a a a a a = 29 point?
Gravatar #5 - Stewart
5. nov. 2007 16:29
sådan noget lignende
Gravatar #6 - Stewart
6. nov. 2007 09:09
nogen der ved hvordan jeg kan gøre det ?
Gravatar #7 - Dreadnought
6. nov. 2007 12:09
Vil to eller flere efterfølgende mellemrum tælle mere?
F.eks:
ab cd = 10
ab cd = 16
Gravatar #8 - Kisbye
6. nov. 2007 12:22
Det er lang tid siden jeg har kodet VBscript, men du kan f.eks. splitte din string ved mellemrum og så tælle hvor mange ord der er.
hvis du så trækker 1 fra, vil du have det antal mellemrum der er i din string.
Men der sikkert nogen der kan komme på en nemmere måde


dim test
dim ord
dim antal
dim i

antal = 0

test = inputbox("Skriv et eller andet", "test","")
ord = split(test," ")
for i = lbound(ord) to ubound(ord)
antal = antal + 1
next
wscript.echo("Der var " & antal - 1 & " mellemrum")
Gravatar #9 - Stewart
6. nov. 2007 22:10
#8 det var lige præcis det jeg skulle bruge..
mange tak :)
Gravatar #10 - Stewart
6. nov. 2007 22:13
lige et lille spørgsmål, hvis man nu skulle søge efter mere end kun mellemrum, f.eks. mellemrum, "ak", "sød" eller lignende, hvordan skulle man så gøre ?
Skulle man så bare kopiere "ord = split(test," ")" eller der der mere der skal gøres ?
Gravatar #11 - Kisbye
8. nov. 2007 11:51
Split er en funktion som deler en string op i en array ved en delimiter.

f.eks: ord = split("Dette er en string"," ")

vil blive til

ord(0) = Dette
ord(1) = er
ord(2) = en
ord(3) = string

Ved at tælle antal af gange den stringen er blevet delt, kan man så vide hvor mange delimiterkaraktere/ord der er.
(Reference: MSDN)


Dette virker lidt overkill, men jeg kan simpelthen ikke finde en tælle funktion nogen steder.
Instr ligner, men den fortæller kun hvilken position det der søges efter er på.
(Reference: MSDN)

Men det skal selvfølgelig ikke ødelække vores gode humør, vi skriver da blot vores egen funktion.


Den fulde kilde det eksemplet:

Option explicit

dim str_input
dim str_searchshars

str_input = inputbox("Skriv en sætning", "Input","")
str_searchshars = inputbox("Skriv det ord du vil tælle", "Input", "")
wscript.echo("Der er " & Count(str_input,str_searchshars))

Function Count(string,searchchars)
Dim Int_Pos
dim int_count
dim bol_break

Int_Pos = 1
int_count = 0

do while bol_break = false
int_pos = instr(Int_Pos, string, searchchars)
int_count = int_count + 1
if int_pos = 0 then bol_break = true
int_pos = int_pos + len(searchchars)
loop

Count = int_count - 1
End Function


Selve funktionen Count

Function Count(string,searchchars)
Dim Int_Pos
dim int_count
dim bol_break

Int_Pos = 1
int_count = 0

do while bol_break = false
int_pos = instr(Int_Pos, string, searchchars)
int_count = int_count + 1
if int_pos = 0 then bol_break = true
int_pos = int_pos + len(searchchars)
loop

Count = int_count - 1
End Function

funktion modtager:
string: sætningen der skal søges i i.
searchchars: det/de tegn der skal søges efter.
og så returnere antalet der er fundet.

Du kan kalde den så mange gange du vil og tælle hvad du nu vil med den.
Gravatar #12 - Acro
8. nov. 2007 12:48
VBScript fordrer vist slamkode.

Simpel løsning A:
Len(strText) - Len(Replace(strText, " ", ""))


Simpel løsning B:
UBound(Split(strText, " "))


Jeg dør en smule for hvert af ovenstående forslag.
Gravatar #13 - fidomuh
8. nov. 2007 12:54
#12

VBScript ER slamkode, uanset hvad man skal bruge det til :D

Men hvorfor ikke bare:
count = InStr(mytext, " ");


Det skulle gerne give dig et antal af " " ? :)
Gravatar #14 - Acro
8. nov. 2007 13:03
#13 fidomuh:
InStr er VBScript svar på indexOf/IndexOf, og den returnerer altså det sted i en streng, hvor den angivne søgeparameter først forekommer.

Jeg vil dog alligevel give dig point for at forsøge dig med en løsning på én linje.

VBScript er ikke værre, end man gør det til, men det er klart, at det bliver slamkode, hvis man bruger over det tidobbelte antal linjer i forhold til, hvad der er nødvendigt. Det ligger vist i definitionen af slamkode.
Gravatar #15 - fidomuh
8. nov. 2007 13:05
#14

Ah okay, fair nok :)

Saa er det nok nemmest at taelle laengden med og saa uden " " :)
Gravatar #16 - Stewart
8. nov. 2007 20:19
Det eneste jeg faktisk mangler lige nu er, en metode at tælle hvor mange der er en et bogstav, f.eks. tæller hvor mange A'ere der er... nogen foreslag ?
Gravatar #17 - zin
8. nov. 2007 20:23
Hvis hvert bogstav er af forskellig værdi ville det måske være nemmere at have et array med alle typer bogstaver og så tælle én op for hver gang der blev inputtet et bogstav/char.
Gravatar #18 - Saxov
8. nov. 2007 20:51
#16

numA = Len(strText) - Len(Replace(strText, "A", ""))
numa = Len(strText) - Len(Replace(strText, "a", ""))
numB = Len(strText) - Len(Replace(strText, "B", ""))
numb = Len(strText) - Len(Replace(strText, "b", ""))
.... osv..
:D
Gravatar #19 - Stewart
8. nov. 2007 22:01
#17
det er lidt det jeg vil ha, at hvert bogstav/char har hver sin værdi, f.eks.:
a = 1
b = 2
c = 3

så hvis jeg skriver "abc" så får jeg værdien 6
Gravatar #20 - zin
8. nov. 2007 22:05
#19:
Et lidt dybere array er alt du har brug for: Tre rækker og ... Ja.. X antal kolonner.
Første række har naturligvis bogstavet. Anden række har værdien og tredje har antallet af bogstaver i sætningen. Så er alt du skal gøre at parse sætningen og tælle op.
Desværre aner jeg ikke hvordan man skriver VBScript kode. :-)
Gravatar #21 - Kisbye
9. nov. 2007 13:02
#14 Acro

Ja, den må jeg jo så tage på mig.

Jeg forstod på stewert i #10 at han også ville tælle ord("ak", "sød" eller lignende, som han skriver).
Det kan man ikke med dit eksempel A, men godt med dit eksempel B.
(Den vil så tage elle kombinationer, sødmælk og sødetabeletter vil alle tælle med som ordet "sød")

#20
VBScript Language Reference: http://msdn2.microsoft.com/en-us/library/d1wf56tt....
Gravatar #22 - kdh
16. nov. 2007 23:44
Forekommer mig nemmere at bruge et RegExp objekt til at tælle istedet for alle de der løkker og strengmanipuleringer.


strInput = inputbox("Skriv et eller andet", "test","")

Set objRegExp = New RegExp
objRegExp.Global = True
objRegExp.Pattern = " "

Set Matches = objRegExp.Execute(strInput)
wscript.echo(Matches.Count)


Hvis man så vil tælle "a"'er også kan man så:

objRegExp.Pattern = "a"
Set Matches = objRegExp.Execute(strInput)
wscript.echo(Matches.Count)
Gravatar #23 - myplacedk
17. nov. 2007 12:14
"At kende problemet er halvdelen af løsningen."

For mig at se kommer der kodestumper og løsningsforslag allerede inden spørgeren (Stewart) ved hvad det egentlig er han vil have.

Steward, prøv at beskrive så præcist som muligt hvad det er du gerne vil. Put så flere detaljer på. Bskrev det HELT præcist. Spørg evt. om hjælp til dette, hvis nødvendigt.

Derefter kan du prøve at finde en måde at få det kodet på. Måske kommer det helt af sig selv, når først du ved hvad du vil opnå.
Gravatar #24 - Stewart
19. nov. 2007 12:04
Det jeg gerne vil ha er at hvert bogstav/char giver et bestemt antal point, f.eks. :
a = 5
b = 2
c = 2

eller et eller andet i den retning. Det vil sige hvis man skriver "abc" så giver det en score der hedder 9 point, og hvis man skriver "aabc" så giver det 14 point.

giver det mening ?
Gravatar #25 - myplacedk
19. nov. 2007 12:38
#24
Yep, nu ved jeg præcist hvad du vil opnå. :)

Men jeg kan ikke VBScript, så jeg kan kun give dig helt generelle råd:

1) Gem din "point"-liste i et array
2) Loop hen over strengen, tæl værdierne sammen én efter én.

I Java ville dette måske virke (har ikke testet):

[code] String string = "ABC";

int[] point = new int[Character.MAX_VALUE];
point['A'] = 5;
point['B'] = 2;
point['C'] = 2;

int sum = 0;

for(char c : string.toCharArray()) {
sum += point[c];
}
[/quote]

(Tegn der ikke er angivet vil her give 0 point.)
Gravatar #26 - myplacedk
19. nov. 2007 12:38
Og det var så her det ville have været praktisk hvis jeg havde benyttet preview-funktionen. ;-)
Gravatar #27 - Stewart
19. nov. 2007 13:25
#22 hvis man så vil tælle mere en et ord, hva gør man så ?
Gravatar #28 - Stewart
19. nov. 2007 13:31
*bogstav..
Gravatar #29 - illishar
19. nov. 2007 13:50
Damn Stewart! Måske skulle du købe dig en programmerings-bog.


Dim searchwords() as string, searchpoints() as Integer
ReDim searchwords(1)
ReDim searchpoints(1)
searchwords(0) = " "
searchpoints(0) = 4
searchwords(1) = "ost"
searchpoints(1) = 6

Dim i as Integer, points as Integer, p as integer
For i = 0 To UBound(searchwords)-1
p = 0
p = InStr(searchstring, str)
while(p >= 0)
points = points + searchpoints(i)
p = InStr(searchstring, str, p+1)
Wend
Next i



Eller noget i den retning. Som #23 siger, så ville det hjælpe hvis vi vidste hvad det i virkeligheden er du vil lave.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login