Gå til innhold

Innlesing av valgfrie verdier i tabell


Anbefalte innlegg

Hvordan får jeg laget et program

der brukeren kan skrive inn valgfrie verdier (i mitt tilfelle fra 1-20) ,

og når brukeren gjør dette blir verdiene lagre i en tabell,

som programmet bruker seinere.

 

Jeg har en egen klasse for å lese inn tall allerede, så det trengs ikke informasjon om det.

Lenke til kommentar
Videoannonse
Annonse

Jeg vil at en bruker skriver tilfeldige tall på skjermen (mellom 1 og 20), og for hvert tall som blir lest inn blir det lagret i tabellen. Hvis han skriver 1, lagres det i den første "cellen" i tabelle, hvis han skriver 2 lagres det i den andre osv...

Lenke til kommentar
Hvordan får jeg laget et program

der brukeren kan skrive inn valgfrie verdier (i mitt tilfelle fra 1-20) ,

og når brukeren gjør dette blir verdiene lagre i en tabell,

som programmet bruker seinere.

 

Jeg har en egen klasse for å lese inn tall allerede, så det trengs ikke informasjon om det.

Hvor mange tall skal leses inn?

Er det like mange hver gang, eller vil det variere? Og er det en maks grense på hvor mange tall som kan skrives inn?

 

Hva skal det brukes til etterpå?

 

Er det et gitt antall verdier som skal leses inn, og dette ikke endrer seg, er vel det enkleste

int[] verdiene = new int[antVerdier];

for(int i = 0; i < antVerdier; i++){
verdiene[i] = innlesning.lesVerdi();
}

 

Men hvis du trenger ubegrenset plass, og ikke vet hvor mange tall som skal leses inn, er kanskje dette bedre

ArrayList verdiene = new ArrayList();
int verdi = innlesning.lesVerdi();
int i = 0;
while(verdi != 99){
verdiene.add(i, new Integer(verdi));
i++;
verdi = innlesning.lesVerdi();
}

 

Hvor da innlesning.lesVerdi() er din klasse for å hente inn verdiene.

I det siste forslaget må brukeren skrive inn 99 for å avslutte innlesningen.

 

Har ikke forsøkt å kompilere disse, så det kan være noen feil her og der...

Lenke til kommentar
Jeg vil at en bruker skriver tilfeldige tall på skjermen (mellom 1 og 20), og for hvert tall som blir lest inn blir det lagret i tabellen. Hvis han skriver 1, lagres det i den første "cellen" i tabelle, hvis han skriver 2 lagres det i den andre osv...

Mener du at hvis brukeren skrev inn 6, så skal det plasseres på sjette plass i "tabellen"?

Skjønner ikke vitsen med dette, kunne du forklart litt mer?

Lenke til kommentar

Jeg ser at det kan være vanskelig å skjønne hvor eg vil hen :-)

 

Men her kommer HELE spørsmålet eg prøver å løse!

 

Oppgave

Vi skal lage et program som simulerer livet til cellene i en organisme. Organismen består av ikke mer enn 20 celler som hver hører til i en entydig posisjon. Hver celle er enten død eller levende, og programmet skal vise hvordan cellelivet utvikler seg over en tid når det følger disse reglene:

 

1. En celle lever hvis den i forrige periode var dld, mens den hadde nøyaktig en levende nabocelle.

 

2.En celle lever hvis den levde i forrige periode, mens den hadde ne død nabocelle over.

 

3. Den er død hvis 1 eller 2 ikke er oppfylt.

 

Programmet skal lese inn antall celler og antall perioder simuleringen skal gjøre. opptil 60 perioder

 

Deretter skal bruker oppgi hvilke celler som i utgangspunktet er i livet.

 

Så skal programmet skrive hvordan cellene utvikler seg videre i periodene.

 

Her er hele problemstillingen, og ja, det er en innleveringsoppgave.

Hjelp mottaes med evig takknemlighet :-)

Lenke til kommentar
Jeg ser at det kan være vanskelig å skjønne hvor eg vil hen :-)

 

Men her kommer HELE spørsmålet eg prøver å løse!

 

Oppgave

Vi skal lage et program som simulerer livet til cellene i en organisme. Organismen består av ikke mer enn 20 celler som hver hører til i en entydig posisjon. Hver celle er enten død eller levende, og programmet skal vise hvordan cellelivet utvikler seg over en tid når det følger disse reglene:

 

Her er hele problemstillingen, og ja, det er en innleveringsoppgave.

Hjelp mottaes med evig takknemlighet :-)

Hehe, ok, da ble det litt mer forståelig...

 

Har du vært borti grafer/lenkede lister?

 

Jeg ville nok laget et objekt pr celle, med pekere til evt. naboceller. Da kan du lettere lagre informasjon om cellen er i live, eller ikke, hvilke naboer cellen har etc.

Du kan enten lagre det som en graf eller en 2 dimensjonal array med Celle objekter.

 

Det er ihvertfall hvordan jeg ville angrepet problemet.

 

Et tips kan også være å lage et UML diagram så du får visualisert hvordan du best koder det.

 

 

Og realt av det å si at det er en innleveringsoppgave. Hvis du sitter fast, er det bare å spørre videre, men kom da helst med det du har prøvd fra før, slik at vi hjelper deg med din kode, i steden for at du kopierer vår...

Endret av Mr.Garibaldi
Lenke til kommentar

Det er her mye av problemet ligger. Grafer/lenkete lister ligger lengre framme i pensum. Vi har såvidt begynt å lage programmer med flere en bare main-klassen, og dette programmet skal i utgangspunktet bare være en main-klasse.

 

Og eg står BOM-fast. Prøver å få lest inn de cellene som skal leve i utgangspunktet, men eg skjønner ikke hvordan eg skal få lagt de inn i tabellen. Skjønner heller ikke helt hvordan eg skal komme videre derifram men der tror eg at eg skal bruke en god del "if/else"-setninger.

 

Noen flere hint som kan hjelpe meg videre... Kommer ikke videre når eg leser i boken no... :(

Lenke til kommentar

Ok, hvis jeg forstår det riktig, trenger det ikke være alt for vanskelig...

Det kan være lurt å tegne det opp på papir for å lettere se hvordan det vil utvikle seg...

 

Hvordan prøver du å lese det inn i tabellen?

 

Post koden din her, husk [ code ] [ /code], så kan vi fortelle hva som er feil/tips til å fikse det...

 

Har du en link til selve oppgaven/kurset forresten? Er litt lettere å forklare når man vet hva du har lært, og hva dere ikke har gjennomgått enda....

Lenke til kommentar

Her e mitt gale forsøk

 

[ int tab [][] = new int [antceller][antperioder];

 

System.out.println("Gi posisjonene til cellene som lever i første periode \n(avslutt med posisjon < 1 eller > 20)");

int vekst = Terminal.lesInt();

 

while (vekst > 1 && vekst < 21);{

tab [vekst] = Terminal.lesInt[];]

 

Der Terminal er klassen for å lese inn. Der eg har deklarert antceller og antperioder fra før.

 

Alt jeg får er en errormelding.

 

Og så prøver eg å skrive ut tabellen og. Sånn at eg ser hvordan den ser ut.

 

Her er linken til kurset.

http://www.ii.uib.no/~dag/inf100/2005/index.html

Og her ser du hvor langt vi er kommet. (Nesten ihvertfall men i forhold til denne oppgaven)

http://www.ii.uib.no/~rolfwr/bookweb/moin....erial_fra_boken

Lenke til kommentar

Ok, men det er ikke så rart at det ikke fungerer....

 

int tab [][] = new int [antceller][antperioder];
Terminal term = new Terminal();
System.out.println("Gi posisjonene til cellene som lever i første periode \n(avslutt med posisjon < 1 eller > 20)");
int vekst = term.lesInt();

while (vekst > 1 && vekst < 21){
tab [vekst] = term.lesInt();
vekst = term.lesInt();
}

 

La til Terminal term = new Terminal(); da det er en bedre løsning (hvis ikke eneste, litt avhengig av hvordan Terminal er laget).

 

La også til vekst = term.lesInt(); da du ellers ville lagt fått en rar forsyvning av tabellen...

 

Ellers rettet jeg opp noen feil, men de ser du nok..

 

 

Neste gang kan det lønne seg å lese feilmeldingene, da de er veldig spesifikke, og ofte forteller deg hva som er galt...

 

[EDIT]

Typo.

 

Pluss, nå godtar den kun verdier fra 2 til 20. Hvis du vil ha med en må du enten sette

while(vekts > 0 && vekst < 21) eller while(vekst >=1 && vekst < 21);

[/EDIT]

Endret av Mr.Garibaldi
Lenke til kommentar

Jeg får denne feilmeldingen

 

[ code ]

C:\Documents and Settings\Jan Hovden Eide\Mine dokumenter\Java>javac dia.java

dia.java:11: Terminal() has private access in Terminal

Terminal term = new Terminal();

^

dia.java:16: incompatible types

found : int

required: int[]

tab [vekst] = term.lesInt();

^

2 errors

 

[ /code]

 

Terminal - klassen godtar det tydeligvis ikke.

 

Noen som kan hjelpe?

Lenke til kommentar
Jeg får denne feilmeldingen

 

 
C:\Documents and Settings\Jan Hovden Eide\Mine dokumenter\Java>javac dia.java
dia.java:11: Terminal() has private access in Terminal
Terminal term = new Terminal();
               ^
dia.java:16: incompatible types
found   : int
required: int[]
tab [vekst] = term.lesInt();
                        ^
2 errors

 

Terminal - klassen godtar det tydeligvis ikke.

 

Noen som kan hjelpe?

Så dropp endringen jeg gjorde med Terminal, og gå tilbake til

tab[vekts] = Terminal.lesInt();

som du hadde originalt...

 

Gjør endringen alle steder jeg brukte "term".

Kompiler, og se hva som skjer...

 

 

[EDIT]

Og

 taggene skal ikke ha mellomrom i seg...

[/EDIT]

Endret av Mr.Garibaldi
Lenke til kommentar

Metodene i Terminal er statiske, det er derfor de aksesseres med Terminal.metode().

 

Morsom oppgave, som ble min påskemoro. Jeg skjønte ikke helt regel nr 2, så den er litt tvilsom. Det er ikke egnet for å se etter pga stygg kode.

 

Status lagres i tabellen Boolean status[]. True/blå for levende og false/rød for død.Kunne lagt til en ekstra dimensjon for å lagre gamle verdier.

 

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerListModel;
import javax.swing.WindowConstants;

public class Data implements ActionListener {
private Boolean[] status;
private Firkant[] firkanter;
private JPanel toppen = new JPanel();
private JPanel midten = new JPanel();
private JPanel bunnen = new JPanel();
private JSpinner spinn;
private int antall;
private JPanel hoved = new JPanel(new BorderLayout());

public static void main(String[] args) {
 new Data();
}
public Data(){
 ArrayList<Integer> valg = new ArrayList<Integer>();
 for (int i = 0; i < 60; i++){
 	valg.add(i);
 }
 SpinnerListModel sm = new SpinnerListModel(valg);
 spinn = new JSpinner(sm);
 JFrame hov = new JFrame("Simulering");
 hoved.add(toppen.add(spinn), BorderLayout.NORTH);
 JButton start = new JButton("Start");
 JButton step = new JButton("Step");
 start.addActionListener(this);
 step.addActionListener(this);
 midten.add(step);
 midten.add(start);
 hoved.add(midten, BorderLayout.CENTER);
 hov.add(hoved);
 hov.setSize(new Dimension(500,500));
 hov.setVisible(true);
 hov.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 System.out.println("hit");
}

public void actionPerformed(ActionEvent arg0){
 if (((JButton) arg0.getSource()).getText().equals("Start")){
 	toppen.setVisible(false);
 	((JButton) arg0.getSource()).setEnabled(false);
 	antall = (Integer)spinn.getValue();
 	bunnen.add(Box.createRigidArea(new Dimension(100,50)));
 	status = new Boolean[antall];
 	firkanter = new Firkant[antall];
 	for (int i = 0; i < status.length; i++){
   status[i] = false;
   firkanter[i] = new Firkant(i);
   bunnen.add(firkanter[i]);	
 	}
 	/* Lager firkanter */
 	bunnen.setLayout(new BoxLayout(bunnen, BoxLayout.LINE_AXIS));

 	hoved.add(bunnen, BorderLayout.SOUTH);
 	hoved.validate();
 
 } else{
 	oppdater();
 }
}

private void oppdater() {
 Boolean[] forrige = status.clone();

 for (int i = 0; i < forrige.length; i++){
 	Boolean venstre = false;
 	Boolean høyre = false;
 	try{
   venstre = forrige[i-1];
 	} catch (ArrayIndexOutOfBoundsException ai){
   System.err.println("Første har ingen til venstre for seg");
 	}
 	try{
   høyre = forrige[i+1];
 	} catch (ArrayIndexOutOfBoundsException ai){
   System.err.println("Siste har ingen til høyre for seg");
 	}
 	
 	if (forrige[i] == false){  // tilfelle 1
   if (venstre ^ høyre){  
   	status[i] = true;
   	firkanter[i].settLevende();
   }    
 	} else if (forrige[i] == true && høyre == true){ // tilfelle 2
   status[i] = true;
   firkanter[i].settLevende();
 	} else {	//tilfelle 3
   status[i] = false;
   firkanter[i].settDau();
 	}

 }
 for (Boolean b: status){
 	System.out.println(b);
 }
}

private void dataDau(int i) {
 status[i] = false;  
}

private void dataLevende(int i) {
 status[i] = true;  
}

class Firkant extends JPanel{
 Color farge = Color.RED;
 int ins;
 Firkant(int i){
 	this.ins = i;
 	setSize(20,20);
 	addMouseListener(new MouseAdapter(){
   private int in = ins;

   public void mouseClicked(java.awt.event.MouseEvent arg0){
   	if (farge == Color.BLUE){
     farge = Color.RED;
     dataDau(this.in );
     settDau();      
   	} else{
     farge = Color.BLUE;
     dataLevende(this.in );
     settLevende();
   	}
   }
 	});
 }  
 @Override
 protected void paintComponent(Graphics arg0) {
 	super.paintComponent(arg0);
 	arg0.setColor(farge);
 	arg0.clearRect(0,0,20,20);
 	arg0.fillRect(0,0,20,20);
 }
 
 void settDau(){
 	farge = Color.RED;
 	repaint();
 }
 void settLevende(){
 	farge = Color.BLUE;
 	repaint();
 }
}
}

Endret av buskmann
Lenke til kommentar
  • 3 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...