Buchstabenpyramide

Lerne gerade C++, da sind solche Aufgaben echt gut.
Code:
#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
    // exit if no letter is given
    if (argc != 2)
    {
        cout << "You have to enter a letter!" << endl;
        return 1;
    }
    
    // get first char and convert it to uppercase
    int end = (int)argv[1][0];
    if (end > 90)
        end -= 32;

    // check if it is a valid character
    if ((end < 65) || (end > 90))
    {
        cout << "Character not in range!" << endl;
        return 2;
    }

    // loop it!
    for (int i = 65; i <= end; i++)
    {
        for (int s = i - end; s < 0; s++) cout << " ";
        for (int c = 65; c <= i; c++) cout << (char)c;
        for (int b = i - 1; b >= 65; b--) cout << (char)b;
        cout << "\n";
    }
    return 0;
}
Code:
<< dh@asuka:~/stuff/habo/buchstabenpyramide >> $ ./a.out x
                       A
                      ABA
                     ABCBA
                    ABCDCBA
                   ABCDEDCBA
                  ABCDEFEDCBA
                 ABCDEFGFEDCBA
                ABCDEFGHGFEDCBA
               ABCDEFGHIHGFEDCBA
              ABCDEFGHIJIHGFEDCBA
             ABCDEFGHIJKJIHGFEDCBA
            ABCDEFGHIJKLKJIHGFEDCBA
           ABCDEFGHIJKLMLKJIHGFEDCBA
          ABCDEFGHIJKLMNMLKJIHGFEDCBA
         ABCDEFGHIJKLMNONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
 
Waaaah, ich hab's verhunzt. Hoffentlich sieht das keiner meiner Profs!

Aber es geht und das ist ja die Hauptsache!

Ada:
Code:
with Ada.Text_IO;

procedure Buchstabenpyramide is
   use Ada.Text_IO;
   Zielbuchstabe : Character;

   procedure Pyramide (Zeile : Integer) is
   begin
      for Zaehler in reverse
        0 .. Character'Pos (Zielbuchstabe) - Character'Pos ('A') - Zeile
      loop
         Put (" ");
      end loop;
      for Zaehler in 0 .. Zeile loop
         Put (Character'Val (Character'Pos ('A') + Zaehler));
      end loop;
      for Zaehler in reverse 0 .. Zeile - 1 loop
         Put (Character'Val (Character'Pos ('A') + Zaehler));
      end loop;
      New_Line;
   end Pyramide;

begin
   Put ("Zielbuchstabe eingeben (Grossbuchstabe): ");
   Get (Zielbuchstabe);
   for Zaehler in 0 .. Character'Pos (Zielbuchstabe) - Character'Pos ('A') loop
      Pyramide (Zaehler);
   end loop;
end Buchstabenpyramide;
 
Nochmal C#

Hi

Ich liebe solche Programmieraufgaben. Da kann man sich so austoben, wie wir es in der professionellen Softwareentwicklung nicht tun dürfen :) Deshalb habe ich mich auch mal mit dieser Aufgabe verdingt. Als die erste Version fertig war, habe ich mir zum zusätzlichen Ziel gemacht, das Ganze mit nur einer einzigen Write(...) Anweisung zu bauen ;)

Mein Spagetti-Code sieht wie folgt aus:

Code:
using C = System.Console; using K=System.Convert;
class Program {
    static void Main(string[] argv) {
        for (int m = argv[0][0] - 'A', i = 0; i <= m; i++)
            for (int j = -i, a = -j; j <= i; j++, a = j < 0 ? -j : j)
                C.Write("{0," + (j == -i ? m - i : 0) + "}{1}","", K.ToChar('A' + i - a) + (j == i ? "\n" : ""));
    }
}
Ausgabe für Z ist wie folgt:

Code:
                         A
                        ABA
                       ABCBA
                      ABCDCBA
                     ABCDEDCBA
                    ABCDEFEDCBA
                   ABCDEFGFEDCBA
                  ABCDEFGHGFEDCBA
                 ABCDEFGHIHGFEDCBA
                ABCDEFGHIJIHGFEDCBA
               ABCDEFGHIJKJIHGFEDCBA
              ABCDEFGHIJKLKJIHGFEDCBA
             ABCDEFGHIJKLMLKJIHGFEDCBA
            ABCDEFGHIJKLMNMLKJIHGFEDCBA
           ABCDEFGHIJKLMNONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA
lg, Flatty
 
Ich habe es jetzt in BlitzMax programmiert:

Code:
Local ende:Byte=Asc(Upper(Input()))
Local k%
For Local i%=0 To (ende-65)
    For k=0 To (ende-65-i);Write " ";Next
    For k=0 To i%;Write Chr(k+65);Next
    For k=i-1 To 0 Step -1;Write Chr(k+65);Next
    Print
Next
End
Code:
Building pyramide
Compiling:pyramide.bmx
flat assembler  version 1.68  (1255799 kilobytes memory)
4 passes, 2690 bytes.
Linking:pyramide.exe
Executing:pyramide.exe
>z
                          A
                         ABA
                        ABCBA
                       ABCDCBA
                      ABCDEDCBA
                     ABCDEFEDCBA
                    ABCDEFGFEDCBA
                   ABCDEFGHGFEDCBA
                  ABCDEFGHIHGFEDCBA
                 ABCDEFGHIJIHGFEDCBA
                ABCDEFGHIJKJIHGFEDCBA
               ABCDEFGHIJKLKJIHGFEDCBA
              ABCDEFGHIJKLMLKJIHGFEDCBA
             ABCDEFGHIJKLMNMLKJIHGFEDCBA
            ABCDEFGHIJKLMNONMLKJIHGFEDCBA
           ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA

Process complete
 
zur Abwechslung mal Ruby
Code:
def pyramide(buchstabe)
  counter = ("A"..buchstabe).inject(0){|sum, x| sum+1}
  
  ("A"..buchstabe).each{|char|
    result = ("A"..char).inject(string=""){|string, string_char|
      string.concat(string_char)    }
      counter.times do print " " end
      print result
      print result[0,result.size-1].reverse
      puts     
      counter -=1 
  }
end

pyramide("H")
 
Mal wieder eine Java Lösung, aber ich habs mir zum Ziel gemacht keine Schleifen zu benutzen :)

Hier also eine rekursive Lösung (Update 0:24Uhr: Code verkürzt und optimiert):

Code:
public  class Buchstabenpyramide {
	public  static void main(String[] args) {
		if(args.length != 1) {
			System.out.println("Please choose a letter!");
			System.exit(0);
		}
		char dest = args[0].charAt(0);
		char[] letters = {'A','B','C','D','E','F','G','H','I','J','K','L',
							'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','['};
		int pointer = 0;
		int i = 0;
		recurse(dest,letters, i);
	}
	
	private static void recurse(char dest, char[] letters, int i) {
		if(letters[i] == dest+1) return;
		int pointer = 0;
		spaces(dest,i,0);
		single(pointer,letters[i],letters,i);
		System.out.println();
		recurse(dest,letters, i+1);
	}
	
	private static void spaces(char dest, int i, int j) {
		if(j == dest-65-i) return;
		System.out.print(" ");
		j++;
		spaces(dest,i,j);
	}
	
	private static void single(int pointer, char dest, char[] letters, int i) {
		if(pointer >= letters.length || pointer < 0) return;
		if(letters[pointer] == dest) {
			System.out.print(letters[pointer]);
			return;
		}
		System.out.print(letters[pointer]);
		single(pointer+1,dest,letters,i);
		System.out.print(letters[pointer]);
		return;
	}
}
Ausgabe:
Code:
xxx@xxx:Buchstabenpyramide$ java Buchstabenpyramide J
         A
        ABA
       ABCBA
      ABCDCBA
     ABCDEDCBA
    ABCDEFEDCBA
   ABCDEFGFEDCBA
  ABCDEFGHGFEDCBA
 ABCDEFGHIHGFEDCBA
ABCDEFGHIJIHGFEDCBA

Viele Grüße!
 
Zuletzt bearbeitet:
war schwerer als zunächst vermutet :)

Code:
import javax.swing.JOptionPane;
public class BuchstabenPyramideZentriert {
    public static void pyramide(char c) {
        int n = (int)c-64;
        int zaehler = 0;
        int b = 65;
        char array[] = new char[n];
        for (int i=65; i<=c; i++) {
            boolean zeile = true;
            array[zaehler] = (char)i;
            for (int j=0; j<=zaehler; j++) {
                if (zeile==true) {
                    for (int k=0; k<=(n-zaehler); k++) {
                        System.out.print(" ");
                    }
                    zeile = false;
                }
                System.out.print(array[j]);
            }
            while (b != 64 && zaehler != 0) {
                System.out.print((char)(b));
                b--;
            }
            System.out.println();
            b = array[zaehler];
            zaehler++;
        }
    }
    public static void main(String[] args) {
        char c = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein:").charAt(0);
        c = Character.toUpperCase(c);
        if (Character.isLetter(c))
            pyramide(c);
        else
            JOptionPane.showMessageDialog(null,  "Ungültige Eingabe!");
    }
}

ausgabe:
Code:
                           A
                          ABA
                         ABCBA
                        ABCDCBA
                       ABCDEDCBA
                      ABCDEFEDCBA
                     ABCDEFGFEDCBA
                    ABCDEFGHGFEDCBA
                   ABCDEFGHIHGFEDCBA
                  ABCDEFGHIJIHGFEDCBA
                 ABCDEFGHIJKJIHGFEDCBA
                ABCDEFGHIJKLKJIHGFEDCBA
               ABCDEFGHIJKLMLKJIHGFEDCBA
              ABCDEFGHIJKLMNMLKJIHGFEDCBA
             ABCDEFGHIJKLMNONMLKJIHGFEDCBA
            ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
           ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA
 
[Offtopic]
*Testet es auch und gibt С ein*
Ausgabe:
Code:
               A
...
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA
...
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?<U+0080><U+0081><U+0082><U+0083><U+0084><U+0083><U+0082><U+0081><U+0080>^?~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA
:confused: (ok, vielleicht hätte ich mein Tastaturlayout vorher auf DE schalten sollen *gibt nun Ä ein* ;) )
Code:
    public static void pyramide(char c) {
        int n = (int)c-64;
Lasst doch bitte ASCII da, wo es hingehört - auf den Lochkarten ;)
Es gibt schon länger Unicode - Wikipedia, the free encyclopedia und Java beherrscht/benutzt UnicodeTransformationFormat-16 (UTF-16) von Haus aus. Es gibt also keinen Grund, mit ASCII-Codes herumzuhantieren oder gar zu rechnen (bzw. auf solchen Rechnungen zu "bauen") - denn sowas geht nach hinten los, sobald der Benutzer nicht ausschließlich das lateinische Alphabet nutzt (diese Franzosen, Spanier, Griechen, Polen ... sind mittlerweile computermäßig so verwöhnt ☺ )
 
[Offtopic]
*Testet es auch und gibt С ein*
Ausgabe:
Code:
               A
...
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA
...
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?<U+0080><U+0081><U+0082><U+0083><U+0084><U+0083><U+0082><U+0081><U+0080>^?~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA
)

hey CDW,
ka warum das bei dir so ausgegeben wird.
bei mir funktionierts jedenfalls:

Code:
    A
   ABA
  ABCBA
natürlich ist die lösung nicht perfekt,
hatte ehrlich gesagt auch gar nicht daran gedacht jemand könnte auf die idee kommen meinen code zu testen und das auch noch mit anderen buchstaben als vorgesehen :)
aber danke für die kritik.
ich muss halt noch viel lernen.. 8)
 
hey CDW,
ka warum das bei dir so ausgegeben wird.
bei mir funktionierts jedenfalls:
Weil die Glyphen zwar ähnlich aussehen, die "Codes" aber ganz ganz anders sind (hier: U+0421 bzw: 1057: Es (Cyrillic) - Wikipedia, the free encyclopedia ) *und ja, das war gemein* ;)

Ich habe dieses Posting auch eher als einen Vorwand benutzt, da ich letztens auch in anderen Programmieraufgaben gesehen habe, wie muter mit ASCII-Werten hantiert wurde - und damit fällt man früher oder später auf die Nase (es gibt nicht umsonst so viele String-funktionen - sei es die Feststellung, ob die Eingabe überhaupt ein Buchstabe ist oder Groß/Kleinumwandlung - überall lauern lauter kleine Tücken, sobald es sich bei der Eingabe nicht um das lat. Alphabet handelt) ;).
 
hab zur übung nochmal ne version geschrieben, die ohne das umrechnen von ascii-werten auskommt.
es ist auch nur noch möglich lateinische buchstaben einzugeben. :wink:
Code:
import javax.swing.JOptionPane;
public class LatinBuchstabenPyramide {
	public static String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	public static boolean checkChar(char c) {
		boolean check = false;
		for (int i=0; i<alphabet.length(); i++) {
			if (c == alphabet.charAt(i)) {
				check = true;
			}
		}
		return check;
	}
	public static void pyramide(char c) {	
		int nr = alphabet.indexOf(c), spalte=0;
		for (int i=0; i<=nr; i++) {
			boolean zeile = true;
			for (int j=0; j<=spalte; j++) {
				for (int k=0; k<(nr-spalte) && zeile == true; k++) {
					System.out.print(" ");
				}
				zeile = false;
				System.out.print(alphabet.charAt(j));
			}
			for (int k=i-1; k>=0; k--) {
				System.out.print(alphabet.charAt(k));
			}
			spalte++;
			System.out.println();
		}
	}
	public static void main(String[] args) {
		char eingabe = JOptionPane.showInputDialog("Geben Sie einen Buchstaben ein: ").charAt(0);
		eingabe = Character.toUpperCase(eingabe);
		if(checkChar(eingabe)==true) {
			pyramide(eingabe);
		} else {
			JOptionPane.showMessageDialog(null, "Ungültige Eingabe");
		}
	}
}
Code:
                         A
                        ABA
                       ABCBA
                      ABCDCBA
                     ABCDEDCBA
                    ABCDEFEDCBA
                   ABCDEFGFEDCBA
                  ABCDEFGHGFEDCBA
                 ABCDEFGHIHGFEDCBA
                ABCDEFGHIJIHGFEDCBA
               ABCDEFGHIJKJIHGFEDCBA
              ABCDEFGHIJKLKJIHGFEDCBA
             ABCDEFGHIJKLMLKJIHGFEDCBA
            ABCDEFGHIJKLMNMLKJIHGFEDCBA
           ABCDEFGHIJKLMNONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA
 
versuche mir bisschen c beizubringen und da fand ich das doch relativ gut.
Code:
#include <stdio.h>
#include <stdlib.h>

int
main ( int argc, char* argv[] )
  {
    int i, j, n;
    n = (argc == 2) ? atof(argv[1]) : 0;

    for (j = 0; j <= n; j++)
      {
        for (i = 0; i <= 2*n; i++)
          {
            if (abs(n-i) <= j) printf("%c", 'A'+(abs(abs(n-i)-j) % 26));
            else printf(" ");
          }
        printf("\n");
      }
    return 0;
  }
bin offfen für jede kritik ;D
 
bin offfen für jede kritik ;D

Ok ;)

man atof hat gesagt.:
DESCRIPTION
The atof() function converts the initial portion of the string pointed to
by nptr to double representation.

It is equivalent to:

strtod(nptr, (char **)NULL);

The decimal point character is defined in the program's locale (category
LC_NUMERIC).

IMPLEMENTATION NOTES
The atof() function is not thread-safe and also not async-cancel-safe.

The atof() function has been deprecated by strtod() and should not be
used in new code.
strtod bietet vor allem sehr viel bessere Fehlerbehandlung (auch wenn es in diesem konkretem Fall natürlich nichts ausmacht, atof zu benutzen) ;)
Btw: sobald man mehr als eine Anweisung im IF Block stehen hat (oder diese eine einfach etwas länger / nicht ganz trivial ist und nicht mehr in der gleichen Zeile wie die IF-Bedingung steht), können gesetzte { } später viel Ärger bei der Fehlersuche ersparen ;)
 
Zuletzt bearbeitet:
Da ich gerade in einer Bar versetzt wurde, aber schon was getrunken habe, hier eine etwas hakelige Lösung in Javascript (jQuery, wobei ich dass dann doch irgendwie nicht mehr so richtig toll benutzt habe)

Code:
<html>
<head>
    <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
</head>

<body>Buchstabe: 
    <input type="textbox" name="input" id="input">
    <button id="pyramid">Buchstanpyramide ausgeben</button>
    <br>
    <br>
    <textarea style="width:450px; height:450px;" id="output"></textarea>
</body>
<script type="text/javascript">
    $("#pyramid").click(function () {
        var input = $("#input").val();
        var output = '';
        var regex = /^[A-Za-z]$/;
        var i,j;
        var letters  = ["A", "B", "C", "D", "E", "F", "G", "H", "I",
                        "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                        "S", "T", "U", "V", "W", "X", "Y", "Z"];

        if (regex.test(input)) {
          input = input.toUpperCase();
          for(i=0; i<=letters.indexOf(input)+1; i++){
            for(j=i; j<letters.indexOf(input)+1; j++){
              output += ' ';
            }
            for(j=1; j<=i; j++){
              output += (letters[j-1]);
            }
            for(j-=2; j>0; j--){
              output += (letters[j-1]); 
            } 
            output += '\n';
          }
        } else {
          output = 'Bitte nur einen Buchstaben (A-Z, keine Umlaute) eingeben.';
        } 

        $("#output").val(output);
    });
</script>
</html>

Einfach als html Datei Speichern und mit dem Browser öffnen.
Als Eingabe werden per Regex nur Buchstaben von A-Z (Klein/groß egal) akzeptiert.

Jetzt geh ich wieder ;)
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben