# Einsteiger-Aufgaben



## phon (11. Januar 2009)

Hallo, ich bin neu hier und lerne momentan mit JAVA zu programmieren.
Ich habe 2 Aufgaben bekommen, und weiß einfach nicht wie ich vorgehen soll. Vllt könnt ihr mir diesbezüglich einmal einpaar Tipps geben, wie ihr an Aufgaben die euch gestellt werden ran geht. Ich bin noch ein Einsteiger, als bitte keine komplizierten Anwendugen, ich kann bis jetzt nur die Datentypen und die Operatoren, kleinigkeiten...

Die erste Aufgabe wäre:
Es ist ein Brett geben mit 64 Feldern, 8x8. Auf dem ersten Feld ist ein Korn auf dem zweiten 2, dritten 4, usw... Also es verdoppelt sich immer. Nun möchte ich wissen, auf welchem Feld liegt Korn Nr. 100.000 (Beispiel) und ab welchem Feld liegen mehr als 1.000.000 Körner auf dem Brett.

Die zweite Aufgabe ist wie folgt: Vergleiche deinen Lotto-Tipp und Tv-Ziehung:
Habe ich einen 3er/4er/5er/6er

Es wäre wirklich entt wenn man die einzelnen Schirtte mir erklärt, und tipps dazu gibt, sodass ich euch das nächste mal nicht mehr fragen muss^^

Gruß


----------



## Kai008 (11. Januar 2009)

1) Gehe eine Schleife durch, nimm ne Zählvariable bei jeden Durchgang * 2 und eine ++.
Wenn die erste Variable z. B. >= 100 000 ist dann gibt die 2. Variables aus. Beginne bei eins und nicht bei null!

2) Kannst du so ähnlich machen, starte eine Schleife und gehe Array, Liste o.w.a.i. durch (for(int i = 0; i < list.size/array.lenght; i++)), darin eine 2. Schleife die die 2. Array/Liste durchgeht, und dann vergleichst du jedes mal das aktuelle Feld, wenn es equal bzw. == (je nachdem ob du primitive Typen verwendest) ist, erhöhst du ne Zählvar um 1.


----------



## phon (11. Januar 2009)

Hm, ich weiß es ist einfach, aber für mich ist Informatik bis jetzt bissl kompliziert, sorry dass ich da mal reinhacken muss. 

Wir haben bis jetzt einfahce Beispiele wie Grad Celsius in Grad Fahrenheit umrechnen, Geldautomat Ausgabe, und so einfache Dinge halt.

z.B:
import java.awt.*;
import java.applet.*;

public class Tagerechner extends Applet
{
  int zeit=777777;
  int jahre,monate,tage,zwert;
  public void paint(Graphics g)
  {
    jahre=zeit / 360;
    zwert=zeit % 360;
    monate=zwert / 30;
    tage=zwert % 30;
    g.drawString(zeit+" Tage entsprechen "+jahre+" Jahren, "+monate+" Monaten und "+tage+" Tagen", 20, 20);
  }
} 

Vllt kannste es noch bisschen vereinfachern.


----------



## Kai008 (11. Januar 2009)

Es ist ganz einfach. Hier der erste Source, den 2. kannst du dann hoffentlich alleine lösen. Dabei solltest du aber for's verwenden.
Ach ja, und rechne nicht in der Paint. Die sollte so schnell wie möglich durchlaufen.


```
package core;

public class Main
{
	public Main()
	{
		int i = 0;
		int j = 1;
		
		while(j < 1000000)
		{
			i++;
			j*= 2;
		}
		System.out.println("Am " + (i + 1) + ". Feld war das Millionste Korn. Dachte echt nicht, dass sich das wirklich auf nen Schachbrett ausgeht. ._.\"");
	}
	public static void main(String[] args)
	{
		new Main();
	}
}
```


----------



## phon (11. Januar 2009)

Hm tut mir leid, ich versteh zwar so bisschen die Schritte, bekomm es aber nicht in meinem Programm (RealJ) gebacken. Es kommen immer weitere Fehler...
Das Problem ist auch, dass wir noch keine Schleifen hatten, aber für diese Aufgabe braucht man es ja.
Mein Klassenkamerad und ich diskutieren gerade. Er hatte eine andere Lösung, bzw sieht auch einfach aus.

a = 1;
b = 0;
while( (a-1) < c)
{
b++;
a *= 2;
}

Müsst mir wohl oder übel doch anders helfen :-!


----------



## Kai008 (11. Januar 2009)

Wenn c die gesuchte Menge Korn ist, ist es doch quasi das selbe.
Ich erkläre dir einfach die Schleifen. Ist so wie die Geschichte mit dem Fisch: Isst du einen, bist du für heute satt, isst du eine ganze Palette bist du dein Leben lang satt.

Ganz easy, wie du vielleicht oder auch nicht weißt, kann ein booleanische Variable genau 2 Werte annehmen: 


```
int i = 5;
int j = 9;
boolean b = i < j;
System.out.println(b);
```
Output: "true";

Die booleanische Variable hat true angenommen, weil i eben kleiner als j ist. Wird sie definiert ist sie immer false.

Das brauchst du für eine Schleife:


```
int i = 5;
int j = 9;
while(i < j)
{
i++;
System.out.println("Schleifendurchlauf!");
}
System.out.println("Schleife durchgelaufen!");
```

In einer While (ich glaube dt. "während") wird immer eine booleanische Variable genommen (hier "i < j"), und sie durchgelaufen, solange es "true" ist.
Du könntest auch while(true) bzw. while(false) verwenden. Die erste rennt für "immer" durch, da sie immer true sein wird, die andere wird niemals abgearbeitet. Ist genauso wie eine if-Abfrage, nur dass er am Ende nicht einfach darunter weitermacht, sondern er zur if, die eigendlich eine while ist zurückspringt.

Und für die 2. könntest du noch for brauchen. Ist nicht notwendig, aber viel besser.


```
for(int i = 0; i < 5; i++)
{
System.out.println("Schleifendurchlauf! i ist " + i);
}
System.out.println("Schleife durchgelaufen!");
```

Hier gibt es 2 Anweißungen und eine Abfrage.
Das erste ist die Startanweißung. Diese ist optional, und wird beim Start der Schleife ausgeführt. Hier wird die Variable i deklariert und der Wert 0 verpasst.
Danach folgt die Prüfung, (geschrieben) in dieser wird wieder ein booleanischer Wert gezogen, hier läuft sie durch wenn i kleiner als 5 ist.
Das letzte ist die Durchlaufanweißung. Ebenfalls optional, was hier steht wird bei jedem Schleifendurchlauf gemacht. In dem Fall wird i um 1 erhöht.

Es gibt noch do, die ist wie while, nur das die Prüfung am Ende der Schleife stattfindet, d. H. sie rennt immer min. 1 mal durch.
In der Regel verwendet man for, wenn man genau sagen kann wie oft eine Schleife durchrennen soll, while für verschiedene andere Sachen, z. B. wenn ein Knopf gedrückt wird wird eine Variable auf true gesetzt, und eine Schleife rennt so lange durch, bis sie losgelassen wird, da die Variable wieder auf false gesetzt wird. Also muss man nur die Variable prüfen.

Versuchs mal, ist voll easy wenn mans einmal raushat.


----------



## phon (11. Januar 2009)

Hi respekt, super einfach erklärt genau so wollt ich es 
Ich weiß für dich ist es einfach, du hast es schon desöfteren gemacht, aber da ich es heute zum ersten Mal höre, war es bisschen komplex und wenn wir in der Schule es durchgehen weiß ich immerhin schon einbisschen was.
Noch eine Frage, für was gelten das i und j?


import java.awt.*;
import java.applet.*;

public class Korn extends Applet
{
	public void paint(Graphics g)
	{
		int a = 1, b = 0, c = 100000, d = 0; // a = Körner auf Feld, b = Feldnummer, c = Gesuchtes Korn, d = Anzahl der Körner
/*
		while(d < c)
		{
			b++;
			d += a;
			a *= 2;
		}			
*/

		a = 1;
		b = 0;
		while( (a-1) < c)
		{
			b++;
			a *= 2;
		}

		/*
		for(b = 0; (pow(2, b)-1) < c); b++);
		*/

		g.drawString("Korn "+c+" liegt auf Feld "+b, 20, 20);

	}
}	


Das ist jetzt ein Entwurf von einem Klassenkamerad sein Bruder, das versteh ich dann alles bis auf das for und pow


----------



## Kai008 (11. Januar 2009)

Gelten alle für paint. d. H. wenn das Ende der Klammern erreicht ist, werden die Variablen ungültig und werden beim nächsten Aufruf der Paint neu deklariert.

pow ist eine Methode, die eine Zahl hoch der anderen nimmt, z. B.


```
System.out.println(Math.pow(2, 7));
```
= 2 ^ 7 = 128.

for(b = 0; (pow(2, b)-1) < c); b++);

Bedeutet: Beim start wird b auf 0 gesetzt. Es wird so lange durchgelaufen, wie 2 ^ b kleiner als c ist, und b wird bei jedem durchgang um 1 erhöht. Abgearbeitet dabei wird nichts, da sie keinen body, also Klammern hat. So wird immer nur  der nächste Befehl zur Schleife dazugenommen, und das ist in dem Fall garnichts, da ja ein Semikomma danach steht. Aber ist eh auskommentiert, also wird sie nie abgearbeitet werden.

Ich finde meine Methode auf jedem Fall um einiges einfacher.

Ich würde dir aber empfehlen dafür eine eigene Methode zu schreiben, die init von Applet zu überschreiben, das Ergebniss am Ende an in eine Klassenvariable zu schreiben, und diese in der Paint auszugeben. Wie gesagt, paint sollte man sehr kurz halten. Könnte z. B. so aussehen (mit seinen Entwurf):


```
import java.awt.*;
import java.applet.*;

public class Korn extends Applet
{
	private int resultCorn;
	private int resultField;
	private static final long serialVersionUID = 1L;
	
	public Korn()
	{
		super();
	}
	public void init()
	{
		int cornOnFieldOne = 1;
		int firstFieldNumber = 0;
		int searchedCorn = 100000;
		int cornNo = 0;
		
		this.computing(cornOnFieldOne, firstFieldNumber, searchedCorn, cornNo);
		this.repaint();
	}
	private void computing(int a, int b, int c, int d)
	{
		while(d < c)
		{
			b++;
			d += a;
			a *= 2;
		}

		a = 1;
		b = 0;
		while((a-1) < c)
		{
			b++;
			a *= 2;
		}

		this.resultCorn = c;
		this.resultField = b;
	}
	public void paint(Graphics g)
	{
		if(this.resultCorn == 0 || this.resultField == 0)
			return;

		g.drawString("Korn " + this.resultCorn +
				" liegt auf Feld " + this.resultField,20,20);
	}
}
```

Fragen, dann fragen.


----------

