Avatar billede ttn- Nybegynder
19. december 2003 - 17:25 Der er 37 kommentarer og
1 løsning

Hvordan deler jeg tekststrengen op?

Hejsa

Jeg er igang med et program, og har brug for at vide, hvordan jeg deler en streng op. Hvis brugeren indtaster 1*1, 20*20, 200*200 og lign. - også med andre matematiske tegn(+ - * /),  skal den dele strengen op ved det matematiske tegn, så jeg kan få regnet regnestykket ud.

Altså 1*1 skal deles op, så jeg ved, at jeg skal gange 1 og 1 med hinanden.

Nogle idéer? Jeg har selv tænkt på split, stringtokenizer, substring og lign?
Avatar billede arne_v Ekspert
19. december 2003 - 17:28 #1
StringTokenizer med delimiters "+-*/," lyder som en mulighed.
Avatar billede arne_v Ekspert
19. december 2003 - 17:29 #2
Husk at hvis du skal kunne klare rigtige udregninger så skal du
konvertere fra infix til postfix notation.

2*2+3*3 skal jo give 13 og ikke 21 og det opnåes nemmest ved at udregne
2 2 * 3 3 * +
Avatar billede ttn- Nybegynder
19. december 2003 - 17:31 #3
Men hvordan skal jeg i praksis så gøre det? Altså med min StringTokenizer?
Avatar billede arne_v Ekspert
19. december 2003 - 17:35 #4
Du laver en StringTokenizer med din streng og med dine delimeters
og så henter du tokens.

(husk at sætte den til at returnere delimeters fordi det har du brug for)
Avatar billede ttn- Nybegynder
19. december 2003 - 17:42 #5
StringTokenizer st = new StringTokenizer(String b, String delim);

Men forstår ikke hvilken del af koden, der skal gøre sådan, at teksten deles op. Er det delim?
Avatar billede arne_v Ekspert
19. december 2003 - 17:44 #6
delim angiver hvilke bogstaver der er delimiters (skille tegn).

Du bør angive et 3. argument som true for at få delimters returneret.
Avatar billede ttn- Nybegynder
19. december 2003 - 17:46 #7
hov, ja mangler boolean returnDelim eller lign?

Så skal String delim være = + - * / ... skal dette skrives i en køre, eller skal jeg skille dem med && eller lign?
Avatar billede arne_v Ekspert
19. december 2003 - 17:48 #8
Nej bare som "+-*/,"
Avatar billede ttn- Nybegynder
19. december 2003 - 17:51 #9
Okay.

Så ser min kode sådan ud:

import java.io.*;
import java.lang.*;
import java.util.*;

//Opretter klassen
public class Simpel
{
    public static void main(String args[]) throws IOException
    {
       
        BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
        String c = "";
        do
        {
            System.out.println("Indtast regnestykke: ");
            String b = a.readLine();
            String delim = "+-*/";
            StringTokenizer st = new StringTokenizer(String b, String delim, boolean returnDelims);
            System.out.println(b);
               
            System.out.println("Vil du fortsaette med at regne simple stykker? [Y/N]");
            c = a.readLine();
        } while(c.equalsIgnoreCase("Y"));
    }
}
Avatar billede ttn- Nybegynder
19. december 2003 - 17:53 #10
Imidertid får jeg en fejl:

C:\Documents and Settings\Mikael\Dokumenter\JAVA\projekter\Simpel.java:18: ')' expected
            StringTokenizer st = new StringTokenizer(String b, String delim, boolean returnDelims);
                                                                        ^
Avatar billede arne_v Ekspert
19. december 2003 - 17:56 #11
Du skal ikke angive typerne i kaldet.

StringTokenizer st = new StringTokenizer(b, delim,  returnDelims);
Avatar billede arne_v Ekspert
19. december 2003 - 17:57 #12
Og så:

while(st.hasNext()) {
  String noget = st.nextToken();
  // process noget
}
Avatar billede ttn- Nybegynder
19. december 2003 - 18:01 #13
C:\Documents and Settings\Mikael\Dokumenter\JAVA\projekter\Simpel.java:25: cannot resolve symbol
symbol  : method hasNext ()
location: class java.util.StringTokenizer
            while(st.hasNext()) {
Får jeg nu?
Avatar billede ttn- Nybegynder
19. december 2003 - 18:03 #14
Sikker på det hedder hasNext? Kan ikke finde noget om det i API!
Avatar billede ttn- Nybegynder
19. december 2003 - 18:04 #15
så må det være nextToken, du mener?
Avatar billede ttn- Nybegynder
19. december 2003 - 18:05 #16
Eller lign?
Avatar billede arne_v Ekspert
19. december 2003 - 18:38 #17
hasMoreTokens()

sorry
Avatar billede ttn- Nybegynder
19. december 2003 - 18:47 #18
C:\Documents and Settings\Mikael\Dokumenter\JAVA\projekter\Simpel.java:24: variable returnDelims might not have been initialized
            StringTokenizer st = new StringTokenizer(b, delim, returnDelims);
Avatar billede ttn- Nybegynder
19. december 2003 - 18:53 #19
Den skal vel installeres som true? Derudover, så der hvor du skriver process, skal jeg så regne mit regnestykke ud?
Avatar billede arne_v Ekspert
19. december 2003 - 19:09 #20
Bare kald med true:

StringTokenizer st = new StringTokenizer(b, delim, true);
Avatar billede ttn- Nybegynder
19. december 2003 - 19:22 #21
Der i proccen, hvad skal jeg skrive der? Regnestykket?
Avatar billede arne_v Ekspert
19. december 2003 - 19:25 #22
Der skal du nok bare gemme tokens.

Så kan du beregbne dem senere.

Med et par hundrede linier kode.
Avatar billede ttn- Nybegynder
19. december 2003 - 20:02 #23
hvordan beregner jeg så videre fra den string?
Avatar billede arne_v Ekspert
19. december 2003 - 20:08 #24
Den kode du har nu konverterer fra en streng til et antal tokens.

Dem skal du nu have konverterer fra infix til postfix.

Og så kan du nemt evaluerer dem.
Avatar billede ttn- Nybegynder
19. december 2003 - 20:20 #25
Okay, takker. Kom med et svar
Avatar billede arne_v Ekspert
19. december 2003 - 20:26 #26
svar
Avatar billede ttn- Nybegynder
19. december 2003 - 20:31 #27
Men arne?

Hvordan fanden konverterer man fra infix ti postfix? :\
Avatar billede ttn- Nybegynder
19. december 2003 - 20:32 #28
Har du en hjemmeside af en art?
Avatar billede arne_v Ekspert
19. december 2003 - 20:41 #29
Avatar billede arne_v Ekspert
19. december 2003 - 20:42 #30
Du mente en hjemmeside med infix->postfix ?
Avatar billede ttn- Nybegynder
19. december 2003 - 20:53 #31
dvs. at når jeg har indtastet 1+1, så skal jeg have skubbet det, så der står 1 1 +?
Avatar billede arne_v Ekspert
19. december 2003 - 20:56 #32
Ja.

Det er langt nemmere at styre på den måde fordi der ikke er
parenteser og der ikke er noget problem med operator precedence.
Avatar billede ttn- Nybegynder
19. december 2003 - 20:59 #33
men via de der links, kan jeg ikke lige overskue, hvordan du gør sådan, at det bliver skubbet fra 1+1 til 1 1 + ?
Avatar billede arne_v Ekspert
19. december 2003 - 21:03 #34
Det første link forklarer da algoritmen.
Avatar billede arne_v Ekspert
19. december 2003 - 21:03 #35
Men altså - det er ikke helt simpelt.
Avatar billede ttn- Nybegynder
19. december 2003 - 21:10 #36
Jeg forstår egentlig godt, hvordan det skal ske. Men har brug for, hvordan man i praksis gør det.
Avatar billede arne_v Ekspert
19. december 2003 - 21:14 #37
Du skal have 3 lister: input, stak og resultat

Du skal vælge en passende data struktur for dem

Og så er det lige ud af vejen at implementere algoritmen

Du tager fra input/stak og smider på stak/resultat
Avatar billede ttn- Nybegynder
19. december 2003 - 21:25 #38
Okay! Takker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester