29. november 2007 - 22:41Der er
6 kommentarer og 3 løsninger
Basis løkke-problem, tjekke om int værdi er under 0
I mit program har jeg følgene problem, i programmet er der en calculate metode der kan blive givet en integer værdi med (kaldet a), den første ting den gør er at tjekke om a er under 0 med (a < 0) {....}
Dette virker dog ikke og den går, videre i løkken. Hvorfor er så det store spørgsmål?
Her er koden hvis der er nogen der kan bruge det: (gid eksperten var bedre til kode)
/** * CubeRootInvariant.java * @author carbonic * A gui with an inputfield, a output field and a calculate button * Takes a number in the inputfield and gives the square root * in the output field when you press the button. */ public class CubeRootInvariant { private static String result; static JTextField inputField = new JTextField(20); static JTextField outputField = new JTextField(20);
/** * @param args * takes no arguments */ public static void main(String[] args) {
JFrame frame = new JFrame();
final int FIELD_WIDTH = 20; final JTextField inputField = new JTextField(FIELD_WIDTH); final JTextField outputField = new JTextField(FIELD_WIDTH); outputField.setText("Result"); inputField.setText("");
/*/ * Method that takes an integer value and sets the "result" * private variable to the square root of that number */ public static void calculate(int a) { // Way better method: // wax =(int) Math.pow(a, 0.1e1 / 0.3e1);
//*************Don't work******************** if (a < 0) { result = "Negative values = Big nono"; } //******************************************* if (((a < 1) && ( a > -1))) { result = "0"; } else { int temp; temp = 1; // r^3 <= a < (r+1)^3 while (!((temp * temp * temp <= a) && (a < ((temp + 1) * (temp + 1) * (temp + 1))))) { temp++; } result = Integer.toString(temp); } } }
Du bør dog overveje at ændre calculate() til at returenere en string (værdien du nu gemmer i "result") i stedet for void. Det giver en bedre programlogik.
variablen a er en int værdi. dvs den kan kun indeholde heltal. så ((a < 1) && ( a > -1)) er det samme som ( a == 0 ) så reelt har du 3 separate situationer hvor kun en er korrekt når programmet kommer dertil
if ( a < 0 ) { // a er mindre end 0 result = "Negative values = Big nono"; } else { if ( a == 0 ) { // a er 0 result = "0"; } else { // så må a være større end 0 int temp; temp = 1; // r^3 <= a < (r+1)^3 while (!((temp * temp * temp <= a) && (a < ((temp + 1) * (temp + 1) * (temp + 1))))) { temp++; } result = Integer.toString(temp); } // afslutter indre if-sætning } // afslutter ydre if-sætning
1) Jeg mener at metode bør returnere en int eller smide en exception.
2) Kubik rødder af negative tal er mulige, så ingen grund til at teste for negativ. Kvadrat rødder af negative tal er ikke mulige (indenfor reelle tal).
Mange tak for de gode svar, skriv endelig et svar herinde alle 3 og i får alle point.
Dog flest til: -nielle som svarede direkte på problemet
Lidt mindre til: -jakoba som mere indirekte viste problemet med løkken ved at lave en ny, og påpegede at jeg kunne bruge ==, hvilket jeg dog generelt prøver at undgå da denne måde kun sammenligner referencer (hvilket dog vil virke her) og ikke værdier, og dette venter jeg med at være glad for at bruge til jeg bliver lidt mere sikker i hvad jeg laver.
Lige en kommentar til "da denne måde kun sammenligner referencer". Der har du misforstået noget. Det er lidt mere indviklet end som det.
Det handler om objekter versus værdier.
en variabel af typen int er en værdi og når du sammenligner 2 int vil det ALTID være værdierne der sammenlignes hvadenten du bruger >, <, ==, !=, >= eller <=. ALTID
en variabel af typen Integer er et objekt. dvs en beholder (objektet) der indeholder en værdi (af typen int). så hvis du har Integer a, b; og sammenligner med ( a == b ) så er det beholderne (referencen) der sammenlignes. Det gælder også hvis du anvender en af de andre sammenlignings operatorer (>, <, !=, >= eller <=) så hvis du vil sammenligne værdier indeholdt i et objekt må du specifikt fortælle at det er værdien du snakker om og ikke beholderen eg: ( a.valueOf() == b.valueOf() )
Der misforståelsen ofte kommer fra er strenge som Java jo per definitioner altid gemmer som objekter med en værdier indeni, og som nybegynderen så prøver at sammenligne somom de var værdier String a = "abc", b = "abc"; if ( a == b ) //duer ikke fordi den sammenligner beholderne if ( a.equals( b ) ) //sammenligner indholdet, så den duer
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.