Avatar billede allsimon Nybegynder
23. oktober 2002 - 13:20 Der er 16 kommentarer og
1 løsning

Hvordan sikre man at brugeren ikke indtaster noget forkert?

Jeg er i gang med at lave et meget simpelt program hvor brugeren indtaster nogle tal i en DOS prompt

Problemet jeg er løbet ind i er at hvis brugeren istedet indtaste bogstaver, misforstår programmet indtastningen og sætter automatisk indtastningen til MIN_VALUE

Jeg har forsøgt med både en do-while løkke, en if-løkke, og en switch, men ingen af dem tager højde for bogstaverne.

Hvordan løser jeg dette problem?
Avatar billede benjams69 Nybegynder
23. oktober 2002 - 13:26 #1
Hey - er det muligt at se kildekoden...
Bare for at se hvilke "tool's" du impotere i starten af programmet...
Btw - hvad er det helt præcist programmet skal aflæse mht indtastning?!
P-ilsner Benjams69
Avatar billede arne_v Ekspert
23. oktober 2002 - 13:27 #2
Læs tallet ind som en streng.

Og så kan du enten:
* selv checke for at alle tegn er valide inden du konverterer
  til tal
* bruge en konvertering til tal som thrower en exception ved
  invalide data og catche den
Avatar billede allsimon Nybegynder
23. oktober 2002 - 13:28 #3
Jeg importere en home-made klasse som læser indtastningerne fra tastaturet.

Programmet skal undersøge om tallet N er delelig med a, b, c (alle tal som brugeren har indtastet)
Avatar billede disky Nybegynder
23. oktober 2002 - 13:28 #4
vi siger du har følgende:

En String der indeholder det indtastede vi kalder den tal

Jeg løber din String igennem og sikre mig at alle tegn er et digit (tal) hvis ikke bliver et flag sat og for løkken afbrudt.

String tal="124g46";
boolean dataOk=true;

for(int x=0;x<tal.length();x++)
{
if(!tal.charAt(x).isDigit())
{
  dataOk=false;
  break;
}
}
if(dataOk)
{
System.out.println("Kun tal indtastet");
}
else
{
System.out.println("Something is fishy");
}
Avatar billede disky Nybegynder
23. oktober 2002 - 13:29 #5
arne_v:
Den med exception er en EXTREMT grim måde at gøre det på.

En exception er netop til 'exceptions' og ikke dovne programmører det tror de er smarte.!
Avatar billede allsimon Nybegynder
23. oktober 2002 - 13:30 #6
>> arne v:

Kan du give et kode eksempel?

Jeg er lidt af en newcommer til java :-)
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 13:30 #7
du kan tjekke for Character.isDigit()
Avatar billede allsimon Nybegynder
23. oktober 2002 - 13:31 #8
>> caspermaden:

Hvor ligger Character.isDigit()
?
Avatar billede benjams69 Nybegynder
23. oktober 2002 - 13:32 #9
til arne v,
du skal lige tage højde for at en streng ofte betegnes som metode og ikke kun en datatype...
At skulle analysere den streng ville jeg mene var mere eller mindre umuligt, but hey - hvor der er vilje er der vej.
Jeg ville i stedet for at bruge type streng, bruge char, da jeg mener at den er mere håndterbare....
P-ilsner Benjams69
Avatar billede arne_v Ekspert
23. oktober 2002 - 13:33 #10
Jeg prøver lige at lave et lille eksempel.
Avatar billede disky Nybegynder
23. oktober 2002 - 13:33 #11
allsimon:
Brug mit eksempel
Avatar billede disky Nybegynder
23. oktober 2002 - 13:38 #12
Sorry minor fejl:
        String tal="124g46";
        boolean dataOk=true;
       
        for(int x=0;x<tal.length();x++)
        {
            if(!Character.isDigit(tal.charAt(x)))
            {
                dataOk=false;
                break;
            }
        }
        if(dataOk)
        {
            System.out.println("Kun tal indtastet");
        }
        else
        {
            System.out.println("Something is fishy");
        }


Den virker helt sikkert, her er den som helt program:
/*
* Test.java
*
* Created on 23. oktober 2002, 13:38
*/

/**
*
* @author  thygesen
* @version
*/
public class Test
{
   
    /** Creates new Test */
    public Test()
    {
        String tal="124g46";
        boolean dataOk=true;
       
        for(int x=0;x<tal.length();x++)
        {
            if(!Character.isDigit(tal.charAt(x)))
            {
                dataOk=false;
                break;
            }
        }
        if(dataOk)
        {
            System.out.println("Kun tal indtastet");
        }
        else
        {
            System.out.println("Something is fishy");
        }
    }
   
    /**
    * @param args the command line arguments
    */
    public static void main(String args[])
    {
        new Test();
    }
   
}
Avatar billede allsimon Nybegynder
23. oktober 2002 - 13:40 #13
>> disky:

Der er et problem med
if(!tal.charAt(x).isDigit())
              ^
Avatar billede allsimon Nybegynder
23. oktober 2002 - 13:42 #14
Perfekt... !!!!

Det funger sgu. Tusind tak det ufattelig hurtige hjælp.
Avatar billede arne_v Ekspert
23. oktober 2002 - 13:48 #15
Følgende tester for positive heltal (ligesom de nadre eksempler):

import java.io.*;

public class zz {
  public static void main(String[] args) {
      try {
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          String line;
          while(!number(line = br.readLine()));
          System.out.println(Integer.parseInt(line));
      } catch(IOException e) {
          e.printStackTrace();
      }
    }
    private static boolean number(String s) {
        for(int i = 0; i < s.length(); i++) {
            if(!Character.isDigit(s.charAt(i))) {
                return false;
            }
        }
        return true;
    }
}
Avatar billede arne_v Ekspert
23. oktober 2002 - 13:56 #16
disky:

Du kan måske ikke lide exceptions til dette brug, men det sikrer
konistsens mellem Java parsning og custom parsning. F.eks. har
alle eksempler her testet på positive heltal uden spaces. Hvis vi
skal teste for minus som første tegn og leading & trailing spaces, så
bliver der mere kode. Og hvis vi skifter fra hel tal til decimal tal,
så brliver det først rigtigt kompliceret. Så det kan faktisk godt
være meget kode-besparende at lukrere lidt på Java parsning.
Avatar billede swaq Nybegynder
28. oktober 2002 - 23:26 #17
Her er min løsning :-)

Hvis man indtaster et bogstav hvor man burde indtaste et heltal, sætter Java automatisk den indvirkede variabel til MIN_VALUE (mere præcist ser fejlmeddelelsen således ud: "Error reading int data, MIN_VALUE value returned.")
MIN_VALUE er som bekendt = -2147483648, og man kan dermed teste sin variable for bogstaver:
if(data<0) System.out.println("Ulovlig værdi indtastet...");
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