# Hilfe bei Feldern, "Schnitzeljagd" von Einträgen



## Enorion (7. Nov 2017)

Hallo zusammen,

ich hab hier ein Übungsblatt, das schon letzte Woche bewertet wurde. Hier hab ich nur die ersten 2 Aufgaben lösen können. Da ich aber jetzt immer noch nicht (Auflösung findet morgen früh statt) die Lösung verstehe, bzw. soweit bin das ich es alleine hinkriege, möchte ich hier fragen ob Ihr mir auf die Sprünge helfen könnt.

Also wie oben erwähnt. Aufgabe 3 und 4 macht mir Probleme bei der Herangehensweise.. Also bsp Aufg 3, verstehe nicht ganz wie ich den Zaehler zuordnen muss, damit er auch wirklich "wie oft" zählt.

Tipps, Tricks wie gehe ich an sowas heran..?

Soweit ist mein "Code" bisher, wobei der "richtige Vergleich der Zahlen" hier schon angegeben worden ist. Also aus dem Zaehler muss ich irgendwas bauen, damit es auch wirklich zählt "wie oft" denn der Inhalt des Feldes mit dem Index übereinstimmt. Liege ich da soweit richtig?
Ab dann bin ich irgendwie mit dem Problemlösen überfordert.. Gibt es eine Grundlegende Herangehenweise die man irgendwie anwenden kann?


```
public class Aufgabe3 {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int index;
        int anzahl;
        int[] feld;
        int zaehler;
   
           anzahl = sc.nextInt();
           feld = new int [anzahl];
      
           index = 0;
      
            while ( index < anzahl )
          {
         
           feld[index] = sc.nextInt();
           index = index + 1;
     
           }
     
           index = 0;
           zaehler =
              
          while (index < anzahl)
          {
        
              if (feld[index] == index)
                      {
                          System.out.print(zaehler + " ");
                          }
                      index = index + 1;
    }
    }
}
```


----------



## Robat (7. Nov 2017)

Du hast es doch schon fast? 
Initialisier deine Variable `zaehler` mit 0 und jedes mal wenn `feld[index]==index` erhöhst du deinen Zähler um 1.


----------



## Enorion (7. Nov 2017)

Robat hat gesagt.:


> Du hast es doch schon fast?
> Initialisier deine Variable `zaehler` mit 0 und jedes mal wenn `feld[index]==index` erhöhst du deinen Zähler um 1.




Das ich dem ganzen nahe bin war mir klar^^....  und jetzt hab ichs!!!  danke für den kommi.. Zaehler auf 0 setzten.. Ab dann ging es einfach haha... Ich hab mir hier irgendwas viel viel zu kompliziert gedacht ^^. 
Danke dir!


Eine andere Frage, vielleicht auch an andere Informatik Studenten von euch:

Ist das normal, das man sich an sowas stunden schon aufhängen kann? Oder bin ich was programmieren angeht ehr schlecht? Mir kommen die Übungen immer so "leicht" vor, wenn man es mal gelöst hat. Aber bis man es gelöst hat, probiert man immer erst ziemlich viel. Und bei so einfachen Aufgaben, habe ich an der ein oder anderen Aufgabe schon ein paar Stunden gehangen. Also erstes Übungsblatt laut Prof 1h bearbeiten. Ich = 4h. Zweites höre ich morgen mal.. aber er meinte mal so in etwa 3-4h das nächste Blatt. Ich wiederum hab 9h investiert, wobei 3-4h davon NOCHMALS Vorlesung anschauen war(haben online  die Aufnahme der Vorlesungen hochgeladen ).


Ich kann so Aufgaben am ehesten als "Knobeln" einordnen. Ist genau das gewollt bzw. normal? 
Bin ich sehr langsam? Oder ist das sogar normal und wird besser mit der Zeit?
So als Fragen am Rande... 


Hier meine Lösung zu 3 für kommende:


```
public class Aufgabe3 {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int index;
        int anzahl;
        int[] feld;
        int zaehler;
       
           anzahl = sc.nextInt();
           feld = new int [anzahl];
          
           index = 0;
          
            while ( index < anzahl )
          {
             
           feld[index] = sc.nextInt();
           index = index + 1;
         
           }
         
           index = 0;
           zaehler = 0;
          
          while (index < anzahl)
          {
            
              if (feld[index] == index)
                      {  
                  zaehler = zaehler + 1;
                          }
              index = index + 1;
              }
         System.out.println(zaehler);
    }
```


----------



## Robat (7. Nov 2017)

Was ist schon normal und was ist nicht normal 

Grundsätzlich ist erstmal wichtig dass dir das programmieren Spaß macht und du die Lust nicht verlierst. Was man sagen kann, ist das 3-4h recht lange für so eine Aufgabe sind. Wenn du übst und dran bleibst solltest du aber schnell merken das es besser wird.
Das kommt natürlich auch drauf an, was du schon für Erfahrungen mit anderen Sprachen hast. Wenn du komplett neu bist kann das sicherlich ein bisschen dauern bis man das richtige Denken entwickelt.


----------



## Javinner (7. Nov 2017)

Enorion hat gesagt.:
			
		

> Bin ich sehr langsam?





			
				Robat hat gesagt.:
			
		

> Wenn du komplett neu bist kann das sicherlich ein bisschen dauern bis man das richtige Denken entwickelt


Das ist der Punkt, das `richtige` Denken. Hier lege ich dir ans Herz: versuche von allem, was dich umgibt, sich inspirieren zu lassen. Versuche alles in Code umzusetzen: ein Einkauf beim Bäcker, die Unterhaltung dabei, verschiedene Ausgansmöglichkeiten usw. Dazu sich wirklich in verschiedene Themen reinlesen, immer und immer wieder. Du wirst sehen, irgendwann schreibt man ein kleines Programm zu einem Problem, welcher Art hier die Anfänger zuhauf posten, im vorbei gehen. Bleib am Ball und hab Spaß!


----------



## fadiin (21. Mai 2018)

Ich verstehe die vierte Aufgabe auch nicht
kannst du vielleicht sagen, wie die gelöst wurde?
danke im Voraus


----------



## httpdigest (21. Mai 2018)

Du sollst ja jetzt, nachdem das Array "feld" mit den Zahlen befüllt wurde, die Zahlen in diesem Array selbst als Indizes betrachten. In der Aufgabenstellung zu Aufgabe 4 ist ja ein sehr gutes Beispiel durchdekliniert worden mit Beispielzahlen.
Hieraus sollte schon offensichtlich werden, was da passieren soll.
Du fängst an, das Array "feld" an der Position 0 zu lesen. Der Wert, den du dort liest ist dann der Index für deinen nächsten lesenden Arrayzugriff (mittels der eckigen Arrayzugriffsklammern). Und der Wert, den du da dann liest, ist der Index für den nächsten Zugriff, und so weiter. Und das ganze 15 Mal.
Also brauchst du schonmal eine Schleife, die exakt 15 Mal wiederholt wird. Z.B. eine for-Schleife.
Dann brauchst du noch eine `int` Variable, um dir den aktuellen Zugriffsindex für das Array "feld" zu merken; nennen wir sie `index`.
In dieser Schleife greifst du dann lesend mittels dieses Indexes zu und weist auch gleich `index` neu zu, nämlich mit dem Wert, den du aus dem Array "feld" an der Stelle `index` gelesen hast.
Und vorher gibst du noch den aktuellen Wert der Variablen `index` aus.
Ich hätt's so gemacht:


Spoiler





```
// Erstmal Werte mit Scanner einlesen, wie auch in Aufgabe 1-4...
...
// Jetzt: Schnitzeljagd :)
int index = 0;
for (int i = 0; i < 15; i++) {
  System.out.println(index);
  index = feld[index];
}
```


----------



## fadiin (21. Mai 2018)

Dankeschön  es hat endlich perfekt funktioniert


----------

