2014-11-29, 16:13
  #13
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av pkj
Alright men är inte säker på om vi ska lägga till egna metoder, utan bara fylla i liksom. Men du tror att det krävs att man skapar egna metoder som hanterar det du skrev om occupied och border not reached?
Implementationen är ovidkommande. Jag beskrev en algoritm för att avgöra om rutan (i,j) har något hot från en drottning i riktning (dx,dy). Hur du vill implementera det är upp till dig. Det går alldeles utmärkt att lösa det utan nya klassmetoder.
__________________
Senast redigerad av kinesarsle 2014-11-29 kl. 16:17.
Citera
2014-11-29, 16:29
  #14
Medlem
tj.s avatar
Citat:
Ursprungligen postat av pkj
Alright men är inte säker på om vi ska lägga till egna metoder, utan bara fylla i liksom. Men du tror att det krävs att man skapar egna metoder som hanterar det du skrev om occupied och border not reached?
Om du så vill kan du ju ha en funktion som har flera hundra rader kod, men det kommer vara väldigt svårt att namnge en sådan funktion, men framför allt kommer läsbarheten och vidarutvecklingspotentialen vara i princip obefintlig. Att skriva
[PHP]void someMethod() {
int someNumber = getInputFromUser();
System.out.println(isOdd(input));
}

bool isOdd(int value) {
return value % 2 != 0;
}

int getInputFromUser() {
//Gör något här...
}[/PHP]
kan du ju skriva i en enda stor funktion om du vill.
[PHP]void someMethod() {
int someNumber;
//Kod för att hämta input, validera att det är numeriskt
//osv, osv...
...
...
...

bool isOdd;
if (someNumber % 2 == 0)
isOdd = true;
else
isOdd = false;

..
..
..
System.out.println(isOdd);
}[/PHP]
Jag har ytterst svårt att tro att din lärare skulle ogilla att du väljer att bryta ner din logik i flera funktioner.
Citera
2014-11-29, 18:40
  #15
Medlem
Citat:
Ursprungligen postat av kinesarsle
Implementationen är ovidkommande. Jag beskrev en algoritm för att avgöra om rutan (i,j) har något hot från en drottning i riktning (dx,dy). Hur du vill implementera det är upp till dig. Det går alldeles utmärkt att lösa det utan nya klassmetoder.

Citat:
Ursprungligen postat av tj.
Om du så vill kan du ju ha en funktion som har flera hundra rader kod, men det kommer vara väldigt svårt att namnge en sådan funktion, men framför allt kommer läsbarheten och vidarutvecklingspotentialen vara i princip obefintlig. Att skriva
[PHP]void someMethod() {
int someNumber = getInputFromUser();
System.out.println(isOdd(input));
}

bool isOdd(int value) {
return value % 2 != 0;
}

int getInputFromUser() {
//Gör något här...
}[/PHP]
kan du ju skriva i en enda stor funktion om du vill.
[PHP]void someMethod() {
int someNumber;
//Kod för att hämta input, validera att det är numeriskt
//osv, osv...
...
...
...

bool isOdd;
if (someNumber % 2 == 0)
isOdd = true;
else
isOdd = false;

..
..
..
System.out.println(isOdd);
}[/PHP]
Jag har ytterst svårt att tro att din lärare skulle ogilla att du väljer att bryta ner din logik i flera funktioner.

Aa det är sant, ska göra det istället. Men kommer inte riktigt på hur if-satsen ska se ut i occupied metoden, för kommer inte på hur man ska nå square och board då de är privata. Jag tänkte if(board = new Square[x][y] där x och y är två ints som metoden tar som argument men det går inte.
Citera
2014-11-30, 00:54
  #16
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av pkj
Aa det är sant, ska göra det istället. Men kommer inte riktigt på hur if-satsen ska se ut i occupied metoden, för kommer inte på hur man ska nå square och board då de är privata. Jag tänkte if(board = new Square[x][y] där x och y är två ints som metoden tar som argument men det går inte.
Vad är problemet med privata variabler när det är en medlemsmetod?
Citera
2014-11-30, 10:23
  #17
Medlem
Citat:
Ursprungligen postat av kinesarsle
Vad är problemet med privata variabler när det är en medlemsmetod?

Hur menar du?
Citera
2014-11-30, 14:22
  #18
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av pkj
Hur menar du?
Jag läste lite fel, men vad skulle problemet vara med att accessa board?

if(board[i][j] == ...
Citera
2014-11-30, 22:53
  #19
Medlem
Citat:
Ursprungligen postat av kinesarsle
Jag läste lite fel, men vad skulle problemet vara med att accessa board?

if(board[i][j] == ...

Förstår lite bättre nu. Fixade occupied metoden men är inte helt hundra på hur borderNotReached ska se ut. Har du några tankar?

Kod:
import java.util.Random;

public class Queens {
	
	public enum Square {

		OCCUPIED ("X"), FREE (".");

		private String message ;

		private Square ( String message ){

		this . message = message ;

		}

		public String toString (){

		return message ;

		}

		}
	
	private Square[][] board;
	private int n;
	
	public Queens(int n)
	{
		this.n = n;
		board = new Square[n][n];
		resetBoard();
		setNewRandomPositioning();
	}
	
	private void resetBoard()
	{
		board = new Square[][]; // Reset the board
	}
	
	public void setNewRandomPositioning()
	{
		board = new Square[][]; //Reset the board
		Random r = new Random();
		n = r.nextInt(); // Fill with random
		board = new Square[n][n]; // Fills the board with n queens
	}
	
	
	private int countQueens()
	{
		int counter = n*n; // If you muliply n*n, you will get number of n in the board
		return counter;		
	}
	
	private boolean isThreatened(int i, int j, int dx, int dy)
	{
		
	}
	
	public boolean borderNotReached()
	{
		
	}
	
	public boolean occupied(int x, int y)
	{
		if(board[x][y] == Square.FREE)
		{
			return false;
		}
		
		return true;
	}

}
Citera
2014-11-30, 23:11
  #20
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av pkj
Förstår lite bättre nu. Fixade occupied metoden men är inte helt hundra på hur borderNotReached ska se ut. Har du några tankar?
Du vet ju hur stort brädet är. Alltså vet du vilka koordinater som är tillåtna. Det du ska göra är att se till att du inte undersöker om det står någon drottning på en ogiltig koordinat. Anledningen till att jag valde ordet "reached" är för att vi utgår från en ruta och stegar oss mot kanten. Vi vill alltså avbryta när vi kommer till kanten.
Citera
2014-12-01, 15:31
  #21
Medlem
Citat:
Ursprungligen postat av kinesarsle
Du vet ju hur stort brädet är. Alltså vet du vilka koordinater som är tillåtna. Det du ska göra är att se till att du inte undersöker om det står någon drottning på en ogiltig koordinat. Anledningen till att jag valde ordet "reached" är för att vi utgår från en ruta och stegar oss mot kanten. Vi vill alltså avbryta när vi kommer till kanten.

Okej men jag vet ju inte hur stort brädet är? Isåfall måste jag väl få ta något argument n.
Citera
2014-12-01, 19:14
  #22
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av pkj
Okej men jag vet ju inte hur stort brädet är? Isåfall måste jag väl få ta något argument n.
Du har ju en variabel i klassen Queens. Vad ska den vara om inte storleken på brädet?
Citera
2014-12-01, 21:37
  #23
Medlem
Citat:
Ursprungligen postat av kinesarsle
Du har ju en variabel i klassen Queens. Vad ska den vara om inte storleken på brädet?

Okej blir det såhär då ?

Kod:
import java.util.Random;

public class Queens {
	
	public enum Square {

		OCCUPIED ("X"), FREE (".");

		private String message ;

		private Square ( String message ){

		this . message = message ;

		}

		public String toString (){

		return message ;

		}

		}
	
	private Square[][] board;
	private int n;
	
	public Queens(int n)
	{
		this.n = n;
		board = new Square[n][n];
		resetBoard();
		setNewRandomPositioning();
	}
	
	private void resetBoard()
	{
		board = new Square[][]; // Reset the board
	}
	
	public void setNewRandomPositioning()
	{
		board = new Square[][]; //Reset the board
		Random r = new Random();
		n = r.nextInt(); // Fill with random
		board = new Square[n][n]; // Fills the board with n queens
	}
	
	
	private int countQueens()
	{
		int counter = n*n; // If you muliply n*n, you will get number of n in the board
		return counter;		
	}
	
	private boolean isThreatened(int i, int j, int dx, int dy)
	{
		int x = i;
		int y = j;
		while(borderNotReached())
		{
			x += dx;
			x += dy;
			if(occupied(x, y))
			{
				return true;
			}
			
			else
			{
				continue;
			}
		}
		
		return false;
	}
	
	public boolean borderNotReached()
	{
		if(n > n*n)
		{
			return false;
		}
		
		return true;
	}
	
	public boolean occupied(int x, int y)
	{
		if(board[x][y] == Square.FREE)
		{
			return false;
		}
		
		return true;
	}

}
Citera
2014-12-02, 01:07
  #24
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av pkj
Okej blir det såhär då ?
Nej, och nu börjar det se ut som att du frågar mig av ren bekvämlighet. Kör programmet. Jag kan se direkt att if(n>n*n) är helt felaktigt för det kommer alltid att vara falskt om man bortser från fel från overflow, men om du inte bemödar dig med att tänka igenom vad du gör och att köra programmet ser jag ingen som helst anledning att sitta och felsöka. Om programmet fungerar är det rätt. Annars inte.

Här har du ett exempel på kod med en klass som innehåller ett test för att testa sig själv. Kör den koden. Sedan tar du bort hela testfallet som är markerat och kör igen.

Kod:
// TestExample.java                                                                                                                  

// En punkt i rummet                                                                                                                 
class Point
{
    // Punktens koordinater                                                                                                          
    private final double x,y;

    public Point(double x, double y)
    {
        this.x=x;
        this.y=y;
    }

    public double distanceToOrigo()
    {
        return Math.sqrt(x*x+y*y);
    }

    public double distanceToPoint(Point point)
    {
        double dx=x-point.x;
        double dy=y-point.y;
        return Math.sqrt(dx*dx+dy*dy);
    }

    // Sundhetstest. Ordentliga tester bör vara mer heltäckande, men                                                                 
    // om de här testerna inte passeras är något allvarligt fel.                                                                     
    public static boolean test()
    {
        boolean passed = true;

        Point point1 = new Point(1.0, 0.0);
        Point point2 = new Point(-3.0, -4.0);
        if(point1.distanceToOrigo() != 1.0 ||
           point2.distanceToOrigo() != 5.0)
            {
                System.out.println("ERROR : Point.distanceToOrigo");
                passed = false;
            }

        Point point3 = new Point(-1.0, 0.0);

        if(point1.distanceToPoint(point3) != 2.0)
            {
                System.out.println("ERROR : Point.distanceToPoint");
                passed = false;
            }

        // Felaktigt testfall för att visa poängen. Ta bort det här så                                                               
        // passerar programmet testet.                                                                                               
        if(point1.distanceToOrigo() != 666.0)
            {
                System.out.println("ERROR!");
                passed = false;
            }
        // Ta bort hit ned                                                                                                           

        return passed;
    }
}

public class TestExample
{
    public static void main(String[] args)
    {
        if(Point.test())
            System.out.println("   OK");
    }
}
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in