Programm schreiben

Ciferman

Mitglied
Hallo allerseits,
ich bin zur Zeit dabei mich ein wenig in Java für mein Studium einzuarbeiten. Nun habe Ich eine Aufgabe mit der ich leicht überfordert bin. Sie lautet wie folgt:

---------------------------------------------------------------------------------------------

Schreiben Sie eine statische Methode dreieck, die ein Zeichen vom Typ char und eine ganze Zahl n als Parameter erwartet und einen String zurück gibt, der das Zeichen in n Zeilen in Form eines gleichschenkligen Dreiecks ausgibt. Beispielsweise sollte für das Zeichen '+' und n = 3 der String
+
+++
+++++(soll ne Pyramide anzeigen)

ausgegeben werden.

Hinweis: In jeder Zeile befinden sich stets eine ungerade Anzahl von Zeichen, also (2k - 1) Zeichen in Zeile k.

---------------------------------------------------------------------------------------------

Ich schreibe einfach mal wie ich es machen würde:

1. Importieren der Bibliotehk(javax.swing.*)
2. Klasse benennen
3. int = n und char = + deklarieren
4. Mit JTextField und Object 2 Felder angeben
Jetzt würde ich eine if else Bedingung einbauen...habe aber keine ahnung wie oder warum ich etwas machen muss.

Wäre nett wenn ihr mir weiterhelfen könntet mit dem Programm und mir auch sagen könntet warum ihr dieses und jenes macht

Gruß
Ciferman
 
Was ich an deiner Stelle machen würde:
1. dir klar werden, was die Aufgabenstellung von dir will. Was ist ein gleichschenkliges Dreieck, was eine Pyramide?
2. Swing aus dem Spiel lassen. Ein- und Ausgabe über die Konsole bzw. Programmargument ist einfacher.
3. Eine Zeile der gewünschten Zeichen ausgeben.
4.Wenn das so weit steht und du nicht weiter kommst noch mal hier fragen und am besten den bisher produzierten Code auch posten.
 
Swing ist hier fehl am Platz.
Fang doch erstmal klein an. Schreib doch erstmal die Methode wie du sie haben musst, nur dass sie Einfach nur n-Zeilen mit 1,3,5,7... Zeichen ausgibt, dannach sehen wir weiter.
 
Wie meint ihr das swing ist fehl am Platz?

Wir sollen unser Programm in einem Message Dialog ausgeben. Bisher haben wir jedes Programm mit javax.swing.* programmiert.
Daher weiß ich auch nicht wie ich anders vorgehen soll?!
Wäre nett wenn ihr mir sagt wie mann es besser macht oder ein Link gebt und ich mich in die Materie erst einmal einlese,bevor ich hier zu viele Fragen stellen 🙂.

Gruß
 
Wenn ihr einen Dialog verwenden müsst, dann will ich nix gesagt haben ;-) Der Rest gilt aber trotzdem. Langsam anfangen wie XHelp und ich schon gepostet haben.
 
So habe ein bisschen rumprobiert, mit dem ernüchternden ergebnis das ich es nicht wirklich hinbekomme.

Hier erstmal der Quelltext:

Java:
import javax.swing.*;
public class Pyramide{
  public static void main (String[] args){

    int Zeilen;
    String Zeichen, ausgabe ="";
    
    JTextField[] feld ={new JTextField(), new JTextField()};
    Object[] msg ={"Eingabe Zeichen",feld[0],"Eingabe Zeilen",feld[1]};

    int click = JOptionPane.showConfirmDialog(null, msg, "Aufbau", 2);
    
    Zeichen =feld[0].getText();
    Zeilen  =Integer.parseInt(feld[1].getText());
    

    JOptionPane.showMessageDialog(null,ausgabe,"Pyramide",2);
  }
}

Ich glaube zu wissen das ich das + ersteinmal in einen Index(Array) packen muss, und dann eine ?while? Schleife
mit der Bedingung 2k-1 programmieren muss ??

Ich weiss einfach nicht genau wie ich ihm sagen kann: "Ich gebe dir jetzt die Zahl 6 und das Zeichen + , jetzt gib du mir sechs + aus"

Bitte um hilfe...auch wenn es sehr dumme anfängerfragen sind und mein Programm wahrscheinlich mal Komplett falsch ist 😀.
 
Bevor du dich mit der GUI rummacchst, solltest du vllt erstmal die grundlegende Funktionalität machen.
Bei der Formel ist k deine Zeilennummer.
Ein Array brauchst du dafür auch nicht, aber 2 for-Schleifen.
Schreib doch in Pseudocode wie du es auf Papier machen würdest.
 
Also ich glaube ja gern, dass ihr zur Eingabe der Werte Dialoge nehmt, aber für die Ausgabe wäre das bei dieser Aufgabenstellung seltsam, den ein JLabel kann (außer mit dem HTML-Trick) keine Zeilenumbrüche. Am ehesten sollte noch ein JTextArea mit einer proportionalen Schrift gehen - aber sowas hattet ihr bestimmt noch nicht...
 
Java:
import javax.swing.*;
public class Pyramide{
  public static void main (String[] args){

    int Zeilen;       //<---also "k" anstatt Zeilen
    String Zeichen, ausgabe ="";
    
    JTextField[] feld ={new JTextField(), new JTextField()};
    Object[] msg ={"Eingabe Zeichen",feld[0],"Eingabe Zeilen",feld[1]};

    int click = JOptionPane.showConfirmDialog(null, msg, "Aufbau", 2);
    
    Zeichen =feld[0].getText();
    Zeilen  =Integer.parseInt(feld[1].getText());   //<---also "k" anstatt Zeilen
   
   //hier 2 for schleifen
    for( int i = 0; i < k.length; i++){ 
    Anweisung} 

    JOptionPane.showMessageDialog(null,ausgabe,"Pyramide",2);
  }
}
Aber wieso muss ich 2 for Schleifen verwenden?Kann ich nicht innerhalb 1ner Schleife sagen: Du hast n x + und sobald k+2 erreicht ist mache einen Zeilenumbruch mit /n.
Dabei hätte ich jedoch das Problem das ich nicht weiss mit welchem Befehl ich die Zahlen in der Mitte des Ausgabefeldes ausgeben würde.

Zu dem Thema Konsole oder Dialogfenster. Wir haben bis jetzt noch nie für die Konsole programmiert, und da ich für eine Prüfung über würde ich es lieber so lernen wie wir es immer gemacht haben und einfach kein Risiko eingehen auch wenn der Weg über die Konsole wahrsceinlich auch als richtig anerkannt wird(solange er es nicht explizit angibt).
Gruß
 
Welcher der folgenden Möglichkeiten willst du haben:
Java:
  +
 +++
+++++
oder
+
+++
+++++
?
Beim 1. hast du das Problem, dass es eine monospace-Schrift sein muss.
 
definitiv 1!

Habe eben google angeschmissen und erstmal geguckt was eine monospace Schrift 🙂 ist und das hier gefunden:

Eine Monospace-Schrift ist eine Schrift, in der alle Buchstaben dieselbe Breite haben. Sie werden genutzt, um zum Beispiel Tabellentext oder Computercode übersichtlicher darzustellen.

In normalen Schriften haben Buchstaben nicht dieselbe Breite, weil zum Beispiel ein »i« deutlich schmaler ist als ein »M«.

Eine bekannte Monospace-Schrift ist die Courier.

Nun will ich ja nur immer das Gleiche Zeichen ausgeben, welches ja die gleiche Größe hätte. Brauche ich trotzdem eine Monospace-Schrift?
 
Bist du dir sicher, dass du die Aufgabe richtig verstanden hast?
Das ist eine typische Konsolen-Aufgabe, wo hingegen sie in der GUI nicht so viel Sinn macht.
 
Wie ich oben bereits schrieb, ich gehe davon aus das wir es in einem Dialog Fenster programmieren müssen, da wir nie etwas in der Konsole programmiert haben.(Ich auch gar nicht wüsste wie ich das mache! glaube mit systemprintout...aber k.a.)

Du würdest die Aufgabe also defintiv wenn in der Konsole lösen? Wie würde ich denn da vorgehen?
Könntest du mir wohl einen groben Leitfaden aufschreiben wie ich da rangehe? dann Probiere ich es mal selbst!
Vielen dank schon mal

Gruß
 
sooo nochmal ich..habe mich die nacht dran gesetzt und bin immer noch nicht weiter.Ich glaube das ich ein Grundgerüst habe welches funktionieren müsste,komme aber trotzdem nicht weiter.

Hier der Quelltext:
Java:
import javax.swing.*;
public class Pyramide{
  public static String dreieck (String[] args){

    char c=Long.parseLong( feld[0].getText() );  //eingabe eines Symbols
    int k,n=Integer.parseInt( feld[1].getText() );   //eingabe Zeilen
    String s, ausgabe ="";
    
    //Textfelder aufbauen
    JTextField[] feld ={new JTextField(), new JTextField()};
    Object[] msg ={"Eingabe Zeichen(c)",feld[0],"Eingabe Zeilen(k)",feld[1]};

    int click = JOptionPane.showConfirmDialog(null, msg, "Aufbau", 2);
    
    for(int i=0;i<n;i++){ //Spalten errechnen
      int j =n-i-1;
    }
    for(int k=0;k<j;k++){ //ausgabe der Leerzeichen
      s+=" ";
    }
    j=2*i-1;
    for(int k=0;k<j;k++){ //ausgabe der Symbole
      s+=c;
    }
    
    //ausgabe Pyramide
    JOptionPane.showMessageDialog(null,ausgabe,"Pyramide",2);
  }
}

Was mache ich falsch? bitte um hilfe!
 
@Ciferman
deine Aufgabe lautet so:

Schreiben Sie eine statische Methode dreieck, die ein Zeichen vom Typ char und eine ganze Zahl n als Parameter erwartet und einen String zurück gibt, der das Zeichen in n Zeilen in Form eines gleichschenkligen Dreiecks ausgibt. Beispielsweise sollte für das Zeichen '+' und n = 3 der String
+
+++
+++++(soll ne Pyramide anzeigen)

ausgegeben werden.

Hinweis: In jeder Zeile befinden sich stets eine ungerade Anzahl von Zeichen, also (2k - 1) Zeichen in Zeile k.
von einer GUI ist da keine Rede. Du musst nur eine Funktion schreiben, welche 2 Parameter übernimmt und eine Zeichenkette zurückliefert. Das sieht so aus:

Java:
public static String dreieck(char c, int n)
 {
 // ...
 }

in dieser Funktion sollten keine GUI-Elemente auftauchen! Diese Funktion dient nur dazu einen Algorithmus darzustellen und auszuführen, zu nichts mehr. Die Ausgabe in der GUI kann an anderer Stelle passieren, Beispiel:

Java:
public static void main(String [] args)
 {
 char c = ' ';
 int n = 1;

 // c und n entweder aus args herauslesen oder über JOptionPane abfragen

 String dreieck_string = dreieck(c, n);

 // dreieck_string über System.out.println() oder JOptionPane anzeigen
 }

Slawa

PS: ich bezweifle sehr, das ihr GUI Elemente a la Swing verwendet müsst. Swing ist eine Stufe höher als Grundwissen. Wenn eurer Dozent tatsächlich verlangt Swing vor der Kommandozeile oder einfachen Grundalgorithmen zu lernen, ist er/sie entweder inkompetent oder ein Sadist. Diese Aufgabe ist eine klassische Kommandozeilenaufgabe, übrigens schon ein Dutzend Mal in diesem Forum gestellt und gelöst worden.
 
Zeile 15-17 machen als Schleife kein Sinn. Außerdem ist j immer 0. Außerdem fehlt eine Schleife, die alle Zeilen durchgeht.
Schreib doch erstmal das ganze in Pseudocode, wie du es auf dem Zettel malen würdest.
 
Was mache ich falsch? bitte um hilfe!

viel... feld gibt es nicht

for(int k=0;k<j;k++){ //ausgabe der Leerzeichen
du hast oben schon k definiert..., j gibt es hier nicht, das gilt nur in der oberen schleife...

dein code kompiliert ja nicht mal... bereinig das mal,
 
Wie wärs mit sowas?
(Tja die Anzahlen könntest du ja noch selbst bestimmen - das steht im Original natürlich was anderes drin ;-)

Java:
public class Dreieck {

	private static void print(char pChar, int pAnz) {
		for(int i=0; i<pAnz; i++){
			System.out.print(pChar);
		}
	}
	private static void dreieck(char pChar, int pNr) {
		for(int i=0; i<pNr; i++) {
			print(' ', anzahlSpaces);
			print(pChar, anzahlChar);
			System.out.println("");
		}
	}
	public static void main(String[] args) {
		dreieck('x', 5);
	}
}

Output:
Code:
    x
   xxx
  xxxxx
 xxxxxxx
 
Was mache ich falsch?

Sehr viel.

Kleines Beispiel:
Schreiben Sie eine statische Methode dreieck, die ein Zeichen vom Typ char und eine ganze Zahl n als Parameter erwartet und einen String zurück gibt

sollte dann nicht so aussehen:
Java:
 public static String dreieck (String[] args){

sondern vielleicht so:
Java:
public static String dreieck(char zeichen, int n){

Ausserdem erwartet die Methode das du einen String zurückgibst. D.H irgendwo in deinem Code muß ein
Java:
return ausgabe;
stehen.

Java:
char c=Long.parseLong( feld[0].getText() );
von einem String über Long per autoboxing zu Char?
You are kidding!

Ausserdem solltest du dir überlegen, ob du nicht lieber erst die Eingabefelder anzeigst, bevor du versuchst diese auszulesen. Zeile 5 und 6 also definitiv erst nach Zeile 13.

Genauso der Versuch auf ein Array feld zuzugreifen, bevor es erstellt wurde.
 
Vor allem packst du es ein wenig zu kompliziert an --- programmier erst nur den Kern mit einen kleinen Hauptprogramm - siehe mein Beispiel oben

Ein GUI kannst du nachher immer noch bauen.
 
Bei mir sieht es so aus: Jedoch wird die Pyramide wie folgt angezeigt:

x
xxx
xxxxx

An welcher Stelle muss ich die Leerzeichen einfügen?
Java:
import javax.swing.*;
public class SBT21{
  public static void main(String[] args){
     String ausgabe1 =  dreieck('x', 3);
     JOptionPane.showMessageDialog(null, ausgabe1);
  }

  public static String dreieck(char pChar, int pAnz){
    String ausgabe = "";

    for(int t=0; t<pAnz; t++) {

       for(int i=0; i< 2*(t+1)-1; i++){

          ausgabe += pChar;
       }
       ausgabe += "\n";
    }
    return ausgabe;
  }
}
 
also in Zeile 12:

Java:
ausgabe += " ";
??

Dann kommt genau das gleiche raus.. nur das alle reihen um dieses eine Leerzeichen eingerückt sind...
 
und jetzt?
(worauf ich hinaus will: was hast du bis jetzt, welche Ansätze hast du verfolgt, welche Überlegungen hast du gemacht, was willst du von uns)
 
ja da muss jetzt am besten noch eine for-schleife hin
sowas wie:
Java:
for(int k=0;k<3; k++) ausgabe += " ";
...damit er zwei leerzeichen macht... oder?
 
die hälfte hast du ja schon fast... im grunde hast du ja eine zähler variable
t : 0, 1, 2
jetzt brauchst du noch leerzeichen, erste zeile 2, dann 1, dann 0
wie werd man jetzt von
0, 1, 2 auf 2,1, 0 kommen, wenn man die länge weiß?

vielleicht?
pAnz - t - 1;

zb so...
Java:
import javax.swing.*;

public class SBT21 {
	public static void main(String[] args) {
		String ausgabe1 = dreieck('x', 3);
		JOptionPane.showMessageDialog(null, ausgabe1);
	}

	public static String dreieck(char pChar, int pAnz) {
		String ausgabe = "";

		for (int t = 0; t < pAnz; t++) {
			int anzahlLeer = pAnz - t - 1;
			for (int i = 0; i < anzahlLeer; i++) {
				ausgabe += "  ";
			}
			int anzahlSterne = 2 * (t + 1) - 1;
			for (int i = 0; i < anzahlSterne; i++) {
				ausgabe += pChar;
			}
			ausgabe += "\n";
		}
		return ausgabe;
	}
}
 

Zurück
Oben