Trace Tabelle erstellen

M_heinel

Mitglied
Hey Leute! Ich muss für die Schule eine Trace Tabelle für folgenden Code erstellen, und bin völlig verloren.

Wenn das irgendeiner hier kann, und kurz erklären könnte, wäre meine Welt gerettet - danke 🙏

for (int i = 2; i <= n; i++) {
boolean istPrimzahl = true;

for (int j = 2; j < i && istPrimzahl == true; j++) {
if (i % j == 0) {
istPrimzahl = false;
}
}

if (istPrimzahl) {
System.out.println(i + " ist eine Primzahl.");
}
}
 
Woran scheitert es denn? Weißt du, was mit Tracetabelle gemeint ist, wie diese aussieht?
Und dann die Umsetzung mit dem Code, den Du gegeben hast?

Wenn du uns schreibst, woran du scheiterst, dann können wir dir auch helfen.
 
Woran scheitert es denn? Weißt du, was mit Tracetabelle gemeint ist, wie diese aussieht?
Und dann die Umsetzung mit dem Code, den Du gegeben hast?

Wenn du uns schreibst, woran du scheiterst, dann können wir dir auch helfen.
Also ganz grundlegend scheitert es daran, das ich 1. nicht weiß, wann Schleifen 'abbrechen' und was passiert wenn sie es tun, z.B. wenn die zweite Schleife abbricht springt es dann zum nächsten Block, was ja das Ende des Programms wäre oder springt es wieder zur ersten Schleife zurück und wieso? Und 2. Wie lange die Trace Tabelle geht, wann endet sie? Geht das Programm nicht theoretisch unendlich? ich bin wirklich neu in diesem Gebiet, also danke 🙏
 
Java:
for (int i = 2; i <= n; i++) {
Hier ist es i <=n
Wobei die variable n in deinen Code Beispiel gar nicht definiert wird.
Also die Scheife wir wiederholt solange i kleiner oder gleich dem n ist.
Wenn n zb 10 ist dann bei i = 11 ist Schluß.
 
Java:
for (int i = 2; i <= n; i++) {
Hier ist es i <=n
Wobei die variable n in deinen Code Beispiel gar nicht definiert wird.
IMG_2581.jpeg
Java:
for (int i = 2; i <= n; i++) {
Hier ist es i <=n
Wobei die variable n in deinen Code Beispiel gar nicht definiert wird.
Hey, ja ich habe gerade gesehen das ich den Code nicht ganz abgetippt habe. Hier ist er einmal vollständig.
 
Du hast ja zwei verschachtelte Schleifen. Wenn die zweite zu Ende ist geht es in der ersten weiter bis die Abbruch Bedingung erfüllt ist.

Die zweite wird ja in der ersten immer wider neu gestartet.
 
Du hast ja zwei verschachtelte Schleifen. Wenn die zweite zu Ende ist geht es in der ersten weiter bis die Abbruch Bedingung erfüllt ist.

Die zweite wird ja in der ersten immer wider neu gestartet.
Ja das macht schon Sinn. Wenn wir das ganze jetzt aber in eine Trace Tabelle schreiben sollen, verstehe ich nicht ganz wie die Zeilen in der Tabelle aufgebaut sind. Immer dann eine Zeile, wenn sich irgendwas verändert, und die anderen Variablen, oder istPrimzahl bleibt so wie in der vorherigen Zeile? Könntest du mal einen Anlauf für mein Programm machen damit ich mich daran orientieren kann? Das würde echt Mega helfen
 
Dann überlege dir erst mal in welchem programmzeilen was relevantes passiert nummerire sie.
Dann schaue welche Variablen du hast. Trage das in eine Tabelle ein. ( Spalten). Und gehe den Code in Gedanken Zeile für Zeile duch und trage es in die Tabelle ein.
 
Tipp schau das mal an
Hey danke, das schau ich mir mal an. Ich hab das ganze gerade schriftlich versucht und bezweifle das es überhaupt irgendwo in der Nähe von 'Richtig ist. Ich hab mich irgendwo bei zeile 8 verloren, und mir stellen sich auch einige Fragen. Wenn Die zweite Schleife die in der ersten liegt abbricht, beginnt die Schleife doch von neu, muss dann nicht auch i wieder bei 2 anfangen? Und ist ;

if (i % j == 0) {
istPrimzahl = false;

ein eigener Block, oder muss ich den automatisch mitberücksichtigen wenn ich mir überlege was passiert wenn ich beim Block der zweiten Schleife angekommen bin? Und wenn ja, wie macht das Programm das dann, kann es zwei Dinge gleichzeitig machen, also prüfen ob die Bedingungen für j um 1 erhöhen erfüllt sind und prüfen ob istPrimzahl wahr ist? Help

Hier mal mein Versuch 🤕:
IMG_2582.jpeg
 
Schreibe in der ersten Spalte die Programm Zeile.
Dann siehst du wie das Programm läuft.
Kannst ja auch im Debugger Einzellschritt machen.
N ist eine Konstante ändert sich nie im Programm würde ich nicht mit in die Tabelle aufnehmen.
 
Zu deiner Tabelle gibt es zb bei i = 4 nur einen inneren schleifen duch auf?

Wie ist das bei i = 5 wieviele inneren durchlläufe hast du da? Noch nicht nur einen.
Deshalb erste Saplte immer Programm Zeile.
 
Bei dem i =5 musste es auch ein j =4 geben.
Da scheinst du einen Durchlauf vergessen zu haben.

Und bei i 6 ist Schluß. Die zweite wird nicht mehr durch laufen. Prog Ende.
 
kleine änderung im code damit du deine Tabelle bekommst
Java:
public class Main {
    public static void main(String[] args) {
        int n = 10;

        for (int i = 2; i <= n; i++) {
            boolean istPrimzahl = true;  System.out.printf("zeile6   i:%d   %b   j:%d  \n", i, istPrimzahl, 0);

            for (int j = 2; j < i && istPrimzahl == true; j++) {
                System.out.printf("zeile 9   i:%d   %b   j:%d  \n", i, istPrimzahl, j); if (i % j == 0) {
                    istPrimzahl = false; System.out.printf("zeile10   i:%d   %b   j:%d  \n", i, istPrimzahl, j);
                }
            }

            if (istPrimzahl) { System.out.printf("zeile14   i:%d   %b   j:%d  \n", i, istPrimzahl, 0);
                System.out.println(i + " ist eine Primzahl.");
            }
        }
    }
}

ausgabe
Code:
zeile6   i:2   true   j:0 
zeile14   i:2   true   j:0 
2 ist eine Primzahl.
zeile6   i:3   true   j:0 
zeile 9   i:3   true   j:2 
zeile14   i:3   true   j:0 
3 ist eine Primzahl.
zeile6   i:4   true   j:0 
zeile 9   i:4   true   j:2 
zeile10   i:4   false   j:2 
zeile6   i:5   true   j:0 
zeile 9   i:5   true   j:2 
zeile 9   i:5   true   j:3 
zeile 9   i:5   true   j:4 
zeile14   i:5   true   j:0 
5 ist eine Primzahl.
zeile6   i:6   true   j:0 
zeile 9   i:6   true   j:2 
zeile10   i:6   false   j:2 
zeile6   i:7   true   j:0 
zeile 9   i:7   true   j:2 
zeile 9   i:7   true   j:3 
zeile 9   i:7   true   j:4 
zeile 9   i:7   true   j:5 
zeile 9   i:7   true   j:6 
zeile14   i:7   true   j:0 
7 ist eine Primzahl.
zeile6   i:8   true   j:0 
zeile 9   i:8   true   j:2 
zeile10   i:8   false   j:2 
zeile6   i:9   true   j:0 
zeile 9   i:9   true   j:2 
zeile 9   i:9   true   j:3 
zeile10   i:9   false   j:3 
zeile6   i:10   true   j:0 
zeile 9   i:10   true   j:2 
zeile10   i:10   false   j:2 

Process finished with exit code 0
 
Oder so:
Java:
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Primzahlsucher {
    public static void main(String[] args) {
        int n = 5; Trace trace = new Trace(); trace.register("n", n);

        for (int i = 2; i <= n; i++) { trace.register("i", i);
            boolean istPrimzahl = true; trace.register("istPrimzahl", istPrimzahl);

            for (int j = 2; j < i && istPrimzahl == true; j++) { trace.register("j", j);
                if (i % j == 0) {
                    istPrimzahl = false; trace.register("istPrimzahl", istPrimzahl);
                }
            }
            if (istPrimzahl) {
                System.out.println(i + " ist eine Primzahl.");
            }
        }
        trace.print();
    }

    private static class Trace {
        record Entry(int lineNumber, String variableName, Object value) {}
        private List<Entry> entries = new ArrayList<>();

        public void register(String variableName, Object value) {
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
            int lineNumber = stackTrace[2].getLineNumber();
            entries.add(new Entry(lineNumber, variableName, value));
        }

        public void print() {
            List<String> variables = entries.stream().map(Entry::variableName).distinct().toList();
            List<String> columnNames = Stream.concat(Stream.of("Zeile"), variables.stream()).toList();
            String lineFormat = columnNames.stream().map(name -> "%%%ds".formatted(name.length()))
                    .collect(Collectors.joining(" | ", "", "%n"));

            System.out.print(lineFormat.formatted(columnNames.toArray()));

            Map<String, Object> currentState = new HashMap<>();
            for (Entry entry : entries) {
                currentState.put(entry.variableName, entry.value);
                List<String> rowValues = new ArrayList<>();
                rowValues.add(String.valueOf(entry.lineNumber));
                for (String column : variables) {
                    Object value = currentState.get(column);
                    String output = value == null ? "-" : String.valueOf(value);
                    rowValues.add(output);
                }
                System.out.printf(lineFormat, rowValues.toArray());
            }
        }
    }
}

Code:
2 ist eine Primzahl.
3 ist eine Primzahl.
5 ist eine Primzahl.
Zeile | n | i | istPrimzahl | j
    7 | 5 | - |           - | -
    9 | 5 | 2 |           - | -
   10 | 5 | 2 |        true | -
    9 | 5 | 3 |        true | -
   10 | 5 | 3 |        true | -
   12 | 5 | 3 |        true | 2
    9 | 5 | 4 |        true | 2
   10 | 5 | 4 |        true | 2
   12 | 5 | 4 |        true | 2
   14 | 5 | 4 |       false | 2
    9 | 5 | 5 |       false | 2
   10 | 5 | 5 |        true | 2
   12 | 5 | 5 |        true | 2
   12 | 5 | 5 |        true | 3
   12 | 5 | 5 |        true | 4
 
Tipp: lasse das Programm doch mal etwas länger laufen n = 30.

Überlege ob du bei zB 29 wirklich alle 28 Prüfungen machen musst. Oder ob du schon früher abrechen kannst. Was passiert bei einer Diffusion, wenn der zweite Oberkant größer als die Hälfte des ersten ist ? Kann da Rest 0 entstehen?

Zb 29 :15 = ? kann ab hier ein Rest 0 kommen. Das ist etwas was man sich aus so einer Tabelle mitnehmen kann.
 

Zurück
Oben