Hoppa till innehåll

Hur Skriver Man En Kod Som Kollar Om Det Är Ett Jämt Eller Udda Tal?


Fei

Rekommendera inlägg

Jag har kört fast med grafiken. Programmet är på det viset att Ett fönster med två knappar; en där det står ”Slumpa ett tal”. Då använder jag en statisk metod(math.random). När jag trycker på den andra knappen åt höger där det står ”jämt eller udda”, kommer det fram om talet är ett jämt eller udda tal.

 

Koden jag skrivit hittills:

 

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class JämtEllerUdda extends JFrame implements ActionListener{

private JTextField tf1 = new JTextField(3);

private JTextField tf3 = new JTextField(10);

private JLabel label1 = new JLabel("Ditt tal ");

 

private JLabel label3 = new JLabel("är ");

private JButton addBT = new JButton("Slumpa");

private JButton addBT2 = new JButton("Jämt/Udda");

 

public JämtEllerUdda(){

setSize(400, 100);

setLayout(null);

setTitle("Jämt eller udda?");

setBackground(Color.pink);

setForeground(Color.black);

tf1.setBackground(Color.white);

 

tf3.setBackground(Color.white);

Panel p1 = new Panel();

p1.setLayout(new FlowLayout());

p1.add(label1);

p1.add(tf1);

 

p1.add(label3);

p1.add(tf3);

 

 

 

tf3.setEditable(false);

Panel p2 = new Panel();

p2.setLayout(new FlowLayout());

p2.add(addBT);

setLayout(new BorderLayout());

add("Center", p1);

add("South", p2);

addBT.addActionListener(this);

addBT2.addActionListener(this);

}

 

public void actionPerformed(ActionEvent e){

if(e.getSource() == addBT){

int num1= (int)(1+Math.random()*1000);

tf1.setText(String.valueOf(num1));

}

}

public actionPerformed(ActionEvent a){

if(a.getSource() == addBT2){

double num1=Double.parseDouble(tf1.getText());

while (num1!= 1){

Vad ska jag skriva här!!

 

}

double num3 = num1/3.6;

tf3.setText(String.valueOf(num3));

}

}

 

 

public static void main(String[] args){

JämtEllerUdda f = new JämtEllerUdda();

f.setVisible(true);

}

 

}

 

Länk till kommentar
Dela på andra sajter

För att kontrollera om ett tal är udda eller jämt är det ju bara och testa om talet är delbart med två, om det är delbart med två är det jämt.

 

Kod om du inte fattar:

int tal = x;
System.out.println("Talet är " + (tal % 2 == 0?"jämt!":"udda!"));

Redigerat av Vitdom
Länk till kommentar
Dela på andra sajter

Jag kan inte mycket om programmeringsspråket i fråga.

 

Men det finns ett antal sätt kan jag tänka mig:

 

1.Halvera talet.

2.Avrunda sedan resultatet till närmsta heltal.

Om det man får i 1. och 2. är lika så är talet delbart med 2 och alltså jämnt.

(OBS! detta kan skapa problem om variabeltypen endast kan hantera heltal)

 

--------------------------------------------------------

 

Du kan alternativt göra om slumpgeneratorn (inte så effektivt):

Om du t.ex. vill ha ett slumpmässigt heltal mellan 1 och 10 (och samtidigt veta om det är jämnt eller inte) så kan du göra på detta lite längre sättet:

1. Slumpa ett tal mellan 1 och 5, spara detta tal i variabeln n.

2. Slumpa ett tal 0 eller 1.

 

Om 2. var 0:

 

Så är ditt slumpmässiga tal 2n-1 (där n är det du fick i 1.) och talet är udda.

 

Annars (om 2. var 1):

 

Så är dit slumpmässiga tal 2n och talet är jämnt.

 

Inte så effektivt, men det funkar :P

Länk till kommentar
Dela på andra sajter

Skrivet (redigerat)

Nu har jag ändrat min kod, Tack så mycket för tipsen. Men nu har andra problem uppkommit; jag vet inte hur jag ska få programmet att skriva jämt eller udda i rutan, och knappen "jämt/Udda" syns inte när jag kör programmet

 

Koden hittills:

 

* @author Fei

*/

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class JämtEllerUdda extends JFrame implements ActionListener{

private JTextField tf1 = new JTextField(3);

private JTextField tf3 = new JTextField(10);

private JLabel label1 = new JLabel("Ditt tal ");

 

private JLabel label3 = new JLabel("är ");

private JButton addBT = new JButton("Slumpa");

private JButton addBT2 = new JButton("Jämt/Udda");

 

public JämtEllerUdda(){

setSize(400, 100);

setLayout(null);

setTitle("Jämt eller udda?");

setBackground(Color.pink);

setForeground(Color.black);

tf1.setBackground(Color.white);

 

tf3.setBackground(Color.white);

Panel p1 = new Panel();

p1.setLayout(new FlowLayout());

p1.add(label1);

p1.add(tf1);

 

p1.add(label3);

p1.add(tf3);

 

 

 

tf3.setEditable(false);

Panel p2 = new Panel();

p2.setLayout(new FlowLayout());

p2.add(addBT);

Panel p3 = new Panel();

p3.setLayout(new FlowLayout());

p3.add(addBT2);

setLayout(new BorderLayout());

add("Center", p1);

add("South", p2);

addBT.addActionListener(this);

addBT2.addActionListener(this);

}

 

public void actionPerformed(ActionEvent e){

if(e.getSource() == addBT){

int num1= (int)(1+Math.random()*1000);

tf1.setText(String.valueOf(num1));

if(e.getSource() == addBT2){

int num3= (tf1.getText());

if (num3 % 2 == 0){

"jämt"

}

else{

"udda"

}

tf3.setText(String.valueOf(num3));

 

}

}

 

}

 

 

 

 

 

public static void main(String[] args){

JämtEllerUdda f = new JämtEllerUdda();

f.setVisible(true);

}

 

}

Redigerat av Fei
Länk till kommentar
Dela på andra sajter

Hehe, det har du rätt i! Att jag inte har tänk på det förut. :D

 

Men i Java kan man inte skriva if (sistaByten & 00000001), man måste skriva if (sistaByten & 00000001 != 0). Java är skit...

 

Men om det är bättre beror på hur programmet översätts till maskininstruktioner.

Om jag skriver denna koden i C:

int main()
{
    int udda1 = 0;
    int udda2 = 0;
    
    for(int i = 0; i < 10; i++)
    {
        if(i % 2)
            udda1++; // Udda
        if(i & 1)
            udda2++; // Udda
    }
    
    return 0;
}

 

så genererar min kompilator(MinGW GCC 3.4.5) denna assemblerkod:

    movl    $0, -4(%ebp)
    movl    $0, -8(%ebp)
    movl    $0, -12(%ebp)
L2:
    cmpl    $9, -12(%ebp)
    jg    L3
    movl    -12(%ebp), %eax
    andl    $1, %eax; if(i % 2)
    testl    %eax, %eax; if(i % 2)
    je    L5
    leal    -4(%ebp), %eax
    incl    (%eax)
L5:
    movl    -12(%ebp), %eax
    andl    $1, %eax; if(i & 1)
    testb    %al, %al; if(i & 1)
    je    L4
    leal    -8(%ebp), %eax
    incl    (%eax)
L4:
    leal    -12(%ebp), %eax
    incl    (%eax)
    jmp    L2
L3:
    movl    $0, %eax
    leave
    ret

 

Som man nu kan se så är båda villkorssatserna identiska förutom att den ena(if(i % 2)) använder testl och if(i & 1) använder testb, men de har exakt samma körningstid i klockcyklar.

Redigerat av Vitdom
Länk till kommentar
Dela på andra sajter

Gå med i konversationen

Du kan skriva nu och registrera dig senare. Om du har ett konto, logga in nu för att posta med ditt konto.

Gäst
Svara på det här ämnet...

×   Klistrade in som rich text.   Klistra in som vanlig text istället

  Endast 75 emojis är tillåtet.

×   Din länk har automatiskt inbäddats.   Visa som en länk istället

×   Ditt tidigare innehåll har återställts.   Rensa redigeraren

×   Du kan inte klistra in bilder direkt. Ladda upp eller infoga bilder från URL.

×
  • Skapa ny...