Fei Skrivet 30 Maj 2009 Rapport Dela Skrivet 30 Maj 2009 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); } } Citera Länk till kommentar Dela på andra sajter More sharing options...
Vitdom Skrivet 30 Maj 2009 Rapport Dela Skrivet 30 Maj 2009 (redigerat) 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 30 Maj 2009 av Vitdom Citera Länk till kommentar Dela på andra sajter More sharing options...
Mezox Skrivet 30 Maj 2009 Rapport Dela Skrivet 30 Maj 2009 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 Citera Länk till kommentar Dela på andra sajter More sharing options...
Fei Skrivet 31 Maj 2009 Författare Rapport Dela Skrivet 31 Maj 2009 (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 31 Maj 2009 av Fei Citera Länk till kommentar Dela på andra sajter More sharing options...
PunkArne Skrivet 2 Juni 2009 Rapport Dela Skrivet 2 Juni 2009 (redigerat) Det effektivaste vore att göra en bitvis operation. if (sistaByten & 00000001) udda(); Redigerat 2 Juni 2009 av PunkArne Citera Länk till kommentar Dela på andra sajter More sharing options...
Vitdom Skrivet 3 Juni 2009 Rapport Dela Skrivet 3 Juni 2009 (redigerat) 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 3 Juni 2009 av Vitdom Citera Länk till kommentar Dela på andra sajter More sharing options...
Rekommendera inlägg
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.