Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Verständigungsproblem einer Angabe » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
eulerscheZahl

Hm, das habe ich übersehen unglücklich
Danke für die Rückmeldung.
Shizmo

Hmm interessant du hast recht, allerdings lag der Fehler wo anders.

Das Problem lag an add & div der DNA-Klasse, hier mal die add:

Vorher:
code:
1:
2:
3:
4:
	public Vector add(Vector v){
		this.dna = this.dna + ((DNA)v).dna;
		   return this;
		}

Jetzt:
code:
1:
2:
3:
	public Vector add(Vector v){
		   return new DNA(this.dna + ((DNA)v).dna);
		}


Dadurch, dass ich es zwischengespeichert habe, hat es beim mehreren Aufrufen von add und average zu Fehlergebnissen gefuehrt. Mit direktem Return hat es funktioniert.

Vielen Dank nochmal fuer deine Hilfe!!
eulerscheZahl

Mal ein einfaches Beispiel:
du willst GTAGC mit div(2) aufrufen.
Die Länge ist 5, also muss erst das C am Ende gestrichen werden: GTAG, sodass dann G,A unt T,G verglichen werden. Du willst für das erste Zeichen G,A,C vergleichen, was zu einem C führt.
Shizmo

Kommt exakt der selbe Fehler:

code:
1:
2:
3:
4:
>> Expected result <<
CGATGCGGAT TGAGCTAAGG TGCCACTGAC 
>> Your result <<
CGAGCCGGGG TGAGCTAAGG TGCCACTGAC 


//: Aber j wird ja immer um einen Teiler von n erhöht, dass heißt erst zählt es die:
Zitat:
CGATGCGGATTGAGCTAAGG

dann die:
Zitat:
CGATGCGGATTGAGCTAAGG

usw.

Also es zählt alle Zeichen an der "ersten" Stelle, dann an der zweiten, etc.
Also sollte es so schon passen oder?
eulerscheZahl

Weil du weitere Zeichen mitzählst, die du abschneiden sollst.
Versuche mal j < dna.length()/n*n
Shizmo

Hmm warum, es soll ja alle Zeichen "dividen".

Das Problem ist ja:
code:
1:
2:
3:
4:
>> Expected result <<
CGATGCGGAT TGAGCTAAGG TGCCACTGAC 
>> Your result <<
CGAGCCGGGG TGAGCTAAGG TGCCACTGAC


Ich würd gern wissen, warum nur der erste String anders ist, bei allen möglichen Beispielen die mir einfallen funktioniert dieses div ja wunderbar... verwirrt
eulerscheZahl

Deine lange ODER Verkettung könntest du weglassen, wenn du darüber einfach ein <= nimmst. Trotzdem scheint dein ODER richtig.
code:
1:
2:
for (int i = 0; i < dna.length() / n; i++) {
	for (int j = i; j < dna.length(); j = j + dna.length() / n) {

Damit geht j bis zum allerletzten Zeichen von dna. Du solltest das Ende aber einfach ignorieren, wenn es nicht aufgeht.
Shizmo

Vielen Dank schon mal.

Hab leider doch noch eine Fehlermeldung zum Teil 1 bekommen, allerdings kann ich damit nichts anfangen, vielleicht fällt dir was auf:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
> java -classpath '/tmp/autoc-einfprog-0.5.5-33-g6ad7fba-plus/check-62-12-1453052244' -Duser.language=EN -Duser.region=US -Xmx512M Tester

Wrong result(s) detected. Please check your calculations and compare them to the test calculations below!
Part 1 not passed!
Exception in thread "test" java.lang.Exception: 

Part 1

Calculated the following things:

VectorSet vs_dna = new VectorSet(40);
DNA dna = new DNA("CGATGCGGAT");
vs_dna.add(dna);
String result = vs.toString();
Vector v = vs_dna.average();

[Ausführungsprotokoll gekürzt]

String result = v.toString();
DNA dna = new DNA("TGCCACTGAC");
vs_dna.add(dna);
String result = vs.toString();

Error while calling String result = vs.toString()

>> Expected result <<
CGATGCGGAT TGAGCTAAGG TGCCACTGAC 
>> Your result <<
CGAGCCGGGG TGAGCTAAGG TGCCACTGAC 

Info: Take care of the right number of blanks! (like in the assignment)

at test.checkValue(test.java:379)
at test.run(Unknown Source)


Hier die DNA:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
public class DNA extends Vector {
	
	//Instanzvariablen
	private String dna;
	
	//Konstruktor
	public DNA(String dna){
		this.dna = dna;
	}
	
	//add - Verknuepft zwei Strings
	public Vector add(Vector v){
		this.dna = this.dna + ((DNA)v).dna;
		   return this;
		}
	
	//div - Teilt die Strings durch n
	public Vector div(int n){
		String newDNA = "";
		//1.Schleife baut neue DNA
		for(int i = 0; i < dna.length()/n; i++){
			int c = 0, g = 0, a = 0, t = 0;
			//Teilt die Strings durch n und zaehlt die Basen
			for(int j = i; j < dna.length(); j=j+dna.length()/n){
				if(dna.charAt(j) == 'C'){ c++;}
				else if(dna.charAt(j) == 'G'){ g++; }
				else if(dna.charAt(j) == 'A'){ a++; }
				else if(dna.charAt(j) == 'T'){ t++; }
			}
			//Welche Base kommt am haeufigsten vor
			if(c>g && c>a && c>t){ newDNA = newDNA+"C";	}
			else if(g>c && g>a && g>t){ newDNA = newDNA+"G"; }
			else if(a>c && a>g && a>t){ newDNA = newDNA+"A"; }
			else if(t>c && t>a && t>g){ newDNA = newDNA+"T"; }
			//Wenn Basen gleich haeufig auftreten
			else if((c==g && c>a && c>t) || (c==a && c>g && c>t) || (c==t && c>g && c>a) || (c==a && c==g && c>t) || 
					(c==a && c==t && c>g) || (c==t && c==g && c>a) || (c==a && c==g && c==t)){ newDNA = newDNA+"C"; }
			else if((g==a && g>c && g>t) || (g==t && g>c && g>a) || (g==a && g==t && g>c)  ) { newDNA = newDNA+"G"; }
			else if(a==t && a>g && a>c) { newDNA = newDNA+"A"; }
		}
		this.dna = newDNA;
		return this;
	}
	
	//distance - Zaehlt die Hammingdistanz
	public double distance (Vector v){
		int hd = 0;
		//Falls die Strings unterschiedlich lang sind.
		if(this.dna.length() != ((DNA)v).dna.length()){
			return -1;
		}
		//Zaehler
		for(int i = 0; i < this.dna.length(); i++){
			if(this.dna.charAt(i) != ((DNA)v).dna.charAt(i)){
				hd++;
			}
		}
		return hd;
	}
	
	//toString
	public String toString(){
		return dna;
	}
}


Und hier die VectorSet:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
public class VectorSet {
	
	//Instanzvariablen
	int size;
	Vector[] set;
	
	//Konstruktor
	public VectorSet (int size){
		this.size = size;
		set = new Vector[size];
	}
	
	//add - Fuegt die Vectoren nacheinander in ein Array
	public void add (Vector v){
		for(int i = 0; i < size; i++){
			if(set[i] == null){
				set[i] = v;
				break;
			}
		}
	}
	
	//average - add und div Methode vom jeweiligen Vector
	public Vector average(){
		Vector v = new Vector();
		int realSize = 0;
		for(int i = 0; i < set.length; i++){
			if(set[i] != null){
				v = v.add(set[i]);
				realSize++;
			}
			else{
				break;
			}
		}
		return v.div(realSize);
	}
	
	public VectorSet cluster(int n){
		return this;
	}
	
	//toString
	public String toString(){
		String output = "";
		for(int i = 0; i < set.length; i++){
			if(set[i] == null){
				break;
			}
			else{
				output  = output+set[i].toString()+" ";
			}
		}
		return output;
	}
	
}
eulerscheZahl

Ich sortiere mal ints. Wenn du Vector2D nimmst, ändert sich die Abstandsberechnung natürlich.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		int[] c = new int[x.length];
		boolean[] used = new boolean[c.length];
		c[0] = x[0];
		used[0] = true;
		for (int i = 1; i < c.length; i++) { //finde Wert für c[i]
			//initialisieren: Referenzwert als bisheriges Optimum berechnen
			int bestIndex = 1;
			while (used[bestIndex])
				bestIndex++; //finde ersten ungenutzten Wert
			int bestDist = 0;
			for (int j = 0; j < i; j++) {
				bestDist += Math.abs(x[i] - c[j]); //hier musst du eine Wurzel ziehen
			}
			//andere Werte prüfen
			for (int k = bestIndex + 1; k < c.length; k++) {
				if (used[k])
					continue; //schon benutzt, scheidet also aus.
				int currentDist = 0;
				for (int j = 0; j < i; j++) {
					currentDist += Math.abs(x[k] - c[j]);
				}
				if (currentDist > bestDist) {
					bestDist = currentDist;
					bestIndex = k;
				}
			}
			used[bestIndex] = true;
			c[i] = x[bestIndex];
		}
		System.out.println(Arrays.toString(c));
	}
}
Shizmo

1 hab ich, ja.

Ich weiß nicht mal wie ich anfangen sollte, Pseudocode würde mir auch schon viel helfen.
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.