Bildschirmausgabe erzeugen

JavaIsTheBest

Bekanntes Mitglied
Hallo,
ich bin schon länger am überlegen, wie ich diese Aufgabe lösen kann.
Es soll folgende Bildschirmausgabe erzeugt werden. Der Haken dabei?
Man sollte nur eine Schleife benutzen. Mit zwei Schleifen habe ich es geschafft.


#
**
###
****
#####
******
 

Baldur

Aktives Mitglied
Da ich ja nicht gleich alles vorgeben will, versuch ich mal ein paar dezente Hinweise zu geben ;)

Du hast eine Schleife, die die Werte von 1 bis 6 durchläuft. Pro Durchlauf wird die entsprechende Anzahl Zeichen ausgegeben.
Gerade Zeilen geben Sternchen aus, ungerade die Raute.

Um das ganze in einer Schleife zu schaffen, stell dir das ganze als eine Sequenz von Zeichen vor:
"*<Zeilenumbruch>##<Zeilenumbruch>***<Zeilenumbruch>...."

Hoffe das hilft weiter ;)
 

JavaIsTheBest

Bekanntes Mitglied
Ich weiß, da fehlt noch Code aber so richtig weiter komme ich nicht.

Java:
public class Test {
   
    public static void main(String[] args){
       
        for(int i=0;i<6;i++){
            if(i%2==1) System.out.print("#");
            else System.out.print("*");
        }
       
    }

}
 
X

Xyz1

Gast
Ich hab das hinbekommen, aber nur mit zwei zusätzlichen Hilfsvariablen, unschön:
Java:
    /**
     * Print:
     *   #
     *   **
     *   ###
     *   ****
     *   #####
     *   ******
     *   #
     *
     * @param args
     */
    public static void main(String[] args) {
        int j = 1;
        int k = 1;
        for (int i = 0; i < 22; i++) {
            if ( /* geheim */ ) {
                k++;
                j += k;
                System.out.println("");
            }
            if ( /* geheim */ ) {
                System.out.print("*");
            } else {
                System.out.print("#");
            }
        }
    }

ich bitte um eine Verbesserung, Hilfsvariablen umgehen, von euch.
 

Meniskusschaden

Top Contributor
Zum Beispiel so (hat aber auch Hilfsvariablen):
Java:
public static void main(String[] args) {
        String s1 = "";
        String s2 = "";
        for (int i = 0; i < 6; i++) {
            s1 += "#";
            s2 += "*";
            System.out.println((i%2==0)?s1:s2);
        }
    }
 

Baldur

Aktives Mitglied
Da liegt das Problem, straightforward dürfen aber nicht auf einmal mehrere Zeichen ausgegeben werden.
Stimmt, den Teil hätte ich weglassen sollen, der verwirrt nur ;)

Ganz ohne Hilfsvariablen gehts natürlich nicht. Mein Ansatz hat zwei int-Variablen, zwei if-Abfragen und keine for-Schleife.

Die Aufgabe ist wahrscheinlich ein bisschen realitätsfremd, aber eine ganz nette Bastelaufgabe zum "Um die Ecke denken". Und es gibt auf jeden Fall mehrere richtige Lösungen.
 
X

Xyz1

Gast
Ich hab gerade geguckt, ob die Fibonacci-Zahlen weiterhelfen, aber nööö, ich denke nicht...
1
3
6
10
15
21 ...
(kein IQ-Test) sieht denn irgendwer ein Muster?

@Baldur: Ja, eigentlich sollten wir ihr die aufgaben auch gar nicht lösen, deshalb hab ich meine bescheidene Lösung auch die wichtigen Stellen weggelassen. Aber es ist eine Bastelaufgabe, wie sie in Unis gestellt wird.
 

JavaIsTheBest

Bekanntes Mitglied
Ich hab das hinbekommen, aber nur mit zwei zusätzlichen Hilfsvariablen, unschön:
Java:
    /**
     * Print:
     *   #
     *   **
     *   ###
     *   ****
     *   #####
     *   ******
     *   #
     *
     * @param args
     */
    public static void main(String[] args) {
        int j = 1;
        int k = 1;
        for (int i = 0; i < 22; i++) {
            if ( /* geheim */ ) {
                k++;
                j += k;
                System.out.println("");
            }
            if ( /* geheim */ ) {
                System.out.print("*");
            } else {
                System.out.print("#");
            }
        }
    }

ich bitte um eine Verbesserung, Hilfsvariablen umgehen, von euch.


Könntest du bitte deine Lösung näher erklären?
 

Blender3D

Top Contributor
Eine Schleife, ein Zeichen ? Vielleicht so?
Code:
    public static void printOneLoop(int max ) {      
        int currentmax = 1;
        int cnt = 0;
        int id = 0;
        char out[] = { '#', '*' };
        while (currentmax <= max) {
            System.out.print(out[id]);
            cnt++;
            if (cnt == currentmax) {
                System.out.println();
                cnt = 0;
                currentmax++;
                id = (id + 1) % out.length;
            }
        }
    }
Zeichen lassen sich beliebig erweitern und auch das Maximum ist flexibel.
 
Zuletzt bearbeitet:
X

Xyz1

Gast
Ich hab eine PN geschickt, läuft ja auch nix im Fernsehen zZt.
Gibt es eine Formel für die Berechnung eines Folgeelements der Summe der ersten natürlichen Zahlen?
Edit: Mei Frage hat sich gerade erübrigt,
dann lässt sich vielleicht 1 - 2 Variablen einsparen.
Gauß hat es ja schon als kleines Kind entdeckt.
 

Baldur

Aktives Mitglied
Hm, da wär ich auch glatt mal neugierig, wie deine aktuelle Lösung ausschaut ;)
Meine ist eigentlich gar nicht so unähnlich zu deiner ersten, nur mit einem Zähler weniger.
 

Meniskusschaden

Top Contributor
Man könnte vielleicht zu Beginn mittels Gauß die Anzahl der Schleifendurchläufe ermitteln. Dann könnte man die Gleichung umformen um bei jeder Iteration aus dem Schleifenzähler direkt berechnen zu können, ob ein Zeilenwechsel nötig ist, der ja auch gleichbedeutend mit einem Zeichenwechsel ist.
 
X

Xyz1

Gast
@Baldur: Gerne,
Java:
    /**
     * @author DerWissende on 03/17/2016
     */
    public static void main(String[] args) {
        int j = 1;
        for (int i = 0; i < 100; i++) {
            if ( /* think, and insert Gauß Summenformel here */ ) {
                j++;
                System.out.println("");
            }
            if (j % 2 == 0) {
                System.out.print("*");
            } else {
                System.out.print("#");
            }
        }
    }

habn wir jetzt für diese Aufgabe viel zu viel geschrieben?
 

Baldur

Aktives Mitglied
Ich muss gestehn, an Gauss hätt ich bei der Aufgabe jetzt nicht gedacht ;)
Von der Effizienz her sind ist dann die Variante mit den Zählern dann aber doch um ein paar Instruktionen günstiger.

Dann geb ich meine Variante auch mal zum Besten:
Java:
int zeile = 1;
int zeichen = 1;

while(zeile <= 6) {
   boolean gerade = zeile%2 == 0;
   System.out.print(gerade ? '#' : '*');
   ++zeichen;

   if (/* ??? */) {
      System.out.print('\n');
      // ???
      // ???
   }
}
 

Blender3D

Top Contributor
Code:
    public static void printOneLoop(int max, char[] out) {
        int currentmax = 1;
        int cnt = 0;
        int id = 0;      
        while (currentmax <= max) {
            System.out.print( cnt == currentmax ? '\n' : out[id]);
            cnt++;
            if ( cnt == currentmax+1) {              
                cnt = 0;
                if (out[id] != '\n')
                    currentmax++;
                id = (id + 1) % out.length;
            }
        }
    }
Code:
..
OneLoopOutput.printOneLoop(7, new char[]{ '#','*' });
..
Erfüllt folgende Bedingungen:
1 Schleife, pro Loop 1 System.out.print(char )
 

Meniskusschaden

Top Contributor
Ich habe auch noch eine Gauss-Version:
Java:
public static void main(String[] args) {
    gibMitGaussAus(6);
}

private static void gibMitGaussAus(int n) {
    boolean raute = true;
    for (int i = 1; i <= n/2f*(n+1); i++) {
        System.out.print(raute?'#':'*');
        if ( (-1f/2+Math.sqrt(1f/4+2*i)) % 1 == 0 ) {
            System.out.println();
            raute = !raute;
        };  
    }
}
Aktuell geht es ja gerade nicht mehr um gute Lesbarkeit, oder?:)
 

Baldur

Aktives Mitglied
gehts jetzt schon um die Teilnahme am Obfuscated C Contest? Dann hätt ich auch noch eins ;)

C:
for(int l=1,c=1; l<=6; ++c) {
    if (c > l) {
        c-=++l;
        putchar('\n');
    }
    else {
        putchar(l&1 ? '#' : '*');
    }
}

Diesmal auch mit nur einer Ausgabe pro Iteration.
(Wer lieber Java will, ersetzt einfach putchar durch System.out)
 
K

kneitzel

Gast
Die Lösung ist getestet? Kann ich gerade leider nicht testen, aber beim lesen stolpere ich über l & 1. Das ist ja das bitweise und, d.h. das Ergebnist ist auch wieder eine zahl. Und ? : Erwartet doch ein boolean so dass ich ein l&1==1 erwartet hätte.
Wo hab ich den Denkfehler?

Aber generell lassen sich zwei Schleifen immer durch eine ersetzen.
Man könnte Regeln zum Übersetzen aufsetzen:
for (start; bedingung; aktion) {inhalt;}
wird zu
{start; while(bedingung) {inhalt;aktion;}}

Code:
while (bed1){
aktion1;
while (bed2){
aktion2;
}
aktion3;
}

kann zu folgendem gemacht werden:
Code:
boolean inInnerLoop=false;
while(bed1) {
// move definition of local variabels of outer loop here!
if (!inInnerLoop) { aktion1; }
if (bed2) { inInnerLoop=true; aktion2; } else { inInnerLoop=false;}
if (!inInnerLoop) { aktion3; }
}

So eine Regel lässt sich universell einsetzen. Das Ergebnis ist erst einmal nicht schön, aber man hat etwas, das man dann umschreiben könnte.
 

Baldur

Aktives Mitglied
Die Lösung ist getestet? Kann ich gerade leider nicht testen, aber beim lesen stolpere ich über l & 1. Das ist ja das bitweise und, d.h. das Ergebnist ist auch wieder eine zahl. Und ? : Erwartet doch ein boolean so dass ich ein l&1==1 erwartet hätte.
Ja, die ist getestet ;) Ich hab das ganze für den zusätzlichen Spaßfaktor in C geschrieben, da können ints auch implizit als logischer Ausdruck interpretiert werden. Bei Java brauchst du natürlich das "== 1" dazu und musst ggf noch zusätzliche Klammern setzen. Das war eh ein kleines Mikado-Spiel auszuprobieren welche Klammern wirklich unbedingt nötig waren :)
 
X

Xyz1

Gast
Ok, Lesbarkeit (2.) ist das eine, Geschwindigkeit (2.) das andere, und dann gibt's noch Basteln & Kreativität & Intelligenz (3.). Mit 1 und 2 hat das nicht mehr viel zu tun. Deswegen gibt es ja zwei geschachtelte Schleifen, ohne Spaghetti (4.). Aber intelligent (3) ist es.
In C wird innerhalb einer Bedingung alles, was != 0 ist, als true/TRUE angesehen. Hardcore/üblicherweise wird so das Ende einer Zeichenkette herausgefunden.
Ich hatte ein int 'quasi" wie ein boolean benutzt, damit es wenigstens noch etwas lesbar erscheint. :rolleyes:
 

Baldur

Aktives Mitglied
Die Lesbarkeit ist bei meinem Einzeiler natürlich fürn Arsch, aber in Produktiv-Code hat sowas auch nichts zu suchen ;)

Aber von der Geschwindigkiet müsste der Einzeiler eigentlich gleichauf sein mit meiner ursprünglichen Variante. Zumindest wenn der Compiler erkennt, daß der Ausdruck rechts von dem && immer wahr ist.
 
X

Xyz1

Gast
Also das ist ja "eben" die Essenz dessen, was ich sagen wollte.

Falls irgendwann mal die Anforderung gestellt werden sollte, so eine Ausgabe wird benötigt... äh... dann nimmt man doch besser zwei ineinander geschachtelte Schleifen -> schnell, übersichtlich, lesbar.

Edit: Oben muss bei Lesbarkeit eine (1.) hin. :D
 

Baldur

Aktives Mitglied
Hab das gestern auch schon in einem anderen Thema hier geschrieben. Solche "Optimierungs" Kunststücke zu schreiben hat eigentlich so gut wie immer nur Nachteile. Es wird in jedem Fall weniger lesbar/verständlich und am Ende macht der Compiler eh die effektiveren Optimierungen ;)

Wenn wir mal alle unsere Varianten kompilieren und den Bytecode vergleichen, kommt wahrscheins am Ende raus, daß der Kompiler in jedem einzelnen Fall ein "loop unrolling" durchführt und durch ein einzelnes System.out ersetzt :D
 
X

Xyz1

Gast
Ich kann dir nicht genau sagen, was der Kompiler da macht, bin ja kein Komp.Bauer. :D
Außerdem ist der Kompiler von Java nicht gerade unkompliziert, und die Optimierungen zur Laufzeit auch nicht...
Außerdem will ich gar nicht Bytecode vergleichen oder die Operationen "ermitteln". ;) Ist doch gar nicht in der aufgabenstellung gefragt.
Außerdem sollten wir eigentlich nicht diese aufgabe für sie lösen, aber ich hab damit angefangen... :(
 

Baldur

Aktives Mitglied
Ich fürchte sie ist schon bei dem ersten Codebeispiel ausgestiegen :I

Zum Thema Optimierungen reicht es eigentlich zu wissen, daß der Compiler meist eh schlauer als der Programmierer ist, was das angeht ;) Zumindest wenn es darum geht, Rechenoperationen oder konstante Ausdrücke zu kürzen. Als Programmierer sollte man sich gar nicht fragen, ob eine zusätzliche Variable für Zwischenergebnisse Sinn macht oder nicht, und im Zweifelsfall einfach den leserlicheren Code schreiben.
Spannender sind an der Stelle eher Shader, wo man wirklich wissen sollte, wie die GPU arbeitet ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Schreibtischaufgabe / Bildschirmausgabe Java Basics - Anfänger-Themen 5
S Problem bei Bildschirmausgabe Java Basics - Anfänger-Themen 3
W Javadoc HTML erzeugen mit allen dependency Java Basics - Anfänger-Themen 11
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Erzeugen einer eindeutigen ID Java Basics - Anfänger-Themen 2
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
L Simples Spielfeld erzeugen Java Basics - Anfänger-Themen 1
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
S Mit nextGaussian() positive Zahlen erzeugen? Java Basics - Anfänger-Themen 39
S Array erzeugen mit verschiedener Verteilung Java Basics - Anfänger-Themen 11
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
K Methoden JTExtField mit Array erzeugen Java Basics - Anfänger-Themen 13
B Kann man eine Tabelle in Eclipse erzeugen und damit arbeiten? Java Basics - Anfänger-Themen 8
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
I TextField Array mit for Loop erzeugen Java Basics - Anfänger-Themen 4
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14
J Eindeutige Nummer (8 stellig) erzeugen Java Basics - Anfänger-Themen 9
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
neerual Int-Felder erzeugen Java Basics - Anfänger-Themen 16
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Erste Schritte Random erzeugen Java Basics - Anfänger-Themen 28
P Objekt mit =new in Methode erzeugen Java Basics - Anfänger-Themen 4
L Threads Laufbild Erzeugen Problem mit Aktualisieren des JPanels Java Basics - Anfänger-Themen 2
J In Java einen Ton erzeugen Java Basics - Anfänger-Themen 8
C Array Muster erzeugen Java Basics - Anfänger-Themen 2
S Objekte "gegebenfalls" erzeugen Java Basics - Anfänger-Themen 5
D Java Ausdruck erzeugen / Formular Java Basics - Anfänger-Themen 4
N Objekt in Methode einer anderen Klasse erzeugen Java Basics - Anfänger-Themen 9
R Baum erzeugen Java Basics - Anfänger-Themen 61
D Objekt per If erzeugen. Java Basics - Anfänger-Themen 11
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
J Objekt mit Methodendruchlauf erzeugen Java Basics - Anfänger-Themen 1
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
P Erste Schritte [gelöst]Erzeugen einer Klasse aus der Klassenbibliothek Java Basics - Anfänger-Themen 4
C Int mit vorangestellten Nullen und maximal 4 stellen erzeugen. Java Basics - Anfänger-Themen 4
P Input/Output Objekte per Eingabe erzeugen Java Basics - Anfänger-Themen 1
D Erste Schritte Dynamisch Objekte erzeugen und diese durchsuchen Java Basics - Anfänger-Themen 7
U JNA: Strukturen erzeugen Java Basics - Anfänger-Themen 8
S Variablen Variable erzeugen und Array mit Variablen befüllen Java Basics - Anfänger-Themen 26
S Header- Datei erzeugen mit javah Java Basics - Anfänger-Themen 1
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
R Erste Schritte Schleife erzeugen (mit If Anweisung) Java Basics - Anfänger-Themen 3
I HTML Tabelle nur so lange erzeugen bis Höhe erreicht Java Basics - Anfänger-Themen 9
M Zusatzzahlen in array erzeugen Java Basics - Anfänger-Themen 5
B Stützstellen (Vektor) erzeugen? Java Basics - Anfänger-Themen 8
Z Erste Schritte 9x9 Felder Erzeugen+Aufrufen Java Basics - Anfänger-Themen 1
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
J JLabels in schleife erzeugen mit verschiedenen namen? Java Basics - Anfänger-Themen 5
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
F Input/Output Blocking file read erzeugen Java Basics - Anfänger-Themen 0
Thallius Klassen aus Classname programmatisch erzeugen. Wie geht das in java? Java Basics - Anfänger-Themen 5
B Zufallsdatum innerhalb eines bestimmten Bereiches erzeugen Java Basics - Anfänger-Themen 3
D JComboBox erzeugen Java Basics - Anfänger-Themen 1
J Erste Schritte Array dyn. erzeugen Java Basics - Anfänger-Themen 2
A OOP Objekte per Schleife erzeugen Java Basics - Anfänger-Themen 1
F Superklasse nochmals erzeugen? Java Basics - Anfänger-Themen 7
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
M Variablen Variable zur Laufzeit erzeugen Java Basics - Anfänger-Themen 3
P Vererbung Neues Objekt aus Vorlage erzeugen Java Basics - Anfänger-Themen 1
M Erzeugen beliebig vieler Objekte, aber wie wechselnde Bezeichner? Java Basics - Anfänger-Themen 5
W Objekte erzeugen Java Basics - Anfänger-Themen 2
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
A Kleinste Ziffer im Array suchen um Sortierung zu erzeugen Java Basics - Anfänger-Themen 2
Joew0815 Interface JSON Objekte aus Java Objekten erzeugen Java Basics - Anfänger-Themen 9
B OOP Objekte erzeugen mit Hilfe einer for Schleife Java Basics - Anfänger-Themen 29
Helgon Baumstruktur tiefe N erzeugen Java Basics - Anfänger-Themen 3
X Mehrere Objekte erzeugen Java Basics - Anfänger-Themen 8
G OOP-Frage - Grundlegendes zum erzeugen von Klassen Java Basics - Anfänger-Themen 7
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
G Methoden BigInteger Zufallszahlen erzeugen Java Basics - Anfänger-Themen 5
Phash Kombinationen erzeugen Java Basics - Anfänger-Themen 4
M Initialisierungsblock beim Erzeugen einer Instanz Java Basics - Anfänger-Themen 6
B Ein Array von Map erzeugen, wie??? Java Basics - Anfänger-Themen 3
M Neues Objekt erzeugen mit Klassennamen oder ohne Java Basics - Anfänger-Themen 5
L Button erzeugen. Java Basics - Anfänger-Themen 4
Manello GUI mit exe erzeugen? Java Basics - Anfänger-Themen 3
StrikeTom Zufälliges Alphabet erzeugen Java Basics - Anfänger-Themen 6
D Textausgabe erzeugen Java Basics - Anfänger-Themen 11
C Methoden Objekte mit Hilfe einer Schleife in einer ArrayList erzeugen Java Basics - Anfänger-Themen 26
H Methoden Array aus Punkten erzeugen, mittels Punkt-Klasse Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben