Erste Schritte Aktivsten Zweistündigen Abschnitt finden

Devanther

Top Contributor
Flown Moderator
@Devanther Wir sind hier - wie du auch siehst - ein sehr, sehr hilfsbereites Forum. ABER: Das hier ist kein privates Tutorium.
Wenn du ein konkretes Problem hast, dann bitte Stelle es hier, mit deinen Versuchen. Aber Schritt für Schritt die Lösung erhaschen und dich durch dein Buch zu wurschteln, ist nicht Ziel der Sache.

Ich werde jetzt das Thema hier schließen, da 1. nur eine Frage/Thema und 2. - was dir schon zig-mal gesagt wurde: "Setz dich hin und lern die Grundlagen!"
Bei Verständnisschwierigkeiten kannst du gerne wieder hier Fragen, aber die Aufgaben sind eine Nummer zu groß für dich.

Ich habe mir in der Zwischenzeit alle Aufgaben bis hier hin nochmal angeschaut!
Und der letze Thread ist auch ziemlich unübersichtlich geworden.
Natürlich sind die Aufgaben nicht immer soooo leicht!

Aufgabe wäre jetzt:
Fügen Sie Protokollauswerter eine Methode hinzu, die den aktivsten zweistündigen
Abschnitt findet. Lassen Sie die Methode den Wert der ersten Stunde dieses Abschnitts liefern.

Es ist die letze Aufgabe zu Protokollauswerter.

Meine Gedanken:
Da wo 2 zusammengezählte Zugriffe am höchsten sind, ist der aktivste Zweistündige Abschnitt.


Beispiel:


Stunde/Zugriffe

0 - 7

1 - 4

2 -3

3 - 8

4 - 9

5 - 9

6 - 1

7 - 4

8 - 7

9 - 2

10 - 6


man addiert 7+4 dann 4+3 dann 3+8 dann 8+9 dann 9+9 dann 9+1...

Und den größten Wert merkt man sich!!!
Das ist der aktivste zweistündige Abschnitt.

Indem Fall müsste die erste 9 die erste Stunde des Abschnitts sein.
Es muss also Stunde 4 zurückgegeben werden.

Ist das bis hierhin richtig, bevor man das in Code umwandelt?

Und dann werden halt die 2 dazugehörigen Stunden zu den zusammengezählten Zugriffen zurückgegeben.

Den Thread bitte nicht sperren.
Wer helfen will kann das tun, wer nicht, der liest hier einfach nicht!
 

tommysenf

Top Contributor
man addiert 7+4 dann 4+3 dann 3+8 dann 8+9 dann 9+9 dann 9+1...

Und den größten Wert merkt man sich!!!
Das ist der aktivste zweistündige Abschnitt.

Indem Fall müsste die erste 9 die erste Stunde des Abschnitts sein.

Ist das bis hierhin richtig, bevor man das in Code umwandelt?

Ja das ist so korrekt.

Und dann werden halt die 2 dazugehörigen Stunden zu den zusammengezählten Zugriffen zurückgegeben.
Das allerdings nicht...
 

Harry Kane

Top Contributor
Wie addiere ich die Zugriffe zusammen?
Nach mehreren Monaten in Java so eine Frage? Du kriegst keine simple Addition mehr zusammen?
Wahrscheinlich stehst du wieder massiv auf dem Schlauch.
Hier die Aufgabe mal in Prosa:
Code:
Deklariere zwei int Variablen:
    maximaleAnzahlAnZugriffenPro2hBlock, Anfangswert 0
    beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen, Anfangswert -1
Gehe mit einer for-Schleife über alle Einträge in zugriffeInStunde
Die Laufvariable habe den Namen i
   Deklariere eine Variable nächsterIndex
   Falls i kleiner ist als zugriffeInStunde.length -1
       dann ist nächsterIndex = i + 1
       ansonsten ist nächsterIndex = 0
   Ende der Wertzuweisung von nächsterIndex   
    Bilde die Summe aus zugriffeInStunde[i] und zugriffeInStunde[nächsterIndex]
    Falls die Summe größer ist als maximaleAnzahlAnZugriffenPro2hBlock,
        Weise maximaleAnzahlAnZugriffenPro2hBlock den Wert der Summe zu
        Weise beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen den Wert von i zu
    Ende der Überprüfung der Einträge
Ende der for-Schleife
Gebe beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen zurück.
Der Rückgabewert -1 bedeutet, dass gar keine Zugriffe stattgefunden haben
 

JStein52

Top Contributor
Code:
zugriffeInStunde[i] + zugriffeInStunde[i+1]
Aber aufpassen, die Schleife darf jetzt nur bis zum vorletzten Element gehen !
 

Harry Kane

Top Contributor
Vor 800 oder 1100 Beiträgen wurde mal beschrieben, wie so ein Log ausschaut. Die Einträge im Log sind im wesentlichen eine Kombination aus einem Zeitstempel und die Zahl an Zugriffen. Bei der Auswertung wird aus den Zeitstempeln die Stunde extrahiert und die Zahl an Zugriffen an die der Stunde entsprechende Stelle im Array hinzuaddiert. Es steht nirgendwo, dass sich die Auswertung nur auf einen Tag beschränkt. So zumindest mein Verständnis vom Sachverhalt.
 

Devanther

Top Contributor
Code:
public int zweistündigerAbschnitt(){
   
    int maximaleAnzahlAnZugriffenPro2hBlock = 0;
   
    int beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = -1;
   
    for (int i = 0; i < zugriffeInStunde.length; i++){
    int  nächsterIndex = 0;
   
     if( i < zugriffeInStunde.length -1){
         nächsterIndex = i + 1;
        }
     nächsterIndex = 0;
    }
     zugriffeInStunde[i] + zugriffeInStunde[nächsterIndex];
   
    if(summe > maximaleAnzahlAnZugriffenPro2hBlock) {
         maximaleAnzahlAnZugriffenPro2hBlock = ergebnis von summe;
         beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = i;
    }

      return beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen;
   }

Lacht mich nicht aus, wie addiere ich?
http://imgur.com/a/8v6pL
 

mrBrown

Super-Moderator
Mitarbeiter
Ich sehe da zwei Möglichkeiten: du lässt Programmieren und alles, was auch nur annähernd in die Richtung geht, für immer sein - oder du fängst an, in deinem und anderen Büchern mal zu lesen und auch zu verstehen.

Dein Wissensstand ist etwa der eines Programmieranfängers, BEVOR er anfängt sich mit Programmieren zu beschäftigen.
 

Devanther

Top Contributor
Ich sehe da zwei Möglichkeiten: du lässt Programmieren und alles, was auch nur annähernd in die Richtung geht, für immer sein - oder du fängst an, in deinem und anderen Büchern mal zu lesen und auch zu verstehen.

Dein Wissensstand ist etwa der eines Programmieranfängers, BEVOR er anfängt sich mit Programmieren zu beschäftigen

uuuuups. sorry, sowas kann ich natürlich^^

Code:
 public int zweistündigerAbschnitt(){
   
    int maximaleAnzahlAnZugriffenPro2hBlock = 0;
   
    int beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = -1;
   
    int summe = 0;
    for (int i = 0; i < zugriffeInStunde.length; i++){
    int  nächsterIndex = 0;
   
     if( i < zugriffeInStunde.length -1){
         nächsterIndex = i + 1;
        }
     nächsterIndex = 0;
    }
    
    summe = zugriffeInStunde[i] + zugriffeInStunde[nächsterIndex];
    
    if(summe > maximaleAnzahlAnZugriffenPro2hBlock) {
         maximaleAnzahlAnZugriffenPro2hBlock = summe;
         beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = i;
    }

      return beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen;
   }

Jetzt kommen woanders Fehlermeldungen.
 

Harry Kane

Top Contributor
Bis auf 3 Flüchtigkeitsfehler scheint alles zu stimmen.
Schaff dir doch mal eine IDE an, die brauchbare Fehlermeldungen liefert.
Java:
public int zweistündigerAbschnitt(){
    int maximaleAnzahlAnZugriffenPro2hBlock = 0;
    int beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = -1;
    int summe = 0;
    for (int i = 0; i < zugriffeInStunde.length; i++){
        int  nächsterIndex = 0;
        if( i < zugriffeInStunde.length -1){
            nächsterIndex = i + 1;//jetzt bekommt nächsterIndex ev. einen anderen Wert
        }
       nächsterIndex = 0;//jetzt ist nächsterIndex garantiert wieder 0 -> Zuweisung löschen
    }//Durch die Klammer wird die for-Schleife beendet. Dadurch ist i nicht mehr bekannt. Die Klammer muss weg.
    summe = zugriffeInStunde[i] + zugriffeInStunde[nächsterIndex];
    if(summe > maximaleAnzahlAnZugriffenPro2hBlock) {
         maximaleAnzahlAnZugriffenPro2hBlock = summe;
         beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = i;
    }
// hier fehlt eine schliessende Klammer. Erst hier enden die Anweisungen in der for-Schleife
    return beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen;
}
 

Devanther

Top Contributor
Hilfe .... da steht doch dabei was du machen musst !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ja, ich hab's übersehen^^

Code:
public int zweistündigerAbschnitt(){
    int maximaleAnzahlAnZugriffenPro2hBlock = 0;
    int beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = -1;
    int summe = 0;
    for (int i = 0; i < zugriffeInStunde.length; i++){
        int  nächsterIndex = 0;
        if( i < zugriffeInStunde.length -1){
            nächsterIndex = i + 1;//jetzt bekommt nächsterIndex ev. einen anderen Wert
        }
       //jetzt ist nächsterIndex garantiert wieder 0 -> Zuweisung löschen
    //Durch die Klammer wird die for-Schleife beendet. Dadurch ist i nicht mehr bekannt. Die Klammer muss weg.
    summe = zugriffeInStunde[i] + zugriffeInStunde[nächsterIndex];
    if(summe > maximaleAnzahlAnZugriffenPro2hBlock) {
         maximaleAnzahlAnZugriffenPro2hBlock = summe;
         beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen = i;
    }
    }// hier fehlt eine schliessende Klammer. Erst hier enden die Anweisungen in der for-Schleife
    return beginnDesBlocksMitDerMaximalenAnzahlAnZugriffen;
   }

Wenn ich die Methode aufrufe kommt der Wert -1? Ist falsch?

Ne...passt schon!
 

tommysenf

Top Contributor
Sieht gut aus, geht jedoch auch noch etwas einfacher:

Java:
public int zweistündigerAbschnitt(){
   
    int maxZugriffe = 0;
    int block = -1;

    for (int i = 0; i < zugriffeInStunde.length - 1; i++){
        int summe = zugriffeInStunde[i] + zugriffeInStunde[i+1];
        if(summe > maxZugriffe) {
             maxZugriffe = summe;
             block = i;
        }
    }
    return block;
}
 
X

Xyz1

Gast
  1. ue
  2. zu lange Namen
  3. Formatierung + fehlende Leerzeichen + leere Zeilen
  4. maxZugriffe = -1;
  5. der Rest ist richtig
Das Thema wird bestimmt wieder ewig lang oder geschlossen.
 

Devanther

Top Contributor
Ich hab noch paar Fragen dazu, aber das nicht mehr um diese Zeit^^

edit: Die Lösung ist wohl so gedacht, wie sie tommysenf gepostet hat.
Die andere Lösung funktioniert auch, ist aber deutlich schwerer und ich denke nicht,
dass der Autor von BlueJ so eine schwere Lösung von seinen Leser erwartet!

Code:
int block = -1;

Könnte man die Variable auch mit einem anderen Wert initialisieren?

Code:
for (int i = 0; i < zugriffeInStunde.length - 1; i++){
        int summe = zugriffeInStunde[i] + zugriffeInStunde[i+1];

Warum in der ersten Zeile dieses "-1"?
 
Zuletzt bearbeitet:

Devanther

Top Contributor
Code:
zugriffeInStunde[i]
ist das i-te Element vom Array zugriffeInStunde.
Code:
zugriffeInStunde[i]
muss mit irgendetwas addiert werden...
Das habe ich verstanden, aber warum zugriffeInStunde[i+1]...warum dieses " +1 " ?
Was bewirkt das?
Wenn ich auf die Aufgabenstellung zurückdenke, kann ich keinen Zusammenhang herstellen.
 

Harry Kane

Top Contributor
Wenn du über das Array zugriffeInStunde drübergehst, enthält zugriffeInStunde[x] (ich verwende x als Index, weil i dazu führt, das der Text kursiv gesetzt wird) die Anzahl der Zugriffe, die in der Stunde x stattgefunden haben. zugriffeInStunde[0] enthält die Anzahl der Zugriffe zwischen 0 und 1 h, zugriffeInStunde[1] die Anzahl der Zugriffe zwischen 1 und 2 h, usw. In der Aufgabenstellung steht aber, dass nicht die Stunde mit den meisten Zugriffen pro Stunde gesucht wird, sondern die erste Stunde eines 2h-Blocks, in dem die meisten Zugriffe stattgefunden haben. Du musst also beim Analysieren der Werte im Array nicht nur die Zugriffe in der aktuellen Stunde brücksichtigen, sondern auch die Wert in der nächsten Stunde, und das ist nunmal zugriffeInStunde[x+1].
Jetzt gibt es aber folgendes Problem: wenn die aktuelle Stunde schon der letzte Eintrag im Array ist, in anderen Worten: wenn i den Wert (zugriffeInStunde.length - 1) hat, führt der Versuch, auf zugriffeInStunde[x+1] zuzugreifen, zu einer Fehlermeldung, weil das Array kein (x+1)-tes Feld hat.
Es gibt zwei Möglichkeiten, diesen Fehler zu vermeiden:
1. Du schaust dir nur die Stunden bis (zugriffeInStunde.length - 1) an, also bis zur Stunde zwischen 22 und 23 h. Dann kannst du gefahrlos die Summe aus den Zugriffen in der aktuellen Stunde und der nächsten Stunde bilden. Das wäre die Lösung von @tommysenf
2. Du schaust dir wie in früheren Aufgaben die Stunden bis zugriffeInStunde.length an und berücksichtigst, dass, wenn die aktuelle Stunde von 23 bis 24 h geht, die nächste Stunde von 0 bis 1 h geht, und die Werte aus diesem Interval stehen in zugriffeInStunde[0]. Das ist die Lösung, die ich für die rtichtigere halte, auich wenn sie etwas komplizierter zu programmieren ist. Was der Verfasser des Buches wirklich gemeint hat, weiss nur er selber.
Und nochmal der HInweis: schau dir das Array.Kapitel in der Java-Insel an.
 

JStein52

Top Contributor
Du schaust dir nur die Stunden bis (zugriffeInStunde.length - 1) an, also bis zur Stunde zwischen 22 und 23 h. Dann kannst du gefahrlos die Summe aus den Zugriffen in der aktuellen Stunde und der nächsten Stunde bilden.
Das habe ich doch von Anfang an gesagt. Dann hätte er nämlich gegenüber der "avtivsteStunde()" nur an 3 Stellen minimal ändern müssen und hätte leichter überblicken können was er da tut.
 

Ähnliche Java Themen

Neue Themen


Oben